]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
Fixes for 5.7
authorSasha Levin <sashal@kernel.org>
Mon, 22 Jun 2020 12:46:10 +0000 (08:46 -0400)
committerSasha Levin <sashal@kernel.org>
Mon, 22 Jun 2020 12:46:10 +0000 (08:46 -0400)
Signed-off-by: Sasha Levin <sashal@kernel.org>
417 files changed:
queue-5.7/afs-afs_write_end-should-change-i_size-under-the-rig.patch [new file with mode: 0644]
queue-5.7/afs-always-include-dir-in-bulk-status-fetch-from-afs.patch [new file with mode: 0644]
queue-5.7/afs-fix-eof-corruption.patch [new file with mode: 0644]
queue-5.7/afs-fix-memory-leak-in-afs_put_sysnames.patch [new file with mode: 0644]
queue-5.7/afs-fix-non-setting-of-mtime-when-writing-into-mmap.patch [new file with mode: 0644]
queue-5.7/afs-fix-the-mapping-of-the-uaeoverflow-abort-code.patch [new file with mode: 0644]
queue-5.7/afs-remove-the-error-argument-from-afs_protocol_erro.patch [new file with mode: 0644]
queue-5.7/afs-set-error-flag-rather-than-return-error-from-fil.patch [new file with mode: 0644]
queue-5.7/alsa-firewire-lib-fix-invalid-assignment-to-union-da.patch [new file with mode: 0644]
queue-5.7/alsa-hda-realtek-introduce-polarity-for-micmute-led-.patch [new file with mode: 0644]
queue-5.7/alsa-isa-wavefront-prevent-out-of-bounds-write-in-io.patch [new file with mode: 0644]
queue-5.7/alsa-usb-audio-add-duplex-sound-support-for-usb-devi.patch [new file with mode: 0644]
queue-5.7/alsa-usb-audio-fix-racy-list-management-in-output-qu.patch [new file with mode: 0644]
queue-5.7/alsa-usb-audio-fixing-upper-volume-limit-for-rme-bab.patch [new file with mode: 0644]
queue-5.7/alsa-usb-audio-improve-frames-size-computation.patch [new file with mode: 0644]
queue-5.7/alsa-usb-audio-rme-babyface-pro-mixer-patch.patch [new file with mode: 0644]
queue-5.7/apparmor-check-put-label-on-apparmor_sk_clone_securi.patch [new file with mode: 0644]
queue-5.7/apparmor-fix-introspection-of-of-task-mode-for-uncon.patch [new file with mode: 0644]
queue-5.7/apparmor-fix-nnp-subset-test-for-unconfined.patch [new file with mode: 0644]
queue-5.7/arm-davinci-fix-build-failure-without-i2c.patch [new file with mode: 0644]
queue-5.7/arm-dts-aspeed-ast2600-set-arch-timer-always-on.patch [new file with mode: 0644]
queue-5.7/arm-dts-aspeed-change-kcs-nodes-to-v2-binding.patch [new file with mode: 0644]
queue-5.7/arm-dts-bcm283x-use-firmware-pm-driver-for-v3d.patch [new file with mode: 0644]
queue-5.7/arm-dts-meson-switch-existing-boards-with-rgmii-phy-.patch [new file with mode: 0644]
queue-5.7/arm-dts-renesas-fix-iommu-device-node-names.patch [new file with mode: 0644]
queue-5.7/arm-dts-stm32-add-missing-ethernet-phy-reset-on-av96.patch [new file with mode: 0644]
queue-5.7/arm-dts-sun8i-h2-plus-bananapi-m2-zero-fix-led-polar.patch [new file with mode: 0644]
queue-5.7/arm-integrator-add-some-kconfig-selections.patch [new file with mode: 0644]
queue-5.7/arm64-dts-armada-3720-turris-mox-fix-sfp-binding.patch [new file with mode: 0644]
queue-5.7/arm64-dts-armada-3720-turris-mox-forbid-sdr104-on-sd.patch [new file with mode: 0644]
queue-5.7/arm64-dts-fvp-fix-gic-child-nodes.patch [new file with mode: 0644]
queue-5.7/arm64-dts-fvp-juno-fix-node-address-fields.patch [new file with mode: 0644]
queue-5.7/arm64-dts-juno-fix-gic-child-nodes.patch [new file with mode: 0644]
queue-5.7/arm64-dts-marvell-armada-37xx-set-pcie_reset_pin-to-.patch [new file with mode: 0644]
queue-5.7/arm64-dts-meson-fix-leds-subnodes-name.patch [new file with mode: 0644]
queue-5.7/arm64-dts-meson-fixup-scp-sram-nodes.patch [new file with mode: 0644]
queue-5.7/arm64-dts-meson-g12b-ugoos-am6-fix-board-compatible.patch [new file with mode: 0644]
queue-5.7/arm64-dts-meson-gxbb-kii-pro-fix-board-compatible.patch [new file with mode: 0644]
queue-5.7/arm64-dts-msm8996-fix-csi-irq-types.patch [new file with mode: 0644]
queue-5.7/arm64-dts-mt8173-fix-unit-name-warnings.patch [new file with mode: 0644]
queue-5.7/arm64-dts-qcom-c630-add-wifi-node.patch [new file with mode: 0644]
queue-5.7/arm64-dts-qcom-db820c-fix-invalid-pm8994-supplies.patch [new file with mode: 0644]
queue-5.7/arm64-dts-qcom-fix-pm8150-gpio-interrupts.patch [new file with mode: 0644]
queue-5.7/arm64-dts-qcom-msm8916-remove-unit-name-for-thermal-.patch [new file with mode: 0644]
queue-5.7/arm64-dts-qcom-sc7180-correct-the-pdc-interrupt-rang.patch [new file with mode: 0644]
queue-5.7/arm64-dts-qcom-sm8250-fix-pdc-compatible-and-reg.patch [new file with mode: 0644]
queue-5.7/arm64-dts-realtek-rtd129x-fix-gic-cpu-masks-for-rtd1.patch [new file with mode: 0644]
queue-5.7/arm64-dts-renesas-fix-iommu-device-node-names.patch [new file with mode: 0644]
queue-5.7/arm64-ftrace-change-config_ftrace_with_regs-to-confi.patch [new file with mode: 0644]
queue-5.7/arm64-hw_breakpoint-don-t-invoke-overflow-handler-on.patch [new file with mode: 0644]
queue-5.7/arm64-mm-reserve-hugetlb-cma-after-numa_init.patch [new file with mode: 0644]
queue-5.7/arm64-tegra-fix-ethernet-phy-mode-for-jetson-xavier.patch [new file with mode: 0644]
queue-5.7/arm64-tegra-fix-flag-for-64-bit-resources-in-ranges-.patch [new file with mode: 0644]
queue-5.7/asoc-codecs-rt-sdw-fix-memory-leak-in-set_sdw_stream.patch [new file with mode: 0644]
queue-5.7/asoc-codecs-wm97xx-fix-ac97-dependency.patch [new file with mode: 0644]
queue-5.7/asoc-component-suppress-uninitialized-variable-warni.patch [new file with mode: 0644]
queue-5.7/asoc-core-only-convert-non-dpcm-link-to-dpcm-link.patch [new file with mode: 0644]
queue-5.7/asoc-dapm-move-dai_link-widgets-to-runtime-to-fix-us.patch [new file with mode: 0644]
queue-5.7/asoc-davinci-mcasp-fix-dma_chan-refcnt-leak-when-get.patch [new file with mode: 0644]
queue-5.7/asoc-fix-incomplete-error-handling-in-img_i2s_in_pro.patch [new file with mode: 0644]
queue-5.7/asoc-fsl_asrc_dma-fix-dma_chan-leak-when-config-dma-.patch [new file with mode: 0644]
queue-5.7/asoc-fsl_esai-disable-exception-interrupt-before-sch.patch [new file with mode: 0644]
queue-5.7/asoc-intel-bytcr_rt5640-add-quirk-for-toshiba-encore.patch [new file with mode: 0644]
queue-5.7/asoc-intel-bytcr_rt5640-add-quirk-for-toshiba-encore.patch-12891 [new file with mode: 0644]
queue-5.7/asoc-max98373-reorder-max98373_reset-in-resume.patch [new file with mode: 0644]
queue-5.7/asoc-meson-add-missing-free_irq-in-error-path.patch [new file with mode: 0644]
queue-5.7/asoc-meson-fix-memory-leak-of-links-if-allocation-of.patch [new file with mode: 0644]
queue-5.7/asoc-qcom-q6asm-dai-kcfi-fix.patch [new file with mode: 0644]
queue-5.7/asoc-rt5645-add-platform-data-for-asus-t101ha.patch [new file with mode: 0644]
queue-5.7/asoc-rt5682-fix-i2c-soundwire-dependencies.patch [new file with mode: 0644]
queue-5.7/asoc-soc-pcm-dpcm-fix-playback-capture-checks.patch [new file with mode: 0644]
queue-5.7/asoc-sof-core-fix-error-return-code-in-sof_probe_con.patch [new file with mode: 0644]
queue-5.7/asoc-sof-do-nothing-when-dsp-pm-callbacks-are-not-se.patch [new file with mode: 0644]
queue-5.7/asoc-sof-imx8-fix-randbuild-error.patch [new file with mode: 0644]
queue-5.7/asoc-sof-intel-hda-fix-generic-hda-codec-support.patch [new file with mode: 0644]
queue-5.7/asoc-sof-nocodec-conditionally-set-dpcm_capture-dpcm.patch [new file with mode: 0644]
queue-5.7/asoc-sof-update-correct-led-status-at-the-first-time.patch [new file with mode: 0644]
queue-5.7/asoc-tegra-tegra_wm8903-support-nvidia-headset-prope.patch [new file with mode: 0644]
queue-5.7/asoc-ti-omap-mcbsp-fix-an-error-handling-path-in-aso.patch [new file with mode: 0644]
queue-5.7/asoc-ux500-mop500-fix-some-refcounted-resources-issu.patch [new file with mode: 0644]
queue-5.7/backlight-lp855x-ensure-regulators-are-disabled-on-p.patch [new file with mode: 0644]
queue-5.7/bareudp-fixed-configuration-to-avoid-having-garbage-.patch [new file with mode: 0644]
queue-5.7/bcache-fix-potential-deadlock-problem-in-btree_gc_co.patch [new file with mode: 0644]
queue-5.7/blktrace-fix-endianness-for-blk_log_remap.patch [new file with mode: 0644]
queue-5.7/blktrace-fix-endianness-in-get_pdu_int.patch [new file with mode: 0644]
queue-5.7/blktrace-use-errno-instead-of-bi_status.patch [new file with mode: 0644]
queue-5.7/block-fix-use-after-free-in-blkdev_get.patch [new file with mode: 0644]
queue-5.7/bnxt_en-fix-aer-reset-logic-on-57500-chips.patch [new file with mode: 0644]
queue-5.7/bnxt_en-re-enable-sriov-during-resume.patch [new file with mode: 0644]
queue-5.7/bnxt_en-return-from-timer-if-interface-is-not-in-ope.patch [new file with mode: 0644]
queue-5.7/bnxt_en-simplify-bnxt_resume.patch [new file with mode: 0644]
queue-5.7/bpf-fix-an-error-code-in-check_btf_func.patch [new file with mode: 0644]
queue-5.7/bpf-fix-memlock-accounting-for-sock_hash.patch [new file with mode: 0644]
queue-5.7/bpf-sockhash-fix-memory-leak-when-unlinking-sockets-.patch [new file with mode: 0644]
queue-5.7/bpf-sockhash-synchronize-delete-from-bucket-list-on-.patch [new file with mode: 0644]
queue-5.7/bpf-sockmap-don-t-attach-programs-to-udp-sockets.patch [new file with mode: 0644]
queue-5.7/bpf-sockmap-fix-kernel-panic-at-__tcp_bpf_recvmsg.patch [new file with mode: 0644]
queue-5.7/bpf-tcp-recv-should-return-0-when-the-peer-socket-is.patch [new file with mode: 0644]
queue-5.7/bpf-undo-internal-bpf_probe_mem-in-bpf-insns-dump.patch [new file with mode: 0644]
queue-5.7/bus-mhi-core-read-transfer-length-from-an-event-prop.patch [new file with mode: 0644]
queue-5.7/ceph-don-t-return-estale-if-there-s-still-an-open-fi.patch [new file with mode: 0644]
queue-5.7/cifs-set-up-next-dfs-target-before-generic_ip_connec.patch [new file with mode: 0644]
queue-5.7/clk-ast2600-fix-ahb-clock-divider-for-a1.patch [new file with mode: 0644]
queue-5.7/clk-bcm2835-fix-return-type-of-bcm2835_register_gate.patch [new file with mode: 0644]
queue-5.7/clk-clk-flexgen-fix-clock-critical-handling.patch [new file with mode: 0644]
queue-5.7/clk-meson-meson8b-don-t-rely-on-u-boot-to-init-all-g.patch [new file with mode: 0644]
queue-5.7/clk-meson-meson8b-fix-the-first-parent-of-vid_pll_in.patch [new file with mode: 0644]
queue-5.7/clk-meson-meson8b-fix-the-polarity-of-the-reset_n-li.patch [new file with mode: 0644]
queue-5.7/clk-meson-meson8b-fix-the-vclk_div-1-2-4-6-12-_en-ga.patch [new file with mode: 0644]
queue-5.7/clk-qcom-msm8916-fix-the-address-location-of-pll-con.patch [new file with mode: 0644]
queue-5.7/clk-renesas-cpg-mssr-fix-stbcr-suspend-resume-handli.patch [new file with mode: 0644]
queue-5.7/clk-samsung-exynos5433-add-ignore_unused-flag-to-scl.patch [new file with mode: 0644]
queue-5.7/clk-samsung-mark-top-isp-and-cam-clocks-on-exynos542.patch [new file with mode: 0644]
queue-5.7/clk-sprd-fix-compile-testing.patch [new file with mode: 0644]
queue-5.7/clk-sprd-return-correct-type-of-value-for-_sprd_pll_.patch [new file with mode: 0644]
queue-5.7/clk-sunxi-fix-incorrect-usage-of-round_down.patch [new file with mode: 0644]
queue-5.7/clk-ti-composite-fix-memory-leak.patch [new file with mode: 0644]
queue-5.7/clk-zynqmp-fix-divider2-calculation.patch [new file with mode: 0644]
queue-5.7/clk-zynqmp-fix-memory-leak-in-zynqmp_register_clocks.patch [new file with mode: 0644]
queue-5.7/coresight-etm4x-fix-use-after-free-of-per-cpu-etm-dr.patch [new file with mode: 0644]
queue-5.7/coresight-fix-support-for-sparsely-populated-ports.patch [new file with mode: 0644]
queue-5.7/coresight-tmc-fix-tmc-mode-read-in-tmc_read_prepare_.patch [new file with mode: 0644]
queue-5.7/crypto-hisilicon-cap-block-size-at-2-31.patch [new file with mode: 0644]
queue-5.7/crypto-marvell-octeontx-fix-a-potential-null-derefer.patch [new file with mode: 0644]
queue-5.7/crypto-omap-sham-add-proper-load-balancing-support-f.patch [new file with mode: 0644]
queue-5.7/crypto-omap-sham-huge-buffer-access-fixes.patch [new file with mode: 0644]
queue-5.7/dev-mem-revoke-mappings-when-a-driver-claims-the-reg.patch [new file with mode: 0644]
queue-5.7/dlm-remove-bug-before-panic.patch [new file with mode: 0644]
queue-5.7/dm-mpath-switch-paths-in-dm_blk_ioctl-code-path.patch [new file with mode: 0644]
queue-5.7/dm-zoned-return-null-if-dmz_get_zone_for_reclaim-fai.patch [new file with mode: 0644]
queue-5.7/drivers-base-fix-null-pointer-exception-in-__platfor.patch [new file with mode: 0644]
queue-5.7/drivers-perf-hisi-fix-wrong-value-for-all-counters-e.patch [new file with mode: 0644]
queue-5.7/drivers-phy-sr-usb-do-not-use-internal-fsm-for-usb2-.patch [new file with mode: 0644]
queue-5.7/drm-amd-display-revalidate-bandwidth-before-commitin.patch [new file with mode: 0644]
queue-5.7/drm-ast-fix-missing-break-in-switch-statement-for-fo.patch [new file with mode: 0644]
queue-5.7/drm-encoder_slave-fix-refcouting-error-for-modules.patch [new file with mode: 0644]
queue-5.7/drm-msm-fix-undefined-rd_full-link-error.patch [new file with mode: 0644]
queue-5.7/drm-msm-mdp5-fix-mdp5_init-error-path-for-failed-mdp.patch [new file with mode: 0644]
queue-5.7/drm-nouveau-disp-gm200-fix-nv_pdisp_sor_hdmi2_ctrl-n.patch [new file with mode: 0644]
queue-5.7/drm-nouveau-gr-gk20a-use-firmware-version-0.patch [new file with mode: 0644]
queue-5.7/drm-sun4i-hdmi-ddc-clk-fix-size-of-m-divider.patch [new file with mode: 0644]
queue-5.7/ext4-don-t-block-for-o_direct-if-iocb_nowait-is-set.patch [new file with mode: 0644]
queue-5.7/ext4-handle-ext4_mark_inode_dirty-errors.patch [new file with mode: 0644]
queue-5.7/ext4-stop-overwrite-the-errcode-in-ext4_setup_super.patch [new file with mode: 0644]
queue-5.7/extcon-adc-jack-fix-an-error-handling-path-in-adc_ja.patch [new file with mode: 0644]
queue-5.7/f2fs-compress-fix-zstd-data-corruption.patch [new file with mode: 0644]
queue-5.7/f2fs-compress-let-lz4-compressor-handle-output-buffe.patch [new file with mode: 0644]
queue-5.7/f2fs-don-t-return-vmalloc-memory-from-f2fs_kmalloc.patch [new file with mode: 0644]
queue-5.7/f2fs-fix-potential-use-after-free-issue.patch [new file with mode: 0644]
queue-5.7/f2fs-fix-wrong-stub-helper-update_sit_info.patch [new file with mode: 0644]
queue-5.7/f2fs-handle-readonly-filesystem-in-f2fs_ioc_shutdown.patch [new file with mode: 0644]
queue-5.7/f2fs-report-delalloc-reserve-as-non-free-in-statfs-f.patch [new file with mode: 0644]
queue-5.7/firmware-imx-scu-fix-possible-memory-leak-in-imx_scu.patch [new file with mode: 0644]
queue-5.7/firmware-qcom_scm-fix-bogous-abuse-of-dma-direct-int.patch [new file with mode: 0644]
queue-5.7/fpga-dfl-afu-corrected-error-handling-levels.patch [new file with mode: 0644]
queue-5.7/fuse-bug_on-correction-in-fuse_dev_splice_write.patch [new file with mode: 0644]
queue-5.7/fuse-copy_file_range-should-truncate-cache.patch [new file with mode: 0644]
queue-5.7/fuse-fix-copy_file_range-cache-issues.patch [new file with mode: 0644]
queue-5.7/geneve-change-from-tx_error-to-tx_dropped-on-missing.patch [new file with mode: 0644]
queue-5.7/gfs2-allow-lock_nolock-mount-to-specify-jid-x.patch [new file with mode: 0644]
queue-5.7/gfs2-fix-use-after-free-on-transaction-ail-lists.patch [new file with mode: 0644]
queue-5.7/gpio-dwapb-append-module_alias-for-platform-driver.patch [new file with mode: 0644]
queue-5.7/gpio-dwapb-call-acpi_gpiochip_free_interrupts-on-gpi.patch [new file with mode: 0644]
queue-5.7/gpio-mlxbf2-fix-return-value-check-in-mlxbf2_gpio_ge.patch [new file with mode: 0644]
queue-5.7/gpio-pca953x-fix-handling-of-automatic-address-incre.patch [new file with mode: 0644]
queue-5.7/habanalabs-don-t-allow-hard-reset-with-open-processe.patch [new file with mode: 0644]
queue-5.7/habanalabs-increase-timeout-during-reset.patch [new file with mode: 0644]
queue-5.7/hid-add-quirks-for-trust-panora-graphic-tablet.patch [new file with mode: 0644]
queue-5.7/hid-intel-ish-hid-avoid-bogus-uninitialized-variable.patch [new file with mode: 0644]
queue-5.7/i2c-icy-fix-build-with-config_amiga_pcmcia-n.patch [new file with mode: 0644]
queue-5.7/i2c-piix4-detect-secondary-smbus-controller-on-amd-a.patch [new file with mode: 0644]
queue-5.7/i2c-pxa-clear-all-master-action-bits-in-i2c_pxa_stop.patch [new file with mode: 0644]
queue-5.7/i2c-pxa-fix-i2c_pxa_scream_blue_murder-debug-output.patch [new file with mode: 0644]
queue-5.7/iavf-fix-speed-reporting-over-virtchnl.patch [new file with mode: 0644]
queue-5.7/ib-cma-fix-ports-memory-leak-in-cma_configfs.patch [new file with mode: 0644]
queue-5.7/ib-mlx5-fix-devx-support-for-mlx5_cmd_op_init2init_q.patch [new file with mode: 0644]
queue-5.7/ibmvnic-flush-existing-work-items-before-device-remo.patch [new file with mode: 0644]
queue-5.7/iio-bmp280-fix-compensation-of-humidity.patch [new file with mode: 0644]
queue-5.7/iio-buffer-dmaengine-use-zu-specifier-for-sprintf-al.patch [new file with mode: 0644]
queue-5.7/iio-light-gp2ap002-take-runtime-pm-reference-on-ligh.patch [new file with mode: 0644]
queue-5.7/iio-pressure-bmp280-tolerate-irq-before-registering.patch [new file with mode: 0644]
queue-5.7/include-linux-bitops.h-avoid-clang-shift-count-overf.patch [new file with mode: 0644]
queue-5.7/input-edt-ft5x06-fix-get_default-register-write-acce.patch [new file with mode: 0644]
queue-5.7/input-i8042-remove-special-powerpc-handling.patch [new file with mode: 0644]
queue-5.7/input-mms114-add-extra-compatible-for-mms345l.patch [new file with mode: 0644]
queue-5.7/iommu-arm-smmu-v3-don-t-reserve-implementation-defin.patch [new file with mode: 0644]
queue-5.7/ipmi-use-vzalloc-instead-of-kmalloc-for-user-creatio.patch [new file with mode: 0644]
queue-5.7/kvm-ppc-book3s-fix-some-rcu-list-locks.patch [new file with mode: 0644]
queue-5.7/kvm-ppc-book3s-hv-ignore-kmemleak-false-positives.patch [new file with mode: 0644]
queue-5.7/kvm-ppc-book3s-hv-relax-check-on-h_svm_init_abort.patch [new file with mode: 0644]
queue-5.7/kvm-selftests-fix-build-with-make-arch-x86_64.patch [new file with mode: 0644]
queue-5.7/lib-zlib-remove-outdated-and-incorrect-pre-increment.patch [new file with mode: 0644]
queue-5.7/libata-use-per-port-sync-for-detach.patch [new file with mode: 0644]
queue-5.7/libbpf-handle-gcc-noreturn-turned-volatile-quirk.patch [new file with mode: 0644]
queue-5.7/libbpf-support-pre-initializing-.bss-global-variable.patch [new file with mode: 0644]
queue-5.7/m68k-pci-fix-a-memory-leak-in-an-error-handling-path.patch [new file with mode: 0644]
queue-5.7/mailbox-imx-add-context-save-restore-for-suspend-res.patch [new file with mode: 0644]
queue-5.7/mailbox-imx-fix-return-in-imx_mu_scu_xlate.patch [new file with mode: 0644]
queue-5.7/mailbox-zynqmp-ipi-fix-null-vs-is_err-check-in-zynqm.patch [new file with mode: 0644]
queue-5.7/media-s5p-mfc-properly-handle-dma_parms-for-the-allo.patch [new file with mode: 0644]
queue-5.7/media-v4l2-ctrls-unset-correct-hevc-loop-filter-flag.patch [new file with mode: 0644]
queue-5.7/mfd-stmfx-disable-irq-in-suspend-to-avoid-spurious-i.patch [new file with mode: 0644]
queue-5.7/mfd-stmfx-fix-stmfx_irq_init-error-path.patch [new file with mode: 0644]
queue-5.7/mfd-stmfx-reset-chip-on-resume-as-supply-was-disable.patch [new file with mode: 0644]
queue-5.7/mfd-wcd934x-drop-kfree-for-memory-allocated-with-dev.patch [new file with mode: 0644]
queue-5.7/mfd-wm8994-fix-driver-operation-if-loaded-as-modules.patch [new file with mode: 0644]
queue-5.7/misc-fastrpc-fix-an-incomplete-memory-release-in-fas.patch [new file with mode: 0644]
queue-5.7/misc-fastrpc-fix-potential-fastrpc_invoke_ctx-leak.patch [new file with mode: 0644]
queue-5.7/misc-xilinx-sdfec-improve-get_user_pages_fast-error-.patch [new file with mode: 0644]
queue-5.7/mksysmap-fix-the-mismatch-of-.l-symbols-in-system.ma.patch [new file with mode: 0644]
queue-5.7/mlxsw-spectrum-adjust-headroom-buffers-for-8x-ports.patch [new file with mode: 0644]
queue-5.7/modpost-fix-i-ignore-errors-makeflags-detection.patch [new file with mode: 0644]
queue-5.7/mvpp2-remove-module-bugfix.patch [new file with mode: 0644]
queue-5.7/net-dp83867-fix-of_mdio-config-check.patch [new file with mode: 0644]
queue-5.7/net-dsa-lantiq_gswip-fix-and-improve-the-unsupported.patch [new file with mode: 0644]
queue-5.7/net-dsa-sja1105-fix-ptp-timestamping-with-large-tc-t.patch [new file with mode: 0644]
queue-5.7/net-filter-permit-reading-net-in-load_bytes_relative.patch [new file with mode: 0644]
queue-5.7/net-ipa-program-upper-nibbles-of-sequencer-type.patch [new file with mode: 0644]
queue-5.7/net-marvell-fix-of_mdio-config-check.patch [new file with mode: 0644]
queue-5.7/net-mdiobus-disable-preemption-upon-u64_stats-update.patch [new file with mode: 0644]
queue-5.7/net-mscc-fix-of_mdio-config-check.patch [new file with mode: 0644]
queue-5.7/net-sunrpc-fix-off-by-one-issues-in-rpc_ntop6.patch [new file with mode: 0644]
queue-5.7/nfs-fix-direct-write-throughput-regression.patch [new file with mode: 0644]
queue-5.7/nfs-set-invalid-blocks-after-nfsv4-writes.patch [new file with mode: 0644]
queue-5.7/nfsd-fix-svc_xprt-refcnt-leak-when-setup-callback-cl.patch [new file with mode: 0644]
queue-5.7/nfsd-safer-handling-of-corrupted-c_type.patch [new file with mode: 0644]
queue-5.7/nfsd4-make-drc_slab-global-not-per-net.patch [new file with mode: 0644]
queue-5.7/nfsv4.1-fix-rpc_call_done-assignment-for-bind_conn_t.patch [new file with mode: 0644]
queue-5.7/ntb-fix-the-default-port-and-peer-numbers-for-legacy.patch [new file with mode: 0644]
queue-5.7/ntb-ntb_pingpong-choose-doorbells-based-on-port-numb.patch [new file with mode: 0644]
queue-5.7/ntb-ntb_test-fix-bug-when-counting-remote-files.patch [new file with mode: 0644]
queue-5.7/ntb-ntb_tool-reading-the-link-file-should-not-end-in.patch [new file with mode: 0644]
queue-5.7/ntb-perf-don-t-require-one-more-memory-window-than-n.patch [new file with mode: 0644]
queue-5.7/ntb-perf-fix-race-condition-when-run-with-ntb_test.patch [new file with mode: 0644]
queue-5.7/ntb-perf-fix-support-for-hardware-that-doesn-t-have-.patch [new file with mode: 0644]
queue-5.7/ntb-revert-the-change-to-use-the-ntb-device-dev-for-.patch [new file with mode: 0644]
queue-5.7/ntb_perf-pass-correct-struct-device-to-dma_alloc_coh.patch [new file with mode: 0644]
queue-5.7/ntb_tool-pass-correct-struct-device-to-dma_alloc_coh.patch [new file with mode: 0644]
queue-5.7/nvme-fc-don-t-call-nvme_cleanup_cmd-for-aens.patch [new file with mode: 0644]
queue-5.7/nvme-pci-use-simple-suspend-when-a-hmb-is-enabled.patch [new file with mode: 0644]
queue-5.7/nvmem-ensure-sysfs-writes-handle-write-protect-pin.patch [new file with mode: 0644]
queue-5.7/of-fix-a-refcounting-bug-in-__of_attach_node_sysfs.patch [new file with mode: 0644]
queue-5.7/of-property-do-not-link-to-disabled-devices.patch [new file with mode: 0644]
queue-5.7/of-property-fix-create-device-links-for-all-child-su.patch [new file with mode: 0644]
queue-5.7/openrisc-fix-issue-with-argument-clobbering-for-clon.patch [new file with mode: 0644]
queue-5.7/ovl-verify-permissions-in-ovl_path_open.patch [new file with mode: 0644]
queue-5.7/pci-aardvark-don-t-blindly-enable-aspm-l0s-and-don-t.patch [new file with mode: 0644]
queue-5.7/pci-aardvark-improve-link-training.patch [new file with mode: 0644]
queue-5.7/pci-aardvark-issue-perst-via-gpio.patch [new file with mode: 0644]
queue-5.7/pci-aardvark-train-link-immediately-after-enabling-t.patch [new file with mode: 0644]
queue-5.7/pci-allow-pci_resize_resource-for-devices-on-root-bu.patch [new file with mode: 0644]
queue-5.7/pci-amlogic-meson-don-t-use-fast_link_mode-to-set-up.patch [new file with mode: 0644]
queue-5.7/pci-aspm-allow-aspm-on-links-to-pcie-to-pci-pci-x-br.patch [new file with mode: 0644]
queue-5.7/pci-brcmstb-assert-fundamental-reset-on-initializati.patch [new file with mode: 0644]
queue-5.7/pci-brcmstb-fix-window-register-offset-from-4-to-8.patch [new file with mode: 0644]
queue-5.7/pci-dwc-fix-inner-msi-irq-domain-registration.patch [new file with mode: 0644]
queue-5.7/pci-dwc-pci-dra7xx-use-devm_platform_ioremap_resourc.patch [new file with mode: 0644]
queue-5.7/pci-endpoint-functions-pci-epf-test-fix-dma-channel-.patch [new file with mode: 0644]
queue-5.7/pci-fix-pci_register_host_bridge-device_register-err.patch [new file with mode: 0644]
queue-5.7/pci-pci-bridge-emul-fix-pcie-bit-conflicts.patch [new file with mode: 0644]
queue-5.7/pci-pm-assume-ports-without-dll-link-active-train-li.patch [new file with mode: 0644]
queue-5.7/pci-ptm-inherit-switch-downstream-port-ptm-settings-.patch [new file with mode: 0644]
queue-5.7/pci-rcar-fix-incorrect-programming-of-ob-windows.patch [new file with mode: 0644]
queue-5.7/pci-v3-semi-fix-a-memory-leak-in-v3_pci_probe-error-.patch [new file with mode: 0644]
queue-5.7/pci-vmd-filter-resource-type-bits-from-shadow-regist.patch [new file with mode: 0644]
queue-5.7/perf-parse-events-fix-an-incompatible-pointer.patch [new file with mode: 0644]
queue-5.7/perf-probe-fix-user-attribute-access-in-kprobes.patch [new file with mode: 0644]
queue-5.7/perf-report-fix-null-pointer-dereference-in-hists__f.patch [new file with mode: 0644]
queue-5.7/perf-stat-fix-null-pointer-dereference.patch [new file with mode: 0644]
queue-5.7/phy-cadence-sierra-fix-for-usb3-u1-u2-state.patch [new file with mode: 0644]
queue-5.7/phy-ti-j721e-wiz-fix-some-error-return-code-in-wiz_p.patch [new file with mode: 0644]
queue-5.7/pinctrl-fix-return-value-about-devm_platform_ioremap.patch [new file with mode: 0644]
queue-5.7/pinctrl-freescale-imx-fix-an-error-handling-path-in-.patch [new file with mode: 0644]
queue-5.7/pinctrl-freescale-imx-use-devm_of_iomap-to-avoid-a-r.patch [new file with mode: 0644]
queue-5.7/pinctrl-imxl-fix-an-error-handling-path-in-imx1_pinc.patch [new file with mode: 0644]
queue-5.7/pinctrl-ocelot-always-register-gpio-driver.patch [new file with mode: 0644]
queue-5.7/pinctrl-ocelot-fix-gpio-interrupt-decoding-on-jaguar.patch [new file with mode: 0644]
queue-5.7/pinctrl-qcom-ipq6018-add-missing-pins-in-qpic-pin-gr.patch [new file with mode: 0644]
queue-5.7/pinctrl-rockchip-fix-memleak-in-rockchip_dt_node_to_.patch [new file with mode: 0644]
queue-5.7/pinctrl-rza1-fix-wrong-array-assignment-of-rza1l_swi.patch [new file with mode: 0644]
queue-5.7/pinctrl-sirf-add-missing-put_device-call-in-sirfsoc_.patch [new file with mode: 0644]
queue-5.7/power-supply-bq24257_charger-replace-depends-on-regm.patch [new file with mode: 0644]
queue-5.7/power-supply-lp8788-fix-an-error-handling-path-in-lp.patch [new file with mode: 0644]
queue-5.7/power-supply-smb347-charger-irqstat_d-is-volatile.patch [new file with mode: 0644]
queue-5.7/powerpc-32s-don-t-warn-when-mapping-ro-data-rox.patch [new file with mode: 0644]
queue-5.7/powerpc-4xx-don-t-unmap-null-mbase.patch [new file with mode: 0644]
queue-5.7/powerpc-64-don-t-initialise-init_task-thread.regs.patch [new file with mode: 0644]
queue-5.7/powerpc-64s-exception-fix-machine-check-no-loss-idle.patch [new file with mode: 0644]
queue-5.7/powerpc-64s-exceptions-machine-check-reconcile-irq-s.patch [new file with mode: 0644]
queue-5.7/powerpc-64s-kuap-add-missing-isync-to-kuap-restore-p.patch [new file with mode: 0644]
queue-5.7/powerpc-64s-pgtable-fix-an-undefined-behaviour.patch [new file with mode: 0644]
queue-5.7/powerpc-8xx-drop-config_8xx_copyback-option.patch [new file with mode: 0644]
queue-5.7/powerpc-book3s64-radix-tlb-determine-hugepage-flush-.patch [new file with mode: 0644]
queue-5.7/powerpc-crashkernel-take-mem-option-into-account.patch [new file with mode: 0644]
queue-5.7/powerpc-fix-kernel-crash-in-show_instructions-w-debu.patch [new file with mode: 0644]
queue-5.7/powerpc-kasan-fix-error-detection-on-memory-allocati.patch [new file with mode: 0644]
queue-5.7/powerpc-kasan-fix-stack-overflow-by-increasing-threa.patch [new file with mode: 0644]
queue-5.7/powerpc-perf-hv-24x7-fix-inconsistent-output-values-.patch [new file with mode: 0644]
queue-5.7/powerpc-powernv-add-null-check-after-kzalloc.patch [new file with mode: 0644]
queue-5.7/powerpc-ps3-fix-kexec-shutdown-hang.patch [new file with mode: 0644]
queue-5.7/powerpc-pseries-ras-fix-fwnmi_valid-off-by-one.patch [new file with mode: 0644]
queue-5.7/powerpc-ptdump-add-_page_coherent-flag.patch [new file with mode: 0644]
queue-5.7/ps3disk-use-the-default-segment-boundary.patch [new file with mode: 0644]
queue-5.7/pwm-add-missing-config_-prefix.patch [new file with mode: 0644]
queue-5.7/pwm-img-call-pm_runtime_put-in-pm_runtime_get_sync-f.patch [new file with mode: 0644]
queue-5.7/pwm-imx27-fix-rounding-behavior.patch [new file with mode: 0644]
queue-5.7/rdma-cm-spurious-warning-triggered-in-cm_destroy_id.patch [new file with mode: 0644]
queue-5.7/rdma-core-fix-several-reference-count-leaks.patch [new file with mode: 0644]
queue-5.7/rdma-efa-fix-setting-of-wrong-bit-in-get-set_feature.patch [new file with mode: 0644]
queue-5.7/rdma-hns-bugfix-for-querying-qkey.patch [new file with mode: 0644]
queue-5.7/rdma-hns-fix-cmdq-parameter-of-querying-pf-timer-res.patch [new file with mode: 0644]
queue-5.7/rdma-iw_cxgb4-cleanup-device-debugfs-entries-on-uld-.patch [new file with mode: 0644]
queue-5.7/rdma-mlx5-add-init2init-as-a-modify-command.patch [new file with mode: 0644]
queue-5.7/rdma-mlx5-fix-udata-response-upon-srq-creation.patch [new file with mode: 0644]
queue-5.7/rdma-srpt-fix-disabling-device-management.patch [new file with mode: 0644]
queue-5.7/rdma-uverbs-fix-create-wq-to-use-the-given-user-hand.patch [new file with mode: 0644]
queue-5.7/remoteproc-fix-idr-initialisation-in-rproc_alloc.patch [new file with mode: 0644]
queue-5.7/remoteproc-mediatek-fix-invalid-use-of-sizeof-in-scp.patch [new file with mode: 0644]
queue-5.7/remoteproc-qcom_q6v5_mss-drop-accesses-to-mpss-perph.patch [new file with mode: 0644]
queue-5.7/remoteproc-qcom_q6v5_mss-map-unmap-mpss-segments-bef.patch [new file with mode: 0644]
queue-5.7/rtc-mc13xxx-fix-a-double-unlock-issue.patch [new file with mode: 0644]
queue-5.7/rtc-rc5t619-fix-an-err_ptr-vs-null-check.patch [new file with mode: 0644]
queue-5.7/rtc-rv3028-add-missed-check-for-devm_regmap_init_i2c.patch [new file with mode: 0644]
queue-5.7/rxrpc-adjust-proc-net-rxrpc-calls-to-display-call-de.patch [new file with mode: 0644]
queue-5.7/s390-numa-let-nodes_shift-depend-on-need_multiple_no.patch [new file with mode: 0644]
queue-5.7/s390-qdio-consistently-restore-the-irq-handler.patch [new file with mode: 0644]
queue-5.7/s390-qdio-put-thinint-indicator-after-early-error.patch [new file with mode: 0644]
queue-5.7/s390-qdio-tear-down-thinint-indicator-after-early-er.patch [new file with mode: 0644]
queue-5.7/scripts-headers_install-exit-with-error-on-config-le.patch [new file with mode: 0644]
queue-5.7/scsi-acornscsi-fix-an-error-handling-path-in-acornsc.patch [new file with mode: 0644]
queue-5.7/scsi-core-fix-incorrect-usage-of-shost_for_each_devi.patch [new file with mode: 0644]
queue-5.7/scsi-core-free-sgtables-in-case-command-setup-fails.patch [new file with mode: 0644]
queue-5.7/scsi-cxgb3i-fix-some-leaks-in-init_act_open.patch [new file with mode: 0644]
queue-5.7/scsi-hisi_sas-do-not-reset-phy-timer-to-wait-for-str.patch [new file with mode: 0644]
queue-5.7/scsi-ibmvscsi-don-t-send-host-info-in-adapter-info-m.patch [new file with mode: 0644]
queue-5.7/scsi-iscsi-fix-deadlock-on-recovery-path-during-gfp_.patch [new file with mode: 0644]
queue-5.7/scsi-iscsi-fix-reference-count-leak-in-iscsi_boot_cr.patch [new file with mode: 0644]
queue-5.7/scsi-lpfc-fix-lpfc_nodelist-leak-when-processing-uns.patch [new file with mode: 0644]
queue-5.7/scsi-mpt3sas-fix-double-free-warnings.patch [new file with mode: 0644]
queue-5.7/scsi-qedf-fix-crash-when-mfw-calls-for-protocol-stat.patch [new file with mode: 0644]
queue-5.7/scsi-qedi-check-for-buffer-overflow-in-qedi_set_path.patch [new file with mode: 0644]
queue-5.7/scsi-qedi-do-not-flush-offload-work-if-arp-not-resol.patch [new file with mode: 0644]
queue-5.7/scsi-qla2xxx-fix-issue-with-adapter-s-stopping-state.patch [new file with mode: 0644]
queue-5.7/scsi-qla2xxx-fix-warning-after-fc-target-reset.patch [new file with mode: 0644]
queue-5.7/scsi-sr-fix-sr_probe-missing-deallocate-of-device-mi.patch [new file with mode: 0644]
queue-5.7/scsi-sr-fix-sr_probe-missing-mutex_destroy.patch [new file with mode: 0644]
queue-5.7/scsi-target-loopback-fix-read-with-data-and-sensebyt.patch [new file with mode: 0644]
queue-5.7/scsi-target-tcmu-fix-a-use-after-free-in-tcmu_check_.patch [new file with mode: 0644]
queue-5.7/scsi-target-tcmu-userspace-must-not-complete-queued-.patch [new file with mode: 0644]
queue-5.7/scsi-ufs-bsg-fix-runtime-pm-imbalance-on-error.patch [new file with mode: 0644]
queue-5.7/scsi-ufs-don-t-update-urgent-bkops-level-when-toggli.patch [new file with mode: 0644]
queue-5.7/scsi-ufs-qcom-fix-scheduling-while-atomic-issue.patch [new file with mode: 0644]
queue-5.7/scsi-ufs-ti-j721e-ufs-fix-unwinding-of-pm_runtime-ch.patch [new file with mode: 0644]
queue-5.7/scsi-vhost-notify-tcm-about-the-maximum-sg-entries-s.patch [new file with mode: 0644]
queue-5.7/selftests-net-in-timestamping-strncpy-needs-to-prese.patch [new file with mode: 0644]
queue-5.7/selftests-timens-handle-a-case-when-alarm-clocks-are.patch [new file with mode: 0644]
queue-5.7/selftests-vm-pkeys-fix-alloc_random_pkey-to-make-it-.patch [new file with mode: 0644]
queue-5.7/serial-8250-fix-max-baud-limit-in-generic-8250-port.patch [new file with mode: 0644]
queue-5.7/series [new file with mode: 0644]
queue-5.7/slimbus-ngd-get-drvdata-from-correct-device.patch [new file with mode: 0644]
queue-5.7/soc-rsnd-add-interrupt-support-for-ssi-busif-buffer.patch [new file with mode: 0644]
queue-5.7/soundwire-slave-don-t-init-debugfs-on-device-registr.patch [new file with mode: 0644]
queue-5.7/sparc32-mm-don-t-try-to-free-page-table-pages-if-cto.patch [new file with mode: 0644]
queue-5.7/staging-gasket-fix-mapping-refcnt-leak-when-put-attr.patch [new file with mode: 0644]
queue-5.7/staging-gasket-fix-mapping-refcnt-leak-when-register.patch [new file with mode: 0644]
queue-5.7/staging-greybus-fix-a-missing-check-bug-in-gb_lights.patch [new file with mode: 0644]
queue-5.7/staging-mt7621-pci-fix-pcie-interrupt-mapping.patch [new file with mode: 0644]
queue-5.7/staging-rtl8712-fix-multiline-derefernce-warnings.patch [new file with mode: 0644]
queue-5.7/staging-sm750fb-add-missing-case-while-setting-fb_vi.patch [new file with mode: 0644]
queue-5.7/staging-wfx-avoid-compiler-warning-on-empty-array.patch [new file with mode: 0644]
queue-5.7/staging-wfx-check-ssidlen-and-prevent-an-array-overf.patch [new file with mode: 0644]
queue-5.7/staging-wfx-fix-double-init-of-tx_policy_upload_work.patch [new file with mode: 0644]
queue-5.7/staging-wfx-fix-output-of-rx_stats-on-big-endian-hos.patch [new file with mode: 0644]
queue-5.7/staging-wfx-fix-overflow-in-frame-counters.patch [new file with mode: 0644]
queue-5.7/staging-wfx-fix-potential-deadlock-in-wfx_tx_flush.patch [new file with mode: 0644]
queue-5.7/staging-wfx-fix-value-of-scan-timeout.patch [new file with mode: 0644]
queue-5.7/staging-wilc1000-increase-the-size-of-wid_list-array.patch [new file with mode: 0644]
queue-5.7/thermal-drivers-ti-soc-thermal-avoid-dereferencing-e.patch [new file with mode: 0644]
queue-5.7/tools-bpftool-fix-memory-leak-in-codegen-error-cases.patch [new file with mode: 0644]
queue-5.7/tracing-probe-fix-bpf_task_fd_query-for-kprobes-and-.patch [new file with mode: 0644]
queue-5.7/tty-hvc-fix-data-abort-due-to-race-in-hvc_open.patch [new file with mode: 0644]
queue-5.7/tty-n_gsm-fix-bogus-i-in-gsm_data_kick.patch [new file with mode: 0644]
queue-5.7/tty-n_gsm-fix-sof-skipping.patch [new file with mode: 0644]
queue-5.7/tty-n_gsm-fix-waking-up-upper-tty-layer-when-room-av.patch [new file with mode: 0644]
queue-5.7/um-do-not-evaluate-compiler-s-library-path-when-clea.patch [new file with mode: 0644]
queue-5.7/unicore32-do-not-evaluate-compiler-s-library-path-wh.patch [new file with mode: 0644]
queue-5.7/usb-cdns3-fix-runtime-pm-imbalance-on-error.patch [new file with mode: 0644]
queue-5.7/usb-dwc2-gadget-move-gadget-resume-after-the-core-is.patch [new file with mode: 0644]
queue-5.7/usb-dwc3-gadget-properly-handle-clearfeature-halt.patch [new file with mode: 0644]
queue-5.7/usb-dwc3-gadget-properly-handle-failed-kick_transfer.patch [new file with mode: 0644]
queue-5.7/usb-dwc3-meson-g12a-check-return-of-dwc3_meson_g12a_.patch [new file with mode: 0644]
queue-5.7/usb-dwc3-meson-g12a-fix-error-path-when-fetching-the.patch [new file with mode: 0644]
queue-5.7/usb-ehci-platform-set-pm-runtime-as-active-on-resume.patch [new file with mode: 0644]
queue-5.7/usb-gadget-core-sync-interrupt-before-unbind-the-udc.patch [new file with mode: 0644]
queue-5.7/usb-gadget-fix-issue-with-config_ep_by_speed-functio.patch [new file with mode: 0644]
queue-5.7/usb-gadget-fix-potential-double-free-in-m66592_probe.patch [new file with mode: 0644]
queue-5.7/usb-gadget-lpc32xx_udc-don-t-dereference-ep-pointer-.patch [new file with mode: 0644]
queue-5.7/usb-gadget-udc-s3c2410_udc-remove-pointless-null-che.patch [new file with mode: 0644]
queue-5.7/usb-host-ehci-mxc-add-error-handling-in-ehci_mxc_drv.patch [new file with mode: 0644]
queue-5.7/usb-ohci-platform-fix-a-warning-when-hibernating.patch [new file with mode: 0644]
queue-5.7/usb-ohci-sm501-fix-error-return-code-in-ohci_hcd_sm5.patch [new file with mode: 0644]
queue-5.7/usb-roles-switch-on-role-switch-uevent-reporting.patch [new file with mode: 0644]
queue-5.7/usb-xhci-plat-set-pm-runtime-as-active-on-resume.patch [new file with mode: 0644]
queue-5.7/usblp-poison-urbs-upon-disconnect.patch [new file with mode: 0644]
queue-5.7/vfio-mdev-fix-reference-count-leak-in-add_mdev_suppo.patch [new file with mode: 0644]
queue-5.7/vfio-pci-fix-memory-leaks-in-alloc_perm_bits.patch [new file with mode: 0644]
queue-5.7/vfio-pci-mask-cap-zero.patch [new file with mode: 0644]
queue-5.7/virtiofs-schedule-blocking-async-replies-in-separate.patch [new file with mode: 0644]
queue-5.7/watchdog-da9062-no-need-to-ping-manually-before-sett.patch [new file with mode: 0644]
queue-5.7/x86-apic-make-tsc-deadline-timer-detection-message-v.patch [new file with mode: 0644]
queue-5.7/x86-idt-keep-spurious-entries-unset-in-system_vector.patch [new file with mode: 0644]
queue-5.7/x86-mce-dev-mcelog-fix-wstringop-truncation-warning-.patch [new file with mode: 0644]
queue-5.7/x86-purgatory-disable-various-profiling-and-sanitizi.patch [new file with mode: 0644]
queue-5.7/xdp-fix-xsk_generic_xmit-errno.patch [new file with mode: 0644]
queue-5.7/xen-cpuhotplug-fix-initial-cpu-offlining-for-pv-h-gu.patch [new file with mode: 0644]
queue-5.7/xfs-add-the-missed-xfs_perag_put-for-xfs_ifree_clust.patch [new file with mode: 0644]
queue-5.7/yam-fix-possible-memory-leak-in-yam_init_driver.patch [new file with mode: 0644]

diff --git a/queue-5.7/afs-afs_write_end-should-change-i_size-under-the-rig.patch b/queue-5.7/afs-afs_write_end-should-change-i_size-under-the-rig.patch
new file mode 100644 (file)
index 0000000..1d72c82
--- /dev/null
@@ -0,0 +1,44 @@
+From 82a2f1edf642e66ae54809cf3d79474d6e188c7d Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 12 Jun 2020 23:58:51 +0100
+Subject: afs: afs_write_end() should change i_size under the right lock
+
+From: David Howells <dhowells@redhat.com>
+
+[ Upstream commit 1f32ef79897052ef7d3d154610d8d6af95abde83 ]
+
+Fix afs_write_end() to change i_size under vnode->cb_lock rather than
+->wb_lock so that it doesn't race with afs_vnode_commit_status() and
+afs_getattr().
+
+The ->wb_lock is only meant to guard access to ->wb_keys which isn't
+accessed by that piece of code.
+
+Fixes: 4343d00872e1 ("afs: Get rid of the afs_writeback record")
+Signed-off-by: David Howells <dhowells@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/afs/write.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/fs/afs/write.c b/fs/afs/write.c
+index 371db86c6c5ec..96b042af62485 100644
+--- a/fs/afs/write.c
++++ b/fs/afs/write.c
+@@ -194,11 +194,11 @@ int afs_write_end(struct file *file, struct address_space *mapping,
+       i_size = i_size_read(&vnode->vfs_inode);
+       if (maybe_i_size > i_size) {
+-              spin_lock(&vnode->wb_lock);
++              write_seqlock(&vnode->cb_lock);
+               i_size = i_size_read(&vnode->vfs_inode);
+               if (maybe_i_size > i_size)
+                       i_size_write(&vnode->vfs_inode, maybe_i_size);
+-              spin_unlock(&vnode->wb_lock);
++              write_sequnlock(&vnode->cb_lock);
+       }
+       if (!PageUptodate(page)) {
+-- 
+2.25.1
+
diff --git a/queue-5.7/afs-always-include-dir-in-bulk-status-fetch-from-afs.patch b/queue-5.7/afs-always-include-dir-in-bulk-status-fetch-from-afs.patch
new file mode 100644 (file)
index 0000000..53479de
--- /dev/null
@@ -0,0 +1,59 @@
+From a408574478492ab5927d0ad89c030b5271ef9903 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 16 Apr 2020 14:20:32 +0100
+Subject: afs: Always include dir in bulk status fetch from afs_do_lookup()
+
+From: David Howells <dhowells@redhat.com>
+
+[ Upstream commit 13fcc6356a94558a0a4857dc00cd26b3834a1b3e ]
+
+When a lookup is done in an AFS directory, the filesystem will speculate
+and fetch up to 49 other statuses for files in the same directory and fetch
+those as well, turning them into inodes or updating inodes that already
+exist.
+
+However, occasionally, a callback break might go missing due to NAT timing
+out, but the afs filesystem doesn't then realise that the directory is not
+up to date.
+
+Alleviate this by using one of the status slots to check the directory in
+which the lookup is being done.
+
+Reported-by: Dave Botsch <botsch@cnf.cornell.edu>
+Suggested-by: Jeffrey Altman <jaltman@auristor.com>
+Signed-off-by: David Howells <dhowells@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/afs/dir.c | 9 +++++++--
+ 1 file changed, 7 insertions(+), 2 deletions(-)
+
+diff --git a/fs/afs/dir.c b/fs/afs/dir.c
+index d1e1caa23c8b3..3c486340b2208 100644
+--- a/fs/afs/dir.c
++++ b/fs/afs/dir.c
+@@ -658,7 +658,8 @@ static struct inode *afs_do_lookup(struct inode *dir, struct dentry *dentry,
+       cookie->ctx.actor = afs_lookup_filldir;
+       cookie->name = dentry->d_name;
+-      cookie->nr_fids = 1; /* slot 0 is saved for the fid we actually want */
++      cookie->nr_fids = 2; /* slot 0 is saved for the fid we actually want
++                            * and slot 1 for the directory */
+       read_seqlock_excl(&dvnode->cb_lock);
+       dcbi = rcu_dereference_protected(dvnode->cb_interest,
+@@ -709,7 +710,11 @@ static struct inode *afs_do_lookup(struct inode *dir, struct dentry *dentry,
+       if (!cookie->inodes)
+               goto out_s;
+-      for (i = 1; i < cookie->nr_fids; i++) {
++      cookie->fids[1] = dvnode->fid;
++      cookie->statuses[1].cb_break = afs_calc_vnode_cb_break(dvnode);
++      cookie->inodes[1] = igrab(&dvnode->vfs_inode);
++
++      for (i = 2; i < cookie->nr_fids; i++) {
+               scb = &cookie->statuses[i];
+               /* Find any inodes that already exist and get their
+-- 
+2.25.1
+
diff --git a/queue-5.7/afs-fix-eof-corruption.patch b/queue-5.7/afs-fix-eof-corruption.patch
new file mode 100644 (file)
index 0000000..c6016e1
--- /dev/null
@@ -0,0 +1,103 @@
+From 6d4275c9c5a2729be2b1f62708c62dc95cf516fd Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 13 Jun 2020 00:03:48 +0100
+Subject: afs: Fix EOF corruption
+
+From: David Howells <dhowells@redhat.com>
+
+[ Upstream commit 3f4aa981816368fe6b1d13c2bfbe76df9687e787 ]
+
+When doing a partial writeback, afs_write_back_from_locked_page() may
+generate an FS.StoreData RPC request that writes out part of a file when a
+file has been constructed from pieces by doing seek, write, seek, write,
+... as is done by ld.
+
+The FS.StoreData RPC is given the current i_size as the file length, but
+the server basically ignores it unless the data length is 0 (in which case
+it's just a truncate operation).  The revised file length returned in the
+result of the RPC may then not reflect what we suggested - and this leads
+to i_size getting moved backwards - which causes issues later.
+
+Fix the client to take account of this by ignoring the returned file size
+unless the data version number jumped unexpectedly - in which case we're
+going to have to clear the pagecache and reload anyway.
+
+This can be observed when doing a kernel build on an AFS mount.  The
+following pair of commands produce the issue:
+
+  ld -m elf_x86_64 -z max-page-size=0x200000 --emit-relocs \
+      -T arch/x86/realmode/rm/realmode.lds \
+      arch/x86/realmode/rm/header.o \
+      arch/x86/realmode/rm/trampoline_64.o \
+      arch/x86/realmode/rm/stack.o \
+      arch/x86/realmode/rm/reboot.o \
+      -o arch/x86/realmode/rm/realmode.elf
+  arch/x86/tools/relocs --realmode \
+      arch/x86/realmode/rm/realmode.elf \
+      >arch/x86/realmode/rm/realmode.relocs
+
+This results in the latter giving:
+
+       Cannot read ELF section headers 0/18: Success
+
+as the realmode.elf file got corrupted.
+
+The sequence of events can also be driven with:
+
+       xfs_io -t -f \
+               -c "pwrite -S 0x58 0 0x58" \
+               -c "pwrite -S 0x59 10000 1000" \
+               -c "close" \
+               /afs/example.com/scratch/a
+
+Fixes: 31143d5d515e ("AFS: implement basic file write support")
+Signed-off-by: David Howells <dhowells@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/afs/inode.c | 12 +++++++++++-
+ 1 file changed, 11 insertions(+), 1 deletion(-)
+
+diff --git a/fs/afs/inode.c b/fs/afs/inode.c
+index 281470fe1183c..a239884549c5b 100644
+--- a/fs/afs/inode.c
++++ b/fs/afs/inode.c
+@@ -170,6 +170,7 @@ static void afs_apply_status(struct afs_fs_cursor *fc,
+       struct timespec64 t;
+       umode_t mode;
+       bool data_changed = false;
++      bool change_size = false;
+       BUG_ON(test_bit(AFS_VNODE_UNSET, &vnode->flags));
+@@ -225,6 +226,7 @@ static void afs_apply_status(struct afs_fs_cursor *fc,
+               } else {
+                       set_bit(AFS_VNODE_ZAP_DATA, &vnode->flags);
+               }
++              change_size = true;
+       } else if (vnode->status.type == AFS_FTYPE_DIR) {
+               /* Expected directory change is handled elsewhere so
+                * that we can locally edit the directory and save on a
+@@ -232,11 +234,19 @@ static void afs_apply_status(struct afs_fs_cursor *fc,
+                */
+               if (test_bit(AFS_VNODE_DIR_VALID, &vnode->flags))
+                       data_changed = false;
++              change_size = true;
+       }
+       if (data_changed) {
+               inode_set_iversion_raw(&vnode->vfs_inode, status->data_version);
+-              afs_set_i_size(vnode, status->size);
++
++              /* Only update the size if the data version jumped.  If the
++               * file is being modified locally, then we might have our own
++               * idea of what the size should be that's not the same as
++               * what's on the server.
++               */
++              if (change_size)
++                      afs_set_i_size(vnode, status->size);
+       }
+ }
+-- 
+2.25.1
+
diff --git a/queue-5.7/afs-fix-memory-leak-in-afs_put_sysnames.patch b/queue-5.7/afs-fix-memory-leak-in-afs_put_sysnames.patch
new file mode 100644 (file)
index 0000000..faacf26
--- /dev/null
@@ -0,0 +1,36 @@
+From d043413beac64e339a2a14e090c8c0d9b8837c32 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 2 Jun 2020 09:30:45 +0800
+Subject: afs: Fix memory leak in afs_put_sysnames()
+
+From: Zhihao Cheng <chengzhihao1@huawei.com>
+
+[ Upstream commit 2ca068be09bf8e285036603823696140026dcbe7 ]
+
+Fix afs_put_sysnames() to actually free the specified afs_sysnames
+object after its reference count has been decreased to zero and
+its contents have been released.
+
+Fixes: 6f8880d8e681557 ("afs: Implement @sys substitution handling")
+Signed-off-by: Zhihao Cheng <chengzhihao1@huawei.com>
+Signed-off-by: David Howells <dhowells@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/afs/proc.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/fs/afs/proc.c b/fs/afs/proc.c
+index 468e1713bce13..6f34c84a0fd0a 100644
+--- a/fs/afs/proc.c
++++ b/fs/afs/proc.c
+@@ -563,6 +563,7 @@ void afs_put_sysnames(struct afs_sysnames *sysnames)
+                       if (sysnames->subs[i] != afs_init_sysname &&
+                           sysnames->subs[i] != sysnames->blank)
+                               kfree(sysnames->subs[i]);
++              kfree(sysnames);
+       }
+ }
+-- 
+2.25.1
+
diff --git a/queue-5.7/afs-fix-non-setting-of-mtime-when-writing-into-mmap.patch b/queue-5.7/afs-fix-non-setting-of-mtime-when-writing-into-mmap.patch
new file mode 100644 (file)
index 0000000..334618c
--- /dev/null
@@ -0,0 +1,39 @@
+From 41781e01fd0cf1f3f3ea1108e45408d4721bd9af Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 12 Jun 2020 00:15:13 +0100
+Subject: afs: Fix non-setting of mtime when writing into mmap
+
+From: David Howells <dhowells@redhat.com>
+
+[ Upstream commit bb413489288e4e457353bac513fddb6330d245ca ]
+
+The mtime on an inode needs to be updated when a write is made into an
+mmap'ed section.  There are three ways in which this could be done: update
+it when page_mkwrite is called, update it when a page is changed from dirty
+to writeback or leave it to the server and fix the mtime up from the reply
+to the StoreData RPC.
+
+Found with the generic/215 xfstest.
+
+Fixes: 1cf7a1518aef ("afs: Implement shared-writeable mmap")
+Signed-off-by: David Howells <dhowells@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/afs/write.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/fs/afs/write.c b/fs/afs/write.c
+index cb76566763dba..371db86c6c5ec 100644
+--- a/fs/afs/write.c
++++ b/fs/afs/write.c
+@@ -811,6 +811,7 @@ vm_fault_t afs_page_mkwrite(struct vm_fault *vmf)
+                            vmf->page->index, priv);
+       SetPagePrivate(vmf->page);
+       set_page_private(vmf->page, priv);
++      file_update_time(file);
+       sb_end_pagefault(inode->i_sb);
+       return VM_FAULT_LOCKED;
+-- 
+2.25.1
+
diff --git a/queue-5.7/afs-fix-the-mapping-of-the-uaeoverflow-abort-code.patch b/queue-5.7/afs-fix-the-mapping-of-the-uaeoverflow-abort-code.patch
new file mode 100644 (file)
index 0000000..7117560
--- /dev/null
@@ -0,0 +1,39 @@
+From a22f01783648a30fa1b6ba1e08e7e88dcc966172 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 14 Jun 2020 22:12:05 +0100
+Subject: afs: Fix the mapping of the UAEOVERFLOW abort code
+
+From: David Howells <dhowells@redhat.com>
+
+[ Upstream commit 4ec89596d06bd481ba827f3b409b938d63914157 ]
+
+Abort code UAEOVERFLOW is returned when we try and set a time that's out of
+range, but it's currently mapped to EREMOTEIO by the default case.
+
+Fix UAEOVERFLOW to map instead to EOVERFLOW.
+
+Found with the generic/258 xfstest.  Note that the test is wrong as it
+assumes that the filesystem will support a pre-UNIX-epoch date.
+
+Fixes: 1eda8bab70ca ("afs: Add support for the UAE error table")
+Signed-off-by: David Howells <dhowells@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/afs/misc.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/fs/afs/misc.c b/fs/afs/misc.c
+index 52b19e9c15351..5334f1bd2bca7 100644
+--- a/fs/afs/misc.c
++++ b/fs/afs/misc.c
+@@ -83,6 +83,7 @@ int afs_abort_to_error(u32 abort_code)
+       case UAENOLCK:                  return -ENOLCK;
+       case UAENOTEMPTY:               return -ENOTEMPTY;
+       case UAELOOP:                   return -ELOOP;
++      case UAEOVERFLOW:               return -EOVERFLOW;
+       case UAENOMEDIUM:               return -ENOMEDIUM;
+       case UAEDQUOT:                  return -EDQUOT;
+-- 
+2.25.1
+
diff --git a/queue-5.7/afs-remove-the-error-argument-from-afs_protocol_erro.patch b/queue-5.7/afs-remove-the-error-argument-from-afs_protocol_erro.patch
new file mode 100644 (file)
index 0000000..7a83a3a
--- /dev/null
@@ -0,0 +1,371 @@
+From 0d8e069e2a17280e466d49018d055fc473ac34a3 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 8 Apr 2020 16:49:08 +0100
+Subject: afs: Remove the error argument from afs_protocol_error()
+
+From: David Howells <dhowells@redhat.com>
+
+[ Upstream commit 7126ead910aa9fcc9e16e9e7a8c9179658261f1d ]
+
+Remove the error argument from afs_protocol_error() as it's always
+-EBADMSG.
+
+Signed-off-by: David Howells <dhowells@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/afs/cmservice.c         |  9 +++------
+ fs/afs/fsclient.c          | 17 ++++++-----------
+ fs/afs/inode.c             |  4 ++--
+ fs/afs/internal.h          |  2 +-
+ fs/afs/rxrpc.c             |  6 +++---
+ fs/afs/vlclient.c          | 34 ++++++++++++++--------------------
+ fs/afs/yfsclient.c         | 17 ++++++-----------
+ include/trace/events/afs.h | 10 ++++------
+ 8 files changed, 39 insertions(+), 60 deletions(-)
+
+diff --git a/fs/afs/cmservice.c b/fs/afs/cmservice.c
+index 380ad5ace7cfd..3a9b8b1f5f2b0 100644
+--- a/fs/afs/cmservice.c
++++ b/fs/afs/cmservice.c
+@@ -305,8 +305,7 @@ static int afs_deliver_cb_callback(struct afs_call *call)
+               call->count = ntohl(call->tmp);
+               _debug("FID count: %u", call->count);
+               if (call->count > AFSCBMAX)
+-                      return afs_protocol_error(call, -EBADMSG,
+-                                                afs_eproto_cb_fid_count);
++                      return afs_protocol_error(call, afs_eproto_cb_fid_count);
+               call->buffer = kmalloc(array3_size(call->count, 3, 4),
+                                      GFP_KERNEL);
+@@ -351,8 +350,7 @@ static int afs_deliver_cb_callback(struct afs_call *call)
+               call->count2 = ntohl(call->tmp);
+               _debug("CB count: %u", call->count2);
+               if (call->count2 != call->count && call->count2 != 0)
+-                      return afs_protocol_error(call, -EBADMSG,
+-                                                afs_eproto_cb_count);
++                      return afs_protocol_error(call, afs_eproto_cb_count);
+               call->iter = &call->def_iter;
+               iov_iter_discard(&call->def_iter, READ, call->count2 * 3 * 4);
+               call->unmarshall++;
+@@ -672,8 +670,7 @@ static int afs_deliver_yfs_cb_callback(struct afs_call *call)
+               call->count = ntohl(call->tmp);
+               _debug("FID count: %u", call->count);
+               if (call->count > YFSCBMAX)
+-                      return afs_protocol_error(call, -EBADMSG,
+-                                                afs_eproto_cb_fid_count);
++                      return afs_protocol_error(call, afs_eproto_cb_fid_count);
+               size = array_size(call->count, sizeof(struct yfs_xdr_YFSFid));
+               call->buffer = kmalloc(size, GFP_KERNEL);
+diff --git a/fs/afs/fsclient.c b/fs/afs/fsclient.c
+index 585b678a6f705..7bca0c13d0c46 100644
+--- a/fs/afs/fsclient.c
++++ b/fs/afs/fsclient.c
+@@ -130,7 +130,7 @@ advance:
+ bad:
+       xdr_dump_bad(*_bp);
+-      afs_protocol_error(call, -EBADMSG, afs_eproto_bad_status);
++      afs_protocol_error(call, afs_eproto_bad_status);
+       goto advance;
+ }
+@@ -1470,8 +1470,7 @@ static int afs_deliver_fs_get_volume_status(struct afs_call *call)
+               call->count = ntohl(call->tmp);
+               _debug("volname length: %u", call->count);
+               if (call->count >= AFSNAMEMAX)
+-                      return afs_protocol_error(call, -EBADMSG,
+-                                                afs_eproto_volname_len);
++                      return afs_protocol_error(call, afs_eproto_volname_len);
+               size = (call->count + 3) & ~3; /* It's padded */
+               afs_extract_to_buf(call, size);
+               call->unmarshall++;
+@@ -1500,8 +1499,7 @@ static int afs_deliver_fs_get_volume_status(struct afs_call *call)
+               call->count = ntohl(call->tmp);
+               _debug("offline msg length: %u", call->count);
+               if (call->count >= AFSNAMEMAX)
+-                      return afs_protocol_error(call, -EBADMSG,
+-                                                afs_eproto_offline_msg_len);
++                      return afs_protocol_error(call, afs_eproto_offline_msg_len);
+               size = (call->count + 3) & ~3; /* It's padded */
+               afs_extract_to_buf(call, size);
+               call->unmarshall++;
+@@ -1531,8 +1529,7 @@ static int afs_deliver_fs_get_volume_status(struct afs_call *call)
+               call->count = ntohl(call->tmp);
+               _debug("motd length: %u", call->count);
+               if (call->count >= AFSNAMEMAX)
+-                      return afs_protocol_error(call, -EBADMSG,
+-                                                afs_eproto_motd_len);
++                      return afs_protocol_error(call, afs_eproto_motd_len);
+               size = (call->count + 3) & ~3; /* It's padded */
+               afs_extract_to_buf(call, size);
+               call->unmarshall++;
+@@ -2014,8 +2011,7 @@ static int afs_deliver_fs_inline_bulk_status(struct afs_call *call)
+               tmp = ntohl(call->tmp);
+               _debug("status count: %u/%u", tmp, call->count2);
+               if (tmp != call->count2)
+-                      return afs_protocol_error(call, -EBADMSG,
+-                                                afs_eproto_ibulkst_count);
++                      return afs_protocol_error(call, afs_eproto_ibulkst_count);
+               call->count = 0;
+               call->unmarshall++;
+@@ -2051,8 +2047,7 @@ static int afs_deliver_fs_inline_bulk_status(struct afs_call *call)
+               tmp = ntohl(call->tmp);
+               _debug("CB count: %u", tmp);
+               if (tmp != call->count2)
+-                      return afs_protocol_error(call, -EBADMSG,
+-                                                afs_eproto_ibulkst_cb_count);
++                      return afs_protocol_error(call, afs_eproto_ibulkst_cb_count);
+               call->count = 0;
+               call->unmarshall++;
+       more_cbs:
+diff --git a/fs/afs/inode.c b/fs/afs/inode.c
+index a239884549c5b..d7b65fad66796 100644
+--- a/fs/afs/inode.c
++++ b/fs/afs/inode.c
+@@ -130,7 +130,7 @@ static int afs_inode_init_from_status(struct afs_vnode *vnode, struct key *key,
+       default:
+               dump_vnode(vnode, parent_vnode);
+               write_sequnlock(&vnode->cb_lock);
+-              return afs_protocol_error(NULL, -EBADMSG, afs_eproto_file_type);
++              return afs_protocol_error(NULL, afs_eproto_file_type);
+       }
+       afs_set_i_size(vnode, status->size);
+@@ -180,7 +180,7 @@ static void afs_apply_status(struct afs_fs_cursor *fc,
+                       vnode->fid.vnode,
+                       vnode->fid.unique,
+                       status->type, vnode->status.type);
+-              afs_protocol_error(NULL, -EBADMSG, afs_eproto_bad_status);
++              afs_protocol_error(NULL, afs_eproto_bad_status);
+               return;
+       }
+diff --git a/fs/afs/internal.h b/fs/afs/internal.h
+index 017d392c17940..98e0cebd5e5e9 100644
+--- a/fs/afs/internal.h
++++ b/fs/afs/internal.h
+@@ -1129,7 +1129,7 @@ extern void afs_flat_call_destructor(struct afs_call *);
+ extern void afs_send_empty_reply(struct afs_call *);
+ extern void afs_send_simple_reply(struct afs_call *, const void *, size_t);
+ extern int afs_extract_data(struct afs_call *, bool);
+-extern int afs_protocol_error(struct afs_call *, int, enum afs_eproto_cause);
++extern int afs_protocol_error(struct afs_call *, enum afs_eproto_cause);
+ static inline void afs_set_fc_call(struct afs_call *call, struct afs_fs_cursor *fc)
+ {
+diff --git a/fs/afs/rxrpc.c b/fs/afs/rxrpc.c
+index 26f20cdd1a98e..e3c2655616dc7 100644
+--- a/fs/afs/rxrpc.c
++++ b/fs/afs/rxrpc.c
+@@ -961,11 +961,11 @@ int afs_extract_data(struct afs_call *call, bool want_more)
+ /*
+  * Log protocol error production.
+  */
+-noinline int afs_protocol_error(struct afs_call *call, int error,
++noinline int afs_protocol_error(struct afs_call *call,
+                               enum afs_eproto_cause cause)
+ {
+-      trace_afs_protocol_error(call, error, cause);
++      trace_afs_protocol_error(call, cause);
+       if (call)
+               call->unmarshalling_error = true;
+-      return error;
++      return -EBADMSG;
+ }
+diff --git a/fs/afs/vlclient.c b/fs/afs/vlclient.c
+index 516e9a3bb5b43..e64b002c3bb3a 100644
+--- a/fs/afs/vlclient.c
++++ b/fs/afs/vlclient.c
+@@ -447,8 +447,7 @@ static int afs_deliver_yfsvl_get_endpoints(struct afs_call *call)
+               call->count2    = ntohl(*bp); /* Type or next count */
+               if (call->count > YFS_MAXENDPOINTS)
+-                      return afs_protocol_error(call, -EBADMSG,
+-                                                afs_eproto_yvl_fsendpt_num);
++                      return afs_protocol_error(call, afs_eproto_yvl_fsendpt_num);
+               alist = afs_alloc_addrlist(call->count, FS_SERVICE, AFS_FS_PORT);
+               if (!alist)
+@@ -468,8 +467,7 @@ static int afs_deliver_yfsvl_get_endpoints(struct afs_call *call)
+                       size = sizeof(__be32) * (1 + 4 + 1);
+                       break;
+               default:
+-                      return afs_protocol_error(call, -EBADMSG,
+-                                                afs_eproto_yvl_fsendpt_type);
++                      return afs_protocol_error(call, afs_eproto_yvl_fsendpt_type);
+               }
+               size += sizeof(__be32);
+@@ -487,21 +485,20 @@ static int afs_deliver_yfsvl_get_endpoints(struct afs_call *call)
+               switch (call->count2) {
+               case YFS_ENDPOINT_IPV4:
+                       if (ntohl(bp[0]) != sizeof(__be32) * 2)
+-                              return afs_protocol_error(call, -EBADMSG,
+-                                                        afs_eproto_yvl_fsendpt4_len);
++                              return afs_protocol_error(
++                                      call, afs_eproto_yvl_fsendpt4_len);
+                       afs_merge_fs_addr4(alist, bp[1], ntohl(bp[2]));
+                       bp += 3;
+                       break;
+               case YFS_ENDPOINT_IPV6:
+                       if (ntohl(bp[0]) != sizeof(__be32) * 5)
+-                              return afs_protocol_error(call, -EBADMSG,
+-                                                        afs_eproto_yvl_fsendpt6_len);
++                              return afs_protocol_error(
++                                      call, afs_eproto_yvl_fsendpt6_len);
+                       afs_merge_fs_addr6(alist, bp + 1, ntohl(bp[5]));
+                       bp += 6;
+                       break;
+               default:
+-                      return afs_protocol_error(call, -EBADMSG,
+-                                                afs_eproto_yvl_fsendpt_type);
++                      return afs_protocol_error(call, afs_eproto_yvl_fsendpt_type);
+               }
+               /* Got either the type of the next entry or the count of
+@@ -519,8 +516,7 @@ static int afs_deliver_yfsvl_get_endpoints(struct afs_call *call)
+               if (!call->count)
+                       goto end;
+               if (call->count > YFS_MAXENDPOINTS)
+-                      return afs_protocol_error(call, -EBADMSG,
+-                                                afs_eproto_yvl_vlendpt_type);
++                      return afs_protocol_error(call, afs_eproto_yvl_vlendpt_type);
+               afs_extract_to_buf(call, 1 * sizeof(__be32));
+               call->unmarshall = 3;
+@@ -547,8 +543,7 @@ static int afs_deliver_yfsvl_get_endpoints(struct afs_call *call)
+                       size = sizeof(__be32) * (1 + 4 + 1);
+                       break;
+               default:
+-                      return afs_protocol_error(call, -EBADMSG,
+-                                                afs_eproto_yvl_vlendpt_type);
++                      return afs_protocol_error(call, afs_eproto_yvl_vlendpt_type);
+               }
+               if (call->count > 1)
+@@ -566,19 +561,18 @@ static int afs_deliver_yfsvl_get_endpoints(struct afs_call *call)
+               switch (call->count2) {
+               case YFS_ENDPOINT_IPV4:
+                       if (ntohl(bp[0]) != sizeof(__be32) * 2)
+-                              return afs_protocol_error(call, -EBADMSG,
+-                                                        afs_eproto_yvl_vlendpt4_len);
++                              return afs_protocol_error(
++                                      call, afs_eproto_yvl_vlendpt4_len);
+                       bp += 3;
+                       break;
+               case YFS_ENDPOINT_IPV6:
+                       if (ntohl(bp[0]) != sizeof(__be32) * 5)
+-                              return afs_protocol_error(call, -EBADMSG,
+-                                                        afs_eproto_yvl_vlendpt6_len);
++                              return afs_protocol_error(
++                                      call, afs_eproto_yvl_vlendpt6_len);
+                       bp += 6;
+                       break;
+               default:
+-                      return afs_protocol_error(call, -EBADMSG,
+-                                                afs_eproto_yvl_vlendpt_type);
++                      return afs_protocol_error(call, afs_eproto_yvl_vlendpt_type);
+               }
+               /* Got either the type of the next entry or the count of
+diff --git a/fs/afs/yfsclient.c b/fs/afs/yfsclient.c
+index f118daa5f33a4..bf74c679c02bc 100644
+--- a/fs/afs/yfsclient.c
++++ b/fs/afs/yfsclient.c
+@@ -226,7 +226,7 @@ advance:
+ bad:
+       xdr_dump_bad(*_bp);
+-      afs_protocol_error(call, -EBADMSG, afs_eproto_bad_status);
++      afs_protocol_error(call, afs_eproto_bad_status);
+       goto advance;
+ }
+@@ -1426,8 +1426,7 @@ static int yfs_deliver_fs_get_volume_status(struct afs_call *call)
+               call->count = ntohl(call->tmp);
+               _debug("volname length: %u", call->count);
+               if (call->count >= AFSNAMEMAX)
+-                      return afs_protocol_error(call, -EBADMSG,
+-                                                afs_eproto_volname_len);
++                      return afs_protocol_error(call, afs_eproto_volname_len);
+               size = (call->count + 3) & ~3; /* It's padded */
+               afs_extract_to_buf(call, size);
+               call->unmarshall++;
+@@ -1456,8 +1455,7 @@ static int yfs_deliver_fs_get_volume_status(struct afs_call *call)
+               call->count = ntohl(call->tmp);
+               _debug("offline msg length: %u", call->count);
+               if (call->count >= AFSNAMEMAX)
+-                      return afs_protocol_error(call, -EBADMSG,
+-                                                afs_eproto_offline_msg_len);
++                      return afs_protocol_error(call, afs_eproto_offline_msg_len);
+               size = (call->count + 3) & ~3; /* It's padded */
+               afs_extract_to_buf(call, size);
+               call->unmarshall++;
+@@ -1487,8 +1485,7 @@ static int yfs_deliver_fs_get_volume_status(struct afs_call *call)
+               call->count = ntohl(call->tmp);
+               _debug("motd length: %u", call->count);
+               if (call->count >= AFSNAMEMAX)
+-                      return afs_protocol_error(call, -EBADMSG,
+-                                                afs_eproto_motd_len);
++                      return afs_protocol_error(call, afs_eproto_motd_len);
+               size = (call->count + 3) & ~3; /* It's padded */
+               afs_extract_to_buf(call, size);
+               call->unmarshall++;
+@@ -1797,8 +1794,7 @@ static int yfs_deliver_fs_inline_bulk_status(struct afs_call *call)
+               tmp = ntohl(call->tmp);
+               _debug("status count: %u/%u", tmp, call->count2);
+               if (tmp != call->count2)
+-                      return afs_protocol_error(call, -EBADMSG,
+-                                                afs_eproto_ibulkst_count);
++                      return afs_protocol_error(call, afs_eproto_ibulkst_count);
+               call->count = 0;
+               call->unmarshall++;
+@@ -1835,8 +1831,7 @@ static int yfs_deliver_fs_inline_bulk_status(struct afs_call *call)
+               tmp = ntohl(call->tmp);
+               _debug("CB count: %u", tmp);
+               if (tmp != call->count2)
+-                      return afs_protocol_error(call, -EBADMSG,
+-                                                afs_eproto_ibulkst_cb_count);
++                      return afs_protocol_error(call, afs_eproto_ibulkst_cb_count);
+               call->count = 0;
+               call->unmarshall++;
+       more_cbs:
+diff --git a/include/trace/events/afs.h b/include/trace/events/afs.h
+index c612cabbc378f..93eddd32bd741 100644
+--- a/include/trace/events/afs.h
++++ b/include/trace/events/afs.h
+@@ -988,24 +988,22 @@ TRACE_EVENT(afs_edit_dir,
+           );
+ TRACE_EVENT(afs_protocol_error,
+-          TP_PROTO(struct afs_call *call, int error, enum afs_eproto_cause cause),
++          TP_PROTO(struct afs_call *call, enum afs_eproto_cause cause),
+-          TP_ARGS(call, error, cause),
++          TP_ARGS(call, cause),
+           TP_STRUCT__entry(
+                   __field(unsigned int,               call            )
+-                  __field(int,                        error           )
+                   __field(enum afs_eproto_cause,      cause           )
+                            ),
+           TP_fast_assign(
+                   __entry->call = call ? call->debug_id : 0;
+-                  __entry->error = error;
+                   __entry->cause = cause;
+                          ),
+-          TP_printk("c=%08x r=%d %s",
+-                    __entry->call, __entry->error,
++          TP_printk("c=%08x %s",
++                    __entry->call,
+                     __print_symbolic(__entry->cause, afs_eproto_causes))
+           );
+-- 
+2.25.1
+
diff --git a/queue-5.7/afs-set-error-flag-rather-than-return-error-from-fil.patch b/queue-5.7/afs-set-error-flag-rather-than-return-error-from-fil.patch
new file mode 100644 (file)
index 0000000..1c76c9b
--- /dev/null
@@ -0,0 +1,479 @@
+From 930d7cd870d9374d5da350db0e98ff7163e82faf Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 8 Apr 2020 16:13:20 +0100
+Subject: afs: Set error flag rather than return error from file status decode
+
+From: David Howells <dhowells@redhat.com>
+
+[ Upstream commit 38355eec6a7d2b8f2f313f9174736dc877744e59 ]
+
+Set a flag in the call struct to indicate an unmarshalling error rather
+than return and handle an error from the decoding of file statuses.  This
+flag is checked on a successful return from the delivery function.
+
+Signed-off-by: David Howells <dhowells@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/afs/fsclient.c  | 88 +++++++++++++---------------------------------
+ fs/afs/internal.h  |  1 +
+ fs/afs/rxrpc.c     |  4 +++
+ fs/afs/yfsclient.c | 85 +++++++++++++-------------------------------
+ 4 files changed, 55 insertions(+), 123 deletions(-)
+
+diff --git a/fs/afs/fsclient.c b/fs/afs/fsclient.c
+index d2b3798c1932f..585b678a6f705 100644
+--- a/fs/afs/fsclient.c
++++ b/fs/afs/fsclient.c
+@@ -56,16 +56,15 @@ static void xdr_dump_bad(const __be32 *bp)
+ /*
+  * decode an AFSFetchStatus block
+  */
+-static int xdr_decode_AFSFetchStatus(const __be32 **_bp,
+-                                   struct afs_call *call,
+-                                   struct afs_status_cb *scb)
++static void xdr_decode_AFSFetchStatus(const __be32 **_bp,
++                                    struct afs_call *call,
++                                    struct afs_status_cb *scb)
+ {
+       const struct afs_xdr_AFSFetchStatus *xdr = (const void *)*_bp;
+       struct afs_file_status *status = &scb->status;
+       bool inline_error = (call->operation_ID == afs_FS_InlineBulkStatus);
+       u64 data_version, size;
+       u32 type, abort_code;
+-      int ret;
+       abort_code = ntohl(xdr->abort_code);
+@@ -79,7 +78,7 @@ static int xdr_decode_AFSFetchStatus(const __be32 **_bp,
+                        */
+                       status->abort_code = abort_code;
+                       scb->have_error = true;
+-                      goto good;
++                      goto advance;
+               }
+               pr_warn("Unknown AFSFetchStatus version %u\n", ntohl(xdr->if_version));
+@@ -89,7 +88,7 @@ static int xdr_decode_AFSFetchStatus(const __be32 **_bp,
+       if (abort_code != 0 && inline_error) {
+               status->abort_code = abort_code;
+               scb->have_error = true;
+-              goto good;
++              goto advance;
+       }
+       type = ntohl(xdr->type);
+@@ -125,15 +124,13 @@ static int xdr_decode_AFSFetchStatus(const __be32 **_bp,
+       data_version |= (u64)ntohl(xdr->data_version_hi) << 32;
+       status->data_version = data_version;
+       scb->have_status = true;
+-good:
+-      ret = 0;
+ advance:
+       *_bp = (const void *)*_bp + sizeof(*xdr);
+-      return ret;
++      return;
+ bad:
+       xdr_dump_bad(*_bp);
+-      ret = afs_protocol_error(call, -EBADMSG, afs_eproto_bad_status);
++      afs_protocol_error(call, -EBADMSG, afs_eproto_bad_status);
+       goto advance;
+ }
+@@ -254,9 +251,7 @@ static int afs_deliver_fs_fetch_status_vnode(struct afs_call *call)
+       /* unmarshall the reply once we've received all of it */
+       bp = call->buffer;
+-      ret = xdr_decode_AFSFetchStatus(&bp, call, call->out_scb);
+-      if (ret < 0)
+-              return ret;
++      xdr_decode_AFSFetchStatus(&bp, call, call->out_scb);
+       xdr_decode_AFSCallBack(&bp, call, call->out_scb);
+       xdr_decode_AFSVolSync(&bp, call->out_volsync);
+@@ -419,9 +414,7 @@ static int afs_deliver_fs_fetch_data(struct afs_call *call)
+                       return ret;
+               bp = call->buffer;
+-              ret = xdr_decode_AFSFetchStatus(&bp, call, call->out_scb);
+-              if (ret < 0)
+-                      return ret;
++              xdr_decode_AFSFetchStatus(&bp, call, call->out_scb);
+               xdr_decode_AFSCallBack(&bp, call, call->out_scb);
+               xdr_decode_AFSVolSync(&bp, call->out_volsync);
+@@ -577,12 +570,8 @@ static int afs_deliver_fs_create_vnode(struct afs_call *call)
+       /* unmarshall the reply once we've received all of it */
+       bp = call->buffer;
+       xdr_decode_AFSFid(&bp, call->out_fid);
+-      ret = xdr_decode_AFSFetchStatus(&bp, call, call->out_scb);
+-      if (ret < 0)
+-              return ret;
+-      ret = xdr_decode_AFSFetchStatus(&bp, call, call->out_dir_scb);
+-      if (ret < 0)
+-              return ret;
++      xdr_decode_AFSFetchStatus(&bp, call, call->out_scb);
++      xdr_decode_AFSFetchStatus(&bp, call, call->out_dir_scb);
+       xdr_decode_AFSCallBack(&bp, call, call->out_scb);
+       xdr_decode_AFSVolSync(&bp, call->out_volsync);
+@@ -691,9 +680,7 @@ static int afs_deliver_fs_dir_status_and_vol(struct afs_call *call)
+       /* unmarshall the reply once we've received all of it */
+       bp = call->buffer;
+-      ret = xdr_decode_AFSFetchStatus(&bp, call, call->out_dir_scb);
+-      if (ret < 0)
+-              return ret;
++      xdr_decode_AFSFetchStatus(&bp, call, call->out_dir_scb);
+       xdr_decode_AFSVolSync(&bp, call->out_volsync);
+       _leave(" = 0 [done]");
+@@ -784,12 +771,8 @@ static int afs_deliver_fs_link(struct afs_call *call)
+       /* unmarshall the reply once we've received all of it */
+       bp = call->buffer;
+-      ret = xdr_decode_AFSFetchStatus(&bp, call, call->out_scb);
+-      if (ret < 0)
+-              return ret;
+-      ret = xdr_decode_AFSFetchStatus(&bp, call, call->out_dir_scb);
+-      if (ret < 0)
+-              return ret;
++      xdr_decode_AFSFetchStatus(&bp, call, call->out_scb);
++      xdr_decode_AFSFetchStatus(&bp, call, call->out_dir_scb);
+       xdr_decode_AFSVolSync(&bp, call->out_volsync);
+       _leave(" = 0 [done]");
+@@ -878,12 +861,8 @@ static int afs_deliver_fs_symlink(struct afs_call *call)
+       /* unmarshall the reply once we've received all of it */
+       bp = call->buffer;
+       xdr_decode_AFSFid(&bp, call->out_fid);
+-      ret = xdr_decode_AFSFetchStatus(&bp, call, call->out_scb);
+-      if (ret < 0)
+-              return ret;
+-      ret = xdr_decode_AFSFetchStatus(&bp, call, call->out_dir_scb);
+-      if (ret < 0)
+-              return ret;
++      xdr_decode_AFSFetchStatus(&bp, call, call->out_scb);
++      xdr_decode_AFSFetchStatus(&bp, call, call->out_dir_scb);
+       xdr_decode_AFSVolSync(&bp, call->out_volsync);
+       _leave(" = 0 [done]");
+@@ -986,16 +965,12 @@ static int afs_deliver_fs_rename(struct afs_call *call)
+       if (ret < 0)
+               return ret;
++      bp = call->buffer;
+       /* If the two dirs are the same, we have two copies of the same status
+        * report, so we just decode it twice.
+        */
+-      bp = call->buffer;
+-      ret = xdr_decode_AFSFetchStatus(&bp, call, call->out_dir_scb);
+-      if (ret < 0)
+-              return ret;
+-      ret = xdr_decode_AFSFetchStatus(&bp, call, call->out_scb);
+-      if (ret < 0)
+-              return ret;
++      xdr_decode_AFSFetchStatus(&bp, call, call->out_dir_scb);
++      xdr_decode_AFSFetchStatus(&bp, call, call->out_scb);
+       xdr_decode_AFSVolSync(&bp, call->out_volsync);
+       _leave(" = 0 [done]");
+@@ -1103,9 +1078,7 @@ static int afs_deliver_fs_store_data(struct afs_call *call)
+       /* unmarshall the reply once we've received all of it */
+       bp = call->buffer;
+-      ret = xdr_decode_AFSFetchStatus(&bp, call, call->out_scb);
+-      if (ret < 0)
+-              return ret;
++      xdr_decode_AFSFetchStatus(&bp, call, call->out_scb);
+       xdr_decode_AFSVolSync(&bp, call->out_volsync);
+       _leave(" = 0 [done]");
+@@ -1283,9 +1256,7 @@ static int afs_deliver_fs_store_status(struct afs_call *call)
+       /* unmarshall the reply once we've received all of it */
+       bp = call->buffer;
+-      ret = xdr_decode_AFSFetchStatus(&bp, call, call->out_scb);
+-      if (ret < 0)
+-              return ret;
++      xdr_decode_AFSFetchStatus(&bp, call, call->out_scb);
+       xdr_decode_AFSVolSync(&bp, call->out_volsync);
+       _leave(" = 0 [done]");
+@@ -1954,9 +1925,7 @@ static int afs_deliver_fs_fetch_status(struct afs_call *call)
+       /* unmarshall the reply once we've received all of it */
+       bp = call->buffer;
+-      ret = xdr_decode_AFSFetchStatus(&bp, call, call->out_scb);
+-      if (ret < 0)
+-              return ret;
++      xdr_decode_AFSFetchStatus(&bp, call, call->out_scb);
+       xdr_decode_AFSCallBack(&bp, call, call->out_scb);
+       xdr_decode_AFSVolSync(&bp, call->out_volsync);
+@@ -2062,10 +2031,7 @@ static int afs_deliver_fs_inline_bulk_status(struct afs_call *call)
+               bp = call->buffer;
+               scb = &call->out_scb[call->count];
+-              ret = xdr_decode_AFSFetchStatus(&bp, call, scb);
+-              if (ret < 0)
+-                      return ret;
+-
++              xdr_decode_AFSFetchStatus(&bp, call, scb);
+               call->count++;
+               if (call->count < call->count2)
+                       goto more_counts;
+@@ -2243,9 +2209,7 @@ static int afs_deliver_fs_fetch_acl(struct afs_call *call)
+                       return ret;
+               bp = call->buffer;
+-              ret = xdr_decode_AFSFetchStatus(&bp, call, call->out_scb);
+-              if (ret < 0)
+-                      return ret;
++              xdr_decode_AFSFetchStatus(&bp, call, call->out_scb);
+               xdr_decode_AFSVolSync(&bp, call->out_volsync);
+               call->unmarshall++;
+@@ -2326,9 +2290,7 @@ static int afs_deliver_fs_file_status_and_vol(struct afs_call *call)
+               return ret;
+       bp = call->buffer;
+-      ret = xdr_decode_AFSFetchStatus(&bp, call, call->out_scb);
+-      if (ret < 0)
+-              return ret;
++      xdr_decode_AFSFetchStatus(&bp, call, call->out_scb);
+       xdr_decode_AFSVolSync(&bp, call->out_volsync);
+       _leave(" = 0 [done]");
+diff --git a/fs/afs/internal.h b/fs/afs/internal.h
+index 80255513e2307..017d392c17940 100644
+--- a/fs/afs/internal.h
++++ b/fs/afs/internal.h
+@@ -161,6 +161,7 @@ struct afs_call {
+       bool                    upgrade;        /* T to request service upgrade */
+       bool                    have_reply_time; /* T if have got reply_time */
+       bool                    intr;           /* T if interruptible */
++      bool                    unmarshalling_error; /* T if an unmarshalling error occurred */
+       u16                     service_id;     /* Actual service ID (after upgrade) */
+       unsigned int            debug_id;       /* Trace ID */
+       u32                     operation_ID;   /* operation ID for an incoming call */
+diff --git a/fs/afs/rxrpc.c b/fs/afs/rxrpc.c
+index 1ecc67da6c1a4..26f20cdd1a98e 100644
+--- a/fs/afs/rxrpc.c
++++ b/fs/afs/rxrpc.c
+@@ -540,6 +540,8 @@ static void afs_deliver_to_call(struct afs_call *call)
+               ret = call->type->deliver(call);
+               state = READ_ONCE(call->state);
++              if (ret == 0 && call->unmarshalling_error)
++                      ret = -EBADMSG;
+               switch (ret) {
+               case 0:
+                       afs_queue_call_work(call);
+@@ -963,5 +965,7 @@ noinline int afs_protocol_error(struct afs_call *call, int error,
+                               enum afs_eproto_cause cause)
+ {
+       trace_afs_protocol_error(call, error, cause);
++      if (call)
++              call->unmarshalling_error = true;
+       return error;
+ }
+diff --git a/fs/afs/yfsclient.c b/fs/afs/yfsclient.c
+index fe413e7a5cf42..f118daa5f33a4 100644
+--- a/fs/afs/yfsclient.c
++++ b/fs/afs/yfsclient.c
+@@ -179,21 +179,20 @@ static void xdr_dump_bad(const __be32 *bp)
+ /*
+  * Decode a YFSFetchStatus block
+  */
+-static int xdr_decode_YFSFetchStatus(const __be32 **_bp,
+-                                   struct afs_call *call,
+-                                   struct afs_status_cb *scb)
++static void xdr_decode_YFSFetchStatus(const __be32 **_bp,
++                                    struct afs_call *call,
++                                    struct afs_status_cb *scb)
+ {
+       const struct yfs_xdr_YFSFetchStatus *xdr = (const void *)*_bp;
+       struct afs_file_status *status = &scb->status;
+       u32 type;
+-      int ret;
+       status->abort_code = ntohl(xdr->abort_code);
+       if (status->abort_code != 0) {
+               if (status->abort_code == VNOVNODE)
+                       status->nlink = 0;
+               scb->have_error = true;
+-              goto good;
++              goto advance;
+       }
+       type = ntohl(xdr->type);
+@@ -221,15 +220,13 @@ static int xdr_decode_YFSFetchStatus(const __be32 **_bp,
+       status->size            = xdr_to_u64(xdr->size);
+       status->data_version    = xdr_to_u64(xdr->data_version);
+       scb->have_status        = true;
+-good:
+-      ret = 0;
+ advance:
+       *_bp += xdr_size(xdr);
+-      return ret;
++      return;
+ bad:
+       xdr_dump_bad(*_bp);
+-      ret = afs_protocol_error(call, -EBADMSG, afs_eproto_bad_status);
++      afs_protocol_error(call, -EBADMSG, afs_eproto_bad_status);
+       goto advance;
+ }
+@@ -348,9 +345,7 @@ static int yfs_deliver_fs_status_cb_and_volsync(struct afs_call *call)
+       /* unmarshall the reply once we've received all of it */
+       bp = call->buffer;
+-      ret = xdr_decode_YFSFetchStatus(&bp, call, call->out_scb);
+-      if (ret < 0)
+-              return ret;
++      xdr_decode_YFSFetchStatus(&bp, call, call->out_scb);
+       xdr_decode_YFSCallBack(&bp, call, call->out_scb);
+       xdr_decode_YFSVolSync(&bp, call->out_volsync);
+@@ -372,9 +367,7 @@ static int yfs_deliver_status_and_volsync(struct afs_call *call)
+               return ret;
+       bp = call->buffer;
+-      ret = xdr_decode_YFSFetchStatus(&bp, call, call->out_scb);
+-      if (ret < 0)
+-              return ret;
++      xdr_decode_YFSFetchStatus(&bp, call, call->out_scb);
+       xdr_decode_YFSVolSync(&bp, call->out_volsync);
+       _leave(" = 0 [done]");
+@@ -534,9 +527,7 @@ static int yfs_deliver_fs_fetch_data64(struct afs_call *call)
+                       return ret;
+               bp = call->buffer;
+-              ret = xdr_decode_YFSFetchStatus(&bp, call, call->out_scb);
+-              if (ret < 0)
+-                      return ret;
++              xdr_decode_YFSFetchStatus(&bp, call, call->out_scb);
+               xdr_decode_YFSCallBack(&bp, call, call->out_scb);
+               xdr_decode_YFSVolSync(&bp, call->out_volsync);
+@@ -644,12 +635,8 @@ static int yfs_deliver_fs_create_vnode(struct afs_call *call)
+       /* unmarshall the reply once we've received all of it */
+       bp = call->buffer;
+       xdr_decode_YFSFid(&bp, call->out_fid);
+-      ret = xdr_decode_YFSFetchStatus(&bp, call, call->out_scb);
+-      if (ret < 0)
+-              return ret;
+-      ret = xdr_decode_YFSFetchStatus(&bp, call, call->out_dir_scb);
+-      if (ret < 0)
+-              return ret;
++      xdr_decode_YFSFetchStatus(&bp, call, call->out_scb);
++      xdr_decode_YFSFetchStatus(&bp, call, call->out_dir_scb);
+       xdr_decode_YFSCallBack(&bp, call, call->out_scb);
+       xdr_decode_YFSVolSync(&bp, call->out_volsync);
+@@ -802,14 +789,9 @@ static int yfs_deliver_fs_remove_file2(struct afs_call *call)
+               return ret;
+       bp = call->buffer;
+-      ret = xdr_decode_YFSFetchStatus(&bp, call, call->out_dir_scb);
+-      if (ret < 0)
+-              return ret;
+-
++      xdr_decode_YFSFetchStatus(&bp, call, call->out_dir_scb);
+       xdr_decode_YFSFid(&bp, &fid);
+-      ret = xdr_decode_YFSFetchStatus(&bp, call, call->out_scb);
+-      if (ret < 0)
+-              return ret;
++      xdr_decode_YFSFetchStatus(&bp, call, call->out_scb);
+       /* Was deleted if vnode->status.abort_code == VNOVNODE. */
+       xdr_decode_YFSVolSync(&bp, call->out_volsync);
+@@ -889,10 +871,7 @@ static int yfs_deliver_fs_remove(struct afs_call *call)
+               return ret;
+       bp = call->buffer;
+-      ret = xdr_decode_YFSFetchStatus(&bp, call, call->out_dir_scb);
+-      if (ret < 0)
+-              return ret;
+-
++      xdr_decode_YFSFetchStatus(&bp, call, call->out_dir_scb);
+       xdr_decode_YFSVolSync(&bp, call->out_volsync);
+       return 0;
+ }
+@@ -974,12 +953,8 @@ static int yfs_deliver_fs_link(struct afs_call *call)
+               return ret;
+       bp = call->buffer;
+-      ret = xdr_decode_YFSFetchStatus(&bp, call, call->out_scb);
+-      if (ret < 0)
+-              return ret;
+-      ret = xdr_decode_YFSFetchStatus(&bp, call, call->out_dir_scb);
+-      if (ret < 0)
+-              return ret;
++      xdr_decode_YFSFetchStatus(&bp, call, call->out_scb);
++      xdr_decode_YFSFetchStatus(&bp, call, call->out_dir_scb);
+       xdr_decode_YFSVolSync(&bp, call->out_volsync);
+       _leave(" = 0 [done]");
+       return 0;
+@@ -1061,12 +1036,8 @@ static int yfs_deliver_fs_symlink(struct afs_call *call)
+       /* unmarshall the reply once we've received all of it */
+       bp = call->buffer;
+       xdr_decode_YFSFid(&bp, call->out_fid);
+-      ret = xdr_decode_YFSFetchStatus(&bp, call, call->out_scb);
+-      if (ret < 0)
+-              return ret;
+-      ret = xdr_decode_YFSFetchStatus(&bp, call, call->out_dir_scb);
+-      if (ret < 0)
+-              return ret;
++      xdr_decode_YFSFetchStatus(&bp, call, call->out_scb);
++      xdr_decode_YFSFetchStatus(&bp, call, call->out_dir_scb);
+       xdr_decode_YFSVolSync(&bp, call->out_volsync);
+       _leave(" = 0 [done]");
+@@ -1154,13 +1125,11 @@ static int yfs_deliver_fs_rename(struct afs_call *call)
+               return ret;
+       bp = call->buffer;
+-      ret = xdr_decode_YFSFetchStatus(&bp, call, call->out_dir_scb);
+-      if (ret < 0)
+-              return ret;
+-      ret = xdr_decode_YFSFetchStatus(&bp, call, call->out_scb);
+-      if (ret < 0)
+-              return ret;
+-
++      /* If the two dirs are the same, we have two copies of the same status
++       * report, so we just decode it twice.
++       */
++      xdr_decode_YFSFetchStatus(&bp, call, call->out_dir_scb);
++      xdr_decode_YFSFetchStatus(&bp, call, call->out_scb);
+       xdr_decode_YFSVolSync(&bp, call->out_volsync);
+       _leave(" = 0 [done]");
+       return 0;
+@@ -1845,9 +1814,7 @@ static int yfs_deliver_fs_inline_bulk_status(struct afs_call *call)
+               bp = call->buffer;
+               scb = &call->out_scb[call->count];
+-              ret = xdr_decode_YFSFetchStatus(&bp, call, scb);
+-              if (ret < 0)
+-                      return ret;
++              xdr_decode_YFSFetchStatus(&bp, call, scb);
+               call->count++;
+               if (call->count < call->count2)
+@@ -2067,9 +2034,7 @@ static int yfs_deliver_fs_fetch_opaque_acl(struct afs_call *call)
+               bp = call->buffer;
+               yacl->inherit_flag = ntohl(*bp++);
+               yacl->num_cleaned = ntohl(*bp++);
+-              ret = xdr_decode_YFSFetchStatus(&bp, call, call->out_scb);
+-              if (ret < 0)
+-                      return ret;
++              xdr_decode_YFSFetchStatus(&bp, call, call->out_scb);
+               xdr_decode_YFSVolSync(&bp, call->out_volsync);
+               call->unmarshall++;
+-- 
+2.25.1
+
diff --git a/queue-5.7/alsa-firewire-lib-fix-invalid-assignment-to-union-da.patch b/queue-5.7/alsa-firewire-lib-fix-invalid-assignment-to-union-da.patch
new file mode 100644 (file)
index 0000000..57243e2
--- /dev/null
@@ -0,0 +1,41 @@
+From aa15a699a169a49df055e8b08f6e8d27c9c934de Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 8 May 2020 13:36:26 +0900
+Subject: ALSA: firewire-lib: fix invalid assignment to union data for
+ directional parameter
+
+From: Takashi Sakamoto <o-takashi@sakamocchi.jp>
+
+[ Upstream commit 8304cf77c92038cd1c50c27b69d30be695cc8003 ]
+
+Although the value of FDF is used just for outgoing stream, the assignment
+to union member is done for both directions of stream. At present this
+causes no issue because the value of same position is reassigned later for
+opposite stream. However, it's better to add if statement.
+
+Fixes: d3d10a4a1b19 ("ALSA: firewire-lib: use union for directional parameters")
+Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
+Link: https://lore.kernel.org/r/20200508043635.349339-2-o-takashi@sakamocchi.jp
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/firewire/amdtp-am824.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/sound/firewire/amdtp-am824.c b/sound/firewire/amdtp-am824.c
+index 67d735e9a6a4c..fea92e148790f 100644
+--- a/sound/firewire/amdtp-am824.c
++++ b/sound/firewire/amdtp-am824.c
+@@ -82,7 +82,8 @@ int amdtp_am824_set_parameters(struct amdtp_stream *s, unsigned int rate,
+       if (err < 0)
+               return err;
+-      s->ctx_data.rx.fdf = AMDTP_FDF_AM824 | s->sfc;
++      if (s->direction == AMDTP_OUT_STREAM)
++              s->ctx_data.rx.fdf = AMDTP_FDF_AM824 | s->sfc;
+       p->pcm_channels = pcm_channels;
+       p->midi_ports = midi_ports;
+-- 
+2.25.1
+
diff --git a/queue-5.7/alsa-hda-realtek-introduce-polarity-for-micmute-led-.patch b/queue-5.7/alsa-hda-realtek-introduce-polarity-for-micmute-led-.patch
new file mode 100644 (file)
index 0000000..82c8a52
--- /dev/null
@@ -0,0 +1,79 @@
+From 476d15d0d6215e8be1db8e17d3deffb23b96f3c7 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 30 Apr 2020 16:32:51 +0800
+Subject: ALSA: hda/realtek - Introduce polarity for micmute LED GPIO
+
+From: Kai-Heng Feng <kai.heng.feng@canonical.com>
+
+[ Upstream commit dbd13179780555ecd3c992dea1222ca31920e892 ]
+
+Currently mute LED and micmute LED share the same GPIO polarity.
+
+So split the polarity for mute and micmute, in case they have different
+polarities.
+
+Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
+Link: https://lore.kernel.org/r/20200430083255.5093-1-kai.heng.feng@canonical.com
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/pci/hda/patch_realtek.c | 14 ++++++++------
+ 1 file changed, 8 insertions(+), 6 deletions(-)
+
+diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
+index 2c45759094417..e057ecb5a9045 100644
+--- a/sound/pci/hda/patch_realtek.c
++++ b/sound/pci/hda/patch_realtek.c
+@@ -81,6 +81,7 @@ struct alc_spec {
+       /* mute LED for HP laptops, see alc269_fixup_mic_mute_hook() */
+       int mute_led_polarity;
++      int micmute_led_polarity;
+       hda_nid_t mute_led_nid;
+       hda_nid_t cap_mute_led_nid;
+@@ -4080,11 +4081,9 @@ static void alc269_fixup_hp_mute_led_mic3(struct hda_codec *codec,
+ /* update LED status via GPIO */
+ static void alc_update_gpio_led(struct hda_codec *codec, unsigned int mask,
+-                              bool enabled)
++                              int polarity, bool enabled)
+ {
+-      struct alc_spec *spec = codec->spec;
+-
+-      if (spec->mute_led_polarity)
++      if (polarity)
+               enabled = !enabled;
+       alc_update_gpio_data(codec, mask, !enabled); /* muted -> LED on */
+ }
+@@ -4095,7 +4094,8 @@ static void alc_fixup_gpio_mute_hook(void *private_data, int enabled)
+       struct hda_codec *codec = private_data;
+       struct alc_spec *spec = codec->spec;
+-      alc_update_gpio_led(codec, spec->gpio_mute_led_mask, enabled);
++      alc_update_gpio_led(codec, spec->gpio_mute_led_mask,
++                          spec->mute_led_polarity, enabled);
+ }
+ /* turn on/off mic-mute LED via GPIO per capture hook */
+@@ -4104,6 +4104,7 @@ static void alc_gpio_micmute_update(struct hda_codec *codec)
+       struct alc_spec *spec = codec->spec;
+       alc_update_gpio_led(codec, spec->gpio_mic_led_mask,
++                          spec->micmute_led_polarity,
+                           spec->gen.micmute_led.led_value);
+ }
+@@ -5808,7 +5809,8 @@ static void alc280_hp_gpio4_automute_hook(struct hda_codec *codec,
+       snd_hda_gen_hp_automute(codec, jack);
+       /* mute_led_polarity is set to 0, so we pass inverted value here */
+-      alc_update_gpio_led(codec, 0x10, !spec->gen.hp_jack_present);
++      alc_update_gpio_led(codec, 0x10, spec->mute_led_polarity,
++                          !spec->gen.hp_jack_present);
+ }
+ /* Manage GPIOs for HP EliteBook Folio 9480m.
+-- 
+2.25.1
+
diff --git a/queue-5.7/alsa-isa-wavefront-prevent-out-of-bounds-write-in-io.patch b/queue-5.7/alsa-isa-wavefront-prevent-out-of-bounds-write-in-io.patch
new file mode 100644 (file)
index 0000000..f5de57f
--- /dev/null
@@ -0,0 +1,49 @@
+From b25fedd07c4d216e3b26161ca147597a2e2b00a2 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 1 May 2020 12:40:11 +0300
+Subject: ALSA: isa/wavefront: prevent out of bounds write in ioctl
+
+From: Dan Carpenter <dan.carpenter@oracle.com>
+
+[ Upstream commit 7f0d5053c5a9d23fe5c2d337495a9d79038d267b ]
+
+The "header->number" comes from the ioctl and it needs to be clamped to
+prevent out of bounds writes.
+
+Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
+Link: https://lore.kernel.org/r/20200501094011.GA960082@mwanda
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/isa/wavefront/wavefront_synth.c | 8 +++++++-
+ 1 file changed, 7 insertions(+), 1 deletion(-)
+
+diff --git a/sound/isa/wavefront/wavefront_synth.c b/sound/isa/wavefront/wavefront_synth.c
+index c5b1d5900eed2..d6420d224d097 100644
+--- a/sound/isa/wavefront/wavefront_synth.c
++++ b/sound/isa/wavefront/wavefront_synth.c
+@@ -1171,7 +1171,10 @@ wavefront_send_alias (snd_wavefront_t *dev, wavefront_patch_info *header)
+                                     "alias for %d\n",
+                                     header->number,
+                                     header->hdr.a.OriginalSample);
+-    
++
++      if (header->number >= WF_MAX_SAMPLE)
++              return -EINVAL;
++
+       munge_int32 (header->number, &alias_hdr[0], 2);
+       munge_int32 (header->hdr.a.OriginalSample, &alias_hdr[2], 2);
+       munge_int32 (*((unsigned int *)&header->hdr.a.sampleStartOffset),
+@@ -1202,6 +1205,9 @@ wavefront_send_multisample (snd_wavefront_t *dev, wavefront_patch_info *header)
+       int num_samples;
+       unsigned char *msample_hdr;
++      if (header->number >= WF_MAX_SAMPLE)
++              return -EINVAL;
++
+       msample_hdr = kmalloc(WF_MSAMPLE_BYTES, GFP_KERNEL);
+       if (! msample_hdr)
+               return -ENOMEM;
+-- 
+2.25.1
+
diff --git a/queue-5.7/alsa-usb-audio-add-duplex-sound-support-for-usb-devi.patch b/queue-5.7/alsa-usb-audio-add-duplex-sound-support-for-usb-devi.patch
new file mode 100644 (file)
index 0000000..f7b3558
--- /dev/null
@@ -0,0 +1,297 @@
+From 5a192b4060d24abd489a6c98ad8000a2b55a3641 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 10 May 2020 20:29:11 +0200
+Subject: ALSA: usb-audio: Add duplex sound support for USB devices using
+ implicit feedback
+
+From: Erwin Burema <e.burema@gmail.com>
+
+[ Upstream commit 10ce77e4817fef99e1166be7e6685a80c63bf77f ]
+
+For USB sound devices using implicit feedback the endpoint used for
+this feedback should be able to be opened twice, once for required
+feedback and second time for audio data. This way these devices can be
+put in duplex audio mode. Since this only works if the settings of the
+endpoint don't change a check is included for this.
+
+This fixes bug 207023 ("MOTU M2 regression on duplex audio") and
+should also fix bug 103751 ("M-Audio Fast Track Ultra usb audio device
+will not operate full-duplex")
+
+Fixes: c249177944b6 ("ALSA: usb-audio: add implicit fb quirk for MOTU M Series")
+Signed-off-by: Erwin Burema <e.burema@gmail.com>
+BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=207023
+BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=103751
+Link: https://lore.kernel.org/r/2410739.SCZni40SNb@alpha-wolf
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/card.h     |   1 +
+ sound/usb/endpoint.c | 195 ++++++++++++++++++++++++++++++++++++++++++-
+ sound/usb/pcm.c      |   5 ++
+ 3 files changed, 197 insertions(+), 4 deletions(-)
+
+diff --git a/sound/usb/card.h b/sound/usb/card.h
+index 820e564656edf..d6219fba96995 100644
+--- a/sound/usb/card.h
++++ b/sound/usb/card.h
+@@ -108,6 +108,7 @@ struct snd_usb_endpoint {
+       int iface, altsetting;
+       int skip_packets;               /* quirks for devices to ignore the first n packets
+                                          in a stream */
++      bool is_implicit_feedback;      /* This endpoint is used as implicit feedback */
+       spinlock_t lock;
+       struct list_head list;
+diff --git a/sound/usb/endpoint.c b/sound/usb/endpoint.c
+index 50104f658ed49..9bea7d3f99f88 100644
+--- a/sound/usb/endpoint.c
++++ b/sound/usb/endpoint.c
+@@ -522,6 +522,8 @@ struct snd_usb_endpoint *snd_usb_add_endpoint(struct snd_usb_audio *chip,
+       list_add_tail(&ep->list, &chip->ep_list);
++      ep->is_implicit_feedback = 0;
++
+ __exit_unlock:
+       mutex_unlock(&chip->mutex);
+@@ -621,6 +623,178 @@ static void release_urbs(struct snd_usb_endpoint *ep, int force)
+       ep->nurbs = 0;
+ }
++/*
++ * Check data endpoint for format differences
++ */
++static bool check_ep_params(struct snd_usb_endpoint *ep,
++                            snd_pcm_format_t pcm_format,
++                            unsigned int channels,
++                            unsigned int period_bytes,
++                            unsigned int frames_per_period,
++                            unsigned int periods_per_buffer,
++                            struct audioformat *fmt,
++                            struct snd_usb_endpoint *sync_ep)
++{
++      unsigned int maxsize, minsize, packs_per_ms, max_packs_per_urb;
++      unsigned int max_packs_per_period, urbs_per_period, urb_packs;
++      unsigned int max_urbs;
++      int frame_bits = snd_pcm_format_physical_width(pcm_format) * channels;
++      int tx_length_quirk = (ep->chip->tx_length_quirk &&
++                             usb_pipeout(ep->pipe));
++      bool ret = 1;
++
++      if (pcm_format == SNDRV_PCM_FORMAT_DSD_U16_LE && fmt->dsd_dop) {
++              /*
++               * When operating in DSD DOP mode, the size of a sample frame
++               * in hardware differs from the actual physical format width
++               * because we need to make room for the DOP markers.
++               */
++              frame_bits += channels << 3;
++      }
++
++      ret = ret && (ep->datainterval == fmt->datainterval);
++      ret = ret && (ep->stride == frame_bits >> 3);
++
++      switch (pcm_format) {
++      case SNDRV_PCM_FORMAT_U8:
++              ret = ret && (ep->silence_value == 0x80);
++              break;
++      case SNDRV_PCM_FORMAT_DSD_U8:
++      case SNDRV_PCM_FORMAT_DSD_U16_LE:
++      case SNDRV_PCM_FORMAT_DSD_U32_LE:
++      case SNDRV_PCM_FORMAT_DSD_U16_BE:
++      case SNDRV_PCM_FORMAT_DSD_U32_BE:
++              ret = ret && (ep->silence_value == 0x69);
++              break;
++      default:
++              ret = ret && (ep->silence_value == 0);
++      }
++
++      /* assume max. frequency is 50% higher than nominal */
++      ret = ret && (ep->freqmax == ep->freqn + (ep->freqn >> 1));
++      /* Round up freqmax to nearest integer in order to calculate maximum
++       * packet size, which must represent a whole number of frames.
++       * This is accomplished by adding 0x0.ffff before converting the
++       * Q16.16 format into integer.
++       * In order to accurately calculate the maximum packet size when
++       * the data interval is more than 1 (i.e. ep->datainterval > 0),
++       * multiply by the data interval prior to rounding. For instance,
++       * a freqmax of 41 kHz will result in a max packet size of 6 (5.125)
++       * frames with a data interval of 1, but 11 (10.25) frames with a
++       * data interval of 2.
++       * (ep->freqmax << ep->datainterval overflows at 8.192 MHz for the
++       * maximum datainterval value of 3, at USB full speed, higher for
++       * USB high speed, noting that ep->freqmax is in units of
++       * frames per packet in Q16.16 format.)
++       */
++      maxsize = (((ep->freqmax << ep->datainterval) + 0xffff) >> 16) *
++                       (frame_bits >> 3);
++      if (tx_length_quirk)
++              maxsize += sizeof(__le32); /* Space for length descriptor */
++      /* but wMaxPacketSize might reduce this */
++      if (ep->maxpacksize && ep->maxpacksize < maxsize) {
++              /* whatever fits into a max. size packet */
++              unsigned int data_maxsize = maxsize = ep->maxpacksize;
++
++              if (tx_length_quirk)
++                      /* Need to remove the length descriptor to calc freq */
++                      data_maxsize -= sizeof(__le32);
++              ret = ret && (ep->freqmax == (data_maxsize / (frame_bits >> 3))
++                              << (16 - ep->datainterval));
++      }
++
++      if (ep->fill_max)
++              ret = ret && (ep->curpacksize == ep->maxpacksize);
++      else
++              ret = ret && (ep->curpacksize == maxsize);
++
++      if (snd_usb_get_speed(ep->chip->dev) != USB_SPEED_FULL) {
++              packs_per_ms = 8 >> ep->datainterval;
++              max_packs_per_urb = MAX_PACKS_HS;
++      } else {
++              packs_per_ms = 1;
++              max_packs_per_urb = MAX_PACKS;
++      }
++      if (sync_ep && !snd_usb_endpoint_implicit_feedback_sink(ep))
++              max_packs_per_urb = min(max_packs_per_urb,
++                                      1U << sync_ep->syncinterval);
++      max_packs_per_urb = max(1u, max_packs_per_urb >> ep->datainterval);
++
++      /*
++       * Capture endpoints need to use small URBs because there's no way
++       * to tell in advance where the next period will end, and we don't
++       * want the next URB to complete much after the period ends.
++       *
++       * Playback endpoints with implicit sync much use the same parameters
++       * as their corresponding capture endpoint.
++       */
++      if (usb_pipein(ep->pipe) ||
++                      snd_usb_endpoint_implicit_feedback_sink(ep)) {
++
++              urb_packs = packs_per_ms;
++              /*
++               * Wireless devices can poll at a max rate of once per 4ms.
++               * For dataintervals less than 5, increase the packet count to
++               * allow the host controller to use bursting to fill in the
++               * gaps.
++               */
++              if (snd_usb_get_speed(ep->chip->dev) == USB_SPEED_WIRELESS) {
++                      int interval = ep->datainterval;
++
++                      while (interval < 5) {
++                              urb_packs <<= 1;
++                              ++interval;
++                      }
++              }
++              /* make capture URBs <= 1 ms and smaller than a period */
++              urb_packs = min(max_packs_per_urb, urb_packs);
++              while (urb_packs > 1 && urb_packs * maxsize >= period_bytes)
++                      urb_packs >>= 1;
++              ret = ret && (ep->nurbs == MAX_URBS);
++
++      /*
++       * Playback endpoints without implicit sync are adjusted so that
++       * a period fits as evenly as possible in the smallest number of
++       * URBs.  The total number of URBs is adjusted to the size of the
++       * ALSA buffer, subject to the MAX_URBS and MAX_QUEUE limits.
++       */
++      } else {
++              /* determine how small a packet can be */
++              minsize = (ep->freqn >> (16 - ep->datainterval)) *
++                              (frame_bits >> 3);
++              /* with sync from device, assume it can be 12% lower */
++              if (sync_ep)
++                      minsize -= minsize >> 3;
++              minsize = max(minsize, 1u);
++
++              /* how many packets will contain an entire ALSA period? */
++              max_packs_per_period = DIV_ROUND_UP(period_bytes, minsize);
++
++              /* how many URBs will contain a period? */
++              urbs_per_period = DIV_ROUND_UP(max_packs_per_period,
++                              max_packs_per_urb);
++              /* how many packets are needed in each URB? */
++              urb_packs = DIV_ROUND_UP(max_packs_per_period, urbs_per_period);
++
++              /* limit the number of frames in a single URB */
++              ret = ret && (ep->max_urb_frames ==
++                      DIV_ROUND_UP(frames_per_period, urbs_per_period));
++
++              /* try to use enough URBs to contain an entire ALSA buffer */
++              max_urbs = min((unsigned) MAX_URBS,
++                              MAX_QUEUE * packs_per_ms / urb_packs);
++              ret = ret && (ep->nurbs == min(max_urbs,
++                              urbs_per_period * periods_per_buffer));
++      }
++
++      ret = ret && (ep->datainterval == fmt->datainterval);
++      ret = ret && (ep->maxpacksize == fmt->maxpacksize);
++      ret = ret &&
++              (ep->fill_max == !!(fmt->attributes & UAC_EP_CS_ATTR_FILL_MAX));
++
++      return ret;
++}
++
+ /*
+  * configure a data endpoint
+  */
+@@ -886,10 +1060,23 @@ int snd_usb_endpoint_set_params(struct snd_usb_endpoint *ep,
+       int err;
+       if (ep->use_count != 0) {
+-              usb_audio_warn(ep->chip,
+-                       "Unable to change format on ep #%x: already in use\n",
+-                       ep->ep_num);
+-              return -EBUSY;
++              bool check = ep->is_implicit_feedback &&
++                      check_ep_params(ep, pcm_format,
++                                           channels, period_bytes,
++                                           period_frames, buffer_periods,
++                                           fmt, sync_ep);
++
++              if (!check) {
++                      usb_audio_warn(ep->chip,
++                              "Unable to change format on ep #%x: already in use\n",
++                              ep->ep_num);
++                      return -EBUSY;
++              }
++
++              usb_audio_dbg(ep->chip,
++                            "Ep #%x already in use as implicit feedback but format not changed\n",
++                            ep->ep_num);
++              return 0;
+       }
+       /* release old buffers, if any */
+diff --git a/sound/usb/pcm.c b/sound/usb/pcm.c
+index b50965ab3b3a3..d61c2f1095b5c 100644
+--- a/sound/usb/pcm.c
++++ b/sound/usb/pcm.c
+@@ -404,6 +404,8 @@ add_sync_ep:
+       if (!subs->sync_endpoint)
+               return -EINVAL;
++      subs->sync_endpoint->is_implicit_feedback = 1;
++
+       subs->data_endpoint->sync_master = subs->sync_endpoint;
+       return 1;
+@@ -502,12 +504,15 @@ static int set_sync_endpoint(struct snd_usb_substream *subs,
+                                                  implicit_fb ?
+                                                       SND_USB_ENDPOINT_TYPE_DATA :
+                                                       SND_USB_ENDPOINT_TYPE_SYNC);
++
+       if (!subs->sync_endpoint) {
+               if (is_playback && attr == USB_ENDPOINT_SYNC_NONE)
+                       return 0;
+               return -EINVAL;
+       }
++      subs->sync_endpoint->is_implicit_feedback = implicit_fb;
++
+       subs->data_endpoint->sync_master = subs->sync_endpoint;
+       return 0;
+-- 
+2.25.1
+
diff --git a/queue-5.7/alsa-usb-audio-fix-racy-list-management-in-output-qu.patch b/queue-5.7/alsa-usb-audio-fix-racy-list-management-in-output-qu.patch
new file mode 100644 (file)
index 0000000..da581c5
--- /dev/null
@@ -0,0 +1,51 @@
+From 127444f65ff69844305ffbf83faf51b4a42a88a4 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 24 Apr 2020 09:40:16 +0200
+Subject: ALSA: usb-audio: Fix racy list management in output queue
+
+From: Takashi Iwai <tiwai@suse.de>
+
+[ Upstream commit 5b6cc38f3f3f37109ce72b60bda215a5f6892c0b ]
+
+The linked list entry from FIFO is peeked at
+queue_pending_output_urbs() but the actual element pop-out is
+performed outside the spinlock, and it's potentially racy.
+
+Do delete the link at the right place inside the spinlock.
+
+Fixes: 8fdff6a319e7 ("ALSA: snd-usb: implement new endpoint streaming model")
+Link: https://lore.kernel.org/r/20200424074016.14301-1-tiwai@suse.de
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/endpoint.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/sound/usb/endpoint.c b/sound/usb/endpoint.c
+index d8dc7cb56d43c..50104f658ed49 100644
+--- a/sound/usb/endpoint.c
++++ b/sound/usb/endpoint.c
+@@ -346,17 +346,17 @@ static void queue_pending_output_urbs(struct snd_usb_endpoint *ep)
+                       ep->next_packet_read_pos %= MAX_URBS;
+                       /* take URB out of FIFO */
+-                      if (!list_empty(&ep->ready_playback_urbs))
++                      if (!list_empty(&ep->ready_playback_urbs)) {
+                               ctx = list_first_entry(&ep->ready_playback_urbs,
+                                              struct snd_urb_ctx, ready_list);
++                              list_del_init(&ctx->ready_list);
++                      }
+               }
+               spin_unlock_irqrestore(&ep->lock, flags);
+               if (ctx == NULL)
+                       return;
+-              list_del_init(&ctx->ready_list);
+-
+               /* copy over the length information */
+               for (i = 0; i < packet->packets; i++)
+                       ctx->packet_size[i] = packet->packet_size[i];
+-- 
+2.25.1
+
diff --git a/queue-5.7/alsa-usb-audio-fixing-upper-volume-limit-for-rme-bab.patch b/queue-5.7/alsa-usb-audio-fixing-upper-volume-limit-for-rme-bab.patch
new file mode 100644 (file)
index 0000000..d7e56d8
--- /dev/null
@@ -0,0 +1,46 @@
+From 75c047ed0e00a02bcbe48a209bb9d118909eef04 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 15 May 2020 13:46:05 +0200
+Subject: ALSA: usb-audio: fixing upper volume limit for RME Babyface Pro
+ routing crosspoints
+
+From: Thomas Ebeling <penguins@bollie.de>
+
+[ Upstream commit 47b4f5f5b65680fbef7a7a9a4796b35f38a6e43e ]
+
+In my initial patch, these were set too low.
+
+Fixes: 3e8f3bd04716 ("ALSA: usb-audio: RME Babyface Pro mixer patch")
+Signed-off-by: Thomas Ebeling <penguins@bollie.de>
+Link: https://lore.kernel.org/r/20200515114556.vtspnonzvp4xp44m@bollie.ca9.eu
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index bdff8674942ec..aad2683ff7933 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -2191,7 +2191,7 @@ static int snd_rme_controls_create(struct usb_mixer_interface *mixer)
+  * These devices exposes a couple of DSP functions via request to EP0.
+  * Switches are available via control registers, while routing is controlled
+  * by controlling the volume on each possible crossing point.
+- * Volume control is linear, from -inf (dec. 0) to +6dB (dec. 46341) with
++ * Volume control is linear, from -inf (dec. 0) to +6dB (dec. 65536) with
+  * 0dB being at dec. 32768.
+  */
+ enum {
+@@ -2220,7 +2220,7 @@ enum {
+ #define SND_BBFPRO_MIXER_VAL_MASK 0x3ffff
+ #define SND_BBFPRO_MIXER_VAL_SHIFT 9
+ #define SND_BBFPRO_MIXER_VAL_MIN 0 // -inf
+-#define SND_BBFPRO_MIXER_VAL_MAX 46341 // +6dB
++#define SND_BBFPRO_MIXER_VAL_MAX 65536 // +6dB
+ #define SND_BBFPRO_USBREQ_CTL_REG1 0x10
+ #define SND_BBFPRO_USBREQ_CTL_REG2 0x17
+-- 
+2.25.1
+
diff --git a/queue-5.7/alsa-usb-audio-improve-frames-size-computation.patch b/queue-5.7/alsa-usb-audio-improve-frames-size-computation.patch
new file mode 100644 (file)
index 0000000..818348f
--- /dev/null
@@ -0,0 +1,167 @@
+From 1897c8d14a1944a5177eb8b5393ce3a28eefd3c6 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 24 Apr 2020 05:24:48 +0300
+Subject: ALSA: usb-audio: Improve frames size computation
+
+From: Alexander Tsoy <alexander@tsoy.me>
+
+[ Upstream commit f0bd62b64016508938df9babe47f65c2c727d25c ]
+
+For computation of the the next frame size current value of fs/fps and
+accumulated fractional parts of fs/fps are used, where values are stored
+in Q16.16 format. This is quite natural for computing frame size for
+asynchronous endpoints driven by explicit feedback, since in this case
+fs/fps is a value provided by the feedback endpoint and it's already in
+the Q format. If an error is accumulated over time, the device can
+adjust fs/fps value to prevent buffer overruns/underruns.
+
+But for synchronous endpoints the accuracy provided by these computations
+is not enough. Due to accumulated error the driver periodically produces
+frames with incorrect size (+/- 1 audio sample).
+
+This patch fixes this issue by implementing a different algorithm for
+frame size computation. It is based on accumulating of the remainders
+from division fs/fps and it doesn't accumulate errors over time. This
+new method is enabled for synchronous and adaptive playback endpoints.
+
+Signed-off-by: Alexander Tsoy <alexander@tsoy.me>
+Link: https://lore.kernel.org/r/20200424022449.14972-1-alexander@tsoy.me
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/card.h     |  4 ++++
+ sound/usb/endpoint.c | 43 ++++++++++++++++++++++++++++++++++++++-----
+ sound/usb/endpoint.h |  1 +
+ sound/usb/pcm.c      |  2 ++
+ 4 files changed, 45 insertions(+), 5 deletions(-)
+
+diff --git a/sound/usb/card.h b/sound/usb/card.h
+index 395403a2d33f8..820e564656edf 100644
+--- a/sound/usb/card.h
++++ b/sound/usb/card.h
+@@ -84,6 +84,10 @@ struct snd_usb_endpoint {
+       dma_addr_t sync_dma;            /* DMA address of syncbuf */
+       unsigned int pipe;              /* the data i/o pipe */
++      unsigned int framesize[2];      /* small/large frame sizes in samples */
++      unsigned int sample_rem;        /* remainder from division fs/fps */
++      unsigned int sample_accum;      /* sample accumulator */
++      unsigned int fps;               /* frames per second */
+       unsigned int freqn;             /* nominal sampling rate in fs/fps in Q16.16 format */
+       unsigned int freqm;             /* momentary sampling rate in fs/fps in Q16.16 format */
+       int        freqshift;           /* how much to shift the feedback value to get Q16.16 */
+diff --git a/sound/usb/endpoint.c b/sound/usb/endpoint.c
+index 4a9a2f6ef5a45..d8dc7cb56d43c 100644
+--- a/sound/usb/endpoint.c
++++ b/sound/usb/endpoint.c
+@@ -124,12 +124,12 @@ int snd_usb_endpoint_implicit_feedback_sink(struct snd_usb_endpoint *ep)
+ /*
+  * For streaming based on information derived from sync endpoints,
+- * prepare_outbound_urb_sizes() will call next_packet_size() to
++ * prepare_outbound_urb_sizes() will call slave_next_packet_size() to
+  * determine the number of samples to be sent in the next packet.
+  *
+- * For implicit feedback, next_packet_size() is unused.
++ * For implicit feedback, slave_next_packet_size() is unused.
+  */
+-int snd_usb_endpoint_next_packet_size(struct snd_usb_endpoint *ep)
++int snd_usb_endpoint_slave_next_packet_size(struct snd_usb_endpoint *ep)
+ {
+       unsigned long flags;
+       int ret;
+@@ -146,6 +146,29 @@ int snd_usb_endpoint_next_packet_size(struct snd_usb_endpoint *ep)
+       return ret;
+ }
++/*
++ * For adaptive and synchronous endpoints, prepare_outbound_urb_sizes()
++ * will call next_packet_size() to determine the number of samples to be
++ * sent in the next packet.
++ */
++int snd_usb_endpoint_next_packet_size(struct snd_usb_endpoint *ep)
++{
++      int ret;
++
++      if (ep->fill_max)
++              return ep->maxframesize;
++
++      ep->sample_accum += ep->sample_rem;
++      if (ep->sample_accum >= ep->fps) {
++              ep->sample_accum -= ep->fps;
++              ret = ep->framesize[1];
++      } else {
++              ret = ep->framesize[0];
++      }
++
++      return ret;
++}
++
+ static void retire_outbound_urb(struct snd_usb_endpoint *ep,
+                               struct snd_urb_ctx *urb_ctx)
+ {
+@@ -190,6 +213,8 @@ static void prepare_silent_urb(struct snd_usb_endpoint *ep,
+               if (ctx->packet_size[i])
+                       counts = ctx->packet_size[i];
++              else if (ep->sync_master)
++                      counts = snd_usb_endpoint_slave_next_packet_size(ep);
+               else
+                       counts = snd_usb_endpoint_next_packet_size(ep);
+@@ -874,10 +899,17 @@ int snd_usb_endpoint_set_params(struct snd_usb_endpoint *ep,
+       ep->maxpacksize = fmt->maxpacksize;
+       ep->fill_max = !!(fmt->attributes & UAC_EP_CS_ATTR_FILL_MAX);
+-      if (snd_usb_get_speed(ep->chip->dev) == USB_SPEED_FULL)
++      if (snd_usb_get_speed(ep->chip->dev) == USB_SPEED_FULL) {
+               ep->freqn = get_usb_full_speed_rate(rate);
+-      else
++              ep->fps = 1000;
++      } else {
+               ep->freqn = get_usb_high_speed_rate(rate);
++              ep->fps = 8000;
++      }
++
++      ep->sample_rem = rate % ep->fps;
++      ep->framesize[0] = rate / ep->fps;
++      ep->framesize[1] = (rate + (ep->fps - 1)) / ep->fps;
+       /* calculate the frequency in 16.16 format */
+       ep->freqm = ep->freqn;
+@@ -936,6 +968,7 @@ int snd_usb_endpoint_start(struct snd_usb_endpoint *ep)
+       ep->active_mask = 0;
+       ep->unlink_mask = 0;
+       ep->phase = 0;
++      ep->sample_accum = 0;
+       snd_usb_endpoint_start_quirk(ep);
+diff --git a/sound/usb/endpoint.h b/sound/usb/endpoint.h
+index 63a39d4fa8d8e..d23fa0a8c11bf 100644
+--- a/sound/usb/endpoint.h
++++ b/sound/usb/endpoint.h
+@@ -28,6 +28,7 @@ void snd_usb_endpoint_release(struct snd_usb_endpoint *ep);
+ void snd_usb_endpoint_free(struct snd_usb_endpoint *ep);
+ int snd_usb_endpoint_implicit_feedback_sink(struct snd_usb_endpoint *ep);
++int snd_usb_endpoint_slave_next_packet_size(struct snd_usb_endpoint *ep);
+ int snd_usb_endpoint_next_packet_size(struct snd_usb_endpoint *ep);
+ void snd_usb_handle_sync_urb(struct snd_usb_endpoint *ep,
+diff --git a/sound/usb/pcm.c b/sound/usb/pcm.c
+index a4e4064f9aee7..b50965ab3b3a3 100644
+--- a/sound/usb/pcm.c
++++ b/sound/usb/pcm.c
+@@ -1579,6 +1579,8 @@ static void prepare_playback_urb(struct snd_usb_substream *subs,
+       for (i = 0; i < ctx->packets; i++) {
+               if (ctx->packet_size[i])
+                       counts = ctx->packet_size[i];
++              else if (ep->sync_master)
++                      counts = snd_usb_endpoint_slave_next_packet_size(ep);
+               else
+                       counts = snd_usb_endpoint_next_packet_size(ep);
+-- 
+2.25.1
+
diff --git a/queue-5.7/alsa-usb-audio-rme-babyface-pro-mixer-patch.patch b/queue-5.7/alsa-usb-audio-rme-babyface-pro-mixer-patch.patch
new file mode 100644 (file)
index 0000000..6383a78
--- /dev/null
@@ -0,0 +1,459 @@
+From e1533f5a0c4355062a1406bf0e0cd4a5d9f33985 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 14 Apr 2020 23:10:29 +0200
+Subject: ALSA: usb-audio: RME Babyface Pro mixer patch
+
+From: Thomas Ebeling <penguins@bollie.de>
+
+[ Upstream commit 3e8f3bd047163d30fb1ad32ca7e4628921555c09 ]
+
+Added mixer quirks to allow controlling the internal DSP of the
+RME Babyface Pro and its successor Babyface Pro FS.
+
+Signed-off-by: Thomas Ebeling <penguins@bollie.de>
+Link: https://lore.kernel.org/r/20200414211019.qprg7whepg2y7nei@bollie.ca9.eu
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 418 +++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 418 insertions(+)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index a5f65a9a02546..bdff8674942ec 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -2185,6 +2185,421 @@ static int snd_rme_controls_create(struct usb_mixer_interface *mixer)
+       return 0;
+ }
++/*
++ * RME Babyface Pro (FS)
++ *
++ * These devices exposes a couple of DSP functions via request to EP0.
++ * Switches are available via control registers, while routing is controlled
++ * by controlling the volume on each possible crossing point.
++ * Volume control is linear, from -inf (dec. 0) to +6dB (dec. 46341) with
++ * 0dB being at dec. 32768.
++ */
++enum {
++      SND_BBFPRO_CTL_REG1 = 0,
++      SND_BBFPRO_CTL_REG2
++};
++
++#define SND_BBFPRO_CTL_REG_MASK 1
++#define SND_BBFPRO_CTL_IDX_MASK 0xff
++#define SND_BBFPRO_CTL_IDX_SHIFT 1
++#define SND_BBFPRO_CTL_VAL_MASK 1
++#define SND_BBFPRO_CTL_VAL_SHIFT 9
++#define SND_BBFPRO_CTL_REG1_CLK_MASTER 0
++#define SND_BBFPRO_CTL_REG1_CLK_OPTICAL 1
++#define SND_BBFPRO_CTL_REG1_SPDIF_PRO 7
++#define SND_BBFPRO_CTL_REG1_SPDIF_EMPH 8
++#define SND_BBFPRO_CTL_REG1_SPDIF_OPTICAL 10
++#define SND_BBFPRO_CTL_REG2_48V_AN1 0
++#define SND_BBFPRO_CTL_REG2_48V_AN2 1
++#define SND_BBFPRO_CTL_REG2_SENS_IN3 2
++#define SND_BBFPRO_CTL_REG2_SENS_IN4 3
++#define SND_BBFPRO_CTL_REG2_PAD_AN1 4
++#define SND_BBFPRO_CTL_REG2_PAD_AN2 5
++
++#define SND_BBFPRO_MIXER_IDX_MASK 0x1ff
++#define SND_BBFPRO_MIXER_VAL_MASK 0x3ffff
++#define SND_BBFPRO_MIXER_VAL_SHIFT 9
++#define SND_BBFPRO_MIXER_VAL_MIN 0 // -inf
++#define SND_BBFPRO_MIXER_VAL_MAX 46341 // +6dB
++
++#define SND_BBFPRO_USBREQ_CTL_REG1 0x10
++#define SND_BBFPRO_USBREQ_CTL_REG2 0x17
++#define SND_BBFPRO_USBREQ_MIXER 0x12
++
++static int snd_bbfpro_ctl_update(struct usb_mixer_interface *mixer, u8 reg,
++                               u8 index, u8 value)
++{
++      int err;
++      u16 usb_req, usb_idx, usb_val;
++      struct snd_usb_audio *chip = mixer->chip;
++
++      err = snd_usb_lock_shutdown(chip);
++      if (err < 0)
++              return err;
++
++      if (reg == SND_BBFPRO_CTL_REG1) {
++              usb_req = SND_BBFPRO_USBREQ_CTL_REG1;
++              if (index == SND_BBFPRO_CTL_REG1_CLK_OPTICAL) {
++                      usb_idx = 3;
++                      usb_val = value ? 3 : 0;
++              } else {
++                      usb_idx = 1 << index;
++                      usb_val = value ? usb_idx : 0;
++              }
++      } else {
++              usb_req = SND_BBFPRO_USBREQ_CTL_REG2;
++              usb_idx = 1 << index;
++              usb_val = value ? usb_idx : 0;
++      }
++
++      err = snd_usb_ctl_msg(chip->dev,
++                            usb_sndctrlpipe(chip->dev, 0), usb_req,
++                            USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
++                            usb_val, usb_idx, 0, 0);
++
++      snd_usb_unlock_shutdown(chip);
++      return err;
++}
++
++static int snd_bbfpro_ctl_get(struct snd_kcontrol *kcontrol,
++                            struct snd_ctl_elem_value *ucontrol)
++{
++      u8 reg, idx, val;
++      int pv;
++
++      pv = kcontrol->private_value;
++      reg = pv & SND_BBFPRO_CTL_REG_MASK;
++      idx = (pv >> SND_BBFPRO_CTL_IDX_SHIFT) & SND_BBFPRO_CTL_IDX_MASK;
++      val = kcontrol->private_value >> SND_BBFPRO_CTL_VAL_SHIFT;
++
++      if ((reg == SND_BBFPRO_CTL_REG1 &&
++           idx == SND_BBFPRO_CTL_REG1_CLK_OPTICAL) ||
++          (reg == SND_BBFPRO_CTL_REG2 &&
++          (idx == SND_BBFPRO_CTL_REG2_SENS_IN3 ||
++           idx == SND_BBFPRO_CTL_REG2_SENS_IN4))) {
++              ucontrol->value.enumerated.item[0] = val;
++      } else {
++              ucontrol->value.integer.value[0] = val;
++      }
++      return 0;
++}
++
++static int snd_bbfpro_ctl_info(struct snd_kcontrol *kcontrol,
++                             struct snd_ctl_elem_info *uinfo)
++{
++      u8 reg, idx;
++      int pv;
++
++      pv = kcontrol->private_value;
++      reg = pv & SND_BBFPRO_CTL_REG_MASK;
++      idx = (pv >> SND_BBFPRO_CTL_IDX_SHIFT) & SND_BBFPRO_CTL_IDX_MASK;
++
++      if (reg == SND_BBFPRO_CTL_REG1 &&
++          idx == SND_BBFPRO_CTL_REG1_CLK_OPTICAL) {
++              static const char * const texts[2] = {
++                      "AutoSync",
++                      "Internal"
++              };
++              return snd_ctl_enum_info(uinfo, 1, 2, texts);
++      } else if (reg == SND_BBFPRO_CTL_REG2 &&
++                 (idx == SND_BBFPRO_CTL_REG2_SENS_IN3 ||
++                  idx == SND_BBFPRO_CTL_REG2_SENS_IN4)) {
++              static const char * const texts[2] = {
++                      "-10dBV",
++                      "+4dBu"
++              };
++              return snd_ctl_enum_info(uinfo, 1, 2, texts);
++      }
++
++      uinfo->count = 1;
++      uinfo->value.integer.min = 0;
++      uinfo->value.integer.max = 1;
++      uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
++      return 0;
++}
++
++static int snd_bbfpro_ctl_put(struct snd_kcontrol *kcontrol,
++                            struct snd_ctl_elem_value *ucontrol)
++{
++      int err;
++      u8 reg, idx;
++      int old_value, pv, val;
++
++      struct usb_mixer_elem_list *list = snd_kcontrol_chip(kcontrol);
++      struct usb_mixer_interface *mixer = list->mixer;
++
++      pv = kcontrol->private_value;
++      reg = pv & SND_BBFPRO_CTL_REG_MASK;
++      idx = (pv >> SND_BBFPRO_CTL_IDX_SHIFT) & SND_BBFPRO_CTL_IDX_MASK;
++      old_value = (pv >> SND_BBFPRO_CTL_VAL_SHIFT) & SND_BBFPRO_CTL_VAL_MASK;
++
++      if ((reg == SND_BBFPRO_CTL_REG1 &&
++           idx == SND_BBFPRO_CTL_REG1_CLK_OPTICAL) ||
++          (reg == SND_BBFPRO_CTL_REG2 &&
++          (idx == SND_BBFPRO_CTL_REG2_SENS_IN3 ||
++           idx == SND_BBFPRO_CTL_REG2_SENS_IN4))) {
++              val = ucontrol->value.enumerated.item[0];
++      } else {
++              val = ucontrol->value.integer.value[0];
++      }
++
++      if (val > 1)
++              return -EINVAL;
++
++      if (val == old_value)
++              return 0;
++
++      kcontrol->private_value = reg
++              | ((idx & SND_BBFPRO_CTL_IDX_MASK) << SND_BBFPRO_CTL_IDX_SHIFT)
++              | ((val & SND_BBFPRO_CTL_VAL_MASK) << SND_BBFPRO_CTL_VAL_SHIFT);
++
++      err = snd_bbfpro_ctl_update(mixer, reg, idx, val);
++      return err < 0 ? err : 1;
++}
++
++static int snd_bbfpro_ctl_resume(struct usb_mixer_elem_list *list)
++{
++      u8 reg, idx;
++      int value, pv;
++
++      pv = list->kctl->private_value;
++      reg = pv & SND_BBFPRO_CTL_REG_MASK;
++      idx = (pv >> SND_BBFPRO_CTL_IDX_SHIFT) & SND_BBFPRO_CTL_IDX_MASK;
++      value = (pv >> SND_BBFPRO_CTL_VAL_SHIFT) & SND_BBFPRO_CTL_VAL_MASK;
++
++      return snd_bbfpro_ctl_update(list->mixer, reg, idx, value);
++}
++
++static int snd_bbfpro_vol_update(struct usb_mixer_interface *mixer, u16 index,
++                               u32 value)
++{
++      struct snd_usb_audio *chip = mixer->chip;
++      int err;
++      u16 idx;
++      u16 usb_idx, usb_val;
++      u32 v;
++
++      err = snd_usb_lock_shutdown(chip);
++      if (err < 0)
++              return err;
++
++      idx = index & SND_BBFPRO_MIXER_IDX_MASK;
++      // 18 bit linear volume, split so 2 bits end up in index.
++      v = value & SND_BBFPRO_MIXER_VAL_MASK;
++      usb_idx = idx | (v & 0x3) << 14;
++      usb_val = (v >> 2) & 0xffff;
++
++      err = snd_usb_ctl_msg(chip->dev,
++                            usb_sndctrlpipe(chip->dev, 0),
++                            SND_BBFPRO_USBREQ_MIXER,
++                            USB_DIR_OUT | USB_TYPE_VENDOR |
++                            USB_RECIP_DEVICE,
++                            usb_val, usb_idx, 0, 0);
++
++      snd_usb_unlock_shutdown(chip);
++      return err;
++}
++
++static int snd_bbfpro_vol_get(struct snd_kcontrol *kcontrol,
++                            struct snd_ctl_elem_value *ucontrol)
++{
++      ucontrol->value.integer.value[0] =
++              kcontrol->private_value >> SND_BBFPRO_MIXER_VAL_SHIFT;
++      return 0;
++}
++
++static int snd_bbfpro_vol_info(struct snd_kcontrol *kcontrol,
++                             struct snd_ctl_elem_info *uinfo)
++{
++      uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
++      uinfo->count = 1;
++      uinfo->value.integer.min = SND_BBFPRO_MIXER_VAL_MIN;
++      uinfo->value.integer.max = SND_BBFPRO_MIXER_VAL_MAX;
++      return 0;
++}
++
++static int snd_bbfpro_vol_put(struct snd_kcontrol *kcontrol,
++                            struct snd_ctl_elem_value *ucontrol)
++{
++      int err;
++      u16 idx;
++      u32 new_val, old_value, uvalue;
++      struct usb_mixer_elem_list *list = snd_kcontrol_chip(kcontrol);
++      struct usb_mixer_interface *mixer = list->mixer;
++
++      uvalue = ucontrol->value.integer.value[0];
++      idx = kcontrol->private_value & SND_BBFPRO_MIXER_IDX_MASK;
++      old_value = kcontrol->private_value >> SND_BBFPRO_MIXER_VAL_SHIFT;
++
++      if (uvalue > SND_BBFPRO_MIXER_VAL_MAX)
++              return -EINVAL;
++
++      if (uvalue == old_value)
++              return 0;
++
++      new_val = uvalue & SND_BBFPRO_MIXER_VAL_MASK;
++
++      kcontrol->private_value = idx
++              | (new_val << SND_BBFPRO_MIXER_VAL_SHIFT);
++
++      err = snd_bbfpro_vol_update(mixer, idx, new_val);
++      return err < 0 ? err : 1;
++}
++
++static int snd_bbfpro_vol_resume(struct usb_mixer_elem_list *list)
++{
++      int pv = list->kctl->private_value;
++      u16 idx = pv & SND_BBFPRO_MIXER_IDX_MASK;
++      u32 val = (pv >> SND_BBFPRO_MIXER_VAL_SHIFT)
++              & SND_BBFPRO_MIXER_VAL_MASK;
++      return snd_bbfpro_vol_update(list->mixer, idx, val);
++}
++
++// Predfine elements
++static const struct snd_kcontrol_new snd_bbfpro_ctl_control = {
++      .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
++      .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
++      .index = 0,
++      .info = snd_bbfpro_ctl_info,
++      .get = snd_bbfpro_ctl_get,
++      .put = snd_bbfpro_ctl_put
++};
++
++static const struct snd_kcontrol_new snd_bbfpro_vol_control = {
++      .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
++      .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
++      .index = 0,
++      .info = snd_bbfpro_vol_info,
++      .get = snd_bbfpro_vol_get,
++      .put = snd_bbfpro_vol_put
++};
++
++static int snd_bbfpro_ctl_add(struct usb_mixer_interface *mixer, u8 reg,
++                            u8 index, char *name)
++{
++      struct snd_kcontrol_new knew = snd_bbfpro_ctl_control;
++
++      knew.name = name;
++      knew.private_value = (reg & SND_BBFPRO_CTL_REG_MASK)
++              | ((index & SND_BBFPRO_CTL_IDX_MASK)
++                      << SND_BBFPRO_CTL_IDX_SHIFT);
++
++      return add_single_ctl_with_resume(mixer, 0, snd_bbfpro_ctl_resume,
++              &knew, NULL);
++}
++
++static int snd_bbfpro_vol_add(struct usb_mixer_interface *mixer, u16 index,
++                            char *name)
++{
++      struct snd_kcontrol_new knew = snd_bbfpro_vol_control;
++
++      knew.name = name;
++      knew.private_value = index & SND_BBFPRO_MIXER_IDX_MASK;
++
++      return add_single_ctl_with_resume(mixer, 0, snd_bbfpro_vol_resume,
++              &knew, NULL);
++}
++
++static int snd_bbfpro_controls_create(struct usb_mixer_interface *mixer)
++{
++      int err, i, o;
++      char name[48];
++
++      static const char * const input[] = {
++              "AN1", "AN2", "IN3", "IN4", "AS1", "AS2", "ADAT3",
++              "ADAT4", "ADAT5", "ADAT6", "ADAT7", "ADAT8"};
++
++      static const char * const output[] = {
++              "AN1", "AN2", "PH3", "PH4", "AS1", "AS2", "ADAT3", "ADAT4",
++              "ADAT5", "ADAT6", "ADAT7", "ADAT8"};
++
++      for (o = 0 ; o < 12 ; ++o) {
++              for (i = 0 ; i < 12 ; ++i) {
++                      // Line routing
++                      snprintf(name, sizeof(name),
++                               "%s-%s-%s Playback Volume",
++                               (i < 2 ? "Mic" : "Line"),
++                               input[i], output[o]);
++                      err = snd_bbfpro_vol_add(mixer, (26 * o + i), name);
++                      if (err < 0)
++                              return err;
++
++                      // PCM routing... yes, it is output remapping
++                      snprintf(name, sizeof(name),
++                               "PCM-%s-%s Playback Volume",
++                               output[i], output[o]);
++                      err = snd_bbfpro_vol_add(mixer, (26 * o + 12 + i),
++                                               name);
++                      if (err < 0)
++                              return err;
++              }
++      }
++
++      // Control Reg 1
++      err = snd_bbfpro_ctl_add(mixer, SND_BBFPRO_CTL_REG1,
++                               SND_BBFPRO_CTL_REG1_CLK_OPTICAL,
++                               "Sample Clock Source");
++      if (err < 0)
++              return err;
++
++      err = snd_bbfpro_ctl_add(mixer, SND_BBFPRO_CTL_REG1,
++                               SND_BBFPRO_CTL_REG1_SPDIF_PRO,
++                               "IEC958 Pro Mask");
++      if (err < 0)
++              return err;
++
++      err = snd_bbfpro_ctl_add(mixer, SND_BBFPRO_CTL_REG1,
++                               SND_BBFPRO_CTL_REG1_SPDIF_EMPH,
++                               "IEC958 Emphasis");
++      if (err < 0)
++              return err;
++
++      err = snd_bbfpro_ctl_add(mixer, SND_BBFPRO_CTL_REG1,
++                               SND_BBFPRO_CTL_REG1_SPDIF_OPTICAL,
++                               "IEC958 Switch");
++      if (err < 0)
++              return err;
++
++      // Control Reg 2
++      err = snd_bbfpro_ctl_add(mixer, SND_BBFPRO_CTL_REG2,
++                               SND_BBFPRO_CTL_REG2_48V_AN1,
++                               "Mic-AN1 48V");
++      if (err < 0)
++              return err;
++
++      err = snd_bbfpro_ctl_add(mixer, SND_BBFPRO_CTL_REG2,
++                               SND_BBFPRO_CTL_REG2_48V_AN2,
++                               "Mic-AN2 48V");
++      if (err < 0)
++              return err;
++
++      err = snd_bbfpro_ctl_add(mixer, SND_BBFPRO_CTL_REG2,
++                               SND_BBFPRO_CTL_REG2_SENS_IN3,
++                               "Line-IN3 Sens.");
++      if (err < 0)
++              return err;
++
++      err = snd_bbfpro_ctl_add(mixer, SND_BBFPRO_CTL_REG2,
++                               SND_BBFPRO_CTL_REG2_SENS_IN4,
++                               "Line-IN4 Sens.");
++      if (err < 0)
++              return err;
++
++      err = snd_bbfpro_ctl_add(mixer, SND_BBFPRO_CTL_REG2,
++                               SND_BBFPRO_CTL_REG2_PAD_AN1,
++                               "Mic-AN1 PAD");
++      if (err < 0)
++              return err;
++
++      err = snd_bbfpro_ctl_add(mixer, SND_BBFPRO_CTL_REG2,
++                               SND_BBFPRO_CTL_REG2_PAD_AN2,
++                               "Mic-AN2 PAD");
++      if (err < 0)
++              return err;
++
++      return 0;
++}
++
+ int snd_usb_mixer_apply_create_quirk(struct usb_mixer_interface *mixer)
+ {
+       int err = 0;
+@@ -2286,6 +2701,9 @@ int snd_usb_mixer_apply_create_quirk(struct usb_mixer_interface *mixer)
+       case USB_ID(0x0194f, 0x010c): /* Presonus Studio 1810c */
+               err = snd_sc1810_init_mixer(mixer);
+               break;
++      case USB_ID(0x2a39, 0x3fb0): /* RME Babyface Pro FS */
++              err = snd_bbfpro_controls_create(mixer);
++              break;
+       }
+       return err;
+-- 
+2.25.1
+
diff --git a/queue-5.7/apparmor-check-put-label-on-apparmor_sk_clone_securi.patch b/queue-5.7/apparmor-check-put-label-on-apparmor_sk_clone_securi.patch
new file mode 100644 (file)
index 0000000..02d978b
--- /dev/null
@@ -0,0 +1,194 @@
+From c24f1d86ddb75e584be7a2b7884932a8bb4119eb Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 2 Jun 2020 18:15:16 -0300
+Subject: apparmor: check/put label on apparmor_sk_clone_security()
+
+From: Mauricio Faria de Oliveira <mfo@canonical.com>
+
+[ Upstream commit 3b646abc5bc6c0df649daea4c2c976bd4d47e4c8 ]
+
+Currently apparmor_sk_clone_security() does not check for existing
+label/peer in the 'new' struct sock; it just overwrites it, if any
+(with another reference to the label of the source sock.)
+
+    static void apparmor_sk_clone_security(const struct sock *sk,
+                                           struct sock *newsk)
+    {
+            struct aa_sk_ctx *ctx = SK_CTX(sk);
+            struct aa_sk_ctx *new = SK_CTX(newsk);
+
+            new->label = aa_get_label(ctx->label);
+            new->peer = aa_get_label(ctx->peer);
+    }
+
+This might leak label references, which might overflow under load.
+Thus, check for and put labels, to prevent such errors.
+
+Note this is similarly done on:
+
+    static int apparmor_socket_post_create(struct socket *sock, ...)
+    ...
+            if (sock->sk) {
+                    struct aa_sk_ctx *ctx = SK_CTX(sock->sk);
+
+                    aa_put_label(ctx->label);
+                    ctx->label = aa_get_label(label);
+            }
+    ...
+
+Context:
+-------
+
+The label reference count leak is observed if apparmor_sock_graft()
+is called previously: this sets the 'ctx->label' field by getting
+a reference to the current label (later overwritten, without put.)
+
+    static void apparmor_sock_graft(struct sock *sk, ...)
+    {
+            struct aa_sk_ctx *ctx = SK_CTX(sk);
+
+            if (!ctx->label)
+                    ctx->label = aa_get_current_label();
+    }
+
+And that is the case on crypto/af_alg.c:af_alg_accept():
+
+    int af_alg_accept(struct sock *sk, struct socket *newsock, ...)
+    ...
+            struct sock *sk2;
+            ...
+            sk2 = sk_alloc(...);
+            ...
+            security_sock_graft(sk2, newsock);
+            security_sk_clone(sk, sk2);
+    ...
+
+Apparently both calls are done on their own right, especially for
+other LSMs, being introduced in 2010/2014, before apparmor socket
+mediation in 2017 (see commits [1,2,3,4]).
+
+So, it looks OK there! Let's fix the reference leak in apparmor.
+
+Test-case:
+---------
+
+Exercise that code path enough to overflow label reference count.
+
+    $ cat aa-refcnt-af_alg.c
+    #include <stdio.h>
+    #include <string.h>
+    #include <unistd.h>
+    #include <sys/socket.h>
+    #include <linux/if_alg.h>
+
+    int main() {
+            int sockfd;
+            struct sockaddr_alg sa;
+
+            /* Setup the crypto API socket */
+            sockfd = socket(AF_ALG, SOCK_SEQPACKET, 0);
+            if (sockfd < 0) {
+                    perror("socket");
+                    return 1;
+            }
+
+            memset(&sa, 0, sizeof(sa));
+            sa.salg_family = AF_ALG;
+            strcpy((char *) sa.salg_type, "rng");
+            strcpy((char *) sa.salg_name, "stdrng");
+
+            if (bind(sockfd, (struct sockaddr *) &sa, sizeof(sa)) < 0) {
+                    perror("bind");
+                    return 1;
+            }
+
+            /* Accept a "connection" and close it; repeat. */
+            while (!close(accept(sockfd, NULL, 0)));
+
+            return 0;
+    }
+
+    $ gcc -o aa-refcnt-af_alg aa-refcnt-af_alg.c
+
+    $ ./aa-refcnt-af_alg
+    <a few hours later>
+
+    [ 9928.475953] refcount_t overflow at apparmor_sk_clone_security+0x37/0x70 in aa-refcnt-af_alg[1322], uid/euid: 1000/1000
+    ...
+    [ 9928.507443] RIP: 0010:apparmor_sk_clone_security+0x37/0x70
+    ...
+    [ 9928.514286]  security_sk_clone+0x33/0x50
+    [ 9928.514807]  af_alg_accept+0x81/0x1c0 [af_alg]
+    [ 9928.516091]  alg_accept+0x15/0x20 [af_alg]
+    [ 9928.516682]  SYSC_accept4+0xff/0x210
+    [ 9928.519609]  SyS_accept+0x10/0x20
+    [ 9928.520190]  do_syscall_64+0x73/0x130
+    [ 9928.520808]  entry_SYSCALL_64_after_hwframe+0x3d/0xa2
+
+Note that other messages may be seen, not just overflow, depending on
+the value being incremented by kref_get(); on another run:
+
+    [ 7273.182666] refcount_t: saturated; leaking memory.
+    ...
+    [ 7273.185789] refcount_t: underflow; use-after-free.
+
+Kprobes:
+-------
+
+Using kprobe events to monitor sk -> sk_security -> label -> count (kref):
+
+Original v5.7 (one reference leak every iteration)
+
+ ... (af_alg_accept+0x0/0x1c0) label=0xffff8a0f36c25eb0 label_refcnt=0x11fd2
+ ... (af_alg_release_parent+0x0/0xd0) label=0xffff8a0f36c25eb0 label_refcnt=0x11fd4
+ ... (af_alg_accept+0x0/0x1c0) label=0xffff8a0f36c25eb0 label_refcnt=0x11fd3
+ ... (af_alg_release_parent+0x0/0xd0) label=0xffff8a0f36c25eb0 label_refcnt=0x11fd5
+ ... (af_alg_accept+0x0/0x1c0) label=0xffff8a0f36c25eb0 label_refcnt=0x11fd4
+ ... (af_alg_release_parent+0x0/0xd0) label=0xffff8a0f36c25eb0 label_refcnt=0x11fd6
+
+Patched v5.7 (zero reference leak per iteration)
+
+ ... (af_alg_accept+0x0/0x1c0) label=0xffff9ff376c25eb0 label_refcnt=0x593
+ ... (af_alg_release_parent+0x0/0xd0) label=0xffff9ff376c25eb0 label_refcnt=0x594
+ ... (af_alg_accept+0x0/0x1c0) label=0xffff9ff376c25eb0 label_refcnt=0x593
+ ... (af_alg_release_parent+0x0/0xd0) label=0xffff9ff376c25eb0 label_refcnt=0x594
+ ... (af_alg_accept+0x0/0x1c0) label=0xffff9ff376c25eb0 label_refcnt=0x593
+ ... (af_alg_release_parent+0x0/0xd0) label=0xffff9ff376c25eb0 label_refcnt=0x594
+
+Commits:
+-------
+
+[1] commit 507cad355fc9 ("crypto: af_alg - Make sure sk_security is initialized on accept()ed sockets")
+[2] commit 4c63f83c2c2e ("crypto: af_alg - properly label AF_ALG socket")
+[3] commit 2acce6aa9f65 ("Networking") a.k.a ("crypto: af_alg - Avoid sock_graft call warning)
+[4] commit 56974a6fcfef ("apparmor: add base infastructure for socket mediation")
+
+Fixes: 56974a6fcfef ("apparmor: add base infastructure for socket mediation")
+Reported-by: Brian Moyles <bmoyles@netflix.com>
+Signed-off-by: Mauricio Faria de Oliveira <mfo@canonical.com>
+Signed-off-by: John Johansen <john.johansen@canonical.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ security/apparmor/lsm.c | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+diff --git a/security/apparmor/lsm.c b/security/apparmor/lsm.c
+index b621ad74f54a7..66a8504c8bea9 100644
+--- a/security/apparmor/lsm.c
++++ b/security/apparmor/lsm.c
+@@ -804,7 +804,12 @@ static void apparmor_sk_clone_security(const struct sock *sk,
+       struct aa_sk_ctx *ctx = SK_CTX(sk);
+       struct aa_sk_ctx *new = SK_CTX(newsk);
++      if (new->label)
++              aa_put_label(new->label);
+       new->label = aa_get_label(ctx->label);
++
++      if (new->peer)
++              aa_put_label(new->peer);
+       new->peer = aa_get_label(ctx->peer);
+ }
+-- 
+2.25.1
+
diff --git a/queue-5.7/apparmor-fix-introspection-of-of-task-mode-for-uncon.patch b/queue-5.7/apparmor-fix-introspection-of-of-task-mode-for-uncon.patch
new file mode 100644 (file)
index 0000000..7534f44
--- /dev/null
@@ -0,0 +1,63 @@
+From 0c83b63a7167e27632762065c87c4a4750cf6058 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 5 Jun 2020 18:12:21 -0700
+Subject: apparmor: fix introspection of of task mode for unconfined tasks
+
+From: John Johansen <john.johansen@canonical.com>
+
+[ Upstream commit dd2569fbb053719f7df7ef8fdbb45cf47156a701 ]
+
+Fix two issues with introspecting the task mode.
+
+1. If a task is attached to a unconfined profile that is not the
+   ns->unconfined profile then. Mode the mode is always reported
+   as -
+
+      $ ps -Z
+      LABEL                               PID TTY          TIME CMD
+      unconfined                         1287 pts/0    00:00:01 bash
+      test (-)                           1892 pts/0    00:00:00 ps
+
+   instead of the correct value of (unconfined) as shown below
+
+      $ ps -Z
+      LABEL                               PID TTY          TIME CMD
+      unconfined                         2483 pts/0    00:00:01 bash
+      test (unconfined)                  3591 pts/0    00:00:00 ps
+
+2. if a task is confined by a stack of profiles that are unconfined
+   the output of label mode is again the incorrect value of (-) like
+   above, instead of (unconfined). This is because the visibile
+   profile count increment is skipped by the special casing of
+   unconfined.
+
+Fixes: f1bd904175e8 ("apparmor: add the base fns() for domain labels")
+Signed-off-by: John Johansen <john.johansen@canonical.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ security/apparmor/label.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/security/apparmor/label.c b/security/apparmor/label.c
+index 470693239e64f..6c3acae701efd 100644
+--- a/security/apparmor/label.c
++++ b/security/apparmor/label.c
+@@ -1531,13 +1531,13 @@ static const char *label_modename(struct aa_ns *ns, struct aa_label *label,
+       label_for_each(i, label, profile) {
+               if (aa_ns_visible(ns, profile->ns, flags & FLAG_VIEW_SUBNS)) {
+-                      if (profile->mode == APPARMOR_UNCONFINED)
++                      count++;
++                      if (profile == profile->ns->unconfined)
+                               /* special case unconfined so stacks with
+                                * unconfined don't report as mixed. ie.
+                                * profile_foo//&:ns1:unconfined (mixed)
+                                */
+                               continue;
+-                      count++;
+                       if (mode == -1)
+                               mode = profile->mode;
+                       else if (mode != profile->mode)
+-- 
+2.25.1
+
diff --git a/queue-5.7/apparmor-fix-nnp-subset-test-for-unconfined.patch b/queue-5.7/apparmor-fix-nnp-subset-test-for-unconfined.patch
new file mode 100644 (file)
index 0000000..16d53dd
--- /dev/null
@@ -0,0 +1,125 @@
+From a4388d729666910fb3acd0671c9d6d5391125e29 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 25 Sep 2019 08:02:48 -0700
+Subject: apparmor: fix nnp subset test for unconfined
+
+From: John Johansen <john.johansen@canonical.com>
+
+[ Upstream commit 3ed4aaa94fc07db3cd0c91be95e3e1b9782a2710 ]
+
+The subset test is not taking into account the unconfined exception
+which will cause profile transitions in the stacked confinement
+case to fail when no_new_privs is applied.
+
+This fixes a regression introduced in the fix for
+https://bugs.launchpad.net/bugs/1839037
+
+BugLink: https://bugs.launchpad.net/bugs/1844186
+Signed-off-by: John Johansen <john.johansen@canonical.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ security/apparmor/domain.c        |  9 +++++----
+ security/apparmor/include/label.h |  1 +
+ security/apparmor/label.c         | 33 +++++++++++++++++++++++++++++++
+ 3 files changed, 39 insertions(+), 4 deletions(-)
+
+diff --git a/security/apparmor/domain.c b/security/apparmor/domain.c
+index a84ef030fbd7d..4cfa58c077780 100644
+--- a/security/apparmor/domain.c
++++ b/security/apparmor/domain.c
+@@ -929,7 +929,8 @@ int apparmor_bprm_set_creds(struct linux_binprm *bprm)
+        * aways results in a further reduction of permissions.
+        */
+       if ((bprm->unsafe & LSM_UNSAFE_NO_NEW_PRIVS) &&
+-          !unconfined(label) && !aa_label_is_subset(new, ctx->nnp)) {
++          !unconfined(label) &&
++          !aa_label_is_unconfined_subset(new, ctx->nnp)) {
+               error = -EPERM;
+               info = "no new privs";
+               goto audit;
+@@ -1207,7 +1208,7 @@ int aa_change_hat(const char *hats[], int count, u64 token, int flags)
+                * reduce restrictions.
+                */
+               if (task_no_new_privs(current) && !unconfined(label) &&
+-                  !aa_label_is_subset(new, ctx->nnp)) {
++                  !aa_label_is_unconfined_subset(new, ctx->nnp)) {
+                       /* not an apparmor denial per se, so don't log it */
+                       AA_DEBUG("no_new_privs - change_hat denied");
+                       error = -EPERM;
+@@ -1228,7 +1229,7 @@ int aa_change_hat(const char *hats[], int count, u64 token, int flags)
+                * reduce restrictions.
+                */
+               if (task_no_new_privs(current) && !unconfined(label) &&
+-                  !aa_label_is_subset(previous, ctx->nnp)) {
++                  !aa_label_is_unconfined_subset(previous, ctx->nnp)) {
+                       /* not an apparmor denial per se, so don't log it */
+                       AA_DEBUG("no_new_privs - change_hat denied");
+                       error = -EPERM;
+@@ -1423,7 +1424,7 @@ check:
+                * reduce restrictions.
+                */
+               if (task_no_new_privs(current) && !unconfined(label) &&
+-                  !aa_label_is_subset(new, ctx->nnp)) {
++                  !aa_label_is_unconfined_subset(new, ctx->nnp)) {
+                       /* not an apparmor denial per se, so don't log it */
+                       AA_DEBUG("no_new_privs - change_hat denied");
+                       error = -EPERM;
+diff --git a/security/apparmor/include/label.h b/security/apparmor/include/label.h
+index 47942c4ba7ca7..255764ab06e2f 100644
+--- a/security/apparmor/include/label.h
++++ b/security/apparmor/include/label.h
+@@ -281,6 +281,7 @@ bool aa_label_init(struct aa_label *label, int size, gfp_t gfp);
+ struct aa_label *aa_label_alloc(int size, struct aa_proxy *proxy, gfp_t gfp);
+ bool aa_label_is_subset(struct aa_label *set, struct aa_label *sub);
++bool aa_label_is_unconfined_subset(struct aa_label *set, struct aa_label *sub);
+ struct aa_profile *__aa_label_next_not_in_set(struct label_it *I,
+                                            struct aa_label *set,
+                                            struct aa_label *sub);
+diff --git a/security/apparmor/label.c b/security/apparmor/label.c
+index 6c3acae701efd..5f324d63ceaa3 100644
+--- a/security/apparmor/label.c
++++ b/security/apparmor/label.c
+@@ -550,6 +550,39 @@ bool aa_label_is_subset(struct aa_label *set, struct aa_label *sub)
+       return __aa_label_next_not_in_set(&i, set, sub) == NULL;
+ }
++/**
++ * aa_label_is_unconfined_subset - test if @sub is a subset of @set
++ * @set: label to test against
++ * @sub: label to test if is subset of @set
++ *
++ * This checks for subset but taking into account unconfined. IF
++ * @sub contains an unconfined profile that does not have a matching
++ * unconfined in @set then this will not cause the test to fail.
++ * Conversely we don't care about an unconfined in @set that is not in
++ * @sub
++ *
++ * Returns: true if @sub is special_subset of @set
++ *     else false
++ */
++bool aa_label_is_unconfined_subset(struct aa_label *set, struct aa_label *sub)
++{
++      struct label_it i = { };
++      struct aa_profile *p;
++
++      AA_BUG(!set);
++      AA_BUG(!sub);
++
++      if (sub == set)
++              return true;
++
++      do {
++              p = __aa_label_next_not_in_set(&i, set, sub);
++              if (p && !profile_unconfined(p))
++                      break;
++      } while (p);
++
++      return p == NULL;
++}
+ /**
+-- 
+2.25.1
+
diff --git a/queue-5.7/arm-davinci-fix-build-failure-without-i2c.patch b/queue-5.7/arm-davinci-fix-build-failure-without-i2c.patch
new file mode 100644 (file)
index 0000000..0cf2e05
--- /dev/null
@@ -0,0 +1,82 @@
+From f34e5bf39810dddda4dbc95abe6414699004686f Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 27 May 2020 15:37:34 +0200
+Subject: ARM: davinci: fix build failure without I2C
+
+From: Arnd Bergmann <arnd@arndb.de>
+
+[ Upstream commit 147922f91965e734664374a3f226adfeaa586d72 ]
+
+The two supplies are referenced outside of #ifdef CONFIG_I2C but
+defined inside, which breaks the build if that is not built-in:
+
+mach-davinci/board-dm644x-evm.c:861:21: error: use of undeclared identifier 'fixed_supplies_1_8v'
+                                     ARRAY_SIZE(fixed_supplies_1_8v), 1800000);
+                                                ^
+mach-davinci/board-dm644x-evm.c:861:21: error: use of undeclared identifier 'fixed_supplies_1_8v'
+mach-davinci/board-dm644x-evm.c:861:21: error: use of undeclared identifier 'fixed_supplies_1_8v'
+mach-davinci/board-dm644x-evm.c:860:49: error: use of undeclared identifier 'fixed_supplies_1_8v'
+        regulator_register_always_on(0, "fixed-dummy", fixed_supplies_1_8v,
+
+I don't know if the regulators are used anywhere without I2C, but
+always registering them seems to be the safe choice here.
+
+On a related note, it might be best to also deal with CONFIG_I2C=m
+across the file, unless this is going to be moved to DT and removed
+really soon anyway.
+
+Link: https://lore.kernel.org/r/20200527133746.643895-1-arnd@arndb.de
+Fixes: 5e06d19694a4 ("ARM: davinci: dm644x-evm: Add Fixed regulators needed for tlv320aic33")
+Signed-off-by: Arnd Bergmann <arnd@arndb.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/arm/mach-davinci/board-dm644x-evm.c | 26 ++++++++++++------------
+ 1 file changed, 13 insertions(+), 13 deletions(-)
+
+diff --git a/arch/arm/mach-davinci/board-dm644x-evm.c b/arch/arm/mach-davinci/board-dm644x-evm.c
+index 3461d12bbfc06..a5d3708fedf68 100644
+--- a/arch/arm/mach-davinci/board-dm644x-evm.c
++++ b/arch/arm/mach-davinci/board-dm644x-evm.c
+@@ -655,19 +655,6 @@ static struct i2c_board_info __initdata i2c_info[] =  {
+       },
+ };
+-/* Fixed regulator support */
+-static struct regulator_consumer_supply fixed_supplies_3_3v[] = {
+-      /* Baseboard 3.3V: 5V -> TPS54310PWP -> 3.3V */
+-      REGULATOR_SUPPLY("AVDD", "1-001b"),
+-      REGULATOR_SUPPLY("DRVDD", "1-001b"),
+-};
+-
+-static struct regulator_consumer_supply fixed_supplies_1_8v[] = {
+-      /* Baseboard 1.8V: 5V -> TPS54310PWP -> 1.8V */
+-      REGULATOR_SUPPLY("IOVDD", "1-001b"),
+-      REGULATOR_SUPPLY("DVDD", "1-001b"),
+-};
+-
+ #define DM644X_I2C_SDA_PIN    GPIO_TO_PIN(2, 12)
+ #define DM644X_I2C_SCL_PIN    GPIO_TO_PIN(2, 11)
+@@ -700,6 +687,19 @@ static void __init evm_init_i2c(void)
+ }
+ #endif
++/* Fixed regulator support */
++static struct regulator_consumer_supply fixed_supplies_3_3v[] = {
++      /* Baseboard 3.3V: 5V -> TPS54310PWP -> 3.3V */
++      REGULATOR_SUPPLY("AVDD", "1-001b"),
++      REGULATOR_SUPPLY("DRVDD", "1-001b"),
++};
++
++static struct regulator_consumer_supply fixed_supplies_1_8v[] = {
++      /* Baseboard 1.8V: 5V -> TPS54310PWP -> 1.8V */
++      REGULATOR_SUPPLY("IOVDD", "1-001b"),
++      REGULATOR_SUPPLY("DVDD", "1-001b"),
++};
++
+ #define VENC_STD_ALL  (V4L2_STD_NTSC | V4L2_STD_PAL)
+ /* venc standard timings */
+-- 
+2.25.1
+
diff --git a/queue-5.7/arm-dts-aspeed-ast2600-set-arch-timer-always-on.patch b/queue-5.7/arm-dts-aspeed-ast2600-set-arch-timer-always-on.patch
new file mode 100644 (file)
index 0000000..779a1e3
--- /dev/null
@@ -0,0 +1,50 @@
+From 412e81f7958a05ea40637fe9f771440f421e8bba Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 26 Mar 2020 09:17:21 -0500
+Subject: ARM: dts: aspeed: ast2600: Set arch timer always-on
+
+From: Eddie James <eajames@linux.ibm.com>
+
+[ Upstream commit c998f40f2ae6a48e93206e2c1ea0691479989611 ]
+
+According to ASPEED, FTTMR010 is not intended to be used in the AST2600.
+The arch timer should be used, but Linux doesn't enable high-res timers
+without being assured that the arch timer is always on, so set that
+property in the devicetree.
+
+The FTTMR010 device is described by set to disabled.
+
+This fixes highres timer support for AST2600.
+
+Fixes: 2ca5646b5c2f ("ARM: dts: aspeed: Add AST2600 and EVB")
+Signed-off-by: Eddie James <eajames@linux.ibm.com>
+Reviewed-by: Joel Stanley <joel@jms.id.au>
+Signed-off-by: Joel Stanley <joel@jms.id.au>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/arm/boot/dts/aspeed-g6.dtsi | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/arch/arm/boot/dts/aspeed-g6.dtsi b/arch/arm/boot/dts/aspeed-g6.dtsi
+index 0a29b3b57a9dc..fd0e483737a0f 100644
+--- a/arch/arm/boot/dts/aspeed-g6.dtsi
++++ b/arch/arm/boot/dts/aspeed-g6.dtsi
+@@ -65,6 +65,7 @@
+                            <GIC_PPI 10 (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_LOW)>;
+               clocks = <&syscon ASPEED_CLK_HPLL>;
+               arm,cpu-registers-not-fw-configured;
++              always-on;
+       };
+       ahb {
+@@ -368,6 +369,7 @@
+                                               <&gic  GIC_SPI 23 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&syscon ASPEED_CLK_APB1>;
+                               clock-names = "PCLK";
++                              status = "disabled";
+                         };
+                       uart1: serial@1e783000 {
+-- 
+2.25.1
+
diff --git a/queue-5.7/arm-dts-aspeed-change-kcs-nodes-to-v2-binding.patch b/queue-5.7/arm-dts-aspeed-change-kcs-nodes-to-v2-binding.patch
new file mode 100644 (file)
index 0000000..72e236e
--- /dev/null
@@ -0,0 +1,147 @@
+From 3ffe3b5e3ed8565edcfa5e4ca2f4f8a9433b5c94 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 11 Apr 2020 11:44:58 +0930
+Subject: ARM: dts: aspeed: Change KCS nodes to v2 binding
+
+From: Andrew Jeffery <andrew@aj.id.au>
+
+[ Upstream commit fa4c8ec6feaa3237f5d44cb8c6d0aa0dff6e1bcc ]
+
+Fixes the following warnings for both g5 and g6 SoCs:
+
+    arch/arm/boot/dts/aspeed-g5.dtsi:376.19-381.8: Warning
+    (unit_address_vs_reg): /ahb/apb/lpc@1e789000/lpc-bmc@0/kcs1@0: node
+    has a unit name, but no reg property
+
+Signed-off-by: Andrew Jeffery <andrew@aj.id.au>
+Signed-off-by: Joel Stanley <joel@jms.id.au>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ .../dts/aspeed-bmc-facebook-tiogapass.dts     |  4 ++--
+ arch/arm/boot/dts/aspeed-g5.dtsi              | 24 +++++++++----------
+ arch/arm/boot/dts/aspeed-g6.dtsi              | 23 +++++++++---------
+ 3 files changed, 26 insertions(+), 25 deletions(-)
+
+diff --git a/arch/arm/boot/dts/aspeed-bmc-facebook-tiogapass.dts b/arch/arm/boot/dts/aspeed-bmc-facebook-tiogapass.dts
+index 5d7cbd9164d41..669980c690f92 100644
+--- a/arch/arm/boot/dts/aspeed-bmc-facebook-tiogapass.dts
++++ b/arch/arm/boot/dts/aspeed-bmc-facebook-tiogapass.dts
+@@ -112,13 +112,13 @@
+ &kcs2 {
+       // BMC KCS channel 2
+       status = "okay";
+-      kcs_addr = <0xca8>;
++      aspeed,lpc-io-reg = <0xca8>;
+ };
+ &kcs3 {
+       // BMC KCS channel 3
+       status = "okay";
+-      kcs_addr = <0xca2>;
++      aspeed,lpc-io-reg = <0xca2>;
+ };
+ &mac0 {
+diff --git a/arch/arm/boot/dts/aspeed-g5.dtsi b/arch/arm/boot/dts/aspeed-g5.dtsi
+index f12ec04d3cbca..bc92d3db7b786 100644
+--- a/arch/arm/boot/dts/aspeed-g5.dtsi
++++ b/arch/arm/boot/dts/aspeed-g5.dtsi
+@@ -426,22 +426,22 @@
+                                       #size-cells = <1>;
+                                       ranges = <0x0 0x0 0x80>;
+-                                      kcs1: kcs1@0 {
+-                                              compatible = "aspeed,ast2500-kcs-bmc";
++                                      kcs1: kcs@24 {
++                                              compatible = "aspeed,ast2500-kcs-bmc-v2";
++                                              reg = <0x24 0x1>, <0x30 0x1>, <0x3c 0x1>;
+                                               interrupts = <8>;
+-                                              kcs_chan = <1>;
+                                               status = "disabled";
+                                       };
+-                                      kcs2: kcs2@0 {
+-                                              compatible = "aspeed,ast2500-kcs-bmc";
++                                      kcs2: kcs@28 {
++                                              compatible = "aspeed,ast2500-kcs-bmc-v2";
++                                              reg = <0x28 0x1>, <0x34 0x1>, <0x40 0x1>;
+                                               interrupts = <8>;
+-                                              kcs_chan = <2>;
+                                               status = "disabled";
+                                       };
+-                                      kcs3: kcs3@0 {
+-                                              compatible = "aspeed,ast2500-kcs-bmc";
++                                      kcs3: kcs@2c {
++                                              compatible = "aspeed,ast2500-kcs-bmc-v2";
++                                              reg = <0x2c 0x1>, <0x38 0x1>, <0x44 0x1>;
+                                               interrupts = <8>;
+-                                              kcs_chan = <3>;
+                                               status = "disabled";
+                                       };
+                               };
+@@ -455,10 +455,10 @@
+                                       #size-cells = <1>;
+                                       ranges = <0x0 0x80 0x1e0>;
+-                                      kcs4: kcs4@0 {
+-                                              compatible = "aspeed,ast2500-kcs-bmc";
++                                      kcs4: kcs@94 {
++                                              compatible = "aspeed,ast2500-kcs-bmc-v2";
++                                              reg = <0x94 0x1>, <0x98 0x1>, <0x9c 0x1>;
+                                               interrupts = <8>;
+-                                              kcs_chan = <4>;
+                                               status = "disabled";
+                                       };
+diff --git a/arch/arm/boot/dts/aspeed-g6.dtsi b/arch/arm/boot/dts/aspeed-g6.dtsi
+index fd0e483737a0f..a2d2ac720a511 100644
+--- a/arch/arm/boot/dts/aspeed-g6.dtsi
++++ b/arch/arm/boot/dts/aspeed-g6.dtsi
+@@ -435,22 +435,23 @@
+                                       #size-cells = <1>;
+                                       ranges = <0x0 0x0 0x80>;
+-                                      kcs1: kcs1@0 {
+-                                              compatible = "aspeed,ast2600-kcs-bmc";
++                                      kcs1: kcs@24 {
++                                              compatible = "aspeed,ast2500-kcs-bmc-v2";
++                                              reg = <0x24 0x1>, <0x30 0x1>, <0x3c 0x1>;
+                                               interrupts = <GIC_SPI 138 IRQ_TYPE_LEVEL_HIGH>;
+                                               kcs_chan = <1>;
+                                               status = "disabled";
+                                       };
+-                                      kcs2: kcs2@0 {
+-                                              compatible = "aspeed,ast2600-kcs-bmc";
++                                      kcs2: kcs@28 {
++                                              compatible = "aspeed,ast2500-kcs-bmc-v2";
++                                              reg = <0x28 0x1>, <0x34 0x1>, <0x40 0x1>;
+                                               interrupts = <GIC_SPI 139 IRQ_TYPE_LEVEL_HIGH>;
+-                                              kcs_chan = <2>;
+                                               status = "disabled";
+                                       };
+-                                      kcs3: kcs3@0 {
+-                                              compatible = "aspeed,ast2600-kcs-bmc";
++                                      kcs3: kcs@2c {
++                                              compatible = "aspeed,ast2500-kcs-bmc-v2";
++                                              reg = <0x2c 0x1>, <0x38 0x1>, <0x44 0x1>;
+                                               interrupts = <GIC_SPI 140 IRQ_TYPE_LEVEL_HIGH>;
+-                                              kcs_chan = <3>;
+                                               status = "disabled";
+                                       };
+                               };
+@@ -464,10 +465,10 @@
+                                       #size-cells = <1>;
+                                       ranges = <0x0 0x80 0x1e0>;
+-                                      kcs4: kcs4@0 {
+-                                              compatible = "aspeed,ast2600-kcs-bmc";
++                                      kcs4: kcs@94 {
++                                              compatible = "aspeed,ast2500-kcs-bmc-v2";
++                                              reg = <0x94 0x1>, <0x98 0x1>, <0x9c 0x1>;
+                                               interrupts = <GIC_SPI 141 IRQ_TYPE_LEVEL_HIGH>;
+-                                              kcs_chan = <4>;
+                                               status = "disabled";
+                                       };
+-- 
+2.25.1
+
diff --git a/queue-5.7/arm-dts-bcm283x-use-firmware-pm-driver-for-v3d.patch b/queue-5.7/arm-dts-bcm283x-use-firmware-pm-driver-for-v3d.patch
new file mode 100644 (file)
index 0000000..04f8113
--- /dev/null
@@ -0,0 +1,95 @@
+From bcb29bd991dfeef13267d749b15ec61d051dc708 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 3 Mar 2020 18:32:16 +0100
+Subject: ARM: dts: bcm283x: Use firmware PM driver for V3D
+
+From: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
+
+[ Upstream commit 3ac395a5b3f3b678663fbb58381fdae2b1b57588 ]
+
+The register based driver turned out to be unstable, specially on RPi3a+
+but not limited to it. While a fix is being worked on, we roll back to
+using firmware based scheme.
+
+Fixes: e1dc2b2e1bef ("ARM: bcm283x: Switch V3D over to using the PM driver instead of firmware")
+Signed-off-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
+Tested-by: Stefan Wahren <stefan.wahren@i2se.com>
+Link: https://lore.kernel.org/r/20200303173217.3987-1-nsaenzjulienne@suse.de
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/arm/boot/dts/bcm2835-common.dtsi     |  1 -
+ arch/arm/boot/dts/bcm2835-rpi-common.dtsi | 12 ++++++++++++
+ arch/arm/boot/dts/bcm2835.dtsi            |  1 +
+ arch/arm/boot/dts/bcm2836.dtsi            |  1 +
+ arch/arm/boot/dts/bcm2837.dtsi            |  1 +
+ 5 files changed, 15 insertions(+), 1 deletion(-)
+ create mode 100644 arch/arm/boot/dts/bcm2835-rpi-common.dtsi
+
+diff --git a/arch/arm/boot/dts/bcm2835-common.dtsi b/arch/arm/boot/dts/bcm2835-common.dtsi
+index 2b1d9d4c0cdea..4119271c979d6 100644
+--- a/arch/arm/boot/dts/bcm2835-common.dtsi
++++ b/arch/arm/boot/dts/bcm2835-common.dtsi
+@@ -130,7 +130,6 @@
+                       compatible = "brcm,bcm2835-v3d";
+                       reg = <0x7ec00000 0x1000>;
+                       interrupts = <1 10>;
+-                      power-domains = <&pm BCM2835_POWER_DOMAIN_GRAFX_V3D>;
+               };
+               vc4: gpu {
+diff --git a/arch/arm/boot/dts/bcm2835-rpi-common.dtsi b/arch/arm/boot/dts/bcm2835-rpi-common.dtsi
+new file mode 100644
+index 0000000000000..8a55b6cded592
+--- /dev/null
++++ b/arch/arm/boot/dts/bcm2835-rpi-common.dtsi
+@@ -0,0 +1,12 @@
++// SPDX-License-Identifier: GPL-2.0
++/*
++ * This include file covers the common peripherals and configuration between
++ * bcm2835, bcm2836 and bcm2837 implementations that interact with RPi's
++ * firmware interface.
++ */
++
++#include <dt-bindings/power/raspberrypi-power.h>
++
++&v3d {
++      power-domains = <&power RPI_POWER_DOMAIN_V3D>;
++};
+diff --git a/arch/arm/boot/dts/bcm2835.dtsi b/arch/arm/boot/dts/bcm2835.dtsi
+index 53bf4579cc224..0549686134ea6 100644
+--- a/arch/arm/boot/dts/bcm2835.dtsi
++++ b/arch/arm/boot/dts/bcm2835.dtsi
+@@ -1,6 +1,7 @@
+ // SPDX-License-Identifier: GPL-2.0
+ #include "bcm283x.dtsi"
+ #include "bcm2835-common.dtsi"
++#include "bcm2835-rpi-common.dtsi"
+ / {
+       compatible = "brcm,bcm2835";
+diff --git a/arch/arm/boot/dts/bcm2836.dtsi b/arch/arm/boot/dts/bcm2836.dtsi
+index 82d6c4662ae49..b390006aef79a 100644
+--- a/arch/arm/boot/dts/bcm2836.dtsi
++++ b/arch/arm/boot/dts/bcm2836.dtsi
+@@ -1,6 +1,7 @@
+ // SPDX-License-Identifier: GPL-2.0
+ #include "bcm283x.dtsi"
+ #include "bcm2835-common.dtsi"
++#include "bcm2835-rpi-common.dtsi"
+ / {
+       compatible = "brcm,bcm2836";
+diff --git a/arch/arm/boot/dts/bcm2837.dtsi b/arch/arm/boot/dts/bcm2837.dtsi
+index 9e95fee78e192..0199ec98cd616 100644
+--- a/arch/arm/boot/dts/bcm2837.dtsi
++++ b/arch/arm/boot/dts/bcm2837.dtsi
+@@ -1,5 +1,6 @@
+ #include "bcm283x.dtsi"
+ #include "bcm2835-common.dtsi"
++#include "bcm2835-rpi-common.dtsi"
+ / {
+       compatible = "brcm,bcm2837";
+-- 
+2.25.1
+
diff --git a/queue-5.7/arm-dts-meson-switch-existing-boards-with-rgmii-phy-.patch b/queue-5.7/arm-dts-meson-switch-existing-boards-with-rgmii-phy-.patch
new file mode 100644 (file)
index 0000000..fb62387
--- /dev/null
@@ -0,0 +1,72 @@
+From f70cd33d4d9e3b6cd379fbbe0ccee7b03343dc24 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 12 May 2020 23:51:48 +0200
+Subject: ARM: dts: meson: Switch existing boards with RGMII PHY to "rgmii-id"
+
+From: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
+
+[ Upstream commit 005231128e9e97461e81fa32421957a7664317ca ]
+
+Let the PHY generate the RX and TX delay on the Odroid-C1 and MXIII
+Plus.
+
+Previously we did not know that these boards used an RX delay. We
+assumed that setting the TX delay on the MAC side It turns out that
+these boards also require an RX delay of 2ns (verified on Odroid-C1,
+but the u-boot code uses the same setup on both boards). Ethernet only
+worked because u-boot added this RX delay on the MAC side.
+
+The 4ns TX delay was also wrong and the result of using an unsupported
+RGMII TX clock divider setting. This has been fixed in the driver with
+commit bd6f48546b9cb7 ("net: stmmac: dwmac-meson8b: Fix the RGMII TX
+delay on Meson8b/8m2 SoCs").
+
+Switch to phy-mode "rgmii-id" to let the PHY side handle all the delays,
+(as recommended by the Ethernet maintainers anyways) to correctly
+describe the need for a 2ns RX as well as 2ns TX delay on these boards.
+This fixes the Ethernet performance on Odroid-C1 where there was a huge
+amount of packet loss when transmitting data due to the incorrect TX
+delay.
+
+Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
+Signed-off-by: Kevin Hilman <khilman@baylibre.com>
+Link: https://lore.kernel.org/r/20200512215148.540322-3-martin.blumenstingl@googlemail.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/arm/boot/dts/meson8b-odroidc1.dts    | 3 +--
+ arch/arm/boot/dts/meson8m2-mxiii-plus.dts | 4 +---
+ 2 files changed, 2 insertions(+), 5 deletions(-)
+
+diff --git a/arch/arm/boot/dts/meson8b-odroidc1.dts b/arch/arm/boot/dts/meson8b-odroidc1.dts
+index a2a47804fc4a8..cb21ac9f517c1 100644
+--- a/arch/arm/boot/dts/meson8b-odroidc1.dts
++++ b/arch/arm/boot/dts/meson8b-odroidc1.dts
+@@ -202,9 +202,8 @@
+       pinctrl-0 = <&eth_rgmii_pins>;
+       pinctrl-names = "default";
+-      phy-mode = "rgmii";
+       phy-handle = <&eth_phy>;
+-      amlogic,tx-delay-ns = <4>;
++      phy-mode = "rgmii-id";
+       nvmem-cells = <&ethernet_mac_address>;
+       nvmem-cell-names = "mac-address";
+diff --git a/arch/arm/boot/dts/meson8m2-mxiii-plus.dts b/arch/arm/boot/dts/meson8m2-mxiii-plus.dts
+index d54477b1001ca..cc498191ddd1d 100644
+--- a/arch/arm/boot/dts/meson8m2-mxiii-plus.dts
++++ b/arch/arm/boot/dts/meson8m2-mxiii-plus.dts
+@@ -69,9 +69,7 @@
+       pinctrl-names = "default";
+       phy-handle = <&eth_phy0>;
+-      phy-mode = "rgmii";
+-
+-      amlogic,tx-delay-ns = <4>;
++      phy-mode = "rgmii-id";
+       mdio {
+               compatible = "snps,dwmac-mdio";
+-- 
+2.25.1
+
diff --git a/queue-5.7/arm-dts-renesas-fix-iommu-device-node-names.patch b/queue-5.7/arm-dts-renesas-fix-iommu-device-node-names.patch
new file mode 100644 (file)
index 0000000..5b295b3
--- /dev/null
@@ -0,0 +1,463 @@
+From e0d7280457c90c356be8716fe9769d2f4173ddf7 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 21 Apr 2020 18:35:56 +0900
+Subject: ARM: dts: renesas: Fix IOMMU device node names
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
+
+[ Upstream commit ae990a1de014396ffc8d0fcc31b6888c9b0ce59a ]
+
+Fix IOMMU device node names as "iommu@".
+
+Fixes: bbb44da0b595 ("ARM: dts: r8a7743: Add IPMMU DT nodes")
+Fixes: 0dcba3de5835 ("ARM: dts: r8a7745: Add IPMMU DT nodes")
+Fixes: 350ae49b97c4 ("ARM: dts: r8a7744: Add IPMMU DT nodes")
+Fixes: 70496727c082 ("ARM: shmobile: r8a7790: Add IPMMU DT nodes")
+Fixes: f1951852ed17 ("ARM: shmobile: r8a7791: Add IPMMU DT nodes")
+Fixes: 098cb3a601e6 ("ARM: shmobile: r8a7793: Add IPMMU nodes")
+Fixes: 1cb2794f6082 ("ARM: shmobile: r8a7794: Add IPMMU DT nodes")
+Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
+Reviewed-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
+Link: https://lore.kernel.org/r/1587461756-13317-1-git-send-email-yoshihiro.shimoda.uh@renesas.com
+Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/arm/boot/dts/r8a7743.dtsi | 12 ++++++------
+ arch/arm/boot/dts/r8a7744.dtsi | 12 ++++++------
+ arch/arm/boot/dts/r8a7745.dtsi | 12 ++++++------
+ arch/arm/boot/dts/r8a7790.dtsi | 12 ++++++------
+ arch/arm/boot/dts/r8a7791.dtsi | 14 +++++++-------
+ arch/arm/boot/dts/r8a7793.dtsi | 14 +++++++-------
+ arch/arm/boot/dts/r8a7794.dtsi | 12 ++++++------
+ 7 files changed, 44 insertions(+), 44 deletions(-)
+
+diff --git a/arch/arm/boot/dts/r8a7743.dtsi b/arch/arm/boot/dts/r8a7743.dtsi
+index e8b340bb99bc3..fff123753b85b 100644
+--- a/arch/arm/boot/dts/r8a7743.dtsi
++++ b/arch/arm/boot/dts/r8a7743.dtsi
+@@ -338,7 +338,7 @@
+                       #thermal-sensor-cells = <0>;
+               };
+-              ipmmu_sy0: mmu@e6280000 {
++              ipmmu_sy0: iommu@e6280000 {
+                       compatible = "renesas,ipmmu-r8a7743",
+                                    "renesas,ipmmu-vmsa";
+                       reg = <0 0xe6280000 0 0x1000>;
+@@ -348,7 +348,7 @@
+                       status = "disabled";
+               };
+-              ipmmu_sy1: mmu@e6290000 {
++              ipmmu_sy1: iommu@e6290000 {
+                       compatible = "renesas,ipmmu-r8a7743",
+                                    "renesas,ipmmu-vmsa";
+                       reg = <0 0xe6290000 0 0x1000>;
+@@ -357,7 +357,7 @@
+                       status = "disabled";
+               };
+-              ipmmu_ds: mmu@e6740000 {
++              ipmmu_ds: iommu@e6740000 {
+                       compatible = "renesas,ipmmu-r8a7743",
+                                    "renesas,ipmmu-vmsa";
+                       reg = <0 0xe6740000 0 0x1000>;
+@@ -367,7 +367,7 @@
+                       status = "disabled";
+               };
+-              ipmmu_mp: mmu@ec680000 {
++              ipmmu_mp: iommu@ec680000 {
+                       compatible = "renesas,ipmmu-r8a7743",
+                                    "renesas,ipmmu-vmsa";
+                       reg = <0 0xec680000 0 0x1000>;
+@@ -376,7 +376,7 @@
+                       status = "disabled";
+               };
+-              ipmmu_mx: mmu@fe951000 {
++              ipmmu_mx: iommu@fe951000 {
+                       compatible = "renesas,ipmmu-r8a7743",
+                                    "renesas,ipmmu-vmsa";
+                       reg = <0 0xfe951000 0 0x1000>;
+@@ -386,7 +386,7 @@
+                       status = "disabled";
+               };
+-              ipmmu_gp: mmu@e62a0000 {
++              ipmmu_gp: iommu@e62a0000 {
+                       compatible = "renesas,ipmmu-r8a7743",
+                                    "renesas,ipmmu-vmsa";
+                       reg = <0 0xe62a0000 0 0x1000>;
+diff --git a/arch/arm/boot/dts/r8a7744.dtsi b/arch/arm/boot/dts/r8a7744.dtsi
+index def840b8b2d3c..5050ac19041d5 100644
+--- a/arch/arm/boot/dts/r8a7744.dtsi
++++ b/arch/arm/boot/dts/r8a7744.dtsi
+@@ -338,7 +338,7 @@
+                       #thermal-sensor-cells = <0>;
+               };
+-              ipmmu_sy0: mmu@e6280000 {
++              ipmmu_sy0: iommu@e6280000 {
+                       compatible = "renesas,ipmmu-r8a7744",
+                                    "renesas,ipmmu-vmsa";
+                       reg = <0 0xe6280000 0 0x1000>;
+@@ -348,7 +348,7 @@
+                       status = "disabled";
+               };
+-              ipmmu_sy1: mmu@e6290000 {
++              ipmmu_sy1: iommu@e6290000 {
+                       compatible = "renesas,ipmmu-r8a7744",
+                                    "renesas,ipmmu-vmsa";
+                       reg = <0 0xe6290000 0 0x1000>;
+@@ -357,7 +357,7 @@
+                       status = "disabled";
+               };
+-              ipmmu_ds: mmu@e6740000 {
++              ipmmu_ds: iommu@e6740000 {
+                       compatible = "renesas,ipmmu-r8a7744",
+                                    "renesas,ipmmu-vmsa";
+                       reg = <0 0xe6740000 0 0x1000>;
+@@ -367,7 +367,7 @@
+                       status = "disabled";
+               };
+-              ipmmu_mp: mmu@ec680000 {
++              ipmmu_mp: iommu@ec680000 {
+                       compatible = "renesas,ipmmu-r8a7744",
+                                    "renesas,ipmmu-vmsa";
+                       reg = <0 0xec680000 0 0x1000>;
+@@ -376,7 +376,7 @@
+                       status = "disabled";
+               };
+-              ipmmu_mx: mmu@fe951000 {
++              ipmmu_mx: iommu@fe951000 {
+                       compatible = "renesas,ipmmu-r8a7744",
+                                    "renesas,ipmmu-vmsa";
+                       reg = <0 0xfe951000 0 0x1000>;
+@@ -386,7 +386,7 @@
+                       status = "disabled";
+               };
+-              ipmmu_gp: mmu@e62a0000 {
++              ipmmu_gp: iommu@e62a0000 {
+                       compatible = "renesas,ipmmu-r8a7744",
+                                    "renesas,ipmmu-vmsa";
+                       reg = <0 0xe62a0000 0 0x1000>;
+diff --git a/arch/arm/boot/dts/r8a7745.dtsi b/arch/arm/boot/dts/r8a7745.dtsi
+index 7ab58d8bb7401..b0d1fc24e97e4 100644
+--- a/arch/arm/boot/dts/r8a7745.dtsi
++++ b/arch/arm/boot/dts/r8a7745.dtsi
+@@ -302,7 +302,7 @@
+                       resets = <&cpg 407>;
+               };
+-              ipmmu_sy0: mmu@e6280000 {
++              ipmmu_sy0: iommu@e6280000 {
+                       compatible = "renesas,ipmmu-r8a7745",
+                                    "renesas,ipmmu-vmsa";
+                       reg = <0 0xe6280000 0 0x1000>;
+@@ -312,7 +312,7 @@
+                       status = "disabled";
+               };
+-              ipmmu_sy1: mmu@e6290000 {
++              ipmmu_sy1: iommu@e6290000 {
+                       compatible = "renesas,ipmmu-r8a7745",
+                                    "renesas,ipmmu-vmsa";
+                       reg = <0 0xe6290000 0 0x1000>;
+@@ -321,7 +321,7 @@
+                       status = "disabled";
+               };
+-              ipmmu_ds: mmu@e6740000 {
++              ipmmu_ds: iommu@e6740000 {
+                       compatible = "renesas,ipmmu-r8a7745",
+                                    "renesas,ipmmu-vmsa";
+                       reg = <0 0xe6740000 0 0x1000>;
+@@ -331,7 +331,7 @@
+                       status = "disabled";
+               };
+-              ipmmu_mp: mmu@ec680000 {
++              ipmmu_mp: iommu@ec680000 {
+                       compatible = "renesas,ipmmu-r8a7745",
+                                    "renesas,ipmmu-vmsa";
+                       reg = <0 0xec680000 0 0x1000>;
+@@ -340,7 +340,7 @@
+                       status = "disabled";
+               };
+-              ipmmu_mx: mmu@fe951000 {
++              ipmmu_mx: iommu@fe951000 {
+                       compatible = "renesas,ipmmu-r8a7745",
+                                    "renesas,ipmmu-vmsa";
+                       reg = <0 0xfe951000 0 0x1000>;
+@@ -350,7 +350,7 @@
+                       status = "disabled";
+               };
+-              ipmmu_gp: mmu@e62a0000 {
++              ipmmu_gp: iommu@e62a0000 {
+                       compatible = "renesas,ipmmu-r8a7745",
+                                    "renesas,ipmmu-vmsa";
+                       reg = <0 0xe62a0000 0 0x1000>;
+diff --git a/arch/arm/boot/dts/r8a7790.dtsi b/arch/arm/boot/dts/r8a7790.dtsi
+index e5ef9fd4284ae..166d5566229d4 100644
+--- a/arch/arm/boot/dts/r8a7790.dtsi
++++ b/arch/arm/boot/dts/r8a7790.dtsi
+@@ -427,7 +427,7 @@
+                       #thermal-sensor-cells = <0>;
+               };
+-              ipmmu_sy0: mmu@e6280000 {
++              ipmmu_sy0: iommu@e6280000 {
+                       compatible = "renesas,ipmmu-r8a7790",
+                                    "renesas,ipmmu-vmsa";
+                       reg = <0 0xe6280000 0 0x1000>;
+@@ -437,7 +437,7 @@
+                       status = "disabled";
+               };
+-              ipmmu_sy1: mmu@e6290000 {
++              ipmmu_sy1: iommu@e6290000 {
+                       compatible = "renesas,ipmmu-r8a7790",
+                                    "renesas,ipmmu-vmsa";
+                       reg = <0 0xe6290000 0 0x1000>;
+@@ -446,7 +446,7 @@
+                       status = "disabled";
+               };
+-              ipmmu_ds: mmu@e6740000 {
++              ipmmu_ds: iommu@e6740000 {
+                       compatible = "renesas,ipmmu-r8a7790",
+                                    "renesas,ipmmu-vmsa";
+                       reg = <0 0xe6740000 0 0x1000>;
+@@ -456,7 +456,7 @@
+                       status = "disabled";
+               };
+-              ipmmu_mp: mmu@ec680000 {
++              ipmmu_mp: iommu@ec680000 {
+                       compatible = "renesas,ipmmu-r8a7790",
+                                    "renesas,ipmmu-vmsa";
+                       reg = <0 0xec680000 0 0x1000>;
+@@ -465,7 +465,7 @@
+                       status = "disabled";
+               };
+-              ipmmu_mx: mmu@fe951000 {
++              ipmmu_mx: iommu@fe951000 {
+                       compatible = "renesas,ipmmu-r8a7790",
+                                    "renesas,ipmmu-vmsa";
+                       reg = <0 0xfe951000 0 0x1000>;
+@@ -475,7 +475,7 @@
+                       status = "disabled";
+               };
+-              ipmmu_rt: mmu@ffc80000 {
++              ipmmu_rt: iommu@ffc80000 {
+                       compatible = "renesas,ipmmu-r8a7790",
+                                    "renesas,ipmmu-vmsa";
+                       reg = <0 0xffc80000 0 0x1000>;
+diff --git a/arch/arm/boot/dts/r8a7791.dtsi b/arch/arm/boot/dts/r8a7791.dtsi
+index 6e5bd86731cde..09e47cc177650 100644
+--- a/arch/arm/boot/dts/r8a7791.dtsi
++++ b/arch/arm/boot/dts/r8a7791.dtsi
+@@ -350,7 +350,7 @@
+                       #thermal-sensor-cells = <0>;
+               };
+-              ipmmu_sy0: mmu@e6280000 {
++              ipmmu_sy0: iommu@e6280000 {
+                       compatible = "renesas,ipmmu-r8a7791",
+                                    "renesas,ipmmu-vmsa";
+                       reg = <0 0xe6280000 0 0x1000>;
+@@ -360,7 +360,7 @@
+                       status = "disabled";
+               };
+-              ipmmu_sy1: mmu@e6290000 {
++              ipmmu_sy1: iommu@e6290000 {
+                       compatible = "renesas,ipmmu-r8a7791",
+                                    "renesas,ipmmu-vmsa";
+                       reg = <0 0xe6290000 0 0x1000>;
+@@ -369,7 +369,7 @@
+                       status = "disabled";
+               };
+-              ipmmu_ds: mmu@e6740000 {
++              ipmmu_ds: iommu@e6740000 {
+                       compatible = "renesas,ipmmu-r8a7791",
+                                    "renesas,ipmmu-vmsa";
+                       reg = <0 0xe6740000 0 0x1000>;
+@@ -379,7 +379,7 @@
+                       status = "disabled";
+               };
+-              ipmmu_mp: mmu@ec680000 {
++              ipmmu_mp: iommu@ec680000 {
+                       compatible = "renesas,ipmmu-r8a7791",
+                                    "renesas,ipmmu-vmsa";
+                       reg = <0 0xec680000 0 0x1000>;
+@@ -388,7 +388,7 @@
+                       status = "disabled";
+               };
+-              ipmmu_mx: mmu@fe951000 {
++              ipmmu_mx: iommu@fe951000 {
+                       compatible = "renesas,ipmmu-r8a7791",
+                                    "renesas,ipmmu-vmsa";
+                       reg = <0 0xfe951000 0 0x1000>;
+@@ -398,7 +398,7 @@
+                       status = "disabled";
+               };
+-              ipmmu_rt: mmu@ffc80000 {
++              ipmmu_rt: iommu@ffc80000 {
+                       compatible = "renesas,ipmmu-r8a7791",
+                                    "renesas,ipmmu-vmsa";
+                       reg = <0 0xffc80000 0 0x1000>;
+@@ -407,7 +407,7 @@
+                       status = "disabled";
+               };
+-              ipmmu_gp: mmu@e62a0000 {
++              ipmmu_gp: iommu@e62a0000 {
+                       compatible = "renesas,ipmmu-r8a7791",
+                                    "renesas,ipmmu-vmsa";
+                       reg = <0 0xe62a0000 0 0x1000>;
+diff --git a/arch/arm/boot/dts/r8a7793.dtsi b/arch/arm/boot/dts/r8a7793.dtsi
+index dadbda16161b7..1b62a7e06b429 100644
+--- a/arch/arm/boot/dts/r8a7793.dtsi
++++ b/arch/arm/boot/dts/r8a7793.dtsi
+@@ -336,7 +336,7 @@
+                       #thermal-sensor-cells = <0>;
+               };
+-              ipmmu_sy0: mmu@e6280000 {
++              ipmmu_sy0: iommu@e6280000 {
+                       compatible = "renesas,ipmmu-r8a7793",
+                                    "renesas,ipmmu-vmsa";
+                       reg = <0 0xe6280000 0 0x1000>;
+@@ -346,7 +346,7 @@
+                       status = "disabled";
+               };
+-              ipmmu_sy1: mmu@e6290000 {
++              ipmmu_sy1: iommu@e6290000 {
+                       compatible = "renesas,ipmmu-r8a7793",
+                                    "renesas,ipmmu-vmsa";
+                       reg = <0 0xe6290000 0 0x1000>;
+@@ -355,7 +355,7 @@
+                       status = "disabled";
+               };
+-              ipmmu_ds: mmu@e6740000 {
++              ipmmu_ds: iommu@e6740000 {
+                       compatible = "renesas,ipmmu-r8a7793",
+                                    "renesas,ipmmu-vmsa";
+                       reg = <0 0xe6740000 0 0x1000>;
+@@ -365,7 +365,7 @@
+                       status = "disabled";
+               };
+-              ipmmu_mp: mmu@ec680000 {
++              ipmmu_mp: iommu@ec680000 {
+                       compatible = "renesas,ipmmu-r8a7793",
+                                    "renesas,ipmmu-vmsa";
+                       reg = <0 0xec680000 0 0x1000>;
+@@ -374,7 +374,7 @@
+                       status = "disabled";
+               };
+-              ipmmu_mx: mmu@fe951000 {
++              ipmmu_mx: iommu@fe951000 {
+                       compatible = "renesas,ipmmu-r8a7793",
+                                    "renesas,ipmmu-vmsa";
+                       reg = <0 0xfe951000 0 0x1000>;
+@@ -384,7 +384,7 @@
+                       status = "disabled";
+               };
+-              ipmmu_rt: mmu@ffc80000 {
++              ipmmu_rt: iommu@ffc80000 {
+                       compatible = "renesas,ipmmu-r8a7793",
+                                    "renesas,ipmmu-vmsa";
+                       reg = <0 0xffc80000 0 0x1000>;
+@@ -393,7 +393,7 @@
+                       status = "disabled";
+               };
+-              ipmmu_gp: mmu@e62a0000 {
++              ipmmu_gp: iommu@e62a0000 {
+                       compatible = "renesas,ipmmu-r8a7793",
+                                    "renesas,ipmmu-vmsa";
+                       reg = <0 0xe62a0000 0 0x1000>;
+diff --git a/arch/arm/boot/dts/r8a7794.dtsi b/arch/arm/boot/dts/r8a7794.dtsi
+index 2c9e7a1ebfec1..8d7f8798628a6 100644
+--- a/arch/arm/boot/dts/r8a7794.dtsi
++++ b/arch/arm/boot/dts/r8a7794.dtsi
+@@ -290,7 +290,7 @@
+                       resets = <&cpg 407>;
+               };
+-              ipmmu_sy0: mmu@e6280000 {
++              ipmmu_sy0: iommu@e6280000 {
+                       compatible = "renesas,ipmmu-r8a7794",
+                                    "renesas,ipmmu-vmsa";
+                       reg = <0 0xe6280000 0 0x1000>;
+@@ -300,7 +300,7 @@
+                       status = "disabled";
+               };
+-              ipmmu_sy1: mmu@e6290000 {
++              ipmmu_sy1: iommu@e6290000 {
+                       compatible = "renesas,ipmmu-r8a7794",
+                                    "renesas,ipmmu-vmsa";
+                       reg = <0 0xe6290000 0 0x1000>;
+@@ -309,7 +309,7 @@
+                       status = "disabled";
+               };
+-              ipmmu_ds: mmu@e6740000 {
++              ipmmu_ds: iommu@e6740000 {
+                       compatible = "renesas,ipmmu-r8a7794",
+                                    "renesas,ipmmu-vmsa";
+                       reg = <0 0xe6740000 0 0x1000>;
+@@ -319,7 +319,7 @@
+                       status = "disabled";
+               };
+-              ipmmu_mp: mmu@ec680000 {
++              ipmmu_mp: iommu@ec680000 {
+                       compatible = "renesas,ipmmu-r8a7794",
+                                    "renesas,ipmmu-vmsa";
+                       reg = <0 0xec680000 0 0x1000>;
+@@ -328,7 +328,7 @@
+                       status = "disabled";
+               };
+-              ipmmu_mx: mmu@fe951000 {
++              ipmmu_mx: iommu@fe951000 {
+                       compatible = "renesas,ipmmu-r8a7794",
+                                    "renesas,ipmmu-vmsa";
+                       reg = <0 0xfe951000 0 0x1000>;
+@@ -338,7 +338,7 @@
+                       status = "disabled";
+               };
+-              ipmmu_gp: mmu@e62a0000 {
++              ipmmu_gp: iommu@e62a0000 {
+                       compatible = "renesas,ipmmu-r8a7794",
+                                    "renesas,ipmmu-vmsa";
+                       reg = <0 0xe62a0000 0 0x1000>;
+-- 
+2.25.1
+
diff --git a/queue-5.7/arm-dts-stm32-add-missing-ethernet-phy-reset-on-av96.patch b/queue-5.7/arm-dts-stm32-add-missing-ethernet-phy-reset-on-av96.patch
new file mode 100644 (file)
index 0000000..178c282
--- /dev/null
@@ -0,0 +1,43 @@
+From 3452e60c8addec28c9365f59734a491d02c47245 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 22 Apr 2020 12:45:58 +0200
+Subject: ARM: dts: stm32: Add missing ethernet PHY reset on AV96
+
+From: Marek Vasut <marex@denx.de>
+
+[ Upstream commit 010ca9fe500bfe365860b50220ff80541c18f0e1 ]
+
+Add PHY reset GPIO on AV96 ethernet PHY.
+
+Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
+Signed-off-by: Marek Vasut <marex@denx.de>
+Cc: Alexandre Torgue <alexandre.torgue@st.com>
+Cc: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
+Cc: Maxime Coquelin <mcoquelin.stm32@gmail.com>
+Cc: Patrice Chotard <patrice.chotard@st.com>
+Cc: Patrick Delaunay <patrick.delaunay@st.com>
+Cc: linux-stm32@st-md-mailman.stormreply.com
+To: linux-arm-kernel@lists.infradead.org
+Signed-off-by: Alexandre Torgue <alexandre.torgue@st.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/arm/boot/dts/stm32mp157a-avenger96.dts | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/arch/arm/boot/dts/stm32mp157a-avenger96.dts b/arch/arm/boot/dts/stm32mp157a-avenger96.dts
+index 425175f7d83c3..081037b510bcb 100644
+--- a/arch/arm/boot/dts/stm32mp157a-avenger96.dts
++++ b/arch/arm/boot/dts/stm32mp157a-avenger96.dts
+@@ -92,6 +92,9 @@
+               #address-cells = <1>;
+               #size-cells = <0>;
+               compatible = "snps,dwmac-mdio";
++              reset-gpios = <&gpioz 2 GPIO_ACTIVE_LOW>;
++              reset-delay-us = <1000>;
++
+               phy0: ethernet-phy@7 {
+                       reg = <7>;
+               };
+-- 
+2.25.1
+
diff --git a/queue-5.7/arm-dts-sun8i-h2-plus-bananapi-m2-zero-fix-led-polar.patch b/queue-5.7/arm-dts-sun8i-h2-plus-bananapi-m2-zero-fix-led-polar.patch
new file mode 100644 (file)
index 0000000..0a4474a
--- /dev/null
@@ -0,0 +1,43 @@
+From e653e531105a2048458f917062c0bff4f0e4ca63 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 11 Apr 2020 19:48:43 +0200
+Subject: ARM: dts: sun8i-h2-plus-bananapi-m2-zero: Fix led polarity
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Vincent Stehlé <vincent.stehle@laposte.net>
+
+[ Upstream commit 34b6826df7462c541752cf8b1de2691b26d78ae0 ]
+
+The PWR-LED on the bananapi m2 zero board is on when gpio PL10 is low.
+This has been verified on a board and in the schematics [1].
+
+[1]: http://wiki.banana-pi.org/Banana_Pi_BPI-M2_ZERO#Documents
+
+Fixes: 8b8061fcbfae ("ARM: dts: sun8i: h2+: add support for Banana Pi M2 Zero board")
+Signed-off-by: Vincent Stehlé <vincent.stehle@laposte.net>
+Cc: Icenowy Zheng <icenowy@aosc.io>
+Cc: Maxime Ripard <mripard@kernel.org>
+Signed-off-by: Maxime Ripard <maxime@cerno.tech>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/arm/boot/dts/sun8i-h2-plus-bananapi-m2-zero.dts | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/arch/arm/boot/dts/sun8i-h2-plus-bananapi-m2-zero.dts b/arch/arm/boot/dts/sun8i-h2-plus-bananapi-m2-zero.dts
+index d277d043031b2..4c6704e4c57ec 100644
+--- a/arch/arm/boot/dts/sun8i-h2-plus-bananapi-m2-zero.dts
++++ b/arch/arm/boot/dts/sun8i-h2-plus-bananapi-m2-zero.dts
+@@ -31,7 +31,7 @@
+               pwr_led {
+                       label = "bananapi-m2-zero:red:pwr";
+-                      gpios = <&r_pio 0 10 GPIO_ACTIVE_HIGH>; /* PL10 */
++                      gpios = <&r_pio 0 10 GPIO_ACTIVE_LOW>; /* PL10 */
+                       default-state = "on";
+               };
+       };
+-- 
+2.25.1
+
diff --git a/queue-5.7/arm-integrator-add-some-kconfig-selections.patch b/queue-5.7/arm-integrator-add-some-kconfig-selections.patch
new file mode 100644 (file)
index 0000000..75ea967
--- /dev/null
@@ -0,0 +1,61 @@
+From b75aebb0692048707b6ff332440e7537d24ee0ea Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 13 Feb 2020 15:27:54 +0100
+Subject: ARM: integrator: Add some Kconfig selections
+
+From: Linus Walleij <linus.walleij@linaro.org>
+
+[ Upstream commit d2854bbe5f5c4b4bec8061caf4f2e603d8819446 ]
+
+The CMA and DMA_CMA Kconfig options need to be selected
+by the Integrator in order to produce boot console on some
+Integrator systems.
+
+The REGULATOR and REGULATOR_FIXED_VOLTAGE need to be
+selected in order to boot the system from an external
+MMC card when using MMCI/PL181 from the device tree
+probe path.
+
+Select these things directly from the Kconfig so we are
+sure to be able to bring the systems up with console
+from any device tree.
+
+Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/arm/mach-integrator/Kconfig | 7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+diff --git a/arch/arm/mach-integrator/Kconfig b/arch/arm/mach-integrator/Kconfig
+index 982eabc361635..2406cab73835a 100644
+--- a/arch/arm/mach-integrator/Kconfig
++++ b/arch/arm/mach-integrator/Kconfig
+@@ -4,6 +4,8 @@ menuconfig ARCH_INTEGRATOR
+       depends on ARCH_MULTI_V4T || ARCH_MULTI_V5 || ARCH_MULTI_V6
+       select ARM_AMBA
+       select COMMON_CLK_VERSATILE
++      select CMA
++      select DMA_CMA
+       select HAVE_TCM
+       select ICST
+       select MFD_SYSCON
+@@ -35,14 +37,13 @@ config INTEGRATOR_IMPD1
+       select ARM_VIC
+       select GPIO_PL061
+       select GPIOLIB
++      select REGULATOR
++      select REGULATOR_FIXED_VOLTAGE
+       help
+         The IM-PD1 is an add-on logic module for the Integrator which
+         allows ARM(R) Ltd PrimeCells to be developed and evaluated.
+         The IM-PD1 can be found on the Integrator/PP2 platform.
+-        To compile this driver as a module, choose M here: the
+-        module will be called impd1.
+-
+ config INTEGRATOR_CM7TDMI
+       bool "Integrator/CM7TDMI core module"
+       depends on ARCH_INTEGRATOR_AP
+-- 
+2.25.1
+
diff --git a/queue-5.7/arm64-dts-armada-3720-turris-mox-fix-sfp-binding.patch b/queue-5.7/arm64-dts-armada-3720-turris-mox-fix-sfp-binding.patch
new file mode 100644 (file)
index 0000000..e378b6f
--- /dev/null
@@ -0,0 +1,40 @@
+From 27f87ed762c1c873ba6f7f262a94179a17613ee2 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 6 May 2020 21:29:16 +0200
+Subject: arm64: dts: armada-3720-turris-mox: fix SFP binding
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Marek Behún <marek.behun@nic.cz>
+
+[ Upstream commit c2671acbbbd822ef077cc168991e0a7dbe2172c9 ]
+
+The sfp compatible should be 'sff,sfp', not 'sff,sfp+'. We used patched
+kernel where the latter was working.
+
+Fixes: 7109d817db2e ("arm64: dts: marvell: add DTS for Turris Mox")
+Signed-off-by: Marek Behún <marek.behun@nic.cz>
+Cc: Gregory CLEMENT <gregory.clement@bootlin.com>
+Signed-off-by: Gregory CLEMENT <gregory.clement@bootlin.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/arm64/boot/dts/marvell/armada-3720-turris-mox.dts | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/arch/arm64/boot/dts/marvell/armada-3720-turris-mox.dts b/arch/arm64/boot/dts/marvell/armada-3720-turris-mox.dts
+index 47fee66c70cbc..0e0491ca2930d 100644
+--- a/arch/arm64/boot/dts/marvell/armada-3720-turris-mox.dts
++++ b/arch/arm64/boot/dts/marvell/armada-3720-turris-mox.dts
+@@ -95,7 +95,7 @@
+       };
+       sfp: sfp {
+-              compatible = "sff,sfp+";
++              compatible = "sff,sfp";
+               i2c-bus = <&i2c0>;
+               los-gpio = <&moxtet_sfp 0 GPIO_ACTIVE_HIGH>;
+               tx-fault-gpio = <&moxtet_sfp 1 GPIO_ACTIVE_HIGH>;
+-- 
+2.25.1
+
diff --git a/queue-5.7/arm64-dts-armada-3720-turris-mox-forbid-sdr104-on-sd.patch b/queue-5.7/arm64-dts-armada-3720-turris-mox-forbid-sdr104-on-sd.patch
new file mode 100644 (file)
index 0000000..9fd64ac
--- /dev/null
@@ -0,0 +1,42 @@
+From 3601ce84816027825d908235d68d46c2886cc851 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 1 May 2020 01:11:44 +0200
+Subject: arm64: dts: armada-3720-turris-mox: forbid SDR104 on SDIO for FCC
+ purposes
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Marek Behún <marek.behun@nic.cz>
+
+[ Upstream commit 7a2c36b039d2343cc29fec6102da839477b8dc60 ]
+
+Use sdhci-caps-mask to forbid SDR104 mode on the SDIO capable SDHCI
+controller. Without this the device cannot pass electromagnetic
+interference certifications.
+
+Fixes: 7109d817db2e ("arm64: dts: marvell: add DTS for Turris Mox")
+Signed-off-by: Marek Behún <marek.behun@nic.cz>
+Cc: Gregory CLEMENT <gregory.clement@bootlin.com>
+Signed-off-by: Gregory CLEMENT <gregory.clement@bootlin.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/arm64/boot/dts/marvell/armada-3720-turris-mox.dts | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/arch/arm64/boot/dts/marvell/armada-3720-turris-mox.dts b/arch/arm64/boot/dts/marvell/armada-3720-turris-mox.dts
+index bb42d1e6a4e92..47fee66c70cbc 100644
+--- a/arch/arm64/boot/dts/marvell/armada-3720-turris-mox.dts
++++ b/arch/arm64/boot/dts/marvell/armada-3720-turris-mox.dts
+@@ -179,6 +179,8 @@
+       marvell,pad-type = "sd";
+       vqmmc-supply = <&vsdio_reg>;
+       mmc-pwrseq = <&sdhci1_pwrseq>;
++      /* forbid SDR104 for FCC purposes */
++      sdhci-caps-mask = <0x2 0x0>;
+       status = "okay";
+ };
+-- 
+2.25.1
+
diff --git a/queue-5.7/arm64-dts-fvp-fix-gic-child-nodes.patch b/queue-5.7/arm64-dts-fvp-fix-gic-child-nodes.patch
new file mode 100644 (file)
index 0000000..f386503
--- /dev/null
@@ -0,0 +1,171 @@
+From 16c62b301578558731fd2a5413cc90f869df41fd Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 13 May 2020 11:30:06 +0100
+Subject: arm64: dts: fvp: Fix GIC child nodes
+
+From: Andre Przywara <andre.przywara@arm.com>
+
+[ Upstream commit 78631aecc52c4b2adcf611769df2ff9c67ac16d0 ]
+
+The GIC DT nodes for the fastmodels were not fully compliant with the
+DT binding, which has certain expectations about child nodes and their
+size and address cells values.
+
+Use smaller #address-cells and #size-cells values, as the binding
+requests, and adjust the reg properties accordingly.
+This requires adjusting the interrupt nexus nodes as well, as one
+field of the interrupt-map property depends on the GIC's address-size.
+
+Since the .dts files share interrupt nexus nodes across different
+interrupt controllers (GICv2 vs. GICv3), we need to use the only
+commonly allowed #address-size value of <1> for both.
+
+Link: https://lore.kernel.org/r/20200513103016.130417-11-andre.przywara@arm.com
+Signed-off-by: Andre Przywara <andre.przywara@arm.com>
+Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ .../boot/dts/arm/foundation-v8-gicv2.dtsi     |  2 +-
+ .../boot/dts/arm/foundation-v8-gicv3.dtsi     |  8 +-
+ arch/arm64/boot/dts/arm/foundation-v8.dtsi    | 86 +++++++++----------
+ 3 files changed, 48 insertions(+), 48 deletions(-)
+
+diff --git a/arch/arm64/boot/dts/arm/foundation-v8-gicv2.dtsi b/arch/arm64/boot/dts/arm/foundation-v8-gicv2.dtsi
+index 15fe81738e94d..dfb23dfc0b0fb 100644
+--- a/arch/arm64/boot/dts/arm/foundation-v8-gicv2.dtsi
++++ b/arch/arm64/boot/dts/arm/foundation-v8-gicv2.dtsi
+@@ -8,7 +8,7 @@
+       gic: interrupt-controller@2c001000 {
+               compatible = "arm,cortex-a15-gic", "arm,cortex-a9-gic";
+               #interrupt-cells = <3>;
+-              #address-cells = <2>;
++              #address-cells = <1>;
+               interrupt-controller;
+               reg = <0x0 0x2c001000 0 0x1000>,
+                     <0x0 0x2c002000 0 0x2000>,
+diff --git a/arch/arm64/boot/dts/arm/foundation-v8-gicv3.dtsi b/arch/arm64/boot/dts/arm/foundation-v8-gicv3.dtsi
+index f2c75c756039c..906f51935b362 100644
+--- a/arch/arm64/boot/dts/arm/foundation-v8-gicv3.dtsi
++++ b/arch/arm64/boot/dts/arm/foundation-v8-gicv3.dtsi
+@@ -8,9 +8,9 @@
+       gic: interrupt-controller@2f000000 {
+               compatible = "arm,gic-v3";
+               #interrupt-cells = <3>;
+-              #address-cells = <2>;
+-              #size-cells = <2>;
+-              ranges;
++              #address-cells = <1>;
++              #size-cells = <1>;
++              ranges = <0x0 0x0 0x2f000000 0x100000>;
+               interrupt-controller;
+               reg =   <0x0 0x2f000000 0x0 0x10000>,
+                       <0x0 0x2f100000 0x0 0x200000>,
+@@ -22,7 +22,7 @@
+               its: its@2f020000 {
+                       compatible = "arm,gic-v3-its";
+                       msi-controller;
+-                      reg = <0x0 0x2f020000 0x0 0x20000>;
++                      reg = <0x20000 0x20000>;
+               };
+       };
+ };
+diff --git a/arch/arm64/boot/dts/arm/foundation-v8.dtsi b/arch/arm64/boot/dts/arm/foundation-v8.dtsi
+index 12f039fa3dada..60ec37d6c9d3c 100644
+--- a/arch/arm64/boot/dts/arm/foundation-v8.dtsi
++++ b/arch/arm64/boot/dts/arm/foundation-v8.dtsi
+@@ -107,49 +107,49 @@
+               #interrupt-cells = <1>;
+               interrupt-map-mask = <0 0 63>;
+-              interrupt-map = <0 0  0 &gic 0 0 GIC_SPI  0 IRQ_TYPE_LEVEL_HIGH>,
+-                              <0 0  1 &gic 0 0 GIC_SPI  1 IRQ_TYPE_LEVEL_HIGH>,
+-                              <0 0  2 &gic 0 0 GIC_SPI  2 IRQ_TYPE_LEVEL_HIGH>,
+-                              <0 0  3 &gic 0 0 GIC_SPI  3 IRQ_TYPE_LEVEL_HIGH>,
+-                              <0 0  4 &gic 0 0 GIC_SPI  4 IRQ_TYPE_LEVEL_HIGH>,
+-                              <0 0  5 &gic 0 0 GIC_SPI  5 IRQ_TYPE_LEVEL_HIGH>,
+-                              <0 0  6 &gic 0 0 GIC_SPI  6 IRQ_TYPE_LEVEL_HIGH>,
+-                              <0 0  7 &gic 0 0 GIC_SPI  7 IRQ_TYPE_LEVEL_HIGH>,
+-                              <0 0  8 &gic 0 0 GIC_SPI  8 IRQ_TYPE_LEVEL_HIGH>,
+-                              <0 0  9 &gic 0 0 GIC_SPI  9 IRQ_TYPE_LEVEL_HIGH>,
+-                              <0 0 10 &gic 0 0 GIC_SPI 10 IRQ_TYPE_LEVEL_HIGH>,
+-                              <0 0 11 &gic 0 0 GIC_SPI 11 IRQ_TYPE_LEVEL_HIGH>,
+-                              <0 0 12 &gic 0 0 GIC_SPI 12 IRQ_TYPE_LEVEL_HIGH>,
+-                              <0 0 13 &gic 0 0 GIC_SPI 13 IRQ_TYPE_LEVEL_HIGH>,
+-                              <0 0 14 &gic 0 0 GIC_SPI 14 IRQ_TYPE_LEVEL_HIGH>,
+-                              <0 0 15 &gic 0 0 GIC_SPI 15 IRQ_TYPE_LEVEL_HIGH>,
+-                              <0 0 16 &gic 0 0 GIC_SPI 16 IRQ_TYPE_LEVEL_HIGH>,
+-                              <0 0 17 &gic 0 0 GIC_SPI 17 IRQ_TYPE_LEVEL_HIGH>,
+-                              <0 0 18 &gic 0 0 GIC_SPI 18 IRQ_TYPE_LEVEL_HIGH>,
+-                              <0 0 19 &gic 0 0 GIC_SPI 19 IRQ_TYPE_LEVEL_HIGH>,
+-                              <0 0 20 &gic 0 0 GIC_SPI 20 IRQ_TYPE_LEVEL_HIGH>,
+-                              <0 0 21 &gic 0 0 GIC_SPI 21 IRQ_TYPE_LEVEL_HIGH>,
+-                              <0 0 22 &gic 0 0 GIC_SPI 22 IRQ_TYPE_LEVEL_HIGH>,
+-                              <0 0 23 &gic 0 0 GIC_SPI 23 IRQ_TYPE_LEVEL_HIGH>,
+-                              <0 0 24 &gic 0 0 GIC_SPI 24 IRQ_TYPE_LEVEL_HIGH>,
+-                              <0 0 25 &gic 0 0 GIC_SPI 25 IRQ_TYPE_LEVEL_HIGH>,
+-                              <0 0 26 &gic 0 0 GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>,
+-                              <0 0 27 &gic 0 0 GIC_SPI 27 IRQ_TYPE_LEVEL_HIGH>,
+-                              <0 0 28 &gic 0 0 GIC_SPI 28 IRQ_TYPE_LEVEL_HIGH>,
+-                              <0 0 29 &gic 0 0 GIC_SPI 29 IRQ_TYPE_LEVEL_HIGH>,
+-                              <0 0 30 &gic 0 0 GIC_SPI 30 IRQ_TYPE_LEVEL_HIGH>,
+-                              <0 0 31 &gic 0 0 GIC_SPI 31 IRQ_TYPE_LEVEL_HIGH>,
+-                              <0 0 32 &gic 0 0 GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>,
+-                              <0 0 33 &gic 0 0 GIC_SPI 33 IRQ_TYPE_LEVEL_HIGH>,
+-                              <0 0 34 &gic 0 0 GIC_SPI 34 IRQ_TYPE_LEVEL_HIGH>,
+-                              <0 0 35 &gic 0 0 GIC_SPI 35 IRQ_TYPE_LEVEL_HIGH>,
+-                              <0 0 36 &gic 0 0 GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>,
+-                              <0 0 37 &gic 0 0 GIC_SPI 37 IRQ_TYPE_LEVEL_HIGH>,
+-                              <0 0 38 &gic 0 0 GIC_SPI 38 IRQ_TYPE_LEVEL_HIGH>,
+-                              <0 0 39 &gic 0 0 GIC_SPI 39 IRQ_TYPE_LEVEL_HIGH>,
+-                              <0 0 40 &gic 0 0 GIC_SPI 40 IRQ_TYPE_LEVEL_HIGH>,
+-                              <0 0 41 &gic 0 0 GIC_SPI 41 IRQ_TYPE_LEVEL_HIGH>,
+-                              <0 0 42 &gic 0 0 GIC_SPI 42 IRQ_TYPE_LEVEL_HIGH>;
++              interrupt-map = <0 0  0 &gic 0 GIC_SPI  0 IRQ_TYPE_LEVEL_HIGH>,
++                              <0 0  1 &gic 0 GIC_SPI  1 IRQ_TYPE_LEVEL_HIGH>,
++                              <0 0  2 &gic 0 GIC_SPI  2 IRQ_TYPE_LEVEL_HIGH>,
++                              <0 0  3 &gic 0 GIC_SPI  3 IRQ_TYPE_LEVEL_HIGH>,
++                              <0 0  4 &gic 0 GIC_SPI  4 IRQ_TYPE_LEVEL_HIGH>,
++                              <0 0  5 &gic 0 GIC_SPI  5 IRQ_TYPE_LEVEL_HIGH>,
++                              <0 0  6 &gic 0 GIC_SPI  6 IRQ_TYPE_LEVEL_HIGH>,
++                              <0 0  7 &gic 0 GIC_SPI  7 IRQ_TYPE_LEVEL_HIGH>,
++                              <0 0  8 &gic 0 GIC_SPI  8 IRQ_TYPE_LEVEL_HIGH>,
++                              <0 0  9 &gic 0 GIC_SPI  9 IRQ_TYPE_LEVEL_HIGH>,
++                              <0 0 10 &gic 0 GIC_SPI 10 IRQ_TYPE_LEVEL_HIGH>,
++                              <0 0 11 &gic 0 GIC_SPI 11 IRQ_TYPE_LEVEL_HIGH>,
++                              <0 0 12 &gic 0 GIC_SPI 12 IRQ_TYPE_LEVEL_HIGH>,
++                              <0 0 13 &gic 0 GIC_SPI 13 IRQ_TYPE_LEVEL_HIGH>,
++                              <0 0 14 &gic 0 GIC_SPI 14 IRQ_TYPE_LEVEL_HIGH>,
++                              <0 0 15 &gic 0 GIC_SPI 15 IRQ_TYPE_LEVEL_HIGH>,
++                              <0 0 16 &gic 0 GIC_SPI 16 IRQ_TYPE_LEVEL_HIGH>,
++                              <0 0 17 &gic 0 GIC_SPI 17 IRQ_TYPE_LEVEL_HIGH>,
++                              <0 0 18 &gic 0 GIC_SPI 18 IRQ_TYPE_LEVEL_HIGH>,
++                              <0 0 19 &gic 0 GIC_SPI 19 IRQ_TYPE_LEVEL_HIGH>,
++                              <0 0 20 &gic 0 GIC_SPI 20 IRQ_TYPE_LEVEL_HIGH>,
++                              <0 0 21 &gic 0 GIC_SPI 21 IRQ_TYPE_LEVEL_HIGH>,
++                              <0 0 22 &gic 0 GIC_SPI 22 IRQ_TYPE_LEVEL_HIGH>,
++                              <0 0 23 &gic 0 GIC_SPI 23 IRQ_TYPE_LEVEL_HIGH>,
++                              <0 0 24 &gic 0 GIC_SPI 24 IRQ_TYPE_LEVEL_HIGH>,
++                              <0 0 25 &gic 0 GIC_SPI 25 IRQ_TYPE_LEVEL_HIGH>,
++                              <0 0 26 &gic 0 GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>,
++                              <0 0 27 &gic 0 GIC_SPI 27 IRQ_TYPE_LEVEL_HIGH>,
++                              <0 0 28 &gic 0 GIC_SPI 28 IRQ_TYPE_LEVEL_HIGH>,
++                              <0 0 29 &gic 0 GIC_SPI 29 IRQ_TYPE_LEVEL_HIGH>,
++                              <0 0 30 &gic 0 GIC_SPI 30 IRQ_TYPE_LEVEL_HIGH>,
++                              <0 0 31 &gic 0 GIC_SPI 31 IRQ_TYPE_LEVEL_HIGH>,
++                              <0 0 32 &gic 0 GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>,
++                              <0 0 33 &gic 0 GIC_SPI 33 IRQ_TYPE_LEVEL_HIGH>,
++                              <0 0 34 &gic 0 GIC_SPI 34 IRQ_TYPE_LEVEL_HIGH>,
++                              <0 0 35 &gic 0 GIC_SPI 35 IRQ_TYPE_LEVEL_HIGH>,
++                              <0 0 36 &gic 0 GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>,
++                              <0 0 37 &gic 0 GIC_SPI 37 IRQ_TYPE_LEVEL_HIGH>,
++                              <0 0 38 &gic 0 GIC_SPI 38 IRQ_TYPE_LEVEL_HIGH>,
++                              <0 0 39 &gic 0 GIC_SPI 39 IRQ_TYPE_LEVEL_HIGH>,
++                              <0 0 40 &gic 0 GIC_SPI 40 IRQ_TYPE_LEVEL_HIGH>,
++                              <0 0 41 &gic 0 GIC_SPI 41 IRQ_TYPE_LEVEL_HIGH>,
++                              <0 0 42 &gic 0 GIC_SPI 42 IRQ_TYPE_LEVEL_HIGH>;
+               ethernet@2,02000000 {
+                       compatible = "smsc,lan91c111";
+-- 
+2.25.1
+
diff --git a/queue-5.7/arm64-dts-fvp-juno-fix-node-address-fields.patch b/queue-5.7/arm64-dts-fvp-juno-fix-node-address-fields.patch
new file mode 100644 (file)
index 0000000..6a54fda
--- /dev/null
@@ -0,0 +1,172 @@
+From f8e33482508909296f9091cac587394d18d4a747 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 13 May 2020 11:29:58 +0100
+Subject: arm64: dts: fvp/juno: Fix node address fields
+
+From: Andre Przywara <andre.przywara@arm.com>
+
+[ Upstream commit bb5cce12ac717c7462217cd493ed701d12d6dbce ]
+
+The Arm Ltd. boards were using an outdated address convention in the DT
+node names, by separating the high from the low 32-bits of an address by
+a comma.
+
+Remove the comma from the node name suffix to be DT spec compliant.
+
+Link: https://lore.kernel.org/r/20200513103016.130417-3-andre.przywara@arm.com
+Signed-off-by: Andre Przywara <andre.przywara@arm.com>
+Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/arm/boot/dts/vexpress-v2m-rs1.dtsi              | 10 +++++-----
+ arch/arm64/boot/dts/arm/foundation-v8.dtsi           |  4 ++--
+ arch/arm64/boot/dts/arm/juno-motherboard.dtsi        |  6 +++---
+ arch/arm64/boot/dts/arm/rtsm_ve-motherboard-rs2.dtsi |  2 +-
+ arch/arm64/boot/dts/arm/rtsm_ve-motherboard.dtsi     |  6 +++---
+ 5 files changed, 14 insertions(+), 14 deletions(-)
+
+diff --git a/arch/arm/boot/dts/vexpress-v2m-rs1.dtsi b/arch/arm/boot/dts/vexpress-v2m-rs1.dtsi
+index 5c183483ec3b6..8010cdcdb37a0 100644
+--- a/arch/arm/boot/dts/vexpress-v2m-rs1.dtsi
++++ b/arch/arm/boot/dts/vexpress-v2m-rs1.dtsi
+@@ -31,7 +31,7 @@
+                       #interrupt-cells = <1>;
+                       ranges;
+-                      nor_flash: flash@0,00000000 {
++                      nor_flash: flash@0 {
+                               compatible = "arm,vexpress-flash", "cfi-flash";
+                               reg = <0 0x00000000 0x04000000>,
+                                     <4 0x00000000 0x04000000>;
+@@ -41,13 +41,13 @@
+                               };
+                       };
+-                      psram@1,00000000 {
++                      psram@100000000 {
+                               compatible = "arm,vexpress-psram", "mtd-ram";
+                               reg = <1 0x00000000 0x02000000>;
+                               bank-width = <4>;
+                       };
+-                      ethernet@2,02000000 {
++                      ethernet@202000000 {
+                               compatible = "smsc,lan9118", "smsc,lan9115";
+                               reg = <2 0x02000000 0x10000>;
+                               interrupts = <15>;
+@@ -59,14 +59,14 @@
+                               vddvario-supply = <&v2m_fixed_3v3>;
+                       };
+-                      usb@2,03000000 {
++                      usb@203000000 {
+                               compatible = "nxp,usb-isp1761";
+                               reg = <2 0x03000000 0x20000>;
+                               interrupts = <16>;
+                               port1-otg;
+                       };
+-                      iofpga@3,00000000 {
++                      iofpga@300000000 {
+                               compatible = "simple-bus";
+                               #address-cells = <1>;
+                               #size-cells = <1>;
+diff --git a/arch/arm64/boot/dts/arm/foundation-v8.dtsi b/arch/arm64/boot/dts/arm/foundation-v8.dtsi
+index 60ec37d6c9d3c..e2da63f782980 100644
+--- a/arch/arm64/boot/dts/arm/foundation-v8.dtsi
++++ b/arch/arm64/boot/dts/arm/foundation-v8.dtsi
+@@ -151,7 +151,7 @@
+                               <0 0 41 &gic 0 GIC_SPI 41 IRQ_TYPE_LEVEL_HIGH>,
+                               <0 0 42 &gic 0 GIC_SPI 42 IRQ_TYPE_LEVEL_HIGH>;
+-              ethernet@2,02000000 {
++              ethernet@202000000 {
+                       compatible = "smsc,lan91c111";
+                       reg = <2 0x02000000 0x10000>;
+                       interrupts = <15>;
+@@ -178,7 +178,7 @@
+                       clock-output-names = "v2m:refclk32khz";
+               };
+-              iofpga@3,00000000 {
++              iofpga@300000000 {
+                       compatible = "simple-bus";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+diff --git a/arch/arm64/boot/dts/arm/juno-motherboard.dtsi b/arch/arm64/boot/dts/arm/juno-motherboard.dtsi
+index e3983ded3c3c5..d5cefddde08c2 100644
+--- a/arch/arm64/boot/dts/arm/juno-motherboard.dtsi
++++ b/arch/arm64/boot/dts/arm/juno-motherboard.dtsi
+@@ -103,7 +103,7 @@
+                               };
+                       };
+-                      flash@0,00000000 {
++                      flash@0 {
+                               /* 2 * 32MiB NOR Flash memory mounted on CS0 */
+                               compatible = "arm,vexpress-flash", "cfi-flash";
+                               reg = <0 0x00000000 0x04000000>;
+@@ -120,7 +120,7 @@
+                               };
+                       };
+-                      ethernet@2,00000000 {
++                      ethernet@200000000 {
+                               compatible = "smsc,lan9118", "smsc,lan9115";
+                               reg = <2 0x00000000 0x10000>;
+                               interrupts = <3>;
+@@ -133,7 +133,7 @@
+                               vddvario-supply = <&mb_fixed_3v3>;
+                       };
+-                      iofpga@3,00000000 {
++                      iofpga@300000000 {
+                               compatible = "simple-bus";
+                               #address-cells = <1>;
+                               #size-cells = <1>;
+diff --git a/arch/arm64/boot/dts/arm/rtsm_ve-motherboard-rs2.dtsi b/arch/arm64/boot/dts/arm/rtsm_ve-motherboard-rs2.dtsi
+index 60703b5763c6a..350cbf17e8b41 100644
+--- a/arch/arm64/boot/dts/arm/rtsm_ve-motherboard-rs2.dtsi
++++ b/arch/arm64/boot/dts/arm/rtsm_ve-motherboard-rs2.dtsi
+@@ -9,7 +9,7 @@
+               motherboard {
+                       arm,v2m-memory-map = "rs2";
+-                      iofpga@3,00000000 {
++                      iofpga@300000000 {
+                               virtio-p9@140000 {
+                                       compatible = "virtio,mmio";
+                                       reg = <0x140000 0x200>;
+diff --git a/arch/arm64/boot/dts/arm/rtsm_ve-motherboard.dtsi b/arch/arm64/boot/dts/arm/rtsm_ve-motherboard.dtsi
+index e333c8d2d0e4c..d1bfa62ca073e 100644
+--- a/arch/arm64/boot/dts/arm/rtsm_ve-motherboard.dtsi
++++ b/arch/arm64/boot/dts/arm/rtsm_ve-motherboard.dtsi
+@@ -17,14 +17,14 @@
+                       #interrupt-cells = <1>;
+                       ranges;
+-                      flash@0,00000000 {
++                      flash@0 {
+                               compatible = "arm,vexpress-flash", "cfi-flash";
+                               reg = <0 0x00000000 0x04000000>,
+                                     <4 0x00000000 0x04000000>;
+                               bank-width = <4>;
+                       };
+-                      ethernet@2,02000000 {
++                      ethernet@202000000 {
+                               compatible = "smsc,lan91c111";
+                               reg = <2 0x02000000 0x10000>;
+                               interrupts = <15>;
+@@ -51,7 +51,7 @@
+                               clock-output-names = "v2m:refclk32khz";
+                       };
+-                      iofpga@3,00000000 {
++                      iofpga@300000000 {
+                               compatible = "simple-bus";
+                               #address-cells = <1>;
+                               #size-cells = <1>;
+-- 
+2.25.1
+
diff --git a/queue-5.7/arm64-dts-juno-fix-gic-child-nodes.patch b/queue-5.7/arm64-dts-juno-fix-gic-child-nodes.patch
new file mode 100644 (file)
index 0000000..69895b2
--- /dev/null
@@ -0,0 +1,132 @@
+From 8d43415b8ec9eca92df44199809d0dcb302de9da Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 13 May 2020 11:30:05 +0100
+Subject: arm64: dts: juno: Fix GIC child nodes
+
+From: Andre Przywara <andre.przywara@arm.com>
+
+[ Upstream commit a78aee9e434932a500db36cc6d88daeff3745e9f ]
+
+The GIC DT nodes for the Juno boards were not fully compliant with
+the DT binding, which has certain expectations about child nodes and
+their size and address cells values.
+
+Use smaller #address-cells and #size-cells values, as the binding
+requests, and adjust the reg properties accordingly.
+This requires adjusting the interrupt nexus nodes as well, as one
+field of the interrupt-map property depends on the GIC's address-size.
+
+Link: https://lore.kernel.org/r/20200513103016.130417-10-andre.przywara@arm.com
+Signed-off-by: Andre Przywara <andre.przywara@arm.com>
+Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/arm64/boot/dts/arm/juno-base.dtsi | 50 +++++++++++++-------------
+ 1 file changed, 25 insertions(+), 25 deletions(-)
+
+diff --git a/arch/arm64/boot/dts/arm/juno-base.dtsi b/arch/arm64/boot/dts/arm/juno-base.dtsi
+index f5889281545f7..59b6ac0b828a6 100644
+--- a/arch/arm64/boot/dts/arm/juno-base.dtsi
++++ b/arch/arm64/boot/dts/arm/juno-base.dtsi
+@@ -74,35 +74,35 @@
+                     <0x0 0x2c02f000 0 0x2000>,
+                     <0x0 0x2c04f000 0 0x2000>,
+                     <0x0 0x2c06f000 0 0x2000>;
+-              #address-cells = <2>;
++              #address-cells = <1>;
+               #interrupt-cells = <3>;
+-              #size-cells = <2>;
++              #size-cells = <1>;
+               interrupt-controller;
+               interrupts = <GIC_PPI 9 (GIC_CPU_MASK_SIMPLE(6) | IRQ_TYPE_LEVEL_HIGH)>;
+-              ranges = <0 0 0 0x2c1c0000 0 0x40000>;
++              ranges = <0 0 0x2c1c0000 0x40000>;
+               v2m_0: v2m@0 {
+                       compatible = "arm,gic-v2m-frame";
+                       msi-controller;
+-                      reg = <0 0 0 0x10000>;
++                      reg = <0 0x10000>;
+               };
+               v2m@10000 {
+                       compatible = "arm,gic-v2m-frame";
+                       msi-controller;
+-                      reg = <0 0x10000 0 0x10000>;
++                      reg = <0x10000 0x10000>;
+               };
+               v2m@20000 {
+                       compatible = "arm,gic-v2m-frame";
+                       msi-controller;
+-                      reg = <0 0x20000 0 0x10000>;
++                      reg = <0x20000 0x10000>;
+               };
+               v2m@30000 {
+                       compatible = "arm,gic-v2m-frame";
+                       msi-controller;
+-                      reg = <0 0x30000 0 0x10000>;
++                      reg = <0x30000 0x10000>;
+               };
+       };
+@@ -546,10 +546,10 @@
+                        <0x42000000 0x40 0x00000000 0x40 0x00000000 0x1 0x00000000>;
+               #interrupt-cells = <1>;
+               interrupt-map-mask = <0 0 0 7>;
+-              interrupt-map = <0 0 0 1 &gic 0 0 GIC_SPI 136 IRQ_TYPE_LEVEL_HIGH>,
+-                              <0 0 0 2 &gic 0 0 GIC_SPI 137 IRQ_TYPE_LEVEL_HIGH>,
+-                              <0 0 0 3 &gic 0 0 GIC_SPI 138 IRQ_TYPE_LEVEL_HIGH>,
+-                              <0 0 0 4 &gic 0 0 GIC_SPI 139 IRQ_TYPE_LEVEL_HIGH>;
++              interrupt-map = <0 0 0 1 &gic 0 GIC_SPI 136 IRQ_TYPE_LEVEL_HIGH>,
++                              <0 0 0 2 &gic 0 GIC_SPI 137 IRQ_TYPE_LEVEL_HIGH>,
++                              <0 0 0 3 &gic 0 GIC_SPI 138 IRQ_TYPE_LEVEL_HIGH>,
++                              <0 0 0 4 &gic 0 GIC_SPI 139 IRQ_TYPE_LEVEL_HIGH>;
+               msi-parent = <&v2m_0>;
+               status = "disabled";
+               iommu-map-mask = <0x0>; /* RC has no means to output PCI RID */
+@@ -813,19 +813,19 @@
+               #interrupt-cells = <1>;
+               interrupt-map-mask = <0 0 15>;
+-              interrupt-map = <0 0  0 &gic 0 0 GIC_SPI  68 IRQ_TYPE_LEVEL_HIGH>,
+-                              <0 0  1 &gic 0 0 GIC_SPI  69 IRQ_TYPE_LEVEL_HIGH>,
+-                              <0 0  2 &gic 0 0 GIC_SPI  70 IRQ_TYPE_LEVEL_HIGH>,
+-                              <0 0  3 &gic 0 0 GIC_SPI 160 IRQ_TYPE_LEVEL_HIGH>,
+-                              <0 0  4 &gic 0 0 GIC_SPI 161 IRQ_TYPE_LEVEL_HIGH>,
+-                              <0 0  5 &gic 0 0 GIC_SPI 162 IRQ_TYPE_LEVEL_HIGH>,
+-                              <0 0  6 &gic 0 0 GIC_SPI 163 IRQ_TYPE_LEVEL_HIGH>,
+-                              <0 0  7 &gic 0 0 GIC_SPI 164 IRQ_TYPE_LEVEL_HIGH>,
+-                              <0 0  8 &gic 0 0 GIC_SPI 165 IRQ_TYPE_LEVEL_HIGH>,
+-                              <0 0  9 &gic 0 0 GIC_SPI 166 IRQ_TYPE_LEVEL_HIGH>,
+-                              <0 0 10 &gic 0 0 GIC_SPI 167 IRQ_TYPE_LEVEL_HIGH>,
+-                              <0 0 11 &gic 0 0 GIC_SPI 168 IRQ_TYPE_LEVEL_HIGH>,
+-                              <0 0 12 &gic 0 0 GIC_SPI 169 IRQ_TYPE_LEVEL_HIGH>;
++              interrupt-map = <0 0  0 &gic 0 GIC_SPI  68 IRQ_TYPE_LEVEL_HIGH>,
++                              <0 0  1 &gic 0 GIC_SPI  69 IRQ_TYPE_LEVEL_HIGH>,
++                              <0 0  2 &gic 0 GIC_SPI  70 IRQ_TYPE_LEVEL_HIGH>,
++                              <0 0  3 &gic 0 GIC_SPI 160 IRQ_TYPE_LEVEL_HIGH>,
++                              <0 0  4 &gic 0 GIC_SPI 161 IRQ_TYPE_LEVEL_HIGH>,
++                              <0 0  5 &gic 0 GIC_SPI 162 IRQ_TYPE_LEVEL_HIGH>,
++                              <0 0  6 &gic 0 GIC_SPI 163 IRQ_TYPE_LEVEL_HIGH>,
++                              <0 0  7 &gic 0 GIC_SPI 164 IRQ_TYPE_LEVEL_HIGH>,
++                              <0 0  8 &gic 0 GIC_SPI 165 IRQ_TYPE_LEVEL_HIGH>,
++                              <0 0  9 &gic 0 GIC_SPI 166 IRQ_TYPE_LEVEL_HIGH>,
++                              <0 0 10 &gic 0 GIC_SPI 167 IRQ_TYPE_LEVEL_HIGH>,
++                              <0 0 11 &gic 0 GIC_SPI 168 IRQ_TYPE_LEVEL_HIGH>,
++                              <0 0 12 &gic 0 GIC_SPI 169 IRQ_TYPE_LEVEL_HIGH>;
+       };
+       site2: tlx@60000000 {
+@@ -835,6 +835,6 @@
+               ranges = <0 0 0x60000000 0x10000000>;
+               #interrupt-cells = <1>;
+               interrupt-map-mask = <0 0>;
+-              interrupt-map = <0 0 &gic 0 0 GIC_SPI 168 IRQ_TYPE_LEVEL_HIGH>;
++              interrupt-map = <0 0 &gic 0 GIC_SPI 168 IRQ_TYPE_LEVEL_HIGH>;
+       };
+ };
+-- 
+2.25.1
+
diff --git a/queue-5.7/arm64-dts-marvell-armada-37xx-set-pcie_reset_pin-to-.patch b/queue-5.7/arm64-dts-marvell-armada-37xx-set-pcie_reset_pin-to-.patch
new file mode 100644 (file)
index 0000000..ef971b6
--- /dev/null
@@ -0,0 +1,108 @@
+From 14d4c47bb7275c156c96ac794c904d37d0eb8572 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 30 Apr 2020 10:06:23 +0200
+Subject: arm64: dts: marvell: armada-37xx: Set pcie_reset_pin to gpio function
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Marek Behún <marek.behun@nic.cz>
+
+[ Upstream commit 715878016984b2617f6c1f177c50039e12e7bd5b ]
+
+We found out that we are unable to control the PERST# signal via the
+default pin dedicated to be PERST# pin (GPIO2[3] pin) on A3700 SOC when
+this pin is in EP_PCIE1_Resetn mode. There is a register in the PCIe
+register space called PERSTN_GPIO_EN (D0088004[3]), but changing the
+value of this register does not change the pin output when measuring
+with voltmeter.
+
+We do not know if this is a bug in the SOC, or if it works only when
+PCIe controller is in a certain state.
+
+Commit f4c7d053d7f7 ("PCI: aardvark: Wait for endpoint to be ready
+before training link") says that when this pin changes pinctrl mode
+from EP_PCIE1_Resetn to GPIO, the PERST# signal is asserted for a brief
+moment.
+
+So currently the situation is that on A3700 boards the PERST# signal is
+asserted in U-Boot (because the code in U-Boot issues reset via this pin
+via GPIO mode), and then in Linux by the obscure and undocumented
+mechanism described by the above mentioned commit.
+
+We want to issue PERST# signal in a known way, therefore this patch
+changes the pcie_reset_pin function from "pcie" to "gpio" and adds the
+reset-gpios property to the PCIe node in device tree files of
+EspressoBin and Armada 3720 Dev Board (Turris Mox device tree already
+has this property and uDPU does not have a PCIe port).
+
+Signed-off-by: Marek Behún <marek.behun@nic.cz>
+Cc: Remi Pommarel <repk@triplefau.lt>
+Tested-by: Tomasz Maciej Nowak <tmn505@gmail.com>
+Acked-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
+Signed-off-by: Gregory CLEMENT <gregory.clement@bootlin.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/arm64/boot/dts/marvell/armada-3720-db.dts           | 3 +++
+ arch/arm64/boot/dts/marvell/armada-3720-espressobin.dtsi | 1 +
+ arch/arm64/boot/dts/marvell/armada-3720-turris-mox.dts   | 4 ----
+ arch/arm64/boot/dts/marvell/armada-37xx.dtsi             | 2 +-
+ 4 files changed, 5 insertions(+), 5 deletions(-)
+
+diff --git a/arch/arm64/boot/dts/marvell/armada-3720-db.dts b/arch/arm64/boot/dts/marvell/armada-3720-db.dts
+index f2cc00594d64a..3e5789f372069 100644
+--- a/arch/arm64/boot/dts/marvell/armada-3720-db.dts
++++ b/arch/arm64/boot/dts/marvell/armada-3720-db.dts
+@@ -128,6 +128,9 @@
+ /* CON15(V2.0)/CON17(V1.4) : PCIe / CON15(V2.0)/CON12(V1.4) :mini-PCIe */
+ &pcie0 {
++      pinctrl-names = "default";
++      pinctrl-0 = <&pcie_reset_pins &pcie_clkreq_pins>;
++      reset-gpios = <&gpiosb 3 GPIO_ACTIVE_LOW>;
+       status = "okay";
+ };
+diff --git a/arch/arm64/boot/dts/marvell/armada-3720-espressobin.dtsi b/arch/arm64/boot/dts/marvell/armada-3720-espressobin.dtsi
+index 42e992f9c8a54..c92ad664cb0ec 100644
+--- a/arch/arm64/boot/dts/marvell/armada-3720-espressobin.dtsi
++++ b/arch/arm64/boot/dts/marvell/armada-3720-espressobin.dtsi
+@@ -47,6 +47,7 @@
+       phys = <&comphy1 0>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&pcie_reset_pins &pcie_clkreq_pins>;
++      reset-gpios = <&gpiosb 3 GPIO_ACTIVE_LOW>;
+ };
+ /* J6 */
+diff --git a/arch/arm64/boot/dts/marvell/armada-3720-turris-mox.dts b/arch/arm64/boot/dts/marvell/armada-3720-turris-mox.dts
+index 0e0491ca2930d..1452c821f8c09 100644
+--- a/arch/arm64/boot/dts/marvell/armada-3720-turris-mox.dts
++++ b/arch/arm64/boot/dts/marvell/armada-3720-turris-mox.dts
+@@ -128,10 +128,6 @@
+       };
+ };
+-&pcie_reset_pins {
+-      function = "gpio";
+-};
+-
+ &pcie0 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pcie_reset_pins &pcie_clkreq_pins>;
+diff --git a/arch/arm64/boot/dts/marvell/armada-37xx.dtsi b/arch/arm64/boot/dts/marvell/armada-37xx.dtsi
+index 000c135e39b73..7909c146eabf7 100644
+--- a/arch/arm64/boot/dts/marvell/armada-37xx.dtsi
++++ b/arch/arm64/boot/dts/marvell/armada-37xx.dtsi
+@@ -317,7 +317,7 @@
+                               pcie_reset_pins: pcie-reset-pins {
+                                       groups = "pcie1";
+-                                      function = "pcie";
++                                      function = "gpio";
+                               };
+                               pcie_clkreq_pins: pcie-clkreq-pins {
+-- 
+2.25.1
+
diff --git a/queue-5.7/arm64-dts-meson-fix-leds-subnodes-name.patch b/queue-5.7/arm64-dts-meson-fix-leds-subnodes-name.patch
new file mode 100644 (file)
index 0000000..6131871
--- /dev/null
@@ -0,0 +1,231 @@
+From fcffde1c9530e47a3de3259b239f8b0752fc1c3c Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 26 Mar 2020 17:59:58 +0100
+Subject: arm64: dts: meson: fix leds subnodes name
+
+From: Neil Armstrong <narmstrong@baylibre.com>
+
+[ Upstream commit 08dc0e5dd9aabd52cff9e94febe6b282d29deca4 ]
+
+Fix the leds subnode names to match (^led-[0-9a-f]$|led)
+
+It fixes:
+meson-g12b-a311d-khadas-vim3.dt.yaml: leds: 'red', 'white' do not match any of the regexes: '(^led-[0-9a-f]$|led)', 'pinctrl-[0-9]+'
+meson-g12b-s922x-khadas-vim3.dt.yaml: leds: 'red', 'white' do not match any of the regexes: '(^led-[0-9a-f]$|led)', 'pinctrl-[0-9]+'
+meson-g12b-odroid-n2.dt.yaml: leds: 'blue' does not match any of the regexes: '(^led-[0-9a-f]$|led)', 'pinctrl-[0-9]+'
+meson-gxbb-nanopi-k2.dt.yaml: leds: 'stat' does not match any of the regexes: '(^led-[0-9a-f]$|led)', 'pinctrl-[0-9]+'
+meson-gxbb-nexbox-a95x.dt.yaml: leds: 'blue' does not match any of the regexes: '(^led-[0-9a-f]$|led)', 'pinctrl-[0-9]+'
+meson-gxbb-odroidc2.dt.yaml: leds: 'blue' does not match any of the regexes: '(^led-[0-9a-f]$|led)', 'pinctrl-[0-9]+'
+meson-gxbb-vega-s95-pro.dt.yaml: leds: 'blue' does not match any of the regexes: '(^led-[0-9a-f]$|led)', 'pinctrl-[0-9]+'
+meson-gxbb-vega-s95-meta.dt.yaml: leds: 'blue' does not match any of the regexes: '(^led-[0-9a-f]$|led)', 'pinctrl-[0-9]+'
+meson-gxbb-vega-s95-telos.dt.yaml: leds: 'blue' does not match any of the regexes: '(^led-[0-9a-f]$|led)', 'pinctrl-[0-9]+'
+meson-gxbb-wetek-hub.dt.yaml: leds: 'system' does not match any of the regexes: '(^led-[0-9a-f]$|led)', 'pinctrl-[0-9]+'
+meson-gxbb-wetek-play2.dt.yaml: leds: 'ethernet', 'system', 'wifi' do not match any of the regexes: '(^led-[0-9a-f]$|led)', 'pinctrl-[0-9]+'
+meson-gxl-s905x-libretech-cc.dt.yaml: leds: 'blue', 'system' do not match any of the regexes: '(^led-[0-9a-f]$|led)', 'pinctrl-[0-9]+'
+meson-gxl-s905d-libretech-pc.dt.yaml: leds: 'blue', 'green' do not match any of the regexes: '(^led-[0-9a-f]$|led)', 'pinctrl-[0-9]+'
+meson-gxm-rbox-pro.dt.yaml: leds: 'blue', 'red' do not match any of the regexes: '(^led-[0-9a-f]$|led)', 'pinctrl-[0-9]+'
+meson-gxm-s912-libretech-pc.dt.yaml: leds: 'blue', 'green' do not match any of the regexes: '(^led-[0-9a-f]$|led)', 'pinctrl-[0-9]+'
+meson-sm1-sei610.dt.yaml: leds: 'bluetooth' does not match any of the regexes: '(^led-[0-9a-f]$|led)', 'pinctrl-[0-9]+'
+meson-sm1-khadas-vim3l.dt.yaml: leds: 'red', 'white' do not match any of the regexes: '(^led-[0-9a-f]$|led)', 'pinctrl-[0-9]+'
+
+Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
+Signed-off-by: Kevin Hilman <khilman@baylibre.com>
+Link: https://lore.kernel.org/r/20200326165958.19274-6-narmstrong@baylibre.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/arm64/boot/dts/amlogic/meson-gx-libretech-pc.dtsi       | 4 ++--
+ arch/arm64/boot/dts/amlogic/meson-gxbb-nanopi-k2.dts         | 2 +-
+ arch/arm64/boot/dts/amlogic/meson-gxbb-nexbox-a95x.dts       | 2 +-
+ arch/arm64/boot/dts/amlogic/meson-gxbb-odroidc2.dts          | 2 +-
+ arch/arm64/boot/dts/amlogic/meson-gxbb-vega-s95.dtsi         | 2 +-
+ arch/arm64/boot/dts/amlogic/meson-gxbb-wetek-play2.dts       | 4 ++--
+ arch/arm64/boot/dts/amlogic/meson-gxbb-wetek.dtsi            | 2 +-
+ arch/arm64/boot/dts/amlogic/meson-gxl-s905x-libretech-cc.dts | 4 ++--
+ arch/arm64/boot/dts/amlogic/meson-gxm-rbox-pro.dts           | 4 ++--
+ arch/arm64/boot/dts/amlogic/meson-khadas-vim3.dtsi           | 4 ++--
+ arch/arm64/boot/dts/amlogic/meson-sm1-sei610.dts             | 2 +-
+ 11 files changed, 16 insertions(+), 16 deletions(-)
+
+diff --git a/arch/arm64/boot/dts/amlogic/meson-gx-libretech-pc.dtsi b/arch/arm64/boot/dts/amlogic/meson-gx-libretech-pc.dtsi
+index 248b018c83d57..b1da36fdeac6b 100644
+--- a/arch/arm64/boot/dts/amlogic/meson-gx-libretech-pc.dtsi
++++ b/arch/arm64/boot/dts/amlogic/meson-gx-libretech-pc.dtsi
+@@ -96,14 +96,14 @@
+       leds {
+               compatible = "gpio-leds";
+-              green {
++              led-green {
+                       color = <LED_COLOR_ID_GREEN>;
+                       function = LED_FUNCTION_DISK_ACTIVITY;
+                       gpios = <&gpio_ao GPIOAO_9 GPIO_ACTIVE_HIGH>;
+                       linux,default-trigger = "disk-activity";
+               };
+-              blue {
++              led-blue {
+                       color = <LED_COLOR_ID_BLUE>;
+                       function = LED_FUNCTION_STATUS;
+                       gpios = <&gpio GPIODV_28 GPIO_ACTIVE_HIGH>;
+diff --git a/arch/arm64/boot/dts/amlogic/meson-gxbb-nanopi-k2.dts b/arch/arm64/boot/dts/amlogic/meson-gxbb-nanopi-k2.dts
+index d6ca684e0e616..7be3e354093bf 100644
+--- a/arch/arm64/boot/dts/amlogic/meson-gxbb-nanopi-k2.dts
++++ b/arch/arm64/boot/dts/amlogic/meson-gxbb-nanopi-k2.dts
+@@ -29,7 +29,7 @@
+       leds {
+               compatible = "gpio-leds";
+-              stat {
++              led-stat {
+                       label = "nanopi-k2:blue:stat";
+                       gpios = <&gpio_ao GPIOAO_13 GPIO_ACTIVE_HIGH>;
+                       default-state = "on";
+diff --git a/arch/arm64/boot/dts/amlogic/meson-gxbb-nexbox-a95x.dts b/arch/arm64/boot/dts/amlogic/meson-gxbb-nexbox-a95x.dts
+index 65ec7dea828c1..67d901ed2fa3a 100644
+--- a/arch/arm64/boot/dts/amlogic/meson-gxbb-nexbox-a95x.dts
++++ b/arch/arm64/boot/dts/amlogic/meson-gxbb-nexbox-a95x.dts
+@@ -31,7 +31,7 @@
+       leds {
+               compatible = "gpio-leds";
+-              blue {
++              led-blue {
+                       label = "a95x:system-status";
+                       gpios = <&gpio_ao GPIOAO_13 GPIO_ACTIVE_LOW>;
+                       linux,default-trigger = "heartbeat";
+diff --git a/arch/arm64/boot/dts/amlogic/meson-gxbb-odroidc2.dts b/arch/arm64/boot/dts/amlogic/meson-gxbb-odroidc2.dts
+index b46ef985bb444..70fcfb7b0683d 100644
+--- a/arch/arm64/boot/dts/amlogic/meson-gxbb-odroidc2.dts
++++ b/arch/arm64/boot/dts/amlogic/meson-gxbb-odroidc2.dts
+@@ -49,7 +49,7 @@
+       leds {
+               compatible = "gpio-leds";
+-              blue {
++              led-blue {
+                       label = "c2:blue:alive";
+                       gpios = <&gpio_ao GPIOAO_13 GPIO_ACTIVE_LOW>;
+                       linux,default-trigger = "heartbeat";
+diff --git a/arch/arm64/boot/dts/amlogic/meson-gxbb-vega-s95.dtsi b/arch/arm64/boot/dts/amlogic/meson-gxbb-vega-s95.dtsi
+index 45cb83625951a..222ee8069cfaa 100644
+--- a/arch/arm64/boot/dts/amlogic/meson-gxbb-vega-s95.dtsi
++++ b/arch/arm64/boot/dts/amlogic/meson-gxbb-vega-s95.dtsi
+@@ -20,7 +20,7 @@
+       leds {
+               compatible = "gpio-leds";
+-              blue {
++              led-blue {
+                       label = "vega-s95:blue:on";
+                       gpios = <&gpio_ao GPIOAO_13 GPIO_ACTIVE_HIGH>;
+                       default-state = "on";
+diff --git a/arch/arm64/boot/dts/amlogic/meson-gxbb-wetek-play2.dts b/arch/arm64/boot/dts/amlogic/meson-gxbb-wetek-play2.dts
+index 1d32d1f6d0327..2ab8a3d100791 100644
+--- a/arch/arm64/boot/dts/amlogic/meson-gxbb-wetek-play2.dts
++++ b/arch/arm64/boot/dts/amlogic/meson-gxbb-wetek-play2.dts
+@@ -14,13 +14,13 @@
+       model = "WeTek Play 2";
+       leds {
+-              wifi {
++              led-wifi {
+                       label = "wetek-play:wifi-status";
+                       gpios = <&gpio GPIODV_26 GPIO_ACTIVE_HIGH>;
+                       default-state = "off";
+               };
+-              ethernet {
++              led-ethernet {
+                       label = "wetek-play:ethernet-status";
+                       gpios = <&gpio GPIODV_27 GPIO_ACTIVE_HIGH>;
+                       default-state = "off";
+diff --git a/arch/arm64/boot/dts/amlogic/meson-gxbb-wetek.dtsi b/arch/arm64/boot/dts/amlogic/meson-gxbb-wetek.dtsi
+index dee51cf952237..d6133af09d643 100644
+--- a/arch/arm64/boot/dts/amlogic/meson-gxbb-wetek.dtsi
++++ b/arch/arm64/boot/dts/amlogic/meson-gxbb-wetek.dtsi
+@@ -25,7 +25,7 @@
+       leds {
+               compatible = "gpio-leds";
+-              system {
++              led-system {
+                       label = "wetek-play:system-status";
+                       gpios = <&gpio_ao GPIOAO_13 GPIO_ACTIVE_HIGH>;
+                       default-state = "on";
+diff --git a/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-libretech-cc.dts b/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-libretech-cc.dts
+index e8348b2728db5..a4a71c13891b2 100644
+--- a/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-libretech-cc.dts
++++ b/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-libretech-cc.dts
+@@ -54,14 +54,14 @@
+       leds {
+               compatible = "gpio-leds";
+-              system {
++              led-system {
+                       label = "librecomputer:system-status";
+                       gpios = <&gpio GPIODV_24 GPIO_ACTIVE_HIGH>;
+                       default-state = "on";
+                       panic-indicator;
+               };
+-              blue {
++              led-blue {
+                       label = "librecomputer:blue";
+                       gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_HIGH>;
+                       linux,default-trigger = "heartbeat";
+diff --git a/arch/arm64/boot/dts/amlogic/meson-gxm-rbox-pro.dts b/arch/arm64/boot/dts/amlogic/meson-gxm-rbox-pro.dts
+index 420a88e9a1950..c89c9f846fb10 100644
+--- a/arch/arm64/boot/dts/amlogic/meson-gxm-rbox-pro.dts
++++ b/arch/arm64/boot/dts/amlogic/meson-gxm-rbox-pro.dts
+@@ -36,13 +36,13 @@
+       leds {
+               compatible = "gpio-leds";
+-              blue {
++              led-blue {
+                       label = "rbox-pro:blue:on";
+                       gpios = <&gpio_ao GPIOAO_9 GPIO_ACTIVE_HIGH>;
+                       default-state = "on";
+               };
+-              red {
++              led-red {
+                       label = "rbox-pro:red:standby";
+                       gpios = <&gpio GPIODV_28 GPIO_ACTIVE_HIGH>;
+                       default-state = "off";
+diff --git a/arch/arm64/boot/dts/amlogic/meson-khadas-vim3.dtsi b/arch/arm64/boot/dts/amlogic/meson-khadas-vim3.dtsi
+index 094ecf2222bbf..1ef1e3672b967 100644
+--- a/arch/arm64/boot/dts/amlogic/meson-khadas-vim3.dtsi
++++ b/arch/arm64/boot/dts/amlogic/meson-khadas-vim3.dtsi
+@@ -39,13 +39,13 @@
+       leds {
+               compatible = "gpio-leds";
+-              white {
++              led-white {
+                       label = "vim3:white:sys";
+                       gpios = <&gpio_ao GPIOAO_4 GPIO_ACTIVE_LOW>;
+                       linux,default-trigger = "heartbeat";
+               };
+-              red {
++              led-red {
+                       label = "vim3:red";
+                       gpios = <&gpio_expander 5 GPIO_ACTIVE_LOW>;
+               };
+diff --git a/arch/arm64/boot/dts/amlogic/meson-sm1-sei610.dts b/arch/arm64/boot/dts/amlogic/meson-sm1-sei610.dts
+index dfb2438851c0c..5ab139a34c018 100644
+--- a/arch/arm64/boot/dts/amlogic/meson-sm1-sei610.dts
++++ b/arch/arm64/boot/dts/amlogic/meson-sm1-sei610.dts
+@@ -104,7 +104,7 @@
+       leds {
+               compatible = "gpio-leds";
+-              bluetooth {
++              led-bluetooth {
+                       label = "sei610:blue:bt";
+                       gpios = <&gpio GPIOC_7 (GPIO_ACTIVE_LOW | GPIO_OPEN_DRAIN)>;
+                       default-state = "off";
+-- 
+2.25.1
+
diff --git a/queue-5.7/arm64-dts-meson-fixup-scp-sram-nodes.patch b/queue-5.7/arm64-dts-meson-fixup-scp-sram-nodes.patch
new file mode 100644 (file)
index 0000000..9bf2c44
--- /dev/null
@@ -0,0 +1,85 @@
+From 0afe4723e50212078990091f8b7d92c499427eed Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 26 Mar 2020 17:59:55 +0100
+Subject: arm64: dts: meson: fixup SCP sram nodes
+
+From: Neil Armstrong <narmstrong@baylibre.com>
+
+[ Upstream commit 9ecded10b4b6af238da0c86197b0418912e7513e ]
+
+The GX and AXG SCP sram nodes were using invalid compatible and
+node names for the sram entries.
+
+Fixup the sram entries node names, and use proper compatible for them.
+
+It notably fixes:
+sram@c8000000: 'scp-shmem@0', 'scp-shmem@200' do not match any of the regexes: '^([a-z]*-)?sram(-section)?@[a-f0-9]+$', 'pinctrl-[0-9]+'
+
+Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
+Signed-off-by: Kevin Hilman <khilman@baylibre.com>
+Link: https://lore.kernel.org/r/20200326165958.19274-3-narmstrong@baylibre.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/arm64/boot/dts/amlogic/meson-axg.dtsi |  6 +++---
+ arch/arm64/boot/dts/amlogic/meson-gx.dtsi  | 10 +++++-----
+ 2 files changed, 8 insertions(+), 8 deletions(-)
+
+diff --git a/arch/arm64/boot/dts/amlogic/meson-axg.dtsi b/arch/arm64/boot/dts/amlogic/meson-axg.dtsi
+index aace3d32a3df2..8e6281c685fad 100644
+--- a/arch/arm64/boot/dts/amlogic/meson-axg.dtsi
++++ b/arch/arm64/boot/dts/amlogic/meson-axg.dtsi
+@@ -1735,18 +1735,18 @@
+               };
+               sram: sram@fffc0000 {
+-                      compatible = "amlogic,meson-axg-sram", "mmio-sram";
++                      compatible = "mmio-sram";
+                       reg = <0x0 0xfffc0000 0x0 0x20000>;
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       ranges = <0 0x0 0xfffc0000 0x20000>;
+-                      cpu_scp_lpri: scp-shmem@13000 {
++                      cpu_scp_lpri: scp-sram@13000 {
+                               compatible = "amlogic,meson-axg-scp-shmem";
+                               reg = <0x13000 0x400>;
+                       };
+-                      cpu_scp_hpri: scp-shmem@13400 {
++                      cpu_scp_hpri: scp-sram@13400 {
+                               compatible = "amlogic,meson-axg-scp-shmem";
+                               reg = <0x13400 0x400>;
+                       };
+diff --git a/arch/arm64/boot/dts/amlogic/meson-gx.dtsi b/arch/arm64/boot/dts/amlogic/meson-gx.dtsi
+index 03f79fe045b7f..e2bb68ec85025 100644
+--- a/arch/arm64/boot/dts/amlogic/meson-gx.dtsi
++++ b/arch/arm64/boot/dts/amlogic/meson-gx.dtsi
+@@ -398,20 +398,20 @@
+               };
+               sram: sram@c8000000 {
+-                      compatible = "amlogic,meson-gx-sram", "amlogic,meson-gxbb-sram", "mmio-sram";
++                      compatible = "mmio-sram";
+                       reg = <0x0 0xc8000000 0x0 0x14000>;
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       ranges = <0 0x0 0xc8000000 0x14000>;
+-                      cpu_scp_lpri: scp-shmem@0 {
+-                              compatible = "amlogic,meson-gx-scp-shmem", "amlogic,meson-gxbb-scp-shmem";
++                      cpu_scp_lpri: scp-sram@0 {
++                              compatible = "amlogic,meson-gxbb-scp-shmem";
+                               reg = <0x13000 0x400>;
+                       };
+-                      cpu_scp_hpri: scp-shmem@200 {
+-                              compatible = "amlogic,meson-gx-scp-shmem", "amlogic,meson-gxbb-scp-shmem";
++                      cpu_scp_hpri: scp-sram@200 {
++                              compatible = "amlogic,meson-gxbb-scp-shmem";
+                               reg = <0x13400 0x400>;
+                       };
+               };
+-- 
+2.25.1
+
diff --git a/queue-5.7/arm64-dts-meson-g12b-ugoos-am6-fix-board-compatible.patch b/queue-5.7/arm64-dts-meson-g12b-ugoos-am6-fix-board-compatible.patch
new file mode 100644 (file)
index 0000000..e58c6b6
--- /dev/null
@@ -0,0 +1,38 @@
+From 0ec5ccaaf53aa5c0712fcf334158c8fec151490a Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 26 Mar 2020 17:59:56 +0100
+Subject: arm64: dts: meson-g12b-ugoos-am6: fix board compatible
+
+From: Neil Armstrong <narmstrong@baylibre.com>
+
+[ Upstream commit 5c28dcbb3a1be167c07784b5f710ec602a57bea2 ]
+
+Add missing amlogic,s922x in the board compatible list.
+
+It fixes:
+meson-g12b-ugoos-am6.dt.yaml: /: compatible: ['ugoos,am6', 'amlogic,g12b'] is not valid under any of the given schemas
+
+Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
+Signed-off-by: Kevin Hilman <khilman@baylibre.com>
+Link: https://lore.kernel.org/r/20200326165958.19274-4-narmstrong@baylibre.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/arm64/boot/dts/amlogic/meson-g12b-ugoos-am6.dts | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/arch/arm64/boot/dts/amlogic/meson-g12b-ugoos-am6.dts b/arch/arm64/boot/dts/amlogic/meson-g12b-ugoos-am6.dts
+index 06c5430eb92d1..fdaacfd96b97f 100644
+--- a/arch/arm64/boot/dts/amlogic/meson-g12b-ugoos-am6.dts
++++ b/arch/arm64/boot/dts/amlogic/meson-g12b-ugoos-am6.dts
+@@ -14,7 +14,7 @@
+ #include <dt-bindings/sound/meson-g12a-tohdmitx.h>
+ / {
+-      compatible = "ugoos,am6", "amlogic,g12b";
++      compatible = "ugoos,am6", "amlogic,s922x", "amlogic,g12b";
+       model = "Ugoos AM6";
+       aliases {
+-- 
+2.25.1
+
diff --git a/queue-5.7/arm64-dts-meson-gxbb-kii-pro-fix-board-compatible.patch b/queue-5.7/arm64-dts-meson-gxbb-kii-pro-fix-board-compatible.patch
new file mode 100644 (file)
index 0000000..7dd809d
--- /dev/null
@@ -0,0 +1,38 @@
+From 78ff2aa30f2c40659aa509a2342c055efdf2a840 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 26 Mar 2020 17:59:57 +0100
+Subject: arm64: dts: meson-gxbb-kii-pro: fix board compatible
+
+From: Neil Armstrong <narmstrong@baylibre.com>
+
+[ Upstream commit d120b5f98031eefc22164ae8c6ea3711e7a04c19 ]
+
+Remove the uneeded "amlogic,p201", "amlogic,s905" in the board compatible list.
+
+It fixes:
+meson-gxbb-kii-pro.dt.yaml: /: compatible: ['videostrong,kii-pro', 'amlogic,p201', 'amlogic,s905', 'amlogic,meson-gxbb'] is not valid under any of the given schemas
+
+Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
+Signed-off-by: Kevin Hilman <khilman@baylibre.com>
+Link: https://lore.kernel.org/r/20200326165958.19274-5-narmstrong@baylibre.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/arm64/boot/dts/amlogic/meson-gxbb-kii-pro.dts | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/arch/arm64/boot/dts/amlogic/meson-gxbb-kii-pro.dts b/arch/arm64/boot/dts/amlogic/meson-gxbb-kii-pro.dts
+index 6c9cc45fb417e..e8394a8269ee1 100644
+--- a/arch/arm64/boot/dts/amlogic/meson-gxbb-kii-pro.dts
++++ b/arch/arm64/boot/dts/amlogic/meson-gxbb-kii-pro.dts
+@@ -11,7 +11,7 @@
+ #include <dt-bindings/input/input.h>
+ #include <dt-bindings/leds/common.h>
+ / {
+-      compatible = "videostrong,kii-pro", "amlogic,p201", "amlogic,s905", "amlogic,meson-gxbb";
++      compatible = "videostrong,kii-pro", "amlogic,meson-gxbb";
+       model = "Videostrong KII Pro";
+       leds {
+-- 
+2.25.1
+
diff --git a/queue-5.7/arm64-dts-msm8996-fix-csi-irq-types.patch b/queue-5.7/arm64-dts-msm8996-fix-csi-irq-types.patch
new file mode 100644 (file)
index 0000000..b727037
--- /dev/null
@@ -0,0 +1,55 @@
+From 4326fd9a2c426ded9e79f73cc3d0807ff75ca42d Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 21 Apr 2020 14:00:24 +0200
+Subject: arm64: dts: msm8996: Fix CSI IRQ types
+
+From: Loic Poulain <loic.poulain@linaro.org>
+
+[ Upstream commit 4a4a26317ec8aba575f6b85789a42639937bc1a4 ]
+
+Each IRQ_TYPE_NONE interrupt causes a warning at boot.
+Fix that by defining an appropriate type.
+
+Fixes: e0531312e78f ("arm64: dts: qcom: msm8996: Add CAMSS support")
+Signed-off-by: Loic Poulain <loic.poulain@linaro.org>
+Link: https://lore.kernel.org/r/1587470425-13726-1-git-send-email-loic.poulain@linaro.org
+Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/arm64/boot/dts/qcom/msm8996.dtsi | 20 ++++++++++----------
+ 1 file changed, 10 insertions(+), 10 deletions(-)
+
+diff --git a/arch/arm64/boot/dts/qcom/msm8996.dtsi b/arch/arm64/boot/dts/qcom/msm8996.dtsi
+index 98634d5c44405..d22c364b520ae 100644
+--- a/arch/arm64/boot/dts/qcom/msm8996.dtsi
++++ b/arch/arm64/boot/dts/qcom/msm8996.dtsi
+@@ -989,16 +989,16 @@
+                               "csi_clk_mux",
+                               "vfe0",
+                               "vfe1";
+-                      interrupts = <GIC_SPI 78 0>,
+-                              <GIC_SPI 79 0>,
+-                              <GIC_SPI 80 0>,
+-                              <GIC_SPI 296 0>,
+-                              <GIC_SPI 297 0>,
+-                              <GIC_SPI 298 0>,
+-                              <GIC_SPI 299 0>,
+-                              <GIC_SPI 309 0>,
+-                              <GIC_SPI 314 0>,
+-                              <GIC_SPI 315 0>;
++                      interrupts = <GIC_SPI 78 IRQ_TYPE_EDGE_RISING>,
++                              <GIC_SPI 79 IRQ_TYPE_EDGE_RISING>,
++                              <GIC_SPI 80 IRQ_TYPE_EDGE_RISING>,
++                              <GIC_SPI 296 IRQ_TYPE_EDGE_RISING>,
++                              <GIC_SPI 297 IRQ_TYPE_EDGE_RISING>,
++                              <GIC_SPI 298 IRQ_TYPE_EDGE_RISING>,
++                              <GIC_SPI 299 IRQ_TYPE_EDGE_RISING>,
++                              <GIC_SPI 309 IRQ_TYPE_EDGE_RISING>,
++                              <GIC_SPI 314 IRQ_TYPE_EDGE_RISING>,
++                              <GIC_SPI 315 IRQ_TYPE_EDGE_RISING>;
+                       interrupt-names = "csiphy0",
+                               "csiphy1",
+                               "csiphy2",
+-- 
+2.25.1
+
diff --git a/queue-5.7/arm64-dts-mt8173-fix-unit-name-warnings.patch b/queue-5.7/arm64-dts-mt8173-fix-unit-name-warnings.patch
new file mode 100644 (file)
index 0000000..c22072e
--- /dev/null
@@ -0,0 +1,130 @@
+From 5ebff2c36dcde2c2dd34e74e079c25b9ad0a8c09 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 10 Feb 2020 14:35:22 +0800
+Subject: arm64: dts: mt8173: fix unit name warnings
+
+From: Hsin-Yi Wang <hsinyi@chromium.org>
+
+[ Upstream commit 72b29215aced394d01ca25e432963b619daa0098 ]
+
+Fixing several unit name warnings:
+
+Warning (unit_address_vs_reg): /oscillator@0: node has a unit name, but no reg property
+Warning (unit_address_vs_reg): /oscillator@1: node has a unit name, but no reg property
+Warning (unit_address_vs_reg): /oscillator@2: node has a unit name, but no reg property
+Warning (unit_address_vs_reg): /thermal-zones/cpu_thermal/trips/trip-point@0: node has a unit name, but no reg property
+Warning (unit_address_vs_reg): /thermal-zones/cpu_thermal/trips/trip-point@1: node has a unit name, but no reg property
+Warning (unit_address_vs_reg): /thermal-zones/cpu_thermal/trips/cpu_crit@0: node has a unit name, but no reg property
+Warning (unit_address_vs_reg): /thermal-zones/cpu_thermal/cooling-maps/map@0: node has a unit name, but no reg property
+Warning (unit_address_vs_reg): /thermal-zones/cpu_thermal/cooling-maps/map@1: node has a unit name, but no reg property
+Warning (unit_address_vs_reg): /reserved-memory/vpu_dma_mem_region: node has a reg or ranges property, but no unit name
+Warning (simple_bus_reg): /soc/pinctrl@10005000: simple-bus unit address format error, expected "1000b000"
+Warning (simple_bus_reg): /soc/interrupt-controller@10220000: simple-bus unit address format error, expected "10221000"
+
+Signed-off-by: Hsin-Yi Wang <hsinyi@chromium.org>
+Link: https://lore.kernel.org/r/20200210063523.133333-4-hsinyi@chromium.org
+[mb: drop fixes for '_' in property name]
+Signed-off-by: Matthias Brugger <matthias.bgg@gmail.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/arm64/boot/dts/mediatek/mt8173.dtsi | 22 +++++++++++-----------
+ 1 file changed, 11 insertions(+), 11 deletions(-)
+
+diff --git a/arch/arm64/boot/dts/mediatek/mt8173.dtsi b/arch/arm64/boot/dts/mediatek/mt8173.dtsi
+index d819e44d94a8d..6ad1053afd271 100644
+--- a/arch/arm64/boot/dts/mediatek/mt8173.dtsi
++++ b/arch/arm64/boot/dts/mediatek/mt8173.dtsi
+@@ -242,21 +242,21 @@
+               cpu_on        = <0x84000003>;
+       };
+-      clk26m: oscillator@0 {
++      clk26m: oscillator0 {
+               compatible = "fixed-clock";
+               #clock-cells = <0>;
+               clock-frequency = <26000000>;
+               clock-output-names = "clk26m";
+       };
+-      clk32k: oscillator@1 {
++      clk32k: oscillator1 {
+               compatible = "fixed-clock";
+               #clock-cells = <0>;
+               clock-frequency = <32000>;
+               clock-output-names = "clk32k";
+       };
+-      cpum_ck: oscillator@2 {
++      cpum_ck: oscillator2 {
+               compatible = "fixed-clock";
+               #clock-cells = <0>;
+               clock-frequency = <0>;
+@@ -272,19 +272,19 @@
+                       sustainable-power = <1500>; /* milliwatts */
+                       trips {
+-                              threshold: trip-point@0 {
++                              threshold: trip-point0 {
+                                       temperature = <68000>;
+                                       hysteresis = <2000>;
+                                       type = "passive";
+                               };
+-                              target: trip-point@1 {
++                              target: trip-point1 {
+                                       temperature = <85000>;
+                                       hysteresis = <2000>;
+                                       type = "passive";
+                               };
+-                              cpu_crit: cpu_crit@0 {
++                              cpu_crit: cpu_crit0 {
+                                       temperature = <115000>;
+                                       hysteresis = <2000>;
+                                       type = "critical";
+@@ -292,13 +292,13 @@
+                       };
+                       cooling-maps {
+-                              map@0 {
++                              map0 {
+                                       trip = <&target>;
+                                       cooling-device = <&cpu0 0 0>,
+                                                        <&cpu1 0 0>;
+                                       contribution = <3072>;
+                               };
+-                              map@1 {
++                              map1 {
+                                       trip = <&target>;
+                                       cooling-device = <&cpu2 0 0>,
+                                                        <&cpu3 0 0>;
+@@ -312,7 +312,7 @@
+               #address-cells = <2>;
+               #size-cells = <2>;
+               ranges;
+-              vpu_dma_reserved: vpu_dma_mem_region {
++              vpu_dma_reserved: vpu_dma_mem_region@b7000000 {
+                       compatible = "shared-dma-pool";
+                       reg = <0 0xb7000000 0 0x500000>;
+                       alignment = <0x1000>;
+@@ -365,7 +365,7 @@
+                       reg = <0 0x10005000 0 0x1000>;
+               };
+-              pio: pinctrl@10005000 {
++              pio: pinctrl@1000b000 {
+                       compatible = "mediatek,mt8173-pinctrl";
+                       reg = <0 0x1000b000 0 0x1000>;
+                       mediatek,pctl-regmap = <&syscfg_pctl_a>;
+@@ -572,7 +572,7 @@
+                       status = "disabled";
+               };
+-              gic: interrupt-controller@10220000 {
++              gic: interrupt-controller@10221000 {
+                       compatible = "arm,gic-400";
+                       #interrupt-cells = <3>;
+                       interrupt-parent = <&gic>;
+-- 
+2.25.1
+
diff --git a/queue-5.7/arm64-dts-qcom-c630-add-wifi-node.patch b/queue-5.7/arm64-dts-qcom-c630-add-wifi-node.patch
new file mode 100644 (file)
index 0000000..795aa17
--- /dev/null
@@ -0,0 +1,44 @@
+From 422e3831f93f8283ddd8f6f7e1e0ca3a62fd1b53 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 17 Oct 2019 22:58:41 -0700
+Subject: arm64: dts: qcom: c630: Add WiFi node
+
+From: Bjorn Andersson <bjorn.andersson@linaro.org>
+
+[ Upstream commit 3fb298d0b2f2a1d47d53806d4ddf8f4ae83353cc ]
+
+Specify regulators and enable the &wifi node. The firmware uses the 8
+bit version of the host capability message, so specify this quirk.
+
+Reviewed-by: Robert Foss <robert.foss@linaro.org>
+Reviewed-by: Vinod Koul <vkoul@kernel.org>
+Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
+Link: https://lore.kernel.org/r/20191018055841.3729591-1-bjorn.andersson@linaro.org
+Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/arm64/boot/dts/qcom/sdm850-lenovo-yoga-c630.dts | 11 +++++++++++
+ 1 file changed, 11 insertions(+)
+
+diff --git a/arch/arm64/boot/dts/qcom/sdm850-lenovo-yoga-c630.dts b/arch/arm64/boot/dts/qcom/sdm850-lenovo-yoga-c630.dts
+index 51a670ad15b24..4b9860a2c8ebd 100644
+--- a/arch/arm64/boot/dts/qcom/sdm850-lenovo-yoga-c630.dts
++++ b/arch/arm64/boot/dts/qcom/sdm850-lenovo-yoga-c630.dts
+@@ -577,3 +577,14 @@
+               };
+       };
+ };
++
++&wifi {
++      status = "okay";
++
++      vdd-0.8-cx-mx-supply = <&vreg_l5a_0p8>;
++      vdd-1.8-xo-supply = <&vreg_l7a_1p8>;
++      vdd-1.3-rfa-supply = <&vreg_l17a_1p3>;
++      vdd-3.3-ch0-supply = <&vreg_l25a_3p3>;
++
++      qcom,snoc-host-cap-8bit-quirk;
++};
+-- 
+2.25.1
+
diff --git a/queue-5.7/arm64-dts-qcom-db820c-fix-invalid-pm8994-supplies.patch b/queue-5.7/arm64-dts-qcom-db820c-fix-invalid-pm8994-supplies.patch
new file mode 100644 (file)
index 0000000..062fbbc
--- /dev/null
@@ -0,0 +1,64 @@
+From e8c0c5f602c076702e940e3d75e30b4ab7952152 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 17 Apr 2020 00:07:12 -0700
+Subject: arm64: dts: qcom: db820c: Fix invalid pm8994 supplies
+
+From: Bjorn Andersson <bjorn.andersson@linaro.org>
+
+[ Upstream commit 1cacdf5d3bb9644ac7b9339c611ac5b9dd90d09d ]
+
+It's uncertain where the "vreg_s8a_l3a_input" comes from, but the supply
+for VDD_L3_L11 on PM8994 should be VREG_S3A_1P3, so correct this - and
+drop the vreg_s8a_l3a_input.
+
+Reviewed-by: Vinod Koul <vkoul@kernel.org>
+Fixes: 83d9ed4342a3 ("arm64: dts: qcom: db820c: Use regulator names from schematics")
+Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
+Link: https://lore.kernel.org/r/20200417070712.1376355-1-bjorn.andersson@linaro.org
+Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/arm64/boot/dts/qcom/apq8096-db820c.dtsi | 14 ++------------
+ 1 file changed, 2 insertions(+), 12 deletions(-)
+
+diff --git a/arch/arm64/boot/dts/qcom/apq8096-db820c.dtsi b/arch/arm64/boot/dts/qcom/apq8096-db820c.dtsi
+index c4abbccf2bed0..eaa1eb70b4555 100644
+--- a/arch/arm64/boot/dts/qcom/apq8096-db820c.dtsi
++++ b/arch/arm64/boot/dts/qcom/apq8096-db820c.dtsi
+@@ -117,16 +117,6 @@
+               regulator-max-microvolt = <3700000>;
+       };
+-      vreg_s8a_l3a_input: vreg-s8a-l3a-input {
+-              compatible = "regulator-fixed";
+-              regulator-name = "vreg_s8a_l3a_input";
+-              regulator-always-on;
+-              regulator-boot-on;
+-
+-              regulator-min-microvolt = <0>;
+-              regulator-max-microvolt = <0>;
+-      };
+-
+       wlan_en: wlan-en-1-8v {
+               pinctrl-names = "default";
+               pinctrl-0 = <&wlan_en_gpios>;
+@@ -705,14 +695,14 @@
+               vdd_s11-supply = <&vph_pwr>;
+               vdd_s12-supply = <&vph_pwr>;
+               vdd_l2_l26_l28-supply = <&vreg_s3a_1p3>;
+-              vdd_l3_l11-supply = <&vreg_s8a_l3a_input>;
++              vdd_l3_l11-supply = <&vreg_s3a_1p3>;
+               vdd_l4_l27_l31-supply = <&vreg_s3a_1p3>;
+               vdd_l5_l7-supply = <&vreg_s5a_2p15>;
+               vdd_l6_l12_l32-supply = <&vreg_s5a_2p15>;
+               vdd_l8_l16_l30-supply = <&vph_pwr>;
+               vdd_l14_l15-supply = <&vreg_s5a_2p15>;
+               vdd_l25-supply = <&vreg_s3a_1p3>;
+-              vdd_lvs1_2-supply = <&vreg_s4a_1p8>;
++              vdd_lvs1_lvs2-supply = <&vreg_s4a_1p8>;
+               vreg_s3a_1p3: s3 {
+                       regulator-name = "vreg_s3a_1p3";
+-- 
+2.25.1
+
diff --git a/queue-5.7/arm64-dts-qcom-fix-pm8150-gpio-interrupts.patch b/queue-5.7/arm64-dts-qcom-fix-pm8150-gpio-interrupts.patch
new file mode 100644 (file)
index 0000000..098c159
--- /dev/null
@@ -0,0 +1,107 @@
+From f4136a1937fa07b26d8175362d7a9d1800666187 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 20 Apr 2020 11:35:43 -0400
+Subject: arm64: dts: qcom: fix pm8150 gpio interrupts
+
+From: Jonathan Marek <jonathan@marek.ca>
+
+[ Upstream commit 61d2ca503d0b55d2849fd656ce51d8e1e9ba0b6c ]
+
+This was mistakenly copied from the downstream dts, however the upstream
+driver works differently.
+
+I only tested this with the pm8150_gpios node (used with volume button),
+but the 2 others should be the same.
+
+Fixes: e92b61c8e775 ("arm64: dts: qcom: pm8150l: Add base dts file")
+Fixes: 229d5bcad0d0 ("arm64: dts: qcom: pm8150b: Add base dts file")
+Fixes: 5101f22a5c37 ("arm64: dts: qcom: pm8150: Add base dts file")
+Reviewed-by: Bjorn Andersson <bjorn.andersson@linaro.org>
+Signed-off-by: Jonathan Marek <jonathan@marek.ca>
+Link: https://lore.kernel.org/r/20200420153543.14512-1-jonathan@marek.ca
+Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/arm64/boot/dts/qcom/pm8150.dtsi  | 14 ++------------
+ arch/arm64/boot/dts/qcom/pm8150b.dtsi | 14 ++------------
+ arch/arm64/boot/dts/qcom/pm8150l.dtsi | 14 ++------------
+ 3 files changed, 6 insertions(+), 36 deletions(-)
+
+diff --git a/arch/arm64/boot/dts/qcom/pm8150.dtsi b/arch/arm64/boot/dts/qcom/pm8150.dtsi
+index b6e304748a576..c0b197458665d 100644
+--- a/arch/arm64/boot/dts/qcom/pm8150.dtsi
++++ b/arch/arm64/boot/dts/qcom/pm8150.dtsi
+@@ -73,18 +73,8 @@
+                       reg = <0xc000>;
+                       gpio-controller;
+                       #gpio-cells = <2>;
+-                      interrupts = <0x0 0xc0 0x0 IRQ_TYPE_NONE>,
+-                                   <0x0 0xc1 0x0 IRQ_TYPE_NONE>,
+-                                   <0x0 0xc2 0x0 IRQ_TYPE_NONE>,
+-                                   <0x0 0xc3 0x0 IRQ_TYPE_NONE>,
+-                                   <0x0 0xc4 0x0 IRQ_TYPE_NONE>,
+-                                   <0x0 0xc5 0x0 IRQ_TYPE_NONE>,
+-                                   <0x0 0xc6 0x0 IRQ_TYPE_NONE>,
+-                                   <0x0 0xc7 0x0 IRQ_TYPE_NONE>,
+-                                   <0x0 0xc8 0x0 IRQ_TYPE_NONE>,
+-                                   <0x0 0xc9 0x0 IRQ_TYPE_NONE>,
+-                                   <0x0 0xca 0x0 IRQ_TYPE_NONE>,
+-                                   <0x0 0xcb 0x0 IRQ_TYPE_NONE>;
++                      interrupt-controller;
++                      #interrupt-cells = <2>;
+               };
+       };
+diff --git a/arch/arm64/boot/dts/qcom/pm8150b.dtsi b/arch/arm64/boot/dts/qcom/pm8150b.dtsi
+index 322379d5c31f9..40b5d75a4a1dc 100644
+--- a/arch/arm64/boot/dts/qcom/pm8150b.dtsi
++++ b/arch/arm64/boot/dts/qcom/pm8150b.dtsi
+@@ -62,18 +62,8 @@
+                       reg = <0xc000>;
+                       gpio-controller;
+                       #gpio-cells = <2>;
+-                      interrupts = <0x2 0xc0 0x0 IRQ_TYPE_NONE>,
+-                                   <0x2 0xc1 0x0 IRQ_TYPE_NONE>,
+-                                   <0x2 0xc2 0x0 IRQ_TYPE_NONE>,
+-                                   <0x2 0xc3 0x0 IRQ_TYPE_NONE>,
+-                                   <0x2 0xc4 0x0 IRQ_TYPE_NONE>,
+-                                   <0x2 0xc5 0x0 IRQ_TYPE_NONE>,
+-                                   <0x2 0xc6 0x0 IRQ_TYPE_NONE>,
+-                                   <0x2 0xc7 0x0 IRQ_TYPE_NONE>,
+-                                   <0x2 0xc8 0x0 IRQ_TYPE_NONE>,
+-                                   <0x2 0xc9 0x0 IRQ_TYPE_NONE>,
+-                                   <0x2 0xca 0x0 IRQ_TYPE_NONE>,
+-                                   <0x2 0xcb 0x0 IRQ_TYPE_NONE>;
++                      interrupt-controller;
++                      #interrupt-cells = <2>;
+               };
+       };
+diff --git a/arch/arm64/boot/dts/qcom/pm8150l.dtsi b/arch/arm64/boot/dts/qcom/pm8150l.dtsi
+index eb0e9a090e420..cf05e0685d101 100644
+--- a/arch/arm64/boot/dts/qcom/pm8150l.dtsi
++++ b/arch/arm64/boot/dts/qcom/pm8150l.dtsi
+@@ -56,18 +56,8 @@
+                       reg = <0xc000>;
+                       gpio-controller;
+                       #gpio-cells = <2>;
+-                      interrupts = <0x4 0xc0 0x0 IRQ_TYPE_NONE>,
+-                                   <0x4 0xc1 0x0 IRQ_TYPE_NONE>,
+-                                   <0x4 0xc2 0x0 IRQ_TYPE_NONE>,
+-                                   <0x4 0xc3 0x0 IRQ_TYPE_NONE>,
+-                                   <0x4 0xc4 0x0 IRQ_TYPE_NONE>,
+-                                   <0x4 0xc5 0x0 IRQ_TYPE_NONE>,
+-                                   <0x4 0xc6 0x0 IRQ_TYPE_NONE>,
+-                                   <0x4 0xc7 0x0 IRQ_TYPE_NONE>,
+-                                   <0x4 0xc8 0x0 IRQ_TYPE_NONE>,
+-                                   <0x4 0xc9 0x0 IRQ_TYPE_NONE>,
+-                                   <0x4 0xca 0x0 IRQ_TYPE_NONE>,
+-                                   <0x4 0xcb 0x0 IRQ_TYPE_NONE>;
++                      interrupt-controller;
++                      #interrupt-cells = <2>;
+               };
+       };
+-- 
+2.25.1
+
diff --git a/queue-5.7/arm64-dts-qcom-msm8916-remove-unit-name-for-thermal-.patch b/queue-5.7/arm64-dts-qcom-msm8916-remove-unit-name-for-thermal-.patch
new file mode 100644 (file)
index 0000000..44cab3f
--- /dev/null
@@ -0,0 +1,84 @@
+From 8f8fa9950fa456d81b12d6043f8f459d11d8565a Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 30 Mar 2020 15:36:26 +0530
+Subject: arm64: dts: qcom: msm8916: remove unit name for thermal trip points
+
+From: Amit Kucheria <amit.kucheria@linaro.org>
+
+[ Upstream commit fe2aff0c574d206f34f1864d5a0b093694c27142 ]
+
+The thermal trip points have unit name but no reg property, so we can
+remove them. It also fixes the following warnings from 'make dtbs_check'
+after adding the thermal yaml bindings.
+
+arch/arm64/boot/dts/qcom/apq8016-sbc.dt.yaml: thermal-zones:
+gpu-thermal:trips: 'trip-point@0' does not match any of the regexes:
+'^[a-zA-Z][a-zA-Z0-9\\-_]{0,63}$', 'pinctrl-[0-9]+'
+arch/arm64/boot/dts/qcom/apq8016-sbc.dt.yaml: thermal-zones:
+camera-thermal:trips: 'trip-point@0' does not match any of the regexes:
+'^[a-zA-Z][a-zA-Z0-9\\-_]{0,63}$', 'pinctrl-[0-9]+'
+arch/arm64/boot/dts/qcom/apq8016-sbc.dt.yaml: thermal-zones:
+modem-thermal:trips: 'trip-point@0' does not match any of the regexes:
+'^[a-zA-Z][a-zA-Z0-9\\-_]{0,63}$', 'pinctrl-[0-9]+'
+
+arch/arm64/boot/dts/qcom/msm8916-mtp.dt.yaml: thermal-zones:
+gpu-thermal:trips: 'trip-point@0' does not match any of the regexes:
+'^[a-zA-Z][a-zA-Z0-9\\-_]{0,63}$', 'pinctrl-[0-9]+'
+arch/arm64/boot/dts/qcom/msm8916-mtp.dt.yaml: thermal-zones:
+camera-thermal:trips: 'trip-point@0' does not match any of the regexes:
+'^[a-zA-Z][a-zA-Z0-9\\-_]{0,63}$', 'pinctrl-[0-9]+'
+arch/arm64/boot/dts/qcom/msm8916-mtp.dt.yaml: thermal-zones:
+modem-thermal:trips: 'trip-point@0' does not match any of the regexes:
+'^[a-zA-Z][a-zA-Z0-9\\-_]{0,63}$', 'pinctrl-[0-9]+'
+
+Signed-off-by: Amit Kucheria <amit.kucheria@linaro.org>
+Link: https://lore.kernel.org/r/2d3d045c18a2fb85b28cf304aa11ae6e6538d75e.1585562459.git.amit.kucheria@linaro.org
+Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/arm64/boot/dts/qcom/msm8916.dtsi | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/arch/arm64/boot/dts/qcom/msm8916.dtsi b/arch/arm64/boot/dts/qcom/msm8916.dtsi
+index a88a15f2352bc..5548d7b5096ca 100644
+--- a/arch/arm64/boot/dts/qcom/msm8916.dtsi
++++ b/arch/arm64/boot/dts/qcom/msm8916.dtsi
+@@ -261,7 +261,7 @@
+                       thermal-sensors = <&tsens 4>;
+                       trips {
+-                              cpu2_3_alert0: trip-point@0 {
++                              cpu2_3_alert0: trip-point0 {
+                                       temperature = <75000>;
+                                       hysteresis = <2000>;
+                                       type = "passive";
+@@ -291,7 +291,7 @@
+                       thermal-sensors = <&tsens 2>;
+                       trips {
+-                              gpu_alert0: trip-point@0 {
++                              gpu_alert0: trip-point0 {
+                                       temperature = <75000>;
+                                       hysteresis = <2000>;
+                                       type = "passive";
+@@ -311,7 +311,7 @@
+                       thermal-sensors = <&tsens 1>;
+                       trips {
+-                              cam_alert0: trip-point@0 {
++                              cam_alert0: trip-point0 {
+                                       temperature = <75000>;
+                                       hysteresis = <2000>;
+                                       type = "hot";
+@@ -326,7 +326,7 @@
+                       thermal-sensors = <&tsens 0>;
+                       trips {
+-                              modem_alert0: trip-point@0 {
++                              modem_alert0: trip-point0 {
+                                       temperature = <85000>;
+                                       hysteresis = <2000>;
+                                       type = "hot";
+-- 
+2.25.1
+
diff --git a/queue-5.7/arm64-dts-qcom-sc7180-correct-the-pdc-interrupt-rang.patch b/queue-5.7/arm64-dts-qcom-sc7180-correct-the-pdc-interrupt-rang.patch
new file mode 100644 (file)
index 0000000..11f6b4f
--- /dev/null
@@ -0,0 +1,39 @@
+From 27d8b526aa3b223d82cfee26844f459518c0c6e0 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 18 May 2020 17:50:02 +0530
+Subject: arm64: dts: qcom: sc7180: Correct the pdc interrupt ranges
+
+From: Maulik Shah <mkshah@codeaurora.org>
+
+[ Upstream commit 7d2f29e49477aa51339e719cf73f0945c39c8a9e ]
+
+Few PDC interrupts do not map to respective parent GIC interrupt.
+Fix this by correcting the pdc interrupt map.
+
+Fixes: 22f185ee81d2 ("arm64: dts: qcom: sc7180: Add pdc interrupt controller")
+Cc: devicetree@vger.kernel.org
+Signed-off-by: Maulik Shah <mkshah@codeaurora.org>
+Link: https://lore.kernel.org/r/1589804402-27130-1-git-send-email-mkshah@codeaurora.org
+Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/arm64/boot/dts/qcom/sc7180.dtsi | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+diff --git a/arch/arm64/boot/dts/qcom/sc7180.dtsi b/arch/arm64/boot/dts/qcom/sc7180.dtsi
+index 998f101ad623b..eea92b314fc65 100644
+--- a/arch/arm64/boot/dts/qcom/sc7180.dtsi
++++ b/arch/arm64/boot/dts/qcom/sc7180.dtsi
+@@ -1657,8 +1657,7 @@
+               pdc: interrupt-controller@b220000 {
+                       compatible = "qcom,sc7180-pdc", "qcom,pdc";
+                       reg = <0 0x0b220000 0 0x30000>;
+-                      qcom,pdc-ranges = <0 480 15>, <17 497 98>,
+-                                        <119 634 4>, <124 639 1>;
++                      qcom,pdc-ranges = <0 480 94>, <94 609 31>, <125 63 1>;
+                       #interrupt-cells = <2>;
+                       interrupt-parent = <&intc>;
+                       interrupt-controller;
+-- 
+2.25.1
+
diff --git a/queue-5.7/arm64-dts-qcom-sm8250-fix-pdc-compatible-and-reg.patch b/queue-5.7/arm64-dts-qcom-sm8250-fix-pdc-compatible-and-reg.patch
new file mode 100644 (file)
index 0000000..29e26f4
--- /dev/null
@@ -0,0 +1,40 @@
+From 005913d4c0e456cfd3875cffcaced2088978ca58 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 14 Apr 2020 22:47:03 -0700
+Subject: arm64: dts: qcom: sm8250: Fix PDC compatible and reg
+
+From: Bjorn Andersson <bjorn.andersson@linaro.org>
+
+[ Upstream commit 240031967ac4c63713c6e0c3249d734e23c913aa ]
+
+The pdc node suffers from both too narrow compatible and insufficient
+cells in the reg, fix these.
+
+Fixes: 60378f1a171e ("arm64: dts: qcom: sm8250: Add sm8250 dts file")
+Tested-by: Vinod Koul <vkoul@kernel.org>
+Reviewed-by: Vinod Koul <vkoul@kernel.org>
+Link: https://lore.kernel.org/r/20200415054703.739507-1-bjorn.andersson@linaro.org
+Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/arm64/boot/dts/qcom/sm8250.dtsi | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/arch/arm64/boot/dts/qcom/sm8250.dtsi b/arch/arm64/boot/dts/qcom/sm8250.dtsi
+index 891d83b2afea5..2a7eaefd221dd 100644
+--- a/arch/arm64/boot/dts/qcom/sm8250.dtsi
++++ b/arch/arm64/boot/dts/qcom/sm8250.dtsi
+@@ -314,8 +314,8 @@
+               };
+               pdc: interrupt-controller@b220000 {
+-                      compatible = "qcom,sm8250-pdc";
+-                      reg = <0x0b220000 0x30000>, <0x17c000f0 0x60>;
++                      compatible = "qcom,sm8250-pdc", "qcom,pdc";
++                      reg = <0 0x0b220000 0 0x30000>, <0 0x17c000f0 0 0x60>;
+                       qcom,pdc-ranges = <0 480 94>, <94 609 31>,
+                                         <125 63 1>, <126 716 12>;
+                       #interrupt-cells = <2>;
+-- 
+2.25.1
+
diff --git a/queue-5.7/arm64-dts-realtek-rtd129x-fix-gic-cpu-masks-for-rtd1.patch b/queue-5.7/arm64-dts-realtek-rtd129x-fix-gic-cpu-masks-for-rtd1.patch
new file mode 100644 (file)
index 0000000..26546fa
--- /dev/null
@@ -0,0 +1,102 @@
+From 24fdedc91cdc04ae0253673823439059dd29ba15 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 11 Nov 2019 03:00:26 +0100
+Subject: arm64: dts: realtek: rtd129x: Fix GIC CPU masks for RTD1293
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Andreas Färber <afaerber@suse.de>
+
+[ Upstream commit 31888c8be1486daf2c34ba6c58129635e49d564a ]
+
+Convert from GIC_CPU_MASK_RAW() to GIC_CPU_MASK_SIMPLE().
+
+In case of RTD1293 adjust the arch timer and VGIC interrupts'
+CPU masks to its smaller number of CPUs.
+
+Fixes: cf976f660ee8 ("arm64: dts: realtek: Add RTD1293 and Synology DS418j")
+Signed-off-by: Andreas Färber <afaerber@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/arm64/boot/dts/realtek/rtd1293.dtsi | 12 ++++++++----
+ arch/arm64/boot/dts/realtek/rtd1295.dtsi |  8 ++++----
+ arch/arm64/boot/dts/realtek/rtd1296.dtsi |  8 ++++----
+ 3 files changed, 16 insertions(+), 12 deletions(-)
+
+diff --git a/arch/arm64/boot/dts/realtek/rtd1293.dtsi b/arch/arm64/boot/dts/realtek/rtd1293.dtsi
+index bd4e22723f7b0..2d92b56ac94d6 100644
+--- a/arch/arm64/boot/dts/realtek/rtd1293.dtsi
++++ b/arch/arm64/boot/dts/realtek/rtd1293.dtsi
+@@ -36,16 +36,20 @@
+       timer {
+               compatible = "arm,armv8-timer";
+               interrupts = <GIC_PPI 13
+-                      (GIC_CPU_MASK_RAW(0xf) | IRQ_TYPE_LEVEL_LOW)>,
++                      (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_LOW)>,
+                            <GIC_PPI 14
+-                      (GIC_CPU_MASK_RAW(0xf) | IRQ_TYPE_LEVEL_LOW)>,
++                      (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_LOW)>,
+                            <GIC_PPI 11
+-                      (GIC_CPU_MASK_RAW(0xf) | IRQ_TYPE_LEVEL_LOW)>,
++                      (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_LOW)>,
+                            <GIC_PPI 10
+-                      (GIC_CPU_MASK_RAW(0xf) | IRQ_TYPE_LEVEL_LOW)>;
++                      (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_LOW)>;
+       };
+ };
+ &arm_pmu {
+       interrupt-affinity = <&cpu0>, <&cpu1>;
+ };
++
++&gic {
++      interrupts = <GIC_PPI 9 (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_LOW)>;
++};
+diff --git a/arch/arm64/boot/dts/realtek/rtd1295.dtsi b/arch/arm64/boot/dts/realtek/rtd1295.dtsi
+index 93f0e1d977212..34f6cc6f16fe7 100644
+--- a/arch/arm64/boot/dts/realtek/rtd1295.dtsi
++++ b/arch/arm64/boot/dts/realtek/rtd1295.dtsi
+@@ -61,13 +61,13 @@
+       timer {
+               compatible = "arm,armv8-timer";
+               interrupts = <GIC_PPI 13
+-                      (GIC_CPU_MASK_RAW(0xf) | IRQ_TYPE_LEVEL_LOW)>,
++                      (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>,
+                            <GIC_PPI 14
+-                      (GIC_CPU_MASK_RAW(0xf) | IRQ_TYPE_LEVEL_LOW)>,
++                      (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>,
+                            <GIC_PPI 11
+-                      (GIC_CPU_MASK_RAW(0xf) | IRQ_TYPE_LEVEL_LOW)>,
++                      (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>,
+                            <GIC_PPI 10
+-                      (GIC_CPU_MASK_RAW(0xf) | IRQ_TYPE_LEVEL_LOW)>;
++                      (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>;
+       };
+ };
+diff --git a/arch/arm64/boot/dts/realtek/rtd1296.dtsi b/arch/arm64/boot/dts/realtek/rtd1296.dtsi
+index 0f9e59cac086e..fb864a139c97e 100644
+--- a/arch/arm64/boot/dts/realtek/rtd1296.dtsi
++++ b/arch/arm64/boot/dts/realtek/rtd1296.dtsi
+@@ -50,13 +50,13 @@
+       timer {
+               compatible = "arm,armv8-timer";
+               interrupts = <GIC_PPI 13
+-                      (GIC_CPU_MASK_RAW(0xf) | IRQ_TYPE_LEVEL_LOW)>,
++                      (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>,
+                            <GIC_PPI 14
+-                      (GIC_CPU_MASK_RAW(0xf) | IRQ_TYPE_LEVEL_LOW)>,
++                      (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>,
+                            <GIC_PPI 11
+-                      (GIC_CPU_MASK_RAW(0xf) | IRQ_TYPE_LEVEL_LOW)>,
++                      (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>,
+                            <GIC_PPI 10
+-                      (GIC_CPU_MASK_RAW(0xf) | IRQ_TYPE_LEVEL_LOW)>;
++                      (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>;
+       };
+ };
+-- 
+2.25.1
+
diff --git a/queue-5.7/arm64-dts-renesas-fix-iommu-device-node-names.patch b/queue-5.7/arm64-dts-renesas-fix-iommu-device-node-names.patch
new file mode 100644 (file)
index 0000000..77d934d
--- /dev/null
@@ -0,0 +1,1006 @@
+From 7814e36ac395d481c84e638397b375d9ec60e8ab Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 21 Apr 2020 18:36:15 +0900
+Subject: arm64: dts: renesas: Fix IOMMU device node names
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
+
+[ Upstream commit cf8ae446bbcbf5c48214eb7ddaa6ac6e12f4633d ]
+
+Fix IOMMU device node names as "iommu@".
+
+Fixes: 8f507babc617 ("arm64: dts: renesas: r8a774a1: Add IPMMU device nodes")
+Fixes: 63093a8e58be ("arm64: dts: renesas: r8a774b1: Add IPMMU device nodes")
+Fixes: 6c7e02178e8f ("arm64: dts: renesas: r8a774c0: Add IPMMU device nodes")
+Fixes: 3b7e7848f0e8 ("arm64: dts: renesas: r8a7795: Add IPMMU device nodes")
+Fixes: e4b9a493df45 ("arm64: dts: renesas: r8a7795-es1: Add IPMMU device nodes")
+Fixes: 389baa409617 ("arm64: dts: renesas: r8a7796: Add IPMMU device nodes")
+Fixes: 55697cbb44e4 ("arm64: dts: renesas: r8a779{65,80,90}: Add IPMMU devices nodes")
+Fixes: ce3b52a1595b ("arm64: dts: renesas: r8a77970: Add IPMMU device nodes")
+Fixes: a3901e7398e1 ("arm64: dts: renesas: r8a77995: Add IPMMU device nodes")
+Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
+Reviewed-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
+Link: https://lore.kernel.org/r/1587461775-13369-1-git-send-email-yoshihiro.shimoda.uh@renesas.com
+Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/arm64/boot/dts/renesas/r8a774a1.dtsi | 18 ++++++------
+ arch/arm64/boot/dts/renesas/r8a774b1.dtsi | 18 ++++++------
+ arch/arm64/boot/dts/renesas/r8a774c0.dtsi | 18 ++++++------
+ arch/arm64/boot/dts/renesas/r8a77950.dtsi | 14 +++++-----
+ arch/arm64/boot/dts/renesas/r8a77951.dtsi | 34 +++++++++++------------
+ arch/arm64/boot/dts/renesas/r8a77960.dtsi | 22 +++++++--------
+ arch/arm64/boot/dts/renesas/r8a77965.dtsi | 20 ++++++-------
+ arch/arm64/boot/dts/renesas/r8a77970.dtsi | 10 +++----
+ arch/arm64/boot/dts/renesas/r8a77980.dtsi | 16 +++++------
+ arch/arm64/boot/dts/renesas/r8a77990.dtsi | 20 ++++++-------
+ arch/arm64/boot/dts/renesas/r8a77995.dtsi | 20 ++++++-------
+ 11 files changed, 105 insertions(+), 105 deletions(-)
+
+diff --git a/arch/arm64/boot/dts/renesas/r8a774a1.dtsi b/arch/arm64/boot/dts/renesas/r8a774a1.dtsi
+index 79023433a740b..a603d947970ec 100644
+--- a/arch/arm64/boot/dts/renesas/r8a774a1.dtsi
++++ b/arch/arm64/boot/dts/renesas/r8a774a1.dtsi
+@@ -1000,7 +1000,7 @@
+                              <&ipmmu_ds1 30>, <&ipmmu_ds1 31>;
+               };
+-              ipmmu_ds0: mmu@e6740000 {
++              ipmmu_ds0: iommu@e6740000 {
+                       compatible = "renesas,ipmmu-r8a774a1";
+                       reg = <0 0xe6740000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 0>;
+@@ -1008,7 +1008,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_ds1: mmu@e7740000 {
++              ipmmu_ds1: iommu@e7740000 {
+                       compatible = "renesas,ipmmu-r8a774a1";
+                       reg = <0 0xe7740000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 1>;
+@@ -1016,7 +1016,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_hc: mmu@e6570000 {
++              ipmmu_hc: iommu@e6570000 {
+                       compatible = "renesas,ipmmu-r8a774a1";
+                       reg = <0 0xe6570000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 2>;
+@@ -1024,7 +1024,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_mm: mmu@e67b0000 {
++              ipmmu_mm: iommu@e67b0000 {
+                       compatible = "renesas,ipmmu-r8a774a1";
+                       reg = <0 0xe67b0000 0 0x1000>;
+                       interrupts = <GIC_SPI 196 IRQ_TYPE_LEVEL_HIGH>,
+@@ -1033,7 +1033,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_mp: mmu@ec670000 {
++              ipmmu_mp: iommu@ec670000 {
+                       compatible = "renesas,ipmmu-r8a774a1";
+                       reg = <0 0xec670000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 4>;
+@@ -1041,7 +1041,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_pv0: mmu@fd800000 {
++              ipmmu_pv0: iommu@fd800000 {
+                       compatible = "renesas,ipmmu-r8a774a1";
+                       reg = <0 0xfd800000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 5>;
+@@ -1049,7 +1049,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_pv1: mmu@fd950000 {
++              ipmmu_pv1: iommu@fd950000 {
+                       compatible = "renesas,ipmmu-r8a774a1";
+                       reg = <0 0xfd950000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 6>;
+@@ -1057,7 +1057,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_vc0: mmu@fe6b0000 {
++              ipmmu_vc0: iommu@fe6b0000 {
+                       compatible = "renesas,ipmmu-r8a774a1";
+                       reg = <0 0xfe6b0000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 8>;
+@@ -1065,7 +1065,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_vi0: mmu@febd0000 {
++              ipmmu_vi0: iommu@febd0000 {
+                       compatible = "renesas,ipmmu-r8a774a1";
+                       reg = <0 0xfebd0000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 9>;
+diff --git a/arch/arm64/boot/dts/renesas/r8a774b1.dtsi b/arch/arm64/boot/dts/renesas/r8a774b1.dtsi
+index 3137f735974be..1e51855c7cd38 100644
+--- a/arch/arm64/boot/dts/renesas/r8a774b1.dtsi
++++ b/arch/arm64/boot/dts/renesas/r8a774b1.dtsi
+@@ -874,7 +874,7 @@
+                              <&ipmmu_ds1 30>, <&ipmmu_ds1 31>;
+               };
+-              ipmmu_ds0: mmu@e6740000 {
++              ipmmu_ds0: iommu@e6740000 {
+                       compatible = "renesas,ipmmu-r8a774b1";
+                       reg = <0 0xe6740000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 0>;
+@@ -882,7 +882,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_ds1: mmu@e7740000 {
++              ipmmu_ds1: iommu@e7740000 {
+                       compatible = "renesas,ipmmu-r8a774b1";
+                       reg = <0 0xe7740000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 1>;
+@@ -890,7 +890,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_hc: mmu@e6570000 {
++              ipmmu_hc: iommu@e6570000 {
+                       compatible = "renesas,ipmmu-r8a774b1";
+                       reg = <0 0xe6570000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 2>;
+@@ -898,7 +898,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_mm: mmu@e67b0000 {
++              ipmmu_mm: iommu@e67b0000 {
+                       compatible = "renesas,ipmmu-r8a774b1";
+                       reg = <0 0xe67b0000 0 0x1000>;
+                       interrupts = <GIC_SPI 196 IRQ_TYPE_LEVEL_HIGH>,
+@@ -907,7 +907,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_mp: mmu@ec670000 {
++              ipmmu_mp: iommu@ec670000 {
+                       compatible = "renesas,ipmmu-r8a774b1";
+                       reg = <0 0xec670000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 4>;
+@@ -915,7 +915,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_pv0: mmu@fd800000 {
++              ipmmu_pv0: iommu@fd800000 {
+                       compatible = "renesas,ipmmu-r8a774b1";
+                       reg = <0 0xfd800000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 6>;
+@@ -923,7 +923,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_vc0: mmu@fe6b0000 {
++              ipmmu_vc0: iommu@fe6b0000 {
+                       compatible = "renesas,ipmmu-r8a774b1";
+                       reg = <0 0xfe6b0000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 12>;
+@@ -931,7 +931,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_vi0: mmu@febd0000 {
++              ipmmu_vi0: iommu@febd0000 {
+                       compatible = "renesas,ipmmu-r8a774b1";
+                       reg = <0 0xfebd0000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 14>;
+@@ -939,7 +939,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_vp0: mmu@fe990000 {
++              ipmmu_vp0: iommu@fe990000 {
+                       compatible = "renesas,ipmmu-r8a774b1";
+                       reg = <0 0xfe990000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 16>;
+diff --git a/arch/arm64/boot/dts/renesas/r8a774c0.dtsi b/arch/arm64/boot/dts/renesas/r8a774c0.dtsi
+index 22785cbddff5d..5c72a7efbb035 100644
+--- a/arch/arm64/boot/dts/renesas/r8a774c0.dtsi
++++ b/arch/arm64/boot/dts/renesas/r8a774c0.dtsi
+@@ -847,7 +847,7 @@
+                              <&ipmmu_ds1 30>, <&ipmmu_ds1 31>;
+               };
+-              ipmmu_ds0: mmu@e6740000 {
++              ipmmu_ds0: iommu@e6740000 {
+                       compatible = "renesas,ipmmu-r8a774c0";
+                       reg = <0 0xe6740000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 0>;
+@@ -855,7 +855,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_ds1: mmu@e7740000 {
++              ipmmu_ds1: iommu@e7740000 {
+                       compatible = "renesas,ipmmu-r8a774c0";
+                       reg = <0 0xe7740000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 1>;
+@@ -863,7 +863,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_hc: mmu@e6570000 {
++              ipmmu_hc: iommu@e6570000 {
+                       compatible = "renesas,ipmmu-r8a774c0";
+                       reg = <0 0xe6570000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 2>;
+@@ -871,7 +871,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_mm: mmu@e67b0000 {
++              ipmmu_mm: iommu@e67b0000 {
+                       compatible = "renesas,ipmmu-r8a774c0";
+                       reg = <0 0xe67b0000 0 0x1000>;
+                       interrupts = <GIC_SPI 196 IRQ_TYPE_LEVEL_HIGH>,
+@@ -880,7 +880,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_mp: mmu@ec670000 {
++              ipmmu_mp: iommu@ec670000 {
+                       compatible = "renesas,ipmmu-r8a774c0";
+                       reg = <0 0xec670000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 4>;
+@@ -888,7 +888,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_pv0: mmu@fd800000 {
++              ipmmu_pv0: iommu@fd800000 {
+                       compatible = "renesas,ipmmu-r8a774c0";
+                       reg = <0 0xfd800000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 6>;
+@@ -896,7 +896,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_vc0: mmu@fe6b0000 {
++              ipmmu_vc0: iommu@fe6b0000 {
+                       compatible = "renesas,ipmmu-r8a774c0";
+                       reg = <0 0xfe6b0000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 12>;
+@@ -904,7 +904,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_vi0: mmu@febd0000 {
++              ipmmu_vi0: iommu@febd0000 {
+                       compatible = "renesas,ipmmu-r8a774c0";
+                       reg = <0 0xfebd0000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 14>;
+@@ -912,7 +912,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_vp0: mmu@fe990000 {
++              ipmmu_vp0: iommu@fe990000 {
+                       compatible = "renesas,ipmmu-r8a774c0";
+                       reg = <0 0xfe990000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 16>;
+diff --git a/arch/arm64/boot/dts/renesas/r8a77950.dtsi b/arch/arm64/boot/dts/renesas/r8a77950.dtsi
+index 3975eecd50c49..d716c4386ae9f 100644
+--- a/arch/arm64/boot/dts/renesas/r8a77950.dtsi
++++ b/arch/arm64/boot/dts/renesas/r8a77950.dtsi
+@@ -77,7 +77,7 @@
+       /delete-node/ dma-controller@e6460000;
+       /delete-node/ dma-controller@e6470000;
+-      ipmmu_mp1: mmu@ec680000 {
++      ipmmu_mp1: iommu@ec680000 {
+               compatible = "renesas,ipmmu-r8a7795";
+               reg = <0 0xec680000 0 0x1000>;
+               renesas,ipmmu-main = <&ipmmu_mm 5>;
+@@ -85,7 +85,7 @@
+               #iommu-cells = <1>;
+       };
+-      ipmmu_sy: mmu@e7730000 {
++      ipmmu_sy: iommu@e7730000 {
+               compatible = "renesas,ipmmu-r8a7795";
+               reg = <0 0xe7730000 0 0x1000>;
+               renesas,ipmmu-main = <&ipmmu_mm 8>;
+@@ -93,11 +93,11 @@
+               #iommu-cells = <1>;
+       };
+-      /delete-node/ mmu@fd950000;
+-      /delete-node/ mmu@fd960000;
+-      /delete-node/ mmu@fd970000;
+-      /delete-node/ mmu@febe0000;
+-      /delete-node/ mmu@fe980000;
++      /delete-node/ iommu@fd950000;
++      /delete-node/ iommu@fd960000;
++      /delete-node/ iommu@fd970000;
++      /delete-node/ iommu@febe0000;
++      /delete-node/ iommu@fe980000;
+       xhci1: usb@ee040000 {
+               compatible = "renesas,xhci-r8a7795", "renesas,rcar-gen3-xhci";
+diff --git a/arch/arm64/boot/dts/renesas/r8a77951.dtsi b/arch/arm64/boot/dts/renesas/r8a77951.dtsi
+index 52229546454c4..61d67d9714ab9 100644
+--- a/arch/arm64/boot/dts/renesas/r8a77951.dtsi
++++ b/arch/arm64/boot/dts/renesas/r8a77951.dtsi
+@@ -1073,7 +1073,7 @@
+                              <&ipmmu_ds1 30>, <&ipmmu_ds1 31>;
+               };
+-              ipmmu_ds0: mmu@e6740000 {
++              ipmmu_ds0: iommu@e6740000 {
+                       compatible = "renesas,ipmmu-r8a7795";
+                       reg = <0 0xe6740000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 0>;
+@@ -1081,7 +1081,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_ds1: mmu@e7740000 {
++              ipmmu_ds1: iommu@e7740000 {
+                       compatible = "renesas,ipmmu-r8a7795";
+                       reg = <0 0xe7740000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 1>;
+@@ -1089,7 +1089,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_hc: mmu@e6570000 {
++              ipmmu_hc: iommu@e6570000 {
+                       compatible = "renesas,ipmmu-r8a7795";
+                       reg = <0 0xe6570000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 2>;
+@@ -1097,7 +1097,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_ir: mmu@ff8b0000 {
++              ipmmu_ir: iommu@ff8b0000 {
+                       compatible = "renesas,ipmmu-r8a7795";
+                       reg = <0 0xff8b0000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 3>;
+@@ -1105,7 +1105,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_mm: mmu@e67b0000 {
++              ipmmu_mm: iommu@e67b0000 {
+                       compatible = "renesas,ipmmu-r8a7795";
+                       reg = <0 0xe67b0000 0 0x1000>;
+                       interrupts = <GIC_SPI 196 IRQ_TYPE_LEVEL_HIGH>,
+@@ -1114,7 +1114,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_mp0: mmu@ec670000 {
++              ipmmu_mp0: iommu@ec670000 {
+                       compatible = "renesas,ipmmu-r8a7795";
+                       reg = <0 0xec670000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 4>;
+@@ -1122,7 +1122,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_pv0: mmu@fd800000 {
++              ipmmu_pv0: iommu@fd800000 {
+                       compatible = "renesas,ipmmu-r8a7795";
+                       reg = <0 0xfd800000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 6>;
+@@ -1130,7 +1130,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_pv1: mmu@fd950000 {
++              ipmmu_pv1: iommu@fd950000 {
+                       compatible = "renesas,ipmmu-r8a7795";
+                       reg = <0 0xfd950000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 7>;
+@@ -1138,7 +1138,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_pv2: mmu@fd960000 {
++              ipmmu_pv2: iommu@fd960000 {
+                       compatible = "renesas,ipmmu-r8a7795";
+                       reg = <0 0xfd960000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 8>;
+@@ -1146,7 +1146,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_pv3: mmu@fd970000 {
++              ipmmu_pv3: iommu@fd970000 {
+                       compatible = "renesas,ipmmu-r8a7795";
+                       reg = <0 0xfd970000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 9>;
+@@ -1154,7 +1154,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_rt: mmu@ffc80000 {
++              ipmmu_rt: iommu@ffc80000 {
+                       compatible = "renesas,ipmmu-r8a7795";
+                       reg = <0 0xffc80000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 10>;
+@@ -1162,7 +1162,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_vc0: mmu@fe6b0000 {
++              ipmmu_vc0: iommu@fe6b0000 {
+                       compatible = "renesas,ipmmu-r8a7795";
+                       reg = <0 0xfe6b0000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 12>;
+@@ -1170,7 +1170,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_vc1: mmu@fe6f0000 {
++              ipmmu_vc1: iommu@fe6f0000 {
+                       compatible = "renesas,ipmmu-r8a7795";
+                       reg = <0 0xfe6f0000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 13>;
+@@ -1178,7 +1178,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_vi0: mmu@febd0000 {
++              ipmmu_vi0: iommu@febd0000 {
+                       compatible = "renesas,ipmmu-r8a7795";
+                       reg = <0 0xfebd0000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 14>;
+@@ -1186,7 +1186,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_vi1: mmu@febe0000 {
++              ipmmu_vi1: iommu@febe0000 {
+                       compatible = "renesas,ipmmu-r8a7795";
+                       reg = <0 0xfebe0000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 15>;
+@@ -1194,7 +1194,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_vp0: mmu@fe990000 {
++              ipmmu_vp0: iommu@fe990000 {
+                       compatible = "renesas,ipmmu-r8a7795";
+                       reg = <0 0xfe990000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 16>;
+@@ -1202,7 +1202,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_vp1: mmu@fe980000 {
++              ipmmu_vp1: iommu@fe980000 {
+                       compatible = "renesas,ipmmu-r8a7795";
+                       reg = <0 0xfe980000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 17>;
+diff --git a/arch/arm64/boot/dts/renesas/r8a77960.dtsi b/arch/arm64/boot/dts/renesas/r8a77960.dtsi
+index 31282367d3acd..33bf62acffbb7 100644
+--- a/arch/arm64/boot/dts/renesas/r8a77960.dtsi
++++ b/arch/arm64/boot/dts/renesas/r8a77960.dtsi
+@@ -997,7 +997,7 @@
+                              <&ipmmu_ds1 30>, <&ipmmu_ds1 31>;
+               };
+-              ipmmu_ds0: mmu@e6740000 {
++              ipmmu_ds0: iommu@e6740000 {
+                       compatible = "renesas,ipmmu-r8a7796";
+                       reg = <0 0xe6740000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 0>;
+@@ -1005,7 +1005,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_ds1: mmu@e7740000 {
++              ipmmu_ds1: iommu@e7740000 {
+                       compatible = "renesas,ipmmu-r8a7796";
+                       reg = <0 0xe7740000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 1>;
+@@ -1013,7 +1013,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_hc: mmu@e6570000 {
++              ipmmu_hc: iommu@e6570000 {
+                       compatible = "renesas,ipmmu-r8a7796";
+                       reg = <0 0xe6570000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 2>;
+@@ -1021,7 +1021,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_ir: mmu@ff8b0000 {
++              ipmmu_ir: iommu@ff8b0000 {
+                       compatible = "renesas,ipmmu-r8a7796";
+                       reg = <0 0xff8b0000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 3>;
+@@ -1029,7 +1029,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_mm: mmu@e67b0000 {
++              ipmmu_mm: iommu@e67b0000 {
+                       compatible = "renesas,ipmmu-r8a7796";
+                       reg = <0 0xe67b0000 0 0x1000>;
+                       interrupts = <GIC_SPI 196 IRQ_TYPE_LEVEL_HIGH>,
+@@ -1038,7 +1038,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_mp: mmu@ec670000 {
++              ipmmu_mp: iommu@ec670000 {
+                       compatible = "renesas,ipmmu-r8a7796";
+                       reg = <0 0xec670000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 4>;
+@@ -1046,7 +1046,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_pv0: mmu@fd800000 {
++              ipmmu_pv0: iommu@fd800000 {
+                       compatible = "renesas,ipmmu-r8a7796";
+                       reg = <0 0xfd800000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 5>;
+@@ -1054,7 +1054,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_pv1: mmu@fd950000 {
++              ipmmu_pv1: iommu@fd950000 {
+                       compatible = "renesas,ipmmu-r8a7796";
+                       reg = <0 0xfd950000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 6>;
+@@ -1062,7 +1062,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_rt: mmu@ffc80000 {
++              ipmmu_rt: iommu@ffc80000 {
+                       compatible = "renesas,ipmmu-r8a7796";
+                       reg = <0 0xffc80000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 7>;
+@@ -1070,7 +1070,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_vc0: mmu@fe6b0000 {
++              ipmmu_vc0: iommu@fe6b0000 {
+                       compatible = "renesas,ipmmu-r8a7796";
+                       reg = <0 0xfe6b0000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 8>;
+@@ -1078,7 +1078,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_vi0: mmu@febd0000 {
++              ipmmu_vi0: iommu@febd0000 {
+                       compatible = "renesas,ipmmu-r8a7796";
+                       reg = <0 0xfebd0000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 9>;
+diff --git a/arch/arm64/boot/dts/renesas/r8a77965.dtsi b/arch/arm64/boot/dts/renesas/r8a77965.dtsi
+index d82dd4e67b62b..6f7ab39fd2824 100644
+--- a/arch/arm64/boot/dts/renesas/r8a77965.dtsi
++++ b/arch/arm64/boot/dts/renesas/r8a77965.dtsi
+@@ -867,7 +867,7 @@
+                              <&ipmmu_ds1 30>, <&ipmmu_ds1 31>;
+               };
+-              ipmmu_ds0: mmu@e6740000 {
++              ipmmu_ds0: iommu@e6740000 {
+                       compatible = "renesas,ipmmu-r8a77965";
+                       reg = <0 0xe6740000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 0>;
+@@ -875,7 +875,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_ds1: mmu@e7740000 {
++              ipmmu_ds1: iommu@e7740000 {
+                       compatible = "renesas,ipmmu-r8a77965";
+                       reg = <0 0xe7740000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 1>;
+@@ -883,7 +883,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_hc: mmu@e6570000 {
++              ipmmu_hc: iommu@e6570000 {
+                       compatible = "renesas,ipmmu-r8a77965";
+                       reg = <0 0xe6570000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 2>;
+@@ -891,7 +891,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_mm: mmu@e67b0000 {
++              ipmmu_mm: iommu@e67b0000 {
+                       compatible = "renesas,ipmmu-r8a77965";
+                       reg = <0 0xe67b0000 0 0x1000>;
+                       interrupts = <GIC_SPI 196 IRQ_TYPE_LEVEL_HIGH>,
+@@ -900,7 +900,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_mp: mmu@ec670000 {
++              ipmmu_mp: iommu@ec670000 {
+                       compatible = "renesas,ipmmu-r8a77965";
+                       reg = <0 0xec670000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 4>;
+@@ -908,7 +908,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_pv0: mmu@fd800000 {
++              ipmmu_pv0: iommu@fd800000 {
+                       compatible = "renesas,ipmmu-r8a77965";
+                       reg = <0 0xfd800000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 6>;
+@@ -916,7 +916,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_rt: mmu@ffc80000 {
++              ipmmu_rt: iommu@ffc80000 {
+                       compatible = "renesas,ipmmu-r8a77965";
+                       reg = <0 0xffc80000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 10>;
+@@ -924,7 +924,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_vc0: mmu@fe6b0000 {
++              ipmmu_vc0: iommu@fe6b0000 {
+                       compatible = "renesas,ipmmu-r8a77965";
+                       reg = <0 0xfe6b0000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 12>;
+@@ -932,7 +932,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_vi0: mmu@febd0000 {
++              ipmmu_vi0: iommu@febd0000 {
+                       compatible = "renesas,ipmmu-r8a77965";
+                       reg = <0 0xfebd0000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 14>;
+@@ -940,7 +940,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_vp0: mmu@fe990000 {
++              ipmmu_vp0: iommu@fe990000 {
+                       compatible = "renesas,ipmmu-r8a77965";
+                       reg = <0 0xfe990000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 16>;
+diff --git a/arch/arm64/boot/dts/renesas/r8a77970.dtsi b/arch/arm64/boot/dts/renesas/r8a77970.dtsi
+index a009c0ebc8b4f..bd95ecb1b40d8 100644
+--- a/arch/arm64/boot/dts/renesas/r8a77970.dtsi
++++ b/arch/arm64/boot/dts/renesas/r8a77970.dtsi
+@@ -985,7 +985,7 @@
+                              <&ipmmu_ds1 22>, <&ipmmu_ds1 23>;
+               };
+-              ipmmu_ds1: mmu@e7740000 {
++              ipmmu_ds1: iommu@e7740000 {
+                       compatible = "renesas,ipmmu-r8a77970";
+                       reg = <0 0xe7740000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 0>;
+@@ -993,7 +993,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_ir: mmu@ff8b0000 {
++              ipmmu_ir: iommu@ff8b0000 {
+                       compatible = "renesas,ipmmu-r8a77970";
+                       reg = <0 0xff8b0000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 3>;
+@@ -1001,7 +1001,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_mm: mmu@e67b0000 {
++              ipmmu_mm: iommu@e67b0000 {
+                       compatible = "renesas,ipmmu-r8a77970";
+                       reg = <0 0xe67b0000 0 0x1000>;
+                       interrupts = <GIC_SPI 196 IRQ_TYPE_LEVEL_HIGH>,
+@@ -1010,7 +1010,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_rt: mmu@ffc80000 {
++              ipmmu_rt: iommu@ffc80000 {
+                       compatible = "renesas,ipmmu-r8a77970";
+                       reg = <0 0xffc80000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 7>;
+@@ -1018,7 +1018,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_vi0: mmu@febd0000 {
++              ipmmu_vi0: iommu@febd0000 {
+                       compatible = "renesas,ipmmu-r8a77970";
+                       reg = <0 0xfebd0000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 9>;
+diff --git a/arch/arm64/boot/dts/renesas/r8a77980.dtsi b/arch/arm64/boot/dts/renesas/r8a77980.dtsi
+index d672b320bc145..387e6d99f2f36 100644
+--- a/arch/arm64/boot/dts/renesas/r8a77980.dtsi
++++ b/arch/arm64/boot/dts/renesas/r8a77980.dtsi
+@@ -1266,7 +1266,7 @@
+                       status = "disabled";
+               };
+-              ipmmu_ds1: mmu@e7740000 {
++              ipmmu_ds1: iommu@e7740000 {
+                       compatible = "renesas,ipmmu-r8a77980";
+                       reg = <0 0xe7740000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 0>;
+@@ -1274,7 +1274,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_ir: mmu@ff8b0000 {
++              ipmmu_ir: iommu@ff8b0000 {
+                       compatible = "renesas,ipmmu-r8a77980";
+                       reg = <0 0xff8b0000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 3>;
+@@ -1282,7 +1282,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_mm: mmu@e67b0000 {
++              ipmmu_mm: iommu@e67b0000 {
+                       compatible = "renesas,ipmmu-r8a77980";
+                       reg = <0 0xe67b0000 0 0x1000>;
+                       interrupts = <GIC_SPI 196 IRQ_TYPE_LEVEL_HIGH>,
+@@ -1291,7 +1291,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_rt: mmu@ffc80000 {
++              ipmmu_rt: iommu@ffc80000 {
+                       compatible = "renesas,ipmmu-r8a77980";
+                       reg = <0 0xffc80000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 10>;
+@@ -1299,7 +1299,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_vc0: mmu@fe990000 {
++              ipmmu_vc0: iommu@fe990000 {
+                       compatible = "renesas,ipmmu-r8a77980";
+                       reg = <0 0xfe990000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 12>;
+@@ -1307,7 +1307,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_vi0: mmu@febd0000 {
++              ipmmu_vi0: iommu@febd0000 {
+                       compatible = "renesas,ipmmu-r8a77980";
+                       reg = <0 0xfebd0000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 14>;
+@@ -1315,7 +1315,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_vip0: mmu@e7b00000 {
++              ipmmu_vip0: iommu@e7b00000 {
+                       compatible = "renesas,ipmmu-r8a77980";
+                       reg = <0 0xe7b00000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 4>;
+@@ -1323,7 +1323,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_vip1: mmu@e7960000 {
++              ipmmu_vip1: iommu@e7960000 {
+                       compatible = "renesas,ipmmu-r8a77980";
+                       reg = <0 0xe7960000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 11>;
+diff --git a/arch/arm64/boot/dts/renesas/r8a77990.dtsi b/arch/arm64/boot/dts/renesas/r8a77990.dtsi
+index 1543f18e834f4..cd11f24744d4a 100644
+--- a/arch/arm64/boot/dts/renesas/r8a77990.dtsi
++++ b/arch/arm64/boot/dts/renesas/r8a77990.dtsi
+@@ -817,7 +817,7 @@
+                              <&ipmmu_ds1 30>, <&ipmmu_ds1 31>;
+               };
+-              ipmmu_ds0: mmu@e6740000 {
++              ipmmu_ds0: iommu@e6740000 {
+                       compatible = "renesas,ipmmu-r8a77990";
+                       reg = <0 0xe6740000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 0>;
+@@ -825,7 +825,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_ds1: mmu@e7740000 {
++              ipmmu_ds1: iommu@e7740000 {
+                       compatible = "renesas,ipmmu-r8a77990";
+                       reg = <0 0xe7740000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 1>;
+@@ -833,7 +833,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_hc: mmu@e6570000 {
++              ipmmu_hc: iommu@e6570000 {
+                       compatible = "renesas,ipmmu-r8a77990";
+                       reg = <0 0xe6570000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 2>;
+@@ -841,7 +841,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_mm: mmu@e67b0000 {
++              ipmmu_mm: iommu@e67b0000 {
+                       compatible = "renesas,ipmmu-r8a77990";
+                       reg = <0 0xe67b0000 0 0x1000>;
+                       interrupts = <GIC_SPI 196 IRQ_TYPE_LEVEL_HIGH>,
+@@ -850,7 +850,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_mp: mmu@ec670000 {
++              ipmmu_mp: iommu@ec670000 {
+                       compatible = "renesas,ipmmu-r8a77990";
+                       reg = <0 0xec670000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 4>;
+@@ -858,7 +858,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_pv0: mmu@fd800000 {
++              ipmmu_pv0: iommu@fd800000 {
+                       compatible = "renesas,ipmmu-r8a77990";
+                       reg = <0 0xfd800000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 6>;
+@@ -866,7 +866,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_rt: mmu@ffc80000 {
++              ipmmu_rt: iommu@ffc80000 {
+                       compatible = "renesas,ipmmu-r8a77990";
+                       reg = <0 0xffc80000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 10>;
+@@ -874,7 +874,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_vc0: mmu@fe6b0000 {
++              ipmmu_vc0: iommu@fe6b0000 {
+                       compatible = "renesas,ipmmu-r8a77990";
+                       reg = <0 0xfe6b0000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 12>;
+@@ -882,7 +882,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_vi0: mmu@febd0000 {
++              ipmmu_vi0: iommu@febd0000 {
+                       compatible = "renesas,ipmmu-r8a77990";
+                       reg = <0 0xfebd0000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 14>;
+@@ -890,7 +890,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_vp0: mmu@fe990000 {
++              ipmmu_vp0: iommu@fe990000 {
+                       compatible = "renesas,ipmmu-r8a77990";
+                       reg = <0 0xfe990000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 16>;
+diff --git a/arch/arm64/boot/dts/renesas/r8a77995.dtsi b/arch/arm64/boot/dts/renesas/r8a77995.dtsi
+index e8d2290fe79d7..e5617ec0f49cb 100644
+--- a/arch/arm64/boot/dts/renesas/r8a77995.dtsi
++++ b/arch/arm64/boot/dts/renesas/r8a77995.dtsi
+@@ -507,7 +507,7 @@
+                              <&ipmmu_ds1 22>, <&ipmmu_ds1 23>;
+               };
+-              ipmmu_ds0: mmu@e6740000 {
++              ipmmu_ds0: iommu@e6740000 {
+                       compatible = "renesas,ipmmu-r8a77995";
+                       reg = <0 0xe6740000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 0>;
+@@ -515,7 +515,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_ds1: mmu@e7740000 {
++              ipmmu_ds1: iommu@e7740000 {
+                       compatible = "renesas,ipmmu-r8a77995";
+                       reg = <0 0xe7740000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 1>;
+@@ -523,7 +523,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_hc: mmu@e6570000 {
++              ipmmu_hc: iommu@e6570000 {
+                       compatible = "renesas,ipmmu-r8a77995";
+                       reg = <0 0xe6570000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 2>;
+@@ -531,7 +531,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_mm: mmu@e67b0000 {
++              ipmmu_mm: iommu@e67b0000 {
+                       compatible = "renesas,ipmmu-r8a77995";
+                       reg = <0 0xe67b0000 0 0x1000>;
+                       interrupts = <GIC_SPI 196 IRQ_TYPE_LEVEL_HIGH>,
+@@ -540,7 +540,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_mp: mmu@ec670000 {
++              ipmmu_mp: iommu@ec670000 {
+                       compatible = "renesas,ipmmu-r8a77995";
+                       reg = <0 0xec670000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 4>;
+@@ -548,7 +548,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_pv0: mmu@fd800000 {
++              ipmmu_pv0: iommu@fd800000 {
+                       compatible = "renesas,ipmmu-r8a77995";
+                       reg = <0 0xfd800000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 6>;
+@@ -556,7 +556,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_rt: mmu@ffc80000 {
++              ipmmu_rt: iommu@ffc80000 {
+                       compatible = "renesas,ipmmu-r8a77995";
+                       reg = <0 0xffc80000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 10>;
+@@ -564,7 +564,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_vc0: mmu@fe6b0000 {
++              ipmmu_vc0: iommu@fe6b0000 {
+                       compatible = "renesas,ipmmu-r8a77995";
+                       reg = <0 0xfe6b0000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 12>;
+@@ -572,7 +572,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_vi0: mmu@febd0000 {
++              ipmmu_vi0: iommu@febd0000 {
+                       compatible = "renesas,ipmmu-r8a77995";
+                       reg = <0 0xfebd0000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 14>;
+@@ -580,7 +580,7 @@
+                       #iommu-cells = <1>;
+               };
+-              ipmmu_vp0: mmu@fe990000 {
++              ipmmu_vp0: iommu@fe990000 {
+                       compatible = "renesas,ipmmu-r8a77995";
+                       reg = <0 0xfe990000 0 0x1000>;
+                       renesas,ipmmu-main = <&ipmmu_mm 16>;
+-- 
+2.25.1
+
diff --git a/queue-5.7/arm64-ftrace-change-config_ftrace_with_regs-to-confi.patch b/queue-5.7/arm64-ftrace-change-config_ftrace_with_regs-to-confi.patch
new file mode 100644 (file)
index 0000000..51a9502
--- /dev/null
@@ -0,0 +1,39 @@
+From 4418f1422d5417283b112e8c998cb5a89eaa8bae Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 6 Jun 2020 12:25:50 -0700
+Subject: arm64: ftrace: Change CONFIG_FTRACE_WITH_REGS to
+ CONFIG_DYNAMIC_FTRACE_WITH_REGS
+
+From: Joe Perches <joe@perches.com>
+
+[ Upstream commit 91970bef48d68d06b2bb3f464b572ad50941f6a9 ]
+
+CONFIG_FTRACE_WITH_REGS does not exist as a Kconfig symbol.
+
+Fixes: 3b23e4991fb6 ("arm64: implement ftrace with regs")
+Signed-off-by: Joe Perches <joe@perches.com>
+Acked-by: Mark Rutland <mark.rutland@arm.com>
+Link: https://lore.kernel.org/r/b9b27f2233bd1fa31d72ff937beefdae0e2104e5.camel@perches.com
+Signed-off-by: Will Deacon <will@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/arm64/kernel/ftrace.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/arch/arm64/kernel/ftrace.c b/arch/arm64/kernel/ftrace.c
+index 8618faa82e6d2..86a5cf9bc19a1 100644
+--- a/arch/arm64/kernel/ftrace.c
++++ b/arch/arm64/kernel/ftrace.c
+@@ -69,7 +69,8 @@ static struct plt_entry *get_ftrace_plt(struct module *mod, unsigned long addr)
+       if (addr == FTRACE_ADDR)
+               return &plt[FTRACE_PLT_IDX];
+-      if (addr == FTRACE_REGS_ADDR && IS_ENABLED(CONFIG_FTRACE_WITH_REGS))
++      if (addr == FTRACE_REGS_ADDR &&
++          IS_ENABLED(CONFIG_DYNAMIC_FTRACE_WITH_REGS))
+               return &plt[FTRACE_REGS_PLT_IDX];
+ #endif
+       return NULL;
+-- 
+2.25.1
+
diff --git a/queue-5.7/arm64-hw_breakpoint-don-t-invoke-overflow-handler-on.patch b/queue-5.7/arm64-hw_breakpoint-don-t-invoke-overflow-handler-on.patch
new file mode 100644 (file)
index 0000000..35cca6d
--- /dev/null
@@ -0,0 +1,109 @@
+From 36e6565ca4ab4348f3ee82989bd9b4b02fd4f1ae Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 29 May 2020 14:12:18 +0100
+Subject: arm64: hw_breakpoint: Don't invoke overflow handler on uaccess
+ watchpoints
+
+From: Will Deacon <will@kernel.org>
+
+[ Upstream commit 24ebec25fb270100e252b19c288e21bd7d8cc7f7 ]
+
+Unprivileged memory accesses generated by the so-called "translated"
+instructions (e.g. STTR) at EL1 can cause EL0 watchpoints to fire
+unexpectedly if kernel debugging is enabled. In such cases, the
+hw_breakpoint logic will invoke the user overflow handler which will
+typically raise a SIGTRAP back to the current task. This is futile when
+returning back to the kernel because (a) the signal won't have been
+delivered and (b) userspace can't handle the thing anyway.
+
+Avoid invoking the user overflow handler for watchpoints triggered by
+kernel uaccess routines, and instead single-step over the faulting
+instruction as we would if no overflow handler had been installed.
+
+(Fixes tag identifies the introduction of unprivileged memory accesses,
+ which exposed this latent bug in the hw_breakpoint code)
+
+Cc: Catalin Marinas <catalin.marinas@arm.com>
+Cc: James Morse <james.morse@arm.com>
+Fixes: 57f4959bad0a ("arm64: kernel: Add support for User Access Override")
+Reported-by: Luis Machado <luis.machado@linaro.org>
+Signed-off-by: Will Deacon <will@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/arm64/kernel/hw_breakpoint.c | 44 ++++++++++++++++++-------------
+ 1 file changed, 26 insertions(+), 18 deletions(-)
+
+diff --git a/arch/arm64/kernel/hw_breakpoint.c b/arch/arm64/kernel/hw_breakpoint.c
+index 0b727edf41046..af234a1e08b7d 100644
+--- a/arch/arm64/kernel/hw_breakpoint.c
++++ b/arch/arm64/kernel/hw_breakpoint.c
+@@ -730,6 +730,27 @@ static u64 get_distance_from_watchpoint(unsigned long addr, u64 val,
+               return 0;
+ }
++static int watchpoint_report(struct perf_event *wp, unsigned long addr,
++                           struct pt_regs *regs)
++{
++      int step = is_default_overflow_handler(wp);
++      struct arch_hw_breakpoint *info = counter_arch_bp(wp);
++
++      info->trigger = addr;
++
++      /*
++       * If we triggered a user watchpoint from a uaccess routine, then
++       * handle the stepping ourselves since userspace really can't help
++       * us with this.
++       */
++      if (!user_mode(regs) && info->ctrl.privilege == AARCH64_BREAKPOINT_EL0)
++              step = 1;
++      else
++              perf_bp_event(wp, regs);
++
++      return step;
++}
++
+ static int watchpoint_handler(unsigned long addr, unsigned int esr,
+                             struct pt_regs *regs)
+ {
+@@ -739,7 +760,6 @@ static int watchpoint_handler(unsigned long addr, unsigned int esr,
+       u64 val;
+       struct perf_event *wp, **slots;
+       struct debug_info *debug_info;
+-      struct arch_hw_breakpoint *info;
+       struct arch_hw_breakpoint_ctrl ctrl;
+       slots = this_cpu_ptr(wp_on_reg);
+@@ -777,25 +797,13 @@ static int watchpoint_handler(unsigned long addr, unsigned int esr,
+               if (dist != 0)
+                       continue;
+-              info = counter_arch_bp(wp);
+-              info->trigger = addr;
+-              perf_bp_event(wp, regs);
+-
+-              /* Do we need to handle the stepping? */
+-              if (is_default_overflow_handler(wp))
+-                      step = 1;
++              step = watchpoint_report(wp, addr, regs);
+       }
+-      if (min_dist > 0 && min_dist != -1) {
+-              /* No exact match found. */
+-              wp = slots[closest_match];
+-              info = counter_arch_bp(wp);
+-              info->trigger = addr;
+-              perf_bp_event(wp, regs);
+-              /* Do we need to handle the stepping? */
+-              if (is_default_overflow_handler(wp))
+-                      step = 1;
+-      }
++      /* No exact match found? */
++      if (min_dist > 0 && min_dist != -1)
++              step = watchpoint_report(slots[closest_match], addr, regs);
++
+       rcu_read_unlock();
+       if (!step)
+-- 
+2.25.1
+
diff --git a/queue-5.7/arm64-mm-reserve-hugetlb-cma-after-numa_init.patch b/queue-5.7/arm64-mm-reserve-hugetlb-cma-after-numa_init.patch
new file mode 100644 (file)
index 0000000..790d506
--- /dev/null
@@ -0,0 +1,61 @@
+From f5dc8a20f6a8635baf89651ff93b6628e9e6102b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 18 Jun 2020 09:58:28 +1200
+Subject: arm64: mm: reserve hugetlb CMA after numa_init
+
+From: Barry Song <song.bao.hua@hisilicon.com>
+
+[ Upstream commit 618e07865b7453d02410c1f3407c2d78a670eabb ]
+
+hugetlb_cma_reserve() is called at the wrong place. numa_init has not been
+done yet. so all reserved memory will be located at node0.
+
+Fixes: cf11e85fc08c ("mm: hugetlb: optionally allocate gigantic hugepages using cma")
+Signed-off-by: Barry Song <song.bao.hua@hisilicon.com>
+Reviewed-by: Anshuman Khandual <anshuman.khandual@arm.com>
+Acked-by: Roman Gushchin <guro@fb.com>
+Cc: Matthias Brugger <matthias.bgg@gmail.com>
+Cc: Will Deacon <will@kernel.org>
+Link: https://lore.kernel.org/r/20200617215828.25296-1-song.bao.hua@hisilicon.com
+Signed-off-by: Will Deacon <will@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/arm64/mm/init.c | 15 ++++++++++-----
+ 1 file changed, 10 insertions(+), 5 deletions(-)
+
+diff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.c
+index e42727e3568ea..3f90101674687 100644
+--- a/arch/arm64/mm/init.c
++++ b/arch/arm64/mm/init.c
+@@ -458,11 +458,6 @@ void __init arm64_memblock_init(void)
+       high_memory = __va(memblock_end_of_DRAM() - 1) + 1;
+       dma_contiguous_reserve(arm64_dma32_phys_limit);
+-
+-#ifdef CONFIG_ARM64_4K_PAGES
+-      hugetlb_cma_reserve(PUD_SHIFT - PAGE_SHIFT);
+-#endif
+-
+ }
+ void __init bootmem_init(void)
+@@ -478,6 +473,16 @@ void __init bootmem_init(void)
+       min_low_pfn = min;
+       arm64_numa_init();
++
++      /*
++       * must be done after arm64_numa_init() which calls numa_init() to
++       * initialize node_online_map that gets used in hugetlb_cma_reserve()
++       * while allocating required CMA size across online nodes.
++       */
++#ifdef CONFIG_ARM64_4K_PAGES
++      hugetlb_cma_reserve(PUD_SHIFT - PAGE_SHIFT);
++#endif
++
+       /*
+        * Sparsemem tries to allocate bootmem in memory_present(), so must be
+        * done after the fixed reservations.
+-- 
+2.25.1
+
diff --git a/queue-5.7/arm64-tegra-fix-ethernet-phy-mode-for-jetson-xavier.patch b/queue-5.7/arm64-tegra-fix-ethernet-phy-mode-for-jetson-xavier.patch
new file mode 100644 (file)
index 0000000..67228f2
--- /dev/null
@@ -0,0 +1,44 @@
+From 6492a0ceb5492aefe12165ae8aa557f265499eb8 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 1 May 2020 08:27:56 +0100
+Subject: arm64: tegra: Fix ethernet phy-mode for Jetson Xavier
+
+From: Jon Hunter <jonathanh@nvidia.com>
+
+[ Upstream commit bba25915b172c72f6fa635f091624d799e3c9cae ]
+
+The 'phy-mode' property is currently defined as 'rgmii' for Jetson
+Xavier. This indicates that the RGMII RX and TX delays are set by the
+MAC and the internal delays set by the PHY are not used.
+
+If the Marvell PHY driver is enabled, such that it is used and not the
+generic PHY, ethernet failures are seen (DHCP is failing to obtain an
+IP address) and this is caused because the Marvell PHY driver is
+disabling the internal RX and TX delays. For Jetson Xavier the internal
+PHY RX and TX delay should be used and so fix this by setting the
+'phy-mode' to 'rgmii-id' and not 'rgmii'.
+
+Fixes: f89b58ce71a9 ("arm64: tegra: Add ethernet controller on Tegra194")
+Signed-off-by: Jon Hunter <jonathanh@nvidia.com>
+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 623f7d7d216b7..8e3136dfdd624 100644
+--- a/arch/arm64/boot/dts/nvidia/tegra194-p2888.dtsi
++++ b/arch/arm64/boot/dts/nvidia/tegra194-p2888.dtsi
+@@ -33,7 +33,7 @@
+                       phy-reset-gpios = <&gpio TEGRA194_MAIN_GPIO(G, 5) GPIO_ACTIVE_LOW>;
+                       phy-handle = <&phy>;
+-                      phy-mode = "rgmii";
++                      phy-mode = "rgmii-id";
+                       mdio {
+                               #address-cells = <1>;
+-- 
+2.25.1
+
diff --git a/queue-5.7/arm64-tegra-fix-flag-for-64-bit-resources-in-ranges-.patch b/queue-5.7/arm64-tegra-fix-flag-for-64-bit-resources-in-ranges-.patch
new file mode 100644 (file)
index 0000000..0f7d81b
--- /dev/null
@@ -0,0 +1,81 @@
+From 77979c69c03e41f1299b4ed1e68c5b2b21ed668f Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 14 May 2020 19:24:37 +0530
+Subject: arm64: tegra: Fix flag for 64-bit resources in 'ranges' property
+
+From: Vidya Sagar <vidyas@nvidia.com>
+
+[ Upstream commit 3482a7afb261e2de9269a7f9ad0f4a3a82a83a53 ]
+
+Fix flag in PCIe controllers device-tree nodes 'ranges' property to correctly
+represent 64-bit resources.
+
+Fixes: 2602c32f15e7 ("arm64: tegra: Add P2U and PCIe controller nodes to Tegra194 DT")
+Signed-off-by: Vidya Sagar <vidyas@nvidia.com>
+Signed-off-by: Thierry Reding <treding@nvidia.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/arm64/boot/dts/nvidia/tegra194.dtsi | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+diff --git a/arch/arm64/boot/dts/nvidia/tegra194.dtsi b/arch/arm64/boot/dts/nvidia/tegra194.dtsi
+index f4ede86e32b42..3c928360f4ed2 100644
+--- a/arch/arm64/boot/dts/nvidia/tegra194.dtsi
++++ b/arch/arm64/boot/dts/nvidia/tegra194.dtsi
+@@ -1387,7 +1387,7 @@
+               bus-range = <0x0 0xff>;
+               ranges = <0x81000000 0x0  0x30100000 0x0  0x30100000 0x0 0x00100000   /* downstream I/O (1MB) */
+-                        0xc2000000 0x12 0x00000000 0x12 0x00000000 0x0 0x30000000   /* prefetchable memory (768MB) */
++                        0xc3000000 0x12 0x00000000 0x12 0x00000000 0x0 0x30000000   /* prefetchable memory (768MB) */
+                         0x82000000 0x0  0x40000000 0x12 0x30000000 0x0 0x10000000>; /* non-prefetchable memory (256MB) */
+       };
+@@ -1432,7 +1432,7 @@
+               bus-range = <0x0 0xff>;
+               ranges = <0x81000000 0x0  0x32100000 0x0  0x32100000 0x0 0x00100000   /* downstream I/O (1MB) */
+-                        0xc2000000 0x12 0x40000000 0x12 0x40000000 0x0 0x30000000   /* prefetchable memory (768MB) */
++                        0xc3000000 0x12 0x40000000 0x12 0x40000000 0x0 0x30000000   /* prefetchable memory (768MB) */
+                         0x82000000 0x0  0x40000000 0x12 0x70000000 0x0 0x10000000>; /* non-prefetchable memory (256MB) */
+       };
+@@ -1477,7 +1477,7 @@
+               bus-range = <0x0 0xff>;
+               ranges = <0x81000000 0x0  0x34100000 0x0  0x34100000 0x0 0x00100000   /* downstream I/O (1MB) */
+-                        0xc2000000 0x12 0x80000000 0x12 0x80000000 0x0 0x30000000   /* prefetchable memory (768MB) */
++                        0xc3000000 0x12 0x80000000 0x12 0x80000000 0x0 0x30000000   /* prefetchable memory (768MB) */
+                         0x82000000 0x0  0x40000000 0x12 0xb0000000 0x0 0x10000000>; /* non-prefetchable memory (256MB) */
+       };
+@@ -1522,7 +1522,7 @@
+               bus-range = <0x0 0xff>;
+               ranges = <0x81000000 0x0  0x36100000 0x0  0x36100000 0x0 0x00100000   /* downstream I/O (1MB) */
+-                        0xc2000000 0x14 0x00000000 0x14 0x00000000 0x3 0x40000000   /* prefetchable memory (13GB) */
++                        0xc3000000 0x14 0x00000000 0x14 0x00000000 0x3 0x40000000   /* prefetchable memory (13GB) */
+                         0x82000000 0x0  0x40000000 0x17 0x40000000 0x0 0xc0000000>; /* non-prefetchable memory (3GB) */
+       };
+@@ -1567,7 +1567,7 @@
+               bus-range = <0x0 0xff>;
+               ranges = <0x81000000 0x0  0x38100000 0x0  0x38100000 0x0 0x00100000   /* downstream I/O (1MB) */
+-                        0xc2000000 0x18 0x00000000 0x18 0x00000000 0x3 0x40000000   /* prefetchable memory (13GB) */
++                        0xc3000000 0x18 0x00000000 0x18 0x00000000 0x3 0x40000000   /* prefetchable memory (13GB) */
+                         0x82000000 0x0  0x40000000 0x1b 0x40000000 0x0 0xc0000000>; /* non-prefetchable memory (3GB) */
+       };
+@@ -1616,7 +1616,7 @@
+               bus-range = <0x0 0xff>;
+               ranges = <0x81000000 0x0  0x3a100000 0x0  0x3a100000 0x0 0x00100000   /* downstream I/O (1MB) */
+-                        0xc2000000 0x1c 0x00000000 0x1c 0x00000000 0x3 0x40000000   /* prefetchable memory (13GB) */
++                        0xc3000000 0x1c 0x00000000 0x1c 0x00000000 0x3 0x40000000   /* prefetchable memory (13GB) */
+                         0x82000000 0x0  0x40000000 0x1f 0x40000000 0x0 0xc0000000>; /* non-prefetchable memory (3GB) */
+       };
+-- 
+2.25.1
+
diff --git a/queue-5.7/asoc-codecs-rt-sdw-fix-memory-leak-in-set_sdw_stream.patch b/queue-5.7/asoc-codecs-rt-sdw-fix-memory-leak-in-set_sdw_stream.patch
new file mode 100644 (file)
index 0000000..7d8fd3a
--- /dev/null
@@ -0,0 +1,108 @@
+From 6fddaa2d552dc402592e010322a35dca4d4e40e2 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 15 May 2020 16:15:30 -0500
+Subject: ASoC: codecs: rt*-sdw: fix memory leak in set_sdw_stream()
+
+From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
+
+[ Upstream commit 07b542fe831cbefce163ad1b3aa7292c8a6332b8 ]
+
+Now that the sdw_stream is allocated in machine driver,
+set_sdw_stream() is also called with a NULL argument during the
+dailink shutdown.
+
+In this case, the drivers should not allocate any memory, and just
+return.
+
+Detected with KASAN/kmemleak.
+
+Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
+Reviewed-by: Guennadi Liakhovetski <guennadi.liakhovetski@linux.intel.com>
+Reviewed-by: Rander Wang <rander.wang@intel.com>
+Cc: Oder Chiou <oder_chiou@realtek.com>
+Cc: Shuming Fan <shumingf@realtek.com>
+Cc: Jack Yu <jack.yu@realtek.com>
+Link: https://lore.kernel.org/r/20200515211531.11416-3-pierre-louis.bossart@linux.intel.com
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/soc/codecs/rt1308-sdw.c | 3 +++
+ sound/soc/codecs/rt5682.c     | 3 +++
+ sound/soc/codecs/rt700.c      | 3 +++
+ sound/soc/codecs/rt711.c      | 3 +++
+ sound/soc/codecs/rt715.c      | 3 +++
+ 5 files changed, 15 insertions(+)
+
+diff --git a/sound/soc/codecs/rt1308-sdw.c b/sound/soc/codecs/rt1308-sdw.c
+index a5a7e46de246a..a7f45191364d7 100644
+--- a/sound/soc/codecs/rt1308-sdw.c
++++ b/sound/soc/codecs/rt1308-sdw.c
+@@ -482,6 +482,9 @@ static int rt1308_set_sdw_stream(struct snd_soc_dai *dai, void *sdw_stream,
+ {
+       struct sdw_stream_data *stream;
++      if (!sdw_stream)
++              return 0;
++
+       stream = kzalloc(sizeof(*stream), GFP_KERNEL);
+       if (!stream)
+               return -ENOMEM;
+diff --git a/sound/soc/codecs/rt5682.c b/sound/soc/codecs/rt5682.c
+index d36f560ad7a85..c4892af14850d 100644
+--- a/sound/soc/codecs/rt5682.c
++++ b/sound/soc/codecs/rt5682.c
+@@ -2958,6 +2958,9 @@ static int rt5682_set_sdw_stream(struct snd_soc_dai *dai, void *sdw_stream,
+ {
+       struct sdw_stream_data *stream;
++      if (!sdw_stream)
++              return 0;
++
+       stream = kzalloc(sizeof(*stream), GFP_KERNEL);
+       if (!stream)
+               return -ENOMEM;
+diff --git a/sound/soc/codecs/rt700.c b/sound/soc/codecs/rt700.c
+index ff68f0e4f629d..687ac2153666b 100644
+--- a/sound/soc/codecs/rt700.c
++++ b/sound/soc/codecs/rt700.c
+@@ -860,6 +860,9 @@ static int rt700_set_sdw_stream(struct snd_soc_dai *dai, void *sdw_stream,
+ {
+       struct sdw_stream_data *stream;
++      if (!sdw_stream)
++              return 0;
++
+       stream = kzalloc(sizeof(*stream), GFP_KERNEL);
+       if (!stream)
+               return -ENOMEM;
+diff --git a/sound/soc/codecs/rt711.c b/sound/soc/codecs/rt711.c
+index 2daed7692a3b7..65b59dbfb43c8 100644
+--- a/sound/soc/codecs/rt711.c
++++ b/sound/soc/codecs/rt711.c
+@@ -906,6 +906,9 @@ static int rt711_set_sdw_stream(struct snd_soc_dai *dai, void *sdw_stream,
+ {
+       struct sdw_stream_data *stream;
++      if (!sdw_stream)
++              return 0;
++
+       stream = kzalloc(sizeof(*stream), GFP_KERNEL);
+       if (!stream)
+               return -ENOMEM;
+diff --git a/sound/soc/codecs/rt715.c b/sound/soc/codecs/rt715.c
+index 2cbc57b16b136..099c8bd200062 100644
+--- a/sound/soc/codecs/rt715.c
++++ b/sound/soc/codecs/rt715.c
+@@ -530,6 +530,9 @@ static int rt715_set_sdw_stream(struct snd_soc_dai *dai, void *sdw_stream,
+       struct sdw_stream_data *stream;
++      if (!sdw_stream)
++              return 0;
++
+       stream = kzalloc(sizeof(*stream), GFP_KERNEL);
+       if (!stream)
+               return -ENOMEM;
+-- 
+2.25.1
+
diff --git a/queue-5.7/asoc-codecs-wm97xx-fix-ac97-dependency.patch b/queue-5.7/asoc-codecs-wm97xx-fix-ac97-dependency.patch
new file mode 100644 (file)
index 0000000..0be9f51
--- /dev/null
@@ -0,0 +1,65 @@
+From 971b64f03661ce3d55ebfebda8c861fea7aad813 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 28 Apr 2020 23:26:59 +0200
+Subject: ASoC: codecs: wm97xx: fix ac97 dependency
+
+From: Arnd Bergmann <arnd@arndb.de>
+
+[ Upstream commit ee2cbe06935bfa58f1fe07dc2a2283945f4b97dc ]
+
+A recent build fix got the dependency slightly wrong, breaking
+builds with CONFIG_AC97_BUS_NEW:
+
+WARNING: unmet direct dependencies detected for SND_SOC_WM9713
+  Depends on [n]: SOUND [=y] && !UML && SND [=y] && SND_SOC [=y] && SND_SOC_AC97_BUS [=n]
+  Selected by [m]:
+  - SND_SOC_ZYLONITE [=m] && SOUND [=y] && !UML && SND [=y] && SND_SOC [=y] && SND_PXA2XX_SOC [=m] && MACH_ZYLONITE [=y] && AC97_BUS [=n]=n
+
+WARNING: unmet direct dependencies detected for SND_SOC_WM9712
+  Depends on [n]: SOUND [=y] && !UML && SND [=y] && SND_SOC [=y] && SND_SOC_AC97_BUS [=n]
+  Selected by [m]:
+  - SND_PXA2XX_SOC_EM_X270 [=m] && SOUND [=y] && !UML && SND [=y] && SND_SOC [=y] && SND_PXA2XX_SOC [=m] && (MACH_EM_X270 [=n] || MACH_EXEDA [=n] || MACH_CM_X300 [=y]) && AC97_BUS [=n]=n
+
+Change the dependency to allow either version of the AC97 library
+code.
+
+Fixes: 5a309875787d ("ASoC: Fix SND_SOC_ALL_CODECS imply ac97 fallout")
+Signed-off-by: Arnd Bergmann <arnd@arndb.de>
+Acked-by: Charles Keepax <ckeepax@opensource.cirrus.com>
+Link: https://lore.kernel.org/r/20200428212721.2877627-1-arnd@arndb.de
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/soc/codecs/Kconfig | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/sound/soc/codecs/Kconfig b/sound/soc/codecs/Kconfig
+index e60e0b6a689cd..8cdc68c141dc2 100644
+--- a/sound/soc/codecs/Kconfig
++++ b/sound/soc/codecs/Kconfig
+@@ -1620,19 +1620,19 @@ config SND_SOC_WM9090
+ config SND_SOC_WM9705
+       tristate
+-      depends on SND_SOC_AC97_BUS
++      depends on SND_SOC_AC97_BUS || AC97_BUS_NEW
+       select REGMAP_AC97
+       select AC97_BUS_COMPAT if AC97_BUS_NEW
+ config SND_SOC_WM9712
+       tristate
+-      depends on SND_SOC_AC97_BUS
++      depends on SND_SOC_AC97_BUS || AC97_BUS_NEW
+       select REGMAP_AC97
+       select AC97_BUS_COMPAT if AC97_BUS_NEW
+ config SND_SOC_WM9713
+       tristate
+-      depends on SND_SOC_AC97_BUS
++      depends on SND_SOC_AC97_BUS || AC97_BUS_NEW
+       select REGMAP_AC97
+       select AC97_BUS_COMPAT if AC97_BUS_NEW
+-- 
+2.25.1
+
diff --git a/queue-5.7/asoc-component-suppress-uninitialized-variable-warni.patch b/queue-5.7/asoc-component-suppress-uninitialized-variable-warni.patch
new file mode 100644 (file)
index 0000000..1d15bf1
--- /dev/null
@@ -0,0 +1,43 @@
+From 2909551e7d660529d3630a40e80a848728e43f89 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 28 Apr 2020 23:47:31 +0200
+Subject: ASoC: component: suppress uninitialized-variable warning
+
+From: Arnd Bergmann <arnd@arndb.de>
+
+[ Upstream commit be16a0f0dc8fab8e25d9cdbeb4f8f28afc9186d2 ]
+
+Old versions of gcc (tested on gcc-4.8) produce a warning for
+correct code:
+
+sound/soc/soc-compress.c: In function 'soc_compr_open':
+sound/soc/soc-compress.c:75:28: error: 'component' is used uninitialized in this function [-Werror=uninitialized]
+  struct snd_soc_component *component, *save = NULL;
+
+Change the for_each_rtd_components() macro to ensure 'component'
+gets initialized to a value the compiler does not complain about.
+
+Signed-off-by: Arnd Bergmann <arnd@arndb.de>
+Link: https://lore.kernel.org/r/20200428214754.3925368-1-arnd@arndb.de
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ include/sound/soc.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/include/sound/soc.h b/include/sound/soc.h
+index 946f88a6c63d1..e0371e70242d5 100644
+--- a/include/sound/soc.h
++++ b/include/sound/soc.h
+@@ -1177,7 +1177,7 @@ struct snd_soc_pcm_runtime {
+ #define asoc_rtd_to_codec(rtd, n) (rtd)->dais[n + (rtd)->num_cpus]
+ #define for_each_rtd_components(rtd, i, component)                    \
+-      for ((i) = 0;                                                   \
++      for ((i) = 0, component = NULL;                                 \
+            ((i) < rtd->num_components) && ((component) = rtd->components[i]);\
+            (i)++)
+ #define for_each_rtd_cpu_dais(rtd, i, dai)                            \
+-- 
+2.25.1
+
diff --git a/queue-5.7/asoc-core-only-convert-non-dpcm-link-to-dpcm-link.patch b/queue-5.7/asoc-core-only-convert-non-dpcm-link-to-dpcm-link.patch
new file mode 100644 (file)
index 0000000..6bffbea
--- /dev/null
@@ -0,0 +1,72 @@
+From c7d7f316b8f149b65f69377e8df025a368a5f5e2 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 8 Jun 2020 14:44:13 -0500
+Subject: ASoC: core: only convert non DPCM link to DPCM link
+
+From: Bard Liao <yung-chuan.liao@linux.intel.com>
+
+[ Upstream commit 607fa205a7e4dfad28b8a67ab1c985756ddbccb0 ]
+
+Additional checks for valid DAIs expose a corner case, where existing
+BE dailinks get modified, e.g. HDMI links are tagged with
+dpcm_capture=1 even if the DAIs are for playback.
+
+This patch makes those changes conditional and flags configuration
+issues when a BE dailink is has no_pcm=0 but dpcm_playback or
+dpcm_capture=1 (which makes no sense).
+
+As discussed on the alsa-devel mailing list, there are redundant flags
+for dpcm_playback, dpcm_capture, playback_only, capture_only. This
+will have to be cleaned-up in a future update. For now only correct
+and flag problematic configurations.
+
+Fixes: 218fe9b7ec7f3 ("ASoC: soc-core: Set dpcm_playback / dpcm_capture")
+Suggested-by: Daniel Baluta <daniel.baluta@nxp.com>
+Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com>
+Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
+Reviewed-by: Guennadi Liakhovetski <guennadi.liakhovetski@linux.intel.com>
+Reviewed-by: Daniel Baluta <daniel.baluta@gmail.com>
+Reviewed-by: Bard Liao <yung-chuan.liao@linux.intel.com>
+Link: https://lore.kernel.org/r/20200608194415.4663-3-pierre-louis.bossart@linux.intel.com
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/soc/soc-core.c | 22 +++++++++++++++++++---
+ 1 file changed, 19 insertions(+), 3 deletions(-)
+
+diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
+index 843b8b1c89d41..e5433e8fcf19e 100644
+--- a/sound/soc/soc-core.c
++++ b/sound/soc/soc-core.c
+@@ -1720,9 +1720,25 @@ match:
+                       dai_link->platforms->name = component->name;
+                       /* convert non BE into BE */
+-                      dai_link->no_pcm = 1;
+-                      dai_link->dpcm_playback = 1;
+-                      dai_link->dpcm_capture = 1;
++                      if (!dai_link->no_pcm) {
++                              dai_link->no_pcm = 1;
++
++                              if (dai_link->dpcm_playback)
++                                      dev_warn(card->dev,
++                                               "invalid configuration, dailink %s has flags no_pcm=0 and dpcm_playback=1\n",
++                                               dai_link->name);
++                              if (dai_link->dpcm_capture)
++                                      dev_warn(card->dev,
++                                               "invalid configuration, dailink %s has flags no_pcm=0 and dpcm_capture=1\n",
++                                               dai_link->name);
++
++                              /* convert normal link into DPCM one */
++                              if (!(dai_link->dpcm_playback ||
++                                    dai_link->dpcm_capture)) {
++                                      dai_link->dpcm_playback = !dai_link->capture_only;
++                                      dai_link->dpcm_capture = !dai_link->playback_only;
++                              }
++                      }
+                       /* override any BE fixups */
+                       dai_link->be_hw_params_fixup =
+-- 
+2.25.1
+
diff --git a/queue-5.7/asoc-dapm-move-dai_link-widgets-to-runtime-to-fix-us.patch b/queue-5.7/asoc-dapm-move-dai_link-widgets-to-runtime-to-fix-us.patch
new file mode 100644 (file)
index 0000000..96be751
--- /dev/null
@@ -0,0 +1,99 @@
+From 76e431be8e037d1f9629922391ff6e818c9bdc99 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 26 May 2020 17:19:30 +0100
+Subject: ASoC: dapm: Move dai_link widgets to runtime to fix use after free
+
+From: Charles Keepax <ckeepax@opensource.cirrus.com>
+
+[ Upstream commit f4aa5e214eeaf7f1c7f157526a5aa29784cb6a1f ]
+
+The newly added CODEC to CODEC DAI link widget pointers in
+snd_soc_dai_link are better placed in snd_soc_pcm_runtime.
+snd_soc_dai_link is really intended for static configuration of
+the DAI, and the runtime for dynamic data.  The snd_soc_dai_link
+structures are not destroyed if the card is unbound. The widgets
+are cleared up on unbind, however if the card is rebound as the
+snd_soc_dai_link structures are reused these pointers will be left at
+their old values, causing access to freed memory.
+
+Fixes: 595571cca4de ("ASoC: dapm: Fix regression introducing multiple copies of DAI widgets")
+Signed-off-by: Charles Keepax <ckeepax@opensource.cirrus.com>
+Link: https://lore.kernel.org/r/20200526161930.30759-1-ckeepax@opensource.cirrus.com
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ include/sound/soc.h  |  6 +++---
+ sound/soc/soc-dapm.c | 12 ++++++------
+ 2 files changed, 9 insertions(+), 9 deletions(-)
+
+diff --git a/include/sound/soc.h b/include/sound/soc.h
+index e0371e70242d5..8e480efeda2a5 100644
+--- a/include/sound/soc.h
++++ b/include/sound/soc.h
+@@ -790,9 +790,6 @@ struct snd_soc_dai_link {
+       const struct snd_soc_pcm_stream *params;
+       unsigned int num_params;
+-      struct snd_soc_dapm_widget *playback_widget;
+-      struct snd_soc_dapm_widget *capture_widget;
+-
+       unsigned int dai_fmt;           /* format to set on init */
+       enum snd_soc_dpcm_trigger trigger[2]; /* trigger type for DPCM */
+@@ -1156,6 +1153,9 @@ struct snd_soc_pcm_runtime {
+       struct snd_soc_dai **cpu_dais;
+       unsigned int num_cpus;
++      struct snd_soc_dapm_widget *playback_widget;
++      struct snd_soc_dapm_widget *capture_widget;
++
+       struct delayed_work delayed_work;
+       void (*close_delayed_work_func)(struct snd_soc_pcm_runtime *rtd);
+ #ifdef CONFIG_DEBUG_FS
+diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c
+index e2632841b321a..c0aa64ff8e328 100644
+--- a/sound/soc/soc-dapm.c
++++ b/sound/soc/soc-dapm.c
+@@ -4340,16 +4340,16 @@ static void dapm_connect_dai_pair(struct snd_soc_card *card,
+       codec = codec_dai->playback_widget;
+       if (playback_cpu && codec) {
+-              if (dai_link->params && !dai_link->playback_widget) {
++              if (dai_link->params && !rtd->playback_widget) {
+                       substream = streams[SNDRV_PCM_STREAM_PLAYBACK].substream;
+                       dai = snd_soc_dapm_new_dai(card, substream, "playback");
+                       if (IS_ERR(dai))
+                               goto capture;
+-                      dai_link->playback_widget = dai;
++                      rtd->playback_widget = dai;
+               }
+               dapm_connect_dai_routes(&card->dapm, cpu_dai, playback_cpu,
+-                                      dai_link->playback_widget,
++                                      rtd->playback_widget,
+                                       codec_dai, codec);
+       }
+@@ -4358,16 +4358,16 @@ capture:
+       codec = codec_dai->capture_widget;
+       if (codec && capture_cpu) {
+-              if (dai_link->params && !dai_link->capture_widget) {
++              if (dai_link->params && !rtd->capture_widget) {
+                       substream = streams[SNDRV_PCM_STREAM_CAPTURE].substream;
+                       dai = snd_soc_dapm_new_dai(card, substream, "capture");
+                       if (IS_ERR(dai))
+                               return;
+-                      dai_link->capture_widget = dai;
++                      rtd->capture_widget = dai;
+               }
+               dapm_connect_dai_routes(&card->dapm, codec_dai, codec,
+-                                      dai_link->capture_widget,
++                                      rtd->capture_widget,
+                                       cpu_dai, capture_cpu);
+       }
+ }
+-- 
+2.25.1
+
diff --git a/queue-5.7/asoc-davinci-mcasp-fix-dma_chan-refcnt-leak-when-get.patch b/queue-5.7/asoc-davinci-mcasp-fix-dma_chan-refcnt-leak-when-get.patch
new file mode 100644 (file)
index 0000000..a0594c9
--- /dev/null
@@ -0,0 +1,53 @@
+From 7b59233a4bbbcf836e66beac435c340a828f10bf Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 25 Apr 2020 20:48:35 +0800
+Subject: ASoC: davinci-mcasp: Fix dma_chan refcnt leak when getting dma type
+
+From: Xiyu Yang <xiyuyang19@fudan.edu.cn>
+
+[ Upstream commit a697ae6ea56e23397341b027098c1b11d9ab13da ]
+
+davinci_mcasp_get_dma_type() invokes dma_request_chan(), which returns a
+reference of the specified dma_chan object to "chan" with increased
+refcnt.
+
+When davinci_mcasp_get_dma_type() returns, local variable "chan" becomes
+invalid, so the refcount should be decreased to keep refcount balanced.
+
+The reference counting issue happens in one exception handling path of
+davinci_mcasp_get_dma_type(). When chan device is NULL, the function
+forgets to decrease the refcnt increased by dma_request_chan(), causing
+a refcnt leak.
+
+Fix this issue by calling dma_release_channel() when chan device is
+NULL.
+
+Signed-off-by: Xiyu Yang <xiyuyang19@fudan.edu.cn>
+Signed-off-by: Xin Tan <tanxin.ctf@gmail.com>
+Acked-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
+Link: https://lore.kernel.org/r/1587818916-38730-1-git-send-email-xiyuyang19@fudan.edu.cn
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/soc/ti/davinci-mcasp.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/sound/soc/ti/davinci-mcasp.c b/sound/soc/ti/davinci-mcasp.c
+index 734ffe925c4db..7a7db743dc5b5 100644
+--- a/sound/soc/ti/davinci-mcasp.c
++++ b/sound/soc/ti/davinci-mcasp.c
+@@ -1896,8 +1896,10 @@ static int davinci_mcasp_get_dma_type(struct davinci_mcasp *mcasp)
+                               PTR_ERR(chan));
+               return PTR_ERR(chan);
+       }
+-      if (WARN_ON(!chan->device || !chan->device->dev))
++      if (WARN_ON(!chan->device || !chan->device->dev)) {
++              dma_release_channel(chan);
+               return -EINVAL;
++      }
+       if (chan->device->dev->of_node)
+               ret = of_property_read_string(chan->device->dev->of_node,
+-- 
+2.25.1
+
diff --git a/queue-5.7/asoc-fix-incomplete-error-handling-in-img_i2s_in_pro.patch b/queue-5.7/asoc-fix-incomplete-error-handling-in-img_i2s_in_pro.patch
new file mode 100644 (file)
index 0000000..58ecb10
--- /dev/null
@@ -0,0 +1,37 @@
+From ab6336411526ea39c1e9758f1d0957a8b42db65d Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 25 May 2020 00:50:11 -0500
+Subject: ASoC: fix incomplete error-handling in img_i2s_in_probe.
+
+From: Qiushi Wu <wu000273@umn.edu>
+
+[ Upstream commit 25bf943e4e7b47282bd86ae7d39e039217ebb007 ]
+
+Function "pm_runtime_get_sync()" is not handled by "pm_runtime_put()"
+if "PTR_ERR(rst) == -EPROBE_DEFER". Fix this issue by adding
+"pm_runtime_put()" into this error path.
+
+Fixes: f65bb92ca12e ("ASoC: img-i2s-in: Add runtime PM")
+Signed-off-by: Qiushi Wu <wu000273@umn.edu>
+Link: https://lore.kernel.org/r/20200525055011.31925-1-wu000273@umn.edu
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/soc/img/img-i2s-in.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/sound/soc/img/img-i2s-in.c b/sound/soc/img/img-i2s-in.c
+index a495d1050d490..e30b66b94bf67 100644
+--- a/sound/soc/img/img-i2s-in.c
++++ b/sound/soc/img/img-i2s-in.c
+@@ -482,6 +482,7 @@ static int img_i2s_in_probe(struct platform_device *pdev)
+       if (IS_ERR(rst)) {
+               if (PTR_ERR(rst) == -EPROBE_DEFER) {
+                       ret = -EPROBE_DEFER;
++                      pm_runtime_put(&pdev->dev);
+                       goto err_suspend;
+               }
+-- 
+2.25.1
+
diff --git a/queue-5.7/asoc-fsl_asrc_dma-fix-dma_chan-leak-when-config-dma-.patch b/queue-5.7/asoc-fsl_asrc_dma-fix-dma_chan-leak-when-config-dma-.patch
new file mode 100644 (file)
index 0000000..9a9bbe0
--- /dev/null
@@ -0,0 +1,46 @@
+From ed86a6c3996a9295440f269e6cdb892ecd2336ea Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 25 May 2020 22:12:46 +0800
+Subject: ASoC: fsl_asrc_dma: Fix dma_chan leak when config DMA channel failed
+
+From: Xiyu Yang <xiyuyang19@fudan.edu.cn>
+
+[ Upstream commit 36124fb19f1ae68a500cd76a76d40c6e81bee346 ]
+
+fsl_asrc_dma_hw_params() invokes dma_request_channel() or
+fsl_asrc_get_dma_channel(), which returns a reference of the specified
+dma_chan object to "pair->dma_chan[dir]" with increased refcnt.
+
+The reference counting issue happens in one exception handling path of
+fsl_asrc_dma_hw_params(). When config DMA channel failed for Back-End,
+the function forgets to decrease the refcnt increased by
+dma_request_channel() or fsl_asrc_get_dma_channel(), causing a refcnt
+leak.
+
+Fix this issue by calling dma_release_channel() when config DMA channel
+failed.
+
+Signed-off-by: Xiyu Yang <xiyuyang19@fudan.edu.cn>
+Signed-off-by: Xin Tan <tanxin.ctf@gmail.com>
+Link: https://lore.kernel.org/r/1590415966-52416-1-git-send-email-xiyuyang19@fudan.edu.cn
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/soc/fsl/fsl_asrc_dma.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/sound/soc/fsl/fsl_asrc_dma.c b/sound/soc/fsl/fsl_asrc_dma.c
+index e7178817d7a75..1ee10eafe3e6a 100644
+--- a/sound/soc/fsl/fsl_asrc_dma.c
++++ b/sound/soc/fsl/fsl_asrc_dma.c
+@@ -252,6 +252,7 @@ static int fsl_asrc_dma_hw_params(struct snd_soc_component *component,
+       ret = dmaengine_slave_config(pair->dma_chan[dir], &config_be);
+       if (ret) {
+               dev_err(dev, "failed to config DMA channel for Back-End\n");
++              dma_release_channel(pair->dma_chan[dir]);
+               return ret;
+       }
+-- 
+2.25.1
+
diff --git a/queue-5.7/asoc-fsl_esai-disable-exception-interrupt-before-sch.patch b/queue-5.7/asoc-fsl_esai-disable-exception-interrupt-before-sch.patch
new file mode 100644 (file)
index 0000000..5fb0219
--- /dev/null
@@ -0,0 +1,41 @@
+From 49382daa3bb654b81c29aaefd6df9b03211b2339 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 27 Apr 2020 14:23:21 +0800
+Subject: ASoC: fsl_esai: Disable exception interrupt before scheduling tasklet
+
+From: Shengjiu Wang <shengjiu.wang@nxp.com>
+
+[ Upstream commit 1fecbb71fe0e46b886f84e3b6decca6643c3af6d ]
+
+Disable exception interrupt before scheduling tasklet, otherwise if
+the tasklet isn't handled immediately, there will be endless xrun
+interrupt.
+
+Fixes: 7ccafa2b3879 ("ASoC: fsl_esai: recover the channel swap after xrun")
+Signed-off-by: Shengjiu Wang <shengjiu.wang@nxp.com>
+Acked-by: Nicolin Chen <nicoleotsuka@gmail.com>
+Link: https://lore.kernel.org/r/a8f2ad955aac9e52587beedc1133b3efbe746895.1587968824.git.shengjiu.wang@nxp.com
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/soc/fsl/fsl_esai.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/sound/soc/fsl/fsl_esai.c b/sound/soc/fsl/fsl_esai.c
+index c7a49d03463a7..84290be778f0e 100644
+--- a/sound/soc/fsl/fsl_esai.c
++++ b/sound/soc/fsl/fsl_esai.c
+@@ -87,6 +87,10 @@ static irqreturn_t esai_isr(int irq, void *devid)
+       if ((saisr & (ESAI_SAISR_TUE | ESAI_SAISR_ROE)) &&
+           esai_priv->reset_at_xrun) {
+               dev_dbg(&pdev->dev, "reset module for xrun\n");
++              regmap_update_bits(esai_priv->regmap, REG_ESAI_TCR,
++                                 ESAI_xCR_xEIE_MASK, 0);
++              regmap_update_bits(esai_priv->regmap, REG_ESAI_RCR,
++                                 ESAI_xCR_xEIE_MASK, 0);
+               tasklet_schedule(&esai_priv->task);
+       }
+-- 
+2.25.1
+
diff --git a/queue-5.7/asoc-intel-bytcr_rt5640-add-quirk-for-toshiba-encore.patch b/queue-5.7/asoc-intel-bytcr_rt5640-add-quirk-for-toshiba-encore.patch
new file mode 100644 (file)
index 0000000..38596ee
--- /dev/null
@@ -0,0 +1,52 @@
+From 527931d351f9ecfc9de1ca23c0cdef5e5d3709ba Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 18 May 2020 09:24:16 +0200
+Subject: ASoC: Intel: bytcr_rt5640: Add quirk for Toshiba Encore WT8-A tablet
+
+From: Hans de Goede <hdegoede@redhat.com>
+
+[ Upstream commit 0e0e10fde0e9808d1991268f5dca69fb36c025f7 ]
+
+The Toshiba Encore WT8-A tablet almost fully works with the default
+settings for non-CR Bay Trail devices. The only problem is that its
+jack-detect switch is not inverted (it is active high instead of
+the normal active low).
+
+Add a quirk for this model using the default settings +
+BYT_RT5640_JD_NOT_INV.
+
+Signed-off-by: Hans de Goede <hdegoede@redhat.com>
+Acked-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
+Link: https://lore.kernel.org/r/20200518072416.5348-1-hdegoede@redhat.com
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/soc/intel/boards/bytcr_rt5640.c | 12 ++++++++++++
+ 1 file changed, 12 insertions(+)
+
+diff --git a/sound/soc/intel/boards/bytcr_rt5640.c b/sound/soc/intel/boards/bytcr_rt5640.c
+index 08f4ae964b02a..fbfd53874b477 100644
+--- a/sound/soc/intel/boards/bytcr_rt5640.c
++++ b/sound/soc/intel/boards/bytcr_rt5640.c
+@@ -742,6 +742,18 @@ static const struct dmi_system_id byt_rt5640_quirk_table[] = {
+                                       BYT_RT5640_SSP0_AIF1 |
+                                       BYT_RT5640_MCLK_EN),
+       },
++      {       /* Toshiba Encore WT8-A */
++              .matches = {
++                      DMI_EXACT_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
++                      DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "TOSHIBA WT8-A"),
++              },
++              .driver_data = (void *)(BYT_RT5640_DMIC1_MAP |
++                                      BYT_RT5640_JD_SRC_JD2_IN4N |
++                                      BYT_RT5640_OVCD_TH_2000UA |
++                                      BYT_RT5640_OVCD_SF_0P75 |
++                                      BYT_RT5640_JD_NOT_INV |
++                                      BYT_RT5640_MCLK_EN),
++      },
+       {       /* Catch-all for generic Insyde tablets, must be last */
+               .matches = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "Insyde"),
+-- 
+2.25.1
+
diff --git a/queue-5.7/asoc-intel-bytcr_rt5640-add-quirk-for-toshiba-encore.patch-12891 b/queue-5.7/asoc-intel-bytcr_rt5640-add-quirk-for-toshiba-encore.patch-12891
new file mode 100644 (file)
index 0000000..d153c5f
--- /dev/null
@@ -0,0 +1,51 @@
+From df66ac669ab29651e0dcfd4ae9ef663d14653b89 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 8 Jun 2020 22:46:33 +0200
+Subject: ASoC: Intel: bytcr_rt5640: Add quirk for Toshiba Encore WT10-A tablet
+
+From: Hans de Goede <hdegoede@redhat.com>
+
+[ Upstream commit 199a5e8fda54ab3c8c6f6bf980c004e97ebf5ccb ]
+
+The Toshiba Encore WT10-A tablet almost fully works with the default
+settings for Bay Trail CR devices. The only issue is that it uses a
+digital mic. connected the the DMIC1 input instead of an analog mic.
+
+Add a quirk for this model using the default settings with the input-map
+replaced with BYT_RT5640_DMIC1_MAP.
+
+Signed-off-by: Hans de Goede <hdegoede@redhat.com>
+Acked-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
+Link: https://lore.kernel.org/r/20200608204634.93407-1-hdegoede@redhat.com
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/soc/intel/boards/bytcr_rt5640.c | 12 ++++++++++++
+ 1 file changed, 12 insertions(+)
+
+diff --git a/sound/soc/intel/boards/bytcr_rt5640.c b/sound/soc/intel/boards/bytcr_rt5640.c
+index fbfd53874b477..5c1a5e2aff6f5 100644
+--- a/sound/soc/intel/boards/bytcr_rt5640.c
++++ b/sound/soc/intel/boards/bytcr_rt5640.c
+@@ -754,6 +754,18 @@ static const struct dmi_system_id byt_rt5640_quirk_table[] = {
+                                       BYT_RT5640_JD_NOT_INV |
+                                       BYT_RT5640_MCLK_EN),
+       },
++      {       /* Toshiba Encore WT10-A */
++              .matches = {
++                      DMI_EXACT_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
++                      DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "TOSHIBA WT10-A-103"),
++              },
++              .driver_data = (void *)(BYT_RT5640_DMIC1_MAP |
++                                      BYT_RT5640_JD_SRC_JD1_IN4P |
++                                      BYT_RT5640_OVCD_TH_2000UA |
++                                      BYT_RT5640_OVCD_SF_0P75 |
++                                      BYT_RT5640_SSP0_AIF2 |
++                                      BYT_RT5640_MCLK_EN),
++      },
+       {       /* Catch-all for generic Insyde tablets, must be last */
+               .matches = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "Insyde"),
+-- 
+2.25.1
+
diff --git a/queue-5.7/asoc-max98373-reorder-max98373_reset-in-resume.patch b/queue-5.7/asoc-max98373-reorder-max98373_reset-in-resume.patch
new file mode 100644 (file)
index 0000000..a3fa4d6
--- /dev/null
@@ -0,0 +1,56 @@
+From d7a6b0e2bca11dc9f79352348828332f68668e88 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 1 May 2020 18:44:21 -0500
+Subject: ASoC: max98373: reorder max98373_reset() in resume
+
+From: Yong Zhi <yong.zhi@intel.com>
+
+[ Upstream commit 1a446873d7dd3a450f685928ce7f1907bde4583d ]
+
+During S3 test, the following error was observed:
+
+[ 726.174237] i2c_designware i2c_designware.0: platform_pm_resume+0x0/0x3d returned 0 after 0 usecs
+[ 726.184187] max98373 i2c-MX98373:00: calling max98373_resume+0x0/0x30 [snd_soc_max98373] @ 12698, parent: i2c-11
+[ 726.195589] max98373 i2c-MX98373:00: Reset command failed. (ret:-16)
+
+When calling regmap_update_bits(), since map->reg_update_bits is NULL,
+_regmap_read() is entered with the following logic:
+
+       if (!map->cache_bypass) {
+               ret = regcache_read(map, reg, val);
+               if (ret == 0)
+                       return 0;
+       }
+
+       if (map->cache_only)
+               return -EBUSY;
+
+regcache_read() hits -EINVAL because MAX98373_R2000_SW_RESET is volatile,
+as map->cache_only is set by codec suspend, thus -EBUSY is returned.
+Fix by moving max98373_reset() after cache_only set to false in max98373_resume().
+
+Signed-off-by: Yong Zhi <yong.zhi@intel.com>
+Link: https://lore.kernel.org/r/1588376661-29799-1-git-send-email-yong.zhi@intel.com
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/soc/codecs/max98373.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/sound/soc/codecs/max98373.c b/sound/soc/codecs/max98373.c
+index cae1def8902dd..96718e3a1ad0e 100644
+--- a/sound/soc/codecs/max98373.c
++++ b/sound/soc/codecs/max98373.c
+@@ -850,8 +850,8 @@ static int max98373_resume(struct device *dev)
+ {
+       struct max98373_priv *max98373 = dev_get_drvdata(dev);
+-      max98373_reset(max98373, dev);
+       regcache_cache_only(max98373->regmap, false);
++      max98373_reset(max98373, dev);
+       regcache_sync(max98373->regmap);
+       return 0;
+ }
+-- 
+2.25.1
+
diff --git a/queue-5.7/asoc-meson-add-missing-free_irq-in-error-path.patch b/queue-5.7/asoc-meson-add-missing-free_irq-in-error-path.patch
new file mode 100644 (file)
index 0000000..5655229
--- /dev/null
@@ -0,0 +1,53 @@
+From 71bb7167f0a72a703a6c036e2131b09fd89ce2bf Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 6 Jun 2020 17:31:03 +0200
+Subject: ASoC: meson: add missing free_irq() in error path
+
+From: Pavel Machek (CIP) <pavel@denx.de>
+
+[ Upstream commit 3b8a299a58b2afce464ae11324b59dcf0f1d10a7 ]
+
+free_irq() is missing in case of error, fix that.
+
+Signed-off-by: Pavel Machek (CIP) <pavel@denx.de>
+Reviewed-by: Jerome Brunet <jbrunet@baylibre.com>
+
+Link: https://lore.kernel.org/r/20200606153103.GA17905@amd
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/soc/meson/axg-fifo.c | 10 ++++++++--
+ 1 file changed, 8 insertions(+), 2 deletions(-)
+
+diff --git a/sound/soc/meson/axg-fifo.c b/sound/soc/meson/axg-fifo.c
+index 2e9b56b29d313..b2e867113226b 100644
+--- a/sound/soc/meson/axg-fifo.c
++++ b/sound/soc/meson/axg-fifo.c
+@@ -249,7 +249,7 @@ int axg_fifo_pcm_open(struct snd_soc_component *component,
+       /* Enable pclk to access registers and clock the fifo ip */
+       ret = clk_prepare_enable(fifo->pclk);
+       if (ret)
+-              return ret;
++              goto free_irq;
+       /* Setup status2 so it reports the memory pointer */
+       regmap_update_bits(fifo->map, FIFO_CTRL1,
+@@ -269,8 +269,14 @@ int axg_fifo_pcm_open(struct snd_soc_component *component,
+       /* Take memory arbitror out of reset */
+       ret = reset_control_deassert(fifo->arb);
+       if (ret)
+-              clk_disable_unprepare(fifo->pclk);
++              goto free_clk;
++
++      return 0;
++free_clk:
++      clk_disable_unprepare(fifo->pclk);
++free_irq:
++      free_irq(fifo->irq, ss);
+       return ret;
+ }
+ EXPORT_SYMBOL_GPL(axg_fifo_pcm_open);
+-- 
+2.25.1
+
diff --git a/queue-5.7/asoc-meson-fix-memory-leak-of-links-if-allocation-of.patch b/queue-5.7/asoc-meson-fix-memory-leak-of-links-if-allocation-of.patch
new file mode 100644 (file)
index 0000000..8ae67c9
--- /dev/null
@@ -0,0 +1,62 @@
+From ac31d4a8ac4f23cca96d4a32c378bff16ca098c5 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 4 Jun 2020 18:12:16 +0100
+Subject: ASoC: meson: fix memory leak of links if allocation of ldata fails
+
+From: Colin Ian King <colin.king@canonical.com>
+
+[ Upstream commit 6e801dc411329aff592fbd48fb116183d0acdb00 ]
+
+Currently if the allocation of ldata fails the error return path
+does not kfree the allocated links object.  Fix this by adding
+an error exit return path that performs the necessary kfree'ing.
+
+Fixes: 7864a79f37b5 ("ASoC: meson: add axg sound card support")
+Signed-off-by: Colin Ian King <colin.king@canonical.com>
+Addresses-Coverity: ("Resource leak")
+Link: https://lore.kernel.org/r/20200604171216.60043-1-colin.king@canonical.com
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/soc/meson/meson-card-utils.c | 17 ++++++++++++-----
+ 1 file changed, 12 insertions(+), 5 deletions(-)
+
+diff --git a/sound/soc/meson/meson-card-utils.c b/sound/soc/meson/meson-card-utils.c
+index 2ca8c98e204f2..5a4a91c887347 100644
+--- a/sound/soc/meson/meson-card-utils.c
++++ b/sound/soc/meson/meson-card-utils.c
+@@ -49,19 +49,26 @@ int meson_card_reallocate_links(struct snd_soc_card *card,
+       links = krealloc(priv->card.dai_link,
+                        num_links * sizeof(*priv->card.dai_link),
+                        GFP_KERNEL | __GFP_ZERO);
++      if (!links)
++              goto err_links;
++
+       ldata = krealloc(priv->link_data,
+                        num_links * sizeof(*priv->link_data),
+                        GFP_KERNEL | __GFP_ZERO);
+-
+-      if (!links || !ldata) {
+-              dev_err(priv->card.dev, "failed to allocate links\n");
+-              return -ENOMEM;
+-      }
++      if (!ldata)
++              goto err_ldata;
+       priv->card.dai_link = links;
+       priv->link_data = ldata;
+       priv->card.num_links = num_links;
+       return 0;
++
++err_ldata:
++      kfree(links);
++err_links:
++      dev_err(priv->card.dev, "failed to allocate links\n");
++      return -ENOMEM;
++
+ }
+ EXPORT_SYMBOL_GPL(meson_card_reallocate_links);
+-- 
+2.25.1
+
diff --git a/queue-5.7/asoc-qcom-q6asm-dai-kcfi-fix.patch b/queue-5.7/asoc-qcom-q6asm-dai-kcfi-fix.patch
new file mode 100644 (file)
index 0000000..f005b10
--- /dev/null
@@ -0,0 +1,111 @@
+From 4a683add6ccc044e9dc1c215573062a57a87c7a3 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 29 May 2020 21:38:23 +0000
+Subject: ASoC: qcom: q6asm-dai: kCFI fix
+
+From: John Stultz <john.stultz@linaro.org>
+
+[ Upstream commit a6b675a89e51a1cdad0481b809b7840d3f86e4b5 ]
+
+Fixes the following kCFI crash seen on db845c, caused
+by the function prototypes not matching the callback
+function prototype.
+
+[   82.585661] Unable to handle kernel NULL pointer dereference at virtual address 0000000000000001
+[   82.595387] Mem abort info:
+[   82.599463]   ESR = 0x96000005
+[   82.602658]   EC = 0x25: DABT (current EL), IL = 32 bits
+[   82.608177]   SET = 0, FnV = 0
+[   82.611829]   EA = 0, S1PTW = 0
+[   82.615369] Data abort info:
+[   82.618751]   ISV = 0, ISS = 0x00000005
+[   82.622641]   CM = 0, WnR = 0
+[   82.625774] user pgtable: 4k pages, 39-bit VAs, pgdp=0000000174259000
+[   82.632292] [0000000000000001] pgd=0000000000000000, pud=0000000000000000
+[   82.639167] Internal error: Oops: 96000005 [#1] PREEMPT SMP
+[   82.644795] Modules linked in: hci_uart btqca xhci_plat_hcd xhci_pci_renesas xhci_pci xhci_hcd wcn36xx wcnss_ctrl wcd934x vctrl_regulator ufs_qcom syscon_reboot_e
+[   82.644927]  qcom_apcs_ipc_mailbox q6asm_dai q6routing q6asm q6afe_dai q6adm q6afe q6core q6dsp_common pm8941_pwrkey pm8916_wdt platform_mhu pinctrl_spmi_mpp pine
+[   82.812982] CPU: 3 PID: 240 Comm: kworker/u16:4 Tainted: G        W         5.6.0-rc7-mainline-00960-g0c34353d11b9-dirty #1
+[   82.824201] Hardware name: Thundercomm Dragonboard 845c (DT)
+[   82.829937] Workqueue: qcom_apr_rx apr_rxwq [apr]
+[   82.834698] pstate: 80c00005 (Nzcv daif +PAN +UAO)
+[   82.839553] pc : __cfi_check_fail+0x4/0x1c [q6asm_dai]
+[   82.844754] lr : __cfi_check+0x3a8/0x3b0 [q6asm_dai]
+[   82.849767] sp : ffffffc0105f3c20
+[   82.853123] x29: ffffffc0105f3c30 x28: 0000000000000020
+[   82.858489] x27: ffffff80f4588400 x26: ffffff80f458ec94
+[   82.863854] x25: ffffff80f458ece8 x24: ffffffe3670c7000
+[   82.869220] x23: ffffff8094bb7b34 x22: ffffffe367137000
+[   82.874585] x21: bd07909b332eada6 x20: 0000000000000001
+[   82.879950] x19: ffffffe36713863c x18: ffffff80f8df4430
+[   82.885316] x17: 0000000000000001 x16: ffffffe39d15e660
+[   82.890681] x15: 0000000000000001 x14: 0000000000000027
+[   82.896047] x13: 0000000000000000 x12: ffffffe39e6465a0
+[   82.901413] x11: 0000000000000051 x10: 000000000000ffff
+[   82.906779] x9 : 000ffffffe366c19 x8 : c3c5f18762d1ceef
+[   82.912145] x7 : 0000000000000000 x6 : ffffffc010877698
+[   82.917511] x5 : ffffffc0105f3c00 x4 : 0000000000000000
+[   82.922877] x3 : 0000000000000000 x2 : 0000000000000001
+[   82.928243] x1 : ffffffe36713863c x0 : 0000000000000001
+[   82.933610] Call trace:
+[   82.936099]  __cfi_check_fail+0x4/0x1c [q6asm_dai]
+[   82.940955]  q6asm_srvc_callback+0x22c/0x618 [q6asm]
+[   82.945973]  apr_rxwq+0x1a8/0x27c [apr]
+[   82.949861]  process_one_work+0x2e8/0x54c
+[   82.953919]  worker_thread+0x27c/0x4d4
+[   82.957715]  kthread+0x144/0x154
+[   82.960985]  ret_from_fork+0x10/0x18
+[   82.964603] Code: a8c37bfd f85f8e5e d65f03c0 b40000a0 (39400008)
+[   82.970762] ---[ end trace 410accb839617143 ]---
+[   82.975429] Kernel panic - not syncing: Fatal exception
+
+Signed-off-by: John Stultz <john.stultz@linaro.org>
+Reviewed-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
+Cc: Patrick Lai <plai@codeaurora.org>
+Cc: Banajit Goswami <bgoswami@codeaurora.org>
+Cc: Liam Girdwood <lgirdwood@gmail.com>
+Cc: Mark Brown <broonie@kernel.org>
+Cc: Jaroslav Kysela <perex@perex.cz>
+Cc: Takashi Iwai <tiwai@suse.com>
+Cc: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
+Cc: Vinod Koul <vkoul@kernel.org>
+Cc: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Cc: Stephan Gerhold <stephan@gerhold.net>
+Cc: Sami Tolvanen <samitolvanen@google.com>
+Cc: Todd Kjos <tkjos@google.com>
+Cc: Alistair Delva <adelva@google.com>
+Cc: Amit Pundir <amit.pundir@linaro.org>
+Cc: Sumit Semwal <sumit.semwal@linaro.org>
+Cc: alsa-devel@alsa-project.org
+Link: https://lore.kernel.org/r/20200529213823.98812-1-john.stultz@linaro.org
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/soc/qcom/qdsp6/q6asm-dai.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/sound/soc/qcom/qdsp6/q6asm-dai.c b/sound/soc/qcom/qdsp6/q6asm-dai.c
+index 125af00bba539..4640804aab7fa 100644
+--- a/sound/soc/qcom/qdsp6/q6asm-dai.c
++++ b/sound/soc/qcom/qdsp6/q6asm-dai.c
+@@ -176,7 +176,7 @@ static const struct snd_compr_codec_caps q6asm_compr_caps = {
+ };
+ static void event_handler(uint32_t opcode, uint32_t token,
+-                        uint32_t *payload, void *priv)
++                        void *payload, void *priv)
+ {
+       struct q6asm_dai_rtd *prtd = priv;
+       struct snd_pcm_substream *substream = prtd->substream;
+@@ -490,7 +490,7 @@ static int q6asm_dai_hw_params(struct snd_soc_component *component,
+ }
+ static void compress_event_handler(uint32_t opcode, uint32_t token,
+-                                 uint32_t *payload, void *priv)
++                                 void *payload, void *priv)
+ {
+       struct q6asm_dai_rtd *prtd = priv;
+       struct snd_compr_stream *substream = prtd->cstream;
+-- 
+2.25.1
+
diff --git a/queue-5.7/asoc-rt5645-add-platform-data-for-asus-t101ha.patch b/queue-5.7/asoc-rt5645-add-platform-data-for-asus-t101ha.patch
new file mode 100644 (file)
index 0000000..a803d5b
--- /dev/null
@@ -0,0 +1,60 @@
+From 892d84424c3bcc6e893e50532aa17d976ffe3570 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 8 Jun 2020 22:46:34 +0200
+Subject: ASoC: rt5645: Add platform-data for Asus T101HA
+
+From: Hans de Goede <hdegoede@redhat.com>
+
+[ Upstream commit 79d4f823a06796656289f97b922493da5690e46c ]
+
+The Asus T101HA uses the default jack-detect mode 3, but instead of
+using an analog microphone it is using a DMIC on dmic-data-pin 1,
+like the Asus T100HA. Note unlike the T100HA its jack-detect is not
+inverted.
+
+Add a DMI quirk with the correct settings for this model.
+
+Signed-off-by: Hans de Goede <hdegoede@redhat.com>
+Acked-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
+Link: https://lore.kernel.org/r/20200608204634.93407-2-hdegoede@redhat.com
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/soc/codecs/rt5645.c | 14 ++++++++++++++
+ 1 file changed, 14 insertions(+)
+
+diff --git a/sound/soc/codecs/rt5645.c b/sound/soc/codecs/rt5645.c
+index 6ba1849a77b08..e2e1d5b03b381 100644
+--- a/sound/soc/codecs/rt5645.c
++++ b/sound/soc/codecs/rt5645.c
+@@ -3625,6 +3625,12 @@ static const struct rt5645_platform_data asus_t100ha_platform_data = {
+       .inv_jd1_1 = true,
+ };
++static const struct rt5645_platform_data asus_t101ha_platform_data = {
++      .dmic1_data_pin = RT5645_DMIC_DATA_IN2N,
++      .dmic2_data_pin = RT5645_DMIC2_DISABLE,
++      .jd_mode = 3,
++};
++
+ static const struct rt5645_platform_data lenovo_ideapad_miix_310_pdata = {
+       .jd_mode = 3,
+       .in2_diff = true,
+@@ -3708,6 +3714,14 @@ static const struct dmi_system_id dmi_platform_data[] = {
+               },
+               .driver_data = (void *)&asus_t100ha_platform_data,
+       },
++      {
++              .ident = "ASUS T101HA",
++              .matches = {
++                      DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "T101HA"),
++              },
++              .driver_data = (void *)&asus_t101ha_platform_data,
++      },
+       {
+               .ident = "MINIX Z83-4",
+               .matches = {
+-- 
+2.25.1
+
diff --git a/queue-5.7/asoc-rt5682-fix-i2c-soundwire-dependencies.patch b/queue-5.7/asoc-rt5682-fix-i2c-soundwire-dependencies.patch
new file mode 100644 (file)
index 0000000..93efb5f
--- /dev/null
@@ -0,0 +1,50 @@
+From 6db2dc595ce7331ab105ece3d44e0f517e43611d Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 28 Apr 2020 23:46:14 +0200
+Subject: ASoC: rt5682: fix I2C/Soundwire dependencies
+
+From: Arnd Bergmann <arnd@arndb.de>
+
+[ Upstream commit fd443a20c2f0950f3c31765a08f7dd49b3bc69cb ]
+
+If one of the two is a loadable module, the combined driver must
+not be built-in:
+
+aarch64-linux-ld: sound/soc/codecs/rt5682.o: in function `rt5682_sdw_hw_free':
+rt5682.c:(.text+0xb34): undefined reference to `sdw_stream_remove_slave'
+aarch64-linux-ld: sound/soc/codecs/rt5682.o: in function `rt5682_sdw_hw_params':
+rt5682.c:(.text+0xe78): undefined reference to `sdw_stream_add_slave'
+
+In particular, the soundwire driver must not be built-in if
+CONFIG_I2C=m.
+
+Fixes: 5549ea647997 ("ASoC: rt5682: fix unmet dependencies")
+Signed-off-by: Arnd Bergmann <arnd@arndb.de>
+Link: https://lore.kernel.org/r/20200428214642.3925004-1-arnd@arndb.de
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/soc/codecs/Kconfig | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/sound/soc/codecs/Kconfig b/sound/soc/codecs/Kconfig
+index 8cdc68c141dc2..8a66f23a7b055 100644
+--- a/sound/soc/codecs/Kconfig
++++ b/sound/soc/codecs/Kconfig
+@@ -1136,10 +1136,13 @@ config SND_SOC_RT5677_SPI
+ config SND_SOC_RT5682
+       tristate
+       depends on I2C || SOUNDWIRE
++      depends on SOUNDWIRE || !SOUNDWIRE
++      depends on I2C || !I2C
+ config SND_SOC_RT5682_SDW
+       tristate "Realtek RT5682 Codec - SDW"
+       depends on SOUNDWIRE
++      depends on I2C || !I2C
+       select SND_SOC_RT5682
+       select REGMAP_SOUNDWIRE
+-- 
+2.25.1
+
diff --git a/queue-5.7/asoc-soc-pcm-dpcm-fix-playback-capture-checks.patch b/queue-5.7/asoc-soc-pcm-dpcm-fix-playback-capture-checks.patch
new file mode 100644 (file)
index 0000000..1870755
--- /dev/null
@@ -0,0 +1,92 @@
+From 184415dc23d1a8156842e01587f2462096cf7984 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 8 Jun 2020 14:44:12 -0500
+Subject: ASoC: soc-pcm: dpcm: fix playback/capture checks
+
+From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
+
+[ Upstream commit b73287f0b0745961b14e5ebcce92cc8ed24d4d52 ]
+
+Recent changes in the ASoC core prevent multi-cpu BE dailinks from
+being used. DPCM does support multi-cpu DAIs for BE Dailinks, but not
+for FE.
+
+Handle the FE checks first, and make sure all DAIs support the same
+capabilities within the same dailink.
+
+Fixes: 9b5db059366ae2 ("ASoC: soc-pcm: dpcm: Only allow playback/capture if supported")
+Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
+Reviewed-by: Bard Liao <yung-chuan.liao@linux.intel.com>
+Reviewed-by: Guennadi Liakhovetski <guennadi.liakhovetski@linux.intel.com>
+Reviewed-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
+Reviewed-by: Daniel Baluta <daniel.baluta@gmail.com>
+BugLink: https://github.com/thesofproject/linux/issues/2031
+Link: https://lore.kernel.org/r/20200608194415.4663-2-pierre-louis.bossart@linux.intel.com
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/soc/soc-pcm.c | 44 ++++++++++++++++++++++++++++++++++----------
+ 1 file changed, 34 insertions(+), 10 deletions(-)
+
+diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c
+index 1f302de440525..39ce61c5b8744 100644
+--- a/sound/soc/soc-pcm.c
++++ b/sound/soc/soc-pcm.c
+@@ -2908,20 +2908,44 @@ int soc_new_pcm(struct snd_soc_pcm_runtime *rtd, int num)
+       struct snd_pcm *pcm;
+       char new_name[64];
+       int ret = 0, playback = 0, capture = 0;
++      int stream;
+       int i;
++      if (rtd->dai_link->dynamic && rtd->num_cpus > 1) {
++              dev_err(rtd->dev,
++                      "DPCM doesn't support Multi CPU for Front-Ends yet\n");
++              return -EINVAL;
++      }
++
+       if (rtd->dai_link->dynamic || rtd->dai_link->no_pcm) {
+-              cpu_dai = asoc_rtd_to_cpu(rtd, 0);
+-              if (rtd->num_cpus > 1) {
+-                      dev_err(rtd->dev,
+-                              "DPCM doesn't support Multi CPU yet\n");
+-                      return -EINVAL;
++              if (rtd->dai_link->dpcm_playback) {
++                      stream = SNDRV_PCM_STREAM_PLAYBACK;
++
++                      for_each_rtd_cpu_dais(rtd, i, cpu_dai)
++                              if (!snd_soc_dai_stream_valid(cpu_dai,
++                                                            stream)) {
++                                      dev_err(rtd->card->dev,
++                                              "CPU DAI %s for rtd %s does not support playback\n",
++                                              cpu_dai->name,
++                                              rtd->dai_link->stream_name);
++                                      return -EINVAL;
++                              }
++                      playback = 1;
++              }
++              if (rtd->dai_link->dpcm_capture) {
++                      stream = SNDRV_PCM_STREAM_CAPTURE;
++
++                      for_each_rtd_cpu_dais(rtd, i, cpu_dai)
++                              if (!snd_soc_dai_stream_valid(cpu_dai,
++                                                            stream)) {
++                                      dev_err(rtd->card->dev,
++                                              "CPU DAI %s for rtd %s does not support capture\n",
++                                              cpu_dai->name,
++                                              rtd->dai_link->stream_name);
++                                      return -EINVAL;
++                              }
++                      capture = 1;
+               }
+-
+-              playback = rtd->dai_link->dpcm_playback &&
+-                         snd_soc_dai_stream_valid(cpu_dai, SNDRV_PCM_STREAM_PLAYBACK);
+-              capture = rtd->dai_link->dpcm_capture &&
+-                        snd_soc_dai_stream_valid(cpu_dai, SNDRV_PCM_STREAM_CAPTURE);
+       } else {
+               /* Adapt stream for codec2codec links */
+               int cpu_capture = rtd->dai_link->params ?
+-- 
+2.25.1
+
diff --git a/queue-5.7/asoc-sof-core-fix-error-return-code-in-sof_probe_con.patch b/queue-5.7/asoc-sof-core-fix-error-return-code-in-sof_probe_con.patch
new file mode 100644 (file)
index 0000000..80fc985
--- /dev/null
@@ -0,0 +1,37 @@
+From 91341e876bb02bb35c33e37eb3981a89a0c07154 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 9 May 2020 09:33:37 +0000
+Subject: ASoC: SOF: core: fix error return code in sof_probe_continue()
+
+From: Wei Yongjun <weiyongjun1@huawei.com>
+
+[ Upstream commit 7d8785bc7adbb4dc5ba8ee06994107637848ded8 ]
+
+Fix to return negative error code -ENOMEM from the IPC init error
+handling case instead of 0, as done elsewhere in this function.
+
+Fixes: c16211d6226d ("ASoC: SOF: Add Sound Open Firmware driver core")
+Reported-by: Hulk Robot <hulkci@huawei.com>
+Signed-off-by: Wei Yongjun <weiyongjun1@huawei.com>
+Link: https://lore.kernel.org/r/20200509093337.78897-1-weiyongjun1@huawei.com
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/soc/sof/core.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/sound/soc/sof/core.c b/sound/soc/sof/core.c
+index 91acfae7935c9..74b4382162167 100644
+--- a/sound/soc/sof/core.c
++++ b/sound/soc/sof/core.c
+@@ -176,6 +176,7 @@ static int sof_probe_continue(struct snd_sof_dev *sdev)
+       /* init the IPC */
+       sdev->ipc = snd_sof_ipc_init(sdev);
+       if (!sdev->ipc) {
++              ret = -ENOMEM;
+               dev_err(sdev->dev, "error: failed to init DSP IPC %d\n", ret);
+               goto ipc_err;
+       }
+-- 
+2.25.1
+
diff --git a/queue-5.7/asoc-sof-do-nothing-when-dsp-pm-callbacks-are-not-se.patch b/queue-5.7/asoc-sof-do-nothing-when-dsp-pm-callbacks-are-not-se.patch
new file mode 100644 (file)
index 0000000..6764113
--- /dev/null
@@ -0,0 +1,60 @@
+From 27055e93b0a3440f215d519d05348a41e6472008 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 15 May 2020 16:59:51 +0300
+Subject: ASoC: SOF: Do nothing when DSP PM callbacks are not set
+
+From: Daniel Baluta <daniel.baluta@nxp.com>
+
+[ Upstream commit c26fde3b15ed41f5f452f1da727795f787833287 ]
+
+This provides a better separation between runtime and PM sleep
+callbacks.
+
+Only do nothing if given runtime flag is set and calback is not set.
+
+With the current implementation, if PM sleep callback is set but runtime
+callback is not set then at runtime resume we reload the firmware even
+if we do not support runtime resume callback.
+
+Signed-off-by: Daniel Baluta <daniel.baluta@nxp.com>
+Signed-off-by: Kai Vehmanen <kai.vehmanen@linux.intel.com>
+Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
+Reviewed-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
+Link: https://lore.kernel.org/r/20200515135958.17511-2-kai.vehmanen@linux.intel.com
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/soc/sof/pm.c | 10 ++++++++--
+ 1 file changed, 8 insertions(+), 2 deletions(-)
+
+diff --git a/sound/soc/sof/pm.c b/sound/soc/sof/pm.c
+index c410822d9920d..01d83ddc16bac 100644
+--- a/sound/soc/sof/pm.c
++++ b/sound/soc/sof/pm.c
+@@ -90,7 +90,10 @@ static int sof_resume(struct device *dev, bool runtime_resume)
+       int ret;
+       /* do nothing if dsp resume callbacks are not set */
+-      if (!sof_ops(sdev)->resume || !sof_ops(sdev)->runtime_resume)
++      if (!runtime_resume && !sof_ops(sdev)->resume)
++              return 0;
++
++      if (runtime_resume && !sof_ops(sdev)->runtime_resume)
+               return 0;
+       /* DSP was never successfully started, nothing to resume */
+@@ -175,7 +178,10 @@ static int sof_suspend(struct device *dev, bool runtime_suspend)
+       int ret;
+       /* do nothing if dsp suspend callback is not set */
+-      if (!sof_ops(sdev)->suspend)
++      if (!runtime_suspend && !sof_ops(sdev)->suspend)
++              return 0;
++
++      if (runtime_suspend && !sof_ops(sdev)->runtime_suspend)
+               return 0;
+       if (sdev->fw_state != SOF_FW_BOOT_COMPLETE)
+-- 
+2.25.1
+
diff --git a/queue-5.7/asoc-sof-imx8-fix-randbuild-error.patch b/queue-5.7/asoc-sof-imx8-fix-randbuild-error.patch
new file mode 100644 (file)
index 0000000..ad6794d
--- /dev/null
@@ -0,0 +1,50 @@
+From 3d13ceada81a472bf563805cfa03edd487c22196 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 9 Apr 2020 10:18:28 +0300
+Subject: ASoC: SOF: imx8: Fix randbuild error
+
+From: YueHaibing <yuehaibing@huawei.com>
+
+[ Upstream commit fe17e6cdc0fefca96ba9659be4b2b07487cbf0c5 ]
+
+when do randconfig like this:
+CONFIG_SND_SOC_SOF_IMX8_SUPPORT=y
+CONFIG_SND_SOC_SOF_IMX8=y
+CONFIG_SND_SOC_SOF_OF=y
+CONFIG_IMX_DSP=m
+CONFIG_IMX_SCU=y
+
+there is a link error:
+
+sound/soc/sof/imx/imx8.o: In function 'imx8_send_msg':
+imx8.c:(.text+0x380): undefined reference to 'imx_dsp_ring_doorbell'
+
+Select IMX_DSP in SND_SOC_SOF_IMX8_SUPPORT to fix this
+
+Fixes: f9ad75468453 ("ASoC: SOF: imx: fix reverse CONFIG_SND_SOC_SOF_OF dependency")
+Reported-by: Hulk Robot <hulkci@huawei.com>
+Signed-off-by: YueHaibing <yuehaibing@huawei.com>
+Signed-off-by: Daniel Baluta <daniel.baluta@nxp.com>
+Link: https://lore.kernel.org/r/20200409071832.2039-2-daniel.baluta@oss.nxp.com
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/soc/sof/imx/Kconfig | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/sound/soc/sof/imx/Kconfig b/sound/soc/sof/imx/Kconfig
+index bae4f7bf5f75c..812749064ca83 100644
+--- a/sound/soc/sof/imx/Kconfig
++++ b/sound/soc/sof/imx/Kconfig
+@@ -14,7 +14,7 @@ if SND_SOC_SOF_IMX_TOPLEVEL
+ config SND_SOC_SOF_IMX8_SUPPORT
+       bool "SOF support for i.MX8"
+       depends on IMX_SCU
+-      depends on IMX_DSP
++      select IMX_DSP
+       help
+         This adds support for Sound Open Firmware for NXP i.MX8 platforms
+         Say Y if you have such a device.
+-- 
+2.25.1
+
diff --git a/queue-5.7/asoc-sof-intel-hda-fix-generic-hda-codec-support.patch b/queue-5.7/asoc-sof-intel-hda-fix-generic-hda-codec-support.patch
new file mode 100644 (file)
index 0000000..cb31806
--- /dev/null
@@ -0,0 +1,139 @@
+From c23ceebe3960d10bb3f15a7fdf6e05ae29244d97 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 29 May 2020 19:03:58 +0300
+Subject: ASoC: SOF: Intel: hda: fix generic hda codec support
+
+From: Kai Vehmanen <kai.vehmanen@linux.intel.com>
+
+[ Upstream commit 89d73ccab20a684d8446cea4d8ac6a2608c8d390 ]
+
+Add support for using generic codec driver with SOF. Generic driver
+is used if:
+ - snd_sof_intel_hda_common.hda_model="generic" is set, or
+ - fallback if no other codec driver is found
+
+The implementation is aligned with snd-hda-intel driver, and fixes audio
+support for systems like Acer Swift 3 SF314-57G, on which this issue was
+originally reported.
+
+Signed-off-by: Kai Vehmanen <kai.vehmanen@linux.intel.com>
+Reviewed-by: Hui Wang <hui.wang@canonical.com>
+Reviewed-by: Guennadi Liakhovetski <guennadi.liakhovetski@linux.intel.com>
+Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
+BugLink: https://github.com/thesofproject/linux/issues/1807
+BugLink: https://bugs.launchpad.net/bugs/1877757
+Link: https://lore.kernel.org/r/20200529160358.12134-1-kai.vehmanen@linux.intel.com
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/soc/sof/intel/hda-codec.c | 51 +++++++++++++++++++++++++++++----
+ 1 file changed, 45 insertions(+), 6 deletions(-)
+
+diff --git a/sound/soc/sof/intel/hda-codec.c b/sound/soc/sof/intel/hda-codec.c
+index 3041fbbb010a2..ea021db697b8a 100644
+--- a/sound/soc/sof/intel/hda-codec.c
++++ b/sound/soc/sof/intel/hda-codec.c
+@@ -24,19 +24,44 @@
+ #define IDISP_VID_INTEL       0x80860000
+ /* load the legacy HDA codec driver */
+-static int hda_codec_load_module(struct hda_codec *codec)
++static int request_codec_module(struct hda_codec *codec)
+ {
+ #ifdef MODULE
+       char alias[MODULE_NAME_LEN];
+-      const char *module = alias;
++      const char *mod = NULL;
+-      snd_hdac_codec_modalias(&codec->core, alias, sizeof(alias));
+-      dev_dbg(&codec->core.dev, "loading codec module: %s\n", module);
+-      request_module(module);
++      switch (codec->probe_id) {
++      case HDA_CODEC_ID_GENERIC:
++#if IS_MODULE(CONFIG_SND_HDA_GENERIC)
++              mod = "snd-hda-codec-generic";
+ #endif
++              break;
++      default:
++              snd_hdac_codec_modalias(&codec->core, alias, sizeof(alias));
++              mod = alias;
++              break;
++      }
++
++      if (mod) {
++              dev_dbg(&codec->core.dev, "loading codec module: %s\n", mod);
++              request_module(mod);
++      }
++#endif /* MODULE */
+       return device_attach(hda_codec_dev(codec));
+ }
++static int hda_codec_load_module(struct hda_codec *codec)
++{
++      int ret = request_codec_module(codec);
++
++      if (ret <= 0) {
++              codec->probe_id = HDA_CODEC_ID_GENERIC;
++              ret = request_codec_module(codec);
++      }
++
++      return ret;
++}
++
+ /* enable controller wake up event for all codecs with jack connectors */
+ void hda_codec_jack_wake_enable(struct snd_sof_dev *sdev)
+ {
+@@ -78,6 +103,13 @@ void hda_codec_jack_check(struct snd_sof_dev *sdev) {}
+ EXPORT_SYMBOL_NS(hda_codec_jack_wake_enable, SND_SOC_SOF_HDA_AUDIO_CODEC);
+ EXPORT_SYMBOL_NS(hda_codec_jack_check, SND_SOC_SOF_HDA_AUDIO_CODEC);
++#if IS_ENABLED(CONFIG_SND_HDA_GENERIC)
++#define is_generic_config(bus) \
++      ((bus)->modelname && !strcmp((bus)->modelname, "generic"))
++#else
++#define is_generic_config(x)  0
++#endif
++
+ /* probe individual codec */
+ static int hda_codec_probe(struct snd_sof_dev *sdev, int address,
+                          bool hda_codec_use_common_hdmi)
+@@ -87,6 +119,7 @@ static int hda_codec_probe(struct snd_sof_dev *sdev, int address,
+ #endif
+       struct hda_bus *hbus = sof_to_hbus(sdev);
+       struct hdac_device *hdev;
++      struct hda_codec *codec;
+       u32 hda_cmd = (address << 28) | (AC_NODE_ROOT << 20) |
+               (AC_VERB_PARAMETERS << 8) | AC_PAR_VENDOR_ID;
+       u32 resp = -1;
+@@ -108,6 +141,7 @@ static int hda_codec_probe(struct snd_sof_dev *sdev, int address,
+       hda_priv->codec.bus = hbus;
+       hdev = &hda_priv->codec.core;
++      codec = &hda_priv->codec;
+       ret = snd_hdac_ext_bus_device_init(&hbus->core, address, hdev);
+       if (ret < 0)
+@@ -122,6 +156,11 @@ static int hda_codec_probe(struct snd_sof_dev *sdev, int address,
+               hda_priv->need_display_power = true;
+       }
++      if (is_generic_config(hbus))
++              codec->probe_id = HDA_CODEC_ID_GENERIC;
++      else
++              codec->probe_id = 0;
++
+       /*
+        * if common HDMI codec driver is not used, codec load
+        * is skipped here and hdac_hdmi is used instead
+@@ -129,7 +168,7 @@ static int hda_codec_probe(struct snd_sof_dev *sdev, int address,
+       if (hda_codec_use_common_hdmi ||
+           (resp & 0xFFFF0000) != IDISP_VID_INTEL) {
+               hdev->type = HDA_DEV_LEGACY;
+-              ret = hda_codec_load_module(&hda_priv->codec);
++              ret = hda_codec_load_module(codec);
+               /*
+                * handle ret==0 (no driver bound) as an error, but pass
+                * other return codes without modification
+-- 
+2.25.1
+
diff --git a/queue-5.7/asoc-sof-nocodec-conditionally-set-dpcm_capture-dpcm.patch b/queue-5.7/asoc-sof-nocodec-conditionally-set-dpcm_capture-dpcm.patch
new file mode 100644 (file)
index 0000000..d41367e
--- /dev/null
@@ -0,0 +1,51 @@
+From 0a4052b0756cb88b9f09e3af88102e9691a6f64c Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 8 Jun 2020 14:44:15 -0500
+Subject: ASoC: SOF: nocodec: conditionally set dpcm_capture/dpcm_playback
+ flags
+
+From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
+
+[ Upstream commit ba4e5abc6c4e173af7c941c03c067263b686665d ]
+
+With additional checks on dailinks, we see errors such as
+
+[ 3.000418] sof-nocodec sof-nocodec: CPU DAI DMIC01 Pin for rtd
+NoCodec-6 does not support playback
+
+It's not clear why we set the dpcm_playback and dpcm_capture flags
+unconditionally, add a check on number of channels for each direction
+to avoid invalid configurations.
+
+Fixes: 8017b8fd37bf5e ('ASoC: SOF: Add Nocodec machine driver support')
+Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
+Reviewed-by: Guennadi Liakhovetski <guennadi.liakhovetski@linux.intel.com>
+Reviewed-by: Daniel Baluta <daniel.baluta@gmail.com>
+Reviewed-by: Bard Liao <yung-chuan.liao@linux.intel.com>
+Link: https://lore.kernel.org/r/20200608194415.4663-5-pierre-louis.bossart@linux.intel.com
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/soc/sof/nocodec.c | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+diff --git a/sound/soc/sof/nocodec.c b/sound/soc/sof/nocodec.c
+index 2233146386ccf..71cf5f9db79d0 100644
+--- a/sound/soc/sof/nocodec.c
++++ b/sound/soc/sof/nocodec.c
+@@ -52,8 +52,10 @@ static int sof_nocodec_bes_setup(struct device *dev,
+               links[i].platforms->name = dev_name(dev);
+               links[i].codecs->dai_name = "snd-soc-dummy-dai";
+               links[i].codecs->name = "snd-soc-dummy";
+-              links[i].dpcm_playback = 1;
+-              links[i].dpcm_capture = 1;
++              if (ops->drv[i].playback.channels_min)
++                      links[i].dpcm_playback = 1;
++              if (ops->drv[i].capture.channels_min)
++                      links[i].dpcm_capture = 1;
+       }
+       card->dai_link = links;
+-- 
+2.25.1
+
diff --git a/queue-5.7/asoc-sof-update-correct-led-status-at-the-first-time.patch b/queue-5.7/asoc-sof-update-correct-led-status-at-the-first-time.patch
new file mode 100644 (file)
index 0000000..1405ae6
--- /dev/null
@@ -0,0 +1,74 @@
+From 3b078161183fd95c1a065887a6a7a36b562de68a Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 30 Apr 2020 17:11:39 +0800
+Subject: ASoC: SOF: Update correct LED status at the first time usage of
+ update_mute_led()
+
+From: Kai-Heng Feng <kai.heng.feng@canonical.com>
+
+[ Upstream commit 49c22696348d6e7c8a2ecfd7e60fddfe188ded82 ]
+
+At the first time update_mute_led() gets called, if channels are already
+muted, the temp value equals to led_value as 0, skipping the following
+LED setting.
+
+So set led_value to -1 as an uninitialized state, to update the correct
+LED status at first time usage.
+
+Fixes: 5d43001ae436 ("ASoC: SOF: acpi led support for switch controls")
+Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
+Reviewed-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
+Acked-by: Kai Vehmanen <kai.vehmanen@linux.intel.com>
+Link: https://lore.kernel.org/r/20200430091139.7003-1-kai.heng.feng@canonical.com
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/soc/sof/control.c   | 4 ++--
+ sound/soc/sof/sof-audio.h | 2 +-
+ sound/soc/sof/topology.c  | 2 ++
+ 3 files changed, 5 insertions(+), 3 deletions(-)
+
+diff --git a/sound/soc/sof/control.c b/sound/soc/sof/control.c
+index dfc412e2d9565..6d63768d42aa1 100644
+--- a/sound/soc/sof/control.c
++++ b/sound/soc/sof/control.c
+@@ -19,8 +19,8 @@ static void update_mute_led(struct snd_sof_control *scontrol,
+                           struct snd_kcontrol *kcontrol,
+                           struct snd_ctl_elem_value *ucontrol)
+ {
+-      unsigned int temp = 0;
+-      unsigned int mask;
++      int temp = 0;
++      int mask;
+       int i;
+       mask = 1U << snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
+diff --git a/sound/soc/sof/sof-audio.h b/sound/soc/sof/sof-audio.h
+index bf65f31af8582..875a5fc132970 100644
+--- a/sound/soc/sof/sof-audio.h
++++ b/sound/soc/sof/sof-audio.h
+@@ -56,7 +56,7 @@ struct snd_sof_pcm {
+ struct snd_sof_led_control {
+       unsigned int use_led;
+       unsigned int direction;
+-      unsigned int led_value;
++      int led_value;
+ };
+ /* ALSA SOF Kcontrol device */
+diff --git a/sound/soc/sof/topology.c b/sound/soc/sof/topology.c
+index fe8ba3e05e08b..ab2b69de1d4d7 100644
+--- a/sound/soc/sof/topology.c
++++ b/sound/soc/sof/topology.c
+@@ -1203,6 +1203,8 @@ static int sof_control_load(struct snd_soc_component *scomp, int index,
+               return ret;
+       }
++      scontrol->led_ctl.led_value = -1;
++
+       dobj->private = scontrol;
+       list_add(&scontrol->list, &sdev->kcontrol_list);
+       return ret;
+-- 
+2.25.1
+
diff --git a/queue-5.7/asoc-tegra-tegra_wm8903-support-nvidia-headset-prope.patch b/queue-5.7/asoc-tegra-tegra_wm8903-support-nvidia-headset-prope.patch
new file mode 100644 (file)
index 0000000..65aa5f3
--- /dev/null
@@ -0,0 +1,54 @@
+From 186399f190b31a514a47a5f1492e3a12cdad37fa Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 30 Mar 2020 23:40:11 +0300
+Subject: ASoC: tegra: tegra_wm8903: Support nvidia, headset property
+
+From: Dmitry Osipenko <digetx@gmail.com>
+
+[ Upstream commit 3ef9d5073b552d56bd6daf2af1e89b7e8d4df183 ]
+
+The microphone-jack state needs to be masked in a case of a 4-pin jack
+when microphone and ground pins are shorted. Presence of nvidia,headset
+tells that WM8903 CODEC driver should mask microphone's status if short
+circuit is detected, i.e headphones are inserted.
+
+Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
+Link: https://lore.kernel.org/r/20200330204011.18465-3-digetx@gmail.com
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/soc/tegra/tegra_wm8903.c | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+diff --git a/sound/soc/tegra/tegra_wm8903.c b/sound/soc/tegra/tegra_wm8903.c
+index 9b5651502f127..3aca354f9e08b 100644
+--- a/sound/soc/tegra/tegra_wm8903.c
++++ b/sound/soc/tegra/tegra_wm8903.c
+@@ -177,6 +177,7 @@ static int tegra_wm8903_init(struct snd_soc_pcm_runtime *rtd)
+       struct snd_soc_component *component = codec_dai->component;
+       struct snd_soc_card *card = rtd->card;
+       struct tegra_wm8903 *machine = snd_soc_card_get_drvdata(card);
++      int shrt = 0;
+       if (gpio_is_valid(machine->gpio_hp_det)) {
+               tegra_wm8903_hp_jack_gpio.gpio = machine->gpio_hp_det;
+@@ -189,12 +190,15 @@ static int tegra_wm8903_init(struct snd_soc_pcm_runtime *rtd)
+                                       &tegra_wm8903_hp_jack_gpio);
+       }
++      if (of_property_read_bool(card->dev->of_node, "nvidia,headset"))
++              shrt = SND_JACK_MICROPHONE;
++
+       snd_soc_card_jack_new(rtd->card, "Mic Jack", SND_JACK_MICROPHONE,
+                             &tegra_wm8903_mic_jack,
+                             tegra_wm8903_mic_jack_pins,
+                             ARRAY_SIZE(tegra_wm8903_mic_jack_pins));
+       wm8903_mic_detect(component, &tegra_wm8903_mic_jack, SND_JACK_MICROPHONE,
+-                              0);
++                              shrt);
+       snd_soc_dapm_force_enable_pin(&card->dapm, "MICBIAS");
+-- 
+2.25.1
+
diff --git a/queue-5.7/asoc-ti-omap-mcbsp-fix-an-error-handling-path-in-aso.patch b/queue-5.7/asoc-ti-omap-mcbsp-fix-an-error-handling-path-in-aso.patch
new file mode 100644 (file)
index 0000000..26f89dc
--- /dev/null
@@ -0,0 +1,71 @@
+From ba0e3da56457f71d7cf69a066cd70d31d0750eac Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 12 May 2020 15:43:25 +0200
+Subject: ASoC: ti: omap-mcbsp: Fix an error handling path in
+ 'asoc_mcbsp_probe()'
+
+From: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
+
+[ Upstream commit 03990fd58d2b7c8f7d53e514ba9b8749fac260f9 ]
+
+If an error occurs after the call to 'omap_mcbsp_init()', the reference to
+'mcbsp->fclk' must be decremented, as already done in the remove function.
+
+This can be achieved easily by using the devm_ variant of 'clk_get()'
+when the reference is taken in 'omap_mcbsp_init()'
+
+This fixes the leak in the probe and has the side effect to simplify both
+the error handling path of 'omap_mcbsp_init()' and the remove function.
+
+Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
+Acked-by: Peter Ujfalusi <peter.ujflausi@ti.com>
+Link: https://lore.kernel.org/r/20200512134325.252073-1-christophe.jaillet@wanadoo.fr
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/soc/ti/omap-mcbsp.c | 8 ++------
+ 1 file changed, 2 insertions(+), 6 deletions(-)
+
+diff --git a/sound/soc/ti/omap-mcbsp.c b/sound/soc/ti/omap-mcbsp.c
+index 3d41ca2238d48..4f33ddb7b4419 100644
+--- a/sound/soc/ti/omap-mcbsp.c
++++ b/sound/soc/ti/omap-mcbsp.c
+@@ -686,7 +686,7 @@ static int omap_mcbsp_init(struct platform_device *pdev)
+       mcbsp->dma_data[1].addr = omap_mcbsp_dma_reg_params(mcbsp,
+                                               SNDRV_PCM_STREAM_CAPTURE);
+-      mcbsp->fclk = clk_get(&pdev->dev, "fck");
++      mcbsp->fclk = devm_clk_get(&pdev->dev, "fck");
+       if (IS_ERR(mcbsp->fclk)) {
+               ret = PTR_ERR(mcbsp->fclk);
+               dev_err(mcbsp->dev, "unable to get fck: %d\n", ret);
+@@ -711,7 +711,7 @@ static int omap_mcbsp_init(struct platform_device *pdev)
+               if (ret) {
+                       dev_err(mcbsp->dev,
+                               "Unable to create additional controls\n");
+-                      goto err_thres;
++                      return ret;
+               }
+       }
+@@ -724,8 +724,6 @@ static int omap_mcbsp_init(struct platform_device *pdev)
+ err_st:
+       if (mcbsp->pdata->buffer_size)
+               sysfs_remove_group(&mcbsp->dev->kobj, &additional_attr_group);
+-err_thres:
+-      clk_put(mcbsp->fclk);
+       return ret;
+ }
+@@ -1442,8 +1440,6 @@ static int asoc_mcbsp_remove(struct platform_device *pdev)
+       omap_mcbsp_st_cleanup(pdev);
+-      clk_put(mcbsp->fclk);
+-
+       return 0;
+ }
+-- 
+2.25.1
+
diff --git a/queue-5.7/asoc-ux500-mop500-fix-some-refcounted-resources-issu.patch b/queue-5.7/asoc-ux500-mop500-fix-some-refcounted-resources-issu.patch
new file mode 100644 (file)
index 0000000..86e8dd8
--- /dev/null
@@ -0,0 +1,58 @@
+From aa89d1038875838430f36026bbb2000944473316 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 12 May 2020 12:07:05 +0200
+Subject: ASoC: ux500: mop500: Fix some refcounted resources issues
+
+From: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
+
+[ Upstream commit 4e8748fcaeec073e3ba794871ce86c545e4f961f ]
+
+There are 2 issues here:
+   - if one of the 'of_parse_phandle' fails, calling 'mop500_of_node_put()'
+     is a no-op because the 'mop500_dai_links' structure has not been
+     initialized yet, so the referenced are not decremented
+   - The reference stored in 'mop500_dai_links[i].codecs' is refcounted
+     only once in the probe and must be decremented only once.
+
+Fixes: 39013bd60e79 ("ASoC: Ux500: Dispose of device nodes correctly")
+Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
+Link: https://lore.kernel.org/r/20200512100705.246349-1-christophe.jaillet@wanadoo.fr
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/soc/ux500/mop500.c | 11 +++++++----
+ 1 file changed, 7 insertions(+), 4 deletions(-)
+
+diff --git a/sound/soc/ux500/mop500.c b/sound/soc/ux500/mop500.c
+index 2873e8e6f02be..cdae1190b930b 100644
+--- a/sound/soc/ux500/mop500.c
++++ b/sound/soc/ux500/mop500.c
+@@ -63,10 +63,11 @@ static void mop500_of_node_put(void)
+ {
+       int i;
+-      for (i = 0; i < 2; i++) {
++      for (i = 0; i < 2; i++)
+               of_node_put(mop500_dai_links[i].cpus->of_node);
+-              of_node_put(mop500_dai_links[i].codecs->of_node);
+-      }
++
++      /* Both links use the same codec, which is refcounted only once */
++      of_node_put(mop500_dai_links[0].codecs->of_node);
+ }
+ static int mop500_of_probe(struct platform_device *pdev,
+@@ -81,7 +82,9 @@ static int mop500_of_probe(struct platform_device *pdev,
+       if (!(msp_np[0] && msp_np[1] && codec_np)) {
+               dev_err(&pdev->dev, "Phandle missing or invalid\n");
+-              mop500_of_node_put();
++              for (i = 0; i < 2; i++)
++                      of_node_put(msp_np[i]);
++              of_node_put(codec_np);
+               return -EINVAL;
+       }
+-- 
+2.25.1
+
diff --git a/queue-5.7/backlight-lp855x-ensure-regulators-are-disabled-on-p.patch b/queue-5.7/backlight-lp855x-ensure-regulators-are-disabled-on-p.patch
new file mode 100644 (file)
index 0000000..ad80efe
--- /dev/null
@@ -0,0 +1,123 @@
+From 6f3b8587c18a7672d61e3c2d421b150445829712 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 24 Feb 2020 14:07:48 +0000
+Subject: backlight: lp855x: Ensure regulators are disabled on probe failure
+
+From: Jon Hunter <jonathanh@nvidia.com>
+
+[ Upstream commit d8207c155a7c6015eb7f43739baa7dfb1fa638af ]
+
+If probing the LP885x backlight fails after the regulators have been
+enabled, then the following warning is seen when releasing the
+regulators ...
+
+ WARNING: CPU: 1 PID: 289 at drivers/regulator/core.c:2051 _regulator_put.part.28+0x158/0x160
+ Modules linked in: tegra_xudc lp855x_bl(+) host1x pwm_tegra ip_tables x_tables ipv6 nf_defrag_ipv6
+ CPU: 1 PID: 289 Comm: systemd-udevd Not tainted 5.6.0-rc2-next-20200224 #1
+ Hardware name: NVIDIA Jetson TX1 Developer Kit (DT)
+
+ ...
+
+ Call trace:
+  _regulator_put.part.28+0x158/0x160
+  regulator_put+0x34/0x50
+  devm_regulator_release+0x10/0x18
+  release_nodes+0x12c/0x230
+  devres_release_all+0x34/0x50
+  really_probe+0x1c0/0x370
+  driver_probe_device+0x58/0x100
+  device_driver_attach+0x6c/0x78
+  __driver_attach+0xb0/0xf0
+  bus_for_each_dev+0x68/0xc8
+  driver_attach+0x20/0x28
+  bus_add_driver+0x160/0x1f0
+  driver_register+0x60/0x110
+  i2c_register_driver+0x40/0x80
+  lp855x_driver_init+0x20/0x1000 [lp855x_bl]
+  do_one_initcall+0x58/0x1a0
+  do_init_module+0x54/0x1d0
+  load_module+0x1d80/0x21c8
+  __do_sys_finit_module+0xe8/0x100
+  __arm64_sys_finit_module+0x18/0x20
+  el0_svc_common.constprop.3+0xb0/0x168
+  do_el0_svc+0x20/0x98
+  el0_sync_handler+0xf4/0x1b0
+  el0_sync+0x140/0x180
+
+Fix this by ensuring that the regulators are disabled, if enabled, on
+probe failure.
+
+Finally, ensure that the vddio regulator is disabled in the driver
+remove handler.
+
+Signed-off-by: Jon Hunter <jonathanh@nvidia.com>
+Reviewed-by: Daniel Thompson <daniel.thompson@linaro.org>
+Signed-off-by: Lee Jones <lee.jones@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/video/backlight/lp855x_bl.c | 20 ++++++++++++++++----
+ 1 file changed, 16 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/video/backlight/lp855x_bl.c b/drivers/video/backlight/lp855x_bl.c
+index f68920131a4a8..e94932c69f540 100644
+--- a/drivers/video/backlight/lp855x_bl.c
++++ b/drivers/video/backlight/lp855x_bl.c
+@@ -456,7 +456,7 @@ static int lp855x_probe(struct i2c_client *cl, const struct i2c_device_id *id)
+               ret = regulator_enable(lp->enable);
+               if (ret < 0) {
+                       dev_err(lp->dev, "failed to enable vddio: %d\n", ret);
+-                      return ret;
++                      goto disable_supply;
+               }
+               /*
+@@ -471,24 +471,34 @@ static int lp855x_probe(struct i2c_client *cl, const struct i2c_device_id *id)
+       ret = lp855x_configure(lp);
+       if (ret) {
+               dev_err(lp->dev, "device config err: %d", ret);
+-              return ret;
++              goto disable_vddio;
+       }
+       ret = lp855x_backlight_register(lp);
+       if (ret) {
+               dev_err(lp->dev,
+                       "failed to register backlight. err: %d\n", ret);
+-              return ret;
++              goto disable_vddio;
+       }
+       ret = sysfs_create_group(&lp->dev->kobj, &lp855x_attr_group);
+       if (ret) {
+               dev_err(lp->dev, "failed to register sysfs. err: %d\n", ret);
+-              return ret;
++              goto disable_vddio;
+       }
+       backlight_update_status(lp->bl);
++
+       return 0;
++
++disable_vddio:
++      if (lp->enable)
++              regulator_disable(lp->enable);
++disable_supply:
++      if (lp->supply)
++              regulator_disable(lp->supply);
++
++      return ret;
+ }
+ static int lp855x_remove(struct i2c_client *cl)
+@@ -497,6 +507,8 @@ static int lp855x_remove(struct i2c_client *cl)
+       lp->bl->props.brightness = 0;
+       backlight_update_status(lp->bl);
++      if (lp->enable)
++              regulator_disable(lp->enable);
+       if (lp->supply)
+               regulator_disable(lp->supply);
+       sysfs_remove_group(&lp->dev->kobj, &lp855x_attr_group);
+-- 
+2.25.1
+
diff --git a/queue-5.7/bareudp-fixed-configuration-to-avoid-having-garbage-.patch b/queue-5.7/bareudp-fixed-configuration-to-avoid-having-garbage-.patch
new file mode 100644 (file)
index 0000000..8841809
--- /dev/null
@@ -0,0 +1,36 @@
+From 60142cf719138dcdc0c8022e985bdbc6d27e633e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 16 Jun 2020 11:18:58 +0530
+Subject: bareudp: Fixed configuration to avoid having garbage values
+
+From: Martin <martin.varghese@nokia.com>
+
+[ Upstream commit b15bb8817f991497d97ae55d8c0e349a9d1e1478 ]
+
+Code to initialize the conf structure while gathering the configuration
+of the device was missing.
+
+Fixes: 571912c69f0e ("net: UDP tunnel encapsulation module for tunnelling different protocols like MPLS, IP, NSH etc.")
+Signed-off-by: Martin <martin.varghese@nokia.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/bareudp.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/drivers/net/bareudp.c b/drivers/net/bareudp.c
+index efd1a1d1f35e0..5d3c691a1c668 100644
+--- a/drivers/net/bareudp.c
++++ b/drivers/net/bareudp.c
+@@ -552,6 +552,8 @@ static int bareudp_validate(struct nlattr *tb[], struct nlattr *data[],
+ static int bareudp2info(struct nlattr *data[], struct bareudp_conf *conf,
+                       struct netlink_ext_ack *extack)
+ {
++      memset(conf, 0, sizeof(*conf));
++
+       if (!data[IFLA_BAREUDP_PORT]) {
+               NL_SET_ERR_MSG(extack, "port not specified");
+               return -EINVAL;
+-- 
+2.25.1
+
diff --git a/queue-5.7/bcache-fix-potential-deadlock-problem-in-btree_gc_co.patch b/queue-5.7/bcache-fix-potential-deadlock-problem-in-btree_gc_co.patch
new file mode 100644 (file)
index 0000000..fa1e78d
--- /dev/null
@@ -0,0 +1,96 @@
+From a862cea12507e874367653e5ca894fd62f8eba56 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 15 Jun 2020 00:53:30 +0800
+Subject: bcache: fix potential deadlock problem in btree_gc_coalesce
+
+From: Zhiqiang Liu <liuzhiqiang26@huawei.com>
+
+[ Upstream commit be23e837333a914df3f24bf0b32e87b0331ab8d1 ]
+
+coccicheck reports:
+  drivers/md//bcache/btree.c:1538:1-7: preceding lock on line 1417
+
+In btree_gc_coalesce func, if the coalescing process fails, we will goto
+to out_nocoalesce tag directly without releasing new_nodes[i]->write_lock.
+Then, it will cause a deadlock when trying to acquire new_nodes[i]->
+write_lock for freeing new_nodes[i] before return.
+
+btree_gc_coalesce func details as follows:
+       if alloc new_nodes[i] fails:
+               goto out_nocoalesce;
+       // obtain new_nodes[i]->write_lock
+       mutex_lock(&new_nodes[i]->write_lock)
+       // main coalescing process
+       for (i = nodes - 1; i > 0; --i)
+               [snipped]
+               if coalescing process fails:
+                       // Here, directly goto out_nocoalesce
+                        // tag will cause a deadlock
+                       goto out_nocoalesce;
+               [snipped]
+       // release new_nodes[i]->write_lock
+       mutex_unlock(&new_nodes[i]->write_lock)
+       // coalesing succ, return
+       return;
+out_nocoalesce:
+       btree_node_free(new_nodes[i])   // free new_nodes[i]
+       // obtain new_nodes[i]->write_lock
+       mutex_lock(&new_nodes[i]->write_lock);
+       // set flag for reuse
+       clear_bit(BTREE_NODE_dirty, &ew_nodes[i]->flags);
+       // release new_nodes[i]->write_lock
+       mutex_unlock(&new_nodes[i]->write_lock);
+
+To fix the problem, we add a new tag 'out_unlock_nocoalesce' for
+releasing new_nodes[i]->write_lock before out_nocoalesce tag. If
+coalescing process fails, we will go to out_unlock_nocoalesce tag
+for releasing new_nodes[i]->write_lock before free new_nodes[i] in
+out_nocoalesce tag.
+
+(Coly Li helps to clean up commit log format.)
+
+Fixes: 2a285686c109816 ("bcache: btree locking rework")
+Signed-off-by: Zhiqiang Liu <liuzhiqiang26@huawei.com>
+Signed-off-by: Coly Li <colyli@suse.de>
+Signed-off-by: Jens Axboe <axboe@kernel.dk>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/md/bcache/btree.c | 8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/md/bcache/btree.c b/drivers/md/bcache/btree.c
+index 72856e5f23a39..fd1f288fd8015 100644
+--- a/drivers/md/bcache/btree.c
++++ b/drivers/md/bcache/btree.c
+@@ -1389,7 +1389,7 @@ static int btree_gc_coalesce(struct btree *b, struct btree_op *op,
+                       if (__set_blocks(n1, n1->keys + n2->keys,
+                                        block_bytes(b->c)) >
+                           btree_blocks(new_nodes[i]))
+-                              goto out_nocoalesce;
++                              goto out_unlock_nocoalesce;
+                       keys = n2->keys;
+                       /* Take the key of the node we're getting rid of */
+@@ -1418,7 +1418,7 @@ static int btree_gc_coalesce(struct btree *b, struct btree_op *op,
+               if (__bch_keylist_realloc(&keylist,
+                                         bkey_u64s(&new_nodes[i]->key)))
+-                      goto out_nocoalesce;
++                      goto out_unlock_nocoalesce;
+               bch_btree_node_write(new_nodes[i], &cl);
+               bch_keylist_add(&keylist, &new_nodes[i]->key);
+@@ -1464,6 +1464,10 @@ static int btree_gc_coalesce(struct btree *b, struct btree_op *op,
+       /* Invalidated our iterator */
+       return -EINTR;
++out_unlock_nocoalesce:
++      for (i = 0; i < nodes; i++)
++              mutex_unlock(&new_nodes[i]->write_lock);
++
+ out_nocoalesce:
+       closure_sync(&cl);
+-- 
+2.25.1
+
diff --git a/queue-5.7/blktrace-fix-endianness-for-blk_log_remap.patch b/queue-5.7/blktrace-fix-endianness-for-blk_log_remap.patch
new file mode 100644 (file)
index 0000000..d09956c
--- /dev/null
@@ -0,0 +1,64 @@
+From 5b199a995c38fcf7418040991e3d45108b3bdc5c Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 4 Jun 2020 00:13:30 -0700
+Subject: blktrace: fix endianness for blk_log_remap()
+
+From: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
+
+[ Upstream commit 5aec598c456fe3c1b71a1202cbb42bdc2a643277 ]
+
+The function blk_log_remap() can be simplified by removing the
+call to get_pdu_remap() that copies the values into extra variable to
+print the data, which also fixes the endiannness warning reported by
+sparse.
+
+Signed-off-by: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
+Signed-off-by: Jens Axboe <axboe@kernel.dk>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ kernel/trace/blktrace.c | 19 ++++---------------
+ 1 file changed, 4 insertions(+), 15 deletions(-)
+
+diff --git a/kernel/trace/blktrace.c b/kernel/trace/blktrace.c
+index cba2093edee22..35610a4be4a9e 100644
+--- a/kernel/trace/blktrace.c
++++ b/kernel/trace/blktrace.c
+@@ -1260,17 +1260,6 @@ static __u64 get_pdu_int(const struct trace_entry *ent, bool has_cg)
+       return be64_to_cpu(*val);
+ }
+-static void get_pdu_remap(const struct trace_entry *ent,
+-                        struct blk_io_trace_remap *r, bool has_cg)
+-{
+-      const struct blk_io_trace_remap *__r = pdu_start(ent, has_cg);
+-      __u64 sector_from = __r->sector_from;
+-
+-      r->device_from = be32_to_cpu(__r->device_from);
+-      r->device_to   = be32_to_cpu(__r->device_to);
+-      r->sector_from = be64_to_cpu(sector_from);
+-}
+-
+ typedef void (blk_log_action_t) (struct trace_iterator *iter, const char *act,
+       bool has_cg);
+@@ -1410,13 +1399,13 @@ static void blk_log_with_error(struct trace_seq *s,
+ static void blk_log_remap(struct trace_seq *s, const struct trace_entry *ent, bool has_cg)
+ {
+-      struct blk_io_trace_remap r = { .device_from = 0, };
++      const struct blk_io_trace_remap *__r = pdu_start(ent, has_cg);
+-      get_pdu_remap(ent, &r, has_cg);
+       trace_seq_printf(s, "%llu + %u <- (%d,%d) %llu\n",
+                        t_sector(ent), t_sec(ent),
+-                       MAJOR(r.device_from), MINOR(r.device_from),
+-                       (unsigned long long)r.sector_from);
++                       MAJOR(be32_to_cpu(__r->device_from)),
++                       MINOR(be32_to_cpu(__r->device_from)),
++                       be64_to_cpu(__r->sector_from));
+ }
+ static void blk_log_plug(struct trace_seq *s, const struct trace_entry *ent, bool has_cg)
+-- 
+2.25.1
+
diff --git a/queue-5.7/blktrace-fix-endianness-in-get_pdu_int.patch b/queue-5.7/blktrace-fix-endianness-in-get_pdu_int.patch
new file mode 100644 (file)
index 0000000..9fdd95e
--- /dev/null
@@ -0,0 +1,35 @@
+From 34ce6d3dbcf47ae3f115d70cfcfb84bb2e8e4f61 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 4 Jun 2020 00:13:29 -0700
+Subject: blktrace: fix endianness in get_pdu_int()
+
+From: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
+
+[ Upstream commit 71df3fd82e7cccec7b749a8607a4662d9f7febdd ]
+
+In function get_pdu_len() replace variable type from __u64 to
+__be64. This fixes sparse warning.
+
+Signed-off-by: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
+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 c6d59a457f50c..cba2093edee22 100644
+--- a/kernel/trace/blktrace.c
++++ b/kernel/trace/blktrace.c
+@@ -1256,7 +1256,7 @@ static inline __u16 t_error(const struct trace_entry *ent)
+ static __u64 get_pdu_int(const struct trace_entry *ent, bool has_cg)
+ {
+-      const __u64 *val = pdu_start(ent, has_cg);
++      const __be64 *val = pdu_start(ent, has_cg);
+       return be64_to_cpu(*val);
+ }
+-- 
+2.25.1
+
diff --git a/queue-5.7/blktrace-use-errno-instead-of-bi_status.patch b/queue-5.7/blktrace-use-errno-instead-of-bi_status.patch
new file mode 100644 (file)
index 0000000..5bdb836
--- /dev/null
@@ -0,0 +1,50 @@
+From bf8fa08e60f4ad56d24b8c3430526ddf2873cd5e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 4 Jun 2020 00:13:28 -0700
+Subject: blktrace: use errno instead of bi_status
+
+From: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
+
+[ Upstream commit 48bc3cd3e07a1486f45d9971c75d6090976c3b1b ]
+
+In blk_add_trace_spliti() blk_add_trace_bio_remap() use
+blk_status_to_errno() to pass the error instead of pasing the bi_status.
+This fixes the sparse warning.
+
+Signed-off-by: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
+Signed-off-by: Jens Axboe <axboe@kernel.dk>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ kernel/trace/blktrace.c | 9 ++++++---
+ 1 file changed, 6 insertions(+), 3 deletions(-)
+
+diff --git a/kernel/trace/blktrace.c b/kernel/trace/blktrace.c
+index ca39dc3230cb3..c6d59a457f50c 100644
+--- a/kernel/trace/blktrace.c
++++ b/kernel/trace/blktrace.c
+@@ -995,8 +995,10 @@ static void blk_add_trace_split(void *ignore,
+               __blk_add_trace(bt, bio->bi_iter.bi_sector,
+                               bio->bi_iter.bi_size, bio_op(bio), bio->bi_opf,
+-                              BLK_TA_SPLIT, bio->bi_status, sizeof(rpdu),
+-                              &rpdu, blk_trace_bio_get_cgid(q, bio));
++                              BLK_TA_SPLIT,
++                              blk_status_to_errno(bio->bi_status),
++                              sizeof(rpdu), &rpdu,
++                              blk_trace_bio_get_cgid(q, bio));
+       }
+       rcu_read_unlock();
+ }
+@@ -1033,7 +1035,8 @@ static void blk_add_trace_bio_remap(void *ignore,
+       r.sector_from = cpu_to_be64(from);
+       __blk_add_trace(bt, bio->bi_iter.bi_sector, bio->bi_iter.bi_size,
+-                      bio_op(bio), bio->bi_opf, BLK_TA_REMAP, bio->bi_status,
++                      bio_op(bio), bio->bi_opf, BLK_TA_REMAP,
++                      blk_status_to_errno(bio->bi_status),
+                       sizeof(r), &r, blk_trace_bio_get_cgid(q, bio));
+       rcu_read_unlock();
+ }
+-- 
+2.25.1
+
diff --git a/queue-5.7/block-fix-use-after-free-in-blkdev_get.patch b/queue-5.7/block-fix-use-after-free-in-blkdev_get.patch
new file mode 100644 (file)
index 0000000..05f5d7b
--- /dev/null
@@ -0,0 +1,199 @@
+From 72aa1d2cd942d5b69146a71c9255c1613b14419e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 16 Jun 2020 20:16:55 +0800
+Subject: block: Fix use-after-free in blkdev_get()
+
+From: Jason Yan <yanaijie@huawei.com>
+
+[ Upstream commit 2d3a8e2deddea6c89961c422ec0c5b851e648c14 ]
+
+In blkdev_get() we call __blkdev_get() to do some internal jobs and if
+there is some errors in __blkdev_get(), the bdput() is called which
+means we have released the refcount of the bdev (actually the refcount of
+the bdev inode). This means we cannot access bdev after that point. But
+acctually bdev is still accessed in blkdev_get() after calling
+__blkdev_get(). This results in use-after-free if the refcount is the
+last one we released in __blkdev_get(). Let's take a look at the
+following scenerio:
+
+  CPU0            CPU1                    CPU2
+blkdev_open     blkdev_open           Remove disk
+                  bd_acquire
+                 blkdev_get
+                   __blkdev_get      del_gendisk
+                                       bdev_unhash_inode
+  bd_acquire          bdev_get_gendisk
+    bd_forget           failed because of unhashed
+         bdput
+                     bdput (the last one)
+                       bdev_evict_inode
+
+                   access bdev => use after free
+
+[  459.350216] BUG: KASAN: use-after-free in __lock_acquire+0x24c1/0x31b0
+[  459.351190] Read of size 8 at addr ffff88806c815a80 by task syz-executor.0/20132
+[  459.352347]
+[  459.352594] CPU: 0 PID: 20132 Comm: syz-executor.0 Not tainted 4.19.90 #2
+[  459.353628] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.10.2-1ubuntu1 04/01/2014
+[  459.354947] Call Trace:
+[  459.355337]  dump_stack+0x111/0x19e
+[  459.355879]  ? __lock_acquire+0x24c1/0x31b0
+[  459.356523]  print_address_description+0x60/0x223
+[  459.357248]  ? __lock_acquire+0x24c1/0x31b0
+[  459.357887]  kasan_report.cold+0xae/0x2d8
+[  459.358503]  __lock_acquire+0x24c1/0x31b0
+[  459.359120]  ? _raw_spin_unlock_irq+0x24/0x40
+[  459.359784]  ? lockdep_hardirqs_on+0x37b/0x580
+[  459.360465]  ? _raw_spin_unlock_irq+0x24/0x40
+[  459.361123]  ? finish_task_switch+0x125/0x600
+[  459.361812]  ? finish_task_switch+0xee/0x600
+[  459.362471]  ? mark_held_locks+0xf0/0xf0
+[  459.363108]  ? __schedule+0x96f/0x21d0
+[  459.363716]  lock_acquire+0x111/0x320
+[  459.364285]  ? blkdev_get+0xce/0xbe0
+[  459.364846]  ? blkdev_get+0xce/0xbe0
+[  459.365390]  __mutex_lock+0xf9/0x12a0
+[  459.365948]  ? blkdev_get+0xce/0xbe0
+[  459.366493]  ? bdev_evict_inode+0x1f0/0x1f0
+[  459.367130]  ? blkdev_get+0xce/0xbe0
+[  459.367678]  ? destroy_inode+0xbc/0x110
+[  459.368261]  ? mutex_trylock+0x1a0/0x1a0
+[  459.368867]  ? __blkdev_get+0x3e6/0x1280
+[  459.369463]  ? bdev_disk_changed+0x1d0/0x1d0
+[  459.370114]  ? blkdev_get+0xce/0xbe0
+[  459.370656]  blkdev_get+0xce/0xbe0
+[  459.371178]  ? find_held_lock+0x2c/0x110
+[  459.371774]  ? __blkdev_get+0x1280/0x1280
+[  459.372383]  ? lock_downgrade+0x680/0x680
+[  459.373002]  ? lock_acquire+0x111/0x320
+[  459.373587]  ? bd_acquire+0x21/0x2c0
+[  459.374134]  ? do_raw_spin_unlock+0x4f/0x250
+[  459.374780]  blkdev_open+0x202/0x290
+[  459.375325]  do_dentry_open+0x49e/0x1050
+[  459.375924]  ? blkdev_get_by_dev+0x70/0x70
+[  459.376543]  ? __x64_sys_fchdir+0x1f0/0x1f0
+[  459.377192]  ? inode_permission+0xbe/0x3a0
+[  459.377818]  path_openat+0x148c/0x3f50
+[  459.378392]  ? kmem_cache_alloc+0xd5/0x280
+[  459.379016]  ? entry_SYSCALL_64_after_hwframe+0x49/0xbe
+[  459.379802]  ? path_lookupat.isra.0+0x900/0x900
+[  459.380489]  ? __lock_is_held+0xad/0x140
+[  459.381093]  do_filp_open+0x1a1/0x280
+[  459.381654]  ? may_open_dev+0xf0/0xf0
+[  459.382214]  ? find_held_lock+0x2c/0x110
+[  459.382816]  ? lock_downgrade+0x680/0x680
+[  459.383425]  ? __lock_is_held+0xad/0x140
+[  459.384024]  ? do_raw_spin_unlock+0x4f/0x250
+[  459.384668]  ? _raw_spin_unlock+0x1f/0x30
+[  459.385280]  ? __alloc_fd+0x448/0x560
+[  459.385841]  do_sys_open+0x3c3/0x500
+[  459.386386]  ? filp_open+0x70/0x70
+[  459.386911]  ? trace_hardirqs_on_thunk+0x1a/0x1c
+[  459.387610]  ? trace_hardirqs_off_caller+0x55/0x1c0
+[  459.388342]  ? do_syscall_64+0x1a/0x520
+[  459.388930]  do_syscall_64+0xc3/0x520
+[  459.389490]  entry_SYSCALL_64_after_hwframe+0x49/0xbe
+[  459.390248] RIP: 0033:0x416211
+[  459.390720] Code: 75 14 b8 02 00 00 00 0f 05 48 3d 01 f0 ff ff 0f 83
+04 19 00 00 c3 48 83 ec 08 e8 0a fa ff ff 48 89 04 24 b8 02 00 00 00 0f
+   05 <48> 8b 3c 24 48 89 c2 e8 53 fa ff ff 48 89 d0 48 83 c4 08 48 3d
+      01
+[  459.393483] RSP: 002b:00007fe45dfe9a60 EFLAGS: 00000293 ORIG_RAX: 0000000000000002
+[  459.394610] RAX: ffffffffffffffda RBX: 00007fe45dfea6d4 RCX: 0000000000416211
+[  459.395678] RDX: 00007fe45dfe9b0a RSI: 0000000000000002 RDI: 00007fe45dfe9b00
+[  459.396758] RBP: 000000000076bf20 R08: 0000000000000000 R09: 000000000000000a
+[  459.397930] R10: 0000000000000075 R11: 0000000000000293 R12: 00000000ffffffff
+[  459.399022] R13: 0000000000000bd9 R14: 00000000004cdb80 R15: 000000000076bf2c
+[  459.400168]
+[  459.400430] Allocated by task 20132:
+[  459.401038]  kasan_kmalloc+0xbf/0xe0
+[  459.401652]  kmem_cache_alloc+0xd5/0x280
+[  459.402330]  bdev_alloc_inode+0x18/0x40
+[  459.402970]  alloc_inode+0x5f/0x180
+[  459.403510]  iget5_locked+0x57/0xd0
+[  459.404095]  bdget+0x94/0x4e0
+[  459.404607]  bd_acquire+0xfa/0x2c0
+[  459.405113]  blkdev_open+0x110/0x290
+[  459.405702]  do_dentry_open+0x49e/0x1050
+[  459.406340]  path_openat+0x148c/0x3f50
+[  459.406926]  do_filp_open+0x1a1/0x280
+[  459.407471]  do_sys_open+0x3c3/0x500
+[  459.408010]  do_syscall_64+0xc3/0x520
+[  459.408572]  entry_SYSCALL_64_after_hwframe+0x49/0xbe
+[  459.409415]
+[  459.409679] Freed by task 1262:
+[  459.410212]  __kasan_slab_free+0x129/0x170
+[  459.410919]  kmem_cache_free+0xb2/0x2a0
+[  459.411564]  rcu_process_callbacks+0xbb2/0x2320
+[  459.412318]  __do_softirq+0x225/0x8ac
+
+Fix this by delaying bdput() to the end of blkdev_get() which means we
+have finished accessing bdev.
+
+Fixes: 77ea887e433a ("implement in-kernel gendisk events handling")
+Reported-by: Hulk Robot <hulkci@huawei.com>
+Signed-off-by: Jason Yan <yanaijie@huawei.com>
+Tested-by: Sedat Dilek <sedat.dilek@gmail.com>
+Reviewed-by: Jan Kara <jack@suse.cz>
+Reviewed-by: Christoph Hellwig <hch@lst.de>
+Reviewed-by: Dan Carpenter <dan.carpenter@oracle.com>
+Cc: Christoph Hellwig <hch@lst.de>
+Cc: Jens Axboe <axboe@kernel.dk>
+Cc: Ming Lei <ming.lei@redhat.com>
+Cc: Jan Kara <jack@suse.cz>
+Cc: Dan Carpenter <dan.carpenter@oracle.com>
+Signed-off-by: Jens Axboe <axboe@kernel.dk>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/block_dev.c | 12 +++++++-----
+ 1 file changed, 7 insertions(+), 5 deletions(-)
+
+diff --git a/fs/block_dev.c b/fs/block_dev.c
+index 93672c3f1c78c..313aae95818e9 100644
+--- a/fs/block_dev.c
++++ b/fs/block_dev.c
+@@ -1583,10 +1583,8 @@ static int __blkdev_get(struct block_device *bdev, fmode_t mode, int for_part)
+        */
+       if (!for_part) {
+               ret = devcgroup_inode_permission(bdev->bd_inode, perm);
+-              if (ret != 0) {
+-                      bdput(bdev);
++              if (ret != 0)
+                       return ret;
+-              }
+       }
+  restart:
+@@ -1655,8 +1653,10 @@ static int __blkdev_get(struct block_device *bdev, fmode_t mode, int for_part)
+                               goto out_clear;
+                       BUG_ON(for_part);
+                       ret = __blkdev_get(whole, mode, 1);
+-                      if (ret)
++                      if (ret) {
++                              bdput(whole);
+                               goto out_clear;
++                      }
+                       bdev->bd_contains = whole;
+                       bdev->bd_part = disk_get_part(disk, partno);
+                       if (!(disk->flags & GENHD_FL_UP) ||
+@@ -1706,7 +1706,6 @@ static int __blkdev_get(struct block_device *bdev, fmode_t mode, int for_part)
+       disk_unblock_events(disk);
+       put_disk_and_module(disk);
+  out:
+-      bdput(bdev);
+       return ret;
+ }
+@@ -1773,6 +1772,9 @@ int blkdev_get(struct block_device *bdev, fmode_t mode, void *holder)
+               bdput(whole);
+       }
++      if (res)
++              bdput(bdev);
++
+       return res;
+ }
+ EXPORT_SYMBOL(blkdev_get);
+-- 
+2.25.1
+
diff --git a/queue-5.7/bnxt_en-fix-aer-reset-logic-on-57500-chips.patch b/queue-5.7/bnxt_en-fix-aer-reset-logic-on-57500-chips.patch
new file mode 100644 (file)
index 0000000..dac328c
--- /dev/null
@@ -0,0 +1,61 @@
+From 11d175a4f93ba90f6dbd23f7f14d51fcdbcfd04f Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 14 Jun 2020 19:57:09 -0400
+Subject: bnxt_en: Fix AER reset logic on 57500 chips.
+
+From: Michael Chan <michael.chan@broadcom.com>
+
+[ Upstream commit 6e2f83884c099de0e87b15a820736e522755d074 ]
+
+AER reset should follow the same steps as suspend/resume.  We need to
+free context memory during AER reset and allocate new context memory
+during recovery by calling bnxt_hwrm_func_qcaps().  We also need
+to call bnxt_reenable_sriov() to restore the VFs.
+
+Fixes: bae361c54fb6 ("bnxt_en: Improve AER slot reset.")
+Signed-off-by: Michael Chan <michael.chan@broadcom.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/ethernet/broadcom/bnxt/bnxt.c | 17 ++++++++++++-----
+ 1 file changed, 12 insertions(+), 5 deletions(-)
+
+diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
+index f8b26265cb86d..a29bf3ca0b48e 100644
+--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
++++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
+@@ -12160,6 +12160,9 @@ static pci_ers_result_t bnxt_io_error_detected(struct pci_dev *pdev,
+               bnxt_close(netdev);
+       pci_disable_device(pdev);
++      bnxt_free_ctx_mem(bp);
++      kfree(bp->ctx);
++      bp->ctx = NULL;
+       rtnl_unlock();
+       /* Request a slot slot reset. */
+@@ -12193,12 +12196,16 @@ static pci_ers_result_t bnxt_io_slot_reset(struct pci_dev *pdev)
+               pci_set_master(pdev);
+               err = bnxt_hwrm_func_reset(bp);
+-              if (!err && netif_running(netdev))
+-                      err = bnxt_open(netdev);
+-
+-              if (!err)
+-                      result = PCI_ERS_RESULT_RECOVERED;
++              if (!err) {
++                      err = bnxt_hwrm_func_qcaps(bp);
++                      if (!err && netif_running(netdev))
++                              err = bnxt_open(netdev);
++              }
+               bnxt_ulp_start(bp, err);
++              if (!err) {
++                      bnxt_reenable_sriov(bp);
++                      result = PCI_ERS_RESULT_RECOVERED;
++              }
+       }
+       if (result != PCI_ERS_RESULT_RECOVERED) {
+-- 
+2.25.1
+
diff --git a/queue-5.7/bnxt_en-re-enable-sriov-during-resume.patch b/queue-5.7/bnxt_en-re-enable-sriov-during-resume.patch
new file mode 100644 (file)
index 0000000..27f30e7
--- /dev/null
@@ -0,0 +1,37 @@
+From 1f6ffb9e0c0f6ac3626e684fd9a55d4976bfabe9 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 14 Jun 2020 19:57:08 -0400
+Subject: bnxt_en: Re-enable SRIOV during resume.
+
+From: Michael Chan <michael.chan@broadcom.com>
+
+[ Upstream commit 59ae210173ff86256fa0cdba4ea4d608c61e123d ]
+
+If VFs are enabled, we need to re-configure them during resume because
+firmware has been reset while resuming.  Otherwise, the VFs won't
+work after resume.
+
+Fixes: c16d4ee0e397 ("bnxt_en: Refactor logic to re-enable SRIOV after firmware reset detected.")
+Signed-off-by: Michael Chan <michael.chan@broadcom.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/ethernet/broadcom/bnxt/bnxt.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
+index fbfb3e092e0dc..f8b26265cb86d 100644
+--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
++++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
+@@ -12115,6 +12115,8 @@ static int bnxt_resume(struct device *device)
+ resume_exit:
+       bnxt_ulp_start(bp, rc);
++      if (!rc)
++              bnxt_reenable_sriov(bp);
+       rtnl_unlock();
+       return rc;
+ }
+-- 
+2.25.1
+
diff --git a/queue-5.7/bnxt_en-return-from-timer-if-interface-is-not-in-ope.patch b/queue-5.7/bnxt_en-return-from-timer-if-interface-is-not-in-ope.patch
new file mode 100644 (file)
index 0000000..d1166ab
--- /dev/null
@@ -0,0 +1,37 @@
+From 349b70bec5f45653f3f84fb3877596751f7fce49 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 14 Jun 2020 19:57:10 -0400
+Subject: bnxt_en: Return from timer if interface is not in open state.
+
+From: Vasundhara Volam <vasundhara-v.volam@broadcom.com>
+
+[ Upstream commit e000940473d1423a42ef9c823fb23ccffe3f07ea ]
+
+This will avoid many uneccessary error logs when driver or firmware is
+in reset.
+
+Fixes: 230d1f0de754 ("bnxt_en: Handle firmware reset.")
+Signed-off-by: Vasundhara Volam <vasundhara-v.volam@broadcom.com>
+Signed-off-by: Michael Chan <michael.chan@broadcom.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/ethernet/broadcom/bnxt/bnxt.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
+index a29bf3ca0b48e..19c4a0a5727a4 100644
+--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
++++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
+@@ -10014,7 +10014,7 @@ static void bnxt_timer(struct timer_list *t)
+       struct bnxt *bp = from_timer(bp, t, timer);
+       struct net_device *dev = bp->dev;
+-      if (!netif_running(dev))
++      if (!netif_running(dev) || !test_bit(BNXT_STATE_OPEN, &bp->state))
+               return;
+       if (atomic_read(&bp->intr_sem) != 0)
+-- 
+2.25.1
+
diff --git a/queue-5.7/bnxt_en-simplify-bnxt_resume.patch b/queue-5.7/bnxt_en-simplify-bnxt_resume.patch
new file mode 100644 (file)
index 0000000..d8a186e
--- /dev/null
@@ -0,0 +1,51 @@
+From 4c1c66ed272869e0e5ca1ca98cc90c8ccef1dd3d Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 14 Jun 2020 19:57:07 -0400
+Subject: bnxt_en: Simplify bnxt_resume().
+
+From: Michael Chan <michael.chan@broadcom.com>
+
+[ Upstream commit 2084ccf6259cc95e0575f0fafc93595d0219a9f6 ]
+
+The separate steps we do in bnxt_resume() can be done more simply by
+calling bnxt_hwrm_func_qcaps().  This change will add an extra
+__bnxt_hwrm_func_qcaps() call which is needed anyway on older
+firmware.
+
+Fixes: f9b69d7f6279 ("bnxt_en: Fix suspend/resume path on 57500 chips")
+Signed-off-by: Michael Chan <michael.chan@broadcom.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/ethernet/broadcom/bnxt/bnxt.c | 14 ++------------
+ 1 file changed, 2 insertions(+), 12 deletions(-)
+
+diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
+index 58e0d9a781e9a..fbfb3e092e0dc 100644
+--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
++++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
+@@ -12097,19 +12097,9 @@ static int bnxt_resume(struct device *device)
+               goto resume_exit;
+       }
+-      if (bnxt_hwrm_queue_qportcfg(bp)) {
+-              rc = -ENODEV;
++      rc = bnxt_hwrm_func_qcaps(bp);
++      if (rc)
+               goto resume_exit;
+-      }
+-
+-      if (bp->hwrm_spec_code >= 0x10803) {
+-              if (bnxt_alloc_ctx_mem(bp)) {
+-                      rc = -ENODEV;
+-                      goto resume_exit;
+-              }
+-      }
+-      if (BNXT_NEW_RM(bp))
+-              bnxt_hwrm_func_resc_qcaps(bp, false);
+       if (bnxt_hwrm_func_drv_rgtr(bp, NULL, 0, false)) {
+               rc = -ENODEV;
+-- 
+2.25.1
+
diff --git a/queue-5.7/bpf-fix-an-error-code-in-check_btf_func.patch b/queue-5.7/bpf-fix-an-error-code-in-check_btf_func.patch
new file mode 100644 (file)
index 0000000..4b78963
--- /dev/null
@@ -0,0 +1,38 @@
+From 92d35719eb0e27c02e6e1a09e4af005fe06f696a Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 4 Jun 2020 11:54:36 +0300
+Subject: bpf: Fix an error code in check_btf_func()
+
+From: Dan Carpenter <dan.carpenter@oracle.com>
+
+[ Upstream commit e7ed83d6fa1a00d0f2ad0327e73d3ea9e7ea8de1 ]
+
+This code returns success if the "info_aux" allocation fails but it
+should return -ENOMEM.
+
+Fixes: 8c1b6e69dcc1 ("bpf: Compare BTF types of functions arguments with actual types")
+Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
+Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
+Acked-by: Song Liu <songliubraving@fb.com>
+Link: https://lore.kernel.org/bpf/20200604085436.GA943001@mwanda
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ kernel/bpf/verifier.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
+index efe14cf24bc65..739d9ba3ba6b7 100644
+--- a/kernel/bpf/verifier.c
++++ b/kernel/bpf/verifier.c
+@@ -7366,7 +7366,7 @@ static int check_btf_func(struct bpf_verifier_env *env,
+       const struct btf *btf;
+       void __user *urecord;
+       u32 prev_offset = 0;
+-      int ret = 0;
++      int ret = -ENOMEM;
+       nfuncs = attr->func_info_cnt;
+       if (!nfuncs)
+-- 
+2.25.1
+
diff --git a/queue-5.7/bpf-fix-memlock-accounting-for-sock_hash.patch b/queue-5.7/bpf-fix-memlock-accounting-for-sock_hash.patch
new file mode 100644 (file)
index 0000000..f5b8612
--- /dev/null
@@ -0,0 +1,59 @@
+From 2cd587460b99177fbd3d0ec64d6fc80c60e935ca Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 11 Jun 2020 17:08:57 -0700
+Subject: bpf: Fix memlock accounting for sock_hash
+
+From: Andrey Ignatov <rdna@fb.com>
+
+[ Upstream commit 60e5ca8a64bad8f3e2e20a1e57846e497361c700 ]
+
+Add missed bpf_map_charge_init() in sock_hash_alloc() and
+correspondingly bpf_map_charge_finish() on ENOMEM.
+
+It was found accidentally while working on unrelated selftest that
+checks "map->memory.pages > 0" is true for all map types.
+
+Before:
+       # bpftool m l
+       ...
+       3692: sockhash  name m_sockhash  flags 0x0
+               key 4B  value 4B  max_entries 8  memlock 0B
+
+After:
+       # bpftool m l
+       ...
+       84: sockmap  name m_sockmap  flags 0x0
+               key 4B  value 4B  max_entries 8  memlock 4096B
+
+Fixes: 604326b41a6f ("bpf, sockmap: convert to generic sk_msg interface")
+Signed-off-by: Andrey Ignatov <rdna@fb.com>
+Signed-off-by: Alexei Starovoitov <ast@kernel.org>
+Link: https://lore.kernel.org/bpf/20200612000857.2881453-1-rdna@fb.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/core/sock_map.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/net/core/sock_map.c b/net/core/sock_map.c
+index 7e858c1dd7113..591457fcbd028 100644
+--- a/net/core/sock_map.c
++++ b/net/core/sock_map.c
+@@ -984,11 +984,15 @@ static struct bpf_map *sock_hash_alloc(union bpf_attr *attr)
+               err = -EINVAL;
+               goto free_htab;
+       }
++      err = bpf_map_charge_init(&htab->map.memory, cost);
++      if (err)
++              goto free_htab;
+       htab->buckets = bpf_map_area_alloc(htab->buckets_num *
+                                          sizeof(struct bpf_htab_bucket),
+                                          htab->map.numa_node);
+       if (!htab->buckets) {
++              bpf_map_charge_finish(&htab->map.memory);
+               err = -ENOMEM;
+               goto free_htab;
+       }
+-- 
+2.25.1
+
diff --git a/queue-5.7/bpf-sockhash-fix-memory-leak-when-unlinking-sockets-.patch b/queue-5.7/bpf-sockhash-fix-memory-leak-when-unlinking-sockets-.patch
new file mode 100644 (file)
index 0000000..a4ec67a
--- /dev/null
@@ -0,0 +1,56 @@
+From ad3f5eb7696dfa3120ec7f350ad311fba19a8949 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 7 Jun 2020 22:52:28 +0200
+Subject: bpf, sockhash: Fix memory leak when unlinking sockets in
+ sock_hash_free
+
+From: Jakub Sitnicki <jakub@cloudflare.com>
+
+[ Upstream commit 33a7c831565c43a7ee2f38c7df4c4a40e1dfdfed ]
+
+When sockhash gets destroyed while sockets are still linked to it, we will
+walk the bucket lists and delete the links. However, we are not freeing the
+list elements after processing them, leaking the memory.
+
+The leak can be triggered by close()'ing a sockhash map when it still
+contains sockets, and observed with kmemleak:
+
+  unreferenced object 0xffff888116e86f00 (size 64):
+    comm "race_sock_unlin", pid 223, jiffies 4294731063 (age 217.404s)
+    hex dump (first 32 bytes):
+      00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
+      81 de e8 41 00 00 00 00 c0 69 2f 15 81 88 ff ff  ...A.....i/.....
+    backtrace:
+      [<00000000dd089ebb>] sock_hash_update_common+0x4ca/0x760
+      [<00000000b8219bd5>] sock_hash_update_elem+0x1d2/0x200
+      [<000000005e2c23de>] __do_sys_bpf+0x2046/0x2990
+      [<00000000d0084618>] do_syscall_64+0xad/0x9a0
+      [<000000000d96f263>] entry_SYSCALL_64_after_hwframe+0x49/0xb3
+
+Fix it by freeing the list element when we're done with it.
+
+Fixes: 604326b41a6f ("bpf, sockmap: convert to generic sk_msg interface")
+Signed-off-by: Jakub Sitnicki <jakub@cloudflare.com>
+Signed-off-by: Alexei Starovoitov <ast@kernel.org>
+Acked-by: John Fastabend <john.fastabend@gmail.com>
+Link: https://lore.kernel.org/bpf/20200607205229.2389672-2-jakub@cloudflare.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/core/sock_map.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/net/core/sock_map.c b/net/core/sock_map.c
+index b08dfae10f88e..7edbf1e924571 100644
+--- a/net/core/sock_map.c
++++ b/net/core/sock_map.c
+@@ -1024,6 +1024,7 @@ static void sock_hash_free(struct bpf_map *map)
+                       sock_map_unref(elem->sk, elem);
+                       rcu_read_unlock();
+                       release_sock(elem->sk);
++                      sock_hash_free_elem(htab, elem);
+               }
+       }
+-- 
+2.25.1
+
diff --git a/queue-5.7/bpf-sockhash-synchronize-delete-from-bucket-list-on-.patch b/queue-5.7/bpf-sockhash-synchronize-delete-from-bucket-list-on-.patch
new file mode 100644 (file)
index 0000000..51cf794
--- /dev/null
@@ -0,0 +1,116 @@
+From 2782ce2a4256eb757a5d7117943a6825d648dbe9 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 7 Jun 2020 22:52:29 +0200
+Subject: bpf, sockhash: Synchronize delete from bucket list on map free
+
+From: Jakub Sitnicki <jakub@cloudflare.com>
+
+[ Upstream commit 75e68e5bf2c7fa9d3e874099139df03d5952a3e1 ]
+
+We can end up modifying the sockhash bucket list from two CPUs when a
+sockhash is being destroyed (sock_hash_free) on one CPU, while a socket
+that is in the sockhash is unlinking itself from it on another CPU
+it (sock_hash_delete_from_link).
+
+This results in accessing a list element that is in an undefined state as
+reported by KASAN:
+
+| ==================================================================
+| BUG: KASAN: wild-memory-access in sock_hash_free+0x13c/0x280
+| Write of size 8 at addr dead000000000122 by task kworker/2:1/95
+|
+| CPU: 2 PID: 95 Comm: kworker/2:1 Not tainted 5.7.0-rc7-02961-ge22c35ab0038-dirty #691
+| Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS ?-20190727_073836-buildvm-ppc64le-16.ppc.fedoraproject.org-3.fc31 04/01/2014
+| Workqueue: events bpf_map_free_deferred
+| Call Trace:
+|  dump_stack+0x97/0xe0
+|  ? sock_hash_free+0x13c/0x280
+|  __kasan_report.cold+0x5/0x40
+|  ? mark_lock+0xbc1/0xc00
+|  ? sock_hash_free+0x13c/0x280
+|  kasan_report+0x38/0x50
+|  ? sock_hash_free+0x152/0x280
+|  sock_hash_free+0x13c/0x280
+|  bpf_map_free_deferred+0xb2/0xd0
+|  ? bpf_map_charge_finish+0x50/0x50
+|  ? rcu_read_lock_sched_held+0x81/0xb0
+|  ? rcu_read_lock_bh_held+0x90/0x90
+|  process_one_work+0x59a/0xac0
+|  ? lock_release+0x3b0/0x3b0
+|  ? pwq_dec_nr_in_flight+0x110/0x110
+|  ? rwlock_bug.part.0+0x60/0x60
+|  worker_thread+0x7a/0x680
+|  ? _raw_spin_unlock_irqrestore+0x4c/0x60
+|  kthread+0x1cc/0x220
+|  ? process_one_work+0xac0/0xac0
+|  ? kthread_create_on_node+0xa0/0xa0
+|  ret_from_fork+0x24/0x30
+| ==================================================================
+
+Fix it by reintroducing spin-lock protected critical section around the
+code that removes the elements from the bucket on sockhash free.
+
+To do that we also need to defer processing of removed elements, until out
+of atomic context so that we can unlink the socket from the map when
+holding the sock lock.
+
+Fixes: 90db6d772f74 ("bpf, sockmap: Remove bucket->lock from sock_{hash|map}_free")
+Reported-by: Eric Dumazet <eric.dumazet@gmail.com>
+Signed-off-by: Jakub Sitnicki <jakub@cloudflare.com>
+Signed-off-by: Alexei Starovoitov <ast@kernel.org>
+Acked-by: John Fastabend <john.fastabend@gmail.com>
+Link: https://lore.kernel.org/bpf/20200607205229.2389672-3-jakub@cloudflare.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/core/sock_map.c | 23 +++++++++++++++++++++--
+ 1 file changed, 21 insertions(+), 2 deletions(-)
+
+diff --git a/net/core/sock_map.c b/net/core/sock_map.c
+index 7edbf1e924571..050bfac97cfb5 100644
+--- a/net/core/sock_map.c
++++ b/net/core/sock_map.c
+@@ -1006,6 +1006,7 @@ static void sock_hash_free(struct bpf_map *map)
+ {
+       struct bpf_htab *htab = container_of(map, struct bpf_htab, map);
+       struct bpf_htab_bucket *bucket;
++      struct hlist_head unlink_list;
+       struct bpf_htab_elem *elem;
+       struct hlist_node *node;
+       int i;
+@@ -1017,13 +1018,31 @@ static void sock_hash_free(struct bpf_map *map)
+       synchronize_rcu();
+       for (i = 0; i < htab->buckets_num; i++) {
+               bucket = sock_hash_select_bucket(htab, i);
+-              hlist_for_each_entry_safe(elem, node, &bucket->head, node) {
+-                      hlist_del_rcu(&elem->node);
++
++              /* We are racing with sock_hash_delete_from_link to
++               * enter the spin-lock critical section. Every socket on
++               * the list is still linked to sockhash. Since link
++               * exists, psock exists and holds a ref to socket. That
++               * lets us to grab a socket ref too.
++               */
++              raw_spin_lock_bh(&bucket->lock);
++              hlist_for_each_entry(elem, &bucket->head, node)
++                      sock_hold(elem->sk);
++              hlist_move_list(&bucket->head, &unlink_list);
++              raw_spin_unlock_bh(&bucket->lock);
++
++              /* Process removed entries out of atomic context to
++               * block for socket lock before deleting the psock's
++               * link to sockhash.
++               */
++              hlist_for_each_entry_safe(elem, node, &unlink_list, node) {
++                      hlist_del(&elem->node);
+                       lock_sock(elem->sk);
+                       rcu_read_lock();
+                       sock_map_unref(elem->sk, elem);
+                       rcu_read_unlock();
+                       release_sock(elem->sk);
++                      sock_put(elem->sk);
+                       sock_hash_free_elem(htab, elem);
+               }
+       }
+-- 
+2.25.1
+
diff --git a/queue-5.7/bpf-sockmap-don-t-attach-programs-to-udp-sockets.patch b/queue-5.7/bpf-sockmap-don-t-attach-programs-to-udp-sockets.patch
new file mode 100644 (file)
index 0000000..7d6e782
--- /dev/null
@@ -0,0 +1,56 @@
+From d2a763b575b7a6fcfb56e32742ac9120ac3fa080 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 11 Jun 2020 18:25:20 +0100
+Subject: bpf: sockmap: Don't attach programs to UDP sockets
+
+From: Lorenz Bauer <lmb@cloudflare.com>
+
+[ Upstream commit f6fede8569689dd31e7b0ed15024b25e5ce2e2e5 ]
+
+The stream parser infrastructure isn't set up to deal with UDP
+sockets, so we mustn't try to attach programs to them.
+
+I remember making this change at some point, but I must have lost
+it while rebasing or something similar.
+
+Fixes: 7b98cd42b049 ("bpf: sockmap: Add UDP support")
+Signed-off-by: Lorenz Bauer <lmb@cloudflare.com>
+Signed-off-by: Alexei Starovoitov <ast@kernel.org>
+Acked-by: Jakub Sitnicki <jakub@cloudflare.com>
+Link: https://lore.kernel.org/bpf/20200611172520.327602-1-lmb@cloudflare.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/core/sock_map.c | 10 ++++++----
+ 1 file changed, 6 insertions(+), 4 deletions(-)
+
+diff --git a/net/core/sock_map.c b/net/core/sock_map.c
+index 050bfac97cfb5..7e858c1dd7113 100644
+--- a/net/core/sock_map.c
++++ b/net/core/sock_map.c
+@@ -417,10 +417,7 @@ static int sock_map_get_next_key(struct bpf_map *map, void *key, void *next)
+       return 0;
+ }
+-static bool sock_map_redirect_allowed(const struct sock *sk)
+-{
+-      return sk->sk_state != TCP_LISTEN;
+-}
++static bool sock_map_redirect_allowed(const struct sock *sk);
+ static int sock_map_update_common(struct bpf_map *map, u32 idx,
+                                 struct sock *sk, u64 flags)
+@@ -501,6 +498,11 @@ static bool sk_is_udp(const struct sock *sk)
+              sk->sk_protocol == IPPROTO_UDP;
+ }
++static bool sock_map_redirect_allowed(const struct sock *sk)
++{
++      return sk_is_tcp(sk) && sk->sk_state != TCP_LISTEN;
++}
++
+ static bool sock_map_sk_is_suitable(const struct sock *sk)
+ {
+       return sk_is_tcp(sk) || sk_is_udp(sk);
+-- 
+2.25.1
+
diff --git a/queue-5.7/bpf-sockmap-fix-kernel-panic-at-__tcp_bpf_recvmsg.patch b/queue-5.7/bpf-sockmap-fix-kernel-panic-at-__tcp_bpf_recvmsg.patch
new file mode 100644 (file)
index 0000000..38a8791
--- /dev/null
@@ -0,0 +1,63 @@
+From 63d52040033786aff83707aef9ceb95634ceabf5 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 5 Jun 2020 16:46:25 +0800
+Subject: bpf/sockmap: Fix kernel panic at __tcp_bpf_recvmsg
+
+From: dihu <anny.hu@linux.alibaba.com>
+
+[ Upstream commit 487082fb7bd2a32b66927d2b22e3a81b072b44f0 ]
+
+When user application calls read() with MSG_PEEK flag to read data
+of bpf sockmap socket, kernel panic happens at
+__tcp_bpf_recvmsg+0x12c/0x350. sk_msg is not removed from ingress_msg
+queue after read out under MSG_PEEK flag is set. Because it's not
+judged whether sk_msg is the last msg of ingress_msg queue, the next
+sk_msg may be the head of ingress_msg queue, whose memory address of
+sg page is invalid. So it's necessary to add check codes to prevent
+this problem.
+
+[20759.125457] BUG: kernel NULL pointer dereference, address:
+0000000000000008
+[20759.132118] CPU: 53 PID: 51378 Comm: envoy Tainted: G            E
+5.4.32 #1
+[20759.140890] Hardware name: Inspur SA5212M4/YZMB-00370-109, BIOS
+4.1.12 06/18/2017
+[20759.149734] RIP: 0010:copy_page_to_iter+0xad/0x300
+[20759.270877] __tcp_bpf_recvmsg+0x12c/0x350
+[20759.276099] tcp_bpf_recvmsg+0x113/0x370
+[20759.281137] inet_recvmsg+0x55/0xc0
+[20759.285734] __sys_recvfrom+0xc8/0x130
+[20759.290566] ? __audit_syscall_entry+0x103/0x130
+[20759.296227] ? syscall_trace_enter+0x1d2/0x2d0
+[20759.301700] ? __audit_syscall_exit+0x1e4/0x290
+[20759.307235] __x64_sys_recvfrom+0x24/0x30
+[20759.312226] do_syscall_64+0x55/0x1b0
+[20759.316852] entry_SYSCALL_64_after_hwframe+0x44/0xa9
+
+Signed-off-by: dihu <anny.hu@linux.alibaba.com>
+Signed-off-by: Alexei Starovoitov <ast@kernel.org>
+Acked-by: John Fastabend <john.fastabend@gmail.com>
+Acked-by: Jakub Sitnicki <jakub@cloudflare.com>
+Link: https://lore.kernel.org/bpf/20200605084625.9783-1-anny.hu@linux.alibaba.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/ipv4/tcp_bpf.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/net/ipv4/tcp_bpf.c b/net/ipv4/tcp_bpf.c
+index 9c5540887fbe5..7aa68f4aae6c3 100644
+--- a/net/ipv4/tcp_bpf.c
++++ b/net/ipv4/tcp_bpf.c
+@@ -64,6 +64,9 @@ int __tcp_bpf_recvmsg(struct sock *sk, struct sk_psock *psock,
+               } while (i != msg_rx->sg.end);
+               if (unlikely(peek)) {
++                      if (msg_rx == list_last_entry(&psock->ingress_msg,
++                                                    struct sk_msg, list))
++                              break;
+                       msg_rx = list_next_entry(msg_rx, list);
+                       continue;
+               }
+-- 
+2.25.1
+
diff --git a/queue-5.7/bpf-tcp-recv-should-return-0-when-the-peer-socket-is.patch b/queue-5.7/bpf-tcp-recv-should-return-0-when-the-peer-socket-is.patch
new file mode 100644 (file)
index 0000000..c902552
--- /dev/null
@@ -0,0 +1,53 @@
+From b527540589c26de956fcd7172db7770299d260de Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 10 Jun 2020 12:19:43 +0200
+Subject: bpf: tcp: Recv() should return 0 when the peer socket is closed
+
+From: Sabrina Dubroca <sd@queasysnail.net>
+
+[ Upstream commit 2c7269b231194aae23fb90ab65842573a91acbc9 ]
+
+If the peer is closed, we will never get more data, so
+tcp_bpf_wait_data will get stuck forever. In case we passed
+MSG_DONTWAIT to recv(), we get EAGAIN but we should actually get
+0.
+
+>From man 2 recv:
+
+    RETURN VALUE
+
+    When a stream socket peer has performed an orderly shutdown, the
+    return value will be 0 (the traditional "end-of-file" return).
+
+This patch makes tcp_bpf_wait_data always return 1 when the peer
+socket has been shutdown. Either we have data available, and it would
+have returned 1 anyway, or there isn't, in which case we'll call
+tcp_recvmsg which does the right thing in this situation.
+
+Fixes: 604326b41a6f ("bpf, sockmap: convert to generic sk_msg interface")
+Signed-off-by: Sabrina Dubroca <sd@queasysnail.net>
+Signed-off-by: Alexei Starovoitov <ast@kernel.org>
+Acked-by: Jakub Sitnicki <jakub@cloudflare.com>
+Link: https://lore.kernel.org/bpf/26038a28c21fea5d04d4bd4744c5686d3f2e5504.1591784177.git.sd@queasysnail.net
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/ipv4/tcp_bpf.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/net/ipv4/tcp_bpf.c b/net/ipv4/tcp_bpf.c
+index 629aaa9a1eb99..9c5540887fbe5 100644
+--- a/net/ipv4/tcp_bpf.c
++++ b/net/ipv4/tcp_bpf.c
+@@ -242,6 +242,9 @@ static int tcp_bpf_wait_data(struct sock *sk, struct sk_psock *psock,
+       DEFINE_WAIT_FUNC(wait, woken_wake_function);
+       int ret = 0;
++      if (sk->sk_shutdown & RCV_SHUTDOWN)
++              return 1;
++
+       if (!timeo)
+               return ret;
+-- 
+2.25.1
+
diff --git a/queue-5.7/bpf-undo-internal-bpf_probe_mem-in-bpf-insns-dump.patch b/queue-5.7/bpf-undo-internal-bpf_probe_mem-in-bpf-insns-dump.patch
new file mode 100644 (file)
index 0000000..6ab0a56
--- /dev/null
@@ -0,0 +1,69 @@
+From 557152cc8880ab22f10bad1806781cc3e9d51374 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 12 Jun 2020 17:21:15 -0700
+Subject: bpf: Undo internal BPF_PROBE_MEM in BPF insns dump
+
+From: Andrii Nakryiko <andriin@fb.com>
+
+[ Upstream commit 29fcb05bbf1a7008900bb9bee347bdbfc7171036 ]
+
+BPF_PROBE_MEM is kernel-internal implmementation details. When dumping BPF
+instructions to user-space, it needs to be replaced back with BPF_MEM mode.
+
+Fixes: 2a02759ef5f8 ("bpf: Add support for BTF pointers to interpreter")
+Signed-off-by: Andrii Nakryiko <andriin@fb.com>
+Signed-off-by: Alexei Starovoitov <ast@kernel.org>
+Link: https://lore.kernel.org/bpf/20200613002115.1632142-1-andriin@fb.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ kernel/bpf/syscall.c | 17 ++++++++++++-----
+ 1 file changed, 12 insertions(+), 5 deletions(-)
+
+diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c
+index 5e52765161f91..c8acc8f375836 100644
+--- a/kernel/bpf/syscall.c
++++ b/kernel/bpf/syscall.c
+@@ -2924,6 +2924,7 @@ static struct bpf_insn *bpf_insn_prepare_dump(const struct bpf_prog *prog)
+       struct bpf_insn *insns;
+       u32 off, type;
+       u64 imm;
++      u8 code;
+       int i;
+       insns = kmemdup(prog->insnsi, bpf_prog_insn_size(prog),
+@@ -2932,21 +2933,27 @@ static struct bpf_insn *bpf_insn_prepare_dump(const struct bpf_prog *prog)
+               return insns;
+       for (i = 0; i < prog->len; i++) {
+-              if (insns[i].code == (BPF_JMP | BPF_TAIL_CALL)) {
++              code = insns[i].code;
++
++              if (code == (BPF_JMP | BPF_TAIL_CALL)) {
+                       insns[i].code = BPF_JMP | BPF_CALL;
+                       insns[i].imm = BPF_FUNC_tail_call;
+                       /* fall-through */
+               }
+-              if (insns[i].code == (BPF_JMP | BPF_CALL) ||
+-                  insns[i].code == (BPF_JMP | BPF_CALL_ARGS)) {
+-                      if (insns[i].code == (BPF_JMP | BPF_CALL_ARGS))
++              if (code == (BPF_JMP | BPF_CALL) ||
++                  code == (BPF_JMP | BPF_CALL_ARGS)) {
++                      if (code == (BPF_JMP | BPF_CALL_ARGS))
+                               insns[i].code = BPF_JMP | BPF_CALL;
+                       if (!bpf_dump_raw_ok())
+                               insns[i].imm = 0;
+                       continue;
+               }
++              if (BPF_CLASS(code) == BPF_LDX && BPF_MODE(code) == BPF_PROBE_MEM) {
++                      insns[i].code = BPF_LDX | BPF_SIZE(code) | BPF_MEM;
++                      continue;
++              }
+-              if (insns[i].code != (BPF_LD | BPF_IMM | BPF_DW))
++              if (code != (BPF_LD | BPF_IMM | BPF_DW))
+                       continue;
+               imm = ((u64)insns[i + 1].imm << 32) | (u32)insns[i].imm;
+-- 
+2.25.1
+
diff --git a/queue-5.7/bus-mhi-core-read-transfer-length-from-an-event-prop.patch b/queue-5.7/bus-mhi-core-read-transfer-length-from-an-event-prop.patch
new file mode 100644 (file)
index 0000000..ed98448
--- /dev/null
@@ -0,0 +1,59 @@
+From ebfe74b7ec2a70c49242f54d03a61f982eb25e83 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 21 May 2020 22:32:39 +0530
+Subject: bus: mhi: core: Read transfer length from an event properly
+
+From: Hemant Kumar <hemantk@codeaurora.org>
+
+[ Upstream commit ee75cedf82d832561af8ba8380aeffd00a9eea77 ]
+
+When MHI Driver receives an EOT event, it reads xfer_len from the
+event in the last TRE. The value is under control of the MHI device
+and never validated by Host MHI driver. The value should never be
+larger than the real size of the buffer but a malicious device can
+set the value 0xFFFF as maximum. This causes driver to memory
+overflow (both read or write). Fix this issue by reading minimum of
+transfer length from event and the buffer length provided.
+
+Signed-off-by: Hemant Kumar <hemantk@codeaurora.org>
+Signed-off-by: Bhaumik Bhatt <bbhatt@codeaurora.org>
+Reviewed-by: Jeffrey Hugo <jhugo@codeaurora.org>
+Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
+Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
+Link: https://lore.kernel.org/r/20200521170249.21795-5-manivannan.sadhasivam@linaro.org
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/bus/mhi/core/main.c | 9 +++++++--
+ 1 file changed, 7 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/bus/mhi/core/main.c b/drivers/bus/mhi/core/main.c
+index 97e06cc586e4f..8be3d0fb06145 100644
+--- a/drivers/bus/mhi/core/main.c
++++ b/drivers/bus/mhi/core/main.c
+@@ -513,7 +513,10 @@ static int parse_xfer_event(struct mhi_controller *mhi_cntrl,
+                               mhi_cntrl->unmap_single(mhi_cntrl, buf_info);
+                       result.buf_addr = buf_info->cb_buf;
+-                      result.bytes_xferd = xfer_len;
++
++                      /* truncate to buf len if xfer_len is larger */
++                      result.bytes_xferd =
++                              min_t(u16, xfer_len, buf_info->len);
+                       mhi_del_ring_element(mhi_cntrl, buf_ring);
+                       mhi_del_ring_element(mhi_cntrl, tre_ring);
+                       local_rp = tre_ring->rp;
+@@ -597,7 +600,9 @@ static int parse_rsc_event(struct mhi_controller *mhi_cntrl,
+       result.transaction_status = (ev_code == MHI_EV_CC_OVERFLOW) ?
+               -EOVERFLOW : 0;
+-      result.bytes_xferd = xfer_len;
++
++      /* truncate to buf len if xfer_len is larger */
++      result.bytes_xferd = min_t(u16, xfer_len, buf_info->len);
+       result.buf_addr = buf_info->cb_buf;
+       result.dir = mhi_chan->dir;
+-- 
+2.25.1
+
diff --git a/queue-5.7/ceph-don-t-return-estale-if-there-s-still-an-open-fi.patch b/queue-5.7/ceph-don-t-return-estale-if-there-s-still-an-open-fi.patch
new file mode 100644 (file)
index 0000000..974830a
--- /dev/null
@@ -0,0 +1,61 @@
+From b3c70771500151efb03431da6d89e59d37c9c5b6 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 18 May 2020 18:47:26 +0100
+Subject: ceph: don't return -ESTALE if there's still an open file
+
+From: Luis Henriques <lhenriques@suse.com>
+
+[ Upstream commit 878dabb64117406abd40977b87544d05bb3031fc ]
+
+Similarly to commit 03f219041fdb ("ceph: check i_nlink while converting
+a file handle to dentry"), this fixes another corner case with
+name_to_handle_at/open_by_handle_at.  The issue has been detected by
+xfstest generic/467, when doing:
+
+ - name_to_handle_at("/cephfs/myfile")
+ - open("/cephfs/myfile")
+ - unlink("/cephfs/myfile")
+ - sync; sync;
+ - drop caches
+ - open_by_handle_at()
+
+The call to open_by_handle_at should not fail because the file hasn't been
+deleted yet (only unlinked) and we do have a valid handle to it.  -ESTALE
+shall be returned only if i_nlink is 0 *and* i_count is 1.
+
+This patch also makes sure we have LINK caps before checking i_nlink.
+
+Signed-off-by: Luis Henriques <lhenriques@suse.com>
+Reviewed-by: Jeff Layton <jlayton@kernel.org>
+Acked-by: Amir Goldstein <amir73il@gmail.com>
+Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/ceph/export.c | 9 ++++++++-
+ 1 file changed, 8 insertions(+), 1 deletion(-)
+
+diff --git a/fs/ceph/export.c b/fs/ceph/export.c
+index 79dc06881e78e..e088843a7734c 100644
+--- a/fs/ceph/export.c
++++ b/fs/ceph/export.c
+@@ -172,9 +172,16 @@ struct inode *ceph_lookup_inode(struct super_block *sb, u64 ino)
+ static struct dentry *__fh_to_dentry(struct super_block *sb, u64 ino)
+ {
+       struct inode *inode = __lookup_inode(sb, ino);
++      int err;
++
+       if (IS_ERR(inode))
+               return ERR_CAST(inode);
+-      if (inode->i_nlink == 0) {
++      /* We need LINK caps to reliably check i_nlink */
++      err = ceph_do_getattr(inode, CEPH_CAP_LINK_SHARED, false);
++      if (err)
++              return ERR_PTR(err);
++      /* -ESTALE if inode as been unlinked and no file is open */
++      if ((inode->i_nlink == 0) && (atomic_read(&inode->i_count) == 1)) {
+               iput(inode);
+               return ERR_PTR(-ESTALE);
+       }
+-- 
+2.25.1
+
diff --git a/queue-5.7/cifs-set-up-next-dfs-target-before-generic_ip_connec.patch b/queue-5.7/cifs-set-up-next-dfs-target-before-generic_ip_connec.patch
new file mode 100644 (file)
index 0000000..56d78d9
--- /dev/null
@@ -0,0 +1,104 @@
+From 15fec5cc9ae1011c609730cf8ee974d47e136b52 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 19 May 2020 15:38:27 -0300
+Subject: cifs: set up next DFS target before generic_ip_connect()
+
+From: Paulo Alcantara <pc@cjr.nz>
+
+[ Upstream commit aaa3aef34d3ab9499a5c7633823429f7a24e6dff ]
+
+If we mount a very specific DFS link
+
+    \\FS0.FOO.COM\dfs\link -> \FS0\share1, \FS1\share2
+
+where its target list contains NB names ("FS0" & "FS1") rather than
+FQDN ones ("FS0.FOO.COM" & "FS1.FOO.COM"), we end up connecting to
+\FOO\share1 but server->hostname will have "FOO.COM".  The reason is
+because both "FS0" and "FS0.FOO.COM" resolve to same IP address and
+they share same TCP server connection, but "FS0.FOO.COM" was the first
+hostname set -- which is OK.
+
+However, if the echo thread timeouts and we still have a good
+connection to "FS0", in cifs_reconnect()
+
+    rc = generic_ip_connect(server) -> success
+    if (rc) {
+            ...
+            reconn_inval_dfs_target(server, cifs_sb, &tgt_list,
+                                   &tgt_it);
+            ...
+     }
+     ...
+
+it successfully reconnects to "FS0" server but does not set up next
+DFS target - which should be the same target server "\FS0\share1" -
+and server->hostname remains set to "FS0.FOO.COM" rather than "FS0",
+as reconn_inval_dfs_target() would have it set to "FS0" if called
+earlier.
+
+Finally, in __smb2_reconnect(), the reconnect of tcons would fail
+because tcon->ses->server->hostname (FS0.FOO.COM) does not match DFS
+target's hostname (FS0).
+
+Fix that by calling reconn_inval_dfs_target() before
+generic_ip_connect() so server->hostname will get updated correctly
+prior to reconnecting its tcons in __smb2_reconnect().
+
+With "cifs: handle hostnames that resolve to same ip in failover"
+patch
+
+    - The above problem would not occur.
+    - We could save an DNS query to find out that they both resolve to
+      the same ip address.
+
+Signed-off-by: Paulo Alcantara (SUSE) <pc@cjr.nz>
+Reviewed-by: Aurelien Aptel <aaptel@suse.com>
+Signed-off-by: Steve French <stfrench@microsoft.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/cifs/connect.c | 18 +++++++++---------
+ 1 file changed, 9 insertions(+), 9 deletions(-)
+
+diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c
+index 28268ed461b82..47b9fbb70bf5e 100644
+--- a/fs/cifs/connect.c
++++ b/fs/cifs/connect.c
+@@ -572,26 +572,26 @@ cifs_reconnect(struct TCP_Server_Info *server)
+               try_to_freeze();
+               mutex_lock(&server->srv_mutex);
++#ifdef CONFIG_CIFS_DFS_UPCALL
+               /*
+                * Set up next DFS target server (if any) for reconnect. If DFS
+                * feature is disabled, then we will retry last server we
+                * connected to before.
+                */
++              reconn_inval_dfs_target(server, cifs_sb, &tgt_list, &tgt_it);
++#endif
++              rc = reconn_set_ipaddr(server);
++              if (rc) {
++                      cifs_dbg(FYI, "%s: failed to resolve hostname: %d\n",
++                               __func__, rc);
++              }
++
+               if (cifs_rdma_enabled(server))
+                       rc = smbd_reconnect(server);
+               else
+                       rc = generic_ip_connect(server);
+               if (rc) {
+                       cifs_dbg(FYI, "reconnect error %d\n", rc);
+-#ifdef CONFIG_CIFS_DFS_UPCALL
+-                      reconn_inval_dfs_target(server, cifs_sb, &tgt_list,
+-                                              &tgt_it);
+-#endif
+-                      rc = reconn_set_ipaddr(server);
+-                      if (rc) {
+-                              cifs_dbg(FYI, "%s: failed to resolve hostname: %d\n",
+-                                       __func__, rc);
+-                      }
+                       mutex_unlock(&server->srv_mutex);
+                       msleep(3000);
+               } else {
+-- 
+2.25.1
+
diff --git a/queue-5.7/clk-ast2600-fix-ahb-clock-divider-for-a1.patch b/queue-5.7/clk-ast2600-fix-ahb-clock-divider-for-a1.patch
new file mode 100644 (file)
index 0000000..3798b5f
--- /dev/null
@@ -0,0 +1,81 @@
+From 89f0d06d77353e0b4ef48d7e2c3cf7f0228455ab Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 8 Apr 2020 15:36:16 -0500
+Subject: clk: ast2600: Fix AHB clock divider for A1
+
+From: Eddie James <eajames@linux.ibm.com>
+
+[ Upstream commit 2d491066ccd4286538450c227fc5094ceb04b494 ]
+
+The latest specs for the AST2600 A1 chip include some different bit
+definitions for calculating the AHB clock divider. Implement these in
+order to get the correct AHB clock value in Linux.
+
+Signed-off-by: Eddie James <eajames@linux.ibm.com>
+Link: https://lkml.kernel.org/r/20200408203616.4031-1-eajames@linux.ibm.com
+Fixes: d3d04f6c330a ("clk: Add support for AST2600 SoC")
+Signed-off-by: Stephen Boyd <sboyd@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/clk/clk-ast2600.c | 31 +++++++++++++++++++++++++------
+ 1 file changed, 25 insertions(+), 6 deletions(-)
+
+diff --git a/drivers/clk/clk-ast2600.c b/drivers/clk/clk-ast2600.c
+index 392d01705b97b..99afc949925f0 100644
+--- a/drivers/clk/clk-ast2600.c
++++ b/drivers/clk/clk-ast2600.c
+@@ -642,14 +642,22 @@ static const u32 ast2600_a0_axi_ahb_div_table[] = {
+       2, 2, 3, 5,
+ };
+-static const u32 ast2600_a1_axi_ahb_div_table[] = {
+-      4, 6, 2, 4,
++static const u32 ast2600_a1_axi_ahb_div0_tbl[] = {
++      3, 2, 3, 4,
++};
++
++static const u32 ast2600_a1_axi_ahb_div1_tbl[] = {
++      3, 4, 6, 8,
++};
++
++static const u32 ast2600_a1_axi_ahb200_tbl[] = {
++      3, 4, 3, 4, 2, 2, 2, 2,
+ };
+ static void __init aspeed_g6_cc(struct regmap *map)
+ {
+       struct clk_hw *hw;
+-      u32 val, div, chip_id, axi_div, ahb_div;
++      u32 val, div, divbits, chip_id, axi_div, ahb_div;
+       clk_hw_register_fixed_rate(NULL, "clkin", NULL, 0, 25000000);
+@@ -679,11 +687,22 @@ static void __init aspeed_g6_cc(struct regmap *map)
+       else
+               axi_div = 2;
++      divbits = (val >> 11) & 0x3;
+       regmap_read(map, ASPEED_G6_SILICON_REV, &chip_id);
+-      if (chip_id & BIT(16))
+-              ahb_div = ast2600_a1_axi_ahb_div_table[(val >> 11) & 0x3];
+-      else
++      if (chip_id & BIT(16)) {
++              if (!divbits) {
++                      ahb_div = ast2600_a1_axi_ahb200_tbl[(val >> 8) & 0x3];
++                      if (val & BIT(16))
++                              ahb_div *= 2;
++              } else {
++                      if (val & BIT(16))
++                              ahb_div = ast2600_a1_axi_ahb_div1_tbl[divbits];
++                      else
++                              ahb_div = ast2600_a1_axi_ahb_div0_tbl[divbits];
++              }
++      } else {
+               ahb_div = ast2600_a0_axi_ahb_div_table[(val >> 11) & 0x3];
++      }
+       hw = clk_hw_register_fixed_factor(NULL, "ahb", "hpll", 0, 1, axi_div * ahb_div);
+       aspeed_g6_clk_data->hws[ASPEED_CLK_AHB] = hw;
+-- 
+2.25.1
+
diff --git a/queue-5.7/clk-bcm2835-fix-return-type-of-bcm2835_register_gate.patch b/queue-5.7/clk-bcm2835-fix-return-type-of-bcm2835_register_gate.patch
new file mode 100644 (file)
index 0000000..692d104
--- /dev/null
@@ -0,0 +1,59 @@
+From 46fe5c291ce6df3c45eeb8d2c22fb1d9fe16a531 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 16 May 2020 01:08:06 -0700
+Subject: clk: bcm2835: Fix return type of bcm2835_register_gate
+
+From: Nathan Chancellor <natechancellor@gmail.com>
+
+[ Upstream commit f376c43bec4f8ee8d1ba5c5c4cfbd6e84fb279cb ]
+
+bcm2835_register_gate is used as a callback for the clk_register member
+of bcm2835_clk_desc, which expects a struct clk_hw * return type but
+bcm2835_register_gate returns a struct clk *.
+
+This discrepancy is hidden by the fact that bcm2835_register_gate is
+cast to the typedef bcm2835_clk_register by the _REGISTER macro. This
+turns out to be a control flow integrity violation, which is how this
+was noticed.
+
+Change the return type of bcm2835_register_gate to be struct clk_hw *
+and use clk_hw_register_gate to do so. This should be a non-functional
+change as clk_register_gate calls clk_hw_register_gate anyways but this
+is needed to avoid issues with further changes.
+
+Fixes: b19f009d4510 ("clk: bcm2835: Migrate to clk_hw based registration and OF APIs")
+Link: https://github.com/ClangBuiltLinux/linux/issues/1028
+Signed-off-by: Nathan Chancellor <natechancellor@gmail.com>
+Link: https://lkml.kernel.org/r/20200516080806.1459784-1-natechancellor@gmail.com
+Signed-off-by: Stephen Boyd <sboyd@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/clk/bcm/clk-bcm2835.c | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+diff --git a/drivers/clk/bcm/clk-bcm2835.c b/drivers/clk/bcm/clk-bcm2835.c
+index ded13ccf768e1..7c845c293af00 100644
+--- a/drivers/clk/bcm/clk-bcm2835.c
++++ b/drivers/clk/bcm/clk-bcm2835.c
+@@ -1448,13 +1448,13 @@ static struct clk_hw *bcm2835_register_clock(struct bcm2835_cprman *cprman,
+       return &clock->hw;
+ }
+-static struct clk *bcm2835_register_gate(struct bcm2835_cprman *cprman,
++static struct clk_hw *bcm2835_register_gate(struct bcm2835_cprman *cprman,
+                                        const struct bcm2835_gate_data *data)
+ {
+-      return clk_register_gate(cprman->dev, data->name, data->parent,
+-                               CLK_IGNORE_UNUSED | CLK_SET_RATE_GATE,
+-                               cprman->regs + data->ctl_reg,
+-                               CM_GATE_BIT, 0, &cprman->regs_lock);
++      return clk_hw_register_gate(cprman->dev, data->name, data->parent,
++                                  CLK_IGNORE_UNUSED | CLK_SET_RATE_GATE,
++                                  cprman->regs + data->ctl_reg,
++                                  CM_GATE_BIT, 0, &cprman->regs_lock);
+ }
+ typedef struct clk_hw *(*bcm2835_clk_register)(struct bcm2835_cprman *cprman,
+-- 
+2.25.1
+
diff --git a/queue-5.7/clk-clk-flexgen-fix-clock-critical-handling.patch b/queue-5.7/clk-clk-flexgen-fix-clock-critical-handling.patch
new file mode 100644 (file)
index 0000000..bfecbdf
--- /dev/null
@@ -0,0 +1,37 @@
+From 7e69682c0212b0b84f6e632cd0364676c1277e6c Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 22 Mar 2020 15:07:40 +0100
+Subject: clk: clk-flexgen: fix clock-critical handling
+
+From: Alain Volmat <avolmat@me.com>
+
+[ Upstream commit a403bbab1a73d798728d76931cab3ff0399b9560 ]
+
+Fixes an issue leading to having all clocks following a critical
+clocks marked as well as criticals.
+
+Fixes: fa6415affe20 ("clk: st: clk-flexgen: Detect critical clocks")
+Signed-off-by: Alain Volmat <avolmat@me.com>
+Link: https://lkml.kernel.org/r/20200322140740.3970-1-avolmat@me.com
+Reviewed-by: Patrice Chotard <patrice.chotard@st.com>
+Signed-off-by: Stephen Boyd <sboyd@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/clk/st/clk-flexgen.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/clk/st/clk-flexgen.c b/drivers/clk/st/clk-flexgen.c
+index 4413b6e04a8ec..55873d4b76032 100644
+--- a/drivers/clk/st/clk-flexgen.c
++++ b/drivers/clk/st/clk-flexgen.c
+@@ -375,6 +375,7 @@ static void __init st_of_flexgen_setup(struct device_node *np)
+                       break;
+               }
++              flex_flags &= ~CLK_IS_CRITICAL;
+               of_clk_detect_critical(np, i, &flex_flags);
+               /*
+-- 
+2.25.1
+
diff --git a/queue-5.7/clk-meson-meson8b-don-t-rely-on-u-boot-to-init-all-g.patch b/queue-5.7/clk-meson-meson8b-don-t-rely-on-u-boot-to-init-all-g.patch
new file mode 100644 (file)
index 0000000..fb94323
--- /dev/null
@@ -0,0 +1,84 @@
+From e75ddd7f0eee3fea6c6cac1d8ca099741908b68a Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 1 May 2020 23:57:17 +0200
+Subject: clk: meson: meson8b: Don't rely on u-boot to init all GP_PLL
+ registers
+
+From: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
+
+[ Upstream commit a29ae8600d50ece1856b062a39ed296b8b952259 ]
+
+Not all u-boot versions initialize the HHI_GP_PLL_CNTL[2-5] registers.
+In that case all HHI_GPLL_PLL_CNTL[1-5] registers are 0x0 and when
+booting Linux the PLL fails to lock.
+The initialization sequence from u-boot is:
+- put the PLL into reset
+- write 0x59C88000 to HHI_GP_PLL_CNTL2
+- write 0xCA463823 to HHI_GP_PLL_CNTL3
+- write 0x0286A027 to HHI_GP_PLL_CNTL4
+- write 0x00003000 to HHI_GP_PLL_CNTL5
+- set M, N, OD and the enable bit
+- take the PLL out of reset
+- check if it has locked
+- disable the PLL
+
+In Linux we already initialize M, N, OD, the enable and the reset bits.
+Also the HHI_GP_PLL_CNTL[2-5] registers with these magic values (the
+exact meaning is unknown) so the PLL can lock when the vendor u-boot did
+not initialize these registers yet.
+
+Fixes: b882964b376f21 ("clk: meson: meson8b: add support for the GP_PLL clock on Meson8m2")
+Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
+Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
+Link: https://lore.kernel.org/r/20200501215717.735393-1-martin.blumenstingl@googlemail.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/clk/meson/meson8b.c | 9 +++++++++
+ drivers/clk/meson/meson8b.h | 4 ++++
+ 2 files changed, 13 insertions(+)
+
+diff --git a/drivers/clk/meson/meson8b.c b/drivers/clk/meson/meson8b.c
+index 5f375799ce46a..11f6b868cf2b5 100644
+--- a/drivers/clk/meson/meson8b.c
++++ b/drivers/clk/meson/meson8b.c
+@@ -1918,6 +1918,13 @@ static struct clk_regmap meson8b_mali = {
+       },
+ };
++static const struct reg_sequence meson8m2_gp_pll_init_regs[] = {
++      { .reg = HHI_GP_PLL_CNTL2,      .def = 0x59c88000 },
++      { .reg = HHI_GP_PLL_CNTL3,      .def = 0xca463823 },
++      { .reg = HHI_GP_PLL_CNTL4,      .def = 0x0286a027 },
++      { .reg = HHI_GP_PLL_CNTL5,      .def = 0x00003000 },
++};
++
+ static const struct pll_params_table meson8m2_gp_pll_params_table[] = {
+       PLL_PARAMS(182, 3),
+       { /* sentinel */ },
+@@ -1951,6 +1958,8 @@ static struct clk_regmap meson8m2_gp_pll_dco = {
+                       .width   = 1,
+               },
+               .table = meson8m2_gp_pll_params_table,
++              .init_regs = meson8m2_gp_pll_init_regs,
++              .init_count = ARRAY_SIZE(meson8m2_gp_pll_init_regs),
+       },
+       .hw.init = &(struct clk_init_data){
+               .name = "gp_pll_dco",
+diff --git a/drivers/clk/meson/meson8b.h b/drivers/clk/meson/meson8b.h
+index c889fbeec30f0..c91fb07fcb657 100644
+--- a/drivers/clk/meson/meson8b.h
++++ b/drivers/clk/meson/meson8b.h
+@@ -20,6 +20,10 @@
+  * [0] http://dn.odroid.com/S805/Datasheet/S805_Datasheet%20V0.8%2020150126.pdf
+  */
+ #define HHI_GP_PLL_CNTL                       0x40  /* 0x10 offset in data sheet */
++#define HHI_GP_PLL_CNTL2              0x44  /* 0x11 offset in data sheet */
++#define HHI_GP_PLL_CNTL3              0x48  /* 0x12 offset in data sheet */
++#define HHI_GP_PLL_CNTL4              0x4C  /* 0x13 offset in data sheet */
++#define HHI_GP_PLL_CNTL5              0x50  /* 0x14 offset in data sheet */
+ #define HHI_VIID_CLK_DIV              0x128 /* 0x4a offset in data sheet */
+ #define HHI_VIID_CLK_CNTL             0x12c /* 0x4b offset in data sheet */
+ #define HHI_GCLK_MPEG0                        0x140 /* 0x50 offset in data sheet */
+-- 
+2.25.1
+
diff --git a/queue-5.7/clk-meson-meson8b-fix-the-first-parent-of-vid_pll_in.patch b/queue-5.7/clk-meson-meson8b-fix-the-first-parent-of-vid_pll_in.patch
new file mode 100644 (file)
index 0000000..05ff7a5
--- /dev/null
@@ -0,0 +1,48 @@
+From d253a7f417340382b76d1d54242cad1c7e5a490f Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 17 Apr 2020 20:41:24 +0200
+Subject: clk: meson: meson8b: Fix the first parent of vid_pll_in_sel
+
+From: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
+
+[ Upstream commit da1978ac3d6cf278dedf5edbf350445a0fff2f08 ]
+
+Use hdmi_pll_lvds_out as parent of the vid_pll_in_sel clock. It's not
+easy to see that the vendor kernel does the same, but it actually does.
+meson_clk_pll_ops in mainline still cannot fully recalculate all rates
+from the HDMI PLL registers because some register bits (at the time of
+writing it's unknown which bits are used for this) double the HDMI PLL
+output rate (compared to simply considering M, N and FRAC) for some (but
+not all) PLL settings.
+
+Update the vid_pll_in_sel parent so our clock calculation works for
+simple clock settings like the CVBS output (where no rate doubling is
+going on). The PLL ops need to be fixed later on for more complex clock
+settings (all HDMI rates).
+
+Fixes: 6cb57c678bb70 ("clk: meson: meson8b: add the read-only video clock trees")
+Suggested-by: Neil Armstrong <narmstrong@baylibre.com>
+Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
+Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
+Link: https://lore.kernel.org/r/20200417184127.1319871-2-martin.blumenstingl@googlemail.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/clk/meson/meson8b.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/clk/meson/meson8b.c b/drivers/clk/meson/meson8b.c
+index 34a70c4b48991..ac4a883acd2ac 100644
+--- a/drivers/clk/meson/meson8b.c
++++ b/drivers/clk/meson/meson8b.c
+@@ -1077,7 +1077,7 @@ static struct clk_regmap meson8b_vid_pll_in_sel = {
+                * Meson8m2: vid2_pll
+                */
+               .parent_hws = (const struct clk_hw *[]) {
+-                      &meson8b_hdmi_pll_dco.hw
++                      &meson8b_hdmi_pll_lvds_out.hw
+               },
+               .num_parents = 1,
+               .flags = CLK_SET_RATE_PARENT,
+-- 
+2.25.1
+
diff --git a/queue-5.7/clk-meson-meson8b-fix-the-polarity-of-the-reset_n-li.patch b/queue-5.7/clk-meson-meson8b-fix-the-polarity-of-the-reset_n-li.patch
new file mode 100644 (file)
index 0000000..e362533
--- /dev/null
@@ -0,0 +1,167 @@
+From 759a0bd35f909fab09f12ffefde7329feafc0c1b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 17 Apr 2020 20:41:25 +0200
+Subject: clk: meson: meson8b: Fix the polarity of the RESET_N lines
+
+From: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
+
+[ Upstream commit 0d3051c790ed2ef6bd91b92b07220313f06b95b3 ]
+
+CLKC_RESET_VID_DIVIDER_CNTL_RESET_N_POST and
+CLKC_RESET_VID_DIVIDER_CNTL_RESET_N_PRE are active low. This means:
+- asserting them requires setting the register value to 0
+- de-asserting them requires setting the register value to 1
+
+Set the register value accordingly for these two reset lines by setting
+the inverted the register value compared to all other reset lines.
+
+Fixes: 189621726bc2f6 ("clk: meson: meson8b: register the built-in reset controller")
+Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
+Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
+Link: https://lore.kernel.org/r/20200417184127.1319871-3-martin.blumenstingl@googlemail.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/clk/meson/meson8b.c | 79 ++++++++++++++++++++++++++-----------
+ 1 file changed, 56 insertions(+), 23 deletions(-)
+
+diff --git a/drivers/clk/meson/meson8b.c b/drivers/clk/meson/meson8b.c
+index ac4a883acd2ac..ecd78cdca8ce3 100644
+--- a/drivers/clk/meson/meson8b.c
++++ b/drivers/clk/meson/meson8b.c
+@@ -3506,54 +3506,87 @@ static struct clk_regmap *const meson8b_clk_regmaps[] = {
+ static const struct meson8b_clk_reset_line {
+       u32 reg;
+       u8 bit_idx;
++      bool active_low;
+ } meson8b_clk_reset_bits[] = {
+       [CLKC_RESET_L2_CACHE_SOFT_RESET] = {
+-              .reg = HHI_SYS_CPU_CLK_CNTL0, .bit_idx = 30
++              .reg = HHI_SYS_CPU_CLK_CNTL0,
++              .bit_idx = 30,
++              .active_low = false,
+       },
+       [CLKC_RESET_AXI_64_TO_128_BRIDGE_A5_SOFT_RESET] = {
+-              .reg = HHI_SYS_CPU_CLK_CNTL0, .bit_idx = 29
++              .reg = HHI_SYS_CPU_CLK_CNTL0,
++              .bit_idx = 29,
++              .active_low = false,
+       },
+       [CLKC_RESET_SCU_SOFT_RESET] = {
+-              .reg = HHI_SYS_CPU_CLK_CNTL0, .bit_idx = 28
++              .reg = HHI_SYS_CPU_CLK_CNTL0,
++              .bit_idx = 28,
++              .active_low = false,
+       },
+       [CLKC_RESET_CPU3_SOFT_RESET] = {
+-              .reg = HHI_SYS_CPU_CLK_CNTL0, .bit_idx = 27
++              .reg = HHI_SYS_CPU_CLK_CNTL0,
++              .bit_idx = 27,
++              .active_low = false,
+       },
+       [CLKC_RESET_CPU2_SOFT_RESET] = {
+-              .reg = HHI_SYS_CPU_CLK_CNTL0, .bit_idx = 26
++              .reg = HHI_SYS_CPU_CLK_CNTL0,
++              .bit_idx = 26,
++              .active_low = false,
+       },
+       [CLKC_RESET_CPU1_SOFT_RESET] = {
+-              .reg = HHI_SYS_CPU_CLK_CNTL0, .bit_idx = 25
++              .reg = HHI_SYS_CPU_CLK_CNTL0,
++              .bit_idx = 25,
++              .active_low = false,
+       },
+       [CLKC_RESET_CPU0_SOFT_RESET] = {
+-              .reg = HHI_SYS_CPU_CLK_CNTL0, .bit_idx = 24
++              .reg = HHI_SYS_CPU_CLK_CNTL0,
++              .bit_idx = 24,
++              .active_low = false,
+       },
+       [CLKC_RESET_A5_GLOBAL_RESET] = {
+-              .reg = HHI_SYS_CPU_CLK_CNTL0, .bit_idx = 18
++              .reg = HHI_SYS_CPU_CLK_CNTL0,
++              .bit_idx = 18,
++              .active_low = false,
+       },
+       [CLKC_RESET_A5_AXI_SOFT_RESET] = {
+-              .reg = HHI_SYS_CPU_CLK_CNTL0, .bit_idx = 17
++              .reg = HHI_SYS_CPU_CLK_CNTL0,
++              .bit_idx = 17,
++              .active_low = false,
+       },
+       [CLKC_RESET_A5_ABP_SOFT_RESET] = {
+-              .reg = HHI_SYS_CPU_CLK_CNTL0, .bit_idx = 16
++              .reg = HHI_SYS_CPU_CLK_CNTL0,
++              .bit_idx = 16,
++              .active_low = false,
+       },
+       [CLKC_RESET_AXI_64_TO_128_BRIDGE_MMC_SOFT_RESET] = {
+-              .reg = HHI_SYS_CPU_CLK_CNTL1, .bit_idx = 30
++              .reg = HHI_SYS_CPU_CLK_CNTL1,
++              .bit_idx = 30,
++              .active_low = false,
+       },
+       [CLKC_RESET_VID_CLK_CNTL_SOFT_RESET] = {
+-              .reg = HHI_VID_CLK_CNTL, .bit_idx = 15
++              .reg = HHI_VID_CLK_CNTL,
++              .bit_idx = 15,
++              .active_low = false,
+       },
+       [CLKC_RESET_VID_DIVIDER_CNTL_SOFT_RESET_POST] = {
+-              .reg = HHI_VID_DIVIDER_CNTL, .bit_idx = 7
++              .reg = HHI_VID_DIVIDER_CNTL,
++              .bit_idx = 7,
++              .active_low = false,
+       },
+       [CLKC_RESET_VID_DIVIDER_CNTL_SOFT_RESET_PRE] = {
+-              .reg = HHI_VID_DIVIDER_CNTL, .bit_idx = 3
++              .reg = HHI_VID_DIVIDER_CNTL,
++              .bit_idx = 3,
++              .active_low = false,
+       },
+       [CLKC_RESET_VID_DIVIDER_CNTL_RESET_N_POST] = {
+-              .reg = HHI_VID_DIVIDER_CNTL, .bit_idx = 1
++              .reg = HHI_VID_DIVIDER_CNTL,
++              .bit_idx = 1,
++              .active_low = true,
+       },
+       [CLKC_RESET_VID_DIVIDER_CNTL_RESET_N_PRE] = {
+-              .reg = HHI_VID_DIVIDER_CNTL, .bit_idx = 0
++              .reg = HHI_VID_DIVIDER_CNTL,
++              .bit_idx = 0,
++              .active_low = true,
+       },
+ };
+@@ -3562,22 +3595,22 @@ static int meson8b_clk_reset_update(struct reset_controller_dev *rcdev,
+ {
+       struct meson8b_clk_reset *meson8b_clk_reset =
+               container_of(rcdev, struct meson8b_clk_reset, reset);
+-      unsigned long flags;
+       const struct meson8b_clk_reset_line *reset;
++      unsigned int value = 0;
++      unsigned long flags;
+       if (id >= ARRAY_SIZE(meson8b_clk_reset_bits))
+               return -EINVAL;
+       reset = &meson8b_clk_reset_bits[id];
++      if (assert != reset->active_low)
++              value = BIT(reset->bit_idx);
++
+       spin_lock_irqsave(&meson_clk_lock, flags);
+-      if (assert)
+-              regmap_update_bits(meson8b_clk_reset->regmap, reset->reg,
+-                                 BIT(reset->bit_idx), BIT(reset->bit_idx));
+-      else
+-              regmap_update_bits(meson8b_clk_reset->regmap, reset->reg,
+-                                 BIT(reset->bit_idx), 0);
++      regmap_update_bits(meson8b_clk_reset->regmap, reset->reg,
++                         BIT(reset->bit_idx), value);
+       spin_unlock_irqrestore(&meson_clk_lock, flags);
+-- 
+2.25.1
+
diff --git a/queue-5.7/clk-meson-meson8b-fix-the-vclk_div-1-2-4-6-12-_en-ga.patch b/queue-5.7/clk-meson-meson8b-fix-the-vclk_div-1-2-4-6-12-_en-ga.patch
new file mode 100644 (file)
index 0000000..977de6d
--- /dev/null
@@ -0,0 +1,81 @@
+From 8a0971428fbec2f968da3f115ae8e3c23d71c912 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 17 Apr 2020 20:41:26 +0200
+Subject: clk: meson: meson8b: Fix the vclk_div{1, 2, 4, 6, 12}_en gate bits
+
+From: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
+
+[ Upstream commit 8bb629cfb28f4dad9d47f69249366e50ae5edc25 ]
+
+The DIV{1,2,4,6,12}_EN bits are actually located in HHI_VID_CLK_CNTL
+register:
+- HHI_VID_CLK_CNTL[0] = DIV1_EN
+- HHI_VID_CLK_CNTL[1] = DIV2_EN
+- HHI_VID_CLK_CNTL[2] = DIV4_EN
+- HHI_VID_CLK_CNTL[3] = DIV6_EN
+- HHI_VID_CLK_CNTL[4] = DIV12_EN
+
+Update the bits accordingly so we will enable the bits in the correct
+register once we switch these clocks to be mutable.
+
+Fixes: 6cb57c678bb70e ("clk: meson: meson8b: add the read-only video clock trees")
+Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
+Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
+Link: https://lore.kernel.org/r/20200417184127.1319871-4-martin.blumenstingl@googlemail.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/clk/meson/meson8b.c | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+diff --git a/drivers/clk/meson/meson8b.c b/drivers/clk/meson/meson8b.c
+index ecd78cdca8ce3..5f375799ce46a 100644
+--- a/drivers/clk/meson/meson8b.c
++++ b/drivers/clk/meson/meson8b.c
+@@ -1213,7 +1213,7 @@ static struct clk_regmap meson8b_vclk_in_en = {
+ static struct clk_regmap meson8b_vclk_div1_gate = {
+       .data = &(struct clk_regmap_gate_data){
+-              .offset = HHI_VID_CLK_DIV,
++              .offset = HHI_VID_CLK_CNTL,
+               .bit_idx = 0,
+       },
+       .hw.init = &(struct clk_init_data){
+@@ -1243,7 +1243,7 @@ static struct clk_fixed_factor meson8b_vclk_div2_div = {
+ static struct clk_regmap meson8b_vclk_div2_div_gate = {
+       .data = &(struct clk_regmap_gate_data){
+-              .offset = HHI_VID_CLK_DIV,
++              .offset = HHI_VID_CLK_CNTL,
+               .bit_idx = 1,
+       },
+       .hw.init = &(struct clk_init_data){
+@@ -1273,7 +1273,7 @@ static struct clk_fixed_factor meson8b_vclk_div4_div = {
+ static struct clk_regmap meson8b_vclk_div4_div_gate = {
+       .data = &(struct clk_regmap_gate_data){
+-              .offset = HHI_VID_CLK_DIV,
++              .offset = HHI_VID_CLK_CNTL,
+               .bit_idx = 2,
+       },
+       .hw.init = &(struct clk_init_data){
+@@ -1303,7 +1303,7 @@ static struct clk_fixed_factor meson8b_vclk_div6_div = {
+ static struct clk_regmap meson8b_vclk_div6_div_gate = {
+       .data = &(struct clk_regmap_gate_data){
+-              .offset = HHI_VID_CLK_DIV,
++              .offset = HHI_VID_CLK_CNTL,
+               .bit_idx = 3,
+       },
+       .hw.init = &(struct clk_init_data){
+@@ -1333,7 +1333,7 @@ static struct clk_fixed_factor meson8b_vclk_div12_div = {
+ static struct clk_regmap meson8b_vclk_div12_div_gate = {
+       .data = &(struct clk_regmap_gate_data){
+-              .offset = HHI_VID_CLK_DIV,
++              .offset = HHI_VID_CLK_CNTL,
+               .bit_idx = 4,
+       },
+       .hw.init = &(struct clk_init_data){
+-- 
+2.25.1
+
diff --git a/queue-5.7/clk-qcom-msm8916-fix-the-address-location-of-pll-con.patch b/queue-5.7/clk-qcom-msm8916-fix-the-address-location-of-pll-con.patch
new file mode 100644 (file)
index 0000000..8d80749
--- /dev/null
@@ -0,0 +1,94 @@
+From f37599088e7f0ba943bdd918dc9e999dad119cc2 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 29 Mar 2020 13:41:16 +0100
+Subject: clk: qcom: msm8916: Fix the address location of pll->config_reg
+
+From: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
+
+[ Upstream commit f47ab3c2f5338828a67e89d5f688d2cef9605245 ]
+
+During the process of debugging a processor derived from the msm8916 which
+we found the new processor was not starting one of its PLLs.
+
+After tracing the addresses and writes that downstream was doing and
+comparing to upstream it became obvious that we were writing to a different
+register location than downstream when trying to configure the PLL.
+
+This error is also present in upstream msm8916.
+
+As an example clk-pll.c::clk_pll_recalc_rate wants to write to
+pll->config_reg updating the bit-field POST_DIV_RATIO. That bit-field is
+defined in PLL_USER_CTL not in PLL_CONFIG_CTL. Taking the BIMC PLL as an
+example
+
+lm80-p0436-13_c_qc_snapdragon_410_processor_hrd.pdf
+
+0x01823010 GCC_BIMC_PLL_USER_CTL
+0x01823014 GCC_BIMC_PLL_CONFIG_CTL
+
+This pattern is repeated for gpll0, gpll1, gpll2 and bimc_pll.
+
+This error is likely not apparent since the bootloader will already have
+initialized these PLLs.
+
+This patch corrects the location of config_reg from PLL_CONFIG_CTL to
+PLL_USER_CTL for all relevant PLLs on msm8916.
+
+Fixes commit 3966fab8b6ab ("clk: qcom: Add MSM8916 Global Clock Controller support")
+
+Cc: Georgi Djakov <georgi.djakov@linaro.org>
+Cc: Andy Gross <agross@kernel.org>
+Cc: Bjorn Andersson <bjorn.andersson@linaro.org>
+Cc: Michael Turquette <mturquette@baylibre.com>
+Cc: Stephen Boyd <sboyd@kernel.org>
+Signed-off-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
+Link: https://lkml.kernel.org/r/20200329124116.4185447-1-bryan.odonoghue@linaro.org
+Signed-off-by: Stephen Boyd <sboyd@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/clk/qcom/gcc-msm8916.c | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/clk/qcom/gcc-msm8916.c b/drivers/clk/qcom/gcc-msm8916.c
+index 4e329a7baf2ba..17e4a5a2a9fde 100644
+--- a/drivers/clk/qcom/gcc-msm8916.c
++++ b/drivers/clk/qcom/gcc-msm8916.c
+@@ -260,7 +260,7 @@ static struct clk_pll gpll0 = {
+       .l_reg = 0x21004,
+       .m_reg = 0x21008,
+       .n_reg = 0x2100c,
+-      .config_reg = 0x21014,
++      .config_reg = 0x21010,
+       .mode_reg = 0x21000,
+       .status_reg = 0x2101c,
+       .status_bit = 17,
+@@ -287,7 +287,7 @@ static struct clk_pll gpll1 = {
+       .l_reg = 0x20004,
+       .m_reg = 0x20008,
+       .n_reg = 0x2000c,
+-      .config_reg = 0x20014,
++      .config_reg = 0x20010,
+       .mode_reg = 0x20000,
+       .status_reg = 0x2001c,
+       .status_bit = 17,
+@@ -314,7 +314,7 @@ static struct clk_pll gpll2 = {
+       .l_reg = 0x4a004,
+       .m_reg = 0x4a008,
+       .n_reg = 0x4a00c,
+-      .config_reg = 0x4a014,
++      .config_reg = 0x4a010,
+       .mode_reg = 0x4a000,
+       .status_reg = 0x4a01c,
+       .status_bit = 17,
+@@ -341,7 +341,7 @@ static struct clk_pll bimc_pll = {
+       .l_reg = 0x23004,
+       .m_reg = 0x23008,
+       .n_reg = 0x2300c,
+-      .config_reg = 0x23014,
++      .config_reg = 0x23010,
+       .mode_reg = 0x23000,
+       .status_reg = 0x2301c,
+       .status_bit = 17,
+-- 
+2.25.1
+
diff --git a/queue-5.7/clk-renesas-cpg-mssr-fix-stbcr-suspend-resume-handli.patch b/queue-5.7/clk-renesas-cpg-mssr-fix-stbcr-suspend-resume-handli.patch
new file mode 100644 (file)
index 0000000..ff46916
--- /dev/null
@@ -0,0 +1,60 @@
+From 77426985a11e590347a66ed9146d75a41a3453f0 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 7 May 2020 09:47:13 +0200
+Subject: clk: renesas: cpg-mssr: Fix STBCR suspend/resume handling
+
+From: Geert Uytterhoeven <geert+renesas@glider.be>
+
+[ Upstream commit ace342097768e35fd41934285604fa97da1e235a ]
+
+On SoCs with Standby Control Registers (STBCRs) instead of Module Stop
+Control Registers (MSTPCRs), the suspend handler saves the wrong
+registers, and the resume handler prints the wrong register in an error
+message.
+
+Fortunately this cannot happen yet, as the suspend/resume code is used
+on PSCI systems only, and systems with STBCRs (RZ/A1 and RZ/A2) do not
+use PSCI.  Still, it is better to fix this, to avoid this becoming a
+problem in the future.
+
+Distinguish between STBCRs and MSTPCRs where needed.  Replace the
+useless printing of the virtual register address in the resume error
+message by printing the register index.
+
+Fixes: fde35c9c7db5732c ("clk: renesas: cpg-mssr: Add R7S9210 support")
+Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
+Link: https://lore.kernel.org/r/20200507074713.30113-1-geert+renesas@glider.be
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/clk/renesas/renesas-cpg-mssr.c | 8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/clk/renesas/renesas-cpg-mssr.c b/drivers/clk/renesas/renesas-cpg-mssr.c
+index a2663fbbd7a51..d6a53c99b114a 100644
+--- a/drivers/clk/renesas/renesas-cpg-mssr.c
++++ b/drivers/clk/renesas/renesas-cpg-mssr.c
+@@ -812,7 +812,8 @@ static int cpg_mssr_suspend_noirq(struct device *dev)
+       /* Save module registers with bits under our control */
+       for (reg = 0; reg < ARRAY_SIZE(priv->smstpcr_saved); reg++) {
+               if (priv->smstpcr_saved[reg].mask)
+-                      priv->smstpcr_saved[reg].val =
++                      priv->smstpcr_saved[reg].val = priv->stbyctrl ?
++                              readb(priv->base + STBCR(reg)) :
+                               readl(priv->base + SMSTPCR(reg));
+       }
+@@ -872,8 +873,9 @@ static int cpg_mssr_resume_noirq(struct device *dev)
+               }
+               if (!i)
+-                      dev_warn(dev, "Failed to enable SMSTP %p[0x%x]\n",
+-                               priv->base + SMSTPCR(reg), oldval & mask);
++                      dev_warn(dev, "Failed to enable %s%u[0x%x]\n",
++                               priv->stbyctrl ? "STB" : "SMSTP", reg,
++                               oldval & mask);
+       }
+       return 0;
+-- 
+2.25.1
+
diff --git a/queue-5.7/clk-samsung-exynos5433-add-ignore_unused-flag-to-scl.patch b/queue-5.7/clk-samsung-exynos5433-add-ignore_unused-flag-to-scl.patch
new file mode 100644 (file)
index 0000000..061550e
--- /dev/null
@@ -0,0 +1,68 @@
+From 9826ea5d54de664c10660f86f13f5fd67f038554 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 19 May 2020 12:26:52 +0200
+Subject: clk: samsung: exynos5433: Add IGNORE_UNUSED flag to sclk_i2s1
+
+From: Marek Szyprowski <m.szyprowski@samsung.com>
+
+[ Upstream commit 25bdae0f1c6609ceaf55fe6700654f0be2253d8e ]
+
+Mark the SCLK clock for Exynos5433 I2S1 device with IGNORE_UNUSED flag to
+match its behaviour with SCLK clock for AUD_I2S (I2S0) device until
+a proper fix for Exynos I2S driver is ready.
+
+This fixes the following synchronous abort issue revealed by the probe
+order change caused by the commit 93d2e4322aa7 ("of: platform: Batch
+fwnode parsing when adding all top level devices")
+
+Internal error: synchronous external abort: 96000210 [#1] PREEMPT SMP
+Modules linked in:
+CPU: 0 PID: 50 Comm: kworker/0:1 Not tainted 5.7.0-rc5+ #701
+Hardware name: Samsung TM2E board (DT)
+Workqueue: events deferred_probe_work_func
+pstate: 60000005 (nZCv daif -PAN -UAO)
+pc : samsung_i2s_probe+0x768/0x8f0
+lr : samsung_i2s_probe+0x688/0x8f0
+...
+Call trace:
+ samsung_i2s_probe+0x768/0x8f0
+ platform_drv_probe+0x50/0xa8
+ really_probe+0x108/0x370
+ driver_probe_device+0x54/0xb8
+ __device_attach_driver+0x90/0xc0
+ bus_for_each_drv+0x70/0xc8
+ __device_attach+0xdc/0x140
+ device_initial_probe+0x10/0x18
+ bus_probe_device+0x94/0xa0
+ deferred_probe_work_func+0x70/0xa8
+ process_one_work+0x2a8/0x718
+ worker_thread+0x48/0x470
+ kthread+0x134/0x160
+ ret_from_fork+0x10/0x1c
+Code: 17ffffaf d503201f f94086c0 91003000 (88dffc00)
+---[ end trace ccf721c9400ddbd6 ]---
+
+Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
+Signed-off-by: Sylwester Nawrocki <s.nawrocki@samsung.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/clk/samsung/clk-exynos5433.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/clk/samsung/clk-exynos5433.c b/drivers/clk/samsung/clk-exynos5433.c
+index 4b1aa9382ad28..6f29ecd0442e1 100644
+--- a/drivers/clk/samsung/clk-exynos5433.c
++++ b/drivers/clk/samsung/clk-exynos5433.c
+@@ -1706,7 +1706,8 @@ static const struct samsung_gate_clock peric_gate_clks[] __initconst = {
+       GATE(CLK_SCLK_PCM1, "sclk_pcm1", "sclk_pcm1_peric",
+                       ENABLE_SCLK_PERIC, 7, CLK_SET_RATE_PARENT, 0),
+       GATE(CLK_SCLK_I2S1, "sclk_i2s1", "sclk_i2s1_peric",
+-                      ENABLE_SCLK_PERIC, 6, CLK_SET_RATE_PARENT, 0),
++                      ENABLE_SCLK_PERIC, 6,
++                      CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 0),
+       GATE(CLK_SCLK_SPI2, "sclk_spi2", "sclk_spi2_peric", ENABLE_SCLK_PERIC,
+                       5, CLK_SET_RATE_PARENT, 0),
+       GATE(CLK_SCLK_SPI1, "sclk_spi1", "sclk_spi1_peric", ENABLE_SCLK_PERIC,
+-- 
+2.25.1
+
diff --git a/queue-5.7/clk-samsung-mark-top-isp-and-cam-clocks-on-exynos542.patch b/queue-5.7/clk-samsung-mark-top-isp-and-cam-clocks-on-exynos542.patch
new file mode 100644 (file)
index 0000000..88ad15f
--- /dev/null
@@ -0,0 +1,92 @@
+From 516e30112f8330389fba6776acc9d7b879d483e4 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 6 May 2020 15:26:58 +0200
+Subject: clk: samsung: Mark top ISP and CAM clocks on Exynos542x as critical
+
+From: Marek Szyprowski <m.szyprowski@samsung.com>
+
+[ Upstream commit e47bd937e602bb4379546095d1bd0b9871fa60c2 ]
+
+The TOP 'aclk*_isp', 'aclk550_cam', 'gscl_wa' and 'gscl_wb' clocks must
+be kept enabled all the time to allow proper access to power management
+control for the ISP and CAM power domains. The last two clocks, although
+related to GScaler device and GSCL power domain, provides also the
+I_WRAP_CLK signal to MIPI CSIS0/1 devices, which are a part of CAM power
+domain and are needed for proper power on/off sequence.
+
+Currently there are no drivers for the devices, which are part of CAM and
+ISP power domains yet. This patch only fixes the race between disabling
+the unused power domains and disabling unused clocks, which randomly
+resulted in the following error during boot:
+
+Power domain CAM disable failed
+Power domain ISP disable failed
+
+Fixes: 318fa46cc60d ("clk/samsung: exynos542x: mark some clocks as critical")
+Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
+Acked-by: Chanwoo Choi <cw00.choi@samsung.com>
+Signed-off-by: Sylwester Nawrocki <s.nawrocki@samsung.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/clk/samsung/clk-exynos5420.c | 16 +++++++++-------
+ 1 file changed, 9 insertions(+), 7 deletions(-)
+
+diff --git a/drivers/clk/samsung/clk-exynos5420.c b/drivers/clk/samsung/clk-exynos5420.c
+index c9e5a1fb66539..edb2363c735af 100644
+--- a/drivers/clk/samsung/clk-exynos5420.c
++++ b/drivers/clk/samsung/clk-exynos5420.c
+@@ -540,7 +540,7 @@ static const struct samsung_div_clock exynos5800_div_clks[] __initconst = {
+ static const struct samsung_gate_clock exynos5800_gate_clks[] __initconst = {
+       GATE(CLK_ACLK550_CAM, "aclk550_cam", "mout_user_aclk550_cam",
+-                              GATE_BUS_TOP, 24, 0, 0),
++                              GATE_BUS_TOP, 24, CLK_IS_CRITICAL, 0),
+       GATE(CLK_ACLK432_SCALER, "aclk432_scaler", "mout_user_aclk432_scaler",
+                               GATE_BUS_TOP, 27, CLK_IS_CRITICAL, 0),
+ };
+@@ -943,25 +943,25 @@ static const struct samsung_gate_clock exynos5x_gate_clks[] __initconst = {
+       GATE(0, "aclk300_jpeg", "mout_user_aclk300_jpeg",
+                       GATE_BUS_TOP, 4, CLK_IGNORE_UNUSED, 0),
+       GATE(0, "aclk333_432_isp0", "mout_user_aclk333_432_isp0",
+-                      GATE_BUS_TOP, 5, 0, 0),
++                      GATE_BUS_TOP, 5, CLK_IS_CRITICAL, 0),
+       GATE(0, "aclk300_gscl", "mout_user_aclk300_gscl",
+                       GATE_BUS_TOP, 6, CLK_IS_CRITICAL, 0),
+       GATE(0, "aclk333_432_gscl", "mout_user_aclk333_432_gscl",
+                       GATE_BUS_TOP, 7, CLK_IGNORE_UNUSED, 0),
+       GATE(0, "aclk333_432_isp", "mout_user_aclk333_432_isp",
+-                      GATE_BUS_TOP, 8, 0, 0),
++                      GATE_BUS_TOP, 8, CLK_IS_CRITICAL, 0),
+       GATE(CLK_PCLK66_GPIO, "pclk66_gpio", "mout_user_pclk66_gpio",
+                       GATE_BUS_TOP, 9, CLK_IGNORE_UNUSED, 0),
+       GATE(0, "aclk66_psgen", "mout_user_aclk66_psgen",
+                       GATE_BUS_TOP, 10, CLK_IGNORE_UNUSED, 0),
+       GATE(0, "aclk266_isp", "mout_user_aclk266_isp",
+-                      GATE_BUS_TOP, 13, 0, 0),
++                      GATE_BUS_TOP, 13, CLK_IS_CRITICAL, 0),
+       GATE(0, "aclk166", "mout_user_aclk166",
+                       GATE_BUS_TOP, 14, CLK_IGNORE_UNUSED, 0),
+       GATE(CLK_ACLK333, "aclk333", "mout_user_aclk333",
+                       GATE_BUS_TOP, 15, CLK_IS_CRITICAL, 0),
+       GATE(0, "aclk400_isp", "mout_user_aclk400_isp",
+-                      GATE_BUS_TOP, 16, 0, 0),
++                      GATE_BUS_TOP, 16, CLK_IS_CRITICAL, 0),
+       GATE(0, "aclk400_mscl", "mout_user_aclk400_mscl",
+                       GATE_BUS_TOP, 17, CLK_IS_CRITICAL, 0),
+       GATE(0, "aclk200_disp1", "mout_user_aclk200_disp1",
+@@ -1161,8 +1161,10 @@ static const struct samsung_gate_clock exynos5x_gate_clks[] __initconst = {
+                       GATE_IP_GSCL1, 3, 0, 0),
+       GATE(CLK_SMMU_FIMCL1, "smmu_fimcl1", "dout_gscl_blk_333",
+                       GATE_IP_GSCL1, 4, 0, 0),
+-      GATE(CLK_GSCL_WA, "gscl_wa", "sclk_gscl_wa", GATE_IP_GSCL1, 12, 0, 0),
+-      GATE(CLK_GSCL_WB, "gscl_wb", "sclk_gscl_wb", GATE_IP_GSCL1, 13, 0, 0),
++      GATE(CLK_GSCL_WA, "gscl_wa", "sclk_gscl_wa", GATE_IP_GSCL1, 12,
++                      CLK_IS_CRITICAL, 0),
++      GATE(CLK_GSCL_WB, "gscl_wb", "sclk_gscl_wb", GATE_IP_GSCL1, 13,
++                      CLK_IS_CRITICAL, 0),
+       GATE(CLK_SMMU_FIMCL3, "smmu_fimcl3,", "dout_gscl_blk_333",
+                       GATE_IP_GSCL1, 16, 0, 0),
+       GATE(CLK_FIMC_LITE3, "fimc_lite3", "aclk333_432_gscl",
+-- 
+2.25.1
+
diff --git a/queue-5.7/clk-sprd-fix-compile-testing.patch b/queue-5.7/clk-sprd-fix-compile-testing.patch
new file mode 100644 (file)
index 0000000..a3fbeb8
--- /dev/null
@@ -0,0 +1,78 @@
+From 6996387cd3c43dbdd65e8a90ef601699e913199f Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 7 Apr 2020 16:21:46 +0200
+Subject: clk: sprd: fix compile-testing
+
+From: Arnd Bergmann <arnd@arndb.de>
+
+[ Upstream commit b5f73d47f34b238221ac771b5fe4907df621d7cb ]
+
+I got a build failure with CONFIG_ARCH_SPRD=m when the
+main portion of the clock driver failed to get linked into
+the kernel:
+
+ERROR: modpost: "sprd_pll_sc_gate_ops" [drivers/clk/sprd/sc9863a-clk.ko] undefined!
+ERROR: modpost: "sprd_pll_ops" [drivers/clk/sprd/sc9863a-clk.ko] undefined!
+ERROR: modpost: "sprd_div_ops" [drivers/clk/sprd/sc9863a-clk.ko] undefined!
+ERROR: modpost: "sprd_comp_ops" [drivers/clk/sprd/sc9863a-clk.ko] undefined!
+ERROR: modpost: "sprd_mux_ops" [drivers/clk/sprd/sc9863a-clk.ko] undefined!
+ERROR: modpost: "sprd_gate_ops" [drivers/clk/sprd/sc9863a-clk.ko] undefined!
+ERROR: modpost: "sprd_sc_gate_ops" [drivers/clk/sprd/sc9863a-clk.ko] undefined!
+ERROR: modpost: "sprd_clk_probe" [drivers/clk/sprd/sc9863a-clk.ko] undefined!
+ERROR: modpost: "sprd_clk_regmap_init" [drivers/clk/sprd/sc9863a-clk.ko] undefined!
+ERROR: modpost: "sprd_pll_ops" [drivers/clk/sprd/sc9860-clk.ko] undefined!
+ERROR: modpost: "sprd_div_ops" [drivers/clk/sprd/sc9860-clk.ko] undefined!
+ERROR: modpost: "sprd_mux_ops" [drivers/clk/sprd/sc9860-clk.ko] undefined!
+
+This is a combination of two trivial bugs:
+
+- A platform should not be 'tristate', it should be a 'bool' symbol
+  like the other platforms, if only for consistency, and to avoid
+  surprises like this one.
+
+- The clk Makefile does not traverse into the sprd subdirectory
+  if the platform is disabled but the drivers are enabled for
+  compile-testing.
+
+Fixing either of the two would be sufficient to address the link failure,
+but for correctness, both need to be changed.
+
+Fixes: 2b1b799d7630 ("arm64: change ARCH_SPRD Kconfig to tristate")
+Fixes: d41f59fd92f2 ("clk: sprd: Add common infrastructure")
+Acked-by: Chunyan Zhang <chunyan.zhang@unisoc.com>
+Signed-off-by: Arnd Bergmann <arnd@arndb.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/arm64/Kconfig.platforms | 2 +-
+ drivers/clk/Makefile         | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/arch/arm64/Kconfig.platforms b/arch/arm64/Kconfig.platforms
+index 55d70cfe0f9e1..3c7e310fd8bfa 100644
+--- a/arch/arm64/Kconfig.platforms
++++ b/arch/arm64/Kconfig.platforms
+@@ -248,7 +248,7 @@ config ARCH_TEGRA
+         This enables support for the NVIDIA Tegra SoC family.
+ config ARCH_SPRD
+-      tristate "Spreadtrum SoC platform"
++      bool "Spreadtrum SoC platform"
+       help
+         Support for Spreadtrum ARM based SoCs
+diff --git a/drivers/clk/Makefile b/drivers/clk/Makefile
+index f4169cc2fd318..60e811d3f226d 100644
+--- a/drivers/clk/Makefile
++++ b/drivers/clk/Makefile
+@@ -105,7 +105,7 @@ obj-$(CONFIG_CLK_SIFIVE)           += sifive/
+ obj-$(CONFIG_ARCH_SIRF)                       += sirf/
+ obj-$(CONFIG_ARCH_SOCFPGA)            += socfpga/
+ obj-$(CONFIG_PLAT_SPEAR)              += spear/
+-obj-$(CONFIG_ARCH_SPRD)                       += sprd/
++obj-y                                 += sprd/
+ obj-$(CONFIG_ARCH_STI)                        += st/
+ obj-$(CONFIG_ARCH_STRATIX10)          += socfpga/
+ obj-$(CONFIG_ARCH_SUNXI)              += sunxi/
+-- 
+2.25.1
+
diff --git a/queue-5.7/clk-sprd-return-correct-type-of-value-for-_sprd_pll_.patch b/queue-5.7/clk-sprd-return-correct-type-of-value-for-_sprd_pll_.patch
new file mode 100644 (file)
index 0000000..731c047
--- /dev/null
@@ -0,0 +1,41 @@
+From bd2371cd7b0efa7ded5ee42ad5f223aee0f088e0 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 19 May 2020 11:00:36 +0800
+Subject: clk: sprd: return correct type of value for _sprd_pll_recalc_rate
+
+From: Chunyan Zhang <chunyan.zhang@unisoc.com>
+
+[ Upstream commit c2f30986d418f26abefc2eec90ebf06716c970d2 ]
+
+The function _sprd_pll_recalc_rate() defines return value to unsigned
+long, but it would return a negative value when malloc fail, changing
+to return its parent_rate makes more sense, since if the callback
+.recalc_rate() is not set, the framework returns the parent_rate as
+well.
+
+Fixes: 3e37b005580b ("clk: sprd: add adjustable pll support")
+Signed-off-by: Chunyan Zhang <chunyan.zhang@unisoc.com>
+Link: https://lkml.kernel.org/r/20200519030036.1785-2-zhang.lyra@gmail.com
+Reviewed-by: Baolin Wang <baolin.wang7@gmail.com>
+Signed-off-by: Stephen Boyd <sboyd@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/clk/sprd/pll.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/clk/sprd/pll.c b/drivers/clk/sprd/pll.c
+index 15791484388fa..13a322b2535ac 100644
+--- a/drivers/clk/sprd/pll.c
++++ b/drivers/clk/sprd/pll.c
+@@ -106,7 +106,7 @@ static unsigned long _sprd_pll_recalc_rate(const struct sprd_pll *pll,
+       cfg = kcalloc(regs_num, sizeof(*cfg), GFP_KERNEL);
+       if (!cfg)
+-              return -ENOMEM;
++              return parent_rate;
+       for (i = 0; i < regs_num; i++)
+               cfg[i] = sprd_pll_read(pll, i);
+-- 
+2.25.1
+
diff --git a/queue-5.7/clk-sunxi-fix-incorrect-usage-of-round_down.patch b/queue-5.7/clk-sunxi-fix-incorrect-usage-of-round_down.patch
new file mode 100644 (file)
index 0000000..422c3d1
--- /dev/null
@@ -0,0 +1,39 @@
+From a264786cb83bf99c059b4fd2d341d0e02c6d6746 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 17 Mar 2020 22:13:32 +0100
+Subject: clk: sunxi: Fix incorrect usage of round_down()
+
+From: Rikard Falkeborn <rikard.falkeborn@gmail.com>
+
+[ Upstream commit ee25d9742dabed3fd18158b518f846abeb70f319 ]
+
+round_down() can only round to powers of 2. If round_down() is asked
+to round to something that is not a power of 2, incorrect results are
+produced. The incorrect results can be both too large and too small.
+
+Instead, use rounddown() which can round to any number.
+
+Fixes: 6a721db180a2 ("clk: sunxi: Add A31 clocks support")
+Signed-off-by: Rikard Falkeborn <rikard.falkeborn@gmail.com>
+Signed-off-by: Maxime Ripard <maxime@cerno.tech>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/clk/sunxi/clk-sunxi.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/clk/sunxi/clk-sunxi.c b/drivers/clk/sunxi/clk-sunxi.c
+index 27201fd26e442..e1aa1fbac48a0 100644
+--- a/drivers/clk/sunxi/clk-sunxi.c
++++ b/drivers/clk/sunxi/clk-sunxi.c
+@@ -90,7 +90,7 @@ static void sun6i_a31_get_pll1_factors(struct factors_request *req)
+        * Round down the frequency to the closest multiple of either
+        * 6 or 16
+        */
+-      u32 round_freq_6 = round_down(freq_mhz, 6);
++      u32 round_freq_6 = rounddown(freq_mhz, 6);
+       u32 round_freq_16 = round_down(freq_mhz, 16);
+       if (round_freq_6 > round_freq_16)
+-- 
+2.25.1
+
diff --git a/queue-5.7/clk-ti-composite-fix-memory-leak.patch b/queue-5.7/clk-ti-composite-fix-memory-leak.patch
new file mode 100644 (file)
index 0000000..643b9bf
--- /dev/null
@@ -0,0 +1,38 @@
+From 39a5ca2c7a204a45e0f7dec4f61cd0756f963d76 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 29 Apr 2020 16:13:39 +0300
+Subject: clk: ti: composite: fix memory leak
+
+From: Tero Kristo <t-kristo@ti.com>
+
+[ Upstream commit c7c1cbbc9217ebb5601b88d138d4a5358548de9d ]
+
+The parent_names is never released for a component clock definition,
+causing some memory leak. Fix by releasing it once it is no longer
+needed.
+
+Reported-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
+Signed-off-by: Tero Kristo <t-kristo@ti.com>
+Link: https://lkml.kernel.org/r/20200429131341.4697-2-t-kristo@ti.com
+Acked-by: Tony Lindgren <tony@atomide.com>
+Signed-off-by: Stephen Boyd <sboyd@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/clk/ti/composite.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/clk/ti/composite.c b/drivers/clk/ti/composite.c
+index 6a89936ba03af..eaa43575cfa5e 100644
+--- a/drivers/clk/ti/composite.c
++++ b/drivers/clk/ti/composite.c
+@@ -196,6 +196,7 @@ cleanup:
+               if (!cclk->comp_clks[i])
+                       continue;
+               list_del(&cclk->comp_clks[i]->link);
++              kfree(cclk->comp_clks[i]->parent_names);
+               kfree(cclk->comp_clks[i]);
+       }
+-- 
+2.25.1
+
diff --git a/queue-5.7/clk-zynqmp-fix-divider2-calculation.patch b/queue-5.7/clk-zynqmp-fix-divider2-calculation.patch
new file mode 100644 (file)
index 0000000..adb6c39
--- /dev/null
@@ -0,0 +1,87 @@
+From 47d5998213a897d129a5cfd4b44b13dfb0c4991e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 2 Mar 2020 13:50:41 -0800
+Subject: clk: zynqmp: Fix divider2 calculation
+
+From: Tejas Patel <tejas.patel@xilinx.com>
+
+[ Upstream commit b8c1049c68d634a412ed5980ae666ed7c8839305 ]
+
+zynqmp_get_divider2_val() calculates, divider value of type DIV2 clock,
+considering best possible combination of DIV1 and DIV2.
+
+To find best possible values of DIV1 and DIV2, DIV1's parent rate
+should be consider and not DIV2's parent rate since it would rate of
+div1 clock. Consider a below topology,
+
+       out_clk->div2_clk->div1_clk->fixed_parent
+
+where out_clk = (fixed_parent/div1_clk) / div2_clk, so parent clock
+of div1_clk (i.e. out_clk) should be divided by div1_clk and div2_clk.
+
+Existing code divides parent rate of div2_clk's clock instead of
+div1_clk's parent rate, which is wrong.
+
+Fix the same by considering div1's parent clock rate.
+
+Fixes: 4ebd92d2e228 ("clk: zynqmp: Fix divider calculation")
+Signed-off-by: Tejas Patel <tejas.patel@xilinx.com>
+Signed-off-by: Jolly Shah <jolly.shah@xilinx.com>
+Link: https://lkml.kernel.org/r/1583185843-20707-3-git-send-email-jolly.shah@xilinx.com
+Signed-off-by: Stephen Boyd <sboyd@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/clk/zynqmp/divider.c | 17 ++++++++++++-----
+ 1 file changed, 12 insertions(+), 5 deletions(-)
+
+diff --git a/drivers/clk/zynqmp/divider.c b/drivers/clk/zynqmp/divider.c
+index 4be2cc76aa2e7..9bc4f9409aea0 100644
+--- a/drivers/clk/zynqmp/divider.c
++++ b/drivers/clk/zynqmp/divider.c
+@@ -111,23 +111,30 @@ static unsigned long zynqmp_clk_divider_recalc_rate(struct clk_hw *hw,
+ static void zynqmp_get_divider2_val(struct clk_hw *hw,
+                                   unsigned long rate,
+-                                  unsigned long parent_rate,
+                                   struct zynqmp_clk_divider *divider,
+                                   int *bestdiv)
+ {
+       int div1;
+       int div2;
+       long error = LONG_MAX;
+-      struct clk_hw *parent_hw = clk_hw_get_parent(hw);
+-      struct zynqmp_clk_divider *pdivider = to_zynqmp_clk_divider(parent_hw);
++      unsigned long div1_prate;
++      struct clk_hw *div1_parent_hw;
++      struct clk_hw *div2_parent_hw = clk_hw_get_parent(hw);
++      struct zynqmp_clk_divider *pdivider =
++                              to_zynqmp_clk_divider(div2_parent_hw);
+       if (!pdivider)
+               return;
++      div1_parent_hw = clk_hw_get_parent(div2_parent_hw);
++      if (!div1_parent_hw)
++              return;
++
++      div1_prate = clk_hw_get_rate(div1_parent_hw);
+       *bestdiv = 1;
+       for (div1 = 1; div1 <= pdivider->max_div;) {
+               for (div2 = 1; div2 <= divider->max_div;) {
+-                      long new_error = ((parent_rate / div1) / div2) - rate;
++                      long new_error = ((div1_prate / div1) / div2) - rate;
+                       if (abs(new_error) < abs(error)) {
+                               *bestdiv = div2;
+@@ -192,7 +199,7 @@ static long zynqmp_clk_divider_round_rate(struct clk_hw *hw,
+        */
+       if (div_type == TYPE_DIV2 &&
+           (clk_hw_get_flags(hw) & CLK_SET_RATE_PARENT)) {
+-              zynqmp_get_divider2_val(hw, rate, *prate, divider, &bestdiv);
++              zynqmp_get_divider2_val(hw, rate, divider, &bestdiv);
+       }
+       if ((clk_hw_get_flags(hw) & CLK_SET_RATE_PARENT) && divider->is_frac)
+-- 
+2.25.1
+
diff --git a/queue-5.7/clk-zynqmp-fix-memory-leak-in-zynqmp_register_clocks.patch b/queue-5.7/clk-zynqmp-fix-memory-leak-in-zynqmp_register_clocks.patch
new file mode 100644 (file)
index 0000000..ebdc9cd
--- /dev/null
@@ -0,0 +1,100 @@
+From 5230607f6132434e7700a3f67f5511c1ec431759 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 2 Mar 2020 13:50:43 -0800
+Subject: clk: zynqmp: fix memory leak in zynqmp_register_clocks
+
+From: Quanyang Wang <quanyang.wang@windriver.com>
+
+[ Upstream commit 58b0fb86260063f86afecaebf4056c876fff2a19 ]
+
+This is detected by kmemleak running on zcu102 board:
+
+unreferenced object 0xffffffc877e48180 (size 128):
+comm "swapper/0", pid 1, jiffies 4294892909 (age 315.436s)
+hex dump (first 32 bytes):
+64 70 5f 76 69 64 65 6f 5f 72 65 66 5f 64 69 76 dp_video_ref_div
+31 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 1...............
+backtrace:
+[<00000000c9be883b>] __kmalloc_track_caller+0x200/0x380
+[<00000000f02c3809>] kvasprintf+0x7c/0x100
+[<00000000e51dde4d>] kasprintf+0x60/0x80
+[<0000000092298b05>] zynqmp_register_clocks+0x29c/0x398
+[<00000000faaff182>] zynqmp_clock_probe+0x3cc/0x4c0
+[<000000005f5986f0>] platform_drv_probe+0x58/0xa8
+[<00000000d5810136>] really_probe+0xd8/0x2a8
+[<00000000f5b671be>] driver_probe_device+0x5c/0x100
+[<0000000038f91fcf>] __device_attach_driver+0x98/0xb8
+[<000000008a3f2ac2>] bus_for_each_drv+0x74/0xd8
+[<000000001cb2783d>] __device_attach+0xe0/0x140
+[<00000000c268031b>] device_initial_probe+0x24/0x30
+[<000000006998de4b>] bus_probe_device+0x9c/0xa8
+[<00000000647ae6ff>] device_add+0x3c0/0x610
+[<0000000071c14bb8>] of_device_add+0x40/0x50
+[<000000004bb5d132>] of_platform_device_create_pdata+0xbc/0x138
+
+This is because that when num_nodes is larger than 1, clk_out is
+allocated using kasprintf for these nodes but only the last node's
+clk_out is freed.
+
+Signed-off-by: Quanyang Wang <quanyang.wang@windriver.com>
+Signed-off-by: Michal Simek <michal.simek@xilinx.com>
+Signed-off-by: Tejas Patel <tejas.patel@xilinx.com>
+Signed-off-by: Jolly Shah <jolly.shah@xilinx.com>
+Link: https://lkml.kernel.org/r/1583185843-20707-5-git-send-email-jolly.shah@xilinx.com
+Signed-off-by: Stephen Boyd <sboyd@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/clk/zynqmp/clkc.c | 15 +++++++++------
+ 1 file changed, 9 insertions(+), 6 deletions(-)
+
+diff --git a/drivers/clk/zynqmp/clkc.c b/drivers/clk/zynqmp/clkc.c
+index 10e89f23880ba..b66c3a62233aa 100644
+--- a/drivers/clk/zynqmp/clkc.c
++++ b/drivers/clk/zynqmp/clkc.c
+@@ -558,7 +558,7 @@ static struct clk_hw *zynqmp_register_clk_topology(int clk_id, char *clk_name,
+ {
+       int j;
+       u32 num_nodes, clk_dev_id;
+-      char *clk_out = NULL;
++      char *clk_out[MAX_NODES];
+       struct clock_topology *nodes;
+       struct clk_hw *hw = NULL;
+@@ -572,16 +572,16 @@ static struct clk_hw *zynqmp_register_clk_topology(int clk_id, char *clk_name,
+                * Intermediate clock names are postfixed with type of clock.
+                */
+               if (j != (num_nodes - 1)) {
+-                      clk_out = kasprintf(GFP_KERNEL, "%s%s", clk_name,
++                      clk_out[j] = kasprintf(GFP_KERNEL, "%s%s", clk_name,
+                                           clk_type_postfix[nodes[j].type]);
+               } else {
+-                      clk_out = kasprintf(GFP_KERNEL, "%s", clk_name);
++                      clk_out[j] = kasprintf(GFP_KERNEL, "%s", clk_name);
+               }
+               if (!clk_topology[nodes[j].type])
+                       continue;
+-              hw = (*clk_topology[nodes[j].type])(clk_out, clk_dev_id,
++              hw = (*clk_topology[nodes[j].type])(clk_out[j], clk_dev_id,
+                                                   parent_names,
+                                                   num_parents,
+                                                   &nodes[j]);
+@@ -590,9 +590,12 @@ static struct clk_hw *zynqmp_register_clk_topology(int clk_id, char *clk_name,
+                                    __func__,  clk_dev_id, clk_name,
+                                    PTR_ERR(hw));
+-              parent_names[0] = clk_out;
++              parent_names[0] = clk_out[j];
+       }
+-      kfree(clk_out);
++
++      for (j = 0; j < num_nodes; j++)
++              kfree(clk_out[j]);
++
+       return hw;
+ }
+-- 
+2.25.1
+
diff --git a/queue-5.7/coresight-etm4x-fix-use-after-free-of-per-cpu-etm-dr.patch b/queue-5.7/coresight-etm4x-fix-use-after-free-of-per-cpu-etm-dr.patch
new file mode 100644 (file)
index 0000000..271ff99
--- /dev/null
@@ -0,0 +1,137 @@
+From c598a0f776f0560639bd4a56326eb87ad55d7ff6 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 18 May 2020 12:02:40 -0600
+Subject: coresight: etm4x: Fix use-after-free of per-cpu etm drvdata
+
+From: Suzuki K Poulose <suzuki.poulose@arm.com>
+
+[ Upstream commit 3f4943d422c5febbb3c764670011a00eb2a86238 ]
+
+etm probe could be deferred due to the dependency in the trace
+path chain and may be retried. We need to clear the per-cpu
+etmdrvdata entry for the etm in case of a failure to avoid
+use-after-free cases as reported below:
+
+KASAN use-after-free bug in etm4_cpu_pm_notify():
+
+[    8.574566] coresight etm0: CPU0: ETM v4.2 initialized
+[    8.581920] BUG: KASAN: use-after-free in etm4_cpu_pm_notify+0x580/0x2024
+[    8.581925] Read of size 8 at addr ffffff813304f8c8 by task swapper/3/0
+[    8.581927]
+[    8.581934] CPU: 3 PID: 0 Comm: swapper/3 Tainted: G S      W         5.4.28 #314
+[    8.587775] coresight etm1: CPU1: ETM v4.2 initialized
+[    8.594195] Call trace:
+[    8.594205]  dump_backtrace+0x0/0x188
+[    8.594209]  show_stack+0x20/0x2c
+[    8.594216]  dump_stack+0xdc/0x144
+[    8.594227]  print_address_description+0x3c/0x494
+[    8.594232]  __kasan_report+0x144/0x168
+[    8.601598] coresight etm2: CPU2: ETM v4.2 initialized
+[    8.602563]  kasan_report+0x10/0x18
+[    8.602568]  check_memory_region+0x1a4/0x1b4
+[    8.602572]  __kasan_check_read+0x18/0x24
+[    8.602577]  etm4_cpu_pm_notify+0x580/0x2024
+[    8.665945]  notifier_call_chain+0x5c/0x90
+[    8.670166]  __atomic_notifier_call_chain+0x90/0xf8
+[    8.675182]  cpu_pm_notify+0x40/0x6c
+[    8.678858]  cpu_pm_enter+0x38/0x80
+[    8.682451]  psci_enter_idle_state+0x34/0x70
+[    8.686844]  cpuidle_enter_state+0xb8/0x20c
+[    8.691143]  cpuidle_enter+0x38/0x4c
+[    8.694820]  call_cpuidle+0x3c/0x68
+[    8.698408]  do_idle+0x1a0/0x280
+[    8.701729]  cpu_startup_entry+0x24/0x28
+[    8.705768]  secondary_start_kernel+0x15c/0x170
+[    8.710423]
+[    8.711972] Allocated by task 242:
+[    8.715473]  __kasan_kmalloc+0xf0/0x1ac
+[    8.719426]  kasan_slab_alloc+0x14/0x1c
+[    8.723375]  __kmalloc_track_caller+0x23c/0x388
+[    8.728040]  devm_kmalloc+0x38/0x94
+[    8.731632]  etm4_probe+0x48/0x3c8
+[    8.735140]  amba_probe+0xbc/0x158
+[    8.738645]  really_probe+0x144/0x408
+[    8.742412]  driver_probe_device+0x70/0x140
+[    8.746716]  __device_attach_driver+0x9c/0x110
+[    8.751287]  bus_for_each_drv+0x90/0xd8
+[    8.755236]  __device_attach+0xb4/0x164
+[    8.759188]  device_initial_probe+0x20/0x2c
+[    8.763490]  bus_probe_device+0x34/0x94
+[    8.767436]  device_add+0x34c/0x3e0
+[    8.771029]  amba_device_try_add+0x68/0x440
+[    8.775332]  amba_deferred_retry_func+0x48/0xc8
+[    8.779997]  process_one_work+0x344/0x648
+[    8.784127]  worker_thread+0x2ac/0x47c
+[    8.787987]  kthread+0x128/0x138
+[    8.791313]  ret_from_fork+0x10/0x18
+[    8.794993]
+[    8.796532] Freed by task 242:
+[    8.799684]  __kasan_slab_free+0x15c/0x22c
+[    8.803897]  kasan_slab_free+0x10/0x1c
+[    8.807761]  kfree+0x25c/0x4bc
+[    8.810913]  release_nodes+0x240/0x2b0
+[    8.814767]  devres_release_all+0x3c/0x54
+[    8.818887]  really_probe+0x178/0x408
+[    8.822661]  driver_probe_device+0x70/0x140
+[    8.826963]  __device_attach_driver+0x9c/0x110
+[    8.831539]  bus_for_each_drv+0x90/0xd8
+[    8.835487]  __device_attach+0xb4/0x164
+[    8.839431]  device_initial_probe+0x20/0x2c
+[    8.843732]  bus_probe_device+0x34/0x94
+[    8.847678]  device_add+0x34c/0x3e0
+[    8.851274]  amba_device_try_add+0x68/0x440
+[    8.855576]  amba_deferred_retry_func+0x48/0xc8
+[    8.860240]  process_one_work+0x344/0x648
+[    8.864366]  worker_thread+0x2ac/0x47c
+[    8.868228]  kthread+0x128/0x138
+[    8.871557]  ret_from_fork+0x10/0x18
+[    8.875231]
+[    8.876782] The buggy address belongs to the object at ffffff813304f800
+[    8.876782]  which belongs to the cache kmalloc-1k of size 1024
+[    8.889632] The buggy address is located 200 bytes inside of
+[    8.889632]  1024-byte region [ffffff813304f800, ffffff813304fc00)
+[    8.901761] The buggy address belongs to the page:
+[    8.906695] page:ffffffff04ac1200 refcount:1 mapcount:0 mapping:ffffff8146c03800 index:0x0 compound_mapcount: 0
+[    8.917047] flags: 0x4000000000010200(slab|head)
+[    8.921799] raw: 4000000000010200 dead000000000100 dead000000000122 ffffff8146c03800
+[    8.929753] raw: 0000000000000000 0000000000100010 00000001ffffffff 0000000000000000
+[    8.937703] page dumped because: kasan: bad access detected
+[    8.943433]
+[    8.944974] Memory state around the buggy address:
+[    8.949903]  ffffff813304f780: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
+[    8.957320]  ffffff813304f800: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
+[    8.964742] >ffffff813304f880: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
+[    8.972157]                                               ^
+[    8.977886]  ffffff813304f900: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
+[    8.985298]  ffffff813304f980: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
+[    8.992713] ==================================================================
+
+Fixes: f188b5e76aae ("coresight: etm4x: Save/restore state across CPU low power states")
+Reported-by: Sai Prakash Ranjan <saiprakash.ranjan@codeaurora.org>
+Tested-by: Sai Prakash Ranjan <saiprakash.ranjan@codeaurora.org>
+Cc: Mathieu Poirier <mathieu.poirier@linaro.org>
+Cc: Mike Leach <mike.leach@linaro.org>
+Signed-off-by: Suzuki K Poulose <suzuki.poulose@arm.com>
+Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
+Link: https://lore.kernel.org/r/20200518180242.7916-22-mathieu.poirier@linaro.org
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/hwtracing/coresight/coresight-etm4x.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/hwtracing/coresight/coresight-etm4x.c b/drivers/hwtracing/coresight/coresight-etm4x.c
+index a90d757f70431..a6d6c7a3abcb3 100644
+--- a/drivers/hwtracing/coresight/coresight-etm4x.c
++++ b/drivers/hwtracing/coresight/coresight-etm4x.c
+@@ -1527,6 +1527,7 @@ static int etm4_probe(struct amba_device *adev, const struct amba_id *id)
+       return 0;
+ err_arch_supported:
++      etmdrvdata[drvdata->cpu] = NULL;
+       if (--etm4_count == 0) {
+               etm4_cpu_pm_unregister();
+-- 
+2.25.1
+
diff --git a/queue-5.7/coresight-fix-support-for-sparsely-populated-ports.patch b/queue-5.7/coresight-fix-support-for-sparsely-populated-ports.patch
new file mode 100644 (file)
index 0000000..cefb92c
--- /dev/null
@@ -0,0 +1,344 @@
+From 4f06bef9b127139db06e60740f1850d975d579ed Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 18 May 2020 12:02:31 -0600
+Subject: coresight: Fix support for sparsely populated ports
+
+From: Suzuki K Poulose <suzuki.poulose@arm.com>
+
+[ Upstream commit d375b356e687f2eefb51ddc3f1f2414cfa498f86 ]
+
+On some systems the firmware may not describe all the ports
+connected to a component (e.g, for security reasons). This
+could be especially problematic for "funnels" where we could
+end up in modifying memory beyond the allocated space for
+refcounts.
+
+e.g, for a funnel with input ports listed 0, 3, 5, nr_inport = 3.
+However the we could access refcnts[5] while checking for
+references, like :
+
+ [  526.110401] ==================================================================
+ [  526.117988] BUG: KASAN: slab-out-of-bounds in funnel_enable+0x54/0x1b0
+ [  526.124706] Read of size 4 at addr ffffff8135f9549c by task bash/1114
+ [  526.131324]
+ [  526.132886] CPU: 3 PID: 1114 Comm: bash Tainted: G S                5.4.25 #232
+ [  526.140397] Hardware name: Qualcomm Technologies, Inc. SC7180 IDP (DT)
+ [  526.147113] Call trace:
+ [  526.149653]  dump_backtrace+0x0/0x188
+ [  526.153431]  show_stack+0x20/0x2c
+ [  526.156852]  dump_stack+0xdc/0x144
+ [  526.160370]  print_address_description+0x3c/0x494
+ [  526.165211]  __kasan_report+0x144/0x168
+ [  526.169170]  kasan_report+0x10/0x18
+ [  526.172769]  check_memory_region+0x1a4/0x1b4
+ [  526.177164]  __kasan_check_read+0x18/0x24
+ [  526.181292]  funnel_enable+0x54/0x1b0
+ [  526.185072]  coresight_enable_path+0x104/0x198
+ [  526.189649]  coresight_enable+0x118/0x26c
+
+  ...
+
+ [  526.237782] Allocated by task 280:
+ [  526.241298]  __kasan_kmalloc+0xf0/0x1ac
+ [  526.245249]  kasan_kmalloc+0xc/0x14
+ [  526.248849]  __kmalloc+0x28c/0x3b4
+ [  526.252361]  coresight_register+0x88/0x250
+ [  526.256587]  funnel_probe+0x15c/0x228
+ [  526.260365]  dynamic_funnel_probe+0x20/0x2c
+ [  526.264679]  amba_probe+0xbc/0x158
+ [  526.268193]  really_probe+0x144/0x408
+ [  526.271970]  driver_probe_device+0x70/0x140
+
+ ...
+
+ [  526.316810]
+ [  526.318364] Freed by task 0:
+ [  526.321344] (stack is not available)
+ [  526.325024]
+ [  526.326580] The buggy address belongs to the object at ffffff8135f95480
+ [  526.326580]  which belongs to the cache kmalloc-128 of size 128
+ [  526.339439] The buggy address is located 28 bytes inside of
+ [  526.339439]  128-byte region [ffffff8135f95480, ffffff8135f95500)
+ [  526.351399] The buggy address belongs to the page:
+ [  526.356342] page:ffffffff04b7e500 refcount:1 mapcount:0 mapping:ffffff814b00c380 index:0x0 compound_mapcount: 0
+ [  526.366711] flags: 0x4000000000010200(slab|head)
+ [  526.371475] raw: 4000000000010200 ffffffff05034008 ffffffff0501eb08 ffffff814b00c380
+ [  526.379435] raw: 0000000000000000 0000000000190019 00000001ffffffff 0000000000000000
+ [  526.387393] page dumped because: kasan: bad access detected
+ [  526.393128]
+ [  526.394681] Memory state around the buggy address:
+ [  526.399619]  ffffff8135f95380: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
+ [  526.407046]  ffffff8135f95400: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
+ [  526.414473] >ffffff8135f95480: 04 fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
+ [  526.421900]                             ^
+ [  526.426029]  ffffff8135f95500: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
+ [  526.433456]  ffffff8135f95580: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
+ [  526.440883] ==================================================================
+
+To keep the code simple, we now track the maximum number of
+possible input/output connections to/from this component
+@ nr_inport and nr_outport in platform_data, respectively.
+Thus the output connections could be sparse and code is
+adjusted to skip the unspecified connections.
+
+Cc: Mathieu Poirier <mathieu.poirier@linaro.org>
+Cc: Mike Leach <mike.leach@linaro.org>
+Reported-by: Sai Prakash Ranjan <saiprakash.ranjan@codeaurora.org>
+Tested-by: Sai Prakash Ranjan <saiprakash.ranjan@codeaurora.org>
+Tested-by: Stephen Boyd <swboyd@chromium.org>
+Signed-off-by: Suzuki K Poulose <suzuki.poulose@arm.com>
+Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
+Link: https://lore.kernel.org/r/20200518180242.7916-13-mathieu.poirier@linaro.org
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ .../hwtracing/coresight/coresight-platform.c  | 85 +++++++++++++------
+ drivers/hwtracing/coresight/coresight.c       |  7 +-
+ include/linux/coresight.h                     | 10 ++-
+ 3 files changed, 72 insertions(+), 30 deletions(-)
+
+diff --git a/drivers/hwtracing/coresight/coresight-platform.c b/drivers/hwtracing/coresight/coresight-platform.c
+index 43418a2126ffe..471f34e40c743 100644
+--- a/drivers/hwtracing/coresight/coresight-platform.c
++++ b/drivers/hwtracing/coresight/coresight-platform.c
+@@ -87,6 +87,7 @@ static void of_coresight_get_ports_legacy(const struct device_node *node,
+                                         int *nr_inport, int *nr_outport)
+ {
+       struct device_node *ep = NULL;
++      struct of_endpoint endpoint;
+       int in = 0, out = 0;
+       do {
+@@ -94,10 +95,16 @@ static void of_coresight_get_ports_legacy(const struct device_node *node,
+               if (!ep)
+                       break;
+-              if (of_coresight_legacy_ep_is_input(ep))
+-                      in++;
+-              else
+-                      out++;
++              if (of_graph_parse_endpoint(ep, &endpoint))
++                      continue;
++
++              if (of_coresight_legacy_ep_is_input(ep)) {
++                      in = (endpoint.port + 1 > in) ?
++                              endpoint.port + 1 : in;
++              } else {
++                      out = (endpoint.port + 1) > out ?
++                              endpoint.port + 1 : out;
++              }
+       } while (ep);
+@@ -137,9 +144,16 @@ of_coresight_count_ports(struct device_node *port_parent)
+ {
+       int i = 0;
+       struct device_node *ep = NULL;
++      struct of_endpoint endpoint;
++
++      while ((ep = of_graph_get_next_endpoint(port_parent, ep))) {
++              /* Defer error handling to parsing */
++              if (of_graph_parse_endpoint(ep, &endpoint))
++                      continue;
++              if (endpoint.port + 1 > i)
++                      i = endpoint.port + 1;
++      }
+-      while ((ep = of_graph_get_next_endpoint(port_parent, ep)))
+-              i++;
+       return i;
+ }
+@@ -191,14 +205,12 @@ static int of_coresight_get_cpu(struct device *dev)
+  * Parses the local port, remote device name and the remote port.
+  *
+  * Returns :
+- *     1      - If the parsing is successful and a connection record
+- *              was created for an output connection.
+  *     0      - If the parsing completed without any fatal errors.
+  *    -Errno  - Fatal error, abort the scanning.
+  */
+ static int of_coresight_parse_endpoint(struct device *dev,
+                                      struct device_node *ep,
+-                                     struct coresight_connection *conn)
++                                     struct coresight_platform_data *pdata)
+ {
+       int ret = 0;
+       struct of_endpoint endpoint, rendpoint;
+@@ -206,6 +218,7 @@ static int of_coresight_parse_endpoint(struct device *dev,
+       struct device_node *rep = NULL;
+       struct device *rdev = NULL;
+       struct fwnode_handle *rdev_fwnode;
++      struct coresight_connection *conn;
+       do {
+               /* Parse the local port details */
+@@ -232,6 +245,13 @@ static int of_coresight_parse_endpoint(struct device *dev,
+                       break;
+               }
++              conn = &pdata->conns[endpoint.port];
++              if (conn->child_fwnode) {
++                      dev_warn(dev, "Duplicate output port %d\n",
++                               endpoint.port);
++                      ret = -EINVAL;
++                      break;
++              }
+               conn->outport = endpoint.port;
+               /*
+                * Hold the refcount to the target device. This could be
+@@ -244,7 +264,6 @@ static int of_coresight_parse_endpoint(struct device *dev,
+               conn->child_fwnode = fwnode_handle_get(rdev_fwnode);
+               conn->child_port = rendpoint.port;
+               /* Connection record updated */
+-              ret = 1;
+       } while (0);
+       of_node_put(rparent);
+@@ -258,7 +277,6 @@ static int of_get_coresight_platform_data(struct device *dev,
+                                         struct coresight_platform_data *pdata)
+ {
+       int ret = 0;
+-      struct coresight_connection *conn;
+       struct device_node *ep = NULL;
+       const struct device_node *parent = NULL;
+       bool legacy_binding = false;
+@@ -287,8 +305,6 @@ static int of_get_coresight_platform_data(struct device *dev,
+               dev_warn_once(dev, "Uses obsolete Coresight DT bindings\n");
+       }
+-      conn = pdata->conns;
+-
+       /* Iterate through each output port to discover topology */
+       while ((ep = of_graph_get_next_endpoint(parent, ep))) {
+               /*
+@@ -300,15 +316,9 @@ static int of_get_coresight_platform_data(struct device *dev,
+               if (legacy_binding && of_coresight_legacy_ep_is_input(ep))
+                       continue;
+-              ret = of_coresight_parse_endpoint(dev, ep, conn);
+-              switch (ret) {
+-              case 1:
+-                      conn++;         /* Fall through */
+-              case 0:
+-                      break;
+-              default:
++              ret = of_coresight_parse_endpoint(dev, ep, pdata);
++              if (ret)
+                       return ret;
+-              }
+       }
+       return 0;
+@@ -647,6 +657,16 @@ static int acpi_coresight_parse_link(struct acpi_device *adev,
+                *    coresight_remove_match().
+                */
+               conn->child_fwnode = fwnode_handle_get(&r_adev->fwnode);
++      } else if (dir == ACPI_CORESIGHT_LINK_SLAVE) {
++              /*
++               * We are only interested in the port number
++               * for the input ports at this component.
++               * Store the port number in child_port.
++               */
++              conn->child_port = fields[0].integer.value;
++      } else {
++              /* Invalid direction */
++              return -EINVAL;
+       }
+       return dir;
+@@ -692,10 +712,20 @@ static int acpi_coresight_parse_graph(struct acpi_device *adev,
+                       return dir;
+               if (dir == ACPI_CORESIGHT_LINK_MASTER) {
+-                      pdata->nr_outport++;
++                      if (ptr->outport > pdata->nr_outport)
++                              pdata->nr_outport = ptr->outport;
+                       ptr++;
+               } else {
+-                      pdata->nr_inport++;
++                      WARN_ON(pdata->nr_inport == ptr->child_port);
++                      /*
++                       * We do not track input port connections for a device.
++                       * However we need the highest port number described,
++                       * which can be recorded now and reuse this connection
++                       * record for an output connection. Hence, do not move
++                       * the ptr for input connections
++                       */
++                      if (ptr->child_port > pdata->nr_inport)
++                              pdata->nr_inport = ptr->child_port;
+               }
+       }
+@@ -704,8 +734,13 @@ static int acpi_coresight_parse_graph(struct acpi_device *adev,
+               return rc;
+       /* Copy the connection information to the final location */
+-      for (i = 0; i < pdata->nr_outport; i++)
+-              pdata->conns[i] = conns[i];
++      for (i = 0; conns + i < ptr; i++) {
++              int port = conns[i].outport;
++
++              /* Duplicate output port */
++              WARN_ON(pdata->conns[port].child_fwnode);
++              pdata->conns[port] = conns[i];
++      }
+       devm_kfree(&adev->dev, conns);
+       return 0;
+diff --git a/drivers/hwtracing/coresight/coresight.c b/drivers/hwtracing/coresight/coresight.c
+index c71553c09f8ef..8f5e62f02444e 100644
+--- a/drivers/hwtracing/coresight/coresight.c
++++ b/drivers/hwtracing/coresight/coresight.c
+@@ -1053,6 +1053,9 @@ static int coresight_orphan_match(struct device *dev, void *data)
+       for (i = 0; i < i_csdev->pdata->nr_outport; i++) {
+               conn = &i_csdev->pdata->conns[i];
++              /* Skip the port if FW doesn't describe it */
++              if (!conn->child_fwnode)
++                      continue;
+               /* We have found at least one orphan connection */
+               if (conn->child_dev == NULL) {
+                       /* Does it match this newly added device? */
+@@ -1091,6 +1094,8 @@ static void coresight_fixup_device_conns(struct coresight_device *csdev)
+       for (i = 0; i < csdev->pdata->nr_outport; i++) {
+               struct coresight_connection *conn = &csdev->pdata->conns[i];
++              if (!conn->child_fwnode)
++                      continue;
+               conn->child_dev =
+                       coresight_find_csdev_by_fwnode(conn->child_fwnode);
+               if (!conn->child_dev)
+@@ -1118,7 +1123,7 @@ static int coresight_remove_match(struct device *dev, void *data)
+       for (i = 0; i < iterator->pdata->nr_outport; i++) {
+               conn = &iterator->pdata->conns[i];
+-              if (conn->child_dev == NULL)
++              if (conn->child_dev == NULL || conn->child_fwnode == NULL)
+                       continue;
+               if (csdev->dev.fwnode == conn->child_fwnode) {
+diff --git a/include/linux/coresight.h b/include/linux/coresight.h
+index 193cc9dbf448a..09f0565a5de3d 100644
+--- a/include/linux/coresight.h
++++ b/include/linux/coresight.h
+@@ -100,10 +100,12 @@ union coresight_dev_subtype {
+ };
+ /**
+- * struct coresight_platform_data - data harvested from the DT specification
+- * @nr_inport:        number of input ports for this component.
+- * @nr_outport:       number of output ports for this component.
+- * @conns:    Array of nr_outport connections from this component
++ * struct coresight_platform_data - data harvested from the firmware
++ * specification.
++ *
++ * @nr_inport:        Number of elements for the input connections.
++ * @nr_outport:       Number of elements for the output connections.
++ * @conns:    Sparse array of nr_outport connections from this component.
+  */
+ struct coresight_platform_data {
+       int nr_inport;
+-- 
+2.25.1
+
diff --git a/queue-5.7/coresight-tmc-fix-tmc-mode-read-in-tmc_read_prepare_.patch b/queue-5.7/coresight-tmc-fix-tmc-mode-read-in-tmc_read_prepare_.patch
new file mode 100644 (file)
index 0000000..47caefc
--- /dev/null
@@ -0,0 +1,93 @@
+From c384f81d4cb634158d06526867ad7437b090683b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 18 May 2020 12:02:32 -0600
+Subject: coresight: tmc: Fix TMC mode read in tmc_read_prepare_etb()
+
+From: Sai Prakash Ranjan <saiprakash.ranjan@codeaurora.org>
+
+[ Upstream commit 347adb0d6385c3220dc01ab61807a5b1892901cc ]
+
+On some QCOM platforms like SC7180, SDM845 and SM8150,
+reading TMC mode register without proper coresight power
+management can lead to async exceptions like the one in
+the call trace below in tmc_read_prepare_etb(). This can
+happen if the user tries to read the TMC etf data via
+device node without setting up source and the sink first.
+Fix this by having a check for coresight sysfs mode
+before reading TMC mode management register.
+
+ Kernel panic - not syncing: Asynchronous SError Interrupt
+ CPU: 7 PID: 2605 Comm: hexdump Tainted: G S                5.4.30 #122
+ Call trace:
+  dump_backtrace+0x0/0x188
+  show_stack+0x20/0x2c
+  dump_stack+0xdc/0x144
+  panic+0x168/0x36c
+  panic+0x0/0x36c
+  arm64_serror_panic+0x78/0x84
+  do_serror+0x130/0x138
+  el1_error+0x84/0xf8
+  tmc_read_prepare_etb+0x88/0xb8
+  tmc_open+0x40/0xd8
+  misc_open+0x120/0x158
+  chrdev_open+0xb8/0x1a4
+  do_dentry_open+0x268/0x3a0
+  vfs_open+0x34/0x40
+  path_openat+0x39c/0xdf4
+  do_filp_open+0x90/0x10c
+  do_sys_open+0x150/0x3e8
+  __arm64_compat_sys_openat+0x28/0x34
+  el0_svc_common+0xa8/0x160
+  el0_svc_compat_handler+0x2c/0x38
+  el0_svc_compat+0x8/0x10
+
+Fixes: 4525412a5046 ("coresight: tmc: making prepare/unprepare functions generic")
+Reported-by: Stephen Boyd <swboyd@chromium.org>
+Suggested-by: Mathieu Poirier <mathieu.poirier@linaro.org>
+Signed-off-by: Sai Prakash Ranjan <saiprakash.ranjan@codeaurora.org>
+Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
+Link: https://lore.kernel.org/r/20200518180242.7916-14-mathieu.poirier@linaro.org
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/hwtracing/coresight/coresight-tmc-etf.c | 16 ++++++++--------
+ 1 file changed, 8 insertions(+), 8 deletions(-)
+
+diff --git a/drivers/hwtracing/coresight/coresight-tmc-etf.c b/drivers/hwtracing/coresight/coresight-tmc-etf.c
+index d0cc3985b72a0..36cce2bfb7449 100644
+--- a/drivers/hwtracing/coresight/coresight-tmc-etf.c
++++ b/drivers/hwtracing/coresight/coresight-tmc-etf.c
+@@ -596,13 +596,6 @@ int tmc_read_prepare_etb(struct tmc_drvdata *drvdata)
+               goto out;
+       }
+-      /* There is no point in reading a TMC in HW FIFO mode */
+-      mode = readl_relaxed(drvdata->base + TMC_MODE);
+-      if (mode != TMC_MODE_CIRCULAR_BUFFER) {
+-              ret = -EINVAL;
+-              goto out;
+-      }
+-
+       /* Don't interfere if operated from Perf */
+       if (drvdata->mode == CS_MODE_PERF) {
+               ret = -EINVAL;
+@@ -616,8 +609,15 @@ int tmc_read_prepare_etb(struct tmc_drvdata *drvdata)
+       }
+       /* Disable the TMC if need be */
+-      if (drvdata->mode == CS_MODE_SYSFS)
++      if (drvdata->mode == CS_MODE_SYSFS) {
++              /* There is no point in reading a TMC in HW FIFO mode */
++              mode = readl_relaxed(drvdata->base + TMC_MODE);
++              if (mode != TMC_MODE_CIRCULAR_BUFFER) {
++                      ret = -EINVAL;
++                      goto out;
++              }
+               __tmc_etb_disable_hw(drvdata);
++      }
+       drvdata->reading = true;
+ out:
+-- 
+2.25.1
+
diff --git a/queue-5.7/crypto-hisilicon-cap-block-size-at-2-31.patch b/queue-5.7/crypto-hisilicon-cap-block-size-at-2-31.patch
new file mode 100644 (file)
index 0000000..e2a7d4e
--- /dev/null
@@ -0,0 +1,40 @@
+From 4753feca984869df85ed696998f6f8a7ae7302a4 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 4 Jun 2020 17:37:50 +1000
+Subject: crypto: hisilicon - Cap block size at 2^31
+
+From: Herbert Xu <herbert@gondor.apana.org.au>
+
+[ Upstream commit c61e5644c69775ae9d54b86018fca238aca64a9b ]
+
+The function hisi_acc_create_sg_pool may allocate a block of
+memory of size PAGE_SIZE * 2^(MAX_ORDER - 1).  This value may
+exceed 2^31 on ia64, which would overflow the u32.
+
+This patch caps it at 2^31.
+
+Reported-by: kernel test robot <lkp@intel.com>
+Fixes: d8ac7b85236b ("crypto: hisilicon - fix large sgl memory...")
+Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/crypto/hisilicon/sgl.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/crypto/hisilicon/sgl.c b/drivers/crypto/hisilicon/sgl.c
+index 0e8c7e324fb46..725a739800b0a 100644
+--- a/drivers/crypto/hisilicon/sgl.c
++++ b/drivers/crypto/hisilicon/sgl.c
+@@ -66,7 +66,8 @@ struct hisi_acc_sgl_pool *hisi_acc_create_sgl_pool(struct device *dev,
+       sgl_size = sizeof(struct acc_hw_sge) * sge_nr +
+                  sizeof(struct hisi_acc_hw_sgl);
+-      block_size = PAGE_SIZE * (1 << (MAX_ORDER - 1));
++      block_size = 1 << (PAGE_SHIFT + MAX_ORDER <= 32 ?
++                         PAGE_SHIFT + MAX_ORDER - 1 : 31);
+       sgl_num_per_block = block_size / sgl_size;
+       block_num = count / sgl_num_per_block;
+       remain_sgl = count % sgl_num_per_block;
+-- 
+2.25.1
+
diff --git a/queue-5.7/crypto-marvell-octeontx-fix-a-potential-null-derefer.patch b/queue-5.7/crypto-marvell-octeontx-fix-a-potential-null-derefer.patch
new file mode 100644 (file)
index 0000000..3e5524b
--- /dev/null
@@ -0,0 +1,68 @@
+From 5f72cfc2b5d8fd656ea46ddf80ed247fca36ddd0 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 5 Jun 2020 14:03:39 +0300
+Subject: crypto: marvell/octeontx - Fix a potential NULL dereference
+
+From: Dan Carpenter <dan.carpenter@oracle.com>
+
+[ Upstream commit 1f5b07f5dd1748a6f9363fb1a76d599c74af8231 ]
+
+Smatch reports that:
+
+    drivers/crypto/marvell/octeontx/otx_cptvf_algs.c:132 otx_cpt_aead_callback()
+    warn: variable dereferenced before check 'cpt_info' (see line 121)
+
+This function is called from process_pending_queue() as:
+
+drivers/crypto/marvell/octeontx/otx_cptvf_reqmgr.c
+   599                  /*
+   600                   * Call callback after current pending entry has been
+   601                   * processed, we don't do it if the callback pointer is
+   602                   * invalid.
+   603                   */
+   604                  if (callback)
+   605                          callback(res_code, areq, cpt_info);
+
+It does appear to me that "cpt_info" can be NULL so this could lead to
+a NULL dereference.
+
+Fixes: 10b4f09491bf ("crypto: marvell - add the Virtual Function driver for CPT")
+Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
+Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/crypto/marvell/octeontx/otx_cptvf_algs.c | 11 +++++++----
+ 1 file changed, 7 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/crypto/marvell/octeontx/otx_cptvf_algs.c b/drivers/crypto/marvell/octeontx/otx_cptvf_algs.c
+index 06202bcffb33f..a370c99ecf4c9 100644
+--- a/drivers/crypto/marvell/octeontx/otx_cptvf_algs.c
++++ b/drivers/crypto/marvell/octeontx/otx_cptvf_algs.c
+@@ -118,6 +118,9 @@ static void otx_cpt_aead_callback(int status, void *arg1, void *arg2)
+       struct otx_cpt_req_info *cpt_req;
+       struct pci_dev *pdev;
++      if (!cpt_info)
++              goto complete;
++
+       cpt_req = cpt_info->req;
+       if (!status) {
+               /*
+@@ -129,10 +132,10 @@ static void otx_cpt_aead_callback(int status, void *arg1, void *arg2)
+                   !cpt_req->is_enc)
+                       status = validate_hmac_cipher_null(cpt_req);
+       }
+-      if (cpt_info) {
+-              pdev = cpt_info->pdev;
+-              do_request_cleanup(pdev, cpt_info);
+-      }
++      pdev = cpt_info->pdev;
++      do_request_cleanup(pdev, cpt_info);
++
++complete:
+       if (areq)
+               areq->complete(areq, status);
+ }
+-- 
+2.25.1
+
diff --git a/queue-5.7/crypto-omap-sham-add-proper-load-balancing-support-f.patch b/queue-5.7/crypto-omap-sham-add-proper-load-balancing-support-f.patch
new file mode 100644 (file)
index 0000000..0e24584
--- /dev/null
@@ -0,0 +1,169 @@
+From 81dfcacf0d987d7cecd6bf51f323cb9d09ec49f1 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 27 May 2020 15:24:29 +0300
+Subject: crypto: omap-sham - add proper load balancing support for multicore
+
+From: Tero Kristo <t-kristo@ti.com>
+
+[ Upstream commit 281c377872ff5d15d80df25fc4df02d2676c7cde ]
+
+The current implementation of the multiple accelerator core support for
+OMAP SHA does not work properly. It always picks up the first probed
+accelerator core if this is available, and rest of the book keeping also
+gets confused if there are two cores available. Add proper load
+balancing support for SHA, and also fix any bugs related to the
+multicore support while doing it.
+
+Signed-off-by: Tero Kristo <t-kristo@ti.com>
+Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/crypto/omap-sham.c | 64 ++++++++++++++++++--------------------
+ 1 file changed, 31 insertions(+), 33 deletions(-)
+
+diff --git a/drivers/crypto/omap-sham.c b/drivers/crypto/omap-sham.c
+index 0cbf9c932a0f0..a82a3596dca34 100644
+--- a/drivers/crypto/omap-sham.c
++++ b/drivers/crypto/omap-sham.c
+@@ -169,8 +169,6 @@ struct omap_sham_hmac_ctx {
+ };
+ struct omap_sham_ctx {
+-      struct omap_sham_dev    *dd;
+-
+       unsigned long           flags;
+       /* fallback stuff */
+@@ -933,27 +931,35 @@ static int omap_sham_update_dma_stop(struct omap_sham_dev *dd)
+       return 0;
+ }
++struct omap_sham_dev *omap_sham_find_dev(struct omap_sham_reqctx *ctx)
++{
++      struct omap_sham_dev *dd;
++
++      if (ctx->dd)
++              return ctx->dd;
++
++      spin_lock_bh(&sham.lock);
++      dd = list_first_entry(&sham.dev_list, struct omap_sham_dev, list);
++      list_move_tail(&dd->list, &sham.dev_list);
++      ctx->dd = dd;
++      spin_unlock_bh(&sham.lock);
++
++      return dd;
++}
++
+ static int omap_sham_init(struct ahash_request *req)
+ {
+       struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
+       struct omap_sham_ctx *tctx = crypto_ahash_ctx(tfm);
+       struct omap_sham_reqctx *ctx = ahash_request_ctx(req);
+-      struct omap_sham_dev *dd = NULL, *tmp;
++      struct omap_sham_dev *dd;
+       int bs = 0;
+-      spin_lock_bh(&sham.lock);
+-      if (!tctx->dd) {
+-              list_for_each_entry(tmp, &sham.dev_list, list) {
+-                      dd = tmp;
+-                      break;
+-              }
+-              tctx->dd = dd;
+-      } else {
+-              dd = tctx->dd;
+-      }
+-      spin_unlock_bh(&sham.lock);
++      ctx->dd = NULL;
+-      ctx->dd = dd;
++      dd = omap_sham_find_dev(ctx);
++      if (!dd)
++              return -ENODEV;
+       ctx->flags = 0;
+@@ -1223,8 +1229,7 @@ err1:
+ static int omap_sham_enqueue(struct ahash_request *req, unsigned int op)
+ {
+       struct omap_sham_reqctx *ctx = ahash_request_ctx(req);
+-      struct omap_sham_ctx *tctx = crypto_tfm_ctx(req->base.tfm);
+-      struct omap_sham_dev *dd = tctx->dd;
++      struct omap_sham_dev *dd = ctx->dd;
+       ctx->op = op;
+@@ -1234,7 +1239,7 @@ static int omap_sham_enqueue(struct ahash_request *req, unsigned int op)
+ static int omap_sham_update(struct ahash_request *req)
+ {
+       struct omap_sham_reqctx *ctx = ahash_request_ctx(req);
+-      struct omap_sham_dev *dd = ctx->dd;
++      struct omap_sham_dev *dd = omap_sham_find_dev(ctx);
+       if (!req->nbytes)
+               return 0;
+@@ -1338,21 +1343,8 @@ static int omap_sham_setkey(struct crypto_ahash *tfm, const u8 *key,
+       struct omap_sham_hmac_ctx *bctx = tctx->base;
+       int bs = crypto_shash_blocksize(bctx->shash);
+       int ds = crypto_shash_digestsize(bctx->shash);
+-      struct omap_sham_dev *dd = NULL, *tmp;
+       int err, i;
+-      spin_lock_bh(&sham.lock);
+-      if (!tctx->dd) {
+-              list_for_each_entry(tmp, &sham.dev_list, list) {
+-                      dd = tmp;
+-                      break;
+-              }
+-              tctx->dd = dd;
+-      } else {
+-              dd = tctx->dd;
+-      }
+-      spin_unlock_bh(&sham.lock);
+-
+       err = crypto_shash_setkey(tctx->fallback, key, keylen);
+       if (err)
+               return err;
+@@ -1370,7 +1362,7 @@ static int omap_sham_setkey(struct crypto_ahash *tfm, const u8 *key,
+       memset(bctx->ipad + keylen, 0, bs - keylen);
+-      if (!test_bit(FLAGS_AUTO_XOR, &dd->flags)) {
++      if (!test_bit(FLAGS_AUTO_XOR, &sham.flags)) {
+               memcpy(bctx->opad, bctx->ipad, bs);
+               for (i = 0; i < bs; i++) {
+@@ -2174,6 +2166,7 @@ static int omap_sham_probe(struct platform_device *pdev)
+       }
+       dd->flags |= dd->pdata->flags;
++      sham.flags |= dd->pdata->flags;
+       pm_runtime_use_autosuspend(dev);
+       pm_runtime_set_autosuspend_delay(dev, DEFAULT_AUTOSUSPEND_DELAY);
+@@ -2201,6 +2194,9 @@ static int omap_sham_probe(struct platform_device *pdev)
+       spin_unlock(&sham.lock);
+       for (i = 0; i < dd->pdata->algs_info_size; i++) {
++              if (dd->pdata->algs_info[i].registered)
++                      break;
++
+               for (j = 0; j < dd->pdata->algs_info[i].size; j++) {
+                       struct ahash_alg *alg;
+@@ -2252,9 +2248,11 @@ static int omap_sham_remove(struct platform_device *pdev)
+       list_del(&dd->list);
+       spin_unlock(&sham.lock);
+       for (i = dd->pdata->algs_info_size - 1; i >= 0; i--)
+-              for (j = dd->pdata->algs_info[i].registered - 1; j >= 0; j--)
++              for (j = dd->pdata->algs_info[i].registered - 1; j >= 0; j--) {
+                       crypto_unregister_ahash(
+                                       &dd->pdata->algs_info[i].algs_list[j]);
++                      dd->pdata->algs_info[i].registered--;
++              }
+       tasklet_kill(&dd->done_task);
+       pm_runtime_disable(&pdev->dev);
+-- 
+2.25.1
+
diff --git a/queue-5.7/crypto-omap-sham-huge-buffer-access-fixes.patch b/queue-5.7/crypto-omap-sham-huge-buffer-access-fixes.patch
new file mode 100644 (file)
index 0000000..bcb0a22
--- /dev/null
@@ -0,0 +1,54 @@
+From e36ad486a21b788e22efe08c08a4abc1fedd94ce Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 27 May 2020 15:24:26 +0300
+Subject: crypto: omap-sham - huge buffer access fixes
+
+From: Tero Kristo <t-kristo@ti.com>
+
+[ Upstream commit 6395166d7a19019d5e9574eb9ecdaf0028abb887 ]
+
+The ctx internal buffer can only hold buflen amount of data, don't try
+to copy over more than that. Also, initialize the context sg pointer
+if we only have data in the context internal buffer, this can happen
+when closing a hash with certain data amounts.
+
+Signed-off-by: Tero Kristo <t-kristo@ti.com>
+Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/crypto/omap-sham.c | 11 +++++++++--
+ 1 file changed, 9 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/crypto/omap-sham.c b/drivers/crypto/omap-sham.c
+index e4072cd385857..0cbf9c932a0f0 100644
+--- a/drivers/crypto/omap-sham.c
++++ b/drivers/crypto/omap-sham.c
+@@ -751,8 +751,15 @@ static int omap_sham_align_sgs(struct scatterlist *sg,
+       int offset = rctx->offset;
+       int bufcnt = rctx->bufcnt;
+-      if (!sg || !sg->length || !nbytes)
++      if (!sg || !sg->length || !nbytes) {
++              if (bufcnt) {
++                      sg_init_table(rctx->sgl, 1);
++                      sg_set_buf(rctx->sgl, rctx->dd->xmit_buf, bufcnt);
++                      rctx->sg = rctx->sgl;
++              }
++
+               return 0;
++      }
+       new_len = nbytes;
+@@ -896,7 +903,7 @@ static int omap_sham_prepare_request(struct ahash_request *req, bool update)
+       if (hash_later < 0)
+               hash_later = 0;
+-      if (hash_later) {
++      if (hash_later && hash_later <= rctx->buflen) {
+               scatterwalk_map_and_copy(rctx->buffer,
+                                        req->src,
+                                        req->nbytes - hash_later,
+-- 
+2.25.1
+
diff --git a/queue-5.7/dev-mem-revoke-mappings-when-a-driver-claims-the-reg.patch b/queue-5.7/dev-mem-revoke-mappings-when-a-driver-claims-the-reg.patch
new file mode 100644 (file)
index 0000000..f7d4a8c
--- /dev/null
@@ -0,0 +1,263 @@
+From 7b0370f0f18dc82bb81f982dcc9b5b79091714fe Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 21 May 2020 14:06:17 -0700
+Subject: /dev/mem: Revoke mappings when a driver claims the region
+
+From: Dan Williams <dan.j.williams@intel.com>
+
+[ Upstream commit 3234ac664a870e6ea69ae3a57d824cd7edbeacc5 ]
+
+Close the hole of holding a mapping over kernel driver takeover event of
+a given address range.
+
+Commit 90a545e98126 ("restrict /dev/mem to idle io memory ranges")
+introduced CONFIG_IO_STRICT_DEVMEM with the goal of protecting the
+kernel against scenarios where a /dev/mem user tramples memory that a
+kernel driver owns. However, this protection only prevents *new* read(),
+write() and mmap() requests. Established mappings prior to the driver
+calling request_mem_region() are left alone.
+
+Especially with persistent memory, and the core kernel metadata that is
+stored there, there are plentiful scenarios for a /dev/mem user to
+violate the expectations of the driver and cause amplified damage.
+
+Teach request_mem_region() to find and shoot down active /dev/mem
+mappings that it believes it has successfully claimed for the exclusive
+use of the driver. Effectively a driver call to request_mem_region()
+becomes a hole-punch on the /dev/mem device.
+
+The typical usage of unmap_mapping_range() is part of
+truncate_pagecache() to punch a hole in a file, but in this case the
+implementation is only doing the "first half" of a hole punch. Namely it
+is just evacuating current established mappings of the "hole", and it
+relies on the fact that /dev/mem establishes mappings in terms of
+absolute physical address offsets. Once existing mmap users are
+invalidated they can attempt to re-establish the mapping, or attempt to
+continue issuing read(2) / write(2) to the invalidated extent, but they
+will then be subject to the CONFIG_IO_STRICT_DEVMEM checking that can
+block those subsequent accesses.
+
+Cc: Arnd Bergmann <arnd@arndb.de>
+Cc: Ingo Molnar <mingo@redhat.com>
+Cc: Kees Cook <keescook@chromium.org>
+Cc: Matthew Wilcox <willy@infradead.org>
+Cc: Russell King <linux@arm.linux.org.uk>
+Cc: Andrew Morton <akpm@linux-foundation.org>
+Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Fixes: 90a545e98126 ("restrict /dev/mem to idle io memory ranges")
+Signed-off-by: Dan Williams <dan.j.williams@intel.com>
+Reviewed-by: Kees Cook <keescook@chromium.org>
+Link: https://lore.kernel.org/r/159009507306.847224.8502634072429766747.stgit@dwillia2-desk3.amr.corp.intel.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/char/mem.c         | 101 ++++++++++++++++++++++++++++++++++++-
+ include/linux/ioport.h     |   6 +++
+ include/uapi/linux/magic.h |   1 +
+ kernel/resource.c          |   5 ++
+ 4 files changed, 111 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/char/mem.c b/drivers/char/mem.c
+index 43dd0891ca1ed..31cae88a730ba 100644
+--- a/drivers/char/mem.c
++++ b/drivers/char/mem.c
+@@ -31,11 +31,15 @@
+ #include <linux/uio.h>
+ #include <linux/uaccess.h>
+ #include <linux/security.h>
++#include <linux/pseudo_fs.h>
++#include <uapi/linux/magic.h>
++#include <linux/mount.h>
+ #ifdef CONFIG_IA64
+ # include <linux/efi.h>
+ #endif
++#define DEVMEM_MINOR  1
+ #define DEVPORT_MINOR 4
+ static inline unsigned long size_inside_page(unsigned long start,
+@@ -805,12 +809,64 @@ static loff_t memory_lseek(struct file *file, loff_t offset, int orig)
+       return ret;
+ }
++static struct inode *devmem_inode;
++
++#ifdef CONFIG_IO_STRICT_DEVMEM
++void revoke_devmem(struct resource *res)
++{
++      struct inode *inode = READ_ONCE(devmem_inode);
++
++      /*
++       * Check that the initialization has completed. Losing the race
++       * is ok because it means drivers are claiming resources before
++       * the fs_initcall level of init and prevent /dev/mem from
++       * establishing mappings.
++       */
++      if (!inode)
++              return;
++
++      /*
++       * The expectation is that the driver has successfully marked
++       * the resource busy by this point, so devmem_is_allowed()
++       * should start returning false, however for performance this
++       * does not iterate the entire resource range.
++       */
++      if (devmem_is_allowed(PHYS_PFN(res->start)) &&
++          devmem_is_allowed(PHYS_PFN(res->end))) {
++              /*
++               * *cringe* iomem=relaxed says "go ahead, what's the
++               * worst that can happen?"
++               */
++              return;
++      }
++
++      unmap_mapping_range(inode->i_mapping, res->start, resource_size(res), 1);
++}
++#endif
++
+ static int open_port(struct inode *inode, struct file *filp)
+ {
++      int rc;
++
+       if (!capable(CAP_SYS_RAWIO))
+               return -EPERM;
+-      return security_locked_down(LOCKDOWN_DEV_MEM);
++      rc = security_locked_down(LOCKDOWN_DEV_MEM);
++      if (rc)
++              return rc;
++
++      if (iminor(inode) != DEVMEM_MINOR)
++              return 0;
++
++      /*
++       * Use a unified address space to have a single point to manage
++       * revocations when drivers want to take over a /dev/mem mapped
++       * range.
++       */
++      inode->i_mapping = devmem_inode->i_mapping;
++      filp->f_mapping = inode->i_mapping;
++
++      return 0;
+ }
+ #define zero_lseek    null_lseek
+@@ -885,7 +941,7 @@ static const struct memdev {
+       fmode_t fmode;
+ } devlist[] = {
+ #ifdef CONFIG_DEVMEM
+-       [1] = { "mem", 0, &mem_fops, FMODE_UNSIGNED_OFFSET },
++       [DEVMEM_MINOR] = { "mem", 0, &mem_fops, FMODE_UNSIGNED_OFFSET },
+ #endif
+ #ifdef CONFIG_DEVKMEM
+        [2] = { "kmem", 0, &kmem_fops, FMODE_UNSIGNED_OFFSET },
+@@ -939,6 +995,45 @@ static char *mem_devnode(struct device *dev, umode_t *mode)
+ static struct class *mem_class;
++static int devmem_fs_init_fs_context(struct fs_context *fc)
++{
++      return init_pseudo(fc, DEVMEM_MAGIC) ? 0 : -ENOMEM;
++}
++
++static struct file_system_type devmem_fs_type = {
++      .name           = "devmem",
++      .owner          = THIS_MODULE,
++      .init_fs_context = devmem_fs_init_fs_context,
++      .kill_sb        = kill_anon_super,
++};
++
++static int devmem_init_inode(void)
++{
++      static struct vfsmount *devmem_vfs_mount;
++      static int devmem_fs_cnt;
++      struct inode *inode;
++      int rc;
++
++      rc = simple_pin_fs(&devmem_fs_type, &devmem_vfs_mount, &devmem_fs_cnt);
++      if (rc < 0) {
++              pr_err("Cannot mount /dev/mem pseudo filesystem: %d\n", rc);
++              return rc;
++      }
++
++      inode = alloc_anon_inode(devmem_vfs_mount->mnt_sb);
++      if (IS_ERR(inode)) {
++              rc = PTR_ERR(inode);
++              pr_err("Cannot allocate inode for /dev/mem: %d\n", rc);
++              simple_release_fs(&devmem_vfs_mount, &devmem_fs_cnt);
++              return rc;
++      }
++
++      /* publish /dev/mem initialized */
++      WRITE_ONCE(devmem_inode, inode);
++
++      return 0;
++}
++
+ static int __init chr_dev_init(void)
+ {
+       int minor;
+@@ -960,6 +1055,8 @@ static int __init chr_dev_init(void)
+                */
+               if ((minor == DEVPORT_MINOR) && !arch_has_dev_port())
+                       continue;
++              if ((minor == DEVMEM_MINOR) && devmem_init_inode() != 0)
++                      continue;
+               device_create(mem_class, NULL, MKDEV(MEM_MAJOR, minor),
+                             NULL, devlist[minor].name);
+diff --git a/include/linux/ioport.h b/include/linux/ioport.h
+index a9b9170b5dd22..6c3eca90cbc43 100644
+--- a/include/linux/ioport.h
++++ b/include/linux/ioport.h
+@@ -301,5 +301,11 @@ struct resource *devm_request_free_mem_region(struct device *dev,
+ struct resource *request_free_mem_region(struct resource *base,
+               unsigned long size, const char *name);
++#ifdef CONFIG_IO_STRICT_DEVMEM
++void revoke_devmem(struct resource *res);
++#else
++static inline void revoke_devmem(struct resource *res) { };
++#endif
++
+ #endif /* __ASSEMBLY__ */
+ #endif        /* _LINUX_IOPORT_H */
+diff --git a/include/uapi/linux/magic.h b/include/uapi/linux/magic.h
+index d78064007b179..f3956fc11de68 100644
+--- a/include/uapi/linux/magic.h
++++ b/include/uapi/linux/magic.h
+@@ -94,6 +94,7 @@
+ #define BALLOON_KVM_MAGIC     0x13661366
+ #define ZSMALLOC_MAGIC                0x58295829
+ #define DMA_BUF_MAGIC         0x444d4142      /* "DMAB" */
++#define DEVMEM_MAGIC          0x454d444d      /* "DMEM" */
+ #define Z3FOLD_MAGIC          0x33
+ #define PPC_CMM_MAGIC         0xc7571590
+diff --git a/kernel/resource.c b/kernel/resource.c
+index 76036a41143b9..841737bbda9e5 100644
+--- a/kernel/resource.c
++++ b/kernel/resource.c
+@@ -1126,6 +1126,7 @@ struct resource * __request_region(struct resource *parent,
+ {
+       DECLARE_WAITQUEUE(wait, current);
+       struct resource *res = alloc_resource(GFP_KERNEL);
++      struct resource *orig_parent = parent;
+       if (!res)
+               return NULL;
+@@ -1176,6 +1177,10 @@ struct resource * __request_region(struct resource *parent,
+               break;
+       }
+       write_unlock(&resource_lock);
++
++      if (res && orig_parent == &iomem_resource)
++              revoke_devmem(res);
++
+       return res;
+ }
+ EXPORT_SYMBOL(__request_region);
+-- 
+2.25.1
+
diff --git a/queue-5.7/dlm-remove-bug-before-panic.patch b/queue-5.7/dlm-remove-bug-before-panic.patch
new file mode 100644 (file)
index 0000000..0b15362
--- /dev/null
@@ -0,0 +1,51 @@
+From b8468b7050215ab700a64c303d30fbe68a1a4037 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 7 May 2020 23:34:28 +0200
+Subject: dlm: remove BUG() before panic()
+
+From: Arnd Bergmann <arnd@arndb.de>
+
+[ Upstream commit fe204591cc9480347af7d2d6029b24a62e449486 ]
+
+Building a kernel with clang sometimes fails with an objtool error in dlm:
+
+fs/dlm/lock.o: warning: objtool: revert_lock_pc()+0xbd: can't find jump dest instruction at .text+0xd7fc
+
+The problem is that BUG() never returns and the compiler knows
+that anything after it is unreachable, however the panic still
+emits some code that does not get fully eliminated.
+
+Having both BUG() and panic() is really pointless as the BUG()
+kills the current process and the subsequent panic() never hits.
+In most cases, we probably don't really want either and should
+replace the DLM_ASSERT() statements with WARN_ON(), as has
+been done for some of them.
+
+Remove the BUG() here so the user at least sees the panic message
+and we can reliably build randconfig kernels.
+
+Fixes: e7fd41792fc0 ("[DLM] The core of the DLM for GFS2/CLVM")
+Cc: Josh Poimboeuf <jpoimboe@redhat.com>
+Cc: clang-built-linux@googlegroups.com
+Signed-off-by: Arnd Bergmann <arnd@arndb.de>
+Signed-off-by: David Teigland <teigland@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/dlm/dlm_internal.h | 1 -
+ 1 file changed, 1 deletion(-)
+
+diff --git a/fs/dlm/dlm_internal.h b/fs/dlm/dlm_internal.h
+index 416d9de356791..4311d01b02a8b 100644
+--- a/fs/dlm/dlm_internal.h
++++ b/fs/dlm/dlm_internal.h
+@@ -97,7 +97,6 @@ do { \
+                __LINE__, __FILE__, #x, jiffies); \
+     {do} \
+     printk("\n"); \
+-    BUG(); \
+     panic("DLM:  Record message above and reboot.\n"); \
+   } \
+ }
+-- 
+2.25.1
+
diff --git a/queue-5.7/dm-mpath-switch-paths-in-dm_blk_ioctl-code-path.patch b/queue-5.7/dm-mpath-switch-paths-in-dm_blk_ioctl-code-path.patch
new file mode 100644 (file)
index 0000000..4602b09
--- /dev/null
@@ -0,0 +1,49 @@
+From b4feb9f7dc8ed2f05d14f820fc8d6d4da8c96491 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 20 Apr 2020 22:29:09 +0200
+Subject: dm mpath: switch paths in dm_blk_ioctl() code path
+
+From: Martin Wilck <mwilck@suse.com>
+
+[ Upstream commit 2361ae595352dec015d14292f1b539242d8446d6 ]
+
+SCSI LUN passthrough code such as qemu's "scsi-block" device model
+pass every IO to the host via SG_IO ioctls. Currently, dm-multipath
+calls choose_pgpath() only in the block IO code path, not in the ioctl
+code path (unless current_pgpath is NULL). This has the effect that no
+path switching and thus no load balancing is done for SCSI-passthrough
+IO, unless the active path fails.
+
+Fix this by using the same logic in multipath_prepare_ioctl() as in
+multipath_clone_and_map().
+
+Note: The allegedly best path selection algorithm, service-time,
+still wouldn't work perfectly, because the io size of the current
+request is always set to 0. Changing that for the IO passthrough
+case would require the ioctl cmd and arg to be passed to dm's
+prepare_ioctl() method.
+
+Signed-off-by: Martin Wilck <mwilck@suse.com>
+Reviewed-by: Hannes Reinecke <hare@suse.de>
+Signed-off-by: Mike Snitzer <snitzer@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/md/dm-mpath.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/md/dm-mpath.c b/drivers/md/dm-mpath.c
+index 3e500098132f1..e0c800cf87a9b 100644
+--- a/drivers/md/dm-mpath.c
++++ b/drivers/md/dm-mpath.c
+@@ -1918,7 +1918,7 @@ static int multipath_prepare_ioctl(struct dm_target *ti,
+       int r;
+       current_pgpath = READ_ONCE(m->current_pgpath);
+-      if (!current_pgpath)
++      if (!current_pgpath || !test_bit(MPATHF_QUEUE_IO, &m->flags))
+               current_pgpath = choose_pgpath(m, 0);
+       if (current_pgpath) {
+-- 
+2.25.1
+
diff --git a/queue-5.7/dm-zoned-return-null-if-dmz_get_zone_for_reclaim-fai.patch b/queue-5.7/dm-zoned-return-null-if-dmz_get_zone_for_reclaim-fai.patch
new file mode 100644 (file)
index 0000000..ea899fe
--- /dev/null
@@ -0,0 +1,64 @@
+From e9bfeba4934b182de16379ee6c0dc2ae875b7efd Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 19 May 2020 10:14:19 +0200
+Subject: dm zoned: return NULL if dmz_get_zone_for_reclaim() fails to find a
+ zone
+
+From: Hannes Reinecke <hare@suse.de>
+
+[ Upstream commit 489dc0f06a5837f87482c0ce61d830d24e17082e ]
+
+The only case where dmz_get_zone_for_reclaim() cannot return a zone is
+if the respective lists are empty. So we should just return a simple
+NULL value here as we really don't have an error code which would make
+sense.
+
+Signed-off-by: Hannes Reinecke <hare@suse.de>
+Reviewed-by: Damien Le Moal <damien.lemoal@wdc.com>
+Signed-off-by: Mike Snitzer <snitzer@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/md/dm-zoned-metadata.c | 4 ++--
+ drivers/md/dm-zoned-reclaim.c  | 4 ++--
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/md/dm-zoned-metadata.c b/drivers/md/dm-zoned-metadata.c
+index 369de15c4e80c..61b7d7b7e5a6b 100644
+--- a/drivers/md/dm-zoned-metadata.c
++++ b/drivers/md/dm-zoned-metadata.c
+@@ -1554,7 +1554,7 @@ static struct dm_zone *dmz_get_rnd_zone_for_reclaim(struct dmz_metadata *zmd)
+                       return dzone;
+       }
+-      return ERR_PTR(-EBUSY);
++      return NULL;
+ }
+ /*
+@@ -1574,7 +1574,7 @@ static struct dm_zone *dmz_get_seq_zone_for_reclaim(struct dmz_metadata *zmd)
+                       return zone;
+       }
+-      return ERR_PTR(-EBUSY);
++      return NULL;
+ }
+ /*
+diff --git a/drivers/md/dm-zoned-reclaim.c b/drivers/md/dm-zoned-reclaim.c
+index e7ace908a9b7d..d50817320e8e3 100644
+--- a/drivers/md/dm-zoned-reclaim.c
++++ b/drivers/md/dm-zoned-reclaim.c
+@@ -349,8 +349,8 @@ static int dmz_do_reclaim(struct dmz_reclaim *zrc)
+       /* Get a data zone */
+       dzone = dmz_get_zone_for_reclaim(zmd);
+-      if (IS_ERR(dzone))
+-              return PTR_ERR(dzone);
++      if (!dzone)
++              return -EBUSY;
+       start = jiffies;
+-- 
+2.25.1
+
diff --git a/queue-5.7/drivers-base-fix-null-pointer-exception-in-__platfor.patch b/queue-5.7/drivers-base-fix-null-pointer-exception-in-__platfor.patch
new file mode 100644 (file)
index 0000000..63d3f10
--- /dev/null
@@ -0,0 +1,85 @@
+From 99fb36adf2a0f6264983f34a4d7e72554679cea9 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 8 Apr 2020 14:40:03 -0700
+Subject: drivers: base: Fix NULL pointer exception in
+ __platform_driver_probe() if a driver developer is foolish
+
+From: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com>
+
+[ Upstream commit 388bcc6ecc609fca1b4920de7dc3806c98ec535e ]
+
+If platform bus driver registration is failed then, accessing
+platform bus spin lock (&drv->driver.bus->p->klist_drivers.k_lock)
+in __platform_driver_probe() without verifying the return value
+__platform_driver_register() can lead to NULL pointer exception.
+
+So check the return value before attempting the spin lock.
+
+One such example is below:
+
+For a custom usecase, I have intentionally failed the platform bus
+registration and I expected all the platform device/driver
+registrations to fail gracefully. But I came across this panic
+issue.
+
+[    1.331067] BUG: kernel NULL pointer dereference, address: 00000000000000c8
+[    1.331118] #PF: supervisor write access in kernel mode
+[    1.331163] #PF: error_code(0x0002) - not-present page
+[    1.331208] PGD 0 P4D 0
+[    1.331233] Oops: 0002 [#1] PREEMPT SMP
+[    1.331268] CPU: 3 PID: 1 Comm: swapper/0 Tainted: G        W         5.6.0-00049-g670d35fb0144 #165
+[    1.331341] Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 0.0.0 02/06/2015
+[    1.331406] RIP: 0010:_raw_spin_lock+0x15/0x30
+[    1.331588] RSP: 0000:ffffc9000001be70 EFLAGS: 00010246
+[    1.331632] RAX: 0000000000000000 RBX: 00000000000000c8 RCX: 0000000000000001
+[    1.331696] RDX: 0000000000000001 RSI: 0000000000000092 RDI: 0000000000000000
+[    1.331754] RBP: 00000000ffffffed R08: 0000000000000501 R09: 0000000000000001
+[    1.331817] R10: ffff88817abcc520 R11: 0000000000000670 R12: 00000000ffffffed
+[    1.331881] R13: ffffffff82dbc268 R14: ffffffff832f070a R15: 0000000000000000
+[    1.331945] FS:  0000000000000000(0000) GS:ffff88817bd80000(0000) knlGS:0000000000000000
+[    1.332008] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
+[    1.332062] CR2: 00000000000000c8 CR3: 000000000681e001 CR4: 00000000003606e0
+[    1.332126] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
+[    1.332189] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
+[    1.332252] Call Trace:
+[    1.332281]  __platform_driver_probe+0x92/0xee
+[    1.332323]  ? rtc_dev_init+0x2b/0x2b
+[    1.332358]  cmos_init+0x37/0x67
+[    1.332396]  do_one_initcall+0x7d/0x168
+[    1.332428]  kernel_init_freeable+0x16c/0x1c9
+[    1.332473]  ? rest_init+0xc0/0xc0
+[    1.332508]  kernel_init+0x5/0x100
+[    1.332543]  ret_from_fork+0x1f/0x30
+[    1.332579] CR2: 00000000000000c8
+[    1.332616] ---[ end trace 3bd87f12e9010b87 ]---
+[    1.333549] note: swapper/0[1] exited with preempt_count 1
+[    1.333592] Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000009
+[    1.333736] Kernel Offset: disabled
+
+Note, this can only be triggered if a driver errors out from this call,
+which should never happen.  If it does, the driver needs to be fixed.
+
+Signed-off-by: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com>
+Link: https://lore.kernel.org/r/20200408214003.3356-1-sathyanarayanan.kuppuswamy@linux.intel.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/base/platform.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/drivers/base/platform.c b/drivers/base/platform.c
+index b27d0f6c18c9c..f5d485166fd3f 100644
+--- a/drivers/base/platform.c
++++ b/drivers/base/platform.c
+@@ -851,6 +851,8 @@ int __init_or_module __platform_driver_probe(struct platform_driver *drv,
+       /* temporary section violation during probe() */
+       drv->probe = probe;
+       retval = code = __platform_driver_register(drv, module);
++      if (retval)
++              return retval;
+       /*
+        * Fixup that section violation, being paranoid about code scanning
+-- 
+2.25.1
+
diff --git a/queue-5.7/drivers-perf-hisi-fix-wrong-value-for-all-counters-e.patch b/queue-5.7/drivers-perf-hisi-fix-wrong-value-for-all-counters-e.patch
new file mode 100644 (file)
index 0000000..d982739
--- /dev/null
@@ -0,0 +1,41 @@
+From d58ae374883c7de36ff0bd3e0e7356ea7500d5d8 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 5 Jun 2020 17:43:41 +0800
+Subject: drivers/perf: hisi: Fix wrong value for all counters enable
+
+From: Shaokun Zhang <zhangshaokun@hisilicon.com>
+
+[ Upstream commit 961abd78adcb4c72c343fcd9f9dc5e2ebbe9b448 ]
+
+In L3C uncore PMU drivers, bit16 is used to control all counters enable &
+disable. Wrong value is given in the driver and its default value is 1'b1,
+it can work because each PMU counter has its own control bits too.
+Let's fix the wrong value.
+
+Fixes: 2940bc433370 ("perf: hisi: Add support for HiSilicon SoC L3C PMU driver")
+Signed-off-by: Shaokun Zhang <zhangshaokun@hisilicon.com>
+Cc: Will Deacon <will@kernel.org>
+Cc: Mark Rutland <mark.rutland@arm.com>
+Link: https://lore.kernel.org/r/1591350221-32275-1-git-send-email-zhangshaokun@hisilicon.com
+Signed-off-by: Will Deacon <will@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/perf/hisilicon/hisi_uncore_l3c_pmu.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/perf/hisilicon/hisi_uncore_l3c_pmu.c b/drivers/perf/hisilicon/hisi_uncore_l3c_pmu.c
+index 1151e99b241cb..479de4be99eba 100644
+--- a/drivers/perf/hisilicon/hisi_uncore_l3c_pmu.c
++++ b/drivers/perf/hisilicon/hisi_uncore_l3c_pmu.c
+@@ -35,7 +35,7 @@
+ /* L3C has 8-counters */
+ #define L3C_NR_COUNTERS               0x8
+-#define L3C_PERF_CTRL_EN      0x20000
++#define L3C_PERF_CTRL_EN      0x10000
+ #define L3C_EVTYPE_NONE               0xff
+ /*
+-- 
+2.25.1
+
diff --git a/queue-5.7/drivers-phy-sr-usb-do-not-use-internal-fsm-for-usb2-.patch b/queue-5.7/drivers-phy-sr-usb-do-not-use-internal-fsm-for-usb2-.patch
new file mode 100644 (file)
index 0000000..bc58eaf
--- /dev/null
@@ -0,0 +1,150 @@
+From 96e328614a13ce572239155c7548ffefaa16287b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 13 May 2020 23:09:47 +0530
+Subject: drivers: phy: sr-usb: do not use internal fsm for USB2 phy init
+
+From: Bharat Gooty <bharat.gooty@broadcom.com>
+
+[ Upstream commit 6f0577d1411337a0d97d545abe4a784e9e611516 ]
+
+During different reboot cycles, USB PHY PLL may not always lock
+during initialization and therefore can cause USB to be not usable.
+
+Hence do not use internal FSM programming sequence for the USB
+PHY initialization.
+
+Fixes: 4dcddbb38b64 ("phy: sr-usb: Add Stingray USB PHY driver")
+Signed-off-by: Bharat Gooty <bharat.gooty@broadcom.com>
+Signed-off-by: Rayagonda Kokatanur <rayagonda.kokatanur@broadcom.com>
+Link: https://lore.kernel.org/r/20200513173947.10919-1-rayagonda.kokatanur@broadcom.com
+Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/phy/broadcom/phy-bcm-sr-usb.c | 55 +--------------------------
+ 1 file changed, 2 insertions(+), 53 deletions(-)
+
+diff --git a/drivers/phy/broadcom/phy-bcm-sr-usb.c b/drivers/phy/broadcom/phy-bcm-sr-usb.c
+index fe6c58910e4cb..7c7862b4f41f0 100644
+--- a/drivers/phy/broadcom/phy-bcm-sr-usb.c
++++ b/drivers/phy/broadcom/phy-bcm-sr-usb.c
+@@ -16,8 +16,6 @@ enum bcm_usb_phy_version {
+ };
+ enum bcm_usb_phy_reg {
+-      PLL_NDIV_FRAC,
+-      PLL_NDIV_INT,
+       PLL_CTRL,
+       PHY_CTRL,
+       PHY_PLL_CTRL,
+@@ -31,18 +29,11 @@ static const u8 bcm_usb_combo_phy_ss[] = {
+ };
+ static const u8 bcm_usb_combo_phy_hs[] = {
+-      [PLL_NDIV_FRAC] = 0x04,
+-      [PLL_NDIV_INT]  = 0x08,
+       [PLL_CTRL]      = 0x0c,
+       [PHY_CTRL]      = 0x10,
+ };
+-#define HSPLL_NDIV_INT_VAL    0x13
+-#define HSPLL_NDIV_FRAC_VAL   0x1005
+-
+ static const u8 bcm_usb_hs_phy[] = {
+-      [PLL_NDIV_FRAC] = 0x0,
+-      [PLL_NDIV_INT]  = 0x4,
+       [PLL_CTRL]      = 0x8,
+       [PHY_CTRL]      = 0xc,
+ };
+@@ -52,7 +43,6 @@ enum pll_ctrl_bits {
+       SSPLL_SUSPEND_EN,
+       PLL_SEQ_START,
+       PLL_LOCK,
+-      PLL_PDIV,
+ };
+ static const u8 u3pll_ctrl[] = {
+@@ -66,29 +56,17 @@ static const u8 u3pll_ctrl[] = {
+ #define HSPLL_PDIV_VAL                0x1
+ static const u8 u2pll_ctrl[] = {
+-      [PLL_PDIV]      = 1,
+       [PLL_RESETB]    = 5,
+       [PLL_LOCK]      = 6,
+ };
+ enum bcm_usb_phy_ctrl_bits {
+       CORERDY,
+-      AFE_LDO_PWRDWNB,
+-      AFE_PLL_PWRDWNB,
+-      AFE_BG_PWRDWNB,
+-      PHY_ISO,
+       PHY_RESETB,
+       PHY_PCTL,
+ };
+ #define PHY_PCTL_MASK 0xffff
+-/*
+- * 0x0806 of PCTL_VAL has below bits set
+- * BIT-8 : refclk divider 1
+- * BIT-3:2: device mode; mode is not effect
+- * BIT-1: soft reset active low
+- */
+-#define HSPHY_PCTL_VAL        0x0806
+ #define SSPHY_PCTL_VAL        0x0006
+ static const u8 u3phy_ctrl[] = {
+@@ -98,10 +76,6 @@ static const u8 u3phy_ctrl[] = {
+ static const u8 u2phy_ctrl[] = {
+       [CORERDY]               = 0,
+-      [AFE_LDO_PWRDWNB]       = 1,
+-      [AFE_PLL_PWRDWNB]       = 2,
+-      [AFE_BG_PWRDWNB]        = 3,
+-      [PHY_ISO]               = 4,
+       [PHY_RESETB]            = 5,
+       [PHY_PCTL]              = 6,
+ };
+@@ -186,38 +160,13 @@ static int bcm_usb_hs_phy_init(struct bcm_usb_phy_cfg *phy_cfg)
+       int ret = 0;
+       void __iomem *regs = phy_cfg->regs;
+       const u8 *offset;
+-      u32 rd_data;
+       offset = phy_cfg->offset;
+-      writel(HSPLL_NDIV_INT_VAL, regs + offset[PLL_NDIV_INT]);
+-      writel(HSPLL_NDIV_FRAC_VAL, regs + offset[PLL_NDIV_FRAC]);
+-
+-      rd_data = readl(regs + offset[PLL_CTRL]);
+-      rd_data &= ~(HSPLL_PDIV_MASK << u2pll_ctrl[PLL_PDIV]);
+-      rd_data |= (HSPLL_PDIV_VAL << u2pll_ctrl[PLL_PDIV]);
+-      writel(rd_data, regs + offset[PLL_CTRL]);
+-
+-      /* Set Core Ready high */
+-      bcm_usb_reg32_setbits(regs + offset[PHY_CTRL],
+-                            BIT(u2phy_ctrl[CORERDY]));
+-
+-      /* Maximum timeout for Core Ready done */
+-      msleep(30);
+-
++      bcm_usb_reg32_clrbits(regs + offset[PLL_CTRL],
++                            BIT(u2pll_ctrl[PLL_RESETB]));
+       bcm_usb_reg32_setbits(regs + offset[PLL_CTRL],
+                             BIT(u2pll_ctrl[PLL_RESETB]));
+-      bcm_usb_reg32_setbits(regs + offset[PHY_CTRL],
+-                            BIT(u2phy_ctrl[PHY_RESETB]));
+-
+-
+-      rd_data = readl(regs + offset[PHY_CTRL]);
+-      rd_data &= ~(PHY_PCTL_MASK << u2phy_ctrl[PHY_PCTL]);
+-      rd_data |= (HSPHY_PCTL_VAL << u2phy_ctrl[PHY_PCTL]);
+-      writel(rd_data, regs + offset[PHY_CTRL]);
+-
+-      /* Maximum timeout for PLL reset done */
+-      msleep(30);
+       ret = bcm_usb_pll_lock_check(regs + offset[PLL_CTRL],
+                                    BIT(u2pll_ctrl[PLL_LOCK]));
+-- 
+2.25.1
+
diff --git a/queue-5.7/drm-amd-display-revalidate-bandwidth-before-commitin.patch b/queue-5.7/drm-amd-display-revalidate-bandwidth-before-commitin.patch
new file mode 100644 (file)
index 0000000..fb07de0
--- /dev/null
@@ -0,0 +1,61 @@
+From bcf8d84b81caaba35494b3bd40d4d03af4eca9f9 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 2 Jun 2020 20:42:33 -0400
+Subject: drm/amd/display: Revalidate bandwidth before commiting DC updates
+
+From: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com>
+
+[ Upstream commit a24eaa5c51255b344d5a321f1eeb3205f2775498 ]
+
+[Why]
+Whenever we switch between tiled formats without also switching pixel
+formats or doing anything else that recreates the DC plane state we
+can run into underflow or hangs since we're not updating the
+DML parameters before committing to the hardware.
+
+[How]
+If the update type is FULL then call validate_bandwidth again to update
+the DML parmeters before committing the state.
+
+This is basically just a workaround and protective measure against
+update types being added DC where we could run into this issue in
+the future.
+
+We can only fully validate the state in advance before applying it to
+the hardware if we recreate all the plane and stream states since
+we can't modify what's currently in use.
+
+The next step is to update DM to ensure that we're creating the plane
+and stream states for whatever could potentially be a full update in
+DC to pre-emptively recreate the state for DC global validation.
+
+The workaround can stay until this has been fixed in DM.
+
+Signed-off-by: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com>
+Reviewed-by: Hersen Wu <hersenxs.wu@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/gpu/drm/amd/display/dc/core/dc.c | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c b/drivers/gpu/drm/amd/display/dc/core/dc.c
+index 47431ca6986db..4a619328101ce 100644
+--- a/drivers/gpu/drm/amd/display/dc/core/dc.c
++++ b/drivers/gpu/drm/amd/display/dc/core/dc.c
+@@ -2517,6 +2517,12 @@ void dc_commit_updates_for_stream(struct dc *dc,
+       copy_stream_update_to_stream(dc, context, stream, stream_update);
++      if (!dc->res_pool->funcs->validate_bandwidth(dc, context, false)) {
++              DC_ERROR("Mode validation failed for stream update!\n");
++              dc_release_state(context);
++              return;
++      }
++
+       commit_planes_for_stream(
+                               dc,
+                               srf_updates,
+-- 
+2.25.1
+
diff --git a/queue-5.7/drm-ast-fix-missing-break-in-switch-statement-for-fo.patch b/queue-5.7/drm-ast-fix-missing-break-in-switch-statement-for-fo.patch
new file mode 100644 (file)
index 0000000..343d855
--- /dev/null
@@ -0,0 +1,42 @@
+From 460a5347924dc44f84d5b78f24350d7f39bdd025 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 10 Jun 2020 12:58:04 +0100
+Subject: drm/ast: fix missing break in switch statement for format->cpp[0]
+ case 4
+
+From: Colin Ian King <colin.king@canonical.com>
+
+[ Upstream commit 291ddeb621e4a9f1ced8302a777fbd7fbda058c6 ]
+
+Currently the switch statement for format->cpp[0] value 4 assigns
+color_index which is never read again and then falls through to the
+default case and returns. This looks like a missing break statement
+bug. Fix this by adding a break statement.
+
+Addresses-Coverity: ("Unused value")
+Fixes: 259d14a76a27 ("drm/ast: Split ast_set_vbios_mode_info()")
+Signed-off-by: Colin Ian King <colin.king@canonical.com>
+Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
+Tested-by: Thomas Zimmermann <tzimmermann@suse.de>
+Reviewed-by: Thomas Zimmermann <tzimmermann@suse.de>
+Link: https://patchwork.freedesktop.org/patch/msgid/20200610115804.1132338-1-colin.king@canonical.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/gpu/drm/ast/ast_mode.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/gpu/drm/ast/ast_mode.c b/drivers/gpu/drm/ast/ast_mode.c
+index 7a9f20a2fd303..fbf0ef58385db 100644
+--- a/drivers/gpu/drm/ast/ast_mode.c
++++ b/drivers/gpu/drm/ast/ast_mode.c
+@@ -226,6 +226,7 @@ static void ast_set_vbios_color_reg(struct ast_private *ast,
+       case 3:
+       case 4:
+               color_index = TrueCModeIndex;
++              break;
+       default:
+               return;
+       }
+-- 
+2.25.1
+
diff --git a/queue-5.7/drm-encoder_slave-fix-refcouting-error-for-modules.patch b/queue-5.7/drm-encoder_slave-fix-refcouting-error-for-modules.patch
new file mode 100644 (file)
index 0000000..07dc3c9
--- /dev/null
@@ -0,0 +1,50 @@
+From 120532c6954b5a2689e13e0d730b516028014db6 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 15 Jun 2020 09:58:10 +0200
+Subject: drm: encoder_slave: fix refcouting error for modules
+
+From: Wolfram Sang <wsa+renesas@sang-engineering.com>
+
+[ Upstream commit f78d4032de60f50fd4afaa0fb68ea03b985f820a ]
+
+module_put() balances try_module_get(), not request_module(). Fix the
+error path to match that.
+
+Fixes: 2066facca4c7 ("drm/kms: slave encoder interface.")
+Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
+Reviewed-by: Emil Velikov <emil.l.velikov@gmail.com>
+Acked-by: Daniel Vetter <daniel.vetter@ffwll.ch>
+Signed-off-by: Wolfram Sang <wsa@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/gpu/drm/drm_encoder_slave.c | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/gpu/drm/drm_encoder_slave.c b/drivers/gpu/drm/drm_encoder_slave.c
+index cf804389f5eca..d50a7884e69e1 100644
+--- a/drivers/gpu/drm/drm_encoder_slave.c
++++ b/drivers/gpu/drm/drm_encoder_slave.c
+@@ -84,7 +84,7 @@ int drm_i2c_encoder_init(struct drm_device *dev,
+       err = encoder_drv->encoder_init(client, dev, encoder);
+       if (err)
+-              goto fail_unregister;
++              goto fail_module_put;
+       if (info->platform_data)
+               encoder->slave_funcs->set_config(&encoder->base,
+@@ -92,9 +92,10 @@ int drm_i2c_encoder_init(struct drm_device *dev,
+       return 0;
++fail_module_put:
++      module_put(module);
+ fail_unregister:
+       i2c_unregister_device(client);
+-      module_put(module);
+ fail:
+       return err;
+ }
+-- 
+2.25.1
+
diff --git a/queue-5.7/drm-msm-fix-undefined-rd_full-link-error.patch b/queue-5.7/drm-msm-fix-undefined-rd_full-link-error.patch
new file mode 100644 (file)
index 0000000..8409f51
--- /dev/null
@@ -0,0 +1,47 @@
+From 8764da1ff3a8cbf71b039af938c0d6bc9479ca68 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 30 Apr 2020 12:24:27 -0700
+Subject: drm/msm: Fix undefined "rd_full" link error
+
+From: Bjorn Andersson <bjorn.andersson@linaro.org>
+
+[ Upstream commit 20aebe83698feb107d5a66b6cfd1d54459ccdfcf ]
+
+rd_full should be defined outside the CONFIG_DEBUG_FS region, in order
+to be able to link the msm driver even when CONFIG_DEBUG_FS is disabled.
+
+Fixes: e515af8d4a6f ("drm/msm: devcoredump should dump MSM_SUBMIT_BO_DUMP buffers")
+Reported-by: Stephen Rothwell <sfr@canb.auug.org.au>
+Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
+Reviewed-by: Rob Clark <robdclark@gmail.com>
+Signed-off-by: Rob Clark <robdclark@chromium.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/gpu/drm/msm/msm_rd.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/gpu/drm/msm/msm_rd.c b/drivers/gpu/drm/msm/msm_rd.c
+index 732f65df5c4f4..fea30e7aa9e83 100644
+--- a/drivers/gpu/drm/msm/msm_rd.c
++++ b/drivers/gpu/drm/msm/msm_rd.c
+@@ -29,8 +29,6 @@
+  * or shader programs (if not emitted inline in cmdstream).
+  */
+-#ifdef CONFIG_DEBUG_FS
+-
+ #include <linux/circ_buf.h>
+ #include <linux/debugfs.h>
+ #include <linux/kfifo.h>
+@@ -47,6 +45,8 @@ bool rd_full = false;
+ MODULE_PARM_DESC(rd_full, "If true, $debugfs/.../rd will snapshot all buffer contents");
+ module_param_named(rd_full, rd_full, bool, 0600);
++#ifdef CONFIG_DEBUG_FS
++
+ enum rd_sect_type {
+       RD_NONE,
+       RD_TEST,       /* ascii text */
+-- 
+2.25.1
+
diff --git a/queue-5.7/drm-msm-mdp5-fix-mdp5_init-error-path-for-failed-mdp.patch b/queue-5.7/drm-msm-mdp5-fix-mdp5_init-error-path-for-failed-mdp.patch
new file mode 100644 (file)
index 0000000..3685c3a
--- /dev/null
@@ -0,0 +1,37 @@
+From 4636ad26b09e586af407d1de20a45e4730f756a4 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 7 Apr 2020 18:07:37 +0100
+Subject: drm/msm/mdp5: Fix mdp5_init error path for failed mdp5_kms allocation
+
+From: Roy Spliet <nouveau@spliet.org>
+
+[ Upstream commit e4337877c5d578722c0716f131fb774522013cf5 ]
+
+When allocation for mdp5_kms fails, calling mdp5_destroy() leads to undefined
+behaviour, likely a nullptr exception or use-after-free troubles.
+
+Signed-off-by: Roy Spliet <nouveau@spliet.org>
+Reviewed-by: Abhinav Kumar <abhinavk@codeaurora.org>
+Signed-off-by: Rob Clark <robdclark@chromium.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c b/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c
+index 47b989834af16..c23a2fa13fb97 100644
+--- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c
++++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c
+@@ -943,7 +943,8 @@ static int mdp5_init(struct platform_device *pdev, struct drm_device *dev)
+       return 0;
+ fail:
+-      mdp5_destroy(pdev);
++      if (mdp5_kms)
++              mdp5_destroy(pdev);
+       return ret;
+ }
+-- 
+2.25.1
+
diff --git a/queue-5.7/drm-nouveau-disp-gm200-fix-nv_pdisp_sor_hdmi2_ctrl-n.patch b/queue-5.7/drm-nouveau-disp-gm200-fix-nv_pdisp_sor_hdmi2_ctrl-n.patch
new file mode 100644 (file)
index 0000000..ceaec61
--- /dev/null
@@ -0,0 +1,40 @@
+From ec4c8e1e477b49dcaa3a05fed4bc36eb1d6bc3ce Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 29 May 2020 15:18:47 +1000
+Subject: drm/nouveau/disp/gm200-: fix NV_PDISP_SOR_HDMI2_CTRL(n) selection
+
+From: Ben Skeggs <bskeggs@redhat.com>
+
+[ Upstream commit a1ef8bad506e4ffa0c57ac5f8cb99ab5cbc3b1fc ]
+
+This is a SOR register, and not indexed by the bound head.
+
+Fixes display not coming up on high-bandwidth HDMI displays under a
+number of configurations.
+
+Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/gpu/drm/nouveau/nvkm/engine/disp/hdmigm200.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/disp/hdmigm200.c b/drivers/gpu/drm/nouveau/nvkm/engine/disp/hdmigm200.c
+index 9b16a08eb4d9f..bf6d41fb0c9fe 100644
+--- a/drivers/gpu/drm/nouveau/nvkm/engine/disp/hdmigm200.c
++++ b/drivers/gpu/drm/nouveau/nvkm/engine/disp/hdmigm200.c
+@@ -27,10 +27,10 @@ void
+ gm200_hdmi_scdc(struct nvkm_ior *ior, int head, u8 scdc)
+ {
+       struct nvkm_device *device = ior->disp->engine.subdev.device;
+-      const u32 hoff = head * 0x800;
++      const u32 soff = nv50_ior_base(ior);
+       const u32 ctrl = scdc & 0x3;
+-      nvkm_mask(device, 0x61c5bc + hoff, 0x00000003, ctrl);
++      nvkm_mask(device, 0x61c5bc + soff, 0x00000003, ctrl);
+       ior->tmds.high_speed = !!(scdc & 0x2);
+ }
+-- 
+2.25.1
+
diff --git a/queue-5.7/drm-nouveau-gr-gk20a-use-firmware-version-0.patch b/queue-5.7/drm-nouveau-gr-gk20a-use-firmware-version-0.patch
new file mode 100644 (file)
index 0000000..ce0dabe
--- /dev/null
@@ -0,0 +1,38 @@
+From e558012efcf153b3d24409892ee2ad9b11281845 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 3 Jun 2020 16:20:02 +0200
+Subject: drm/nouveau: gr/gk20a: Use firmware version 0
+
+From: Thierry Reding <treding@nvidia.com>
+
+[ Upstream commit 21454fe697fde188ad6fb541f94b9838fa73ab38 ]
+
+Tegra firmware doesn't actually use any version numbers and passing -1
+causes the existing firmware binaries not to be found. Use version 0 to
+find the correct files.
+
+Fixes: ef16dc278ec2 ("drm/nouveau/gr/gf100-: select implementation based on available FW")
+Signed-off-by: Thierry Reding <treding@nvidia.com>
+Reviewed-by: Emil Velikov <emil.l.velikov@gmail.com>
+Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/gpu/drm/nouveau/nvkm/engine/gr/gk20a.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/gr/gk20a.c b/drivers/gpu/drm/nouveau/nvkm/engine/gr/gk20a.c
+index 4209b24a46d70..bf6b65257852f 100644
+--- a/drivers/gpu/drm/nouveau/nvkm/engine/gr/gk20a.c
++++ b/drivers/gpu/drm/nouveau/nvkm/engine/gr/gk20a.c
+@@ -341,7 +341,7 @@ gk20a_gr_load(struct gf100_gr *gr, int ver, const struct gf100_gr_fwif *fwif)
+ static const struct gf100_gr_fwif
+ gk20a_gr_fwif[] = {
+-      { -1, gk20a_gr_load, &gk20a_gr },
++      { 0, gk20a_gr_load, &gk20a_gr },
+       {}
+ };
+-- 
+2.25.1
+
diff --git a/queue-5.7/drm-sun4i-hdmi-ddc-clk-fix-size-of-m-divider.patch b/queue-5.7/drm-sun4i-hdmi-ddc-clk-fix-size-of-m-divider.patch
new file mode 100644 (file)
index 0000000..19a91ef
--- /dev/null
@@ -0,0 +1,51 @@
+From ae97803e4bd23a51a5f7a9f2ef7a6ce2c5e84a03 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 13 Apr 2020 11:54:57 +0200
+Subject: drm/sun4i: hdmi ddc clk: Fix size of m divider
+
+From: Jernej Skrabec <jernej.skrabec@siol.net>
+
+[ Upstream commit 54e1e06bcf1cf6e7ac3f86daa5f7454add24b494 ]
+
+m divider in DDC clock register is 4 bits wide. Fix that.
+
+Fixes: 9c5681011a0c ("drm/sun4i: Add HDMI support")
+Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
+Reviewed-by: Chen-Yu Tsai <wens@csie.org>
+Signed-off-by: Maxime Ripard <maxime@cerno.tech>
+Link: https://patchwork.freedesktop.org/patch/msgid/20200413095457.1176754-1-jernej.skrabec@siol.net
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/gpu/drm/sun4i/sun4i_hdmi.h         | 2 +-
+ drivers/gpu/drm/sun4i/sun4i_hdmi_ddc_clk.c | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/gpu/drm/sun4i/sun4i_hdmi.h b/drivers/gpu/drm/sun4i/sun4i_hdmi.h
+index 7ad3f06c127e7..00ca35f07ba5b 100644
+--- a/drivers/gpu/drm/sun4i/sun4i_hdmi.h
++++ b/drivers/gpu/drm/sun4i/sun4i_hdmi.h
+@@ -148,7 +148,7 @@
+ #define SUN4I_HDMI_DDC_CMD_IMPLICIT_WRITE     3
+ #define SUN4I_HDMI_DDC_CLK_REG                0x528
+-#define SUN4I_HDMI_DDC_CLK_M(m)                       (((m) & 0x7) << 3)
++#define SUN4I_HDMI_DDC_CLK_M(m)                       (((m) & 0xf) << 3)
+ #define SUN4I_HDMI_DDC_CLK_N(n)                       ((n) & 0x7)
+ #define SUN4I_HDMI_DDC_LINE_CTRL_REG  0x540
+diff --git a/drivers/gpu/drm/sun4i/sun4i_hdmi_ddc_clk.c b/drivers/gpu/drm/sun4i/sun4i_hdmi_ddc_clk.c
+index 2ff780114106c..12430b9d4e930 100644
+--- a/drivers/gpu/drm/sun4i/sun4i_hdmi_ddc_clk.c
++++ b/drivers/gpu/drm/sun4i/sun4i_hdmi_ddc_clk.c
+@@ -33,7 +33,7 @@ static unsigned long sun4i_ddc_calc_divider(unsigned long rate,
+       unsigned long best_rate = 0;
+       u8 best_m = 0, best_n = 0, _m, _n;
+-      for (_m = 0; _m < 8; _m++) {
++      for (_m = 0; _m < 16; _m++) {
+               for (_n = 0; _n < 8; _n++) {
+                       unsigned long tmp_rate;
+-- 
+2.25.1
+
diff --git a/queue-5.7/ext4-don-t-block-for-o_direct-if-iocb_nowait-is-set.patch b/queue-5.7/ext4-don-t-block-for-o_direct-if-iocb_nowait-is-set.patch
new file mode 100644 (file)
index 0000000..df02e7e
--- /dev/null
@@ -0,0 +1,45 @@
+From 9ac3d9bf827ab4da7a1158dd1004721da81a8d8a Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 24 May 2020 16:53:16 -0600
+Subject: ext4: don't block for O_DIRECT if IOCB_NOWAIT is set
+
+From: Jens Axboe <axboe@kernel.dk>
+
+[ Upstream commit 6e014c621e7271649f0d51e54dbe1db4c10486c8 ]
+
+Running with some debug patches to detect illegal blocking triggered the
+extend/unaligned condition in ext4. If ext4 needs to extend the file (and
+hence go to buffered IO), or if the app is doing unaligned IO, then ext4
+asks the iomap code to wait for IO completion. If the caller asked for
+no-wait semantics by setting IOCB_NOWAIT, then ext4 should return -EAGAIN
+instead.
+
+Signed-off-by: Jens Axboe <axboe@kernel.dk>
+
+Link: https://lore.kernel.org/r/76152096-2bbb-7682-8fce-4cb498bcd909@kernel.dk
+Signed-off-by: Theodore Ts'o <tytso@mit.edu>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/ext4/file.c | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+diff --git a/fs/ext4/file.c b/fs/ext4/file.c
+index b8e69f9e38587..2a01e31a032c4 100644
+--- a/fs/ext4/file.c
++++ b/fs/ext4/file.c
+@@ -502,6 +502,12 @@ static ssize_t ext4_dio_write_iter(struct kiocb *iocb, struct iov_iter *from)
+       if (ret <= 0)
+               return ret;
++      /* if we're going to block and IOCB_NOWAIT is set, return -EAGAIN */
++      if ((iocb->ki_flags & IOCB_NOWAIT) && (unaligned_io || extend)) {
++              ret = -EAGAIN;
++              goto out;
++      }
++
+       offset = iocb->ki_pos;
+       count = ret;
+-- 
+2.25.1
+
diff --git a/queue-5.7/ext4-handle-ext4_mark_inode_dirty-errors.patch b/queue-5.7/ext4-handle-ext4_mark_inode_dirty-errors.patch
new file mode 100644 (file)
index 0000000..e9dca8f
--- /dev/null
@@ -0,0 +1,731 @@
+From 433f5f0c85ed270fcfcdbcd26fea99cb2f4ddf7d Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 26 Apr 2020 18:34:37 -0700
+Subject: ext4: handle ext4_mark_inode_dirty errors
+
+From: Harshad Shirwadkar <harshadshirwadkar@gmail.com>
+
+[ Upstream commit 4209ae12b12265d475bba28634184423149bd14f ]
+
+ext4_mark_inode_dirty() can fail for real reasons. Ignoring its return
+value may lead ext4 to ignore real failures that would result in
+corruption / crashes. Harden ext4_mark_inode_dirty error paths to fail
+as soon as possible and return errors to the caller whenever
+appropriate.
+
+One of the possible scnearios when this bug could affected is that
+while creating a new inode, its directory entry gets added
+successfully but while writing the inode itself mark_inode_dirty
+returns error which is ignored. This would result in inconsistency
+that the directory entry points to a non-existent inode.
+
+Ran gce-xfstests smoke tests and verified that there were no
+regressions.
+
+Signed-off-by: Harshad Shirwadkar <harshadshirwadkar@gmail.com>
+Link: https://lore.kernel.org/r/20200427013438.219117-1-harshadshirwadkar@gmail.com
+Signed-off-by: Theodore Ts'o <tytso@mit.edu>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/ext4/acl.c       |  2 +-
+ fs/ext4/ext4.h      |  2 +-
+ fs/ext4/ext4_jbd2.h |  5 ++-
+ fs/ext4/extents.c   | 34 +++++++++++---------
+ fs/ext4/file.c      | 11 +++++--
+ fs/ext4/indirect.c  |  4 ++-
+ fs/ext4/inline.c    |  6 ++--
+ fs/ext4/inode.c     | 38 ++++++++++++++++-------
+ fs/ext4/migrate.c   | 12 ++++---
+ fs/ext4/namei.c     | 76 +++++++++++++++++++++++++++++----------------
+ fs/ext4/super.c     | 16 ++++++----
+ fs/ext4/xattr.c     |  6 ++--
+ 12 files changed, 139 insertions(+), 73 deletions(-)
+
+diff --git a/fs/ext4/acl.c b/fs/ext4/acl.c
+index 8c7bbf3e566de..470be69f19aa3 100644
+--- a/fs/ext4/acl.c
++++ b/fs/ext4/acl.c
+@@ -256,7 +256,7 @@ retry:
+       if (!error && update_mode) {
+               inode->i_mode = mode;
+               inode->i_ctime = current_time(inode);
+-              ext4_mark_inode_dirty(handle, inode);
++              error = ext4_mark_inode_dirty(handle, inode);
+       }
+ out_stop:
+       ext4_journal_stop(handle);
+diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
+index ad2dbf6e49245..51a85b50033a7 100644
+--- a/fs/ext4/ext4.h
++++ b/fs/ext4/ext4.h
+@@ -3354,7 +3354,7 @@ struct ext4_extent;
+  */
+ #define EXT_MAX_BLOCKS        0xffffffff
+-extern int ext4_ext_tree_init(handle_t *handle, struct inode *);
++extern void ext4_ext_tree_init(handle_t *handle, struct inode *inode);
+ extern int ext4_ext_index_trans_blocks(struct inode *inode, int extents);
+ extern int ext4_ext_map_blocks(handle_t *handle, struct inode *inode,
+                              struct ext4_map_blocks *map, int flags);
+diff --git a/fs/ext4/ext4_jbd2.h b/fs/ext4/ext4_jbd2.h
+index 4b9002f0e84c0..3bacf76d26093 100644
+--- a/fs/ext4/ext4_jbd2.h
++++ b/fs/ext4/ext4_jbd2.h
+@@ -222,7 +222,10 @@ ext4_mark_iloc_dirty(handle_t *handle,
+ int ext4_reserve_inode_write(handle_t *handle, struct inode *inode,
+                       struct ext4_iloc *iloc);
+-int ext4_mark_inode_dirty(handle_t *handle, struct inode *inode);
++#define ext4_mark_inode_dirty(__h, __i)                                       \
++              __ext4_mark_inode_dirty((__h), (__i), __func__, __LINE__)
++int __ext4_mark_inode_dirty(handle_t *handle, struct inode *inode,
++                              const char *func, unsigned int line);
+ int ext4_expand_extra_isize(struct inode *inode,
+                           unsigned int new_extra_isize,
+diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c
+index 2b4b94542e34d..5148695d520d2 100644
+--- a/fs/ext4/extents.c
++++ b/fs/ext4/extents.c
+@@ -816,7 +816,7 @@ ext4_ext_binsearch(struct inode *inode,
+ }
+-int ext4_ext_tree_init(handle_t *handle, struct inode *inode)
++void ext4_ext_tree_init(handle_t *handle, struct inode *inode)
+ {
+       struct ext4_extent_header *eh;
+@@ -826,7 +826,6 @@ int ext4_ext_tree_init(handle_t *handle, struct inode *inode)
+       eh->eh_magic = EXT4_EXT_MAGIC;
+       eh->eh_max = cpu_to_le16(ext4_ext_space_root(inode, 0));
+       ext4_mark_inode_dirty(handle, inode);
+-      return 0;
+ }
+ struct ext4_ext_path *
+@@ -1319,7 +1318,7 @@ static int ext4_ext_grow_indepth(handle_t *handle, struct inode *inode,
+                 ext4_idx_pblock(EXT_FIRST_INDEX(neh)));
+       le16_add_cpu(&neh->eh_depth, 1);
+-      ext4_mark_inode_dirty(handle, inode);
++      err = ext4_mark_inode_dirty(handle, inode);
+ out:
+       brelse(bh);
+@@ -4363,7 +4362,7 @@ static int ext4_alloc_file_blocks(struct file *file, ext4_lblk_t offset,
+       struct inode *inode = file_inode(file);
+       handle_t *handle;
+       int ret = 0;
+-      int ret2 = 0;
++      int ret2 = 0, ret3 = 0;
+       int retries = 0;
+       int depth = 0;
+       struct ext4_map_blocks map;
+@@ -4423,10 +4422,11 @@ retry:
+                       if (ext4_update_inode_size(inode, epos) & 0x1)
+                               inode->i_mtime = inode->i_ctime;
+               }
+-              ext4_mark_inode_dirty(handle, inode);
++              ret2 = ext4_mark_inode_dirty(handle, inode);
+               ext4_update_inode_fsync_trans(handle, inode, 1);
+-              ret2 = ext4_journal_stop(handle);
+-              if (ret2)
++              ret3 = ext4_journal_stop(handle);
++              ret2 = ret3 ? ret3 : ret2;
++              if (unlikely(ret2))
+                       break;
+       }
+       if (ret == -ENOSPC &&
+@@ -4577,7 +4577,9 @@ static long ext4_zero_range(struct file *file, loff_t offset,
+       inode->i_mtime = inode->i_ctime = current_time(inode);
+       if (new_size)
+               ext4_update_inode_size(inode, new_size);
+-      ext4_mark_inode_dirty(handle, inode);
++      ret = ext4_mark_inode_dirty(handle, inode);
++      if (unlikely(ret))
++              goto out_handle;
+       /* Zero out partial block at the edges of the range */
+       ret = ext4_zero_partial_blocks(handle, inode, offset, len);
+@@ -4587,6 +4589,7 @@ static long ext4_zero_range(struct file *file, loff_t offset,
+       if (file->f_flags & O_SYNC)
+               ext4_handle_sync(handle);
++out_handle:
+       ext4_journal_stop(handle);
+ out_mutex:
+       inode_unlock(inode);
+@@ -4700,8 +4703,7 @@ int ext4_convert_unwritten_extents(handle_t *handle, struct inode *inode,
+                                  loff_t offset, ssize_t len)
+ {
+       unsigned int max_blocks;
+-      int ret = 0;
+-      int ret2 = 0;
++      int ret = 0, ret2 = 0, ret3 = 0;
+       struct ext4_map_blocks map;
+       unsigned int blkbits = inode->i_blkbits;
+       unsigned int credits = 0;
+@@ -4734,9 +4736,13 @@ int ext4_convert_unwritten_extents(handle_t *handle, struct inode *inode,
+                                    "ext4_ext_map_blocks returned %d",
+                                    inode->i_ino, map.m_lblk,
+                                    map.m_len, ret);
+-              ext4_mark_inode_dirty(handle, inode);
+-              if (credits)
+-                      ret2 = ext4_journal_stop(handle);
++              ret2 = ext4_mark_inode_dirty(handle, inode);
++              if (credits) {
++                      ret3 = ext4_journal_stop(handle);
++                      if (unlikely(ret3))
++                              ret2 = ret3;
++              }
++
+               if (ret <= 0 || ret2)
+                       break;
+       }
+@@ -5304,7 +5310,7 @@ static int ext4_collapse_range(struct inode *inode, loff_t offset, loff_t len)
+       if (IS_SYNC(inode))
+               ext4_handle_sync(handle);
+       inode->i_mtime = inode->i_ctime = current_time(inode);
+-      ext4_mark_inode_dirty(handle, inode);
++      ret = ext4_mark_inode_dirty(handle, inode);
+       ext4_update_inode_fsync_trans(handle, inode, 1);
+ out_stop:
+diff --git a/fs/ext4/file.c b/fs/ext4/file.c
+index 0d624250a62bf..b8e69f9e38587 100644
+--- a/fs/ext4/file.c
++++ b/fs/ext4/file.c
+@@ -287,6 +287,7 @@ static ssize_t ext4_handle_inode_extension(struct inode *inode, loff_t offset,
+       bool truncate = false;
+       u8 blkbits = inode->i_blkbits;
+       ext4_lblk_t written_blk, end_blk;
++      int ret;
+       /*
+        * Note that EXT4_I(inode)->i_disksize can get extended up to
+@@ -327,8 +328,14 @@ static ssize_t ext4_handle_inode_extension(struct inode *inode, loff_t offset,
+               goto truncate;
+       }
+-      if (ext4_update_inode_size(inode, offset + written))
+-              ext4_mark_inode_dirty(handle, inode);
++      if (ext4_update_inode_size(inode, offset + written)) {
++              ret = ext4_mark_inode_dirty(handle, inode);
++              if (unlikely(ret)) {
++                      written = ret;
++                      ext4_journal_stop(handle);
++                      goto truncate;
++              }
++      }
+       /*
+        * We may need to truncate allocated but not written blocks beyond EOF.
+diff --git a/fs/ext4/indirect.c b/fs/ext4/indirect.c
+index 107f0043f67f1..be2b66eb65f7a 100644
+--- a/fs/ext4/indirect.c
++++ b/fs/ext4/indirect.c
+@@ -467,7 +467,9 @@ static int ext4_splice_branch(handle_t *handle,
+               /*
+                * OK, we spliced it into the inode itself on a direct block.
+                */
+-              ext4_mark_inode_dirty(handle, ar->inode);
++              err = ext4_mark_inode_dirty(handle, ar->inode);
++              if (unlikely(err))
++                      goto err_out;
+               jbd_debug(5, "splicing direct\n");
+       }
+       return err;
+diff --git a/fs/ext4/inline.c b/fs/ext4/inline.c
+index f35e289e17aa3..c3a1ad2db1227 100644
+--- a/fs/ext4/inline.c
++++ b/fs/ext4/inline.c
+@@ -1260,7 +1260,7 @@ out:
+ int ext4_try_add_inline_entry(handle_t *handle, struct ext4_filename *fname,
+                             struct inode *dir, struct inode *inode)
+ {
+-      int ret, inline_size, no_expand;
++      int ret, ret2, inline_size, no_expand;
+       void *inline_start;
+       struct ext4_iloc iloc;
+@@ -1314,7 +1314,9 @@ int ext4_try_add_inline_entry(handle_t *handle, struct ext4_filename *fname,
+ out:
+       ext4_write_unlock_xattr(dir, &no_expand);
+-      ext4_mark_inode_dirty(handle, dir);
++      ret2 = ext4_mark_inode_dirty(handle, dir);
++      if (unlikely(ret2 && !ret))
++              ret = ret2;
+       brelse(iloc.bh);
+       return ret;
+ }
+diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
+index 2a4aae6acdcb9..87430d276bccc 100644
+--- a/fs/ext4/inode.c
++++ b/fs/ext4/inode.c
+@@ -1296,7 +1296,7 @@ static int ext4_write_end(struct file *file,
+        * filesystems.
+        */
+       if (i_size_changed || inline_data)
+-              ext4_mark_inode_dirty(handle, inode);
++              ret = ext4_mark_inode_dirty(handle, inode);
+       if (pos + len > inode->i_size && !verity && ext4_can_truncate(inode))
+               /* if we have allocated more blocks and copied
+@@ -3077,7 +3077,7 @@ static int ext4_da_write_end(struct file *file,
+                        * new_i_size is less that inode->i_size
+                        * bu greater than i_disksize.(hint delalloc)
+                        */
+-                      ext4_mark_inode_dirty(handle, inode);
++                      ret = ext4_mark_inode_dirty(handle, inode);
+               }
+       }
+@@ -3094,7 +3094,7 @@ static int ext4_da_write_end(struct file *file,
+       if (ret2 < 0)
+               ret = ret2;
+       ret2 = ext4_journal_stop(handle);
+-      if (!ret)
++      if (unlikely(ret2 && !ret))
+               ret = ret2;
+       return ret ? ret : copied;
+@@ -3886,6 +3886,8 @@ int ext4_update_disksize_before_punch(struct inode *inode, loff_t offset,
+                                     loff_t len)
+ {
+       handle_t *handle;
++      int ret;
++
+       loff_t size = i_size_read(inode);
+       WARN_ON(!inode_is_locked(inode));
+@@ -3899,10 +3901,10 @@ int ext4_update_disksize_before_punch(struct inode *inode, loff_t offset,
+       if (IS_ERR(handle))
+               return PTR_ERR(handle);
+       ext4_update_i_disksize(inode, size);
+-      ext4_mark_inode_dirty(handle, inode);
++      ret = ext4_mark_inode_dirty(handle, inode);
+       ext4_journal_stop(handle);
+-      return 0;
++      return ret;
+ }
+ static void ext4_wait_dax_page(struct ext4_inode_info *ei)
+@@ -3954,7 +3956,7 @@ int ext4_punch_hole(struct inode *inode, loff_t offset, loff_t length)
+       loff_t first_block_offset, last_block_offset;
+       handle_t *handle;
+       unsigned int credits;
+-      int ret = 0;
++      int ret = 0, ret2 = 0;
+       trace_ext4_punch_hole(inode, offset, length, 0);
+@@ -4077,7 +4079,9 @@ int ext4_punch_hole(struct inode *inode, loff_t offset, loff_t length)
+               ext4_handle_sync(handle);
+       inode->i_mtime = inode->i_ctime = current_time(inode);
+-      ext4_mark_inode_dirty(handle, inode);
++      ret2 = ext4_mark_inode_dirty(handle, inode);
++      if (unlikely(ret2))
++              ret = ret2;
+       if (ret >= 0)
+               ext4_update_inode_fsync_trans(handle, inode, 1);
+ out_stop:
+@@ -4146,7 +4150,7 @@ int ext4_truncate(struct inode *inode)
+ {
+       struct ext4_inode_info *ei = EXT4_I(inode);
+       unsigned int credits;
+-      int err = 0;
++      int err = 0, err2;
+       handle_t *handle;
+       struct address_space *mapping = inode->i_mapping;
+@@ -4234,7 +4238,9 @@ out_stop:
+               ext4_orphan_del(handle, inode);
+       inode->i_mtime = inode->i_ctime = current_time(inode);
+-      ext4_mark_inode_dirty(handle, inode);
++      err2 = ext4_mark_inode_dirty(handle, inode);
++      if (unlikely(err2 && !err))
++              err = err2;
+       ext4_journal_stop(handle);
+       trace_ext4_truncate_exit(inode);
+@@ -5292,6 +5298,8 @@ int ext4_setattr(struct dentry *dentry, struct iattr *attr)
+                       inode->i_gid = attr->ia_gid;
+               error = ext4_mark_inode_dirty(handle, inode);
+               ext4_journal_stop(handle);
++              if (unlikely(error))
++                      return error;
+       }
+       if (attr->ia_valid & ATTR_SIZE) {
+@@ -5777,7 +5785,8 @@ out_unlock:
+  * Whenever the user wants stuff synced (sys_sync, sys_msync, sys_fsync)
+  * we start and wait on commits.
+  */
+-int ext4_mark_inode_dirty(handle_t *handle, struct inode *inode)
++int __ext4_mark_inode_dirty(handle_t *handle, struct inode *inode,
++                              const char *func, unsigned int line)
+ {
+       struct ext4_iloc iloc;
+       struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb);
+@@ -5787,13 +5796,18 @@ int ext4_mark_inode_dirty(handle_t *handle, struct inode *inode)
+       trace_ext4_mark_inode_dirty(inode, _RET_IP_);
+       err = ext4_reserve_inode_write(handle, inode, &iloc);
+       if (err)
+-              return err;
++              goto out;
+       if (EXT4_I(inode)->i_extra_isize < sbi->s_want_extra_isize)
+               ext4_try_to_expand_extra_isize(inode, sbi->s_want_extra_isize,
+                                              iloc, handle);
+-      return ext4_mark_iloc_dirty(handle, inode, &iloc);
++      err = ext4_mark_iloc_dirty(handle, inode, &iloc);
++out:
++      if (unlikely(err))
++              ext4_error_inode_err(inode, func, line, 0, err,
++                                      "mark_inode_dirty error");
++      return err;
+ }
+ /*
+diff --git a/fs/ext4/migrate.c b/fs/ext4/migrate.c
+index fb6520f371355..c5e3fc998211a 100644
+--- a/fs/ext4/migrate.c
++++ b/fs/ext4/migrate.c
+@@ -287,7 +287,7 @@ static int free_ind_block(handle_t *handle, struct inode *inode, __le32 *i_data)
+ static int ext4_ext_swap_inode_data(handle_t *handle, struct inode *inode,
+                                               struct inode *tmp_inode)
+ {
+-      int retval;
++      int retval, retval2 = 0;
+       __le32  i_data[3];
+       struct ext4_inode_info *ei = EXT4_I(inode);
+       struct ext4_inode_info *tmp_ei = EXT4_I(tmp_inode);
+@@ -342,7 +342,9 @@ static int ext4_ext_swap_inode_data(handle_t *handle, struct inode *inode,
+        * i_blocks when freeing the indirect meta-data blocks
+        */
+       retval = free_ind_block(handle, inode, i_data);
+-      ext4_mark_inode_dirty(handle, inode);
++      retval2 = ext4_mark_inode_dirty(handle, inode);
++      if (unlikely(retval2 && !retval))
++              retval = retval2;
+ err_out:
+       return retval;
+@@ -601,7 +603,7 @@ int ext4_ind_migrate(struct inode *inode)
+       ext4_lblk_t                     start, end;
+       ext4_fsblk_t                    blk;
+       handle_t                        *handle;
+-      int                             ret;
++      int                             ret, ret2 = 0;
+       if (!ext4_has_feature_extents(inode->i_sb) ||
+           (!ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)))
+@@ -655,7 +657,9 @@ int ext4_ind_migrate(struct inode *inode)
+       memset(ei->i_data, 0, sizeof(ei->i_data));
+       for (i = start; i <= end; i++)
+               ei->i_data[i] = cpu_to_le32(blk++);
+-      ext4_mark_inode_dirty(handle, inode);
++      ret2 = ext4_mark_inode_dirty(handle, inode);
++      if (unlikely(ret2 && !ret))
++              ret = ret2;
+ errout:
+       ext4_journal_stop(handle);
+       up_write(&EXT4_I(inode)->i_data_sem);
+diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c
+index a8aca4772aaa7..56738b538ddf4 100644
+--- a/fs/ext4/namei.c
++++ b/fs/ext4/namei.c
+@@ -1993,7 +1993,7 @@ static int add_dirent_to_buf(handle_t *handle, struct ext4_filename *fname,
+ {
+       unsigned int    blocksize = dir->i_sb->s_blocksize;
+       int             csum_size = 0;
+-      int             err;
++      int             err, err2;
+       if (ext4_has_metadata_csum(inode->i_sb))
+               csum_size = sizeof(struct ext4_dir_entry_tail);
+@@ -2028,12 +2028,12 @@ static int add_dirent_to_buf(handle_t *handle, struct ext4_filename *fname,
+       dir->i_mtime = dir->i_ctime = current_time(dir);
+       ext4_update_dx_flag(dir);
+       inode_inc_iversion(dir);
+-      ext4_mark_inode_dirty(handle, dir);
++      err2 = ext4_mark_inode_dirty(handle, dir);
+       BUFFER_TRACE(bh, "call ext4_handle_dirty_metadata");
+       err = ext4_handle_dirty_dirblock(handle, dir, bh);
+       if (err)
+               ext4_std_error(dir->i_sb, err);
+-      return 0;
++      return err ? err : err2;
+ }
+ /*
+@@ -2223,7 +2223,9 @@ static int ext4_add_entry(handle_t *handle, struct dentry *dentry,
+               }
+               ext4_clear_inode_flag(dir, EXT4_INODE_INDEX);
+               dx_fallback++;
+-              ext4_mark_inode_dirty(handle, dir);
++              retval = ext4_mark_inode_dirty(handle, dir);
++              if (unlikely(retval))
++                      goto out;
+       }
+       blocks = dir->i_size >> sb->s_blocksize_bits;
+       for (block = 0; block < blocks; block++) {
+@@ -2576,12 +2578,12 @@ static int ext4_add_nondir(handle_t *handle,
+       struct inode *inode = *inodep;
+       int err = ext4_add_entry(handle, dentry, inode);
+       if (!err) {
+-              ext4_mark_inode_dirty(handle, inode);
++              err = ext4_mark_inode_dirty(handle, inode);
+               if (IS_DIRSYNC(dir))
+                       ext4_handle_sync(handle);
+               d_instantiate_new(dentry, inode);
+               *inodep = NULL;
+-              return 0;
++              return err;
+       }
+       drop_nlink(inode);
+       ext4_orphan_add(handle, inode);
+@@ -2775,7 +2777,7 @@ static int ext4_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
+ {
+       handle_t *handle;
+       struct inode *inode;
+-      int err, credits, retries = 0;
++      int err, err2 = 0, credits, retries = 0;
+       if (EXT4_DIR_LINK_MAX(dir))
+               return -EMLINK;
+@@ -2808,7 +2810,9 @@ out_clear_inode:
+               clear_nlink(inode);
+               ext4_orphan_add(handle, inode);
+               unlock_new_inode(inode);
+-              ext4_mark_inode_dirty(handle, inode);
++              err2 = ext4_mark_inode_dirty(handle, inode);
++              if (unlikely(err2))
++                      err = err2;
+               ext4_journal_stop(handle);
+               iput(inode);
+               goto out_retry;
+@@ -3148,10 +3152,12 @@ static int ext4_rmdir(struct inode *dir, struct dentry *dentry)
+       inode->i_size = 0;
+       ext4_orphan_add(handle, inode);
+       inode->i_ctime = dir->i_ctime = dir->i_mtime = current_time(inode);
+-      ext4_mark_inode_dirty(handle, inode);
++      retval = ext4_mark_inode_dirty(handle, inode);
++      if (retval)
++              goto end_rmdir;
+       ext4_dec_count(handle, dir);
+       ext4_update_dx_flag(dir);
+-      ext4_mark_inode_dirty(handle, dir);
++      retval = ext4_mark_inode_dirty(handle, dir);
+ #ifdef CONFIG_UNICODE
+       /* VFS negative dentries are incompatible with Encoding and
+@@ -3221,7 +3227,9 @@ static int ext4_unlink(struct inode *dir, struct dentry *dentry)
+               goto end_unlink;
+       dir->i_ctime = dir->i_mtime = current_time(dir);
+       ext4_update_dx_flag(dir);
+-      ext4_mark_inode_dirty(handle, dir);
++      retval = ext4_mark_inode_dirty(handle, dir);
++      if (retval)
++              goto end_unlink;
+       if (inode->i_nlink == 0)
+               ext4_warning_inode(inode, "Deleting file '%.*s' with no links",
+                                  dentry->d_name.len, dentry->d_name.name);
+@@ -3230,7 +3238,7 @@ static int ext4_unlink(struct inode *dir, struct dentry *dentry)
+       if (!inode->i_nlink)
+               ext4_orphan_add(handle, inode);
+       inode->i_ctime = current_time(inode);
+-      ext4_mark_inode_dirty(handle, inode);
++      retval = ext4_mark_inode_dirty(handle, inode);
+ #ifdef CONFIG_UNICODE
+       /* VFS negative dentries are incompatible with Encoding and
+@@ -3419,7 +3427,7 @@ retry:
+       err = ext4_add_entry(handle, dentry, inode);
+       if (!err) {
+-              ext4_mark_inode_dirty(handle, inode);
++              err = ext4_mark_inode_dirty(handle, inode);
+               /* this can happen only for tmpfile being
+                * linked the first time
+                */
+@@ -3531,7 +3539,7 @@ static int ext4_rename_dir_finish(handle_t *handle, struct ext4_renament *ent,
+ static int ext4_setent(handle_t *handle, struct ext4_renament *ent,
+                      unsigned ino, unsigned file_type)
+ {
+-      int retval;
++      int retval, retval2;
+       BUFFER_TRACE(ent->bh, "get write access");
+       retval = ext4_journal_get_write_access(handle, ent->bh);
+@@ -3543,19 +3551,19 @@ static int ext4_setent(handle_t *handle, struct ext4_renament *ent,
+       inode_inc_iversion(ent->dir);
+       ent->dir->i_ctime = ent->dir->i_mtime =
+               current_time(ent->dir);
+-      ext4_mark_inode_dirty(handle, ent->dir);
++      retval = ext4_mark_inode_dirty(handle, ent->dir);
+       BUFFER_TRACE(ent->bh, "call ext4_handle_dirty_metadata");
+       if (!ent->inlined) {
+-              retval = ext4_handle_dirty_dirblock(handle, ent->dir, ent->bh);
+-              if (unlikely(retval)) {
+-                      ext4_std_error(ent->dir->i_sb, retval);
+-                      return retval;
++              retval2 = ext4_handle_dirty_dirblock(handle, ent->dir, ent->bh);
++              if (unlikely(retval2)) {
++                      ext4_std_error(ent->dir->i_sb, retval2);
++                      return retval2;
+               }
+       }
+       brelse(ent->bh);
+       ent->bh = NULL;
+-      return 0;
++      return retval;
+ }
+ static int ext4_find_delete_entry(handle_t *handle, struct inode *dir,
+@@ -3790,7 +3798,9 @@ static int ext4_rename(struct inode *old_dir, struct dentry *old_dentry,
+                                    EXT4_FT_CHRDEV);
+               if (retval)
+                       goto end_rename;
+-              ext4_mark_inode_dirty(handle, whiteout);
++              retval = ext4_mark_inode_dirty(handle, whiteout);
++              if (unlikely(retval))
++                      goto end_rename;
+       }
+       if (!new.bh) {
+               retval = ext4_add_entry(handle, new.dentry, old.inode);
+@@ -3811,7 +3821,9 @@ static int ext4_rename(struct inode *old_dir, struct dentry *old_dentry,
+        * rename.
+        */
+       old.inode->i_ctime = current_time(old.inode);
+-      ext4_mark_inode_dirty(handle, old.inode);
++      retval = ext4_mark_inode_dirty(handle, old.inode);
++      if (unlikely(retval))
++              goto end_rename;
+       if (!whiteout) {
+               /*
+@@ -3840,12 +3852,18 @@ static int ext4_rename(struct inode *old_dir, struct dentry *old_dentry,
+               } else {
+                       ext4_inc_count(handle, new.dir);
+                       ext4_update_dx_flag(new.dir);
+-                      ext4_mark_inode_dirty(handle, new.dir);
++                      retval = ext4_mark_inode_dirty(handle, new.dir);
++                      if (unlikely(retval))
++                              goto end_rename;
+               }
+       }
+-      ext4_mark_inode_dirty(handle, old.dir);
++      retval = ext4_mark_inode_dirty(handle, old.dir);
++      if (unlikely(retval))
++              goto end_rename;
+       if (new.inode) {
+-              ext4_mark_inode_dirty(handle, new.inode);
++              retval = ext4_mark_inode_dirty(handle, new.inode);
++              if (unlikely(retval))
++                      goto end_rename;
+               if (!new.inode->i_nlink)
+                       ext4_orphan_add(handle, new.inode);
+       }
+@@ -3979,8 +3997,12 @@ static int ext4_cross_rename(struct inode *old_dir, struct dentry *old_dentry,
+       ctime = current_time(old.inode);
+       old.inode->i_ctime = ctime;
+       new.inode->i_ctime = ctime;
+-      ext4_mark_inode_dirty(handle, old.inode);
+-      ext4_mark_inode_dirty(handle, new.inode);
++      retval = ext4_mark_inode_dirty(handle, old.inode);
++      if (unlikely(retval))
++              goto end_rename;
++      retval = ext4_mark_inode_dirty(handle, new.inode);
++      if (unlikely(retval))
++              goto end_rename;
+       if (old.dir_bh) {
+               retval = ext4_rename_dir_finish(handle, &old, new.dir->i_ino);
+diff --git a/fs/ext4/super.c b/fs/ext4/super.c
+index bf5fcb477f667..6135e187e3ed9 100644
+--- a/fs/ext4/super.c
++++ b/fs/ext4/super.c
+@@ -5885,7 +5885,7 @@ static int ext4_quota_on(struct super_block *sb, int type, int format_id,
+               EXT4_I(inode)->i_flags |= EXT4_NOATIME_FL | EXT4_IMMUTABLE_FL;
+               inode_set_flags(inode, S_NOATIME | S_IMMUTABLE,
+                               S_NOATIME | S_IMMUTABLE);
+-              ext4_mark_inode_dirty(handle, inode);
++              err = ext4_mark_inode_dirty(handle, inode);
+               ext4_journal_stop(handle);
+       unlock_inode:
+               inode_unlock(inode);
+@@ -5987,12 +5987,14 @@ static int ext4_quota_off(struct super_block *sb, int type)
+        * this is not a hard failure and quotas are already disabled.
+        */
+       handle = ext4_journal_start(inode, EXT4_HT_QUOTA, 1);
+-      if (IS_ERR(handle))
++      if (IS_ERR(handle)) {
++              err = PTR_ERR(handle);
+               goto out_unlock;
++      }
+       EXT4_I(inode)->i_flags &= ~(EXT4_NOATIME_FL | EXT4_IMMUTABLE_FL);
+       inode_set_flags(inode, 0, S_NOATIME | S_IMMUTABLE);
+       inode->i_mtime = inode->i_ctime = current_time(inode);
+-      ext4_mark_inode_dirty(handle, inode);
++      err = ext4_mark_inode_dirty(handle, inode);
+       ext4_journal_stop(handle);
+ out_unlock:
+       inode_unlock(inode);
+@@ -6050,7 +6052,7 @@ static ssize_t ext4_quota_write(struct super_block *sb, int type,
+ {
+       struct inode *inode = sb_dqopt(sb)->files[type];
+       ext4_lblk_t blk = off >> EXT4_BLOCK_SIZE_BITS(sb);
+-      int err, offset = off & (sb->s_blocksize - 1);
++      int err = 0, err2 = 0, offset = off & (sb->s_blocksize - 1);
+       int retries = 0;
+       struct buffer_head *bh;
+       handle_t *handle = journal_current_handle();
+@@ -6098,9 +6100,11 @@ out:
+       if (inode->i_size < off + len) {
+               i_size_write(inode, off + len);
+               EXT4_I(inode)->i_disksize = inode->i_size;
+-              ext4_mark_inode_dirty(handle, inode);
++              err2 = ext4_mark_inode_dirty(handle, inode);
++              if (unlikely(err2 && !err))
++                      err = err2;
+       }
+-      return len;
++      return err ? err : len;
+ }
+ #endif
+diff --git a/fs/ext4/xattr.c b/fs/ext4/xattr.c
+index 01ba66373e978..9b29a40738acc 100644
+--- a/fs/ext4/xattr.c
++++ b/fs/ext4/xattr.c
+@@ -1327,7 +1327,7 @@ static int ext4_xattr_inode_write(handle_t *handle, struct inode *ea_inode,
+       int blocksize = ea_inode->i_sb->s_blocksize;
+       int max_blocks = (bufsize + blocksize - 1) >> ea_inode->i_blkbits;
+       int csize, wsize = 0;
+-      int ret = 0;
++      int ret = 0, ret2 = 0;
+       int retries = 0;
+ retry:
+@@ -1385,7 +1385,9 @@ retry:
+       ext4_update_i_disksize(ea_inode, wsize);
+       inode_unlock(ea_inode);
+-      ext4_mark_inode_dirty(handle, ea_inode);
++      ret2 = ext4_mark_inode_dirty(handle, ea_inode);
++      if (unlikely(ret2 && !ret))
++              ret = ret2;
+ out:
+       brelse(bh);
+-- 
+2.25.1
+
diff --git a/queue-5.7/ext4-stop-overwrite-the-errcode-in-ext4_setup_super.patch b/queue-5.7/ext4-stop-overwrite-the-errcode-in-ext4_setup_super.patch
new file mode 100644 (file)
index 0000000..3af3461
--- /dev/null
@@ -0,0 +1,38 @@
+From c1fed3923ed1aed899fc89c1efcb6218598ce849 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 1 Jun 2020 15:34:04 +0800
+Subject: ext4: stop overwrite the errcode in ext4_setup_super
+
+From: yangerkun <yangerkun@huawei.com>
+
+[ Upstream commit 5adaccac46ea79008d7b75f47913f1a00f91d0ce ]
+
+Now the errcode from ext4_commit_super will overwrite EROFS exists in
+ext4_setup_super. Actually, no need to call ext4_commit_super since we
+will return EROFS. Fix it by goto done directly.
+
+Fixes: c89128a00838 ("ext4: handle errors on ext4_commit_super")
+Signed-off-by: yangerkun <yangerkun@huawei.com>
+Reviewed-by: Jan Kara <jack@suse.cz>
+Link: https://lore.kernel.org/r/20200601073404.3712492-1-yangerkun@huawei.com
+Signed-off-by: Theodore Ts'o <tytso@mit.edu>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/ext4/super.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/fs/ext4/super.c b/fs/ext4/super.c
+index 6135e187e3ed9..8bf6ef1972f4b 100644
+--- a/fs/ext4/super.c
++++ b/fs/ext4/super.c
+@@ -2344,6 +2344,7 @@ static int ext4_setup_super(struct super_block *sb, struct ext4_super_block *es,
+               ext4_msg(sb, KERN_ERR, "revision level too high, "
+                        "forcing read-only mode");
+               err = -EROFS;
++              goto done;
+       }
+       if (read_only)
+               goto done;
+-- 
+2.25.1
+
diff --git a/queue-5.7/extcon-adc-jack-fix-an-error-handling-path-in-adc_ja.patch b/queue-5.7/extcon-adc-jack-fix-an-error-handling-path-in-adc_ja.patch
new file mode 100644 (file)
index 0000000..4af0c90
--- /dev/null
@@ -0,0 +1,49 @@
+From 34a8f02a82dbc3be21bf60185894d71299ab09c8 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 10 May 2020 11:53:03 +0200
+Subject: extcon: adc-jack: Fix an error handling path in 'adc_jack_probe()'
+
+From: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
+
+[ Upstream commit bc84cff2c92ae5ccb2c37da73756e7174b1b430f ]
+
+In some error handling paths, a call to 'iio_channel_get()' is not balanced
+by a corresponding call to 'iio_channel_release()'.
+
+This can be achieved easily by using the devm_ variant of
+'iio_channel_get()'.
+
+This has the extra benefit to simplify the remove function.
+
+Fixes: 19939860dcae ("extcon: adc_jack: adc-jack driver to support 3.5 pi or simliar devices")
+Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
+Signed-off-by: Chanwoo Choi <cw00.choi@samsung.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/extcon/extcon-adc-jack.c | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+diff --git a/drivers/extcon/extcon-adc-jack.c b/drivers/extcon/extcon-adc-jack.c
+index ad02dc6747a43..0317b614b6805 100644
+--- a/drivers/extcon/extcon-adc-jack.c
++++ b/drivers/extcon/extcon-adc-jack.c
+@@ -124,7 +124,7 @@ static int adc_jack_probe(struct platform_device *pdev)
+       for (i = 0; data->adc_conditions[i].id != EXTCON_NONE; i++);
+       data->num_conditions = i;
+-      data->chan = iio_channel_get(&pdev->dev, pdata->consumer_channel);
++      data->chan = devm_iio_channel_get(&pdev->dev, pdata->consumer_channel);
+       if (IS_ERR(data->chan))
+               return PTR_ERR(data->chan);
+@@ -164,7 +164,6 @@ static int adc_jack_remove(struct platform_device *pdev)
+       free_irq(data->irq, data);
+       cancel_work_sync(&data->handler.work);
+-      iio_channel_release(data->chan);
+       return 0;
+ }
+-- 
+2.25.1
+
diff --git a/queue-5.7/f2fs-compress-fix-zstd-data-corruption.patch b/queue-5.7/f2fs-compress-fix-zstd-data-corruption.patch
new file mode 100644 (file)
index 0000000..1257c08
--- /dev/null
@@ -0,0 +1,46 @@
+From bbc338079eb1684bbc94aeea2ec8e1d3307aa094 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 8 May 2020 09:16:03 +0800
+Subject: f2fs: compress: fix zstd data corruption
+
+From: Chao Yu <yuchao0@huawei.com>
+
+[ Upstream commit 1454c978efbb57b052670d50023f48c759d704ce ]
+
+During zstd compression, ZSTD_endStream() may return non-zero value
+because distination buffer is full, but there is still compressed data
+remained in intermediate buffer, it means that zstd algorithm can not
+save at last one block space, let's just writeback raw data instead of
+compressed one, this can fix data corruption when decompressing
+incomplete stored compression data.
+
+Fixes: 50cfa66f0de0 ("f2fs: compress: support zstd compress algorithm")
+Signed-off-by: Daeho Jeong <daehojeong@google.com>
+Signed-off-by: Chao Yu <yuchao0@huawei.com>
+Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/f2fs/compress.c | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+diff --git a/fs/f2fs/compress.c b/fs/f2fs/compress.c
+index c05801758a358..a5b2e72174bb1 100644
+--- a/fs/f2fs/compress.c
++++ b/fs/f2fs/compress.c
+@@ -369,6 +369,13 @@ static int zstd_compress_pages(struct compress_ctx *cc)
+               return -EIO;
+       }
++      /*
++       * there is compressed data remained in intermediate buffer due to
++       * no more space in cbuf.cdata
++       */
++      if (ret)
++              return -EAGAIN;
++
+       cc->clen = outbuf.pos;
+       return 0;
+ }
+-- 
+2.25.1
+
diff --git a/queue-5.7/f2fs-compress-let-lz4-compressor-handle-output-buffe.patch b/queue-5.7/f2fs-compress-let-lz4-compressor-handle-output-buffe.patch
new file mode 100644 (file)
index 0000000..715f7e7
--- /dev/null
@@ -0,0 +1,66 @@
+From 7f2f4fc9e6963bb76a8cd91ac6082a71393db14d Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 9 May 2020 15:01:04 +0800
+Subject: f2fs: compress: let lz4 compressor handle output buffer budget
+ properly
+
+From: Chao Yu <yuchao0@huawei.com>
+
+[ Upstream commit f6644143c63f2eac88973f7fea087582579b0189 ]
+
+Commonly, in order to handle lz4 worst compress case, caller should
+allocate buffer with size of LZ4_compressBound(inputsize) for target
+compressed data storing, however in this case, if caller didn't
+allocate enough space, lz4 compressor still can handle output buffer
+budget properly, and end up compressing when left space in output
+buffer is not enough.
+
+So we don't have to allocate buffer with size for worst case, then
+we can avoid 2 * 4KB size intermediate buffer allocation when
+log_cluster_size is 2, and avoid unnecessary compressing work of
+compressor if we can not save at least 4KB space.
+
+Suggested-by: Daeho Jeong <daehojeong@google.com>
+Signed-off-by: Chao Yu <yuchao0@huawei.com>
+Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/f2fs/compress.c | 15 +++++++++------
+ 1 file changed, 9 insertions(+), 6 deletions(-)
+
+diff --git a/fs/f2fs/compress.c b/fs/f2fs/compress.c
+index df7b2d15eacde..c05801758a358 100644
+--- a/fs/f2fs/compress.c
++++ b/fs/f2fs/compress.c
+@@ -236,7 +236,12 @@ static int lz4_init_compress_ctx(struct compress_ctx *cc)
+       if (!cc->private)
+               return -ENOMEM;
+-      cc->clen = LZ4_compressBound(PAGE_SIZE << cc->log_cluster_size);
++      /*
++       * we do not change cc->clen to LZ4_compressBound(inputsize) to
++       * adapt worst compress case, because lz4 compressor can handle
++       * output budget properly.
++       */
++      cc->clen = cc->rlen - PAGE_SIZE - COMPRESS_HEADER_SIZE;
+       return 0;
+ }
+@@ -252,11 +257,9 @@ static int lz4_compress_pages(struct compress_ctx *cc)
+       len = LZ4_compress_default(cc->rbuf, cc->cbuf->cdata, cc->rlen,
+                                               cc->clen, cc->private);
+-      if (!len) {
+-              printk_ratelimited("%sF2FS-fs (%s): lz4 compress failed\n",
+-                              KERN_ERR, F2FS_I_SB(cc->inode)->sb->s_id);
+-              return -EIO;
+-      }
++      if (!len)
++              return -EAGAIN;
++
+       cc->clen = len;
+       return 0;
+ }
+-- 
+2.25.1
+
diff --git a/queue-5.7/f2fs-don-t-return-vmalloc-memory-from-f2fs_kmalloc.patch b/queue-5.7/f2fs-don-t-return-vmalloc-memory-from-f2fs_kmalloc.patch
new file mode 100644 (file)
index 0000000..1e96c7d
--- /dev/null
@@ -0,0 +1,114 @@
+From 94916f67da0f51d411b1f275a66f80c8c170c410 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 4 Jun 2020 21:57:48 -0700
+Subject: f2fs: don't return vmalloc() memory from f2fs_kmalloc()
+
+From: Eric Biggers <ebiggers@google.com>
+
+[ Upstream commit 0b6d4ca04a86b9dababbb76e58d33c437e127b77 ]
+
+kmalloc() returns kmalloc'ed memory, and kvmalloc() returns either
+kmalloc'ed or vmalloc'ed memory.  But the f2fs wrappers, f2fs_kmalloc()
+and f2fs_kvmalloc(), both return both kinds of memory.
+
+It's redundant to have two functions that do the same thing, and also
+breaking the standard naming convention is causing bugs since people
+assume it's safe to kfree() memory allocated by f2fs_kmalloc().  See
+e.g. the various allocations in fs/f2fs/compress.c.
+
+Fix this by making f2fs_kmalloc() just use kmalloc().  And to avoid
+re-introducing the allocation failures that the vmalloc fallback was
+intended to fix, convert the largest allocations to use f2fs_kvmalloc().
+
+Signed-off-by: Eric Biggers <ebiggers@google.com>
+Reviewed-by: Chao Yu <yuchao0@huawei.com>
+Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/f2fs/checkpoint.c | 4 ++--
+ fs/f2fs/f2fs.h       | 8 +-------
+ fs/f2fs/node.c       | 8 ++++----
+ fs/f2fs/super.c      | 2 +-
+ 4 files changed, 8 insertions(+), 14 deletions(-)
+
+diff --git a/fs/f2fs/checkpoint.c b/fs/f2fs/checkpoint.c
+index 852890b72d6ac..448b3dc6f925a 100644
+--- a/fs/f2fs/checkpoint.c
++++ b/fs/f2fs/checkpoint.c
+@@ -889,8 +889,8 @@ int f2fs_get_valid_checkpoint(struct f2fs_sb_info *sbi)
+       int i;
+       int err;
+-      sbi->ckpt = f2fs_kzalloc(sbi, array_size(blk_size, cp_blks),
+-                               GFP_KERNEL);
++      sbi->ckpt = f2fs_kvzalloc(sbi, array_size(blk_size, cp_blks),
++                                GFP_KERNEL);
+       if (!sbi->ckpt)
+               return -ENOMEM;
+       /*
+diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
+index a15e93f15b6ac..555c84953ea81 100644
+--- a/fs/f2fs/f2fs.h
++++ b/fs/f2fs/f2fs.h
+@@ -2936,18 +2936,12 @@ static inline bool f2fs_may_extent_tree(struct inode *inode)
+ static inline void *f2fs_kmalloc(struct f2fs_sb_info *sbi,
+                                       size_t size, gfp_t flags)
+ {
+-      void *ret;
+-
+       if (time_to_inject(sbi, FAULT_KMALLOC)) {
+               f2fs_show_injection_info(sbi, FAULT_KMALLOC);
+               return NULL;
+       }
+-      ret = kmalloc(size, flags);
+-      if (ret)
+-              return ret;
+-
+-      return kvmalloc(size, flags);
++      return kmalloc(size, flags);
+ }
+ static inline void *f2fs_kzalloc(struct f2fs_sb_info *sbi,
+diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c
+index ecbd6bd14a494..daf531e69b672 100644
+--- a/fs/f2fs/node.c
++++ b/fs/f2fs/node.c
+@@ -2928,7 +2928,7 @@ static int __get_nat_bitmaps(struct f2fs_sb_info *sbi)
+               return 0;
+       nm_i->nat_bits_blocks = F2FS_BLK_ALIGN((nat_bits_bytes << 1) + 8);
+-      nm_i->nat_bits = f2fs_kzalloc(sbi,
++      nm_i->nat_bits = f2fs_kvzalloc(sbi,
+                       nm_i->nat_bits_blocks << F2FS_BLKSIZE_BITS, GFP_KERNEL);
+       if (!nm_i->nat_bits)
+               return -ENOMEM;
+@@ -3061,9 +3061,9 @@ static int init_free_nid_cache(struct f2fs_sb_info *sbi)
+       int i;
+       nm_i->free_nid_bitmap =
+-              f2fs_kzalloc(sbi, array_size(sizeof(unsigned char *),
+-                                           nm_i->nat_blocks),
+-                           GFP_KERNEL);
++              f2fs_kvzalloc(sbi, array_size(sizeof(unsigned char *),
++                                            nm_i->nat_blocks),
++                            GFP_KERNEL);
+       if (!nm_i->free_nid_bitmap)
+               return -ENOMEM;
+diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c
+index 0c88090077fc1..4696c9cb47a5f 100644
+--- a/fs/f2fs/super.c
++++ b/fs/f2fs/super.c
+@@ -3039,7 +3039,7 @@ static int init_blkz_info(struct f2fs_sb_info *sbi, int devi)
+       if (nr_sectors & (bdev_zone_sectors(bdev) - 1))
+               FDEV(devi).nr_blkz++;
+-      FDEV(devi).blkz_seq = f2fs_kzalloc(sbi,
++      FDEV(devi).blkz_seq = f2fs_kvzalloc(sbi,
+                                       BITS_TO_LONGS(FDEV(devi).nr_blkz)
+                                       * sizeof(unsigned long),
+                                       GFP_KERNEL);
+-- 
+2.25.1
+
diff --git a/queue-5.7/f2fs-fix-potential-use-after-free-issue.patch b/queue-5.7/f2fs-fix-potential-use-after-free-issue.patch
new file mode 100644 (file)
index 0000000..53c8d09
--- /dev/null
@@ -0,0 +1,49 @@
+From cac3ee8c789494af365ec12fc7b10da892c89580 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 23 Apr 2020 17:57:33 +0800
+Subject: f2fs: fix potential use-after-free issue
+
+From: Chao Yu <yuchao0@huawei.com>
+
+[ Upstream commit f3494345ce9999624b36109252a4bf5f00e51a46 ]
+
+In error path of f2fs_read_multi_pages(), it should let last referrer
+release decompress io context memory, otherwise, other referrer will
+cause use-after-free issue.
+
+Fixes: 4c8ff7095bef ("f2fs: support data compression")
+Signed-off-by: Chao Yu <yuchao0@huawei.com>
+Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/f2fs/data.c | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c
+index cdf2f626bea7a..10491ae1cb850 100644
+--- a/fs/f2fs/data.c
++++ b/fs/f2fs/data.c
+@@ -2130,16 +2130,16 @@ submit_and_realloc:
+                                       page->index, for_write);
+                       if (IS_ERR(bio)) {
+                               ret = PTR_ERR(bio);
+-                              bio = NULL;
+                               dic->failed = true;
+                               if (refcount_sub_and_test(dic->nr_cpages - i,
+-                                                      &dic->ref))
++                                                      &dic->ref)) {
+                                       f2fs_decompress_end_io(dic->rpages,
+                                                       cc->cluster_size, true,
+                                                       false);
+-                              f2fs_free_dic(dic);
++                                      f2fs_free_dic(dic);
++                              }
+                               f2fs_put_dnode(&dn);
+-                              *bio_ret = bio;
++                              *bio_ret = NULL;
+                               return ret;
+                       }
+               }
+-- 
+2.25.1
+
diff --git a/queue-5.7/f2fs-fix-wrong-stub-helper-update_sit_info.patch b/queue-5.7/f2fs-fix-wrong-stub-helper-update_sit_info.patch
new file mode 100644 (file)
index 0000000..722196b
--- /dev/null
@@ -0,0 +1,37 @@
+From 8a54d5d3ba7612eeb72e403931a08791a1367f6d Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 9 May 2020 19:21:35 +0800
+Subject: f2fs: Fix wrong stub helper update_sit_info
+
+From: YueHaibing <yuehaibing@huawei.com>
+
+[ Upstream commit 48abe91ac1ad27cd5a5709f983dcf58f2b9a6b70 ]
+
+update_sit_info should be f2fs_update_sit_info,
+otherwise build fails while no CONFIG_F2FS_STAT_FS.
+
+Fixes: fc7100ea2a52 ("f2fs: Add f2fs stats to sysfs")
+Signed-off-by: YueHaibing <yuehaibing@huawei.com>
+Reviewed-by: Chao Yu <yuchao0@huawei.com>
+Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/f2fs/f2fs.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
+index 7c5dd7f666a01..a15e93f15b6ac 100644
+--- a/fs/f2fs/f2fs.h
++++ b/fs/f2fs/f2fs.h
+@@ -3656,7 +3656,7 @@ static inline int f2fs_build_stats(struct f2fs_sb_info *sbi) { return 0; }
+ static inline void f2fs_destroy_stats(struct f2fs_sb_info *sbi) { }
+ static inline void __init f2fs_create_root_stats(void) { }
+ static inline void f2fs_destroy_root_stats(void) { }
+-static inline void update_sit_info(struct f2fs_sb_info *sbi) {}
++static inline void f2fs_update_sit_info(struct f2fs_sb_info *sbi) {}
+ #endif
+ extern const struct file_operations f2fs_dir_operations;
+-- 
+2.25.1
+
diff --git a/queue-5.7/f2fs-handle-readonly-filesystem-in-f2fs_ioc_shutdown.patch b/queue-5.7/f2fs-handle-readonly-filesystem-in-f2fs_ioc_shutdown.patch
new file mode 100644 (file)
index 0000000..427e0d9
--- /dev/null
@@ -0,0 +1,44 @@
+From 9ef2ced087a72a5ad03f5a67c6c4f297066ddd4d Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 8 Jun 2020 20:03:16 +0800
+Subject: f2fs: handle readonly filesystem in f2fs_ioc_shutdown()
+
+From: Chao Yu <yuchao0@huawei.com>
+
+[ Upstream commit 8626441f05dc45a2f4693ee6863d02456ce39e60 ]
+
+If mountpoint is readonly, we should allow shutdowning filesystem
+successfully, this fixes issue found by generic/599 testcase of
+xfstest.
+
+Signed-off-by: Chao Yu <yuchao0@huawei.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, 8 insertions(+), 1 deletion(-)
+
+diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c
+index 6ab8f621a3c5a..30b35915fa3a3 100644
+--- a/fs/f2fs/file.c
++++ b/fs/f2fs/file.c
+@@ -2219,8 +2219,15 @@ static int f2fs_ioc_shutdown(struct file *filp, unsigned long arg)
+       if (in != F2FS_GOING_DOWN_FULLSYNC) {
+               ret = mnt_want_write_file(filp);
+-              if (ret)
++              if (ret) {
++                      if (ret == -EROFS) {
++                              ret = 0;
++                              f2fs_stop_checkpoint(sbi, false);
++                              set_sbi_flag(sbi, SBI_IS_SHUTDOWN);
++                              trace_f2fs_shutdown(sbi, in, ret);
++                      }
+                       return ret;
++              }
+       }
+       switch (in) {
+-- 
+2.25.1
+
diff --git a/queue-5.7/f2fs-report-delalloc-reserve-as-non-free-in-statfs-f.patch b/queue-5.7/f2fs-report-delalloc-reserve-as-non-free-in-statfs-f.patch
new file mode 100644 (file)
index 0000000..66d6b45
--- /dev/null
@@ -0,0 +1,41 @@
+From 073c8b98199e67a25767dbb38df6b1448bed521d Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 11 May 2020 09:15:18 +0300
+Subject: f2fs: report delalloc reserve as non-free in statfs for project quota
+
+From: Konstantin Khlebnikov <khlebnikov@yandex-team.ru>
+
+[ Upstream commit baaa7ebf25c78c5cb712fac16b7f549100beddd3 ]
+
+This reserved space isn't committed yet but cannot be used for
+allocations. For userspace it has no difference from used space.
+
+See the same fix in ext4 commit f06925c73942 ("ext4: report delalloc
+reserve as non-free in statfs for project quota").
+
+Fixes: ddc34e328d06 ("f2fs: introduce f2fs_statfs_project")
+Signed-off-by: Konstantin Khlebnikov <khlebnikov@yandex-team.ru>
+Reviewed-by: Chao Yu <yuchao0@huawei.com>
+Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/f2fs/super.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c
+index 56ccb8323e211..0c88090077fc1 100644
+--- a/fs/f2fs/super.c
++++ b/fs/f2fs/super.c
+@@ -1303,7 +1303,8 @@ static int f2fs_statfs_project(struct super_block *sb,
+               limit >>= sb->s_blocksize_bits;
+       if (limit && buf->f_blocks > limit) {
+-              curblock = dquot->dq_dqb.dqb_curspace >> sb->s_blocksize_bits;
++              curblock = (dquot->dq_dqb.dqb_curspace +
++                          dquot->dq_dqb.dqb_rsvspace) >> sb->s_blocksize_bits;
+               buf->f_blocks = limit;
+               buf->f_bfree = buf->f_bavail =
+                       (buf->f_blocks > curblock) ?
+-- 
+2.25.1
+
diff --git a/queue-5.7/firmware-imx-scu-fix-possible-memory-leak-in-imx_scu.patch b/queue-5.7/firmware-imx-scu-fix-possible-memory-leak-in-imx_scu.patch
new file mode 100644 (file)
index 0000000..9d3009e
--- /dev/null
@@ -0,0 +1,37 @@
+From 06257b297d0e70eddede6b6153cd7dde692ef113 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 6 May 2020 05:14:10 +0000
+Subject: firmware: imx: scu: Fix possible memory leak in imx_scu_probe()
+
+From: Wei Yongjun <weiyongjun1@huawei.com>
+
+[ Upstream commit 89f12d6509bff004852c51cb713a439a86816b24 ]
+
+'chan_name' is malloced in imx_scu_probe() and should be freed
+before leaving from the error handling cases, otherwise it will
+cause memory leak.
+
+Fixes: edbee095fafb ("firmware: imx: add SCU firmware driver support")
+Signed-off-by: Wei Yongjun <weiyongjun1@huawei.com>
+Reviewed-by: Dong Aisheng <aisheng.dong@nxp.com>
+Signed-off-by: Shawn Guo <shawnguo@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/firmware/imx/imx-scu.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/firmware/imx/imx-scu.c b/drivers/firmware/imx/imx-scu.c
+index b3da2e193ad2d..176ddd151375a 100644
+--- a/drivers/firmware/imx/imx-scu.c
++++ b/drivers/firmware/imx/imx-scu.c
+@@ -314,6 +314,7 @@ static int imx_scu_probe(struct platform_device *pdev)
+                       if (ret != -EPROBE_DEFER)
+                               dev_err(dev, "Failed to request mbox chan %s ret %d\n",
+                                       chan_name, ret);
++                      kfree(chan_name);
+                       return ret;
+               }
+-- 
+2.25.1
+
diff --git a/queue-5.7/firmware-qcom_scm-fix-bogous-abuse-of-dma-direct-int.patch b/queue-5.7/firmware-qcom_scm-fix-bogous-abuse-of-dma-direct-int.patch
new file mode 100644 (file)
index 0000000..81f88c2
--- /dev/null
@@ -0,0 +1,72 @@
+From 2c4c8567c356cc232d2505fda4e92f443a8a70c2 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 14 Apr 2020 14:31:36 +0200
+Subject: firmware: qcom_scm: fix bogous abuse of dma-direct internals
+
+From: Christoph Hellwig <hch@lst.de>
+
+[ Upstream commit 459b1f86f1cba7de813fbc335df476c111feec22 ]
+
+As far as the device is concerned the dma address is the physical
+address.  There is no need to convert it to a physical address,
+especially not using dma-direct internals that are not available
+to drivers and which will interact badly with IOMMUs.  Last but not
+least the commit introducing it claimed to just fix a type issue,
+but actually changed behavior.
+
+Fixes: 6e37ccf78a532 ("firmware: qcom_scm: Use proper types for dma mappings")
+Reviewed-by: Bjorn Andersson <bjorn.andersson@linaro.org>
+Signed-off-by: Christoph Hellwig <hch@lst.de>
+Link: https://lore.kernel.org/r/20200414123136.441454-1-hch@lst.de
+Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/firmware/qcom_scm.c | 9 +++------
+ 1 file changed, 3 insertions(+), 6 deletions(-)
+
+diff --git a/drivers/firmware/qcom_scm.c b/drivers/firmware/qcom_scm.c
+index 059bb0fbae9e5..4701487573f7b 100644
+--- a/drivers/firmware/qcom_scm.c
++++ b/drivers/firmware/qcom_scm.c
+@@ -6,7 +6,6 @@
+ #include <linux/init.h>
+ #include <linux/cpumask.h>
+ #include <linux/export.h>
+-#include <linux/dma-direct.h>
+ #include <linux/dma-mapping.h>
+ #include <linux/module.h>
+ #include <linux/types.h>
+@@ -806,8 +805,7 @@ int qcom_scm_assign_mem(phys_addr_t mem_addr, size_t mem_sz,
+       struct qcom_scm_mem_map_info *mem_to_map;
+       phys_addr_t mem_to_map_phys;
+       phys_addr_t dest_phys;
+-      phys_addr_t ptr_phys;
+-      dma_addr_t ptr_dma;
++      dma_addr_t ptr_phys;
+       size_t mem_to_map_sz;
+       size_t dest_sz;
+       size_t src_sz;
+@@ -824,10 +822,9 @@ int qcom_scm_assign_mem(phys_addr_t mem_addr, size_t mem_sz,
+       ptr_sz = ALIGN(src_sz, SZ_64) + ALIGN(mem_to_map_sz, SZ_64) +
+                       ALIGN(dest_sz, SZ_64);
+-      ptr = dma_alloc_coherent(__scm->dev, ptr_sz, &ptr_dma, GFP_KERNEL);
++      ptr = dma_alloc_coherent(__scm->dev, ptr_sz, &ptr_phys, GFP_KERNEL);
+       if (!ptr)
+               return -ENOMEM;
+-      ptr_phys = dma_to_phys(__scm->dev, ptr_dma);
+       /* Fill source vmid detail */
+       src = ptr;
+@@ -855,7 +852,7 @@ int qcom_scm_assign_mem(phys_addr_t mem_addr, size_t mem_sz,
+       ret = __qcom_scm_assign_mem(__scm->dev, mem_to_map_phys, mem_to_map_sz,
+                                   ptr_phys, src_sz, dest_phys, dest_sz);
+-      dma_free_coherent(__scm->dev, ptr_sz, ptr, ptr_dma);
++      dma_free_coherent(__scm->dev, ptr_sz, ptr, ptr_phys);
+       if (ret) {
+               dev_err(__scm->dev,
+                       "Assign memory protection call failed %d\n", ret);
+-- 
+2.25.1
+
diff --git a/queue-5.7/fpga-dfl-afu-corrected-error-handling-levels.patch b/queue-5.7/fpga-dfl-afu-corrected-error-handling-levels.patch
new file mode 100644 (file)
index 0000000..465cad7
--- /dev/null
@@ -0,0 +1,44 @@
+From 389ac3895b982a807a41b79d1d03797e36e566af Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 18 May 2020 23:49:51 +0530
+Subject: fpga: dfl: afu: Corrected error handling levels
+
+From: Souptick Joarder <jrdr.linux@gmail.com>
+
+[ Upstream commit c9d7e3da1f3c4cf5dddfc5d7ce4d76d013aba1cc ]
+
+Corrected error handling goto sequnece. Level put_pages should
+be called when pinned pages >= 0 && pinned != npages. Level
+free_pages should be called when pinned pages < 0.
+
+Fixes: fa8dda1edef9 ("fpga: dfl: afu: add DFL_FPGA_PORT_DMA_MAP/UNMAP ioctls support")
+Signed-off-by: Souptick Joarder <jrdr.linux@gmail.com>
+Acked-by: Wu Hao <hao.wu@intel.com>
+Reviewed-by: Xu Yilun <yilun.xu@intel.com>
+Link: https://lore.kernel.org/r/1589825991-3545-1-git-send-email-jrdr.linux@gmail.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/fpga/dfl-afu-dma-region.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/fpga/dfl-afu-dma-region.c b/drivers/fpga/dfl-afu-dma-region.c
+index 62f924489db59..5942343a5d6ea 100644
+--- a/drivers/fpga/dfl-afu-dma-region.c
++++ b/drivers/fpga/dfl-afu-dma-region.c
+@@ -61,10 +61,10 @@ static int afu_dma_pin_pages(struct dfl_feature_platform_data *pdata,
+                                    region->pages);
+       if (pinned < 0) {
+               ret = pinned;
+-              goto put_pages;
++              goto free_pages;
+       } else if (pinned != npages) {
+               ret = -EFAULT;
+-              goto free_pages;
++              goto put_pages;
+       }
+       dev_dbg(dev, "%d pages pinned\n", pinned);
+-- 
+2.25.1
+
diff --git a/queue-5.7/fuse-bug_on-correction-in-fuse_dev_splice_write.patch b/queue-5.7/fuse-bug_on-correction-in-fuse_dev_splice_write.patch
new file mode 100644 (file)
index 0000000..07dd666
--- /dev/null
@@ -0,0 +1,42 @@
+From c16ec18e2891205c51eaef8093f59b1fe736a1c5 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 19 Aug 2019 09:53:50 +0300
+Subject: fuse: BUG_ON correction in fuse_dev_splice_write()
+
+From: Vasily Averin <vvs@virtuozzo.com>
+
+[ Upstream commit 0e9fb6f17ad5b386b75451328975a07d7d953c6d ]
+
+commit 963545357202 ("fuse: reduce allocation size for splice_write")
+changed size of bufs array, so BUG_ON which checks the index of the array
+shold also be fixed.
+
+[SzM: turn BUG_ON into WARN_ON]
+
+Fixes: 963545357202 ("fuse: reduce allocation size for splice_write")
+Signed-off-by: Vasily Averin <vvs@virtuozzo.com>
+Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/fuse/dev.c | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c
+index 97eec7522bf20..5c155437a455d 100644
+--- a/fs/fuse/dev.c
++++ b/fs/fuse/dev.c
+@@ -1977,8 +1977,9 @@ static ssize_t fuse_dev_splice_write(struct pipe_inode_info *pipe,
+               struct pipe_buffer *ibuf;
+               struct pipe_buffer *obuf;
+-              BUG_ON(nbuf >= pipe->ring_size);
+-              BUG_ON(tail == head);
++              if (WARN_ON(nbuf >= count || tail == head))
++                      goto out_free;
++
+               ibuf = &pipe->bufs[tail & mask];
+               obuf = &bufs[nbuf];
+-- 
+2.25.1
+
diff --git a/queue-5.7/fuse-copy_file_range-should-truncate-cache.patch b/queue-5.7/fuse-copy_file_range-should-truncate-cache.patch
new file mode 100644 (file)
index 0000000..b16b4dc
--- /dev/null
@@ -0,0 +1,66 @@
+From 40cabb4e5756ef49b1d50afc5739abdfbc3c830e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 20 May 2020 11:39:35 +0200
+Subject: fuse: copy_file_range should truncate cache
+
+From: Miklos Szeredi <mszeredi@redhat.com>
+
+[ Upstream commit 9b46418c40fe910e6537618f9932a8be78a3dd6c ]
+
+After the copy operation completes the cache is not up-to-date.  Truncate
+all pages in the interval that has successfully been copied.
+
+Truncating completely copied dirty pages is okay, since the data has been
+overwritten anyway.  Truncating partially copied dirty pages is not okay;
+add a comment for now.
+
+Fixes: 88bc7d5097a1 ("fuse: add support for copy_file_range()")
+Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/fuse/file.c | 22 ++++++++++++++++++++++
+ 1 file changed, 22 insertions(+)
+
+diff --git a/fs/fuse/file.c b/fs/fuse/file.c
+index d58324198b7a7..e3afceecaa6b1 100644
+--- a/fs/fuse/file.c
++++ b/fs/fuse/file.c
+@@ -3292,6 +3292,24 @@ static ssize_t __fuse_copy_file_range(struct file *file_in, loff_t pos_in,
+       if (err)
+               goto out;
++      /*
++       * Write out dirty pages in the destination file before sending the COPY
++       * request to userspace.  After the request is completed, truncate off
++       * pages (including partial ones) from the cache that have been copied,
++       * since these contain stale data at that point.
++       *
++       * This should be mostly correct, but if the COPY writes to partial
++       * pages (at the start or end) and the parts not covered by the COPY are
++       * written through a memory map after calling fuse_writeback_range(),
++       * then these partial page modifications will be lost on truncation.
++       *
++       * It is unlikely that someone would rely on such mixed style
++       * modifications.  Yet this does give less guarantees than if the
++       * copying was performed with write(2).
++       *
++       * To fix this a i_mmap_sem style lock could be used to prevent new
++       * faults while the copy is ongoing.
++       */
+       err = fuse_writeback_range(inode_out, pos_out, pos_out + len - 1);
+       if (err)
+               goto out;
+@@ -3315,6 +3333,10 @@ static ssize_t __fuse_copy_file_range(struct file *file_in, loff_t pos_in,
+       if (err)
+               goto out;
++      truncate_inode_pages_range(inode_out->i_mapping,
++                                 ALIGN_DOWN(pos_out, PAGE_SIZE),
++                                 ALIGN(pos_out + outarg.size, PAGE_SIZE) - 1);
++
+       if (fc->writeback_cache) {
+               fuse_write_update_size(inode_out, pos_out + outarg.size);
+               file_update_time(file_out);
+-- 
+2.25.1
+
diff --git a/queue-5.7/fuse-fix-copy_file_range-cache-issues.patch b/queue-5.7/fuse-fix-copy_file_range-cache-issues.patch
new file mode 100644 (file)
index 0000000..31ce38d
--- /dev/null
@@ -0,0 +1,63 @@
+From e6a7be06040ce3098e6211e0c5d9f0a95e4578b7 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 20 May 2020 11:39:35 +0200
+Subject: fuse: fix copy_file_range cache issues
+
+From: Miklos Szeredi <mszeredi@redhat.com>
+
+[ Upstream commit 2c4656dfd994538176db30ce09c02cc0dfc361ae ]
+
+a) Dirty cache needs to be written back not just in the writeback_cache
+case, since the dirty pages may come from memory maps.
+
+b) The fuse_writeback_range() helper takes an inclusive interval, so the
+end position needs to be pos+len-1 instead of pos+len.
+
+Fixes: 88bc7d5097a1 ("fuse: add support for copy_file_range()")
+Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/fuse/file.c | 20 ++++++++------------
+ 1 file changed, 8 insertions(+), 12 deletions(-)
+
+diff --git a/fs/fuse/file.c b/fs/fuse/file.c
+index d400b71b98d55..d58324198b7a7 100644
+--- a/fs/fuse/file.c
++++ b/fs/fuse/file.c
+@@ -3280,13 +3280,11 @@ static ssize_t __fuse_copy_file_range(struct file *file_in, loff_t pos_in,
+       if (file_inode(file_in)->i_sb != file_inode(file_out)->i_sb)
+               return -EXDEV;
+-      if (fc->writeback_cache) {
+-              inode_lock(inode_in);
+-              err = fuse_writeback_range(inode_in, pos_in, pos_in + len);
+-              inode_unlock(inode_in);
+-              if (err)
+-                      return err;
+-      }
++      inode_lock(inode_in);
++      err = fuse_writeback_range(inode_in, pos_in, pos_in + len - 1);
++      inode_unlock(inode_in);
++      if (err)
++              return err;
+       inode_lock(inode_out);
+@@ -3294,11 +3292,9 @@ static ssize_t __fuse_copy_file_range(struct file *file_in, loff_t pos_in,
+       if (err)
+               goto out;
+-      if (fc->writeback_cache) {
+-              err = fuse_writeback_range(inode_out, pos_out, pos_out + len);
+-              if (err)
+-                      goto out;
+-      }
++      err = fuse_writeback_range(inode_out, pos_out, pos_out + len - 1);
++      if (err)
++              goto out;
+       if (is_unstable)
+               set_bit(FUSE_I_SIZE_UNSTABLE, &fi_out->state);
+-- 
+2.25.1
+
diff --git a/queue-5.7/geneve-change-from-tx_error-to-tx_dropped-on-missing.patch b/queue-5.7/geneve-change-from-tx_error-to-tx_dropped-on-missing.patch
new file mode 100644 (file)
index 0000000..348066b
--- /dev/null
@@ -0,0 +1,64 @@
+From 9dade288fb1cd4aa2f4ba9036bf23911513ba5ee Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 3 Jun 2020 11:12:14 +0200
+Subject: geneve: change from tx_error to tx_dropped on missing metadata
+
+From: Jiri Benc <jbenc@redhat.com>
+
+[ Upstream commit 9d149045b3c0e44c049cdbce8a64e19415290017 ]
+
+If the geneve interface is in collect_md (external) mode, it can't send any
+packets submitted directly to its net interface, as such packets won't have
+metadata attached. This is expected.
+
+However, the kernel itself sends some packets to the interface, most
+notably, IPv6 DAD, IPv6 multicast listener reports, etc. This is not wrong,
+as tunnel metadata can be specified in routing table (although technically,
+that has never worked for IPv6, but hopefully will be fixed eventually) and
+then the interface must correctly participate in IPv6 housekeeping.
+
+The problem is that any such attempt increases the tx_error counter. Just
+bringing up a geneve interface with IPv6 enabled is enough to see a number
+of tx_errors. That causes confusion among users, prompting them to find
+a network error where there is none.
+
+Change the counter used to tx_dropped. That better conveys the meaning
+(there's nothing wrong going on, just some packets are getting dropped) and
+hopefully will make admins panic less.
+
+Signed-off-by: Jiri Benc <jbenc@redhat.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/geneve.c | 7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/net/geneve.c b/drivers/net/geneve.c
+index 6b461be1820bb..75266580b586d 100644
+--- a/drivers/net/geneve.c
++++ b/drivers/net/geneve.c
+@@ -987,9 +987,10 @@ static netdev_tx_t geneve_xmit(struct sk_buff *skb, struct net_device *dev)
+       if (geneve->collect_md) {
+               info = skb_tunnel_info(skb);
+               if (unlikely(!info || !(info->mode & IP_TUNNEL_INFO_TX))) {
+-                      err = -EINVAL;
+                       netdev_dbg(dev, "no tunnel metadata\n");
+-                      goto tx_error;
++                      dev_kfree_skb(skb);
++                      dev->stats.tx_dropped++;
++                      return NETDEV_TX_OK;
+               }
+       } else {
+               info = &geneve->info;
+@@ -1006,7 +1007,7 @@ static netdev_tx_t geneve_xmit(struct sk_buff *skb, struct net_device *dev)
+       if (likely(!err))
+               return NETDEV_TX_OK;
+-tx_error:
++
+       dev_kfree_skb(skb);
+       if (err == -ELOOP)
+-- 
+2.25.1
+
diff --git a/queue-5.7/gfs2-allow-lock_nolock-mount-to-specify-jid-x.patch b/queue-5.7/gfs2-allow-lock_nolock-mount-to-specify-jid-x.patch
new file mode 100644 (file)
index 0000000..f615d38
--- /dev/null
@@ -0,0 +1,46 @@
+From 8cb8d056d8109b346ca32004263a4fb58028bee7 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 29 Apr 2020 08:45:54 -0500
+Subject: gfs2: Allow lock_nolock mount to specify jid=X
+
+From: Bob Peterson <rpeterso@redhat.com>
+
+[ Upstream commit ea22eee4e6027d8927099de344f7fff43c507ef9 ]
+
+Before this patch, a simple typo accidentally added \n to the jid=
+string for lock_nolock mounts. This made it impossible to mount a
+gfs2 file system with a journal other than journal0. Thus:
+
+mount -tgfs2 -o hostdata="jid=1" <device> <mount pt>
+
+Resulted in:
+mount: wrong fs type, bad option, bad superblock on <device>
+
+In most cases this is not a problem. However, for debugging and
+testing purposes we sometimes want to test the integrity of other
+journals. This patch removes the unnecessary \n and thus allows
+lock_nolock users to specify an alternate journal.
+
+Signed-off-by: Bob Peterson <rpeterso@redhat.com>
+Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/gfs2/ops_fstype.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/fs/gfs2/ops_fstype.c b/fs/gfs2/ops_fstype.c
+index e2b69ffcc6a84..094f5fe7c0090 100644
+--- a/fs/gfs2/ops_fstype.c
++++ b/fs/gfs2/ops_fstype.c
+@@ -880,7 +880,7 @@ fail:
+ }
+ static const match_table_t nolock_tokens = {
+-      { Opt_jid, "jid=%d\n", },
++      { Opt_jid, "jid=%d", },
+       { Opt_err, NULL },
+ };
+-- 
+2.25.1
+
diff --git a/queue-5.7/gfs2-fix-use-after-free-on-transaction-ail-lists.patch b/queue-5.7/gfs2-fix-use-after-free-on-transaction-ail-lists.patch
new file mode 100644 (file)
index 0000000..9836c39
--- /dev/null
@@ -0,0 +1,79 @@
+From a851f11fa57e1c3b497e4ab443f9ecc199707ee4 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 4 Jun 2020 14:28:58 -0500
+Subject: gfs2: fix use-after-free on transaction ail lists
+
+From: Bob Peterson <rpeterso@redhat.com>
+
+[ Upstream commit 83d060ca8d90fa1e3feac227f995c013100862d3 ]
+
+Before this patch, transactions could be merged into the system
+transaction by function gfs2_merge_trans(), but the transaction ail
+lists were never merged. Because the ail flushing mechanism can run
+separately, bd elements can be attached to the transaction's buffer
+list during the transaction (trans_add_meta, etc) but quickly moved
+to its ail lists. Later, in function gfs2_trans_end, the transaction
+can be freed (by gfs2_trans_end) while it still has bd elements
+queued to its ail lists, which can cause it to either lose track of
+the bd elements altogether (memory leak) or worse, reference the bd
+elements after the parent transaction has been freed.
+
+Although I've not seen any serious consequences, the problem becomes
+apparent with the previous patch's addition of:
+
+       gfs2_assert_warn(sdp, list_empty(&tr->tr_ail1_list));
+
+to function gfs2_trans_free().
+
+This patch adds logic into gfs2_merge_trans() to move the merged
+transaction's ail lists to the sdp transaction. This prevents the
+use-after-free. To do this properly, we need to hold the ail lock,
+so we pass sdp into the function instead of the transaction itself.
+
+Signed-off-by: Bob Peterson <rpeterso@redhat.com>
+Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/gfs2/log.c | 11 +++++++++--
+ 1 file changed, 9 insertions(+), 2 deletions(-)
+
+diff --git a/fs/gfs2/log.c b/fs/gfs2/log.c
+index 0644e58c6191b..b7a5221bea7d5 100644
+--- a/fs/gfs2/log.c
++++ b/fs/gfs2/log.c
+@@ -1003,8 +1003,10 @@ out:
+  * @new: New transaction to be merged
+  */
+-static void gfs2_merge_trans(struct gfs2_trans *old, struct gfs2_trans *new)
++static void gfs2_merge_trans(struct gfs2_sbd *sdp, struct gfs2_trans *new)
+ {
++      struct gfs2_trans *old = sdp->sd_log_tr;
++
+       WARN_ON_ONCE(!test_bit(TR_ATTACHED, &old->tr_flags));
+       old->tr_num_buf_new     += new->tr_num_buf_new;
+@@ -1016,6 +1018,11 @@ static void gfs2_merge_trans(struct gfs2_trans *old, struct gfs2_trans *new)
+       list_splice_tail_init(&new->tr_databuf, &old->tr_databuf);
+       list_splice_tail_init(&new->tr_buf, &old->tr_buf);
++
++      spin_lock(&sdp->sd_ail_lock);
++      list_splice_tail_init(&new->tr_ail1_list, &old->tr_ail1_list);
++      list_splice_tail_init(&new->tr_ail2_list, &old->tr_ail2_list);
++      spin_unlock(&sdp->sd_ail_lock);
+ }
+ static void log_refund(struct gfs2_sbd *sdp, struct gfs2_trans *tr)
+@@ -1027,7 +1034,7 @@ static void log_refund(struct gfs2_sbd *sdp, struct gfs2_trans *tr)
+       gfs2_log_lock(sdp);
+       if (sdp->sd_log_tr) {
+-              gfs2_merge_trans(sdp->sd_log_tr, tr);
++              gfs2_merge_trans(sdp, tr);
+       } else if (tr->tr_num_buf_new || tr->tr_num_databuf_new) {
+               gfs2_assert_withdraw(sdp, test_bit(TR_ALLOCED, &tr->tr_flags));
+               sdp->sd_log_tr = tr;
+-- 
+2.25.1
+
diff --git a/queue-5.7/gpio-dwapb-append-module_alias-for-platform-driver.patch b/queue-5.7/gpio-dwapb-append-module_alias-for-platform-driver.patch
new file mode 100644 (file)
index 0000000..82eec1e
--- /dev/null
@@ -0,0 +1,77 @@
+From 8d91f4bbed616069246371f1555c63177bbd4a44 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 15 Apr 2020 17:15:21 +0300
+Subject: gpio: dwapb: Append MODULE_ALIAS for platform driver
+
+From: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
+
+[ Upstream commit c58220cba2e03618659fa7d5dfae31f5ad4ae9d0 ]
+
+The commit 3d2613c4289f
+  ("GPIO: gpio-dwapb: Enable platform driver binding to MFD driver")
+introduced a use of the platform driver but missed to add the following line
+to it:
+  MODULE_ALIAS("platform:gpio-dwapb");
+
+Add this to get driver loaded automatically if platform device is registered.
+
+Fixes: 3d2613c4289f ("GPIO: gpio-dwapb: Enable platform driver binding to MFD driver")
+Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
+Tested-by: Serge Semin <fancer.lancer@gmail.com>
+Reviewed-by: Serge Semin <fancer.lancer@gmail.com>
+Link: https://lore.kernel.org/r/20200415141534.31240-2-andriy.shevchenko@linux.intel.com
+Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/gpio/gpio-dwapb.c | 9 ++++++---
+ 1 file changed, 6 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/gpio/gpio-dwapb.c b/drivers/gpio/gpio-dwapb.c
+index 02cf4c43a4c4c..ed6061b5cca14 100644
+--- a/drivers/gpio/gpio-dwapb.c
++++ b/drivers/gpio/gpio-dwapb.c
+@@ -49,7 +49,9 @@
+ #define GPIO_EXT_PORTC                0x58
+ #define GPIO_EXT_PORTD                0x5c
++#define DWAPB_DRIVER_NAME     "gpio-dwapb"
+ #define DWAPB_MAX_PORTS               4
++
+ #define GPIO_EXT_PORT_STRIDE  0x04 /* register stride 32 bits */
+ #define GPIO_SWPORT_DR_STRIDE 0x0c /* register stride 3*32 bits */
+ #define GPIO_SWPORT_DDR_STRIDE        0x0c /* register stride 3*32 bits */
+@@ -398,7 +400,7 @@ static void dwapb_configure_irqs(struct dwapb_gpio *gpio,
+               return;
+       err = irq_alloc_domain_generic_chips(gpio->domain, ngpio, 2,
+-                                           "gpio-dwapb", handle_level_irq,
++                                           DWAPB_DRIVER_NAME, handle_level_irq,
+                                            IRQ_NOREQUEST, 0,
+                                            IRQ_GC_INIT_NESTED_LOCK);
+       if (err) {
+@@ -455,7 +457,7 @@ static void dwapb_configure_irqs(struct dwapb_gpio *gpio,
+                */
+               err = devm_request_irq(gpio->dev, pp->irq[0],
+                                      dwapb_irq_handler_mfd,
+-                                     IRQF_SHARED, "gpio-dwapb-mfd", gpio);
++                                     IRQF_SHARED, DWAPB_DRIVER_NAME, gpio);
+               if (err) {
+                       dev_err(gpio->dev, "error requesting IRQ\n");
+                       irq_domain_remove(gpio->domain);
+@@ -843,7 +845,7 @@ static SIMPLE_DEV_PM_OPS(dwapb_gpio_pm_ops, dwapb_gpio_suspend,
+ static struct platform_driver dwapb_gpio_driver = {
+       .driver         = {
+-              .name   = "gpio-dwapb",
++              .name   = DWAPB_DRIVER_NAME,
+               .pm     = &dwapb_gpio_pm_ops,
+               .of_match_table = of_match_ptr(dwapb_of_match),
+               .acpi_match_table = ACPI_PTR(dwapb_acpi_match),
+@@ -857,3 +859,4 @@ module_platform_driver(dwapb_gpio_driver);
+ MODULE_LICENSE("GPL");
+ MODULE_AUTHOR("Jamie Iles");
+ MODULE_DESCRIPTION("Synopsys DesignWare APB GPIO driver");
++MODULE_ALIAS("platform:" DWAPB_DRIVER_NAME);
+-- 
+2.25.1
+
diff --git a/queue-5.7/gpio-dwapb-call-acpi_gpiochip_free_interrupts-on-gpi.patch b/queue-5.7/gpio-dwapb-call-acpi_gpiochip_free_interrupts-on-gpi.patch
new file mode 100644 (file)
index 0000000..1462f22
--- /dev/null
@@ -0,0 +1,78 @@
+From 9f1144827564162cb65d9516b27562aa1e7a42bc Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 19 May 2020 16:12:30 +0300
+Subject: gpio: dwapb: Call acpi_gpiochip_free_interrupts() on GPIO chip
+ de-registration
+
+From: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
+
+[ Upstream commit 494a94e38dcf62543a32a4424d646ff80b4b28bd ]
+
+Add missed acpi_gpiochip_free_interrupts() call when unregistering ports.
+
+While at it, drop extra check to call acpi_gpiochip_request_interrupts().
+There is no need to have an additional check to call
+acpi_gpiochip_request_interrupts(). Even without any interrupts available
+the registered ACPI Event handlers can be useful for debugging purposes.
+
+Fixes: e6cb3486f5a1 ("gpio: dwapb: add gpio-signaled acpi event support")
+Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
+Tested-by: Serge Semin <fancer.lancer@gmail.com>
+Acked-by: Serge Semin <fancer.lancer@gmail.com>
+Link: https://lore.kernel.org/r/20200519131233.59032-1-andriy.shevchenko@linux.intel.com
+Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/gpio/gpio-dwapb.c | 25 ++++++++++++++++---------
+ 1 file changed, 16 insertions(+), 9 deletions(-)
+
+diff --git a/drivers/gpio/gpio-dwapb.c b/drivers/gpio/gpio-dwapb.c
+index 92e127e748134..02cf4c43a4c4c 100644
+--- a/drivers/gpio/gpio-dwapb.c
++++ b/drivers/gpio/gpio-dwapb.c
+@@ -533,26 +533,33 @@ static int dwapb_gpio_add_port(struct dwapb_gpio *gpio,
+               dwapb_configure_irqs(gpio, port, pp);
+       err = gpiochip_add_data(&port->gc, port);
+-      if (err)
++      if (err) {
+               dev_err(gpio->dev, "failed to register gpiochip for port%d\n",
+                       port->idx);
+-      else
+-              port->is_registered = true;
++              return err;
++      }
+       /* Add GPIO-signaled ACPI event support */
+-      if (pp->has_irq)
+-              acpi_gpiochip_request_interrupts(&port->gc);
++      acpi_gpiochip_request_interrupts(&port->gc);
+-      return err;
++      port->is_registered = true;
++
++      return 0;
+ }
+ static void dwapb_gpio_unregister(struct dwapb_gpio *gpio)
+ {
+       unsigned int m;
+-      for (m = 0; m < gpio->nr_ports; ++m)
+-              if (gpio->ports[m].is_registered)
+-                      gpiochip_remove(&gpio->ports[m].gc);
++      for (m = 0; m < gpio->nr_ports; ++m) {
++              struct dwapb_gpio_port *port = &gpio->ports[m];
++
++              if (!port->is_registered)
++                      continue;
++
++              acpi_gpiochip_free_interrupts(&port->gc);
++              gpiochip_remove(&port->gc);
++      }
+ }
+ static struct dwapb_platform_data *
+-- 
+2.25.1
+
diff --git a/queue-5.7/gpio-mlxbf2-fix-return-value-check-in-mlxbf2_gpio_ge.patch b/queue-5.7/gpio-mlxbf2-fix-return-value-check-in-mlxbf2_gpio_ge.patch
new file mode 100644 (file)
index 0000000..afba60a
--- /dev/null
@@ -0,0 +1,39 @@
+From 5745e6f2f0255cb6f4d924ecabbb2056baa5d00a Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 27 Apr 2020 11:08:29 +0000
+Subject: gpio: mlxbf2: fix return value check in mlxbf2_gpio_get_lock_res()
+
+From: Wei Yongjun <weiyongjun1@huawei.com>
+
+[ Upstream commit 66d8ad67aab3bc6f55e7de81565cd0d4875bd851 ]
+
+In case of error, the function devm_ioremap() returns NULL pointer not
+ERR_PTR(). The IS_ERR() test in the return value check should be
+replaced with NULL test.
+
+Signed-off-by: Wei Yongjun <weiyongjun1@huawei.com>
+Link: https://lore.kernel.org/r/20200427110829.154785-1-weiyongjun1@huawei.com
+Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/gpio/gpio-mlxbf2.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/gpio/gpio-mlxbf2.c b/drivers/gpio/gpio-mlxbf2.c
+index da570e63589d0..cc0dd8593a4ba 100644
+--- a/drivers/gpio/gpio-mlxbf2.c
++++ b/drivers/gpio/gpio-mlxbf2.c
+@@ -110,8 +110,8 @@ static int mlxbf2_gpio_get_lock_res(struct platform_device *pdev)
+       }
+       yu_arm_gpio_lock_param.io = devm_ioremap(dev, res->start, size);
+-      if (IS_ERR(yu_arm_gpio_lock_param.io))
+-              ret = PTR_ERR(yu_arm_gpio_lock_param.io);
++      if (!yu_arm_gpio_lock_param.io)
++              ret = -ENOMEM;
+ exit:
+       mutex_unlock(yu_arm_gpio_lock_param.lock);
+-- 
+2.25.1
+
diff --git a/queue-5.7/gpio-pca953x-fix-handling-of-automatic-address-incre.patch b/queue-5.7/gpio-pca953x-fix-handling-of-automatic-address-incre.patch
new file mode 100644 (file)
index 0000000..1792c39
--- /dev/null
@@ -0,0 +1,146 @@
+From 44c9fb122905c97413e6e60b83597fdaf800b7a2 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 20 Apr 2020 20:27:51 +0300
+Subject: gpio: pca953x: fix handling of automatic address incrementing
+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 bcf41dc480b179bfb669a232080a2e26dc7294b4 ]
+
+Some of the chips supported by the pca953x driver need the most
+significant bit in the address word set to automatically increment the
+address pointer on subsequent reads and writes (example: PCA9505). With
+this bit unset the same register is read multiple times on a multi-byte
+read sequence. Other chips must not have this bit set and autoincrement
+always (example: PCA9555).
+
+Up to now this AI bit was interpreted to be part of the address, which
+resulted in inconsistent regmap caching when a register was written with
+AI set and then read without it. This happened for the PCA9505 in
+pca953x_gpio_set_multiple() where pca953x_read_regs() bulk read from the
+cache for registers 0x8-0xc and then wrote to registers 0x88-0x8c. (Side
+note: reading 5 values from offset 0x8 yiels OP0 5 times because AI must
+be set to get OP0-OP4, which is another bug that is resolved here as a
+by-product.) The same problem happens when calls to gpio_set_value() and
+gpio_set_array_value() were mixed.
+
+With this patch the AI bit is always set for chips that support it. This
+works as there are no code locations that make use of the behaviour with
+AI unset (for the chips that support it).
+
+Note that the call to pca953x_setup_gpio() had to be done a bit earlier
+to make the NBANK macro work.
+
+The history of this bug is a bit complicated. Commit b32cecb46bdc
+("gpio: pca953x: Extract the register address mangling to single
+function") changed which chips and functions are affected. Commit
+3b00691cc46a ("gpio: pca953x: hack to fix 24 bit gpio expanders") used
+some duct tape to make the driver at least appear to work. Commit
+49427232764d ("gpio: pca953x: Perform basic regmap conversion")
+introduced the caching. Commit b4818afeacbd ("gpio: pca953x: Add
+set_multiple to allow multiple bits to be set in one write.") introduced
+the .set_multiple() callback which didn't work for chips that need the
+AI bit which was fixed later for some chips in 8958262af3fb ("gpio:
+pca953x: Repair multi-byte IO address increment on PCA9575"). So I'm
+sorry, I don't know which commit I should pick for a Fixes: line.
+
+Tested-by: Marcel Gudert <m.gudert@eckelmann.de>
+Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
+Tested-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
+Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
+Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
+Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/gpio/gpio-pca953x.c | 44 +++++++++++++++++++++++--------------
+ 1 file changed, 28 insertions(+), 16 deletions(-)
+
+diff --git a/drivers/gpio/gpio-pca953x.c b/drivers/gpio/gpio-pca953x.c
+index 4269ea9a817e6..01011a780688a 100644
+--- a/drivers/gpio/gpio-pca953x.c
++++ b/drivers/gpio/gpio-pca953x.c
+@@ -307,8 +307,22 @@ static const struct regmap_config pca953x_i2c_regmap = {
+       .volatile_reg = pca953x_volatile_register,
+       .cache_type = REGCACHE_RBTREE,
+-      /* REVISIT: should be 0x7f but some 24 bit chips use REG_ADDR_AI */
+-      .max_register = 0xff,
++      .max_register = 0x7f,
++};
++
++static const struct regmap_config pca953x_ai_i2c_regmap = {
++      .reg_bits = 8,
++      .val_bits = 8,
++
++      .read_flag_mask = REG_ADDR_AI,
++      .write_flag_mask = REG_ADDR_AI,
++
++      .readable_reg = pca953x_readable_register,
++      .writeable_reg = pca953x_writeable_register,
++      .volatile_reg = pca953x_volatile_register,
++
++      .cache_type = REGCACHE_RBTREE,
++      .max_register = 0x7f,
+ };
+ static u8 pca953x_recalc_addr(struct pca953x_chip *chip, int reg, int off,
+@@ -319,18 +333,6 @@ static u8 pca953x_recalc_addr(struct pca953x_chip *chip, int reg, int off,
+       int pinctrl = (reg & PCAL_PINCTRL_MASK) << 1;
+       u8 regaddr = pinctrl | addr | (off / BANK_SZ);
+-      /* Single byte read doesn't need AI bit set. */
+-      if (!addrinc)
+-              return regaddr;
+-
+-      /* Chips with 24 and more GPIOs always support Auto Increment */
+-      if (write && NBANK(chip) > 2)
+-              regaddr |= REG_ADDR_AI;
+-
+-      /* PCA9575 needs address-increment on multi-byte writes */
+-      if (PCA_CHIP_TYPE(chip->driver_data) == PCA957X_TYPE)
+-              regaddr |= REG_ADDR_AI;
+-
+       return regaddr;
+ }
+@@ -863,6 +865,7 @@ static int pca953x_probe(struct i2c_client *client,
+       int ret;
+       u32 invert = 0;
+       struct regulator *reg;
++      const struct regmap_config *regmap_config;
+       chip = devm_kzalloc(&client->dev, sizeof(*chip), GFP_KERNEL);
+       if (chip == NULL)
+@@ -925,7 +928,17 @@ static int pca953x_probe(struct i2c_client *client,
+       i2c_set_clientdata(client, chip);
+-      chip->regmap = devm_regmap_init_i2c(client, &pca953x_i2c_regmap);
++      pca953x_setup_gpio(chip, chip->driver_data & PCA_GPIO_MASK);
++
++      if (NBANK(chip) > 2 || PCA_CHIP_TYPE(chip->driver_data) == PCA957X_TYPE) {
++              dev_info(&client->dev, "using AI\n");
++              regmap_config = &pca953x_ai_i2c_regmap;
++      } else {
++              dev_info(&client->dev, "using no AI\n");
++              regmap_config = &pca953x_i2c_regmap;
++      }
++
++      chip->regmap = devm_regmap_init_i2c(client, regmap_config);
+       if (IS_ERR(chip->regmap)) {
+               ret = PTR_ERR(chip->regmap);
+               goto err_exit;
+@@ -956,7 +969,6 @@ static int pca953x_probe(struct i2c_client *client,
+       /* initialize cached registers from their original values.
+        * we can't share this chip with another i2c master.
+        */
+-      pca953x_setup_gpio(chip, chip->driver_data & PCA_GPIO_MASK);
+       if (PCA_CHIP_TYPE(chip->driver_data) == PCA953X_TYPE) {
+               chip->regs = &pca953x_regs;
+-- 
+2.25.1
+
diff --git a/queue-5.7/habanalabs-don-t-allow-hard-reset-with-open-processe.patch b/queue-5.7/habanalabs-don-t-allow-hard-reset-with-open-processe.patch
new file mode 100644 (file)
index 0000000..c93d5e2
--- /dev/null
@@ -0,0 +1,80 @@
+From 4638dd808eb4154c9c4410aae440d4d9d5f7b0f6 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 18 May 2020 22:27:46 +0300
+Subject: habanalabs: don't allow hard reset with open processes
+
+From: Omer Shpigelman <oshpigelman@habana.ai>
+
+[ Upstream commit 36fafe87edd636292a4ed6a3af9608f2c7d0d0fb ]
+
+When the MMU is heavily used by the engines, unmapping might take a lot of
+time due to a full MMU cache invalidation done as part of the unmap flow.
+Hence we might not be able to kill all open processes before going to hard
+reset the device, as it involves unmapping of all user memory.
+In case of a failure in killing all open processes, we should stop the
+hard reset flow as it might lead to a kernel crash - one thread (killing
+of a process) is updating MMU structures that other thread (hard reset) is
+freeing.
+Stopping a hard reset flow leaves the device as nonoperational and the
+user can then initiate a hard reset via sysfs to reinitialize the device.
+
+Signed-off-by: Omer Shpigelman <oshpigelman@habana.ai>
+Reviewed-by: Oded Gabbay <oded.gabbay@gmail.com>
+Signed-off-by: Oded Gabbay <oded.gabbay@gmail.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/misc/habanalabs/device.c | 17 +++++++++++------
+ 1 file changed, 11 insertions(+), 6 deletions(-)
+
+diff --git a/drivers/misc/habanalabs/device.c b/drivers/misc/habanalabs/device.c
+index aef4de36b7aae..6d9c298e02c73 100644
+--- a/drivers/misc/habanalabs/device.c
++++ b/drivers/misc/habanalabs/device.c
+@@ -718,7 +718,7 @@ disable_device:
+       return rc;
+ }
+-static void device_kill_open_processes(struct hl_device *hdev)
++static int device_kill_open_processes(struct hl_device *hdev)
+ {
+       u16 pending_total, pending_cnt;
+       struct hl_fpriv *hpriv;
+@@ -771,9 +771,7 @@ static void device_kill_open_processes(struct hl_device *hdev)
+               ssleep(1);
+       }
+-      if (!list_empty(&hdev->fpriv_list))
+-              dev_crit(hdev->dev,
+-                      "Going to hard reset with open user contexts\n");
++      return list_empty(&hdev->fpriv_list) ? 0 : -EBUSY;
+ }
+ static void device_hard_reset_pending(struct work_struct *work)
+@@ -894,7 +892,12 @@ again:
+                * process can't really exit until all its CSs are done, which
+                * is what we do in cs rollback
+                */
+-              device_kill_open_processes(hdev);
++              rc = device_kill_open_processes(hdev);
++              if (rc) {
++                      dev_crit(hdev->dev,
++                              "Failed to kill all open processes, stopping hard reset\n");
++                      goto out_err;
++              }
+               /* Flush the Event queue workers to make sure no other thread is
+                * reading or writing to registers during the reset
+@@ -1375,7 +1378,9 @@ void hl_device_fini(struct hl_device *hdev)
+        * can't really exit until all its CSs are done, which is what we
+        * do in cs rollback
+        */
+-      device_kill_open_processes(hdev);
++      rc = device_kill_open_processes(hdev);
++      if (rc)
++              dev_crit(hdev->dev, "Failed to kill all open processes\n");
+       hl_cb_pool_fini(hdev);
+-- 
+2.25.1
+
diff --git a/queue-5.7/habanalabs-increase-timeout-during-reset.patch b/queue-5.7/habanalabs-increase-timeout-during-reset.patch
new file mode 100644 (file)
index 0000000..15d90d6
--- /dev/null
@@ -0,0 +1,44 @@
+From 29d22896a3c7e22b37c87b9715ac1eecf885ce34 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 27 Mar 2020 16:38:37 +0300
+Subject: habanalabs: increase timeout during reset
+
+From: Oded Gabbay <oded.gabbay@gmail.com>
+
+[ Upstream commit 7a65ee046b2238e053f6ebb610e1a082cfc49490 ]
+
+When doing training, the DL framework (e.g. tensorflow) performs hundreds
+of thousands of memory allocations and mappings. In case the driver needs
+to perform hard-reset during training, the driver kills the application and
+unmaps all those memory allocations. Unfortunately, because of that large
+amount of mappings, the driver isn't able to do that in the current timeout
+(5 seconds). Therefore, increase the timeout significantly to 30 seconds
+to avoid situation where the driver resets the device with active mappings,
+which sometime can cause a kernel bug.
+
+BTW, it doesn't mean we will spend all the 30 seconds because the reset
+thread checks every one second if the unmap operation is done.
+
+Reviewed-by: Omer Shpigelman <oshpigelman@habana.ai>
+Signed-off-by: Oded Gabbay <oded.gabbay@gmail.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/misc/habanalabs/habanalabs.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/misc/habanalabs/habanalabs.h b/drivers/misc/habanalabs/habanalabs.h
+index 31ebcf9458fe1..a6dd8e6ca594c 100644
+--- a/drivers/misc/habanalabs/habanalabs.h
++++ b/drivers/misc/habanalabs/habanalabs.h
+@@ -23,7 +23,7 @@
+ #define HL_MMAP_CB_MASK                       (0x8000000000000000ull >> PAGE_SHIFT)
+-#define HL_PENDING_RESET_PER_SEC      5
++#define HL_PENDING_RESET_PER_SEC      30
+ #define HL_DEVICE_TIMEOUT_USEC                1000000 /* 1 s */
+-- 
+2.25.1
+
diff --git a/queue-5.7/hid-add-quirks-for-trust-panora-graphic-tablet.patch b/queue-5.7/hid-add-quirks-for-trust-panora-graphic-tablet.patch
new file mode 100644 (file)
index 0000000..4a4912c
--- /dev/null
@@ -0,0 +1,75 @@
+From 611ecf8d2aa6f8a6caec12227f79a42367cfc193 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 8 May 2020 17:26:04 +0200
+Subject: HID: Add quirks for Trust Panora Graphic Tablet
+
+From: Cristian Klein <cristian.klein@elastisys.com>
+
+[ Upstream commit fb68ada81e65d593b51544fa43c284322107a742 ]
+
+The Trust Panora Graphic Tablet has two interfaces. Interface zero reports pen
+movement, pen pressure and pen buttons. Interface one reports tablet buttons
+and tablet scroll. Both use the mouse protocol.
+
+Without these quirks, libinput gets confused about what device it talks to.
+
+For completeness, here is the usbhid-dump:
+
+```
+$ sudo usbhid-dump -d 145f:0212
+003:013:001:DESCRIPTOR         1588949402.559961
+ 05 0D 09 01 A1 01 85 07 A1 02 09 00 75 08 95 07
+ 81 02 C0 C0 09 0E A1 01 85 05 09 23 A1 02 09 52
+ 09 53 25 0A 75 08 95 02 B1 02 C0 C0 05 0C 09 36
+ A1 00 85 06 05 09 19 01 29 20 15 00 25 01 95 20
+ 75 01 81 02 C0
+
+003:013:000:DESCRIPTOR         1588949402.563942
+ 05 01 09 02 A1 01 85 08 09 01 A1 00 05 09 19 01
+ 29 03 15 00 25 01 95 03 75 01 81 02 95 05 81 01
+ 05 01 09 30 09 31 09 38 09 00 15 81 25 7F 75 08
+ 95 04 81 06 C0 C0 05 01 09 02 A1 01 85 09 09 01
+ A1 00 05 09 19 01 29 03 15 00 25 01 95 03 75 01
+ 81 02 95 05 81 01 05 01 09 30 09 31 26 FF 7F 95
+ 02 75 10 81 02 05 0D 09 30 26 FF 03 95 01 75 10
+ 81 02 C0 C0 05 01 09 00 A1 01 85 04 A1 00 26 FF
+ 00 09 00 75 08 95 07 B1 02 C0 C0
+```
+
+Signed-off-by: Cristian Klein <cristian.klein@elastisys.com>
+Signed-off-by: Jiri Kosina <jkosina@suse.cz>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/hid/hid-ids.h    | 3 +++
+ drivers/hid/hid-quirks.c | 1 +
+ 2 files changed, 4 insertions(+)
+
+diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
+index 1c71a1aa76b22..f03f1cc913ce8 100644
+--- a/drivers/hid/hid-ids.h
++++ b/drivers/hid/hid-ids.h
+@@ -1157,6 +1157,9 @@
+ #define USB_DEVICE_ID_TPV_OPTICAL_TOUCHSCREEN_8882    0x8882
+ #define USB_DEVICE_ID_TPV_OPTICAL_TOUCHSCREEN_8883    0x8883
++#define USB_VENDOR_ID_TRUST             0x145f
++#define USB_DEVICE_ID_TRUST_PANORA_TABLET   0x0212
++
+ #define USB_VENDOR_ID_TURBOX          0x062a
+ #define USB_DEVICE_ID_TURBOX_KEYBOARD 0x0201
+ #define USB_DEVICE_ID_ASUS_MD_5110    0x5110
+diff --git a/drivers/hid/hid-quirks.c b/drivers/hid/hid-quirks.c
+index e4cb543de0cdc..ca8b5c261c7ce 100644
+--- a/drivers/hid/hid-quirks.c
++++ b/drivers/hid/hid-quirks.c
+@@ -168,6 +168,7 @@ static const struct hid_device_id hid_quirks[] = {
+       { HID_USB_DEVICE(USB_VENDOR_ID_TOUCHPACK, USB_DEVICE_ID_TOUCHPACK_RTS), HID_QUIRK_MULTI_INPUT },
+       { HID_USB_DEVICE(USB_VENDOR_ID_TPV, USB_DEVICE_ID_TPV_OPTICAL_TOUCHSCREEN_8882), HID_QUIRK_NOGET },
+       { HID_USB_DEVICE(USB_VENDOR_ID_TPV, USB_DEVICE_ID_TPV_OPTICAL_TOUCHSCREEN_8883), HID_QUIRK_NOGET },
++      { HID_USB_DEVICE(USB_VENDOR_ID_TRUST, USB_DEVICE_ID_TRUST_PANORA_TABLET), HID_QUIRK_MULTI_INPUT | HID_QUIRK_HIDINPUT_FORCE },
+       { HID_USB_DEVICE(USB_VENDOR_ID_TURBOX, USB_DEVICE_ID_TURBOX_KEYBOARD), HID_QUIRK_NOGET },
+       { HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_TABLET_KNA5), HID_QUIRK_MULTI_INPUT },
+       { HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_TABLET_TWA60), HID_QUIRK_MULTI_INPUT },
+-- 
+2.25.1
+
diff --git a/queue-5.7/hid-intel-ish-hid-avoid-bogus-uninitialized-variable.patch b/queue-5.7/hid-intel-ish-hid-avoid-bogus-uninitialized-variable.patch
new file mode 100644 (file)
index 0000000..31a21a0
--- /dev/null
@@ -0,0 +1,56 @@
+From ed9684fbc4b2d921c9fc85732a81c6a5bca4da41 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 28 Apr 2020 23:53:29 +0200
+Subject: HID: intel-ish-hid: avoid bogus uninitialized-variable warning
+
+From: Arnd Bergmann <arnd@arndb.de>
+
+[ Upstream commit 0b66fb3e6b7a53688f8e20945ac78cd3d832c65f ]
+
+Older compilers like gcc-4.8 don't see that the variable is
+initialized when it is used:
+
+In file included from include/linux/compiler_types.h:68:0,
+                 from <command-line>:0:
+drivers/hid/intel-ish-hid/ishtp-fw-loader.c: In function 'load_fw_from_host':
+include/linux/compiler-gcc.h:75:45: warning: 'fw_info.ldr_capability.max_dma_buf_size' may be used uninitialized in this function [-Wmaybe-uninitialized]
+ #define __UNIQUE_ID(prefix) __PASTE(__PASTE(__UNIQUE_ID_, prefix), __COUNTER__)
+                                             ^
+drivers/hid/intel-ish-hid/ishtp-fw-loader.c:770:22: note: 'fw_info.ldr_capability.max_dma_buf_size' was declared here
+  struct shim_fw_info fw_info;
+                      ^
+
+Make sure to initialize it before returning an error from ish_query_loader_prop().
+
+Fixes: 91b228107da3 ("HID: intel-ish-hid: ISH firmware loader client driver")
+Signed-off-by: Arnd Bergmann <arnd@arndb.de>
+Acked-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
+Signed-off-by: Jiri Kosina <jkosina@suse.cz>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/hid/intel-ish-hid/ishtp-fw-loader.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/drivers/hid/intel-ish-hid/ishtp-fw-loader.c b/drivers/hid/intel-ish-hid/ishtp-fw-loader.c
+index aa2dbed30fc36..6cf59fd26ad78 100644
+--- a/drivers/hid/intel-ish-hid/ishtp-fw-loader.c
++++ b/drivers/hid/intel-ish-hid/ishtp-fw-loader.c
+@@ -480,6 +480,7 @@ static int ish_query_loader_prop(struct ishtp_cl_data *client_data,
+                           sizeof(ldr_xfer_query_resp));
+       if (rv < 0) {
+               client_data->flag_retry = true;
++              *fw_info = (struct shim_fw_info){};
+               return rv;
+       }
+@@ -489,6 +490,7 @@ static int ish_query_loader_prop(struct ishtp_cl_data *client_data,
+                       "data size %d is not equal to size of loader_xfer_query_response %zu\n",
+                       rv, sizeof(struct loader_xfer_query_response));
+               client_data->flag_retry = true;
++              *fw_info = (struct shim_fw_info){};
+               return -EMSGSIZE;
+       }
+-- 
+2.25.1
+
diff --git a/queue-5.7/i2c-icy-fix-build-with-config_amiga_pcmcia-n.patch b/queue-5.7/i2c-icy-fix-build-with-config_amiga_pcmcia-n.patch
new file mode 100644 (file)
index 0000000..abf2e1b
--- /dev/null
@@ -0,0 +1,39 @@
+From d54e1ade76205b532a66dda9120a5b1b0cc4d93c Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 7 Jun 2020 20:28:12 +0200
+Subject: i2c: icy: Fix build with CONFIG_AMIGA_PCMCIA=n
+
+From: Max Staudt <max@enpas.org>
+
+[ Upstream commit cdb555397f438592bab00599037c347b700cf397 ]
+
+This has been found by the Kernel Test Robot:
+http://lkml.iu.edu/hypermail/linux/kernel/2006.0/06862.html
+
+With CONFIG_AMIGA_PCMCIA=n, io_mm.h does not pull in amigahw.h and
+ZTWO_VADDR is undefined. Add forgotten include to i2c-icy.c
+
+Fixes: 4768e90ecaec ("i2c: Add i2c-icy for I2C on m68k/Amiga")
+Reported-by: kernel test robot <lkp@intel.com>
+Signed-off-by: Max Staudt <max@enpas.org>
+Signed-off-by: Wolfram Sang <wsa@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/i2c/busses/i2c-icy.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/i2c/busses/i2c-icy.c b/drivers/i2c/busses/i2c-icy.c
+index 271470f4d8a9b..66c9923fc7665 100644
+--- a/drivers/i2c/busses/i2c-icy.c
++++ b/drivers/i2c/busses/i2c-icy.c
+@@ -43,6 +43,7 @@
+ #include <linux/i2c.h>
+ #include <linux/i2c-algo-pcf.h>
++#include <asm/amigahw.h>
+ #include <asm/amigaints.h>
+ #include <linux/zorro.h>
+-- 
+2.25.1
+
diff --git a/queue-5.7/i2c-piix4-detect-secondary-smbus-controller-on-amd-a.patch b/queue-5.7/i2c-piix4-detect-secondary-smbus-controller-on-amd-a.patch
new file mode 100644 (file)
index 0000000..193f452
--- /dev/null
@@ -0,0 +1,51 @@
+From 41f801fd3537dbce2c9215b5d092d29906214620 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 10 Apr 2020 15:48:44 -0500
+Subject: i2c: piix4: Detect secondary SMBus controller on AMD AM4 chipsets
+
+From: Adam Honse <calcprogrammer1@gmail.com>
+
+[ Upstream commit f27237c174fd9653033330e4e532cd9d153ce824 ]
+
+The AMD X370 and other AM4 chipsets (A/B/X 3/4/5 parts) and Threadripper
+equivalents have a secondary SMBus controller at I/O port address
+0x0B20.  This bus is used by several manufacturers to control
+motherboard RGB lighting via embedded controllers.  I have been using
+this bus in my OpenRGB project to control the Aura RGB on many
+motherboards and ASRock also uses this bus for their Polychrome RGB
+controller.
+
+I am not aware of any CZ-compatible platforms which do not have the
+second SMBus channel.  All of AMD's AM4- and Threadripper- series
+chipsets that OpenRGB users have tested appear to have this secondary
+bus.  I also noticed this secondary bus is present on older AMD
+platforms including my FM1 home server.
+
+Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=202587
+Signed-off-by: Adam Honse <calcprogrammer1@gmail.com>
+Reviewed-by: Jean Delvare <jdelvare@suse.de>
+Reviewed-by: Sebastian Reichel <sebastian.reichel@collabora.com>
+Tested-by: Sebastian Reichel <sebastian.reichel@collabora.com>
+Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/i2c/busses/i2c-piix4.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/i2c/busses/i2c-piix4.c b/drivers/i2c/busses/i2c-piix4.c
+index 30ded6422e7b2..69740a4ff1db2 100644
+--- a/drivers/i2c/busses/i2c-piix4.c
++++ b/drivers/i2c/busses/i2c-piix4.c
+@@ -977,7 +977,8 @@ static int piix4_probe(struct pci_dev *dev, const struct pci_device_id *id)
+       }
+       if (dev->vendor == PCI_VENDOR_ID_AMD &&
+-          dev->device == PCI_DEVICE_ID_AMD_HUDSON2_SMBUS) {
++          (dev->device == PCI_DEVICE_ID_AMD_HUDSON2_SMBUS ||
++           dev->device == PCI_DEVICE_ID_AMD_KERNCZ_SMBUS)) {
+               retval = piix4_setup_sb800(dev, id, 1);
+       }
+-- 
+2.25.1
+
diff --git a/queue-5.7/i2c-pxa-clear-all-master-action-bits-in-i2c_pxa_stop.patch b/queue-5.7/i2c-pxa-clear-all-master-action-bits-in-i2c_pxa_stop.patch
new file mode 100644 (file)
index 0000000..6afdf1f
--- /dev/null
@@ -0,0 +1,45 @@
+From 60f63e1f2a6d5372f40033a0692b2057b585c829 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 6 May 2020 10:36:38 +0100
+Subject: i2c: pxa: clear all master action bits in i2c_pxa_stop_message()
+
+From: Russell King <rmk+kernel@armlinux.org.uk>
+
+[ Upstream commit e81c979f4e071d516aa27cf5a0c3939da00dc1ca ]
+
+If we timeout during a message transfer, the control register may
+contain bits that cause an action to be set. Read-modify-writing the
+register leaving these bits set may trigger the hardware to attempt
+one of these actions unintentionally.
+
+Always clear these bits when cleaning up after a message or after
+a timeout.
+
+Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
+Signed-off-by: Wolfram Sang <wsa@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/i2c/busses/i2c-pxa.c | 6 ++----
+ 1 file changed, 2 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/i2c/busses/i2c-pxa.c b/drivers/i2c/busses/i2c-pxa.c
+index 466e4f681d7a4..30a6e07212a42 100644
+--- a/drivers/i2c/busses/i2c-pxa.c
++++ b/drivers/i2c/busses/i2c-pxa.c
+@@ -747,11 +747,9 @@ static inline void i2c_pxa_stop_message(struct pxa_i2c *i2c)
+ {
+       u32 icr;
+-      /*
+-       * Clear the STOP and ACK flags
+-       */
++      /* Clear the START, STOP, ACK, TB and MA flags */
+       icr = readl(_ICR(i2c));
+-      icr &= ~(ICR_STOP | ICR_ACKNAK);
++      icr &= ~(ICR_START | ICR_STOP | ICR_ACKNAK | ICR_TB | ICR_MA);
+       writel(icr, _ICR(i2c));
+ }
+-- 
+2.25.1
+
diff --git a/queue-5.7/i2c-pxa-fix-i2c_pxa_scream_blue_murder-debug-output.patch b/queue-5.7/i2c-pxa-fix-i2c_pxa_scream_blue_murder-debug-output.patch
new file mode 100644 (file)
index 0000000..208198c
--- /dev/null
@@ -0,0 +1,54 @@
+From 71cdcd4b08dad36780f0b7d28a96757157a4f411 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 27 Apr 2020 19:49:22 +0100
+Subject: i2c: pxa: fix i2c_pxa_scream_blue_murder() debug output
+
+From: Russell King <rmk+kernel@armlinux.org.uk>
+
+[ Upstream commit 88b73ee7ca4c90baf136ed5a8377fc5a9b73ac08 ]
+
+The IRQ log output is supposed to appear on a single line.  However,
+commit 3a2dc1677b60 ("i2c: pxa: Update debug function to dump more info
+on error") resulted in it being printed one-entry-per-line, which is
+excessively long.
+
+Fixing this is not a trivial matter; using pr_cont() doesn't work as
+the previous dev_dbg() may not have been compiled in, or may be
+dynamic.
+
+Since the rest of this function output is at error level, and is also
+debug output, promote this to error level as well to avoid this
+problem.
+
+Reduce the number of always zero prefix digits to save screen real-
+estate.
+
+Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
+Signed-off-by: Wolfram Sang <wsa@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/i2c/busses/i2c-pxa.c | 7 +++----
+ 1 file changed, 3 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/i2c/busses/i2c-pxa.c b/drivers/i2c/busses/i2c-pxa.c
+index 30a6e07212a42..f537a37ac1d52 100644
+--- a/drivers/i2c/busses/i2c-pxa.c
++++ b/drivers/i2c/busses/i2c-pxa.c
+@@ -311,11 +311,10 @@ static void i2c_pxa_scream_blue_murder(struct pxa_i2c *i2c, const char *why)
+       dev_err(dev, "IBMR: %08x IDBR: %08x ICR: %08x ISR: %08x\n",
+               readl(_IBMR(i2c)), readl(_IDBR(i2c)), readl(_ICR(i2c)),
+               readl(_ISR(i2c)));
+-      dev_dbg(dev, "log: ");
++      dev_err(dev, "log:");
+       for (i = 0; i < i2c->irqlogidx; i++)
+-              pr_debug("[%08x:%08x] ", i2c->isrlog[i], i2c->icrlog[i]);
+-
+-      pr_debug("\n");
++              pr_cont(" [%03x:%05x]", i2c->isrlog[i], i2c->icrlog[i]);
++      pr_cont("\n");
+ }
+ #else /* ifdef DEBUG */
+-- 
+2.25.1
+
diff --git a/queue-5.7/iavf-fix-speed-reporting-over-virtchnl.patch b/queue-5.7/iavf-fix-speed-reporting-over-virtchnl.patch
new file mode 100644 (file)
index 0000000..ae2ec98
--- /dev/null
@@ -0,0 +1,330 @@
+From 14456ded5cb28e48f14d790695bb664d18485500 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 5 Jun 2020 10:09:43 -0700
+Subject: iavf: fix speed reporting over virtchnl
+
+From: Brett Creeley <brett.creeley@intel.com>
+
+[ Upstream commit e0ef26fbe2b0c62f42ba7667076dc38b693b6fb8 ]
+
+Link speeds are communicated over virtchnl using an enum
+virtchnl_link_speed. Currently, the highest link speed is 40Gbps which
+leaves us unable to reflect some speeds that an ice VF is capable of.
+This causes link speed to be misreported on the iavf driver.
+
+Allow for communicating link speeds using Mbps so that the proper speed can
+be reported for an ice VF. Moving away from the enum allows us to
+communicate future speed changes without requiring a new enum to be added.
+
+In order to support communicating link speeds over virtchnl in Mbps the
+following functionality was added:
+    - Added u32 link_speed_mbps in the iavf_adapter structure.
+    - Added the macro ADV_LINK_SUPPORT(_a) to determine if the VF
+      driver supports communicating link speeds in Mbps.
+    - Added the function iavf_get_vpe_link_status() to fill the
+      correct link_status in the event_data union based on the
+      ADV_LINK_SUPPORT(_a) macro.
+    - Added the function iavf_set_adapter_link_speed_from_vpe()
+      to determine whether or not to fill the u32 link_speed_mbps or
+      enum virtchnl_link_speed link_speed field in the iavf_adapter
+      structure based on the ADV_LINK_SUPPORT(_a) macro.
+    - Do not free vf_res in iavf_init_get_resources() as vf_res will be
+      accessed in iavf_get_link_ksettings(); memset to 0 instead. This
+      memory is subsequently freed in iavf_remove().
+
+Fixes: 7c710869d64e ("ice: Add handlers for VF netdevice operations")
+Signed-off-by: Brett Creeley <brett.creeley@intel.com>
+Signed-off-by: Sergey Nemov <sergey.nemov@intel.com>
+Signed-off-by: Paul Greenwalt <paul.greenwalt@intel.com>
+Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
+Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/ethernet/intel/iavf/iavf.h        | 14 +++
+ .../net/ethernet/intel/iavf/iavf_ethtool.c    | 14 ++-
+ drivers/net/ethernet/intel/iavf/iavf_main.c   | 25 ++++--
+ .../net/ethernet/intel/iavf/iavf_virtchnl.c   | 88 ++++++++++++++++---
+ 4 files changed, 120 insertions(+), 21 deletions(-)
+
+diff --git a/drivers/net/ethernet/intel/iavf/iavf.h b/drivers/net/ethernet/intel/iavf/iavf.h
+index bcd11b4b29df2..2d4ce6fdba1af 100644
+--- a/drivers/net/ethernet/intel/iavf/iavf.h
++++ b/drivers/net/ethernet/intel/iavf/iavf.h
+@@ -87,6 +87,10 @@ struct iavf_vsi {
+ #define IAVF_HLUT_ARRAY_SIZE ((IAVF_VFQF_HLUT_MAX_INDEX + 1) * 4)
+ #define IAVF_MBPS_DIVISOR     125000 /* divisor to convert to Mbps */
++#define IAVF_VIRTCHNL_VF_RESOURCE_SIZE (sizeof(struct virtchnl_vf_resource) + \
++                                      (IAVF_MAX_VF_VSI * \
++                                       sizeof(struct virtchnl_vsi_resource)))
++
+ /* MAX_MSIX_Q_VECTORS of these are allocated,
+  * but we only use one per queue-specific vector.
+  */
+@@ -306,6 +310,14 @@ struct iavf_adapter {
+       bool netdev_registered;
+       bool link_up;
+       enum virtchnl_link_speed link_speed;
++      /* This is only populated if the VIRTCHNL_VF_CAP_ADV_LINK_SPEED is set
++       * in vf_res->vf_cap_flags. Use ADV_LINK_SUPPORT macro to determine if
++       * this field is valid. This field should be used going forward and the
++       * enum virtchnl_link_speed above should be considered the legacy way of
++       * storing/communicating link speeds.
++       */
++      u32 link_speed_mbps;
++
+       enum virtchnl_ops current_op;
+ #define CLIENT_ALLOWED(_a) ((_a)->vf_res ? \
+                           (_a)->vf_res->vf_cap_flags & \
+@@ -322,6 +334,8 @@ struct iavf_adapter {
+                       VIRTCHNL_VF_OFFLOAD_RSS_PF)))
+ #define VLAN_ALLOWED(_a) ((_a)->vf_res->vf_cap_flags & \
+                         VIRTCHNL_VF_OFFLOAD_VLAN)
++#define ADV_LINK_SUPPORT(_a) ((_a)->vf_res->vf_cap_flags & \
++                            VIRTCHNL_VF_CAP_ADV_LINK_SPEED)
+       struct virtchnl_vf_resource *vf_res; /* incl. all VSIs */
+       struct virtchnl_vsi_resource *vsi_res; /* our LAN VSI */
+       struct virtchnl_version_info pf_version;
+diff --git a/drivers/net/ethernet/intel/iavf/iavf_ethtool.c b/drivers/net/ethernet/intel/iavf/iavf_ethtool.c
+index 2c39d46b61385..40a3fc7c5ea5e 100644
+--- a/drivers/net/ethernet/intel/iavf/iavf_ethtool.c
++++ b/drivers/net/ethernet/intel/iavf/iavf_ethtool.c
+@@ -278,7 +278,18 @@ static int iavf_get_link_ksettings(struct net_device *netdev,
+       ethtool_link_ksettings_zero_link_mode(cmd, supported);
+       cmd->base.autoneg = AUTONEG_DISABLE;
+       cmd->base.port = PORT_NONE;
+-      /* Set speed and duplex */
++      cmd->base.duplex = DUPLEX_FULL;
++
++      if (ADV_LINK_SUPPORT(adapter)) {
++              if (adapter->link_speed_mbps &&
++                  adapter->link_speed_mbps < U32_MAX)
++                      cmd->base.speed = adapter->link_speed_mbps;
++              else
++                      cmd->base.speed = SPEED_UNKNOWN;
++
++              return 0;
++      }
++
+       switch (adapter->link_speed) {
+       case IAVF_LINK_SPEED_40GB:
+               cmd->base.speed = SPEED_40000;
+@@ -306,7 +317,6 @@ static int iavf_get_link_ksettings(struct net_device *netdev,
+       default:
+               break;
+       }
+-      cmd->base.duplex = DUPLEX_FULL;
+       return 0;
+ }
+diff --git a/drivers/net/ethernet/intel/iavf/iavf_main.c b/drivers/net/ethernet/intel/iavf/iavf_main.c
+index 2050649848ba7..a21ae74bcd1b6 100644
+--- a/drivers/net/ethernet/intel/iavf/iavf_main.c
++++ b/drivers/net/ethernet/intel/iavf/iavf_main.c
+@@ -1756,17 +1756,17 @@ static int iavf_init_get_resources(struct iavf_adapter *adapter)
+       struct net_device *netdev = adapter->netdev;
+       struct pci_dev *pdev = adapter->pdev;
+       struct iavf_hw *hw = &adapter->hw;
+-      int err = 0, bufsz;
++      int err;
+       WARN_ON(adapter->state != __IAVF_INIT_GET_RESOURCES);
+       /* aq msg sent, awaiting reply */
+       if (!adapter->vf_res) {
+-              bufsz = sizeof(struct virtchnl_vf_resource) +
+-                      (IAVF_MAX_VF_VSI *
+-                      sizeof(struct virtchnl_vsi_resource));
+-              adapter->vf_res = kzalloc(bufsz, GFP_KERNEL);
+-              if (!adapter->vf_res)
++              adapter->vf_res = kzalloc(IAVF_VIRTCHNL_VF_RESOURCE_SIZE,
++                                        GFP_KERNEL);
++              if (!adapter->vf_res) {
++                      err = -ENOMEM;
+                       goto err;
++              }
+       }
+       err = iavf_get_vf_config(adapter);
+       if (err == IAVF_ERR_ADMIN_QUEUE_NO_WORK) {
+@@ -2036,7 +2036,7 @@ static void iavf_disable_vf(struct iavf_adapter *adapter)
+       iavf_reset_interrupt_capability(adapter);
+       iavf_free_queues(adapter);
+       iavf_free_q_vectors(adapter);
+-      kfree(adapter->vf_res);
++      memset(adapter->vf_res, 0, IAVF_VIRTCHNL_VF_RESOURCE_SIZE);
+       iavf_shutdown_adminq(&adapter->hw);
+       adapter->netdev->flags &= ~IFF_UP;
+       clear_bit(__IAVF_IN_CRITICAL_TASK, &adapter->crit_section);
+@@ -2487,6 +2487,16 @@ static int iavf_validate_tx_bandwidth(struct iavf_adapter *adapter,
+ {
+       int speed = 0, ret = 0;
++      if (ADV_LINK_SUPPORT(adapter)) {
++              if (adapter->link_speed_mbps < U32_MAX) {
++                      speed = adapter->link_speed_mbps;
++                      goto validate_bw;
++              } else {
++                      dev_err(&adapter->pdev->dev, "Unknown link speed\n");
++                      return -EINVAL;
++              }
++      }
++
+       switch (adapter->link_speed) {
+       case IAVF_LINK_SPEED_40GB:
+               speed = 40000;
+@@ -2510,6 +2520,7 @@ static int iavf_validate_tx_bandwidth(struct iavf_adapter *adapter,
+               break;
+       }
++validate_bw:
+       if (max_tx_rate > speed) {
+               dev_err(&adapter->pdev->dev,
+                       "Invalid tx rate specified\n");
+diff --git a/drivers/net/ethernet/intel/iavf/iavf_virtchnl.c b/drivers/net/ethernet/intel/iavf/iavf_virtchnl.c
+index d58374c2c33d0..ca79bec4ebd9f 100644
+--- a/drivers/net/ethernet/intel/iavf/iavf_virtchnl.c
++++ b/drivers/net/ethernet/intel/iavf/iavf_virtchnl.c
+@@ -139,7 +139,8 @@ int iavf_send_vf_config_msg(struct iavf_adapter *adapter)
+              VIRTCHNL_VF_OFFLOAD_ENCAP |
+              VIRTCHNL_VF_OFFLOAD_ENCAP_CSUM |
+              VIRTCHNL_VF_OFFLOAD_REQ_QUEUES |
+-             VIRTCHNL_VF_OFFLOAD_ADQ;
++             VIRTCHNL_VF_OFFLOAD_ADQ |
++             VIRTCHNL_VF_CAP_ADV_LINK_SPEED;
+       adapter->current_op = VIRTCHNL_OP_GET_VF_RESOURCES;
+       adapter->aq_required &= ~IAVF_FLAG_AQ_GET_CONFIG;
+@@ -891,6 +892,8 @@ void iavf_disable_vlan_stripping(struct iavf_adapter *adapter)
+       iavf_send_pf_msg(adapter, VIRTCHNL_OP_DISABLE_VLAN_STRIPPING, NULL, 0);
+ }
++#define IAVF_MAX_SPEED_STRLEN 13
++
+ /**
+  * iavf_print_link_message - print link up or down
+  * @adapter: adapter structure
+@@ -900,37 +903,99 @@ void iavf_disable_vlan_stripping(struct iavf_adapter *adapter)
+ static void iavf_print_link_message(struct iavf_adapter *adapter)
+ {
+       struct net_device *netdev = adapter->netdev;
+-      char *speed = "Unknown ";
++      int link_speed_mbps;
++      char *speed;
+       if (!adapter->link_up) {
+               netdev_info(netdev, "NIC Link is Down\n");
+               return;
+       }
++      speed = kcalloc(1, IAVF_MAX_SPEED_STRLEN, GFP_KERNEL);
++      if (!speed)
++              return;
++
++      if (ADV_LINK_SUPPORT(adapter)) {
++              link_speed_mbps = adapter->link_speed_mbps;
++              goto print_link_msg;
++      }
++
+       switch (adapter->link_speed) {
+       case IAVF_LINK_SPEED_40GB:
+-              speed = "40 G";
++              link_speed_mbps = SPEED_40000;
+               break;
+       case IAVF_LINK_SPEED_25GB:
+-              speed = "25 G";
++              link_speed_mbps = SPEED_25000;
+               break;
+       case IAVF_LINK_SPEED_20GB:
+-              speed = "20 G";
++              link_speed_mbps = SPEED_20000;
+               break;
+       case IAVF_LINK_SPEED_10GB:
+-              speed = "10 G";
++              link_speed_mbps = SPEED_10000;
+               break;
+       case IAVF_LINK_SPEED_1GB:
+-              speed = "1000 M";
++              link_speed_mbps = SPEED_1000;
+               break;
+       case IAVF_LINK_SPEED_100MB:
+-              speed = "100 M";
++              link_speed_mbps = SPEED_100;
+               break;
+       default:
++              link_speed_mbps = SPEED_UNKNOWN;
+               break;
+       }
+-      netdev_info(netdev, "NIC Link is Up %sbps Full Duplex\n", speed);
++print_link_msg:
++      if (link_speed_mbps > SPEED_1000) {
++              if (link_speed_mbps == SPEED_2500)
++                      snprintf(speed, IAVF_MAX_SPEED_STRLEN, "2.5 Gbps");
++              else
++                      /* convert to Gbps inline */
++                      snprintf(speed, IAVF_MAX_SPEED_STRLEN, "%d %s",
++                               link_speed_mbps / 1000, "Gbps");
++      } else if (link_speed_mbps == SPEED_UNKNOWN) {
++              snprintf(speed, IAVF_MAX_SPEED_STRLEN, "%s", "Unknown Mbps");
++      } else {
++              snprintf(speed, IAVF_MAX_SPEED_STRLEN, "%u %s",
++                       link_speed_mbps, "Mbps");
++      }
++
++      netdev_info(netdev, "NIC Link is Up Speed is %s Full Duplex\n", speed);
++      kfree(speed);
++}
++
++/**
++ * iavf_get_vpe_link_status
++ * @adapter: adapter structure
++ * @vpe: virtchnl_pf_event structure
++ *
++ * Helper function for determining the link status
++ **/
++static bool
++iavf_get_vpe_link_status(struct iavf_adapter *adapter,
++                       struct virtchnl_pf_event *vpe)
++{
++      if (ADV_LINK_SUPPORT(adapter))
++              return vpe->event_data.link_event_adv.link_status;
++      else
++              return vpe->event_data.link_event.link_status;
++}
++
++/**
++ * iavf_set_adapter_link_speed_from_vpe
++ * @adapter: adapter structure for which we are setting the link speed
++ * @vpe: virtchnl_pf_event structure that contains the link speed we are setting
++ *
++ * Helper function for setting iavf_adapter link speed
++ **/
++static void
++iavf_set_adapter_link_speed_from_vpe(struct iavf_adapter *adapter,
++                                   struct virtchnl_pf_event *vpe)
++{
++      if (ADV_LINK_SUPPORT(adapter))
++              adapter->link_speed_mbps =
++                      vpe->event_data.link_event_adv.link_speed;
++      else
++              adapter->link_speed = vpe->event_data.link_event.link_speed;
+ }
+ /**
+@@ -1160,12 +1225,11 @@ void iavf_virtchnl_completion(struct iavf_adapter *adapter,
+       if (v_opcode == VIRTCHNL_OP_EVENT) {
+               struct virtchnl_pf_event *vpe =
+                       (struct virtchnl_pf_event *)msg;
+-              bool link_up = vpe->event_data.link_event.link_status;
++              bool link_up = iavf_get_vpe_link_status(adapter, vpe);
+               switch (vpe->event) {
+               case VIRTCHNL_EVENT_LINK_CHANGE:
+-                      adapter->link_speed =
+-                              vpe->event_data.link_event.link_speed;
++                      iavf_set_adapter_link_speed_from_vpe(adapter, vpe);
+                       /* we've already got the right link status, bail */
+                       if (adapter->link_up == link_up)
+-- 
+2.25.1
+
diff --git a/queue-5.7/ib-cma-fix-ports-memory-leak-in-cma_configfs.patch b/queue-5.7/ib-cma-fix-ports-memory-leak-in-cma_configfs.patch
new file mode 100644 (file)
index 0000000..93a9c3e
--- /dev/null
@@ -0,0 +1,54 @@
+From a937e2ddd22e27261f957023e098f0fd9a66f3c4 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 21 May 2020 10:26:50 +0300
+Subject: IB/cma: Fix ports memory leak in cma_configfs
+
+From: Maor Gottlieb <maorg@mellanox.com>
+
+[ Upstream commit 63a3345c2d42a9b29e1ce2d3a4043689b3995cea ]
+
+The allocated ports structure in never freed. The free function should be
+called by release_cma_ports_group, but the group is never released since
+we don't remove its default group.
+
+Remove default groups when device group is deleted.
+
+Fixes: 045959db65c6 ("IB/cma: Add configfs for rdma_cm")
+Link: https://lore.kernel.org/r/20200521072650.567908-1-leon@kernel.org
+Signed-off-by: Maor Gottlieb <maorg@mellanox.com>
+Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
+Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/infiniband/core/cma_configfs.c | 13 +++++++++++++
+ 1 file changed, 13 insertions(+)
+
+diff --git a/drivers/infiniband/core/cma_configfs.c b/drivers/infiniband/core/cma_configfs.c
+index c672a4978bfde..3c1e2ca564fea 100644
+--- a/drivers/infiniband/core/cma_configfs.c
++++ b/drivers/infiniband/core/cma_configfs.c
+@@ -322,8 +322,21 @@ fail:
+       return ERR_PTR(err);
+ }
++static void drop_cma_dev(struct config_group *cgroup, struct config_item *item)
++{
++      struct config_group *group =
++              container_of(item, struct config_group, cg_item);
++      struct cma_dev_group *cma_dev_group =
++              container_of(group, struct cma_dev_group, device_group);
++
++      configfs_remove_default_groups(&cma_dev_group->ports_group);
++      configfs_remove_default_groups(&cma_dev_group->device_group);
++      config_item_put(item);
++}
++
+ static struct configfs_group_operations cma_subsys_group_ops = {
+       .make_group     = make_cma_dev,
++      .drop_item      = drop_cma_dev,
+ };
+ static const struct config_item_type cma_subsys_type = {
+-- 
+2.25.1
+
diff --git a/queue-5.7/ib-mlx5-fix-devx-support-for-mlx5_cmd_op_init2init_q.patch b/queue-5.7/ib-mlx5-fix-devx-support-for-mlx5_cmd_op_init2init_q.patch
new file mode 100644 (file)
index 0000000..e6f3377
--- /dev/null
@@ -0,0 +1,43 @@
+From 2fca8b30a60ffa5dd6afe527a77442ee0104703a Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 27 May 2020 16:57:03 +0300
+Subject: IB/mlx5: Fix DEVX support for MLX5_CMD_OP_INIT2INIT_QP command
+
+From: Mark Zhang <markz@mellanox.com>
+
+[ Upstream commit d246a3061528be6d852156d25c02ea69d6db7e65 ]
+
+The commit citied in the Fixes line wasn't complete and solved
+only part of the problems. Update the mlx5_ib to properly support
+MLX5_CMD_OP_INIT2INIT_QP command in the DEVX, that is required when
+modify the QP tx_port_affinity.
+
+Fixes: 819f7427bafd ("RDMA/mlx5: Add init2init as a modify command")
+Link: https://lore.kernel.org/r/20200527135703.482501-1-leon@kernel.org
+Signed-off-by: Mark Zhang <markz@mellanox.com>
+Reviewed-by: Maor Gottlieb <maorg@mellanox.com>
+Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
+Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/infiniband/hw/mlx5/devx.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/drivers/infiniband/hw/mlx5/devx.c b/drivers/infiniband/hw/mlx5/devx.c
+index d0742823ab497..ed10e2f32aab0 100644
+--- a/drivers/infiniband/hw/mlx5/devx.c
++++ b/drivers/infiniband/hw/mlx5/devx.c
+@@ -494,6 +494,10 @@ static u64 devx_get_obj_id(const void *in)
+               obj_id = get_enc_obj_id(MLX5_CMD_OP_CREATE_QP,
+                                       MLX5_GET(rst2init_qp_in, in, qpn));
+               break;
++      case MLX5_CMD_OP_INIT2INIT_QP:
++              obj_id = get_enc_obj_id(MLX5_CMD_OP_CREATE_QP,
++                                      MLX5_GET(init2init_qp_in, in, qpn));
++              break;
+       case MLX5_CMD_OP_INIT2RTR_QP:
+               obj_id = get_enc_obj_id(MLX5_CMD_OP_CREATE_QP,
+                                       MLX5_GET(init2rtr_qp_in, in, qpn));
+-- 
+2.25.1
+
diff --git a/queue-5.7/ibmvnic-flush-existing-work-items-before-device-remo.patch b/queue-5.7/ibmvnic-flush-existing-work-items-before-device-remo.patch
new file mode 100644 (file)
index 0000000..4e237e5
--- /dev/null
@@ -0,0 +1,38 @@
+From eee57c58fb70d3939978d19227243e486e8591b8 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 12 Jun 2020 13:34:41 -0500
+Subject: ibmvnic: Flush existing work items before device removal
+
+From: Thomas Falcon <tlfalcon@linux.ibm.com>
+
+[ Upstream commit 6954a9e4192b86d778fb52b525fd7b62d51b1147 ]
+
+Ensure that all scheduled work items have completed before continuing
+with device removal and after further event scheduling has been
+halted. This patch fixes a bug where a scheduled driver reset event
+is processed following device removal.
+
+Signed-off-by: Thomas Falcon <tlfalcon@linux.ibm.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/ethernet/ibm/ibmvnic.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c
+index 197dc5b2c0905..1b4d04e4474bb 100644
+--- a/drivers/net/ethernet/ibm/ibmvnic.c
++++ b/drivers/net/ethernet/ibm/ibmvnic.c
+@@ -5184,6 +5184,9 @@ static int ibmvnic_remove(struct vio_dev *dev)
+       adapter->state = VNIC_REMOVING;
+       spin_unlock_irqrestore(&adapter->state_lock, flags);
++      flush_work(&adapter->ibmvnic_reset);
++      flush_delayed_work(&adapter->ibmvnic_delayed_reset);
++
+       rtnl_lock();
+       unregister_netdevice(netdev);
+-- 
+2.25.1
+
diff --git a/queue-5.7/iio-bmp280-fix-compensation-of-humidity.patch b/queue-5.7/iio-bmp280-fix-compensation-of-humidity.patch
new file mode 100644 (file)
index 0000000..ec96afb
--- /dev/null
@@ -0,0 +1,50 @@
+From 7efa4d755445f6f008851483f7f6940c75e34b70 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 4 May 2020 20:10:34 +0200
+Subject: iio: bmp280: fix compensation of humidity
+
+From: Andreas Klinger <ak@it-klinger.de>
+
+[ Upstream commit dee2dabc0e4115b80945fe2c91603e634f4b4686 ]
+
+Limit the output of humidity compensation to the range between 0 and 100
+percent.
+
+Depending on the calibration parameters of the individual sensor it
+happens, that a humidity above 100 percent or below 0 percent is
+calculated, which don't make sense in terms of relative humidity.
+
+Add a clamp to the compensation formula as described in the datasheet of
+the sensor in chapter 4.2.3.
+
+Although this clamp is documented, it was never in the driver of the
+kernel.
+
+It depends on the circumstances (calibration parameters, temperature,
+humidity) if one can see a value above 100 percent without the clamp.
+The writer of this patch was working with this type of sensor without
+noting this error. So it seems to be a rare event when this bug occures.
+
+Signed-off-by: Andreas Klinger <ak@it-klinger.de>
+Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/iio/pressure/bmp280-core.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/drivers/iio/pressure/bmp280-core.c b/drivers/iio/pressure/bmp280-core.c
+index 2540e7c2358c1..973264a088f98 100644
+--- a/drivers/iio/pressure/bmp280-core.c
++++ b/drivers/iio/pressure/bmp280-core.c
+@@ -271,6 +271,8 @@ static u32 bmp280_compensate_humidity(struct bmp280_data *data,
+               + (s32)2097152) * calib->H2 + 8192) >> 14);
+       var -= ((((var >> 15) * (var >> 15)) >> 7) * (s32)calib->H1) >> 4;
++      var = clamp_val(var, 0, 419430400);
++
+       return var >> 12;
+ };
+-- 
+2.25.1
+
diff --git a/queue-5.7/iio-buffer-dmaengine-use-zu-specifier-for-sprintf-al.patch b/queue-5.7/iio-buffer-dmaengine-use-zu-specifier-for-sprintf-al.patch
new file mode 100644 (file)
index 0000000..c9fb331
--- /dev/null
@@ -0,0 +1,40 @@
+From b7803debe9e4e27a608cae80a0dd13670490bcda Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 24 Mar 2020 15:46:31 +0200
+Subject: iio: buffer-dmaengine: use %zu specifier for sprintf(align)
+
+From: Alexandru Ardelean <alexandru.ardelean@analog.com>
+
+[ Upstream commit 6eb3b8acfd079104571c207d4524743b6acc6550 ]
+
+The 'size_t' type behaves differently on 64-bit architectures, and causes
+compiler a warning of the sort "format '%u' expects argument of type
+'unsigned int', but argument 3 has type 'size_t {aka long unsigned int}'".
+
+This change adds the correct specifier for the 'align' field.
+
+Fixes: 4538c18568099 ("iio: buffer-dmaengine: Report buffer length requirements")
+Reported-by: kbuild test robot <lkp@intel.com>
+Signed-off-by: Alexandru Ardelean <alexandru.ardelean@analog.com>
+Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/iio/buffer/industrialio-buffer-dmaengine.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/iio/buffer/industrialio-buffer-dmaengine.c b/drivers/iio/buffer/industrialio-buffer-dmaengine.c
+index b129693af0fd1..94da3b1ca3a28 100644
+--- a/drivers/iio/buffer/industrialio-buffer-dmaengine.c
++++ b/drivers/iio/buffer/industrialio-buffer-dmaengine.c
+@@ -134,7 +134,7 @@ static ssize_t iio_dmaengine_buffer_get_length_align(struct device *dev,
+       struct dmaengine_buffer *dmaengine_buffer =
+               iio_buffer_to_dmaengine_buffer(indio_dev->buffer);
+-      return sprintf(buf, "%u\n", dmaengine_buffer->align);
++      return sprintf(buf, "%zu\n", dmaengine_buffer->align);
+ }
+ static IIO_DEVICE_ATTR(length_align_bytes, 0444,
+-- 
+2.25.1
+
diff --git a/queue-5.7/iio-light-gp2ap002-take-runtime-pm-reference-on-ligh.patch b/queue-5.7/iio-light-gp2ap002-take-runtime-pm-reference-on-ligh.patch
new file mode 100644 (file)
index 0000000..14bc64a
--- /dev/null
@@ -0,0 +1,76 @@
+From 06c125265448727381c9152c46ac3f6f2de67a79 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 10 May 2020 08:58:18 -0700
+Subject: iio: light: gp2ap002: Take runtime PM reference on light read
+
+From: Jonathan Bakker <xc-racer2@live.ca>
+
+[ Upstream commit f6dbf83c17cb223ceabd7c42d441414f3e0e8a86 ]
+
+The light sensor needs the regulators to be enabled which means
+the runtime PM needs to be on.  This only happened when the
+proximity part of the chip was enabled.
+
+As fallout from this change, only report changes to the prox
+state in the interrupt handler when it is explicitly enabled.
+
+Fixes: 97d642e23037 ("iio: light: Add a driver for Sharp GP2AP002x00F")
+Signed-off-by: Jonathan Bakker <xc-racer2@live.ca>
+Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
+Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/iio/light/gp2ap002.c | 19 ++++++++++++++++---
+ 1 file changed, 16 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/iio/light/gp2ap002.c b/drivers/iio/light/gp2ap002.c
+index b7ef16b28280d..7a2679bdc987a 100644
+--- a/drivers/iio/light/gp2ap002.c
++++ b/drivers/iio/light/gp2ap002.c
+@@ -158,6 +158,9 @@ static irqreturn_t gp2ap002_prox_irq(int irq, void *d)
+       int val;
+       int ret;
++      if (!gp2ap002->enabled)
++              goto err_retrig;
++
+       ret = regmap_read(gp2ap002->map, GP2AP002_PROX, &val);
+       if (ret) {
+               dev_err(gp2ap002->dev, "error reading proximity\n");
+@@ -247,6 +250,8 @@ static int gp2ap002_read_raw(struct iio_dev *indio_dev,
+       struct gp2ap002 *gp2ap002 = iio_priv(indio_dev);
+       int ret;
++      pm_runtime_get_sync(gp2ap002->dev);
++
+       switch (mask) {
+       case IIO_CHAN_INFO_RAW:
+               switch (chan->type) {
+@@ -255,13 +260,21 @@ static int gp2ap002_read_raw(struct iio_dev *indio_dev,
+                       if (ret < 0)
+                               return ret;
+                       *val = ret;
+-                      return IIO_VAL_INT;
++                      ret = IIO_VAL_INT;
++                      goto out;
+               default:
+-                      return -EINVAL;
++                      ret = -EINVAL;
++                      goto out;
+               }
+       default:
+-              return -EINVAL;
++              ret = -EINVAL;
+       }
++
++out:
++      pm_runtime_mark_last_busy(gp2ap002->dev);
++      pm_runtime_put_autosuspend(gp2ap002->dev);
++
++      return ret;
+ }
+ static int gp2ap002_init(struct gp2ap002 *gp2ap002)
+-- 
+2.25.1
+
diff --git a/queue-5.7/iio-pressure-bmp280-tolerate-irq-before-registering.patch b/queue-5.7/iio-pressure-bmp280-tolerate-irq-before-registering.patch
new file mode 100644 (file)
index 0000000..7918c14
--- /dev/null
@@ -0,0 +1,58 @@
+From 2b3891bc617b26bbec3f99fa289703bc99cfb363 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 23 Mar 2020 12:41:25 +0200
+Subject: iio: pressure: bmp280: Tolerate IRQ before registering
+
+From: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
+
+[ Upstream commit 97b31a6f5fb95b1ec6575b78a7240baddba34384 ]
+
+With DEBUG_SHIRQ enabled we have a kernel crash
+
+[  116.482696] BUG: kernel NULL pointer dereference, address: 0000000000000000
+
+...
+
+[  116.606571] Call Trace:
+[  116.609023]  <IRQ>
+[  116.611047]  complete+0x34/0x50
+[  116.614206]  bmp085_eoc_irq+0x9/0x10 [bmp280]
+
+because DEBUG_SHIRQ mechanism fires an IRQ before registration and drivers
+ought to be able to handle an interrupt happening before request_irq() returns.
+
+Fixes: aae953949651 ("iio: pressure: bmp280: add support for BMP085 EOC interrupt")
+Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
+Acked-by: Linus Walleij <linus.walleij@linaro.org>
+Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/iio/pressure/bmp280-core.c | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/iio/pressure/bmp280-core.c b/drivers/iio/pressure/bmp280-core.c
+index 29c209cc1108e..2540e7c2358c1 100644
+--- a/drivers/iio/pressure/bmp280-core.c
++++ b/drivers/iio/pressure/bmp280-core.c
+@@ -713,7 +713,7 @@ static int bmp180_measure(struct bmp280_data *data, u8 ctrl_meas)
+       unsigned int ctrl;
+       if (data->use_eoc)
+-              init_completion(&data->done);
++              reinit_completion(&data->done);
+       ret = regmap_write(data->regmap, BMP280_REG_CTRL_MEAS, ctrl_meas);
+       if (ret)
+@@ -969,6 +969,9 @@ static int bmp085_fetch_eoc_irq(struct device *dev,
+                       "trying to enforce it\n");
+               irq_trig = IRQF_TRIGGER_RISING;
+       }
++
++      init_completion(&data->done);
++
+       ret = devm_request_threaded_irq(dev,
+                       irq,
+                       bmp085_eoc_irq,
+-- 
+2.25.1
+
diff --git a/queue-5.7/include-linux-bitops.h-avoid-clang-shift-count-overf.patch b/queue-5.7/include-linux-bitops.h-avoid-clang-shift-count-overf.patch
new file mode 100644 (file)
index 0000000..d04e7d2
--- /dev/null
@@ -0,0 +1,65 @@
+From ef2764a1ab2645a667bf52b7823456b0dd5558bf Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 4 Jun 2020 16:50:30 -0700
+Subject: include/linux/bitops.h: avoid clang shift-count-overflow warnings
+
+From: Arnd Bergmann <arnd@arndb.de>
+
+[ Upstream commit bd93f003b7462ae39a43c531abca37fe7073b866 ]
+
+Clang normally does not warn about certain issues in inline functions when
+it only happens in an eliminated code path. However if something else
+goes wrong, it does tend to complain about the definition of hweight_long()
+on 32-bit targets:
+
+  include/linux/bitops.h:75:41: error: shift count >= width of type [-Werror,-Wshift-count-overflow]
+          return sizeof(w) == 4 ? hweight32(w) : hweight64(w);
+                                                 ^~~~~~~~~~~~
+  include/asm-generic/bitops/const_hweight.h:29:49: note: expanded from macro 'hweight64'
+   define hweight64(w) (__builtin_constant_p(w) ? __const_hweight64(w) : __arch_hweight64(w))
+                                                  ^~~~~~~~~~~~~~~~~~~~
+  include/asm-generic/bitops/const_hweight.h:21:76: note: expanded from macro '__const_hweight64'
+   define __const_hweight64(w) (__const_hweight32(w) + __const_hweight32((w) >> 32))
+                                                                             ^  ~~
+  include/asm-generic/bitops/const_hweight.h:20:49: note: expanded from macro '__const_hweight32'
+   define __const_hweight32(w) (__const_hweight16(w) + __const_hweight16((w) >> 16))
+                                                  ^
+  include/asm-generic/bitops/const_hweight.h:19:72: note: expanded from macro '__const_hweight16'
+   define __const_hweight16(w) (__const_hweight8(w)  + __const_hweight8((w)  >> 8 ))
+                                                                         ^
+  include/asm-generic/bitops/const_hweight.h:12:9: note: expanded from macro '__const_hweight8'
+            (!!((w) & (1ULL << 2))) +     \
+
+Adding an explicit cast to __u64 avoids that warning and makes it easier
+to read other output.
+
+Signed-off-by: Arnd Bergmann <arnd@arndb.de>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Acked-by: Christian Brauner <christian.brauner@ubuntu.com>
+Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
+Cc: Rasmus Villemoes <linux@rasmusvillemoes.dk>
+Cc: Josh Poimboeuf <jpoimboe@redhat.com>
+Cc: Nick Desaulniers <ndesaulniers@google.com>
+Link: http://lkml.kernel.org/r/20200505135513.65265-1-arnd@arndb.de
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ include/linux/bitops.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/include/linux/bitops.h b/include/linux/bitops.h
+index 9acf654f0b191..99f2ac30b1d9b 100644
+--- a/include/linux/bitops.h
++++ b/include/linux/bitops.h
+@@ -72,7 +72,7 @@ static inline int get_bitmask_order(unsigned int count)
+ static __always_inline unsigned long hweight_long(unsigned long w)
+ {
+-      return sizeof(w) == 4 ? hweight32(w) : hweight64(w);
++      return sizeof(w) == 4 ? hweight32(w) : hweight64((__u64)w);
+ }
+ /**
+-- 
+2.25.1
+
diff --git a/queue-5.7/input-edt-ft5x06-fix-get_default-register-write-acce.patch b/queue-5.7/input-edt-ft5x06-fix-get_default-register-write-acce.patch
new file mode 100644 (file)
index 0000000..7f06c64
--- /dev/null
@@ -0,0 +1,59 @@
+From 7b39deaee8139f3653ce5350a049209b1afdd0f6 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 9 May 2020 14:34:35 -0700
+Subject: Input: edt-ft5x06 - fix get_default register write access
+
+From: Marco Felsch <m.felsch@pengutronix.de>
+
+[ Upstream commit 255cdaf73412de13608fb776101402dca68bed2b ]
+
+Since commit b6eba86030bf ("Input: edt-ft5x06 - add offset support for
+ev-ft5726") offset-x and offset-y is supported. Devices using those
+offset parameters don't support the offset parameter so we need to add
+the NO_REGISTER check for edt_ft5x06_ts_get_defaults().
+
+Fixes: b6eba86030bf ("Input: edt-ft5x06 - add offset support for ev-ft5726")
+Signed-off-by: Marco Felsch <m.felsch@pengutronix.de>
+Link: https://lore.kernel.org/r/20200227112819.16754-2-m.felsch@pengutronix.de
+Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/input/touchscreen/edt-ft5x06.c | 12 +++++++++---
+ 1 file changed, 9 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/input/touchscreen/edt-ft5x06.c b/drivers/input/touchscreen/edt-ft5x06.c
+index d2587724c52ad..9b8450794a8a2 100644
+--- a/drivers/input/touchscreen/edt-ft5x06.c
++++ b/drivers/input/touchscreen/edt-ft5x06.c
+@@ -938,19 +938,25 @@ static void edt_ft5x06_ts_get_defaults(struct device *dev,
+       error = device_property_read_u32(dev, "offset", &val);
+       if (!error) {
+-              edt_ft5x06_register_write(tsdata, reg_addr->reg_offset, val);
++              if (reg_addr->reg_offset != NO_REGISTER)
++                      edt_ft5x06_register_write(tsdata,
++                                                reg_addr->reg_offset, val);
+               tsdata->offset = val;
+       }
+       error = device_property_read_u32(dev, "offset-x", &val);
+       if (!error) {
+-              edt_ft5x06_register_write(tsdata, reg_addr->reg_offset_x, val);
++              if (reg_addr->reg_offset_x != NO_REGISTER)
++                      edt_ft5x06_register_write(tsdata,
++                                                reg_addr->reg_offset_x, val);
+               tsdata->offset_x = val;
+       }
+       error = device_property_read_u32(dev, "offset-y", &val);
+       if (!error) {
+-              edt_ft5x06_register_write(tsdata, reg_addr->reg_offset_y, val);
++              if (reg_addr->reg_offset_y != NO_REGISTER)
++                      edt_ft5x06_register_write(tsdata,
++                                                reg_addr->reg_offset_y, val);
+               tsdata->offset_y = val;
+       }
+ }
+-- 
+2.25.1
+
diff --git a/queue-5.7/input-i8042-remove-special-powerpc-handling.patch b/queue-5.7/input-i8042-remove-special-powerpc-handling.patch
new file mode 100644 (file)
index 0000000..8ab1ead
--- /dev/null
@@ -0,0 +1,127 @@
+From 4072d376241693bebf8a71434c7db7c210aecbf3 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 18 May 2020 11:10:43 -0700
+Subject: input: i8042 - Remove special PowerPC handling
+
+From: Nathan Chancellor <natechancellor@gmail.com>
+
+[ Upstream commit e4f4ffa8a98c24a4ab482669b1e2b4cfce3f52f4 ]
+
+This causes a build error with CONFIG_WALNUT because kb_cs and kb_data
+were removed in commit 917f0af9e5a9 ("powerpc: Remove arch/ppc and
+include/asm-ppc").
+
+ld.lld: error: undefined symbol: kb_cs
+> referenced by i8042-ppcio.h:28 (drivers/input/serio/i8042-ppcio.h:28)
+> input/serio/i8042.o:(__i8042_command) in archive drivers/built-in.a
+> referenced by i8042-ppcio.h:28 (drivers/input/serio/i8042-ppcio.h:28)
+> input/serio/i8042.o:(__i8042_command) in archive drivers/built-in.a
+> referenced by i8042-ppcio.h:28 (drivers/input/serio/i8042-ppcio.h:28)
+> input/serio/i8042.o:(__i8042_command) in archive drivers/built-in.a
+
+ld.lld: error: undefined symbol: kb_data
+> referenced by i8042.c:309 (drivers/input/serio/i8042.c:309)
+> input/serio/i8042.o:(__i8042_command) in archive drivers/built-in.a
+> referenced by i8042-ppcio.h:33 (drivers/input/serio/i8042-ppcio.h:33)
+> input/serio/i8042.o:(__i8042_command) in archive drivers/built-in.a
+> referenced by i8042.c:319 (drivers/input/serio/i8042.c:319)
+> input/serio/i8042.o:(__i8042_command) in archive drivers/built-in.a
+> referenced 15 more times
+
+Presumably since nobody has noticed this for the last 12 years, there is
+not anyone actually trying to use this driver so we can just remove this
+special walnut code and use the generic header so it builds for all
+configurations.
+
+Fixes: 917f0af9e5a9 ("powerpc: Remove arch/ppc and include/asm-ppc")
+Reported-by: kbuild test robot <lkp@intel.com>
+Signed-off-by: Nathan Chancellor <natechancellor@gmail.com>
+Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
+Acked-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
+Link: https://lore.kernel.org/r/20200518181043.3363953-1-natechancellor@gmail.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/input/serio/i8042-ppcio.h | 57 -------------------------------
+ drivers/input/serio/i8042.h       |  2 --
+ 2 files changed, 59 deletions(-)
+ delete mode 100644 drivers/input/serio/i8042-ppcio.h
+
+diff --git a/drivers/input/serio/i8042-ppcio.h b/drivers/input/serio/i8042-ppcio.h
+deleted file mode 100644
+index 391f94d9e47da..0000000000000
+--- a/drivers/input/serio/i8042-ppcio.h
++++ /dev/null
+@@ -1,57 +0,0 @@
+-/* SPDX-License-Identifier: GPL-2.0-only */
+-#ifndef _I8042_PPCIO_H
+-#define _I8042_PPCIO_H
+-
+-
+-#if defined(CONFIG_WALNUT)
+-
+-#define I8042_KBD_IRQ 25
+-#define I8042_AUX_IRQ 26
+-
+-#define I8042_KBD_PHYS_DESC "walnutps2/serio0"
+-#define I8042_AUX_PHYS_DESC "walnutps2/serio1"
+-#define I8042_MUX_PHYS_DESC "walnutps2/serio%d"
+-
+-extern void *kb_cs;
+-extern void *kb_data;
+-
+-#define I8042_COMMAND_REG (*(int *)kb_cs)
+-#define I8042_DATA_REG (*(int *)kb_data)
+-
+-static inline int i8042_read_data(void)
+-{
+-      return readb(kb_data);
+-}
+-
+-static inline int i8042_read_status(void)
+-{
+-      return readb(kb_cs);
+-}
+-
+-static inline void i8042_write_data(int val)
+-{
+-      writeb(val, kb_data);
+-}
+-
+-static inline void i8042_write_command(int val)
+-{
+-      writeb(val, kb_cs);
+-}
+-
+-static inline int i8042_platform_init(void)
+-{
+-      i8042_reset = I8042_RESET_ALWAYS;
+-      return 0;
+-}
+-
+-static inline void i8042_platform_exit(void)
+-{
+-}
+-
+-#else
+-
+-#include "i8042-io.h"
+-
+-#endif
+-
+-#endif /* _I8042_PPCIO_H */
+diff --git a/drivers/input/serio/i8042.h b/drivers/input/serio/i8042.h
+index 38dc27ad3c18f..eb376700dfffd 100644
+--- a/drivers/input/serio/i8042.h
++++ b/drivers/input/serio/i8042.h
+@@ -17,8 +17,6 @@
+ #include "i8042-ip22io.h"
+ #elif defined(CONFIG_SNI_RM)
+ #include "i8042-snirm.h"
+-#elif defined(CONFIG_PPC)
+-#include "i8042-ppcio.h"
+ #elif defined(CONFIG_SPARC)
+ #include "i8042-sparcio.h"
+ #elif defined(CONFIG_X86) || defined(CONFIG_IA64)
+-- 
+2.25.1
+
diff --git a/queue-5.7/input-mms114-add-extra-compatible-for-mms345l.patch b/queue-5.7/input-mms114-add-extra-compatible-for-mms345l.patch
new file mode 100644 (file)
index 0000000..0407113
--- /dev/null
@@ -0,0 +1,88 @@
+From 6c05b9365d4cdfb40818024b1fdfdc5a7a3b5909 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 25 Apr 2020 13:06:31 -0700
+Subject: Input: mms114 - add extra compatible for mms345l
+
+From: Stephan Gerhold <stephan@gerhold.net>
+
+[ Upstream commit 7842087b0196d674ed877d768de8f2a34d7fdc53 ]
+
+MMS345L is another first generation touch screen from Melfas,
+which uses mostly the same registers as MMS152.
+
+However, there is some garbage printed during initialization.
+Apparently MMS345L does not have the MMS152_COMPAT_GROUP register
+that is read+printed during initialization.
+
+  TSP FW Rev: bootloader 0x6 / core 0x26 / config 0x26, Compat group: \x06
+
+On earlier kernel versions the compat group was actually printed as
+an ASCII control character, seems like it gets escaped now.
+
+But we probably shouldn't print something from a random register.
+
+Add a separate "melfas,mms345l" compatible that avoids reading
+from the MMS152_COMPAT_GROUP register. This might also help in case
+there is some other device-specific quirk in the future.
+
+Signed-off-by: Stephan Gerhold <stephan@gerhold.net>
+Reviewed-by: Andi Shyti <andi@etezian.org>
+Link: https://lore.kernel.org/r/20200423102431.2715-1-stephan@gerhold.net
+Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/input/touchscreen/mms114.c | 17 +++++++++++++++--
+ 1 file changed, 15 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/input/touchscreen/mms114.c b/drivers/input/touchscreen/mms114.c
+index 2ef1adaed9afb..5bdf4ac1a3033 100644
+--- a/drivers/input/touchscreen/mms114.c
++++ b/drivers/input/touchscreen/mms114.c
+@@ -54,6 +54,7 @@
+ enum mms_type {
+       TYPE_MMS114     = 114,
+       TYPE_MMS152     = 152,
++      TYPE_MMS345L    = 345,
+ };
+ struct mms114_data {
+@@ -250,6 +251,15 @@ static int mms114_get_version(struct mms114_data *data)
+       int error;
+       switch (data->type) {
++      case TYPE_MMS345L:
++              error = __mms114_read_reg(data, MMS152_FW_REV, 3, buf);
++              if (error)
++                      return error;
++
++              dev_info(dev, "TSP FW Rev: bootloader 0x%x / core 0x%x / config 0x%x\n",
++                       buf[0], buf[1], buf[2]);
++              break;
++
+       case TYPE_MMS152:
+               error = __mms114_read_reg(data, MMS152_FW_REV, 3, buf);
+               if (error)
+@@ -287,8 +297,8 @@ static int mms114_setup_regs(struct mms114_data *data)
+       if (error < 0)
+               return error;
+-      /* MMS152 has no configuration or power on registers */
+-      if (data->type == TYPE_MMS152)
++      /* Only MMS114 has configuration and power on registers */
++      if (data->type != TYPE_MMS114)
+               return 0;
+       error = mms114_set_active(data, true);
+@@ -597,6 +607,9 @@ static const struct of_device_id mms114_dt_match[] = {
+       }, {
+               .compatible = "melfas,mms152",
+               .data = (void *)TYPE_MMS152,
++      }, {
++              .compatible = "melfas,mms345l",
++              .data = (void *)TYPE_MMS345L,
+       },
+       { }
+ };
+-- 
+2.25.1
+
diff --git a/queue-5.7/iommu-arm-smmu-v3-don-t-reserve-implementation-defin.patch b/queue-5.7/iommu-arm-smmu-v3-don-t-reserve-implementation-defin.patch
new file mode 100644 (file)
index 0000000..91b966a
--- /dev/null
@@ -0,0 +1,110 @@
+From 993cad706745c69a63fad9fda7d97ec1bd29d9a7 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 13 May 2020 13:02:57 +0200
+Subject: iommu/arm-smmu-v3: Don't reserve implementation defined register
+ space
+
+From: Jean-Philippe Brucker <jean-philippe@linaro.org>
+
+[ Upstream commit 52f3fab0067d6fa9e99c1b7f63265dd48ca76046 ]
+
+Some SMMUv3 implementation embed the Perf Monitor Group Registers (PMCG)
+inside the first 64kB region of the SMMU. Since PMCG are managed by a
+separate driver, this layout causes resource reservation conflicts
+during boot.
+
+To avoid this conflict, don't reserve the MMIO regions that are
+implementation defined. Although devm_ioremap_resource() still works on
+full pages under the hood, this way we benefit from resource conflict
+checks.
+
+Fixes: 7d839b4b9e00 ("perf/smmuv3: Add arm64 smmuv3 pmu driver")
+Signed-off-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
+Reviewed-by: Robin Murphy <robin.murphy@arm.com>
+Link: https://lore.kernel.org/r/20200513110255.597203-1-jean-philippe@linaro.org
+Signed-off-by: Will Deacon <will@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/iommu/arm-smmu-v3.c | 35 +++++++++++++++++++++++++++++++----
+ 1 file changed, 31 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/iommu/arm-smmu-v3.c b/drivers/iommu/arm-smmu-v3.c
+index 82508730feb7a..af21d24a09e88 100644
+--- a/drivers/iommu/arm-smmu-v3.c
++++ b/drivers/iommu/arm-smmu-v3.c
+@@ -171,6 +171,8 @@
+ #define ARM_SMMU_PRIQ_IRQ_CFG1                0xd8
+ #define ARM_SMMU_PRIQ_IRQ_CFG2                0xdc
++#define ARM_SMMU_REG_SZ                       0xe00
++
+ /* Common MSI config fields */
+ #define MSI_CFG0_ADDR_MASK            GENMASK_ULL(51, 2)
+ #define MSI_CFG2_SH                   GENMASK(5, 4)
+@@ -628,6 +630,7 @@ struct arm_smmu_strtab_cfg {
+ struct arm_smmu_device {
+       struct device                   *dev;
+       void __iomem                    *base;
++      void __iomem                    *page1;
+ #define ARM_SMMU_FEAT_2_LVL_STRTAB    (1 << 0)
+ #define ARM_SMMU_FEAT_2_LVL_CDTAB     (1 << 1)
+@@ -733,9 +736,8 @@ static struct arm_smmu_option_prop arm_smmu_options[] = {
+ static inline void __iomem *arm_smmu_page1_fixup(unsigned long offset,
+                                                struct arm_smmu_device *smmu)
+ {
+-      if ((offset > SZ_64K) &&
+-          (smmu->options & ARM_SMMU_OPT_PAGE0_REGS_ONLY))
+-              offset -= SZ_64K;
++      if (offset > SZ_64K)
++              return smmu->page1 + offset - SZ_64K;
+       return smmu->base + offset;
+ }
+@@ -4021,6 +4023,18 @@ err_reset_pci_ops: __maybe_unused;
+       return err;
+ }
++static void __iomem *arm_smmu_ioremap(struct device *dev, resource_size_t start,
++                                    resource_size_t size)
++{
++      struct resource res = {
++              .flags = IORESOURCE_MEM,
++              .start = start,
++              .end = start + size - 1,
++      };
++
++      return devm_ioremap_resource(dev, &res);
++}
++
+ static int arm_smmu_device_probe(struct platform_device *pdev)
+ {
+       int irq, ret;
+@@ -4056,10 +4070,23 @@ static int arm_smmu_device_probe(struct platform_device *pdev)
+       }
+       ioaddr = res->start;
+-      smmu->base = devm_ioremap_resource(dev, res);
++      /*
++       * Don't map the IMPLEMENTATION DEFINED regions, since they may contain
++       * the PMCG registers which are reserved by the PMU driver.
++       */
++      smmu->base = arm_smmu_ioremap(dev, ioaddr, ARM_SMMU_REG_SZ);
+       if (IS_ERR(smmu->base))
+               return PTR_ERR(smmu->base);
++      if (arm_smmu_resource_size(smmu) > SZ_64K) {
++              smmu->page1 = arm_smmu_ioremap(dev, ioaddr + SZ_64K,
++                                             ARM_SMMU_REG_SZ);
++              if (IS_ERR(smmu->page1))
++                      return PTR_ERR(smmu->page1);
++      } else {
++              smmu->page1 = smmu->base;
++      }
++
+       /* Interrupt lines */
+       irq = platform_get_irq_byname_optional(pdev, "combined");
+-- 
+2.25.1
+
diff --git a/queue-5.7/ipmi-use-vzalloc-instead-of-kmalloc-for-user-creatio.patch b/queue-5.7/ipmi-use-vzalloc-instead-of-kmalloc-for-user-creatio.patch
new file mode 100644 (file)
index 0000000..5248e72
--- /dev/null
@@ -0,0 +1,87 @@
+From c828a923d82c1f75cd5f866a8bbd86eb2d9c8d16 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 17 Apr 2020 12:48:28 +0800
+Subject: ipmi: use vzalloc instead of kmalloc for user creation
+
+From: Feng Tang <feng.tang@intel.com>
+
+[ Upstream commit 7c47a219b95d0e06b5ef5fcc7bad807895015eac ]
+
+We met mulitple times of failure of staring bmc-watchdog,
+due to the runtime memory allocation failure of order 4.
+
+     bmc-watchdog: page allocation failure: order:4, mode:0x40cc0(GFP_KERNEL|__GFP_COMP), nodemask=(null),cpuset=/,mems_allowed=0-1
+     CPU: 1 PID: 2571 Comm: bmc-watchdog Not tainted 5.5.0-00045-g7d6bb61d6188c #1
+     Hardware name: Intel Corporation S2600WFT/S2600WFT, BIOS SE5C620.86B.00.01.0015.110720180833 11/07/2018
+     Call Trace:
+      dump_stack+0x66/0x8b
+      warn_alloc+0xfe/0x160
+      __alloc_pages_slowpath+0xd3e/0xd80
+      __alloc_pages_nodemask+0x2f0/0x340
+      kmalloc_order+0x18/0x70
+      kmalloc_order_trace+0x1d/0xb0
+      ipmi_create_user+0x55/0x2c0 [ipmi_msghandler]
+      ipmi_open+0x72/0x110 [ipmi_devintf]
+      chrdev_open+0xcb/0x1e0
+      do_dentry_open+0x1ce/0x380
+      path_openat+0x305/0x14f0
+      do_filp_open+0x9b/0x110
+      do_sys_open+0x1bd/0x250
+      do_syscall_64+0x5b/0x1f0
+      entry_SYSCALL_64_after_hwframe+0x44/0xa9
+
+Using vzalloc/vfree for creating ipmi_user heals the
+problem
+
+Thanks to Stephen Rothwell for finding the vmalloc.h
+inclusion issue.
+
+Signed-off-by: Feng Tang <feng.tang@intel.com>
+Signed-off-by: Corey Minyard <cminyard@mvista.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/char/ipmi/ipmi_msghandler.c | 7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/char/ipmi/ipmi_msghandler.c b/drivers/char/ipmi/ipmi_msghandler.c
+index c48d8f086382e..9afd220cd824e 100644
+--- a/drivers/char/ipmi/ipmi_msghandler.c
++++ b/drivers/char/ipmi/ipmi_msghandler.c
+@@ -33,6 +33,7 @@
+ #include <linux/workqueue.h>
+ #include <linux/uuid.h>
+ #include <linux/nospec.h>
++#include <linux/vmalloc.h>
+ #define IPMI_DRIVER_VERSION "39.2"
+@@ -1153,7 +1154,7 @@ static void free_user_work(struct work_struct *work)
+                                             remove_work);
+       cleanup_srcu_struct(&user->release_barrier);
+-      kfree(user);
++      vfree(user);
+ }
+ int ipmi_create_user(unsigned int          if_num,
+@@ -1185,7 +1186,7 @@ int ipmi_create_user(unsigned int          if_num,
+       if (rv)
+               return rv;
+-      new_user = kmalloc(sizeof(*new_user), GFP_KERNEL);
++      new_user = vzalloc(sizeof(*new_user));
+       if (!new_user)
+               return -ENOMEM;
+@@ -1232,7 +1233,7 @@ int ipmi_create_user(unsigned int          if_num,
+ out_kfree:
+       srcu_read_unlock(&ipmi_interfaces_srcu, index);
+-      kfree(new_user);
++      vfree(new_user);
+       return rv;
+ }
+ EXPORT_SYMBOL(ipmi_create_user);
+-- 
+2.25.1
+
diff --git a/queue-5.7/kvm-ppc-book3s-fix-some-rcu-list-locks.patch b/queue-5.7/kvm-ppc-book3s-fix-some-rcu-list-locks.patch
new file mode 100644 (file)
index 0000000..be7bb66
--- /dev/null
@@ -0,0 +1,165 @@
+From e046914ba06e05340f4935a07fd470c2584f34cd Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 10 May 2020 01:18:34 -0400
+Subject: KVM: PPC: Book3S: Fix some RCU-list locks
+
+From: Qian Cai <cai@lca.pw>
+
+[ Upstream commit ab8b65be183180c3eef405d449163964ecc4b571 ]
+
+It is unsafe to traverse kvm->arch.spapr_tce_tables and
+stt->iommu_tables without the RCU read lock held. Also, add
+cond_resched_rcu() in places with the RCU read lock held that could take
+a while to finish.
+
+ arch/powerpc/kvm/book3s_64_vio.c:76 RCU-list traversed in non-reader section!!
+
+ other info that might help us debug this:
+
+ rcu_scheduler_active = 2, debug_locks = 1
+ no locks held by qemu-kvm/4265.
+
+ stack backtrace:
+ CPU: 96 PID: 4265 Comm: qemu-kvm Not tainted 5.7.0-rc4-next-20200508+ #2
+ Call Trace:
+ [c000201a8690f720] [c000000000715948] dump_stack+0xfc/0x174 (unreliable)
+ [c000201a8690f770] [c0000000001d9470] lockdep_rcu_suspicious+0x140/0x164
+ [c000201a8690f7f0] [c008000010b9fb48] kvm_spapr_tce_release_iommu_group+0x1f0/0x220 [kvm]
+ [c000201a8690f870] [c008000010b8462c] kvm_spapr_tce_release_vfio_group+0x54/0xb0 [kvm]
+ [c000201a8690f8a0] [c008000010b84710] kvm_vfio_destroy+0x88/0x140 [kvm]
+ [c000201a8690f8f0] [c008000010b7d488] kvm_put_kvm+0x370/0x600 [kvm]
+ [c000201a8690f990] [c008000010b7e3c0] kvm_vm_release+0x38/0x60 [kvm]
+ [c000201a8690f9c0] [c0000000005223f4] __fput+0x124/0x330
+ [c000201a8690fa20] [c000000000151cd8] task_work_run+0xb8/0x130
+ [c000201a8690fa70] [c0000000001197e8] do_exit+0x4e8/0xfa0
+ [c000201a8690fb70] [c00000000011a374] do_group_exit+0x64/0xd0
+ [c000201a8690fbb0] [c000000000132c90] get_signal+0x1f0/0x1200
+ [c000201a8690fcc0] [c000000000020690] do_notify_resume+0x130/0x3c0
+ [c000201a8690fda0] [c000000000038d64] syscall_exit_prepare+0x1a4/0x280
+ [c000201a8690fe20] [c00000000000c8f8] system_call_common+0xf8/0x278
+
+ ====
+ arch/powerpc/kvm/book3s_64_vio.c:368 RCU-list traversed in non-reader section!!
+
+ other info that might help us debug this:
+
+ rcu_scheduler_active = 2, debug_locks = 1
+ 2 locks held by qemu-kvm/4264:
+  #0: c000201ae2d000d8 (&vcpu->mutex){+.+.}-{3:3}, at: kvm_vcpu_ioctl+0xdc/0x950 [kvm]
+  #1: c000200c9ed0c468 (&kvm->srcu){....}-{0:0}, at: kvmppc_h_put_tce+0x88/0x340 [kvm]
+
+ ====
+ arch/powerpc/kvm/book3s_64_vio.c:108 RCU-list traversed in non-reader section!!
+
+ other info that might help us debug this:
+
+ rcu_scheduler_active = 2, debug_locks = 1
+ 1 lock held by qemu-kvm/4257:
+  #0: c000200b1b363a40 (&kv->lock){+.+.}-{3:3}, at: kvm_vfio_set_attr+0x598/0x6c0 [kvm]
+
+ ====
+ arch/powerpc/kvm/book3s_64_vio.c:146 RCU-list traversed in non-reader section!!
+
+ other info that might help us debug this:
+
+ rcu_scheduler_active = 2, debug_locks = 1
+ 1 lock held by qemu-kvm/4257:
+  #0: c000200b1b363a40 (&kv->lock){+.+.}-{3:3}, at: kvm_vfio_set_attr+0x598/0x6c0 [kvm]
+
+Signed-off-by: Qian Cai <cai@lca.pw>
+Signed-off-by: Paul Mackerras <paulus@ozlabs.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/powerpc/kvm/book3s_64_vio.c | 18 ++++++++++++++----
+ 1 file changed, 14 insertions(+), 4 deletions(-)
+
+diff --git a/arch/powerpc/kvm/book3s_64_vio.c b/arch/powerpc/kvm/book3s_64_vio.c
+index 50555ad1db932..1a529df0ab442 100644
+--- a/arch/powerpc/kvm/book3s_64_vio.c
++++ b/arch/powerpc/kvm/book3s_64_vio.c
+@@ -73,6 +73,7 @@ extern void kvm_spapr_tce_release_iommu_group(struct kvm *kvm,
+       struct kvmppc_spapr_tce_iommu_table *stit, *tmp;
+       struct iommu_table_group *table_group = NULL;
++      rcu_read_lock();
+       list_for_each_entry_rcu(stt, &kvm->arch.spapr_tce_tables, list) {
+               table_group = iommu_group_get_iommudata(grp);
+@@ -87,7 +88,9 @@ extern void kvm_spapr_tce_release_iommu_group(struct kvm *kvm,
+                               kref_put(&stit->kref, kvm_spapr_tce_liobn_put);
+                       }
+               }
++              cond_resched_rcu();
+       }
++      rcu_read_unlock();
+ }
+ extern long kvm_spapr_tce_attach_iommu_group(struct kvm *kvm, int tablefd,
+@@ -105,12 +108,14 @@ extern long kvm_spapr_tce_attach_iommu_group(struct kvm *kvm, int tablefd,
+       if (!f.file)
+               return -EBADF;
++      rcu_read_lock();
+       list_for_each_entry_rcu(stt, &kvm->arch.spapr_tce_tables, list) {
+               if (stt == f.file->private_data) {
+                       found = true;
+                       break;
+               }
+       }
++      rcu_read_unlock();
+       fdput(f);
+@@ -143,6 +148,7 @@ extern long kvm_spapr_tce_attach_iommu_group(struct kvm *kvm, int tablefd,
+       if (!tbl)
+               return -EINVAL;
++      rcu_read_lock();
+       list_for_each_entry_rcu(stit, &stt->iommu_tables, next) {
+               if (tbl != stit->tbl)
+                       continue;
+@@ -150,14 +156,17 @@ extern long kvm_spapr_tce_attach_iommu_group(struct kvm *kvm, int tablefd,
+               if (!kref_get_unless_zero(&stit->kref)) {
+                       /* stit is being destroyed */
+                       iommu_tce_table_put(tbl);
++                      rcu_read_unlock();
+                       return -ENOTTY;
+               }
+               /*
+                * The table is already known to this KVM, we just increased
+                * its KVM reference counter and can return.
+                */
++              rcu_read_unlock();
+               return 0;
+       }
++      rcu_read_unlock();
+       stit = kzalloc(sizeof(*stit), GFP_KERNEL);
+       if (!stit) {
+@@ -365,18 +374,19 @@ static long kvmppc_tce_validate(struct kvmppc_spapr_tce_table *stt,
+       if (kvmppc_tce_to_ua(stt->kvm, tce, &ua))
+               return H_TOO_HARD;
++      rcu_read_lock();
+       list_for_each_entry_rcu(stit, &stt->iommu_tables, next) {
+               unsigned long hpa = 0;
+               struct mm_iommu_table_group_mem_t *mem;
+               long shift = stit->tbl->it_page_shift;
+               mem = mm_iommu_lookup(stt->kvm->mm, ua, 1ULL << shift);
+-              if (!mem)
+-                      return H_TOO_HARD;
+-
+-              if (mm_iommu_ua_to_hpa(mem, ua, shift, &hpa))
++              if (!mem || mm_iommu_ua_to_hpa(mem, ua, shift, &hpa)) {
++                      rcu_read_unlock();
+                       return H_TOO_HARD;
++              }
+       }
++      rcu_read_unlock();
+       return H_SUCCESS;
+ }
+-- 
+2.25.1
+
diff --git a/queue-5.7/kvm-ppc-book3s-hv-ignore-kmemleak-false-positives.patch b/queue-5.7/kvm-ppc-book3s-hv-ignore-kmemleak-false-positives.patch
new file mode 100644 (file)
index 0000000..e13bcc1
--- /dev/null
@@ -0,0 +1,101 @@
+From 9a93376d2702015027e238e9027ee92a50552ccf Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 13 May 2020 09:39:15 -0400
+Subject: KVM: PPC: Book3S HV: Ignore kmemleak false positives
+
+From: Qian Cai <cai@lca.pw>
+
+[ Upstream commit 0aca8a5575544bd21b3363058afb8f1e81505150 ]
+
+kvmppc_pmd_alloc() and kvmppc_pte_alloc() allocate some memory but then
+pud_populate() and pmd_populate() will use __pa() to reference the newly
+allocated memory.
+
+Since kmemleak is unable to track the physical memory resulting in false
+positives, silence those by using kmemleak_ignore().
+
+unreferenced object 0xc000201c382a1000 (size 4096):
+ comm "qemu-kvm", pid 124828, jiffies 4295733767 (age 341.250s)
+ hex dump (first 32 bytes):
+   c0 00 20 09 f4 60 03 87 c0 00 20 10 72 a0 03 87  .. ..`.... .r...
+   c0 00 20 0e 13 a0 03 87 c0 00 20 1b dc c0 03 87  .. ....... .....
+ backtrace:
+   [<000000004cc2790f>] kvmppc_create_pte+0x838/0xd20 [kvm_hv]
+   kvmppc_pmd_alloc at arch/powerpc/kvm/book3s_64_mmu_radix.c:366
+   (inlined by) kvmppc_create_pte at arch/powerpc/kvm/book3s_64_mmu_radix.c:590
+   [<00000000d123c49a>] kvmppc_book3s_instantiate_page+0x2e0/0x8c0 [kvm_hv]
+   [<00000000bb549087>] kvmppc_book3s_radix_page_fault+0x1b4/0x2b0 [kvm_hv]
+   [<0000000086dddc0e>] kvmppc_book3s_hv_page_fault+0x214/0x12a0 [kvm_hv]
+   [<000000005ae9ccc2>] kvmppc_vcpu_run_hv+0xc5c/0x15f0 [kvm_hv]
+   [<00000000d22162ff>] kvmppc_vcpu_run+0x34/0x48 [kvm]
+   [<00000000d6953bc4>] kvm_arch_vcpu_ioctl_run+0x314/0x420 [kvm]
+   [<000000002543dd54>] kvm_vcpu_ioctl+0x33c/0x950 [kvm]
+   [<0000000048155cd6>] ksys_ioctl+0xd8/0x130
+   [<0000000041ffeaa7>] sys_ioctl+0x28/0x40
+   [<000000004afc4310>] system_call_exception+0x114/0x1e0
+   [<00000000fb70a873>] system_call_common+0xf0/0x278
+unreferenced object 0xc0002001f0c03900 (size 256):
+ comm "qemu-kvm", pid 124830, jiffies 4295735235 (age 326.570s)
+ hex dump (first 32 bytes):
+   c0 00 20 10 fa a0 03 87 c0 00 20 10 fa a1 03 87  .. ....... .....
+   c0 00 20 10 fa a2 03 87 c0 00 20 10 fa a3 03 87  .. ....... .....
+ backtrace:
+   [<0000000023f675b8>] kvmppc_create_pte+0x854/0xd20 [kvm_hv]
+   kvmppc_pte_alloc at arch/powerpc/kvm/book3s_64_mmu_radix.c:356
+   (inlined by) kvmppc_create_pte at arch/powerpc/kvm/book3s_64_mmu_radix.c:593
+   [<00000000d123c49a>] kvmppc_book3s_instantiate_page+0x2e0/0x8c0 [kvm_hv]
+   [<00000000bb549087>] kvmppc_book3s_radix_page_fault+0x1b4/0x2b0 [kvm_hv]
+   [<0000000086dddc0e>] kvmppc_book3s_hv_page_fault+0x214/0x12a0 [kvm_hv]
+   [<000000005ae9ccc2>] kvmppc_vcpu_run_hv+0xc5c/0x15f0 [kvm_hv]
+   [<00000000d22162ff>] kvmppc_vcpu_run+0x34/0x48 [kvm]
+   [<00000000d6953bc4>] kvm_arch_vcpu_ioctl_run+0x314/0x420 [kvm]
+   [<000000002543dd54>] kvm_vcpu_ioctl+0x33c/0x950 [kvm]
+   [<0000000048155cd6>] ksys_ioctl+0xd8/0x130
+   [<0000000041ffeaa7>] sys_ioctl+0x28/0x40
+   [<000000004afc4310>] system_call_exception+0x114/0x1e0
+   [<00000000fb70a873>] system_call_common+0xf0/0x278
+
+Signed-off-by: Qian Cai <cai@lca.pw>
+Signed-off-by: Paul Mackerras <paulus@ozlabs.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/powerpc/kvm/book3s_64_mmu_radix.c | 16 ++++++++++++++--
+ 1 file changed, 14 insertions(+), 2 deletions(-)
+
+diff --git a/arch/powerpc/kvm/book3s_64_mmu_radix.c b/arch/powerpc/kvm/book3s_64_mmu_radix.c
+index aa12cd4078b32..bc6c1aa3d0e92 100644
+--- a/arch/powerpc/kvm/book3s_64_mmu_radix.c
++++ b/arch/powerpc/kvm/book3s_64_mmu_radix.c
+@@ -353,7 +353,13 @@ static struct kmem_cache *kvm_pmd_cache;
+ static pte_t *kvmppc_pte_alloc(void)
+ {
+-      return kmem_cache_alloc(kvm_pte_cache, GFP_KERNEL);
++      pte_t *pte;
++
++      pte = kmem_cache_alloc(kvm_pte_cache, GFP_KERNEL);
++      /* pmd_populate() will only reference _pa(pte). */
++      kmemleak_ignore(pte);
++
++      return pte;
+ }
+ static void kvmppc_pte_free(pte_t *ptep)
+@@ -363,7 +369,13 @@ static void kvmppc_pte_free(pte_t *ptep)
+ static pmd_t *kvmppc_pmd_alloc(void)
+ {
+-      return kmem_cache_alloc(kvm_pmd_cache, GFP_KERNEL);
++      pmd_t *pmd;
++
++      pmd = kmem_cache_alloc(kvm_pmd_cache, GFP_KERNEL);
++      /* pud_populate() will only reference _pa(pmd). */
++      kmemleak_ignore(pmd);
++
++      return pmd;
+ }
+ static void kvmppc_pmd_free(pmd_t *pmdp)
+-- 
+2.25.1
+
diff --git a/queue-5.7/kvm-ppc-book3s-hv-relax-check-on-h_svm_init_abort.patch b/queue-5.7/kvm-ppc-book3s-hv-relax-check-on-h_svm_init_abort.patch
new file mode 100644 (file)
index 0000000..80a686f
--- /dev/null
@@ -0,0 +1,57 @@
+From 59981354d406b408d4ebdf8c4523a7f3ea6ca84a Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 20 May 2020 19:43:08 +0200
+Subject: KVM: PPC: Book3S HV: Relax check on H_SVM_INIT_ABORT
+
+From: Laurent Dufour <ldufour@linux.ibm.com>
+
+[ Upstream commit e3326ae3d59e443a379367c6936941d6ab55d316 ]
+
+The commit 8c47b6ff29e3 ("KVM: PPC: Book3S HV: Check caller of H_SVM_*
+Hcalls") added checks of secure bit of SRR1 to filter out the Hcall
+reserved to the Ultravisor.
+
+However, the Hcall H_SVM_INIT_ABORT is made by the Ultravisor passing the
+context of the VM calling UV_ESM. This allows the Hypervisor to return to
+the guest without going through the Ultravisor. Thus the Secure bit of SRR1
+is not set in that particular case.
+
+In the case a regular VM is calling H_SVM_INIT_ABORT, this hcall will be
+filtered out in kvmppc_h_svm_init_abort() because kvm->arch.secure_guest is
+not set in that case.
+
+Fixes: 8c47b6ff29e3 ("KVM: PPC: Book3S HV: Check caller of H_SVM_* Hcalls")
+Signed-off-by: Laurent Dufour <ldufour@linux.ibm.com>
+Reviewed-by: Greg Kurz <groug@kaod.org>
+Reviewed-by: Ram Pai <linuxram@us.ibm.com>
+Signed-off-by: Paul Mackerras <paulus@ozlabs.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/powerpc/kvm/book3s_hv.c | 11 ++++++++---
+ 1 file changed, 8 insertions(+), 3 deletions(-)
+
+diff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c
+index 93493f0cbfe8e..ee581cde48788 100644
+--- a/arch/powerpc/kvm/book3s_hv.c
++++ b/arch/powerpc/kvm/book3s_hv.c
+@@ -1099,9 +1099,14 @@ int kvmppc_pseries_do_hcall(struct kvm_vcpu *vcpu)
+                       ret = kvmppc_h_svm_init_done(vcpu->kvm);
+               break;
+       case H_SVM_INIT_ABORT:
+-              ret = H_UNSUPPORTED;
+-              if (kvmppc_get_srr1(vcpu) & MSR_S)
+-                      ret = kvmppc_h_svm_init_abort(vcpu->kvm);
++              /*
++               * Even if that call is made by the Ultravisor, the SSR1 value
++               * is the guest context one, with the secure bit clear as it has
++               * not yet been secured. So we can't check it here.
++               * Instead the kvm->arch.secure_guest flag is checked inside
++               * kvmppc_h_svm_init_abort().
++               */
++              ret = kvmppc_h_svm_init_abort(vcpu->kvm);
+               break;
+       default:
+-- 
+2.25.1
+
diff --git a/queue-5.7/kvm-selftests-fix-build-with-make-arch-x86_64.patch b/queue-5.7/kvm-selftests-fix-build-with-make-arch-x86_64.patch
new file mode 100644 (file)
index 0000000..11bde8f
--- /dev/null
@@ -0,0 +1,59 @@
+From ad8f72644b626b14eea36454a1282839cc26e41f Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 5 Jun 2020 16:20:28 +0200
+Subject: KVM: selftests: Fix build with "make ARCH=x86_64"
+
+From: Vitaly Kuznetsov <vkuznets@redhat.com>
+
+[ Upstream commit b80db73dc8be7022adae1b4414a1bebce50fe915 ]
+
+Marcelo reports that kvm selftests fail to build with
+"make ARCH=x86_64":
+
+gcc -Wall -Wstrict-prototypes -Wuninitialized -O2 -g -std=gnu99
+ -fno-stack-protector -fno-PIE -I../../../../tools/include
+ -I../../../../tools/arch/x86_64/include  -I../../../../usr/include/
+ -Iinclude -Ilib -Iinclude/x86_64 -I.. -c lib/kvm_util.c
+ -o /var/tmp/20200604202744-bin/lib/kvm_util.o
+
+In file included from lib/kvm_util.c:11:
+include/x86_64/processor.h:14:10: fatal error: asm/msr-index.h: No such
+ file or directory
+
+ #include <asm/msr-index.h>
+          ^~~~~~~~~~~~~~~~~
+compilation terminated.
+
+"make ARCH=x86", however, works. The problem is that arch specific headers
+for x86_64 live in 'tools/arch/x86/include', not in
+'tools/arch/x86_64/include'.
+
+Fixes: 66d69e081b52 ("selftests: fix kvm relocatable native/cross builds and installs")
+Reported-by: Marcelo Bandeira Condotta <mcondotta@redhat.com>
+Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com>
+Message-Id: <20200605142028.550068-1-vkuznets@redhat.com>
+Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ tools/testing/selftests/kvm/Makefile | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/tools/testing/selftests/kvm/Makefile b/tools/testing/selftests/kvm/Makefile
+index 42f4f49f2a488..2c85b9dd86f58 100644
+--- a/tools/testing/selftests/kvm/Makefile
++++ b/tools/testing/selftests/kvm/Makefile
+@@ -80,7 +80,11 @@ LIBKVM += $(LIBKVM_$(UNAME_M))
+ INSTALL_HDR_PATH = $(top_srcdir)/usr
+ LINUX_HDR_PATH = $(INSTALL_HDR_PATH)/include/
+ LINUX_TOOL_INCLUDE = $(top_srcdir)/tools/include
++ifeq ($(ARCH),x86_64)
++LINUX_TOOL_ARCH_INCLUDE = $(top_srcdir)/tools/arch/x86/include
++else
+ LINUX_TOOL_ARCH_INCLUDE = $(top_srcdir)/tools/arch/$(ARCH)/include
++endif
+ CFLAGS += -Wall -Wstrict-prototypes -Wuninitialized -O2 -g -std=gnu99 \
+       -fno-stack-protector -fno-PIE -I$(LINUX_TOOL_INCLUDE) \
+       -I$(LINUX_TOOL_ARCH_INCLUDE) -I$(LINUX_HDR_PATH) -Iinclude \
+-- 
+2.25.1
+
diff --git a/queue-5.7/lib-zlib-remove-outdated-and-incorrect-pre-increment.patch b/queue-5.7/lib-zlib-remove-outdated-and-incorrect-pre-increment.patch
new file mode 100644 (file)
index 0000000..dfb8f7f
--- /dev/null
@@ -0,0 +1,279 @@
+From d1bc8b5db22161d4b2b93dc41e5e6951924e8868 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 4 Jun 2020 16:50:17 -0700
+Subject: lib/zlib: remove outdated and incorrect pre-increment optimization
+
+From: Jann Horn <jannh@google.com>
+
+[ Upstream commit acaab7335bd6f0c0b54ce3a00bd7f18222ce0f5f ]
+
+The zlib inflate code has an old micro-optimization based on the
+assumption that for pre-increment memory accesses, the compiler will
+generate code that fits better into the processor's pipeline than what
+would be generated for post-increment memory accesses.
+
+This optimization was already removed in upstream zlib in 2016:
+https://github.com/madler/zlib/commit/9aaec95e8211
+
+This optimization causes UB according to C99, which says in section 6.5.6
+"Additive operators": "If both the pointer operand and the result point to
+elements of the same array object, or one past the last element of the
+array object, the evaluation shall not produce an overflow; otherwise, the
+behavior is undefined".
+
+This UB is not only a theoretical concern, but can also cause trouble for
+future work on compiler-based sanitizers.
+
+According to the zlib commit, this optimization also is not optimal
+anymore with modern compilers.
+
+Replace uses of OFF, PUP and UP_UNALIGNED with their definitions in the
+POSTINC case, and remove the macro definitions, just like in the upstream
+patch.
+
+Signed-off-by: Jann Horn <jannh@google.com>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Cc: Mikhail Zaslonko <zaslonko@linux.ibm.com>
+Link: http://lkml.kernel.org/r/20200507123112.252723-1-jannh@google.com
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ lib/zlib_inflate/inffast.c | 91 +++++++++++++++-----------------------
+ 1 file changed, 35 insertions(+), 56 deletions(-)
+
+diff --git a/lib/zlib_inflate/inffast.c b/lib/zlib_inflate/inffast.c
+index 2c13ecc5bb2c7..ed1f3df272602 100644
+--- a/lib/zlib_inflate/inffast.c
++++ b/lib/zlib_inflate/inffast.c
+@@ -10,17 +10,6 @@
+ #ifndef ASMINF
+-/* Allow machine dependent optimization for post-increment or pre-increment.
+-   Based on testing to date,
+-   Pre-increment preferred for:
+-   - PowerPC G3 (Adler)
+-   - MIPS R5000 (Randers-Pehrson)
+-   Post-increment preferred for:
+-   - none
+-   No measurable difference:
+-   - Pentium III (Anderson)
+-   - M68060 (Nikl)
+- */
+ union uu {
+       unsigned short us;
+       unsigned char b[2];
+@@ -38,16 +27,6 @@ get_unaligned16(const unsigned short *p)
+       return mm.us;
+ }
+-#ifdef POSTINC
+-#  define OFF 0
+-#  define PUP(a) *(a)++
+-#  define UP_UNALIGNED(a) get_unaligned16((a)++)
+-#else
+-#  define OFF 1
+-#  define PUP(a) *++(a)
+-#  define UP_UNALIGNED(a) get_unaligned16(++(a))
+-#endif
+-
+ /*
+    Decode literal, length, and distance codes and write out the resulting
+    literal and match bytes until either not enough input or output is
+@@ -115,9 +94,9 @@ void inflate_fast(z_streamp strm, unsigned start)
+     /* copy state to local variables */
+     state = (struct inflate_state *)strm->state;
+-    in = strm->next_in - OFF;
++    in = strm->next_in;
+     last = in + (strm->avail_in - 5);
+-    out = strm->next_out - OFF;
++    out = strm->next_out;
+     beg = out - (start - strm->avail_out);
+     end = out + (strm->avail_out - 257);
+ #ifdef INFLATE_STRICT
+@@ -138,9 +117,9 @@ void inflate_fast(z_streamp strm, unsigned start)
+        input data or output space */
+     do {
+         if (bits < 15) {
+-            hold += (unsigned long)(PUP(in)) << bits;
++            hold += (unsigned long)(*in++) << bits;
+             bits += 8;
+-            hold += (unsigned long)(PUP(in)) << bits;
++            hold += (unsigned long)(*in++) << bits;
+             bits += 8;
+         }
+         this = lcode[hold & lmask];
+@@ -150,14 +129,14 @@ void inflate_fast(z_streamp strm, unsigned start)
+         bits -= op;
+         op = (unsigned)(this.op);
+         if (op == 0) {                          /* literal */
+-            PUP(out) = (unsigned char)(this.val);
++            *out++ = (unsigned char)(this.val);
+         }
+         else if (op & 16) {                     /* length base */
+             len = (unsigned)(this.val);
+             op &= 15;                           /* number of extra bits */
+             if (op) {
+                 if (bits < op) {
+-                    hold += (unsigned long)(PUP(in)) << bits;
++                    hold += (unsigned long)(*in++) << bits;
+                     bits += 8;
+                 }
+                 len += (unsigned)hold & ((1U << op) - 1);
+@@ -165,9 +144,9 @@ void inflate_fast(z_streamp strm, unsigned start)
+                 bits -= op;
+             }
+             if (bits < 15) {
+-                hold += (unsigned long)(PUP(in)) << bits;
++                hold += (unsigned long)(*in++) << bits;
+                 bits += 8;
+-                hold += (unsigned long)(PUP(in)) << bits;
++                hold += (unsigned long)(*in++) << bits;
+                 bits += 8;
+             }
+             this = dcode[hold & dmask];
+@@ -180,10 +159,10 @@ void inflate_fast(z_streamp strm, unsigned start)
+                 dist = (unsigned)(this.val);
+                 op &= 15;                       /* number of extra bits */
+                 if (bits < op) {
+-                    hold += (unsigned long)(PUP(in)) << bits;
++                    hold += (unsigned long)(*in++) << bits;
+                     bits += 8;
+                     if (bits < op) {
+-                        hold += (unsigned long)(PUP(in)) << bits;
++                        hold += (unsigned long)(*in++) << bits;
+                         bits += 8;
+                     }
+                 }
+@@ -205,13 +184,13 @@ void inflate_fast(z_streamp strm, unsigned start)
+                         state->mode = BAD;
+                         break;
+                     }
+-                    from = window - OFF;
++                    from = window;
+                     if (write == 0) {           /* very common case */
+                         from += wsize - op;
+                         if (op < len) {         /* some from window */
+                             len -= op;
+                             do {
+-                                PUP(out) = PUP(from);
++                                *out++ = *from++;
+                             } while (--op);
+                             from = out - dist;  /* rest from output */
+                         }
+@@ -222,14 +201,14 @@ void inflate_fast(z_streamp strm, unsigned start)
+                         if (op < len) {         /* some from end of window */
+                             len -= op;
+                             do {
+-                                PUP(out) = PUP(from);
++                                *out++ = *from++;
+                             } while (--op);
+-                            from = window - OFF;
++                            from = window;
+                             if (write < len) {  /* some from start of window */
+                                 op = write;
+                                 len -= op;
+                                 do {
+-                                    PUP(out) = PUP(from);
++                                    *out++ = *from++;
+                                 } while (--op);
+                                 from = out - dist;      /* rest from output */
+                             }
+@@ -240,21 +219,21 @@ void inflate_fast(z_streamp strm, unsigned start)
+                         if (op < len) {         /* some from window */
+                             len -= op;
+                             do {
+-                                PUP(out) = PUP(from);
++                                *out++ = *from++;
+                             } while (--op);
+                             from = out - dist;  /* rest from output */
+                         }
+                     }
+                     while (len > 2) {
+-                        PUP(out) = PUP(from);
+-                        PUP(out) = PUP(from);
+-                        PUP(out) = PUP(from);
++                        *out++ = *from++;
++                        *out++ = *from++;
++                        *out++ = *from++;
+                         len -= 3;
+                     }
+                     if (len) {
+-                        PUP(out) = PUP(from);
++                        *out++ = *from++;
+                         if (len > 1)
+-                            PUP(out) = PUP(from);
++                            *out++ = *from++;
+                     }
+                 }
+                 else {
+@@ -264,29 +243,29 @@ void inflate_fast(z_streamp strm, unsigned start)
+                     from = out - dist;          /* copy direct from output */
+                   /* minimum length is three */
+                   /* Align out addr */
+-                  if (!((long)(out - 1 + OFF) & 1)) {
+-                      PUP(out) = PUP(from);
++                  if (!((long)(out - 1) & 1)) {
++                      *out++ = *from++;
+                       len--;
+                   }
+-                  sout = (unsigned short *)(out - OFF);
++                  sout = (unsigned short *)(out);
+                   if (dist > 2) {
+                       unsigned short *sfrom;
+-                      sfrom = (unsigned short *)(from - OFF);
++                      sfrom = (unsigned short *)(from);
+                       loops = len >> 1;
+                       do
+ #ifdef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS
+-                          PUP(sout) = PUP(sfrom);
++                          *sout++ = *sfrom++;
+ #else
+-                          PUP(sout) = UP_UNALIGNED(sfrom);
++                          *sout++ = get_unaligned16(sfrom++);
+ #endif
+                       while (--loops);
+-                      out = (unsigned char *)sout + OFF;
+-                      from = (unsigned char *)sfrom + OFF;
++                      out = (unsigned char *)sout;
++                      from = (unsigned char *)sfrom;
+                   } else { /* dist == 1 or dist == 2 */
+                       unsigned short pat16;
+-                      pat16 = *(sout-1+OFF);
++                      pat16 = *(sout-1);
+                       if (dist == 1) {
+                               union uu mm;
+                               /* copy one char pattern to both bytes */
+@@ -296,12 +275,12 @@ void inflate_fast(z_streamp strm, unsigned start)
+                       }
+                       loops = len >> 1;
+                       do
+-                          PUP(sout) = pat16;
++                          *sout++ = pat16;
+                       while (--loops);
+-                      out = (unsigned char *)sout + OFF;
++                      out = (unsigned char *)sout;
+                   }
+                   if (len & 1)
+-                      PUP(out) = PUP(from);
++                      *out++ = *from++;
+                 }
+             }
+             else if ((op & 64) == 0) {          /* 2nd level distance code */
+@@ -336,8 +315,8 @@ void inflate_fast(z_streamp strm, unsigned start)
+     hold &= (1U << bits) - 1;
+     /* update state and return */
+-    strm->next_in = in + OFF;
+-    strm->next_out = out + OFF;
++    strm->next_in = in;
++    strm->next_out = out;
+     strm->avail_in = (unsigned)(in < last ? 5 + (last - in) : 5 - (in - last));
+     strm->avail_out = (unsigned)(out < end ?
+                                  257 + (end - out) : 257 - (out - end));
+-- 
+2.25.1
+
diff --git a/queue-5.7/libata-use-per-port-sync-for-detach.patch b/queue-5.7/libata-use-per-port-sync-for-detach.patch
new file mode 100644 (file)
index 0000000..46d1f83
--- /dev/null
@@ -0,0 +1,93 @@
+From 6c616349883a08e86570bf0567ef3e8f29a8fcae Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 3 Jun 2020 15:48:19 +0800
+Subject: libata: Use per port sync for detach
+
+From: Kai-Heng Feng <kai.heng.feng@canonical.com>
+
+[ Upstream commit b5292111de9bb70cba3489075970889765302136 ]
+
+Commit 130f4caf145c ("libata: Ensure ata_port probe has completed before
+detach") may cause system freeze during suspend.
+
+Using async_synchronize_full() in PM callbacks is wrong, since async
+callbacks that are already scheduled may wait for not-yet-scheduled
+callbacks, causes a circular dependency.
+
+Instead of using big hammer like async_synchronize_full(), use async
+cookie to make sure port probe are synced, without affecting other
+scheduled PM callbacks.
+
+Fixes: 130f4caf145c ("libata: Ensure ata_port probe has completed before detach")
+Suggested-by: John Garry <john.garry@huawei.com>
+Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
+Tested-by: John Garry <john.garry@huawei.com>
+BugLink: https://bugs.launchpad.net/bugs/1867983
+Signed-off-by: Jens Axboe <axboe@kernel.dk>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/ata/libata-core.c | 11 +++++------
+ include/linux/libata.h    |  3 +++
+ 2 files changed, 8 insertions(+), 6 deletions(-)
+
+diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
+index beca5f91bb4c7..e74c8fe2a5fdb 100644
+--- a/drivers/ata/libata-core.c
++++ b/drivers/ata/libata-core.c
+@@ -42,7 +42,6 @@
+ #include <linux/workqueue.h>
+ #include <linux/scatterlist.h>
+ #include <linux/io.h>
+-#include <linux/async.h>
+ #include <linux/log2.h>
+ #include <linux/slab.h>
+ #include <linux/glob.h>
+@@ -5778,7 +5777,7 @@ int ata_host_register(struct ata_host *host, struct scsi_host_template *sht)
+       /* perform each probe asynchronously */
+       for (i = 0; i < host->n_ports; i++) {
+               struct ata_port *ap = host->ports[i];
+-              async_schedule(async_port_probe, ap);
++              ap->cookie = async_schedule(async_port_probe, ap);
+       }
+       return 0;
+@@ -5920,11 +5919,11 @@ void ata_host_detach(struct ata_host *host)
+ {
+       int i;
+-      /* Ensure ata_port probe has completed */
+-      async_synchronize_full();
+-
+-      for (i = 0; i < host->n_ports; i++)
++      for (i = 0; i < host->n_ports; i++) {
++              /* Ensure ata_port probe has completed */
++              async_synchronize_cookie(host->ports[i]->cookie + 1);
+               ata_port_detach(host->ports[i]);
++      }
+       /* the host is dead now, dissociate ACPI */
+       ata_acpi_dissociate(host);
+diff --git a/include/linux/libata.h b/include/linux/libata.h
+index cffa4714bfa84..ae6dfc107ea82 100644
+--- a/include/linux/libata.h
++++ b/include/linux/libata.h
+@@ -22,6 +22,7 @@
+ #include <linux/acpi.h>
+ #include <linux/cdrom.h>
+ #include <linux/sched.h>
++#include <linux/async.h>
+ /*
+  * Define if arch has non-standard setup.  This is a _PCI_ standard
+@@ -872,6 +873,8 @@ struct ata_port {
+       struct timer_list       fastdrain_timer;
+       unsigned long           fastdrain_cnt;
++      async_cookie_t          cookie;
++
+       int                     em_message_type;
+       void                    *private_data;
+-- 
+2.25.1
+
diff --git a/queue-5.7/libbpf-handle-gcc-noreturn-turned-volatile-quirk.patch b/queue-5.7/libbpf-handle-gcc-noreturn-turned-volatile-quirk.patch
new file mode 100644 (file)
index 0000000..80c382c
--- /dev/null
@@ -0,0 +1,108 @@
+From 9a64c9d47dbf6d71c1cf0bb75aebdd1cdeb64396 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 9 Jun 2020 22:23:35 -0700
+Subject: libbpf: Handle GCC noreturn-turned-volatile quirk
+
+From: Andrii Nakryiko <andriin@fb.com>
+
+[ Upstream commit 32022fd97ed34f6812802bf1288db27c313576f4 ]
+
+Handle a GCC quirk of emitting extra volatile modifier in DWARF (and
+subsequently preserved in BTF by pahole) for function pointers marked as
+__attribute__((noreturn)). This was the way to mark such functions before GCC
+2.5 added noreturn attribute. Drop such func_proto modifiers, similarly to how
+it's done for array (also to handle GCC quirk/bug).
+
+Such volatile attribute is emitted by GCC only, so existing selftests can't
+express such test. Simple repro is like this (compiled with GCC + BTF
+generated by pahole):
+
+  struct my_struct {
+      void __attribute__((noreturn)) (*fn)(int);
+  };
+  struct my_struct a;
+
+Without this fix, output will be:
+
+struct my_struct {
+    voidvolatile  (*fn)(int);
+};
+
+With the fix:
+
+struct my_struct {
+    void (*fn)(int);
+};
+
+Fixes: 351131b51c7a ("libbpf: add btf_dump API for BTF-to-C conversion")
+Reported-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
+Signed-off-by: Andrii Nakryiko <andriin@fb.com>
+Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
+Tested-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
+Link: https://lore.kernel.org/bpf/20200610052335.2862559-1-andriin@fb.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ tools/lib/bpf/btf_dump.c | 33 ++++++++++++++++++++++++---------
+ 1 file changed, 24 insertions(+), 9 deletions(-)
+
+diff --git a/tools/lib/bpf/btf_dump.c b/tools/lib/bpf/btf_dump.c
+index 0c28ee82834b7..653dbbe2e3663 100644
+--- a/tools/lib/bpf/btf_dump.c
++++ b/tools/lib/bpf/btf_dump.c
+@@ -1137,6 +1137,20 @@ static void btf_dump_emit_mods(struct btf_dump *d, struct id_stack *decl_stack)
+       }
+ }
++static void btf_dump_drop_mods(struct btf_dump *d, struct id_stack *decl_stack)
++{
++      const struct btf_type *t;
++      __u32 id;
++
++      while (decl_stack->cnt) {
++              id = decl_stack->ids[decl_stack->cnt - 1];
++              t = btf__type_by_id(d->btf, id);
++              if (!btf_is_mod(t))
++                      return;
++              decl_stack->cnt--;
++      }
++}
++
+ static void btf_dump_emit_name(const struct btf_dump *d,
+                              const char *name, bool last_was_ptr)
+ {
+@@ -1235,14 +1249,7 @@ static void btf_dump_emit_type_chain(struct btf_dump *d,
+                        * a const/volatile modifier for array, so we are
+                        * going to silently skip them here.
+                        */
+-                      while (decls->cnt) {
+-                              next_id = decls->ids[decls->cnt - 1];
+-                              next_t = btf__type_by_id(d->btf, next_id);
+-                              if (btf_is_mod(next_t))
+-                                      decls->cnt--;
+-                              else
+-                                      break;
+-                      }
++                      btf_dump_drop_mods(d, decls);
+                       if (decls->cnt == 0) {
+                               btf_dump_emit_name(d, fname, last_was_ptr);
+@@ -1270,7 +1277,15 @@ static void btf_dump_emit_type_chain(struct btf_dump *d,
+                       __u16 vlen = btf_vlen(t);
+                       int i;
+-                      btf_dump_emit_mods(d, decls);
++                      /*
++                       * GCC emits extra volatile qualifier for
++                       * __attribute__((noreturn)) function pointers. Clang
++                       * doesn't do it. It's a GCC quirk for backwards
++                       * compatibility with code written for GCC <2.5. So,
++                       * similarly to extra qualifiers for array, just drop
++                       * them, instead of handling them.
++                       */
++                      btf_dump_drop_mods(d, decls);
+                       if (decls->cnt) {
+                               btf_dump_printf(d, " (");
+                               btf_dump_emit_type_chain(d, decls, fname, lvl);
+-- 
+2.25.1
+
diff --git a/queue-5.7/libbpf-support-pre-initializing-.bss-global-variable.patch b/queue-5.7/libbpf-support-pre-initializing-.bss-global-variable.patch
new file mode 100644 (file)
index 0000000..f0f8b2b
--- /dev/null
@@ -0,0 +1,166 @@
+From bc62ce2198df71ea67d89a8d575d3b2a14532754 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 12 Jun 2020 12:45:04 -0700
+Subject: libbpf: Support pre-initializing .bss global variables
+
+From: Andrii Nakryiko <andriin@fb.com>
+
+[ Upstream commit caf62492f479585296e9d636c798d5ac256b7b04 ]
+
+Remove invalid assumption in libbpf that .bss map doesn't have to be updated
+in kernel. With addition of skeleton and memory-mapped initialization image,
+.bss doesn't have to be all zeroes when BPF map is created, because user-code
+might have initialized those variables from user-space.
+
+Fixes: eba9c5f498a1 ("libbpf: Refactor global data map initialization")
+Signed-off-by: Andrii Nakryiko <andriin@fb.com>
+Signed-off-by: Alexei Starovoitov <ast@kernel.org>
+Link: https://lore.kernel.org/bpf/20200612194504.557844-1-andriin@fb.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ tools/lib/bpf/libbpf.c                        |  4 --
+ .../selftests/bpf/prog_tests/skeleton.c       | 45 ++++++++++++++++---
+ .../selftests/bpf/progs/test_skeleton.c       | 19 ++++++--
+ 3 files changed, 55 insertions(+), 13 deletions(-)
+
+diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c
+index 0c5b4fb553fbc..c417cff2cdaf4 100644
+--- a/tools/lib/bpf/libbpf.c
++++ b/tools/lib/bpf/libbpf.c
+@@ -3455,10 +3455,6 @@ bpf_object__populate_internal_map(struct bpf_object *obj, struct bpf_map *map)
+       char *cp, errmsg[STRERR_BUFSIZE];
+       int err, zero = 0;
+-      /* kernel already zero-initializes .bss map. */
+-      if (map_type == LIBBPF_MAP_BSS)
+-              return 0;
+-
+       err = bpf_map_update_elem(map->fd, &zero, map->mmaped, 0);
+       if (err) {
+               err = -errno;
+diff --git a/tools/testing/selftests/bpf/prog_tests/skeleton.c b/tools/testing/selftests/bpf/prog_tests/skeleton.c
+index 9264a27360182..fa153cf67b1bb 100644
+--- a/tools/testing/selftests/bpf/prog_tests/skeleton.c
++++ b/tools/testing/selftests/bpf/prog_tests/skeleton.c
+@@ -15,6 +15,8 @@ void test_skeleton(void)
+       int duration = 0, err;
+       struct test_skeleton* skel;
+       struct test_skeleton__bss *bss;
++      struct test_skeleton__data *data;
++      struct test_skeleton__rodata *rodata;
+       struct test_skeleton__kconfig *kcfg;
+       skel = test_skeleton__open();
+@@ -24,13 +26,45 @@ void test_skeleton(void)
+       if (CHECK(skel->kconfig, "skel_kconfig", "kconfig is mmaped()!\n"))
+               goto cleanup;
++      bss = skel->bss;
++      data = skel->data;
++      rodata = skel->rodata;
++
++      /* validate values are pre-initialized correctly */
++      CHECK(data->in1 != -1, "in1", "got %d != exp %d\n", data->in1, -1);
++      CHECK(data->out1 != -1, "out1", "got %d != exp %d\n", data->out1, -1);
++      CHECK(data->in2 != -1, "in2", "got %lld != exp %lld\n", data->in2, -1LL);
++      CHECK(data->out2 != -1, "out2", "got %lld != exp %lld\n", data->out2, -1LL);
++
++      CHECK(bss->in3 != 0, "in3", "got %d != exp %d\n", bss->in3, 0);
++      CHECK(bss->out3 != 0, "out3", "got %d != exp %d\n", bss->out3, 0);
++      CHECK(bss->in4 != 0, "in4", "got %lld != exp %lld\n", bss->in4, 0LL);
++      CHECK(bss->out4 != 0, "out4", "got %lld != exp %lld\n", bss->out4, 0LL);
++
++      CHECK(rodata->in6 != 0, "in6", "got %d != exp %d\n", rodata->in6, 0);
++      CHECK(bss->out6 != 0, "out6", "got %d != exp %d\n", bss->out6, 0);
++
++      /* validate we can pre-setup global variables, even in .bss */
++      data->in1 = 10;
++      data->in2 = 11;
++      bss->in3 = 12;
++      bss->in4 = 13;
++      rodata->in6 = 14;
++
+       err = test_skeleton__load(skel);
+       if (CHECK(err, "skel_load", "failed to load skeleton: %d\n", err))
+               goto cleanup;
+-      bss = skel->bss;
+-      bss->in1 = 1;
+-      bss->in2 = 2;
++      /* validate pre-setup values are still there */
++      CHECK(data->in1 != 10, "in1", "got %d != exp %d\n", data->in1, 10);
++      CHECK(data->in2 != 11, "in2", "got %lld != exp %lld\n", data->in2, 11LL);
++      CHECK(bss->in3 != 12, "in3", "got %d != exp %d\n", bss->in3, 12);
++      CHECK(bss->in4 != 13, "in4", "got %lld != exp %lld\n", bss->in4, 13LL);
++      CHECK(rodata->in6 != 14, "in6", "got %d != exp %d\n", rodata->in6, 14);
++
++      /* now set new values and attach to get them into outX variables */
++      data->in1 = 1;
++      data->in2 = 2;
+       bss->in3 = 3;
+       bss->in4 = 4;
+       bss->in5.a = 5;
+@@ -44,14 +78,15 @@ void test_skeleton(void)
+       /* trigger tracepoint */
+       usleep(1);
+-      CHECK(bss->out1 != 1, "res1", "got %d != exp %d\n", bss->out1, 1);
+-      CHECK(bss->out2 != 2, "res2", "got %lld != exp %d\n", bss->out2, 2);
++      CHECK(data->out1 != 1, "res1", "got %d != exp %d\n", data->out1, 1);
++      CHECK(data->out2 != 2, "res2", "got %lld != exp %d\n", data->out2, 2);
+       CHECK(bss->out3 != 3, "res3", "got %d != exp %d\n", (int)bss->out3, 3);
+       CHECK(bss->out4 != 4, "res4", "got %lld != exp %d\n", bss->out4, 4);
+       CHECK(bss->handler_out5.a != 5, "res5", "got %d != exp %d\n",
+             bss->handler_out5.a, 5);
+       CHECK(bss->handler_out5.b != 6, "res6", "got %lld != exp %d\n",
+             bss->handler_out5.b, 6);
++      CHECK(bss->out6 != 14, "res7", "got %d != exp %d\n", bss->out6, 14);
+       CHECK(bss->bpf_syscall != kcfg->CONFIG_BPF_SYSCALL, "ext1",
+             "got %d != exp %d\n", bss->bpf_syscall, kcfg->CONFIG_BPF_SYSCALL);
+diff --git a/tools/testing/selftests/bpf/progs/test_skeleton.c b/tools/testing/selftests/bpf/progs/test_skeleton.c
+index de03a90f78caa..77ae86f44db5d 100644
+--- a/tools/testing/selftests/bpf/progs/test_skeleton.c
++++ b/tools/testing/selftests/bpf/progs/test_skeleton.c
+@@ -10,16 +10,26 @@ struct s {
+       long long b;
+ } __attribute__((packed));
+-int in1 = 0;
+-long long in2 = 0;
++/* .data section */
++int in1 = -1;
++long long in2 = -1;
++
++/* .bss section */
+ char in3 = '\0';
+ long long in4 __attribute__((aligned(64))) = 0;
+ struct s in5 = {};
+-long long out2 = 0;
++/* .rodata section */
++const volatile int in6 = 0;
++
++/* .data section */
++int out1 = -1;
++long long out2 = -1;
++
++/* .bss section */
+ char out3 = 0;
+ long long out4 = 0;
+-int out1 = 0;
++int out6 = 0;
+ extern bool CONFIG_BPF_SYSCALL __kconfig;
+ extern int LINUX_KERNEL_VERSION __kconfig;
+@@ -36,6 +46,7 @@ int handler(const void *ctx)
+       out3 = in3;
+       out4 = in4;
+       out5 = in5;
++      out6 = in6;
+       bpf_syscall = CONFIG_BPF_SYSCALL;
+       kern_ver = LINUX_KERNEL_VERSION;
+-- 
+2.25.1
+
diff --git a/queue-5.7/m68k-pci-fix-a-memory-leak-in-an-error-handling-path.patch b/queue-5.7/m68k-pci-fix-a-memory-leak-in-an-error-handling-path.patch
new file mode 100644 (file)
index 0000000..91dca80
--- /dev/null
@@ -0,0 +1,40 @@
+From 1d0d3445b256bfce47533f80beca219d8e2a3fdd Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 18 Apr 2020 09:07:51 +0200
+Subject: m68k/PCI: Fix a memory leak in an error handling path
+
+From: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
+
+[ Upstream commit c3f4ec050f56eeab7c1f290321f9b762c95bd332 ]
+
+If 'ioremap' fails, we must free 'bridge', as done in other error handling
+path bellow.
+
+Fixes: 19cc4c843f40 ("m68k/PCI: Replace pci_fixup_irqs() call with host bridge IRQ mapping hooks")
+Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
+Reviewed-by: Geert Uytterhoeven <geert@linux-m68k.org>
+Signed-off-by: Greg Ungerer <gerg@linux-m68k.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/m68k/coldfire/pci.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/arch/m68k/coldfire/pci.c b/arch/m68k/coldfire/pci.c
+index 62b0eb6cf69a3..84eab0f5e00af 100644
+--- a/arch/m68k/coldfire/pci.c
++++ b/arch/m68k/coldfire/pci.c
+@@ -216,8 +216,10 @@ static int __init mcf_pci_init(void)
+       /* Keep a virtual mapping to IO/config space active */
+       iospace = (unsigned long) ioremap(PCI_IO_PA, PCI_IO_SIZE);
+-      if (iospace == 0)
++      if (iospace == 0) {
++              pci_free_host_bridge(bridge);
+               return -ENODEV;
++      }
+       pr_info("Coldfire: PCI IO/config window mapped to 0x%x\n",
+               (u32) iospace);
+-- 
+2.25.1
+
diff --git a/queue-5.7/mailbox-imx-add-context-save-restore-for-suspend-res.patch b/queue-5.7/mailbox-imx-add-context-save-restore-for-suspend-res.patch
new file mode 100644 (file)
index 0000000..9385819
--- /dev/null
@@ -0,0 +1,90 @@
+From 4d0b3cb9f21bc1d57bd24c3fe3c6fb4885e6c7a1 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 3 Jun 2020 13:15:42 +0800
+Subject: mailbox: imx: Add context save/restore for suspend/resume
+
+From: Dong Aisheng <aisheng.dong@nxp.com>
+
+[ Upstream commit ba5f9fa0ca85a6137fa35efd3a1256d8bb6bc5ff ]
+
+For "mem" mode suspend on i.MX8 SoCs, MU settings could be
+lost because its power is off, so save/restore is needed
+for MU settings during suspend/resume. However, the restore
+can ONLY be done when MU settings are actually lost, for the
+scenario of settings NOT lost in "freeze" mode suspend, since
+there could be still IPC going on multiple CPUs, restoring the
+MU settings could overwrite the TIE by mistake and cause system
+freeze, so need to make sure ONLY restore the MU settings when
+it is powered off, Anson fixes this by checking whether restore
+is actually needed when resume.
+
+Signed-off-by: Dong Aisheng <aisheng.dong@nxp.com>
+Signed-off-by: Anson Huang <Anson.Huang@nxp.com>
+Signed-off-by: Jassi Brar <jaswinder.singh@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/mailbox/imx-mailbox.c | 35 +++++++++++++++++++++++++++++++++++
+ 1 file changed, 35 insertions(+)
+
+diff --git a/drivers/mailbox/imx-mailbox.c b/drivers/mailbox/imx-mailbox.c
+index 9d6f0217077b2..478308fb82cc6 100644
+--- a/drivers/mailbox/imx-mailbox.c
++++ b/drivers/mailbox/imx-mailbox.c
+@@ -66,6 +66,8 @@ struct imx_mu_priv {
+       struct clk              *clk;
+       int                     irq;
++      u32 xcr;
++
+       bool                    side_b;
+ };
+@@ -558,12 +560,45 @@ static const struct of_device_id imx_mu_dt_ids[] = {
+ };
+ MODULE_DEVICE_TABLE(of, imx_mu_dt_ids);
++static int imx_mu_suspend_noirq(struct device *dev)
++{
++      struct imx_mu_priv *priv = dev_get_drvdata(dev);
++
++      priv->xcr = imx_mu_read(priv, priv->dcfg->xCR);
++
++      return 0;
++}
++
++static int imx_mu_resume_noirq(struct device *dev)
++{
++      struct imx_mu_priv *priv = dev_get_drvdata(dev);
++
++      /*
++       * ONLY restore MU when context lost, the TIE could
++       * be set during noirq resume as there is MU data
++       * communication going on, and restore the saved
++       * value will overwrite the TIE and cause MU data
++       * send failed, may lead to system freeze. This issue
++       * is observed by testing freeze mode suspend.
++       */
++      if (!imx_mu_read(priv, priv->dcfg->xCR))
++              imx_mu_write(priv, priv->xcr, priv->dcfg->xCR);
++
++      return 0;
++}
++
++static const struct dev_pm_ops imx_mu_pm_ops = {
++      SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(imx_mu_suspend_noirq,
++                                    imx_mu_resume_noirq)
++};
++
+ static struct platform_driver imx_mu_driver = {
+       .probe          = imx_mu_probe,
+       .remove         = imx_mu_remove,
+       .driver = {
+               .name   = "imx_mu",
+               .of_match_table = imx_mu_dt_ids,
++              .pm = &imx_mu_pm_ops,
+       },
+ };
+ module_platform_driver(imx_mu_driver);
+-- 
+2.25.1
+
diff --git a/queue-5.7/mailbox-imx-fix-return-in-imx_mu_scu_xlate.patch b/queue-5.7/mailbox-imx-fix-return-in-imx_mu_scu_xlate.patch
new file mode 100644 (file)
index 0000000..af7adf6
--- /dev/null
@@ -0,0 +1,36 @@
+From 335a136fb2378a193a79bc0c8531225bdf04f0f0 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 7 Apr 2020 12:27:53 +0300
+Subject: mailbox: imx: Fix return in imx_mu_scu_xlate()
+
+From: Dan Carpenter <dan.carpenter@oracle.com>
+
+[ Upstream commit 1b3a347b7d56aa637157da1b7df225071af1421f ]
+
+This called from mbox_request_channel().  The caller is  expecting error
+pointers and not NULL so this "return NULL;" will lead to an Oops.
+
+Fixes: 0a67003b1985 ("mailbox: imx: add SCU MU support")
+Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
+Signed-off-by: Jassi Brar <jaswinder.singh@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/mailbox/imx-mailbox.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/mailbox/imx-mailbox.c b/drivers/mailbox/imx-mailbox.c
+index 7906624a731c1..9d6f0217077b2 100644
+--- a/drivers/mailbox/imx-mailbox.c
++++ b/drivers/mailbox/imx-mailbox.c
+@@ -374,7 +374,7 @@ static struct mbox_chan *imx_mu_scu_xlate(struct mbox_controller *mbox,
+               break;
+       default:
+               dev_err(mbox->dev, "Invalid chan type: %d\n", type);
+-              return NULL;
++              return ERR_PTR(-EINVAL);
+       }
+       if (chan >= mbox->num_chans) {
+-- 
+2.25.1
+
diff --git a/queue-5.7/mailbox-zynqmp-ipi-fix-null-vs-is_err-check-in-zynqm.patch b/queue-5.7/mailbox-zynqmp-ipi-fix-null-vs-is_err-check-in-zynqm.patch
new file mode 100644 (file)
index 0000000..ece73af
--- /dev/null
@@ -0,0 +1,81 @@
+From d2fd23eba2986a1a58b6d235abba76788533c4aa Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 29 Apr 2020 09:35:03 +0000
+Subject: mailbox: zynqmp-ipi: Fix NULL vs IS_ERR() check in
+ zynqmp_ipi_mbox_probe()
+
+From: Wei Yongjun <weiyongjun1@huawei.com>
+
+[ Upstream commit 445aeeb569f8d7904f8cf80b7c6826bb651ef80e ]
+
+In case of error, the function devm_ioremap() returns NULL pointer not
+ERR_PTR(). So we should check whether the return value of devm_ioremap()
+is NULL instead of IS_ERR.
+
+Fixes: 4981b82ba2ff ("mailbox: ZynqMP IPI mailbox controller")
+Signed-off-by: Wei Yongjun <weiyongjun1@huawei.com>
+Signed-off-by: Jassi Brar <jaswinder.singh@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/mailbox/zynqmp-ipi-mailbox.c | 20 ++++++++------------
+ 1 file changed, 8 insertions(+), 12 deletions(-)
+
+diff --git a/drivers/mailbox/zynqmp-ipi-mailbox.c b/drivers/mailbox/zynqmp-ipi-mailbox.c
+index 86887c9a349a0..f9cc674ba9b76 100644
+--- a/drivers/mailbox/zynqmp-ipi-mailbox.c
++++ b/drivers/mailbox/zynqmp-ipi-mailbox.c
+@@ -504,10 +504,9 @@ static int zynqmp_ipi_mbox_probe(struct zynqmp_ipi_mbox *ipi_mbox,
+               mchan->req_buf_size = resource_size(&res);
+               mchan->req_buf = devm_ioremap(mdev, res.start,
+                                             mchan->req_buf_size);
+-              if (IS_ERR(mchan->req_buf)) {
++              if (!mchan->req_buf) {
+                       dev_err(mdev, "Unable to map IPI buffer I/O memory\n");
+-                      ret = PTR_ERR(mchan->req_buf);
+-                      return ret;
++                      return -ENOMEM;
+               }
+       } else if (ret != -ENODEV) {
+               dev_err(mdev, "Unmatched resource %s, %d.\n", name, ret);
+@@ -520,10 +519,9 @@ static int zynqmp_ipi_mbox_probe(struct zynqmp_ipi_mbox *ipi_mbox,
+               mchan->resp_buf_size = resource_size(&res);
+               mchan->resp_buf = devm_ioremap(mdev, res.start,
+                                              mchan->resp_buf_size);
+-              if (IS_ERR(mchan->resp_buf)) {
++              if (!mchan->resp_buf) {
+                       dev_err(mdev, "Unable to map IPI buffer I/O memory\n");
+-                      ret = PTR_ERR(mchan->resp_buf);
+-                      return ret;
++                      return -ENOMEM;
+               }
+       } else if (ret != -ENODEV) {
+               dev_err(mdev, "Unmatched resource %s.\n", name);
+@@ -543,10 +541,9 @@ static int zynqmp_ipi_mbox_probe(struct zynqmp_ipi_mbox *ipi_mbox,
+               mchan->req_buf_size = resource_size(&res);
+               mchan->req_buf = devm_ioremap(mdev, res.start,
+                                             mchan->req_buf_size);
+-              if (IS_ERR(mchan->req_buf)) {
++              if (!mchan->req_buf) {
+                       dev_err(mdev, "Unable to map IPI buffer I/O memory\n");
+-                      ret = PTR_ERR(mchan->req_buf);
+-                      return ret;
++                      return -ENOMEM;
+               }
+       } else if (ret != -ENODEV) {
+               dev_err(mdev, "Unmatched resource %s.\n", name);
+@@ -559,10 +556,9 @@ static int zynqmp_ipi_mbox_probe(struct zynqmp_ipi_mbox *ipi_mbox,
+               mchan->resp_buf_size = resource_size(&res);
+               mchan->resp_buf = devm_ioremap(mdev, res.start,
+                                              mchan->resp_buf_size);
+-              if (IS_ERR(mchan->resp_buf)) {
++              if (!mchan->resp_buf) {
+                       dev_err(mdev, "Unable to map IPI buffer I/O memory\n");
+-                      ret = PTR_ERR(mchan->resp_buf);
+-                      return ret;
++                      return -ENOMEM;
+               }
+       } else if (ret != -ENODEV) {
+               dev_err(mdev, "Unmatched resource %s.\n", name);
+-- 
+2.25.1
+
diff --git a/queue-5.7/media-s5p-mfc-properly-handle-dma_parms-for-the-allo.patch b/queue-5.7/media-s5p-mfc-properly-handle-dma_parms-for-the-allo.patch
new file mode 100644 (file)
index 0000000..785088d
--- /dev/null
@@ -0,0 +1,55 @@
+From cf2433fa37cebeced6473c6abcc2458647893164 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 28 May 2020 16:03:26 +0200
+Subject: media: s5p-mfc: Properly handle dma_parms for the allocated devices
+
+From: Marek Szyprowski <m.szyprowski@samsung.com>
+
+[ Upstream commit cc8c0363ddce6308168d8223378ca884c213f280 ]
+
+Commit 9495b7e92f71 ("driver core: platform: Initialize dma_parms for
+platform devices") in v5.7-rc5 added allocation of dma_parms structure to
+all platform devices. Then vb2_dma_contig_set_max_seg_size() have been
+changed not to allocate dma_parms structure and rely on the one allocated
+by the device core. Lets allocate the needed structure also for the
+devices created for the 2 MFC device memory ports.
+
+Reported-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
+Suggested-by: Ulf Hansson <ulf.hansson@linaro.org>
+Fixes: 9495b7e92f71 ("driver core: platform: Initialize dma_parms for platform devices")
+Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
+Reviewed-by: Ulf Hansson <ulf.hansson@linaro.org>
+Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
+Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/media/platform/s5p-mfc/s5p_mfc.c | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/media/platform/s5p-mfc/s5p_mfc.c b/drivers/media/platform/s5p-mfc/s5p_mfc.c
+index 5c2a23b953a41..eba2b9f040df0 100644
+--- a/drivers/media/platform/s5p-mfc/s5p_mfc.c
++++ b/drivers/media/platform/s5p-mfc/s5p_mfc.c
+@@ -1089,6 +1089,10 @@ static struct device *s5p_mfc_alloc_memdev(struct device *dev,
+       child->coherent_dma_mask = dev->coherent_dma_mask;
+       child->dma_mask = dev->dma_mask;
+       child->release = s5p_mfc_memdev_release;
++      child->dma_parms = devm_kzalloc(dev, sizeof(*child->dma_parms),
++                                      GFP_KERNEL);
++      if (!child->dma_parms)
++              goto err;
+       /*
+        * The memdevs are not proper OF platform devices, so in order for them
+@@ -1104,7 +1108,7 @@ static struct device *s5p_mfc_alloc_memdev(struct device *dev,
+                       return child;
+               device_del(child);
+       }
+-
++err:
+       put_device(child);
+       return NULL;
+ }
+-- 
+2.25.1
+
diff --git a/queue-5.7/media-v4l2-ctrls-unset-correct-hevc-loop-filter-flag.patch b/queue-5.7/media-v4l2-ctrls-unset-correct-hevc-loop-filter-flag.patch
new file mode 100644 (file)
index 0000000..3f3076a
--- /dev/null
@@ -0,0 +1,40 @@
+From ec5dc0913b1b6f72d27d12277605a81fe8cfb66d Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 27 May 2020 00:25:15 +0200
+Subject: media: v4l2-ctrls: Unset correct HEVC loop filter flag
+
+From: Jonas Karlman <jonas@kwiboo.se>
+
+[ Upstream commit 88441917dc6cd995cb993df603e264f5b88be50c ]
+
+Wrong loop filter flag is unset when tiles enabled flag is not set,
+this cause HEVC decoding issues with Rockchip Video Decoder.
+
+Fix this by unsetting the loop filter across tiles enabled flag instead of
+the pps loop filter across slices enabled flag when tiles are disabled.
+
+Fixes: 256fa3920874 ("media: v4l: Add definitions for HEVC stateless decoding")
+Signed-off-by: Jonas Karlman <jonas@kwiboo.se>
+Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
+Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/media/v4l2-core/v4l2-ctrls.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/media/v4l2-core/v4l2-ctrls.c b/drivers/media/v4l2-core/v4l2-ctrls.c
+index 452edd06d67d7..99fd377f9b81a 100644
+--- a/drivers/media/v4l2-core/v4l2-ctrls.c
++++ b/drivers/media/v4l2-core/v4l2-ctrls.c
+@@ -1825,7 +1825,7 @@ static int std_validate_compound(const struct v4l2_ctrl *ctrl, u32 idx,
+                              sizeof(p_hevc_pps->row_height_minus1));
+                       p_hevc_pps->flags &=
+-                              ~V4L2_HEVC_PPS_FLAG_PPS_LOOP_FILTER_ACROSS_SLICES_ENABLED;
++                              ~V4L2_HEVC_PPS_FLAG_LOOP_FILTER_ACROSS_TILES_ENABLED;
+               }
+               if (p_hevc_pps->flags &
+-- 
+2.25.1
+
diff --git a/queue-5.7/mfd-stmfx-disable-irq-in-suspend-to-avoid-spurious-i.patch b/queue-5.7/mfd-stmfx-disable-irq-in-suspend-to-avoid-spurious-i.patch
new file mode 100644 (file)
index 0000000..90d9224
--- /dev/null
@@ -0,0 +1,68 @@
+From 82a6540029fdea465ff7334aa9b00d8738503df9 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 22 Apr 2020 11:08:33 +0200
+Subject: mfd: stmfx: Disable IRQ in suspend to avoid spurious interrupt
+
+From: Amelie Delaunay <amelie.delaunay@st.com>
+
+[ Upstream commit 97eda5dcc2cde5dcc778bef7a9344db3b6bf8ef5 ]
+
+When STMFX supply is stopped, spurious interrupt can occur. To avoid that,
+disable the interrupt in suspend before disabling the regulator and
+re-enable it at the end of resume.
+
+Fixes: 06252ade9156 ("mfd: Add ST Multi-Function eXpander (STMFX) core driver")
+Signed-off-by: Amelie Delaunay <amelie.delaunay@st.com>
+Signed-off-by: Lee Jones <lee.jones@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/mfd/stmfx.c       | 6 ++++++
+ include/linux/mfd/stmfx.h | 1 +
+ 2 files changed, 7 insertions(+)
+
+diff --git a/drivers/mfd/stmfx.c b/drivers/mfd/stmfx.c
+index 1977fe95f876c..711979afd90a0 100644
+--- a/drivers/mfd/stmfx.c
++++ b/drivers/mfd/stmfx.c
+@@ -296,6 +296,8 @@ static int stmfx_irq_init(struct i2c_client *client)
+       if (ret)
+               goto irq_exit;
++      stmfx->irq = client->irq;
++
+       return 0;
+ irq_exit:
+@@ -486,6 +488,8 @@ static int stmfx_suspend(struct device *dev)
+       if (ret)
+               return ret;
++      disable_irq(stmfx->irq);
++
+       if (stmfx->vdd)
+               return regulator_disable(stmfx->vdd);
+@@ -529,6 +533,8 @@ static int stmfx_resume(struct device *dev)
+       if (ret)
+               return ret;
++      enable_irq(stmfx->irq);
++
+       return 0;
+ }
+ #endif
+diff --git a/include/linux/mfd/stmfx.h b/include/linux/mfd/stmfx.h
+index 3c67983678ec7..744dce63946e0 100644
+--- a/include/linux/mfd/stmfx.h
++++ b/include/linux/mfd/stmfx.h
+@@ -109,6 +109,7 @@ struct stmfx {
+       struct device *dev;
+       struct regmap *map;
+       struct regulator *vdd;
++      int irq;
+       struct irq_domain *irq_domain;
+       struct mutex lock; /* IRQ bus lock */
+       u8 irq_src;
+-- 
+2.25.1
+
diff --git a/queue-5.7/mfd-stmfx-fix-stmfx_irq_init-error-path.patch b/queue-5.7/mfd-stmfx-fix-stmfx_irq_init-error-path.patch
new file mode 100644 (file)
index 0000000..138c2c0
--- /dev/null
@@ -0,0 +1,49 @@
+From a3565c7bc089b71045f48349c0f116f981cb443f Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 22 Apr 2020 11:08:32 +0200
+Subject: mfd: stmfx: Fix stmfx_irq_init error path
+
+From: Amelie Delaunay <amelie.delaunay@st.com>
+
+[ Upstream commit 60c2c4bcb9202acad4cc26af20b44b6bd7874f7b ]
+
+In case the interrupt signal can't be configured, IRQ domain needs to be
+removed.
+
+Fixes: 06252ade9156 ("mfd: Add ST Multi-Function eXpander (STMFX) core driver")
+Signed-off-by: Amelie Delaunay <amelie.delaunay@st.com>
+Signed-off-by: Lee Jones <lee.jones@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/mfd/stmfx.c | 9 +++++++--
+ 1 file changed, 7 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/mfd/stmfx.c b/drivers/mfd/stmfx.c
+index fde6541e347c8..1977fe95f876c 100644
+--- a/drivers/mfd/stmfx.c
++++ b/drivers/mfd/stmfx.c
+@@ -287,14 +287,19 @@ static int stmfx_irq_init(struct i2c_client *client)
+       ret = regmap_write(stmfx->map, STMFX_REG_IRQ_OUT_PIN, irqoutpin);
+       if (ret)
+-              return ret;
++              goto irq_exit;
+       ret = devm_request_threaded_irq(stmfx->dev, client->irq,
+                                       NULL, stmfx_irq_handler,
+                                       irqtrigger | IRQF_ONESHOT,
+                                       "stmfx", stmfx);
+       if (ret)
+-              stmfx_irq_exit(client);
++              goto irq_exit;
++
++      return 0;
++
++irq_exit:
++      stmfx_irq_exit(client);
+       return ret;
+ }
+-- 
+2.25.1
+
diff --git a/queue-5.7/mfd-stmfx-reset-chip-on-resume-as-supply-was-disable.patch b/queue-5.7/mfd-stmfx-reset-chip-on-resume-as-supply-was-disable.patch
new file mode 100644 (file)
index 0000000..ab5a29e
--- /dev/null
@@ -0,0 +1,42 @@
+From e4c469640c082fd3617011c4238fe3f7644000f8 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 22 Apr 2020 11:08:31 +0200
+Subject: mfd: stmfx: Reset chip on resume as supply was disabled
+
+From: Amelie Delaunay <amelie.delaunay@st.com>
+
+[ Upstream commit e583649d87ec090444aa5347af0927cd6e8581ae ]
+
+STMFX supply is disabled during suspend. To avoid a too early access to
+the STMFX firmware on resume, reset the chip and wait for its firmware to
+be loaded.
+
+Fixes: 06252ade9156 ("mfd: Add ST Multi-Function eXpander (STMFX) core driver")
+Signed-off-by: Amelie Delaunay <amelie.delaunay@st.com>
+Signed-off-by: Lee Jones <lee.jones@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/mfd/stmfx.c | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+diff --git a/drivers/mfd/stmfx.c b/drivers/mfd/stmfx.c
+index 857991cb3cbb8..fde6541e347c8 100644
+--- a/drivers/mfd/stmfx.c
++++ b/drivers/mfd/stmfx.c
+@@ -501,6 +501,13 @@ static int stmfx_resume(struct device *dev)
+               }
+       }
++      /* Reset STMFX - supply has been stopped during suspend */
++      ret = stmfx_chip_reset(stmfx);
++      if (ret) {
++              dev_err(stmfx->dev, "Failed to reset chip: %d\n", ret);
++              return ret;
++      }
++
+       ret = regmap_raw_write(stmfx->map, STMFX_REG_SYS_CTRL,
+                              &stmfx->bkp_sysctrl, sizeof(stmfx->bkp_sysctrl));
+       if (ret)
+-- 
+2.25.1
+
diff --git a/queue-5.7/mfd-wcd934x-drop-kfree-for-memory-allocated-with-dev.patch b/queue-5.7/mfd-wcd934x-drop-kfree-for-memory-allocated-with-dev.patch
new file mode 100644 (file)
index 0000000..85feb2d
--- /dev/null
@@ -0,0 +1,35 @@
+From abc2f159181ce7b659cef772b3d56fb925d6089a Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 27 Apr 2020 12:29:22 +0000
+Subject: mfd: wcd934x: Drop kfree for memory allocated with devm_kzalloc
+
+From: Wei Yongjun <weiyongjun1@huawei.com>
+
+[ Upstream commit 652b7b6740eb52d98377a881c7730e36997f00ab ]
+
+It's not necessary to free memory allocated with devm_kzalloc
+and using kfree leads to a double free.
+
+Fixes: 6ac7e4d7ad70 ("mfd: wcd934x: Add support to wcd9340/wcd9341 codec")
+Signed-off-by: Wei Yongjun <weiyongjun1@huawei.com>
+Signed-off-by: Lee Jones <lee.jones@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/mfd/wcd934x.c | 1 -
+ 1 file changed, 1 deletion(-)
+
+diff --git a/drivers/mfd/wcd934x.c b/drivers/mfd/wcd934x.c
+index 90341f3c68101..da910302d51a2 100644
+--- a/drivers/mfd/wcd934x.c
++++ b/drivers/mfd/wcd934x.c
+@@ -280,7 +280,6 @@ static void wcd934x_slim_remove(struct slim_device *sdev)
+       regulator_bulk_disable(WCD934X_MAX_SUPPLY, ddata->supplies);
+       mfd_remove_devices(&sdev->dev);
+-      kfree(ddata);
+ }
+ static const struct slim_device_id wcd934x_slim_id[] = {
+-- 
+2.25.1
+
diff --git a/queue-5.7/mfd-wm8994-fix-driver-operation-if-loaded-as-modules.patch b/queue-5.7/mfd-wm8994-fix-driver-operation-if-loaded-as-modules.patch
new file mode 100644 (file)
index 0000000..59ecf27
--- /dev/null
@@ -0,0 +1,38 @@
+From 19d591a93ba6a9c4704f1e7c8b1899ac21855a12 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 27 Apr 2020 09:48:29 +0200
+Subject: mfd: wm8994: Fix driver operation if loaded as modules
+
+From: Marek Szyprowski <m.szyprowski@samsung.com>
+
+[ Upstream commit d4f9b5428b53dd67f49ee8deed8d4366ed6b1933 ]
+
+WM8994 chip has built-in regulators, which might be used for chip
+operation. They are controlled by a separate wm8994-regulator driver,
+which should be loaded before this driver calls regulator_get(), because
+that driver also provides consumer-supply mapping for the them. If that
+driver is not yet loaded, regulator core substitute them with dummy
+regulator, what breaks chip operation, because the built-in regulators are
+never enabled. Fix this by annotating this driver with MODULE_SOFTDEP()
+"pre" dependency to "wm8994_regulator" module.
+
+Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
+Acked-by: Charles Keepax <ckeepax@opensource.cirrus.com>
+Signed-off-by: Lee Jones <lee.jones@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/mfd/wm8994-core.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/mfd/wm8994-core.c b/drivers/mfd/wm8994-core.c
+index 1e9fe7d92597e..737dede4a95c3 100644
+--- a/drivers/mfd/wm8994-core.c
++++ b/drivers/mfd/wm8994-core.c
+@@ -690,3 +690,4 @@ module_i2c_driver(wm8994_i2c_driver);
+ MODULE_DESCRIPTION("Core support for the WM8994 audio CODEC");
+ MODULE_LICENSE("GPL");
+ MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>");
++MODULE_SOFTDEP("pre: wm8994_regulator");
+-- 
+2.25.1
+
diff --git a/queue-5.7/misc-fastrpc-fix-an-incomplete-memory-release-in-fas.patch b/queue-5.7/misc-fastrpc-fix-an-incomplete-memory-release-in-fas.patch
new file mode 100644 (file)
index 0000000..3f6887e
--- /dev/null
@@ -0,0 +1,43 @@
+From aefd8c2d1ebb3e9a3a0f1e9d69d62b0d385569c5 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 11 May 2020 17:27:22 +0100
+Subject: misc: fastrpc: Fix an incomplete memory release in
+ fastrpc_rpmsg_probe()
+
+From: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
+
+[ Upstream commit 0978de9fc7335c73934ab8fac189fb4cb3f23191 ]
+
+fastrpc_channel_ctx is not freed if misc_register() fails, this would
+lead to a memory leak. Fix this leak by adding kfree in misc_register()
+error path.
+
+Fixes: 278d56f970ae ("misc: fastrpc: Reference count channel context")
+Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
+Reviewed-by: Bjorn Andersson <bjorn.andersson@linaro.org>
+Link: https://lore.kernel.org/r/20200511162722.2552-1-srinivas.kandagatla@linaro.org
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/misc/fastrpc.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/misc/fastrpc.c b/drivers/misc/fastrpc.c
+index e3e085e33d46b..9065d3e71ff76 100644
+--- a/drivers/misc/fastrpc.c
++++ b/drivers/misc/fastrpc.c
+@@ -1613,8 +1613,10 @@ static int fastrpc_rpmsg_probe(struct rpmsg_device *rpdev)
+                                           domains[domain_id]);
+       data->miscdev.fops = &fastrpc_fops;
+       err = misc_register(&data->miscdev);
+-      if (err)
++      if (err) {
++              kfree(data);
+               return err;
++      }
+       kref_init(&data->refcount);
+-- 
+2.25.1
+
diff --git a/queue-5.7/misc-fastrpc-fix-potential-fastrpc_invoke_ctx-leak.patch b/queue-5.7/misc-fastrpc-fix-potential-fastrpc_invoke_ctx-leak.patch
new file mode 100644 (file)
index 0000000..a7015d8
--- /dev/null
@@ -0,0 +1,59 @@
+From 27644f288176feac673df466c03f635d9513652d Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 12 May 2020 12:09:30 +0100
+Subject: misc: fastrpc: fix potential fastrpc_invoke_ctx leak
+
+From: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
+
+[ Upstream commit 74003385cf716f1b88cc7753ca282f5493f204a2 ]
+
+fastrpc_invoke_ctx can have refcount of 2 in error path where
+rpmsg_send() fails to send invoke message. decrement the refcount
+properly in the error path to fix this leak.
+
+This also fixes below static checker warning:
+
+drivers/misc/fastrpc.c:990 fastrpc_internal_invoke()
+warn: 'ctx->refcount.refcount.ref.counter' not decremented on lines: 990.
+
+Fixes: c68cfb718c8f ("misc: fastrpc: Add support for context")
+Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
+Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
+Reviewed-by: Bjorn Andersson <bjorn.andersson@linaro.org>
+Link: https://lore.kernel.org/r/20200512110930.2550-1-srinivas.kandagatla@linaro.org
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/misc/fastrpc.c | 9 ++++++++-
+ 1 file changed, 8 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/misc/fastrpc.c b/drivers/misc/fastrpc.c
+index 9065d3e71ff76..7939c55daceb2 100644
+--- a/drivers/misc/fastrpc.c
++++ b/drivers/misc/fastrpc.c
+@@ -904,6 +904,7 @@ static int fastrpc_invoke_send(struct fastrpc_session_ctx *sctx,
+       struct fastrpc_channel_ctx *cctx;
+       struct fastrpc_user *fl = ctx->fl;
+       struct fastrpc_msg *msg = &ctx->msg;
++      int ret;
+       cctx = fl->cctx;
+       msg->pid = fl->tgid;
+@@ -919,7 +920,13 @@ static int fastrpc_invoke_send(struct fastrpc_session_ctx *sctx,
+       msg->size = roundup(ctx->msg_sz, PAGE_SIZE);
+       fastrpc_context_get(ctx);
+-      return rpmsg_send(cctx->rpdev->ept, (void *)msg, sizeof(*msg));
++      ret = rpmsg_send(cctx->rpdev->ept, (void *)msg, sizeof(*msg));
++
++      if (ret)
++              fastrpc_context_put(ctx);
++
++      return ret;
++
+ }
+ static int fastrpc_internal_invoke(struct fastrpc_user *fl,  u32 kernel,
+-- 
+2.25.1
+
diff --git a/queue-5.7/misc-xilinx-sdfec-improve-get_user_pages_fast-error-.patch b/queue-5.7/misc-xilinx-sdfec-improve-get_user_pages_fast-error-.patch
new file mode 100644 (file)
index 0000000..0609840
--- /dev/null
@@ -0,0 +1,97 @@
+From 1476a42e841cc072682394738852407e878b9925 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 26 May 2020 18:26:26 -0700
+Subject: misc: xilinx-sdfec: improve get_user_pages_fast() error handling
+
+From: John Hubbard <jhubbard@nvidia.com>
+
+[ Upstream commit 57343d51613227373759f5b0f2eede257fd4b82e ]
+
+This fixes the case of get_user_pages_fast() returning a -errno.
+The result needs to be stored in a signed integer. And for safe
+signed/unsigned comparisons, it's best to keep everything signed.
+And get_user_pages_fast() also expects a signed value for number
+of pages to pin.
+
+Therefore, change most relevant variables, from u32 to int. Leave
+"n" unsigned, for convenience in checking for overflow. And provide
+a WARN_ON_ONCE() and early return, if overflow occurs.
+
+Also, as long as we're tidying up: rename the page array from page,
+to pages, in order to match the conventions used in most other call
+sites.
+
+Fixes: 20ec628e8007e ("misc: xilinx_sdfec: Add ability to configure LDPC")
+Cc: Derek Kiernan <derek.kiernan@xilinx.com>
+Cc: Dragan Cvetic <dragan.cvetic@xilinx.com>
+Cc: Arnd Bergmann <arnd@arndb.de>
+Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Cc: Michal Simek <michal.simek@xilinx.com>
+Cc: linux-arm-kernel@lists.infradead.org
+Signed-off-by: John Hubbard <jhubbard@nvidia.com>
+Link: https://lore.kernel.org/r/20200527012628.1100649-2-jhubbard@nvidia.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/misc/xilinx_sdfec.c | 27 +++++++++++++++++----------
+ 1 file changed, 17 insertions(+), 10 deletions(-)
+
+diff --git a/drivers/misc/xilinx_sdfec.c b/drivers/misc/xilinx_sdfec.c
+index 71bbaa56bdb5b..e2766aad9e142 100644
+--- a/drivers/misc/xilinx_sdfec.c
++++ b/drivers/misc/xilinx_sdfec.c
+@@ -602,10 +602,10 @@ static int xsdfec_table_write(struct xsdfec_dev *xsdfec, u32 offset,
+                             const u32 depth)
+ {
+       u32 reg = 0;
+-      u32 res;
+-      u32 n, i;
++      int res, i, nr_pages;
++      u32 n;
+       u32 *addr = NULL;
+-      struct page *page[MAX_NUM_PAGES];
++      struct page *pages[MAX_NUM_PAGES];
+       /*
+        * Writes that go beyond the length of
+@@ -622,15 +622,22 @@ static int xsdfec_table_write(struct xsdfec_dev *xsdfec, u32 offset,
+       if ((len * XSDFEC_REG_WIDTH_JUMP) % PAGE_SIZE)
+               n += 1;
+-      res = get_user_pages_fast((unsigned long)src_ptr, n, 0, page);
+-      if (res < n) {
+-              for (i = 0; i < res; i++)
+-                      put_page(page[i]);
++      if (WARN_ON_ONCE(n > INT_MAX))
++              return -EINVAL;
++
++      nr_pages = n;
++
++      res = get_user_pages_fast((unsigned long)src_ptr, nr_pages, 0, pages);
++      if (res < nr_pages) {
++              if (res > 0) {
++                      for (i = 0; i < res; i++)
++                              put_page(pages[i]);
++              }
+               return -EINVAL;
+       }
+-      for (i = 0; i < n; i++) {
+-              addr = kmap(page[i]);
++      for (i = 0; i < nr_pages; i++) {
++              addr = kmap(pages[i]);
+               do {
+                       xsdfec_regwrite(xsdfec,
+                                       base_addr + ((offset + reg) *
+@@ -639,7 +646,7 @@ static int xsdfec_table_write(struct xsdfec_dev *xsdfec, u32 offset,
+                       reg++;
+               } while ((reg < len) &&
+                        ((reg * XSDFEC_REG_WIDTH_JUMP) % PAGE_SIZE));
+-              put_page(page[i]);
++              put_page(pages[i]);
+       }
+       return reg;
+ }
+-- 
+2.25.1
+
diff --git a/queue-5.7/mksysmap-fix-the-mismatch-of-.l-symbols-in-system.ma.patch b/queue-5.7/mksysmap-fix-the-mismatch-of-.l-symbols-in-system.ma.patch
new file mode 100644 (file)
index 0000000..e011dfb
--- /dev/null
@@ -0,0 +1,46 @@
+From e584936c398e78ddddd0bb0dc2e55d6f5fd200a0 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 2 Jun 2020 15:45:17 +0800
+Subject: mksysmap: Fix the mismatch of '.L' symbols in System.map
+
+From: ashimida <ashimida@linux.alibaba.com>
+
+[ Upstream commit 72d24accf02add25e08733f0ecc93cf10fcbd88c ]
+
+When System.map was generated, the kernel used mksysmap to
+filter the kernel symbols, but all the symbols with the
+second letter 'L' in the kernel were filtered out, not just
+the symbols starting with 'dot + L'.
+
+For example:
+ashimida@ubuntu:~/linux$ cat System.map |grep ' .L'
+ashimida@ubuntu:~/linux$ nm -n vmlinux |grep ' .L'
+ffff0000088028e0 t bLength_show
+......
+ffff0000092e0408 b PLLP_OUTC_lock
+ffff0000092e0410 b PLLP_OUTA_lock
+
+The original intent should be to filter out all local symbols
+starting with '.L', so the dot should be escaped.
+
+Fixes: 00902e984732 ("mksysmap: Add h8300 local symbol pattern")
+Signed-off-by: ashimida <ashimida@linux.alibaba.com>
+Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ scripts/mksysmap | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/scripts/mksysmap b/scripts/mksysmap
+index a35acc0d0b827..9aa23d15862a0 100755
+--- a/scripts/mksysmap
++++ b/scripts/mksysmap
+@@ -41,4 +41,4 @@
+ # so we just ignore them to let readprofile continue to work.
+ # (At least sparc64 has __crc_ in the middle).
+-$NM -n $1 | grep -v '\( [aNUw] \)\|\(__crc_\)\|\( \$[adt]\)\|\( .L\)' > $2
++$NM -n $1 | grep -v '\( [aNUw] \)\|\(__crc_\)\|\( \$[adt]\)\|\( \.L\)' > $2
+-- 
+2.25.1
+
diff --git a/queue-5.7/mlxsw-spectrum-adjust-headroom-buffers-for-8x-ports.patch b/queue-5.7/mlxsw-spectrum-adjust-headroom-buffers-for-8x-ports.patch
new file mode 100644 (file)
index 0000000..985784f
--- /dev/null
@@ -0,0 +1,97 @@
+From 7e2f7d8d00603767cea2d7a3251818f97da6a21f Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 16 Jun 2020 10:14:58 +0300
+Subject: mlxsw: spectrum: Adjust headroom buffers for 8x ports
+
+From: Ido Schimmel <idosch@mellanox.com>
+
+[ Upstream commit 60833d54d56c21e7538296eb2e00e104768fd047 ]
+
+The port's headroom buffers are used to store packets while they
+traverse the device's pipeline and also to store packets that are egress
+mirrored.
+
+On Spectrum-3, ports with eight lanes use two headroom buffers between
+which the configured headroom size is split.
+
+In order to prevent packet loss, multiply the calculated headroom size
+by two for 8x ports.
+
+Fixes: da382875c616 ("mlxsw: spectrum: Extend to support Spectrum-3 ASIC")
+Signed-off-by: Ido Schimmel <idosch@mellanox.com>
+Reviewed-by: Jiri Pirko <jiri@mellanox.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/ethernet/mellanox/mlxsw/spectrum.c      |  2 ++
+ drivers/net/ethernet/mellanox/mlxsw/spectrum.h      | 13 +++++++++++++
+ .../net/ethernet/mellanox/mlxsw/spectrum_buffers.c  |  1 +
+ drivers/net/ethernet/mellanox/mlxsw/spectrum_span.c |  1 +
+ 4 files changed, 17 insertions(+)
+
+diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
+index 6b39978acd078..3e4199246a18d 100644
+--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
++++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
+@@ -990,8 +990,10 @@ int __mlxsw_sp_port_headroom_set(struct mlxsw_sp_port *mlxsw_sp_port, int mtu,
+               lossy = !(pfc || pause_en);
+               thres_cells = mlxsw_sp_pg_buf_threshold_get(mlxsw_sp, mtu);
++              mlxsw_sp_port_headroom_8x_adjust(mlxsw_sp_port, &thres_cells);
+               delay_cells = mlxsw_sp_pg_buf_delay_get(mlxsw_sp, mtu, delay,
+                                                       pfc, pause_en);
++              mlxsw_sp_port_headroom_8x_adjust(mlxsw_sp_port, &delay_cells);
+               total_cells = thres_cells + delay_cells;
+               taken_headroom_cells += total_cells;
+diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.h b/drivers/net/ethernet/mellanox/mlxsw/spectrum.h
+index ca56e72cb4b73..e28ecb84b8164 100644
+--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.h
++++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.h
+@@ -395,6 +395,19 @@ mlxsw_sp_port_vlan_find_by_vid(const struct mlxsw_sp_port *mlxsw_sp_port,
+       return NULL;
+ }
++static inline void
++mlxsw_sp_port_headroom_8x_adjust(const struct mlxsw_sp_port *mlxsw_sp_port,
++                               u16 *p_size)
++{
++      /* Ports with eight lanes use two headroom buffers between which the
++       * configured headroom size is split. Therefore, multiply the calculated
++       * headroom size by two.
++       */
++      if (mlxsw_sp_port->mapping.width != 8)
++              return;
++      *p_size *= 2;
++}
++
+ enum mlxsw_sp_flood_type {
+       MLXSW_SP_FLOOD_TYPE_UC,
+       MLXSW_SP_FLOOD_TYPE_BC,
+diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_buffers.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_buffers.c
+index 968f0902e4fea..19bf0768ed788 100644
+--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_buffers.c
++++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_buffers.c
+@@ -312,6 +312,7 @@ static int mlxsw_sp_port_pb_init(struct mlxsw_sp_port *mlxsw_sp_port)
+               if (i == MLXSW_SP_PB_UNUSED)
+                       continue;
++              mlxsw_sp_port_headroom_8x_adjust(mlxsw_sp_port, &size);
+               mlxsw_reg_pbmc_lossy_buffer_pack(pbmc_pl, i, size);
+       }
+       mlxsw_reg_pbmc_lossy_buffer_pack(pbmc_pl,
+diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_span.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_span.c
+index 9fb2e9d93929c..7c5032f9c8fff 100644
+--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_span.c
++++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_span.c
+@@ -776,6 +776,7 @@ mlxsw_sp_span_port_buffsize_update(struct mlxsw_sp_port *mlxsw_sp_port, u16 mtu)
+               speed = 0;
+       buffsize = mlxsw_sp_span_buffsize_get(mlxsw_sp, speed, mtu);
++      mlxsw_sp_port_headroom_8x_adjust(mlxsw_sp_port, (u16 *) &buffsize);
+       mlxsw_reg_sbib_pack(sbib_pl, mlxsw_sp_port->local_port, buffsize);
+       return mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(sbib), sbib_pl);
+ }
+-- 
+2.25.1
+
diff --git a/queue-5.7/modpost-fix-i-ignore-errors-makeflags-detection.patch b/queue-5.7/modpost-fix-i-ignore-errors-makeflags-detection.patch
new file mode 100644 (file)
index 0000000..2397299
--- /dev/null
@@ -0,0 +1,87 @@
+From 17becf3fcd81379ae17a89d9bffe9a01062733eb Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 1 Jun 2020 14:57:01 +0900
+Subject: modpost: fix -i (--ignore-errors) MAKEFLAGS detection
+
+From: Masahiro Yamada <masahiroy@kernel.org>
+
+[ Upstream commit 91e6ee581270b8ae970f028b898314d73f16870b ]
+
+$(filter -i,$(MAKEFLAGS)) works only in limited use-cases.
+
+The representation of $(MAKEFLAGS) depends on various factors:
+  - GNU Make version (version 3.8x or version 4.x)
+  - The presence of other flags like -j
+
+In my experiments, $(MAKEFLAGS) is expanded as follows:
+
+  * GNU Make 3.8x:
+
+    * without -j option:
+      --no-print-directory -Rri
+
+    * with -j option:
+      --no-print-directory -Rr --jobserver-fds=3,4 -j -i
+
+  * GNU Make 4.x:
+
+    * without -j option:
+      irR --no-print-directory
+
+    * with -j option:
+      irR -j --jobserver-fds=3,4 --no-print-directory
+
+For GNU Make 4.x, the flags are grouped as 'irR', which does not work.
+
+For the single thread build with GNU Make 3.8x, the flags are grouped
+as '-Rri', which does not work either.
+
+To make it work for all cases, do likewise as commit 6f0fa58e4596
+("kbuild: simplify silent build (-s) detection").
+
+BTW, since commit ff9b45c55b26 ("kbuild: modpost: read modules.order
+instead of $(MODVERDIR)/*.mod"), you also need to pass -k option to
+build final *.ko files. 'make -i -k' ignores compile errors in modules,
+and build as many remaining *.ko as possible.
+
+Please note this feature is kind of dangerous if other modules depend
+on the broken module because the generated modules will lack the correct
+module dependency or CRC. Honestly, I am not a big fan of it, but I am
+keeping this feature.
+
+Fixes: eed380f3f593 ("modpost: Optionally ignore secondary errors seen if a single module build fails")
+Cc: Guenter Roeck <linux@roeck-us.net>
+Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ scripts/Makefile.modpost | 7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+diff --git a/scripts/Makefile.modpost b/scripts/Makefile.modpost
+index 957eed6a17a54..33aaa572f686b 100644
+--- a/scripts/Makefile.modpost
++++ b/scripts/Makefile.modpost
+@@ -66,7 +66,7 @@ __modpost:
+ else
+-MODPOST += $(subst -i,-n,$(filter -i,$(MAKEFLAGS))) -s -T - \
++MODPOST += -s -T - \
+       $(if $(KBUILD_NSDEPS),-d $(MODULES_NSDEPS))
+ ifeq ($(KBUILD_EXTMOD),)
+@@ -82,6 +82,11 @@ include $(if $(wildcard $(KBUILD_EXTMOD)/Kbuild), \
+              $(KBUILD_EXTMOD)/Kbuild, $(KBUILD_EXTMOD)/Makefile)
+ endif
++# 'make -i -k' ignores compile errors, and builds as many modules as possible.
++ifneq ($(findstring i,$(filter-out --%,$(MAKEFLAGS))),)
++MODPOST += -n
++endif
++
+ # find all modules listed in modules.order
+ modules := $(sort $(shell cat $(MODORDER)))
+-- 
+2.25.1
+
diff --git a/queue-5.7/mvpp2-remove-module-bugfix.patch b/queue-5.7/mvpp2-remove-module-bugfix.patch
new file mode 100644 (file)
index 0000000..0305d3f
--- /dev/null
@@ -0,0 +1,58 @@
+From ec660f0e52dd42f7f4bf8bee53014cda25fccba6 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 16 Jun 2020 06:35:29 +0200
+Subject: mvpp2: remove module bugfix
+
+From: Sven Auhagen <sven.auhagen@voleatech.de>
+
+[ Upstream commit 807eaf99688ce162a98a7501477644782d4af098 ]
+
+The remove function does not destroy all
+BM Pools when per cpu pool is active.
+
+When reloading the mvpp2 as a module the BM Pools
+are still active in hardware and due to the bug
+have twice the size now old + new.
+
+This eventually leads to a kernel crash.
+
+v2:
+* add Fixes tag
+
+Fixes: 7d04b0b13b11 ("mvpp2: percpu buffers")
+Signed-off-by: Sven Auhagen <sven.auhagen@voleatech.de>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c | 7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c
+index 2b5dad2ec650c..b7b553602ea9f 100644
+--- a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c
++++ b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c
+@@ -5983,8 +5983,8 @@ static int mvpp2_remove(struct platform_device *pdev)
+ {
+       struct mvpp2 *priv = platform_get_drvdata(pdev);
+       struct fwnode_handle *fwnode = pdev->dev.fwnode;
++      int i = 0, poolnum = MVPP2_BM_POOLS_NUM;
+       struct fwnode_handle *port_fwnode;
+-      int i = 0;
+       mvpp2_dbgfs_cleanup(priv);
+@@ -5998,7 +5998,10 @@ static int mvpp2_remove(struct platform_device *pdev)
+       destroy_workqueue(priv->stats_queue);
+-      for (i = 0; i < MVPP2_BM_POOLS_NUM; i++) {
++      if (priv->percpu_pools)
++              poolnum = mvpp2_get_nrxqs(priv) * 2;
++
++      for (i = 0; i < poolnum; i++) {
+               struct mvpp2_bm_pool *bm_pool = &priv->bm_pools[i];
+               mvpp2_bm_pool_destroy(&pdev->dev, priv, bm_pool);
+-- 
+2.25.1
+
diff --git a/queue-5.7/net-dp83867-fix-of_mdio-config-check.patch b/queue-5.7/net-dp83867-fix-of_mdio-config-check.patch
new file mode 100644 (file)
index 0000000..446844d
--- /dev/null
@@ -0,0 +1,38 @@
+From 914e49ae10804204e45ff370128dc738b587e1ca Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 5 Jun 2020 09:01:05 -0500
+Subject: net: dp83867: Fix OF_MDIO config check
+
+From: Dan Murphy <dmurphy@ti.com>
+
+[ Upstream commit 506de00677b84dfc6718cbbd3495b1d90df5d098 ]
+
+When CONFIG_OF_MDIO is set to be a module the code block is not
+compiled. Use the IS_ENABLED macro that checks for both built in as
+well as module.
+
+Fixes: 2a10154abcb75 ("net: phy: dp83867: Add TI dp83867 phy")
+Signed-off-by: Dan Murphy <dmurphy@ti.com>
+Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/phy/dp83867.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/net/phy/dp83867.c b/drivers/net/phy/dp83867.c
+index b55e3c0403edd..ddac79960ea71 100644
+--- a/drivers/net/phy/dp83867.c
++++ b/drivers/net/phy/dp83867.c
+@@ -488,7 +488,7 @@ static int dp83867_verify_rgmii_cfg(struct phy_device *phydev)
+       return 0;
+ }
+-#ifdef CONFIG_OF_MDIO
++#if IS_ENABLED(CONFIG_OF_MDIO)
+ static int dp83867_of_init(struct phy_device *phydev)
+ {
+       struct dp83867_private *dp83867 = phydev->priv;
+-- 
+2.25.1
+
diff --git a/queue-5.7/net-dsa-lantiq_gswip-fix-and-improve-the-unsupported.patch b/queue-5.7/net-dsa-lantiq_gswip-fix-and-improve-the-unsupported.patch
new file mode 100644 (file)
index 0000000..2ac756a
--- /dev/null
@@ -0,0 +1,47 @@
+From 9df8d3eeb01b2a516b7e3526558ae2a7858e8284 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 7 Jun 2020 15:02:58 +0200
+Subject: net: dsa: lantiq_gswip: fix and improve the unsupported interface
+ error
+
+From: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
+
+[ Upstream commit 4d3da2d8d91f66988a829a18a0ce59945e8ae4fb ]
+
+While trying to use the lantiq_gswip driver on one of my boards I made
+a mistake when specifying the phy-mode (because the out-of-tree driver
+wants phy-mode "gmii" or "mii" for the internal PHYs). In this case the
+following error is printed multiple times:
+  Unsupported interface: 3
+
+While it gives at least a hint at what may be wrong it is not very user
+friendly. Print the human readable phy-mode and also which port is
+configured incorrectly (this hardware supports ports 0..6) to improve
+the cases where someone made a mistake.
+
+Fixes: 14fceff4771e51 ("net: dsa: Add Lantiq / Intel DSA driver for vrx200")
+Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
+Acked-by: Hauke Mehrtens <hauke@hauke-m.de>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/dsa/lantiq_gswip.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/net/dsa/lantiq_gswip.c b/drivers/net/dsa/lantiq_gswip.c
+index cf6fa8fede334..521ebc072903b 100644
+--- a/drivers/net/dsa/lantiq_gswip.c
++++ b/drivers/net/dsa/lantiq_gswip.c
+@@ -1452,7 +1452,8 @@ static void gswip_phylink_validate(struct dsa_switch *ds, int port,
+ unsupported:
+       bitmap_zero(supported, __ETHTOOL_LINK_MODE_MASK_NBITS);
+-      dev_err(ds->dev, "Unsupported interface: %d\n", state->interface);
++      dev_err(ds->dev, "Unsupported interface '%s' for port %d\n",
++              phy_modes(state->interface), port);
+       return;
+ }
+-- 
+2.25.1
+
diff --git a/queue-5.7/net-dsa-sja1105-fix-ptp-timestamping-with-large-tc-t.patch b/queue-5.7/net-dsa-sja1105-fix-ptp-timestamping-with-large-tc-t.patch
new file mode 100644 (file)
index 0000000..22a66e4
--- /dev/null
@@ -0,0 +1,89 @@
+From 8005db8ab0e246100d98a1475ab640c7f78f0131 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 14 Jun 2020 23:54:09 +0300
+Subject: net: dsa: sja1105: fix PTP timestamping with large tc-taprio cycles
+
+From: Vladimir Oltean <vladimir.oltean@nxp.com>
+
+[ Upstream commit c92cbaea3cc0a80807e386922f801eb6d3652c81 ]
+
+It isn't actually described clearly at all in UM10944.pdf, but on TX of
+a management frame (such as PTP), this needs to happen:
+
+- The destination MAC address (i.e. 01-80-c2-00-00-0e), along with the
+  desired destination port, need to be installed in one of the 4
+  management slots of the switch, over SPI.
+- The host can poll over SPI for that management slot's ENFPORT field.
+  That gets unset when the switch has matched the slot to the frame.
+
+And therein lies the problem. ENFPORT does not mean that the packet has
+been transmitted. Just that it has been received over the CPU port, and
+that the mgmt slot is yet again available.
+
+This is relevant because of what we are doing in sja1105_ptp_txtstamp_skb,
+which is called right after sja1105_mgmt_xmit. We are in a hard
+real-time deadline, since the hardware only gives us 24 bits of TX
+timestamp, so we need to read the full PTP clock to reconstruct it.
+Because we're in a hurry (in an attempt to make sure that we have a full
+64-bit PTP time which is as close as possible to the actual transmission
+time of the frame, to avoid 24-bit wraparounds), first we read the PTP
+clock, then we poll for the TX timestamp to become available.
+
+But of course, we don't know for sure that the frame has been
+transmitted when we read the full PTP clock. We had assumed that ENFPORT
+means it has, but the assumption is incorrect. And while in most
+real-life scenarios this has never been caught due to software delays,
+nowhere is this fact more obvious than with a tc-taprio offload, where
+PTP traffic gets a small timeslot very rarely (example: 1 packet per 10
+ms). In that case, we will be reading the PTP clock for timestamp
+reconstruction too early (before the packet has been transmitted), and
+this renders the reconstruction procedure incorrect (see the assumptions
+described in the comments found on function sja1105_tstamp_reconstruct).
+So the PTP TX timestamps will be off by 1<<24 clock ticks, or 135 ms
+(1 tick is 8 ns).
+
+So fix this case of premature optimization by simply reordering the
+sja1105_ptpegr_ts_poll and the sja1105_ptpclkval_read function calls. It
+turns out that in practice, the 135 ms hard deadline for PTP timestamp
+wraparound is not so hard, since even the most bandwidth-intensive PTP
+profiles, such as 802.1AS-2011, have a sync frame interval of 125 ms.
+So if we couldn't deliver a timestamp in 135 ms (which we can), we're
+toast and have much bigger problems anyway.
+
+Fixes: 47ed985e97f5 ("net: dsa: sja1105: Add logic for TX timestamping")
+Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
+Acked-by: Richard Cochran <richardcochran@gmail.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/dsa/sja1105/sja1105_ptp.c | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/net/dsa/sja1105/sja1105_ptp.c b/drivers/net/dsa/sja1105/sja1105_ptp.c
+index bc0e47c1dbb9b..1771345964580 100644
+--- a/drivers/net/dsa/sja1105/sja1105_ptp.c
++++ b/drivers/net/dsa/sja1105/sja1105_ptp.c
+@@ -891,16 +891,16 @@ void sja1105_ptp_txtstamp_skb(struct dsa_switch *ds, int port,
+       mutex_lock(&ptp_data->lock);
+-      rc = sja1105_ptpclkval_read(priv, &ticks, NULL);
++      rc = sja1105_ptpegr_ts_poll(ds, port, &ts);
+       if (rc < 0) {
+-              dev_err(ds->dev, "Failed to read PTP clock: %d\n", rc);
++              dev_err(ds->dev, "timed out polling for tstamp\n");
+               kfree_skb(skb);
+               goto out;
+       }
+-      rc = sja1105_ptpegr_ts_poll(ds, port, &ts);
++      rc = sja1105_ptpclkval_read(priv, &ticks, NULL);
+       if (rc < 0) {
+-              dev_err(ds->dev, "timed out polling for tstamp\n");
++              dev_err(ds->dev, "Failed to read PTP clock: %d\n", rc);
+               kfree_skb(skb);
+               goto out;
+       }
+-- 
+2.25.1
+
diff --git a/queue-5.7/net-filter-permit-reading-net-in-load_bytes_relative.patch b/queue-5.7/net-filter-permit-reading-net-in-load_bytes_relative.patch
new file mode 100644 (file)
index 0000000..41612f9
--- /dev/null
@@ -0,0 +1,74 @@
+From 19ed32737234639ffa062ca5027c9c2e26aa3ec4 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 10 Jun 2020 13:41:39 -0500
+Subject: net/filter: Permit reading NET in load_bytes_relative when MAC not
+ set
+
+From: YiFei Zhu <zhuyifei1999@gmail.com>
+
+[ Upstream commit 0f5d82f187e1beda3fe7295dfc500af266a5bd80 ]
+
+Added a check in the switch case on start_header that checks for
+the existence of the header, and in the case that MAC is not set
+and the caller requests for MAC, -EFAULT. If the caller requests
+for NET then MAC's existence is completely ignored.
+
+There is no function to check NET header's existence and as far
+as cgroup_skb/egress is concerned it should always be set.
+
+Removed for ptr >= the start of header, considering offset is
+bounded unsigned and should always be true. len <= end - mac is
+redundant to ptr + len <= end.
+
+Fixes: 3eee1f75f2b9 ("bpf: fix bpf_skb_load_bytes_relative pkt length check")
+Signed-off-by: YiFei Zhu <zhuyifei@google.com>
+Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
+Reviewed-by: Stanislav Fomichev <sdf@google.com>
+Link: https://lore.kernel.org/bpf/76bb820ddb6a95f59a772ecbd8c8a336f646b362.1591812755.git.zhuyifei@google.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/core/filter.c | 16 +++++++++-------
+ 1 file changed, 9 insertions(+), 7 deletions(-)
+
+diff --git a/net/core/filter.c b/net/core/filter.c
+index 11b97c31bca58..9512a9772d691 100644
+--- a/net/core/filter.c
++++ b/net/core/filter.c
+@@ -1766,25 +1766,27 @@ BPF_CALL_5(bpf_skb_load_bytes_relative, const struct sk_buff *, skb,
+          u32, offset, void *, to, u32, len, u32, start_header)
+ {
+       u8 *end = skb_tail_pointer(skb);
+-      u8 *net = skb_network_header(skb);
+-      u8 *mac = skb_mac_header(skb);
+-      u8 *ptr;
++      u8 *start, *ptr;
+-      if (unlikely(offset > 0xffff || len > (end - mac)))
++      if (unlikely(offset > 0xffff))
+               goto err_clear;
+       switch (start_header) {
+       case BPF_HDR_START_MAC:
+-              ptr = mac + offset;
++              if (unlikely(!skb_mac_header_was_set(skb)))
++                      goto err_clear;
++              start = skb_mac_header(skb);
+               break;
+       case BPF_HDR_START_NET:
+-              ptr = net + offset;
++              start = skb_network_header(skb);
+               break;
+       default:
+               goto err_clear;
+       }
+-      if (likely(ptr >= mac && ptr + len <= end)) {
++      ptr = start + offset;
++
++      if (likely(ptr + len <= end)) {
+               memcpy(to, ptr, len);
+               return 0;
+       }
+-- 
+2.25.1
+
diff --git a/queue-5.7/net-ipa-program-upper-nibbles-of-sequencer-type.patch b/queue-5.7/net-ipa-program-upper-nibbles-of-sequencer-type.patch
new file mode 100644 (file)
index 0000000..57f16e4
--- /dev/null
@@ -0,0 +1,59 @@
+From 59e24dbe9e4e5b88e6711ab582674710718e808a Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 11 Jun 2020 14:48:32 -0500
+Subject: net: ipa: program upper nibbles of sequencer type
+
+From: Alex Elder <elder@linaro.org>
+
+[ Upstream commit 636edeaad5577b6023f0de2b98a010d1cea73607 ]
+
+The upper two nibbles of the sequencer type were not used for
+SDM845, and were assumed to be 0.  But for SC7180 they are used, and
+so they must be programmed by ipa_endpoint_init_seq().  Fix this bug.
+
+IPA_SEQ_PKT_PROCESS_NO_DEC_NO_UCP_DMAP doesn't have a descriptive
+comment, so add one.
+
+Signed-off-by: Alex Elder <elder@linaro.org>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/ipa/ipa_endpoint.c | 6 ++++--
+ drivers/net/ipa/ipa_reg.h      | 2 ++
+ 2 files changed, 6 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/net/ipa/ipa_endpoint.c b/drivers/net/ipa/ipa_endpoint.c
+index a21534f1462fa..1d823ac0f6d61 100644
+--- a/drivers/net/ipa/ipa_endpoint.c
++++ b/drivers/net/ipa/ipa_endpoint.c
+@@ -669,10 +669,12 @@ static void ipa_endpoint_init_seq(struct ipa_endpoint *endpoint)
+       u32 seq_type = endpoint->seq_type;
+       u32 val = 0;
++      /* Sequencer type is made up of four nibbles */
+       val |= u32_encode_bits(seq_type & 0xf, HPS_SEQ_TYPE_FMASK);
+       val |= u32_encode_bits((seq_type >> 4) & 0xf, DPS_SEQ_TYPE_FMASK);
+-      /* HPS_REP_SEQ_TYPE is 0 */
+-      /* DPS_REP_SEQ_TYPE is 0 */
++      /* The second two apply to replicated packets */
++      val |= u32_encode_bits((seq_type >> 8) & 0xf, HPS_REP_SEQ_TYPE_FMASK);
++      val |= u32_encode_bits((seq_type >> 12) & 0xf, DPS_REP_SEQ_TYPE_FMASK);
+       iowrite32(val, endpoint->ipa->reg_virt + offset);
+ }
+diff --git a/drivers/net/ipa/ipa_reg.h b/drivers/net/ipa/ipa_reg.h
+index 3b8106aa277a0..0a688d8c1d7cf 100644
+--- a/drivers/net/ipa/ipa_reg.h
++++ b/drivers/net/ipa/ipa_reg.h
+@@ -455,6 +455,8 @@ enum ipa_mode {
+  *    second packet processing pass + no decipher + microcontroller
+  * @IPA_SEQ_DMA_DEC:          DMA + cipher/decipher
+  * @IPA_SEQ_DMA_COMP_DECOMP:  DMA + compression/decompression
++ * @IPA_SEQ_PKT_PROCESS_NO_DEC_NO_UCP_DMAP:
++ *    packet processing + no decipher + no uCP + HPS REP DMA parser
+  * @IPA_SEQ_INVALID:          invalid sequencer type
+  *
+  * The values defined here are broken into 4-bit nibbles that are written
+-- 
+2.25.1
+
diff --git a/queue-5.7/net-marvell-fix-of_mdio-config-check.patch b/queue-5.7/net-marvell-fix-of_mdio-config-check.patch
new file mode 100644 (file)
index 0000000..c1a7b7b
--- /dev/null
@@ -0,0 +1,38 @@
+From 44d186b23d759c1e4e04fbf68261cabada8e6d0d Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 5 Jun 2020 09:01:06 -0500
+Subject: net: marvell: Fix OF_MDIO config check
+
+From: Dan Murphy <dmurphy@ti.com>
+
+[ Upstream commit 5cd119d9a05f1c1a08778a7305b4ca0f16bc1e20 ]
+
+When CONFIG_OF_MDIO is set to be a module the code block is not
+compiled. Use the IS_ENABLED macro that checks for both built in as
+well as module.
+
+Fixes: cf41a51db8985 ("of/phylib: Use device tree properties to initialize Marvell PHYs.")
+Signed-off-by: Dan Murphy <dmurphy@ti.com>
+Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/phy/marvell.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/net/phy/marvell.c b/drivers/net/phy/marvell.c
+index 7fc8e10c5f337..a435f7352cfb0 100644
+--- a/drivers/net/phy/marvell.c
++++ b/drivers/net/phy/marvell.c
+@@ -337,7 +337,7 @@ static int m88e1101_config_aneg(struct phy_device *phydev)
+       return marvell_config_aneg(phydev);
+ }
+-#ifdef CONFIG_OF_MDIO
++#if IS_ENABLED(CONFIG_OF_MDIO)
+ /* Set and/or override some configuration registers based on the
+  * marvell,reg-init property stored in the of_node for the phydev.
+  *
+-- 
+2.25.1
+
diff --git a/queue-5.7/net-mdiobus-disable-preemption-upon-u64_stats-update.patch b/queue-5.7/net-mdiobus-disable-preemption-upon-u64_stats-update.patch
new file mode 100644 (file)
index 0000000..7be8a62
--- /dev/null
@@ -0,0 +1,50 @@
+From 20bd82fe9cc815fd9ffddb03482019a324b779e5 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 3 Jun 2020 16:49:47 +0200
+Subject: net: mdiobus: Disable preemption upon u64_stats update
+
+From: Ahmed S. Darwish <a.darwish@linutronix.de>
+
+[ Upstream commit c7e261d81783387a0502878cd229327e7c54322e ]
+
+The u64_stats mechanism uses sequence counters to protect against 64-bit
+values tearing on 32-bit architectures. Updating u64_stats is thus a
+sequence counter write side critical section where preemption must be
+disabled.
+
+For mdiobus_stats_acct(), disable preemption upon the u64_stats update.
+It is called from process context through mdiobus_read() and
+mdiobus_write().
+
+Reported-by: kernel test robot <lkp@intel.com>
+Signed-off-by: Ahmed S. Darwish <a.darwish@linutronix.de>
+Reviewed-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/phy/mdio_bus.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/drivers/net/phy/mdio_bus.c b/drivers/net/phy/mdio_bus.c
+index 7a4eb3f2cb743..a1a4dee2a033a 100644
+--- a/drivers/net/phy/mdio_bus.c
++++ b/drivers/net/phy/mdio_bus.c
+@@ -757,6 +757,7 @@ EXPORT_SYMBOL(mdiobus_scan);
+ static void mdiobus_stats_acct(struct mdio_bus_stats *stats, bool op, int ret)
+ {
++      preempt_disable();
+       u64_stats_update_begin(&stats->syncp);
+       u64_stats_inc(&stats->transfers);
+@@ -771,6 +772,7 @@ static void mdiobus_stats_acct(struct mdio_bus_stats *stats, bool op, int ret)
+               u64_stats_inc(&stats->writes);
+ out:
+       u64_stats_update_end(&stats->syncp);
++      preempt_enable();
+ }
+ /**
+-- 
+2.25.1
+
diff --git a/queue-5.7/net-mscc-fix-of_mdio-config-check.patch b/queue-5.7/net-mscc-fix-of_mdio-config-check.patch
new file mode 100644 (file)
index 0000000..7b2a7e6
--- /dev/null
@@ -0,0 +1,61 @@
+From 20d4c9f410188a2e0aea8871b0875a69e74d4d24 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 5 Jun 2020 09:01:07 -0500
+Subject: net: mscc: Fix OF_MDIO config check
+
+From: Dan Murphy <dmurphy@ti.com>
+
+[ Upstream commit ae602786407fef34e1d66b3c8f278a10ed37197e ]
+
+When CONFIG_OF_MDIO is set to be a module the code block is not
+compiled. Use the IS_ENABLED macro that checks for both built in as
+well as module.
+
+Fixes: 4f58e6dceb0e4 ("net: phy: Cleanup the Edge-Rate feature in Microsemi PHYs.")
+Signed-off-by: Dan Murphy <dmurphy@ti.com>
+Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/phy/mscc/mscc.h      | 2 +-
+ drivers/net/phy/mscc/mscc_main.c | 4 ++--
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/net/phy/mscc/mscc.h b/drivers/net/phy/mscc/mscc.h
+index 414e3b31bb1fa..132f9bf49198f 100644
+--- a/drivers/net/phy/mscc/mscc.h
++++ b/drivers/net/phy/mscc/mscc.h
+@@ -375,7 +375,7 @@ struct vsc8531_private {
+ #endif
+ };
+-#ifdef CONFIG_OF_MDIO
++#if IS_ENABLED(CONFIG_OF_MDIO)
+ struct vsc8531_edge_rate_table {
+       u32 vddmac;
+       u32 slowdown[8];
+diff --git a/drivers/net/phy/mscc/mscc_main.c b/drivers/net/phy/mscc/mscc_main.c
+index c8aa6d905d8e6..485a4f8a6a9a6 100644
+--- a/drivers/net/phy/mscc/mscc_main.c
++++ b/drivers/net/phy/mscc/mscc_main.c
+@@ -98,7 +98,7 @@ static const struct vsc85xx_hw_stat vsc8584_hw_stats[] = {
+       },
+ };
+-#ifdef CONFIG_OF_MDIO
++#if IS_ENABLED(CONFIG_OF_MDIO)
+ static const struct vsc8531_edge_rate_table edge_table[] = {
+       {MSCC_VDDMAC_3300, { 0, 2,  4,  7, 10, 17, 29, 53} },
+       {MSCC_VDDMAC_2500, { 0, 3,  6, 10, 14, 23, 37, 63} },
+@@ -382,7 +382,7 @@ out_unlock:
+       mutex_unlock(&phydev->lock);
+ }
+-#ifdef CONFIG_OF_MDIO
++#if IS_ENABLED(CONFIG_OF_MDIO)
+ static int vsc85xx_edge_rate_magic_get(struct phy_device *phydev)
+ {
+       u32 vdd, sd;
+-- 
+2.25.1
+
diff --git a/queue-5.7/net-sunrpc-fix-off-by-one-issues-in-rpc_ntop6.patch b/queue-5.7/net-sunrpc-fix-off-by-one-issues-in-rpc_ntop6.patch
new file mode 100644 (file)
index 0000000..879daa3
--- /dev/null
@@ -0,0 +1,45 @@
+From 54a09f0e4199be0fd5ce291b96fffa1732aadd71 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 28 Mar 2020 14:56:55 +0300
+Subject: net: sunrpc: Fix off-by-one issues in 'rpc_ntop6'
+
+From: Fedor Tokarev <ftokarev@gmail.com>
+
+[ Upstream commit 118917d696dc59fd3e1741012c2f9db2294bed6f ]
+
+Fix off-by-one issues in 'rpc_ntop6':
+ - 'snprintf' returns the number of characters which would have been
+   written if enough space had been available, excluding the terminating
+   null byte. Thus, a return value of 'sizeof(scopebuf)' means that the
+   last character was dropped.
+ - 'strcat' adds a terminating null byte to the string, thus if len ==
+   buflen, the null byte is written past the end of the buffer.
+
+Signed-off-by: Fedor Tokarev <ftokarev@gmail.com>
+Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/sunrpc/addr.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/net/sunrpc/addr.c b/net/sunrpc/addr.c
+index 8b4d72b1a0667..010dcb876f9d7 100644
+--- a/net/sunrpc/addr.c
++++ b/net/sunrpc/addr.c
+@@ -82,11 +82,11 @@ static size_t rpc_ntop6(const struct sockaddr *sap,
+       rc = snprintf(scopebuf, sizeof(scopebuf), "%c%u",
+                       IPV6_SCOPE_DELIMITER, sin6->sin6_scope_id);
+-      if (unlikely((size_t)rc > sizeof(scopebuf)))
++      if (unlikely((size_t)rc >= sizeof(scopebuf)))
+               return 0;
+       len += rc;
+-      if (unlikely(len > buflen))
++      if (unlikely(len >= buflen))
+               return 0;
+       strcat(buf, scopebuf);
+-- 
+2.25.1
+
diff --git a/queue-5.7/nfs-fix-direct-write-throughput-regression.patch b/queue-5.7/nfs-fix-direct-write-throughput-regression.patch
new file mode 100644 (file)
index 0000000..928f2b3
--- /dev/null
@@ -0,0 +1,50 @@
+From 6b8d595093dff5c225c19398b8a60a8c0d7c0252 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 29 May 2020 14:14:40 -0400
+Subject: NFS: Fix direct WRITE throughput regression
+
+From: Chuck Lever <chuck.lever@oracle.com>
+
+[ Upstream commit ba838a75e73f55a780f1ee896b8e3ecb032dba0f ]
+
+I measured a 50% throughput regression for large direct writes.
+
+The observed on-the-wire behavior is that the client sends every
+NFS WRITE twice: once as an UNSTABLE WRITE plus a COMMIT, and once
+as a FILE_SYNC WRITE.
+
+This is because the nfs_write_match_verf() check in
+nfs_direct_commit_complete() fails for every WRITE.
+
+Buffered writes use nfs_write_completion(), which sets req->wb_verf
+correctly. Direct writes use nfs_direct_write_completion(), which
+does not set req->wb_verf at all. This leaves req->wb_verf set to
+all zeroes for every direct WRITE, and thus
+nfs_direct_commit_completion() always sets NFS_ODIRECT_RESCHED_WRITES.
+
+This fix appears to restore nearly all of the lost performance.
+
+Fixes: 1f28476dcb98 ("NFS: Fix O_DIRECT commit verifier handling")
+Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
+Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/nfs/direct.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c
+index a57e7c72c7f47..d49b1d1979084 100644
+--- a/fs/nfs/direct.c
++++ b/fs/nfs/direct.c
+@@ -731,6 +731,8 @@ static void nfs_direct_write_completion(struct nfs_pgio_header *hdr)
+               nfs_list_remove_request(req);
+               if (request_commit) {
+                       kref_get(&req->wb_kref);
++                      memcpy(&req->wb_verf, &hdr->verf.verifier,
++                             sizeof(req->wb_verf));
+                       nfs_mark_request_commit(req, hdr->lseg, &cinfo,
+                               hdr->ds_commit_idx);
+               }
+-- 
+2.25.1
+
diff --git a/queue-5.7/nfs-set-invalid-blocks-after-nfsv4-writes.patch b/queue-5.7/nfs-set-invalid-blocks-after-nfsv4-writes.patch
new file mode 100644 (file)
index 0000000..9c75a4b
--- /dev/null
@@ -0,0 +1,114 @@
+From ec4d3c3b64de79429978a6cb77ba84788995913d Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 21 May 2020 17:17:21 +0800
+Subject: nfs: set invalid blocks after NFSv4 writes
+
+From: Zheng Bin <zhengbin13@huawei.com>
+
+[ Upstream commit 3a39e778690500066b31fe982d18e2e394d3bce2 ]
+
+Use the following command to test nfsv4(size of file1M is 1MB):
+mount -t nfs -o vers=4.0,actimeo=60 127.0.0.1/dir1 /mnt
+cp file1M /mnt
+du -h /mnt/file1M  -->0 within 60s, then 1M
+
+When write is done(cp file1M /mnt), will call this:
+nfs_writeback_done
+  nfs4_write_done
+    nfs4_write_done_cb
+      nfs_writeback_update_inode
+        nfs_post_op_update_inode_force_wcc_locked(change, ctime, mtime
+nfs_post_op_update_inode_force_wcc_locked
+   nfs_set_cache_invalid
+   nfs_refresh_inode_locked
+     nfs_update_inode
+
+nfsd write response contains change, ctime, mtime, the flag will be
+clear after nfs_update_inode. Howerver, write response does not contain
+space_used, previous open response contains space_used whose value is 0,
+so inode->i_blocks is still 0.
+
+nfs_getattr  -->called by "du -h"
+  do_update |= force_sync || nfs_attribute_cache_expired -->false in 60s
+  cache_validity = READ_ONCE(NFS_I(inode)->cache_validity)
+  do_update |= cache_validity & (NFS_INO_INVALID_ATTR    -->false
+  if (do_update) {
+        __nfs_revalidate_inode
+  }
+
+Within 60s, does not send getattr request to nfsd, thus "du -h /mnt/file1M"
+is 0.
+
+Add a NFS_INO_INVALID_BLOCKS flag, set it when nfsv4 write is done.
+
+Fixes: 16e143751727 ("NFS: More fine grained attribute tracking")
+Signed-off-by: Zheng Bin <zhengbin13@huawei.com>
+Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/nfs/inode.c         | 14 +++++++++++---
+ include/linux/nfs_fs.h |  1 +
+ 2 files changed, 12 insertions(+), 3 deletions(-)
+
+diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c
+index b9d0921cb4fe3..0bf1f835de014 100644
+--- a/fs/nfs/inode.c
++++ b/fs/nfs/inode.c
+@@ -833,6 +833,8 @@ int nfs_getattr(const struct path *path, struct kstat *stat,
+               do_update |= cache_validity & NFS_INO_INVALID_ATIME;
+       if (request_mask & (STATX_CTIME|STATX_MTIME))
+               do_update |= cache_validity & NFS_INO_REVAL_PAGECACHE;
++      if (request_mask & STATX_BLOCKS)
++              do_update |= cache_validity & NFS_INO_INVALID_BLOCKS;
+       if (do_update) {
+               /* Update the attribute cache */
+               if (!(server->flags & NFS_MOUNT_NOAC))
+@@ -1764,7 +1766,8 @@ out_noforce:
+       status = nfs_post_op_update_inode_locked(inode, fattr,
+                       NFS_INO_INVALID_CHANGE
+                       | NFS_INO_INVALID_CTIME
+-                      | NFS_INO_INVALID_MTIME);
++                      | NFS_INO_INVALID_MTIME
++                      | NFS_INO_INVALID_BLOCKS);
+       return status;
+ }
+@@ -1871,7 +1874,8 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr)
+       nfsi->cache_validity &= ~(NFS_INO_INVALID_ATTR
+                       | NFS_INO_INVALID_ATIME
+                       | NFS_INO_REVAL_FORCED
+-                      | NFS_INO_REVAL_PAGECACHE);
++                      | NFS_INO_REVAL_PAGECACHE
++                      | NFS_INO_INVALID_BLOCKS);
+       /* Do atomic weak cache consistency updates */
+       nfs_wcc_update_inode(inode, fattr);
+@@ -2033,8 +2037,12 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr)
+               inode->i_blocks = nfs_calc_block_size(fattr->du.nfs3.used);
+       } else if (fattr->valid & NFS_ATTR_FATTR_BLOCKS_USED)
+               inode->i_blocks = fattr->du.nfs2.blocks;
+-      else
++      else {
++              nfsi->cache_validity |= save_cache_validity &
++                              (NFS_INO_INVALID_BLOCKS
++                              | NFS_INO_REVAL_FORCED);
+               cache_revalidated = false;
++      }
+       /* Update attrtimeo value if we're out of the unstable period */
+       if (attr_changed) {
+diff --git a/include/linux/nfs_fs.h b/include/linux/nfs_fs.h
+index 73eda45f1cfd9..6ee9119acc5d9 100644
+--- a/include/linux/nfs_fs.h
++++ b/include/linux/nfs_fs.h
+@@ -230,6 +230,7 @@ struct nfs4_copy_state {
+ #define NFS_INO_INVALID_OTHER BIT(12)         /* other attrs are invalid */
+ #define NFS_INO_DATA_INVAL_DEFER      \
+                               BIT(13)         /* Deferred cache invalidation */
++#define NFS_INO_INVALID_BLOCKS        BIT(14)         /* cached blocks are invalid */
+ #define NFS_INO_INVALID_ATTR  (NFS_INO_INVALID_CHANGE \
+               | NFS_INO_INVALID_CTIME \
+-- 
+2.25.1
+
diff --git a/queue-5.7/nfsd-fix-svc_xprt-refcnt-leak-when-setup-callback-cl.patch b/queue-5.7/nfsd-fix-svc_xprt-refcnt-leak-when-setup-callback-cl.patch
new file mode 100644 (file)
index 0000000..6614c8d
--- /dev/null
@@ -0,0 +1,44 @@
+From 03c68ce25c0a0e5760e5c4655604cc56fba9a7d3 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 25 May 2020 22:15:41 +0800
+Subject: nfsd: Fix svc_xprt refcnt leak when setup callback client failed
+
+From: Xiyu Yang <xiyuyang19@fudan.edu.cn>
+
+[ Upstream commit a4abc6b12eb1f7a533c2e7484cfa555454ff0977 ]
+
+nfsd4_process_cb_update() invokes svc_xprt_get(), which increases the
+refcount of the "c->cn_xprt".
+
+The reference counting issue happens in one exception handling path of
+nfsd4_process_cb_update(). When setup callback client failed, the
+function forgets to decrease the refcnt increased by svc_xprt_get(),
+causing a refcnt leak.
+
+Fix this issue by calling svc_xprt_put() when setup callback client
+failed.
+
+Signed-off-by: Xiyu Yang <xiyuyang19@fudan.edu.cn>
+Signed-off-by: Xin Tan <tanxin.ctf@gmail.com>
+Signed-off-by: J. Bruce Fields <bfields@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/nfsd/nfs4callback.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/fs/nfsd/nfs4callback.c b/fs/nfsd/nfs4callback.c
+index 5cf91322de0fc..07e0c6f6322f3 100644
+--- a/fs/nfsd/nfs4callback.c
++++ b/fs/nfsd/nfs4callback.c
+@@ -1301,6 +1301,8 @@ static void nfsd4_process_cb_update(struct nfsd4_callback *cb)
+       err = setup_callback_client(clp, &conn, ses);
+       if (err) {
+               nfsd4_mark_cb_down(clp, err);
++              if (c)
++                      svc_xprt_put(c->cn_xprt);
+               return;
+       }
+ }
+-- 
+2.25.1
+
diff --git a/queue-5.7/nfsd-safer-handling-of-corrupted-c_type.patch b/queue-5.7/nfsd-safer-handling-of-corrupted-c_type.patch
new file mode 100644 (file)
index 0000000..90f6603
--- /dev/null
@@ -0,0 +1,36 @@
+From a559aa507c1bda7ec05c7c33d99aeff85e263fac Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 3 Jun 2020 11:12:32 -0400
+Subject: nfsd: safer handling of corrupted c_type
+
+From: J. Bruce Fields <bfields@redhat.com>
+
+[ Upstream commit c25bf185e57213b54ea0d632ac04907310993433 ]
+
+This can only happen if there's a bug somewhere, so let's make it a WARN
+not a printk.  Also, I think it's safest to ignore the corruption rather
+than trying to fix it by removing a cache entry.
+
+Signed-off-by: J. Bruce Fields <bfields@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/nfsd/nfscache.c | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+diff --git a/fs/nfsd/nfscache.c b/fs/nfsd/nfscache.c
+index 0c10bfea039eb..4a258065188e1 100644
+--- a/fs/nfsd/nfscache.c
++++ b/fs/nfsd/nfscache.c
+@@ -469,8 +469,7 @@ found_entry:
+               rtn = RC_REPLY;
+               break;
+       default:
+-              printk(KERN_WARNING "nfsd: bad repcache type %d\n", rp->c_type);
+-              nfsd_reply_cache_free_locked(b, rp, nn);
++              WARN_ONCE(1, "nfsd: bad repcache type %d\n", rp->c_type);
+       }
+       goto out;
+-- 
+2.25.1
+
diff --git a/queue-5.7/nfsd4-make-drc_slab-global-not-per-net.patch b/queue-5.7/nfsd4-make-drc_slab-global-not-per-net.patch
new file mode 100644 (file)
index 0000000..5b84cef
--- /dev/null
@@ -0,0 +1,250 @@
+From aca5453eae955d6e14618cb77c35ef9ec40c6d1c Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 1 Jun 2020 17:44:45 -0400
+Subject: nfsd4: make drc_slab global, not per-net
+
+From: J. Bruce Fields <bfields@redhat.com>
+
+[ Upstream commit 027690c75e8fd91b60a634d31c4891a6e39d45bd ]
+
+I made every global per-network-namespace instead.  But perhaps doing
+that to this slab was a step too far.
+
+The kmem_cache_create call in our net init method also seems to be
+responsible for this lockdep warning:
+
+[   45.163710] Unable to find swap-space signature
+[   45.375718] trinity-c1 (855): attempted to duplicate a private mapping with mremap.  This is not supported.
+[   46.055744] futex_wake_op: trinity-c1 tries to shift op by -209; fix this program
+[   51.011723]
+[   51.013378] ======================================================
+[   51.013875] WARNING: possible circular locking dependency detected
+[   51.014378] 5.2.0-rc2 #1 Not tainted
+[   51.014672] ------------------------------------------------------
+[   51.015182] trinity-c2/886 is trying to acquire lock:
+[   51.015593] 000000005405f099 (slab_mutex){+.+.}, at: slab_attr_store+0xa2/0x130
+[   51.016190]
+[   51.016190] but task is already holding lock:
+[   51.016652] 00000000ac662005 (kn->count#43){++++}, at: kernfs_fop_write+0x286/0x500
+[   51.017266]
+[   51.017266] which lock already depends on the new lock.
+[   51.017266]
+[   51.017909]
+[   51.017909] the existing dependency chain (in reverse order) is:
+[   51.018497]
+[   51.018497] -> #1 (kn->count#43){++++}:
+[   51.018956]        __lock_acquire+0x7cf/0x1a20
+[   51.019317]        lock_acquire+0x17d/0x390
+[   51.019658]        __kernfs_remove+0x892/0xae0
+[   51.020020]        kernfs_remove_by_name_ns+0x78/0x110
+[   51.020435]        sysfs_remove_link+0x55/0xb0
+[   51.020832]        sysfs_slab_add+0xc1/0x3e0
+[   51.021332]        __kmem_cache_create+0x155/0x200
+[   51.021720]        create_cache+0xf5/0x320
+[   51.022054]        kmem_cache_create_usercopy+0x179/0x320
+[   51.022486]        kmem_cache_create+0x1a/0x30
+[   51.022867]        nfsd_reply_cache_init+0x278/0x560
+[   51.023266]        nfsd_init_net+0x20f/0x5e0
+[   51.023623]        ops_init+0xcb/0x4b0
+[   51.023928]        setup_net+0x2fe/0x670
+[   51.024315]        copy_net_ns+0x30a/0x3f0
+[   51.024653]        create_new_namespaces+0x3c5/0x820
+[   51.025257]        unshare_nsproxy_namespaces+0xd1/0x240
+[   51.025881]        ksys_unshare+0x506/0x9c0
+[   51.026381]        __x64_sys_unshare+0x3a/0x50
+[   51.026937]        do_syscall_64+0x110/0x10b0
+[   51.027509]        entry_SYSCALL_64_after_hwframe+0x49/0xbe
+[   51.028175]
+[   51.028175] -> #0 (slab_mutex){+.+.}:
+[   51.028817]        validate_chain+0x1c51/0x2cc0
+[   51.029422]        __lock_acquire+0x7cf/0x1a20
+[   51.029947]        lock_acquire+0x17d/0x390
+[   51.030438]        __mutex_lock+0x100/0xfa0
+[   51.030995]        mutex_lock_nested+0x27/0x30
+[   51.031516]        slab_attr_store+0xa2/0x130
+[   51.032020]        sysfs_kf_write+0x11d/0x180
+[   51.032529]        kernfs_fop_write+0x32a/0x500
+[   51.033056]        do_loop_readv_writev+0x21d/0x310
+[   51.033627]        do_iter_write+0x2e5/0x380
+[   51.034148]        vfs_writev+0x170/0x310
+[   51.034616]        do_pwritev+0x13e/0x160
+[   51.035100]        __x64_sys_pwritev+0xa3/0x110
+[   51.035633]        do_syscall_64+0x110/0x10b0
+[   51.036200]        entry_SYSCALL_64_after_hwframe+0x49/0xbe
+[   51.036924]
+[   51.036924] other info that might help us debug this:
+[   51.036924]
+[   51.037876]  Possible unsafe locking scenario:
+[   51.037876]
+[   51.038556]        CPU0                    CPU1
+[   51.039130]        ----                    ----
+[   51.039676]   lock(kn->count#43);
+[   51.040084]                                lock(slab_mutex);
+[   51.040597]                                lock(kn->count#43);
+[   51.041062]   lock(slab_mutex);
+[   51.041320]
+[   51.041320]  *** DEADLOCK ***
+[   51.041320]
+[   51.041793] 3 locks held by trinity-c2/886:
+[   51.042128]  #0: 000000001f55e152 (sb_writers#5){.+.+}, at: vfs_writev+0x2b9/0x310
+[   51.042739]  #1: 00000000c7d6c034 (&of->mutex){+.+.}, at: kernfs_fop_write+0x25b/0x500
+[   51.043400]  #2: 00000000ac662005 (kn->count#43){++++}, at: kernfs_fop_write+0x286/0x500
+
+Reported-by: kernel test robot <lkp@intel.com>
+Fixes: 3ba75830ce17 "drc containerization"
+Signed-off-by: J. Bruce Fields <bfields@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/nfsd/cache.h    |  2 ++
+ fs/nfsd/netns.h    |  1 -
+ fs/nfsd/nfscache.c | 29 +++++++++++++++++------------
+ fs/nfsd/nfsctl.c   |  6 ++++++
+ 4 files changed, 25 insertions(+), 13 deletions(-)
+
+diff --git a/fs/nfsd/cache.h b/fs/nfsd/cache.h
+index 10ec5ecdf1178..65c331f75e9c7 100644
+--- a/fs/nfsd/cache.h
++++ b/fs/nfsd/cache.h
+@@ -78,6 +78,8 @@ enum {
+ /* Checksum this amount of the request */
+ #define RC_CSUMLEN            (256U)
++int   nfsd_drc_slab_create(void);
++void  nfsd_drc_slab_free(void);
+ int   nfsd_reply_cache_init(struct nfsd_net *);
+ void  nfsd_reply_cache_shutdown(struct nfsd_net *);
+ int   nfsd_cache_lookup(struct svc_rqst *);
+diff --git a/fs/nfsd/netns.h b/fs/nfsd/netns.h
+index 09aa545825bd9..9217cb64bf0e7 100644
+--- a/fs/nfsd/netns.h
++++ b/fs/nfsd/netns.h
+@@ -139,7 +139,6 @@ struct nfsd_net {
+        * Duplicate reply cache
+        */
+       struct nfsd_drc_bucket   *drc_hashtbl;
+-      struct kmem_cache        *drc_slab;
+       /* max number of entries allowed in the cache */
+       unsigned int             max_drc_entries;
+diff --git a/fs/nfsd/nfscache.c b/fs/nfsd/nfscache.c
+index 96352ab7bd810..0c10bfea039eb 100644
+--- a/fs/nfsd/nfscache.c
++++ b/fs/nfsd/nfscache.c
+@@ -36,6 +36,8 @@ struct nfsd_drc_bucket {
+       spinlock_t cache_lock;
+ };
++static struct kmem_cache      *drc_slab;
++
+ static int    nfsd_cache_append(struct svc_rqst *rqstp, struct kvec *vec);
+ static unsigned long nfsd_reply_cache_count(struct shrinker *shrink,
+                                           struct shrink_control *sc);
+@@ -95,7 +97,7 @@ nfsd_reply_cache_alloc(struct svc_rqst *rqstp, __wsum csum,
+ {
+       struct svc_cacherep     *rp;
+-      rp = kmem_cache_alloc(nn->drc_slab, GFP_KERNEL);
++      rp = kmem_cache_alloc(drc_slab, GFP_KERNEL);
+       if (rp) {
+               rp->c_state = RC_UNUSED;
+               rp->c_type = RC_NOCACHE;
+@@ -129,7 +131,7 @@ nfsd_reply_cache_free_locked(struct nfsd_drc_bucket *b, struct svc_cacherep *rp,
+               atomic_dec(&nn->num_drc_entries);
+               nn->drc_mem_usage -= sizeof(*rp);
+       }
+-      kmem_cache_free(nn->drc_slab, rp);
++      kmem_cache_free(drc_slab, rp);
+ }
+ static void
+@@ -141,6 +143,18 @@ nfsd_reply_cache_free(struct nfsd_drc_bucket *b, struct svc_cacherep *rp,
+       spin_unlock(&b->cache_lock);
+ }
++int nfsd_drc_slab_create(void)
++{
++      drc_slab = kmem_cache_create("nfsd_drc",
++                              sizeof(struct svc_cacherep), 0, 0, NULL);
++      return drc_slab ? 0: -ENOMEM;
++}
++
++void nfsd_drc_slab_free(void)
++{
++      kmem_cache_destroy(drc_slab);
++}
++
+ int nfsd_reply_cache_init(struct nfsd_net *nn)
+ {
+       unsigned int hashsize;
+@@ -159,18 +173,13 @@ int nfsd_reply_cache_init(struct nfsd_net *nn)
+       if (status)
+               goto out_nomem;
+-      nn->drc_slab = kmem_cache_create("nfsd_drc",
+-                              sizeof(struct svc_cacherep), 0, 0, NULL);
+-      if (!nn->drc_slab)
+-              goto out_shrinker;
+-
+       nn->drc_hashtbl = kcalloc(hashsize,
+                               sizeof(*nn->drc_hashtbl), GFP_KERNEL);
+       if (!nn->drc_hashtbl) {
+               nn->drc_hashtbl = vzalloc(array_size(hashsize,
+                                                sizeof(*nn->drc_hashtbl)));
+               if (!nn->drc_hashtbl)
+-                      goto out_slab;
++                      goto out_shrinker;
+       }
+       for (i = 0; i < hashsize; i++) {
+@@ -180,8 +189,6 @@ int nfsd_reply_cache_init(struct nfsd_net *nn)
+       nn->drc_hashsize = hashsize;
+       return 0;
+-out_slab:
+-      kmem_cache_destroy(nn->drc_slab);
+ out_shrinker:
+       unregister_shrinker(&nn->nfsd_reply_cache_shrinker);
+ out_nomem:
+@@ -209,8 +216,6 @@ void nfsd_reply_cache_shutdown(struct nfsd_net *nn)
+       nn->drc_hashtbl = NULL;
+       nn->drc_hashsize = 0;
+-      kmem_cache_destroy(nn->drc_slab);
+-      nn->drc_slab = NULL;
+ }
+ /*
+diff --git a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c
+index 3bb2db947d291..71687d99b0901 100644
+--- a/fs/nfsd/nfsctl.c
++++ b/fs/nfsd/nfsctl.c
+@@ -1533,6 +1533,9 @@ static int __init init_nfsd(void)
+               goto out_free_slabs;
+       nfsd_fault_inject_init(); /* nfsd fault injection controls */
+       nfsd_stat_init();       /* Statistics */
++      retval = nfsd_drc_slab_create();
++      if (retval)
++              goto out_free_stat;
+       nfsd_lockd_init();      /* lockd->nfsd callbacks */
+       retval = create_proc_exports_entry();
+       if (retval)
+@@ -1546,6 +1549,8 @@ out_free_all:
+       remove_proc_entry("fs/nfs", NULL);
+ out_free_lockd:
+       nfsd_lockd_shutdown();
++      nfsd_drc_slab_free();
++out_free_stat:
+       nfsd_stat_shutdown();
+       nfsd_fault_inject_cleanup();
+       nfsd4_exit_pnfs();
+@@ -1560,6 +1565,7 @@ out_unregister_pernet:
+ static void __exit exit_nfsd(void)
+ {
++      nfsd_drc_slab_free();
+       remove_proc_entry("fs/nfs/exports", NULL);
+       remove_proc_entry("fs/nfs", NULL);
+       nfsd_stat_shutdown();
+-- 
+2.25.1
+
diff --git a/queue-5.7/nfsv4.1-fix-rpc_call_done-assignment-for-bind_conn_t.patch b/queue-5.7/nfsv4.1-fix-rpc_call_done-assignment-for-bind_conn_t.patch
new file mode 100644 (file)
index 0000000..c8e3370
--- /dev/null
@@ -0,0 +1,33 @@
+From e169b02468323e20181d11ffe414f679ad0f844f Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 26 Apr 2020 11:30:00 -0400
+Subject: NFSv4.1 fix rpc_call_done assignment for BIND_CONN_TO_SESSION
+
+From: Olga Kornievskaia <olga.kornievskaia@gmail.com>
+
+[ Upstream commit 1c709b766e73e54d64b1dde1b7cfbcf25bcb15b9 ]
+
+Fixes: 02a95dee8cf0 ("NFS add callback_ops to nfs4_proc_bind_conn_to_session_callback")
+Signed-off-by: Olga Kornievskaia <kolga@netapp.com>
+Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/nfs/nfs4proc.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
+index 9056f3dd380e5..e32717fd1169a 100644
+--- a/fs/nfs/nfs4proc.c
++++ b/fs/nfs/nfs4proc.c
+@@ -7909,7 +7909,7 @@ nfs4_bind_one_conn_to_session_done(struct rpc_task *task, void *calldata)
+ }
+ static const struct rpc_call_ops nfs4_bind_one_conn_to_session_ops = {
+-      .rpc_call_done =  &nfs4_bind_one_conn_to_session_done,
++      .rpc_call_done =  nfs4_bind_one_conn_to_session_done,
+ };
+ /*
+-- 
+2.25.1
+
diff --git a/queue-5.7/ntb-fix-the-default-port-and-peer-numbers-for-legacy.patch b/queue-5.7/ntb-fix-the-default-port-and-peer-numbers-for-legacy.patch
new file mode 100644 (file)
index 0000000..a31b073
--- /dev/null
@@ -0,0 +1,69 @@
+From eaadc5df769e3db4510c522171dc65c952c8c337 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 9 Jan 2019 12:22:28 -0700
+Subject: NTB: Fix the default port and peer numbers for legacy drivers
+
+From: Logan Gunthorpe <logang@deltatee.com>
+
+[ Upstream commit fc8b086d9dbd57458d136c4fa70ee26f832c3a2e ]
+
+When the commit adding ntb_default_port_number() and
+ntb_default_peer_port_number()  entered the kernel there was no
+users of it so it was impossible to tell what the API needed.
+
+When a user finally landed a year later (ntb_pingpong) there were
+more NTB topologies were created and no consideration was considered
+to how other drivers had changed.
+
+Now that there is a user it can be fixed to provide a sensible default
+for the legacy drivers that do not implement ntb_{peer_}port_number().
+Seeing ntb_pingpong doesn't check error codes returning EINVAL was also
+not sensible.
+
+Patches for ntb_pingpong and ntb_perf follow (which are broken
+otherwise) to support hardware that doesn't have port numbers. This is
+important not only to not break support with existing drivers but for
+the cross link topology which, due to its perfect symmetry, cannot
+assign unique port numbers to each side.
+
+Fixes: 1e5301196a88 ("NTB: Add indexed ports NTB API")
+Signed-off-by: Logan Gunthorpe <logang@deltatee.com>
+Acked-by: Allen Hubbe <allenbh@gmail.com>
+Tested-by: Alexander Fomichev <fomichev.ru@gmail.com>
+Signed-off-by: Jon Mason <jdmason@kudzu.us>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/ntb/core.c | 8 ++------
+ 1 file changed, 2 insertions(+), 6 deletions(-)
+
+diff --git a/drivers/ntb/core.c b/drivers/ntb/core.c
+index 2581ab724c347..c9a0912b175fa 100644
+--- a/drivers/ntb/core.c
++++ b/drivers/ntb/core.c
+@@ -214,10 +214,8 @@ int ntb_default_port_number(struct ntb_dev *ntb)
+       case NTB_TOPO_B2B_DSD:
+               return NTB_PORT_SEC_DSD;
+       default:
+-              break;
++              return 0;
+       }
+-
+-      return -EINVAL;
+ }
+ EXPORT_SYMBOL(ntb_default_port_number);
+@@ -240,10 +238,8 @@ int ntb_default_peer_port_number(struct ntb_dev *ntb, int pidx)
+       case NTB_TOPO_B2B_DSD:
+               return NTB_PORT_PRI_USD;
+       default:
+-              break;
++              return 0;
+       }
+-
+-      return -EINVAL;
+ }
+ EXPORT_SYMBOL(ntb_default_peer_port_number);
+-- 
+2.25.1
+
diff --git a/queue-5.7/ntb-ntb_pingpong-choose-doorbells-based-on-port-numb.patch b/queue-5.7/ntb-ntb_pingpong-choose-doorbells-based-on-port-numb.patch
new file mode 100644 (file)
index 0000000..99a6a46
--- /dev/null
@@ -0,0 +1,71 @@
+From ed9e7d22ccf3864f9220f874b09e589250ff13d9 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 9 Jan 2019 12:22:29 -0700
+Subject: NTB: ntb_pingpong: Choose doorbells based on port number
+
+From: Logan Gunthorpe <logang@deltatee.com>
+
+[ Upstream commit ca93c45755da98302c93abdd788fc09113baf9e0 ]
+
+This commit fixes pingpong support for existing drivers that do not
+implement ntb_default_port_number() and ntb_default_peer_port_number().
+This is required for hardware (like the crosslink topology of
+switchtec) which cannot assign reasonable port numbers to each port due
+to its perfect symmetry.
+
+Instead of picking the doorbell to use based on the the index of the
+peer, we use the peer's port number. This is a bit clearer and easier
+to understand.
+
+Fixes: c7aeb0afdcc2 ("NTB: ntb_pp: Add full multi-port NTB API support")
+Signed-off-by: Logan Gunthorpe <logang@deltatee.com>
+Acked-by: Allen Hubbe <allenbh@gmail.com>
+Tested-by: Alexander Fomichev <fomichev.ru@gmail.com>
+Signed-off-by: Jon Mason <jdmason@kudzu.us>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/ntb/test/ntb_pingpong.c | 14 ++++++--------
+ 1 file changed, 6 insertions(+), 8 deletions(-)
+
+diff --git a/drivers/ntb/test/ntb_pingpong.c b/drivers/ntb/test/ntb_pingpong.c
+index 04dd46647db36..2164e8492772d 100644
+--- a/drivers/ntb/test/ntb_pingpong.c
++++ b/drivers/ntb/test/ntb_pingpong.c
+@@ -121,15 +121,14 @@ static int pp_find_next_peer(struct pp_ctx *pp)
+       link = ntb_link_is_up(pp->ntb, NULL, NULL);
+       /* Find next available peer */
+-      if (link & pp->nmask) {
++      if (link & pp->nmask)
+               pidx = __ffs64(link & pp->nmask);
+-              out_db = BIT_ULL(pidx + 1);
+-      } else if (link & pp->pmask) {
++      else if (link & pp->pmask)
+               pidx = __ffs64(link & pp->pmask);
+-              out_db = BIT_ULL(pidx);
+-      } else {
++      else
+               return -ENODEV;
+-      }
++
++      out_db = BIT_ULL(ntb_peer_port_number(pp->ntb, pidx));
+       spin_lock(&pp->lock);
+       pp->out_pidx = pidx;
+@@ -303,7 +302,7 @@ static void pp_init_flds(struct pp_ctx *pp)
+                       break;
+       }
+-      pp->in_db = BIT_ULL(pidx);
++      pp->in_db = BIT_ULL(lport);
+       pp->pmask = GENMASK_ULL(pidx, 0) >> 1;
+       pp->nmask = GENMASK_ULL(pcnt - 1, pidx);
+@@ -432,4 +431,3 @@ static void __exit pp_exit(void)
+       debugfs_remove_recursive(pp_dbgfs_topdir);
+ }
+ module_exit(pp_exit);
+-
+-- 
+2.25.1
+
diff --git a/queue-5.7/ntb-ntb_test-fix-bug-when-counting-remote-files.patch b/queue-5.7/ntb-ntb_test-fix-bug-when-counting-remote-files.patch
new file mode 100644 (file)
index 0000000..3328954
--- /dev/null
@@ -0,0 +1,39 @@
+From 9122bb62f7e47fefa036ee3edae79778a1e42506 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 9 Jan 2019 12:22:33 -0700
+Subject: NTB: ntb_test: Fix bug when counting remote files
+
+From: Logan Gunthorpe <logang@deltatee.com>
+
+[ Upstream commit 2130c0ba69d69bb21f5c52787f2587db00d13d8a ]
+
+When remote files are counted in get_files_count, without using SSH,
+the code returns 0 because there is a colon prepended to $LOC. $VPATH
+should have been used instead of $LOC.
+
+Fixes: 06bd0407d06c ("NTB: ntb_test: Update ntb_tool Scratchpad tests")
+Signed-off-by: Logan Gunthorpe <logang@deltatee.com>
+Acked-by: Allen Hubbe <allenbh@gmail.com>
+Tested-by: Alexander Fomichev <fomichev.ru@gmail.com>
+Signed-off-by: Jon Mason <jdmason@kudzu.us>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ tools/testing/selftests/ntb/ntb_test.sh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/tools/testing/selftests/ntb/ntb_test.sh b/tools/testing/selftests/ntb/ntb_test.sh
+index 9c60337317c60..020137b614079 100755
+--- a/tools/testing/selftests/ntb/ntb_test.sh
++++ b/tools/testing/selftests/ntb/ntb_test.sh
+@@ -241,7 +241,7 @@ function get_files_count()
+       split_remote $LOC
+       if [[ "$REMOTE" == "" ]]; then
+-              echo $(ls -1 "$LOC"/${NAME}* 2>/dev/null | wc -l)
++              echo $(ls -1 "$VPATH"/${NAME}* 2>/dev/null | wc -l)
+       else
+               echo $(ssh "$REMOTE" "ls -1 \"$VPATH\"/${NAME}* | \
+                      wc -l" 2> /dev/null)
+-- 
+2.25.1
+
diff --git a/queue-5.7/ntb-ntb_tool-reading-the-link-file-should-not-end-in.patch b/queue-5.7/ntb-ntb_tool-reading-the-link-file-should-not-end-in.patch
new file mode 100644 (file)
index 0000000..2887d1c
--- /dev/null
@@ -0,0 +1,51 @@
+From bd5f84310f398a1b53a8982552280b194bc2bbcc Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 9 Jan 2019 12:22:26 -0700
+Subject: NTB: ntb_tool: reading the link file should not end in a NULL byte
+
+From: Logan Gunthorpe <logang@deltatee.com>
+
+[ Upstream commit 912e12813dd03c602e4922fc34709ec4d4380cf0 ]
+
+When running ntb_test this warning is issued:
+
+./ntb_test.sh: line 200: warning: command substitution: ignored null
+byte in input
+
+This is caused by the kernel returning one more byte than is necessary
+when reading the link file.
+
+Reduce the number of bytes read back to 2 as it was before the
+commit that regressed this.
+
+Fixes: 7f46c8b3a552 ("NTB: ntb_tool: Add full multi-port NTB API support")
+Signed-off-by: Logan Gunthorpe <logang@deltatee.com>
+Acked-by: Allen Hubbe <allenbh@gmail.com>
+Tested-by: Alexander Fomichev <fomichev.ru@gmail.com>
+Signed-off-by: Jon Mason <jdmason@kudzu.us>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/ntb/test/ntb_tool.c | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+diff --git a/drivers/ntb/test/ntb_tool.c b/drivers/ntb/test/ntb_tool.c
+index 9eaeb221d9802..b7bf3f863d79b 100644
+--- a/drivers/ntb/test/ntb_tool.c
++++ b/drivers/ntb/test/ntb_tool.c
+@@ -504,7 +504,7 @@ static ssize_t tool_peer_link_read(struct file *filep, char __user *ubuf,
+       buf[1] = '\n';
+       buf[2] = '\0';
+-      return simple_read_from_buffer(ubuf, size, offp, buf, 3);
++      return simple_read_from_buffer(ubuf, size, offp, buf, 2);
+ }
+ static TOOL_FOPS_RDWR(tool_peer_link_fops,
+@@ -1690,4 +1690,3 @@ static void __exit tool_exit(void)
+       debugfs_remove_recursive(tool_dbgfs_topdir);
+ }
+ module_exit(tool_exit);
+-
+-- 
+2.25.1
+
diff --git a/queue-5.7/ntb-perf-don-t-require-one-more-memory-window-than-n.patch b/queue-5.7/ntb-perf-don-t-require-one-more-memory-window-than-n.patch
new file mode 100644 (file)
index 0000000..214ed24
--- /dev/null
@@ -0,0 +1,38 @@
+From c2f3efef7120ba4b8ccdb2cabeb14cd3a3d15aec Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 9 Jan 2019 12:22:30 -0700
+Subject: NTB: perf: Don't require one more memory window than number of peers
+
+From: Logan Gunthorpe <logang@deltatee.com>
+
+[ Upstream commit a9c4211ac918ade1522aced6b5acfbe824722f7d ]
+
+ntb_perf should not require more than one memory window per peer. This
+was probably an off-by-one error.
+
+Fixes: 5648e56d03fa ("NTB: ntb_perf: Add full multi-port NTB API support")
+Signed-off-by: Logan Gunthorpe <logang@deltatee.com>
+Acked-by: Allen Hubbe <allenbh@gmail.com>
+Tested-by: Alexander Fomichev <fomichev.ru@gmail.com>
+Signed-off-by: Jon Mason <jdmason@kudzu.us>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/ntb/test/ntb_perf.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/ntb/test/ntb_perf.c b/drivers/ntb/test/ntb_perf.c
+index 1c93b9f5c73bc..21c8a3bac1e0a 100644
+--- a/drivers/ntb/test/ntb_perf.c
++++ b/drivers/ntb/test/ntb_perf.c
+@@ -654,7 +654,7 @@ static int perf_init_service(struct perf_ctx *perf)
+ {
+       u64 mask;
+-      if (ntb_peer_mw_count(perf->ntb) < perf->pcnt + 1) {
++      if (ntb_peer_mw_count(perf->ntb) < perf->pcnt) {
+               dev_err(&perf->ntb->dev, "Not enough memory windows\n");
+               return -EINVAL;
+       }
+-- 
+2.25.1
+
diff --git a/queue-5.7/ntb-perf-fix-race-condition-when-run-with-ntb_test.patch b/queue-5.7/ntb-perf-fix-race-condition-when-run-with-ntb_test.patch
new file mode 100644 (file)
index 0000000..44de3d4
--- /dev/null
@@ -0,0 +1,81 @@
+From d697d086f885fdbe067f940238dde17f2b7f4a63 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 9 Jan 2019 12:22:32 -0700
+Subject: NTB: perf: Fix race condition when run with ntb_test
+
+From: Logan Gunthorpe <logang@deltatee.com>
+
+[ Upstream commit 34d8673a01b053b6231a995a4eec9341163d63be ]
+
+When running ntb_test, the script tries to run the ntb_perf test
+immediately after probing the modules. Since adding multi-port support,
+this fails seeing the new initialization procedure in ntb_perf
+can not complete instantly.
+
+To fix this we add a completion which is waited on when a test is
+started. In this way, run can be written any time after the module is
+loaded and it will wait for the initialization to complete instead of
+sending an error.
+
+Fixes: 5648e56d03fa ("NTB: ntb_perf: Add full multi-port NTB API support")
+Signed-off-by: Logan Gunthorpe <logang@deltatee.com>
+Acked-by: Allen Hubbe <allenbh@gmail.com>
+Tested-by: Alexander Fomichev <fomichev.ru@gmail.com>
+Signed-off-by: Jon Mason <jdmason@kudzu.us>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/ntb/test/ntb_perf.c | 10 ++++++++--
+ 1 file changed, 8 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/ntb/test/ntb_perf.c b/drivers/ntb/test/ntb_perf.c
+index 0b1eae07b1338..5287518034199 100644
+--- a/drivers/ntb/test/ntb_perf.c
++++ b/drivers/ntb/test/ntb_perf.c
+@@ -159,6 +159,8 @@ struct perf_peer {
+       /* NTB connection setup service */
+       struct work_struct      service;
+       unsigned long           sts;
++
++      struct completion init_comp;
+ };
+ #define to_peer_service(__work) \
+       container_of(__work, struct perf_peer, service)
+@@ -547,6 +549,7 @@ static int perf_setup_outbuf(struct perf_peer *peer)
+       /* Initialization is finally done */
+       set_bit(PERF_STS_DONE, &peer->sts);
++      complete_all(&peer->init_comp);
+       return 0;
+ }
+@@ -638,6 +641,7 @@ static void perf_service_work(struct work_struct *work)
+               perf_setup_outbuf(peer);
+       if (test_and_clear_bit(PERF_CMD_CLEAR, &peer->sts)) {
++              init_completion(&peer->init_comp);
+               clear_bit(PERF_STS_DONE, &peer->sts);
+               if (test_bit(0, &peer->perf->busy_flag) &&
+                   peer == peer->perf->test_peer) {
+@@ -1084,8 +1088,9 @@ static int perf_submit_test(struct perf_peer *peer)
+       struct perf_thread *pthr;
+       int tidx, ret;
+-      if (!test_bit(PERF_STS_DONE, &peer->sts))
+-              return -ENOLINK;
++      ret = wait_for_completion_interruptible(&peer->init_comp);
++      if (ret < 0)
++              return ret;
+       if (test_and_set_bit_lock(0, &perf->busy_flag))
+               return -EBUSY;
+@@ -1456,6 +1461,7 @@ static int perf_init_peers(struct perf_ctx *perf)
+                       peer->gidx = pidx;
+               }
+               INIT_WORK(&peer->service, perf_service_work);
++              init_completion(&peer->init_comp);
+       }
+       if (perf->gidx == -1)
+               perf->gidx = pidx;
+-- 
+2.25.1
+
diff --git a/queue-5.7/ntb-perf-fix-support-for-hardware-that-doesn-t-have-.patch b/queue-5.7/ntb-perf-fix-support-for-hardware-that-doesn-t-have-.patch
new file mode 100644 (file)
index 0000000..19d0d81
--- /dev/null
@@ -0,0 +1,52 @@
+From fc6cc83af1b80971e055e916e5db9b772272536f Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 9 Jan 2019 12:22:31 -0700
+Subject: NTB: perf: Fix support for hardware that doesn't have port numbers
+
+From: Logan Gunthorpe <logang@deltatee.com>
+
+[ Upstream commit b54369a248c2e033bfcf5d6917e08cf9d73d54a6 ]
+
+Legacy drivers do not have port numbers (but is reliably only two ports)
+and was broken by the recent commit that added mult-port support to
+ntb_perf. This is especially important to support the cross link
+topology which is perfectly symmetric and cannot assign unique port
+numbers easily.
+
+Hardware that returns zero for both the local port and the peer should
+just always use gidx=0 for the only peer.
+
+Fixes: 5648e56d03fa ("NTB: ntb_perf: Add full multi-port NTB API support")
+Signed-off-by: Logan Gunthorpe <logang@deltatee.com>
+Acked-by: Allen Hubbe <allenbh@gmail.com>
+Tested-by: Alexander Fomichev <fomichev.ru@gmail.com>
+Signed-off-by: Jon Mason <jdmason@kudzu.us>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/ntb/test/ntb_perf.c | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+diff --git a/drivers/ntb/test/ntb_perf.c b/drivers/ntb/test/ntb_perf.c
+index 21c8a3bac1e0a..0b1eae07b1338 100644
+--- a/drivers/ntb/test/ntb_perf.c
++++ b/drivers/ntb/test/ntb_perf.c
+@@ -1460,6 +1460,16 @@ static int perf_init_peers(struct perf_ctx *perf)
+       if (perf->gidx == -1)
+               perf->gidx = pidx;
++      /*
++       * Hardware with only two ports may not have unique port
++       * numbers. In this case, the gidxs should all be zero.
++       */
++      if (perf->pcnt == 1 &&  ntb_port_number(perf->ntb) == 0 &&
++          ntb_peer_port_number(perf->ntb, 0) == 0) {
++              perf->gidx = 0;
++              perf->peers[0].gidx = 0;
++      }
++
+       for (pidx = 0; pidx < perf->pcnt; pidx++) {
+               ret = perf_setup_peer_mw(&perf->peers[pidx]);
+               if (ret)
+-- 
+2.25.1
+
diff --git a/queue-5.7/ntb-revert-the-change-to-use-the-ntb-device-dev-for-.patch b/queue-5.7/ntb-revert-the-change-to-use-the-ntb-device-dev-for-.patch
new file mode 100644 (file)
index 0000000..e409ef2
--- /dev/null
@@ -0,0 +1,44 @@
+From 3e8245e0608e7dcbcc2c95b41050142bc2aa0dbc Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 9 Jan 2019 12:22:27 -0700
+Subject: NTB: Revert the change to use the NTB device dev for DMA allocations
+
+From: Logan Gunthorpe <logang@deltatee.com>
+
+[ Upstream commit 40da7d9a93c8941737ef4a1208d32c13ce017fe1 ]
+
+Commit 417cf39cfea9 ("NTB: Set dma mask and dma coherent mask to NTB
+devices") started using the NTB device for DMA allocations which was
+turns out was wrong. If the IOMMU is enabled, such alloctanions will
+always fail with messages such as:
+
+  DMAR: Allocating domain for 0000:02:00.1 failed
+
+This is because the IOMMU has not setup the device for such use.
+
+Change the tools back to using the PCI device for allocations seeing
+it doesn't make sense to add an IOMMU group for the non-physical NTB
+device. Also remove the code that sets the DMA mask as it no longer
+makes sense to do this.
+
+Fixes: 7f46c8b3a552 ("NTB: ntb_tool: Add full multi-port NTB API support")
+Signed-off-by: Logan Gunthorpe <logang@deltatee.com>
+Tested-by: Alexander Fomichev <fomichev.ru@gmail.com>
+Signed-off-by: Jon Mason <jdmason@kudzu.us>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/ntb/core.c | 1 -
+ 1 file changed, 1 deletion(-)
+
+diff --git a/drivers/ntb/core.c b/drivers/ntb/core.c
+index c9a0912b175fa..f8f75a504a581 100644
+--- a/drivers/ntb/core.c
++++ b/drivers/ntb/core.c
+@@ -311,4 +311,3 @@ static void __exit ntb_driver_exit(void)
+       bus_unregister(&ntb_bus);
+ }
+ module_exit(ntb_driver_exit);
+-
+-- 
+2.25.1
+
diff --git a/queue-5.7/ntb_perf-pass-correct-struct-device-to-dma_alloc_coh.patch b/queue-5.7/ntb_perf-pass-correct-struct-device-to-dma_alloc_coh.patch
new file mode 100644 (file)
index 0000000..cb6b987
--- /dev/null
@@ -0,0 +1,61 @@
+From fb899b4703cf03ed9f0d9ca99d689e75555923b1 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 5 May 2020 23:21:49 -0500
+Subject: ntb_perf: pass correct struct device to dma_alloc_coherent
+
+From: Sanjay R Mehta <sanju.mehta@amd.com>
+
+[ Upstream commit 98f4e140264eeb52f22ff05be6b6dd48237255ac ]
+
+Currently, ntb->dev is passed to dma_alloc_coherent
+and dma_free_coherent calls. The returned dma_addr_t
+is the CPU physical address. This works fine as long
+as IOMMU is disabled. But when IOMMU is enabled, we
+need to make sure that IOVA is returned for dma_addr_t.
+So the correct way to achieve this is by changing the
+first parameter of dma_alloc_coherent() as ntb->pdev->dev
+instead.
+
+Fixes: 5648e56d03fa ("NTB: ntb_perf: Add full multi-port NTB API support")
+Signed-off-by: Logan Gunthorpe <logang@deltatee.com>
+Signed-off-by: Sanjay R Mehta <sanju.mehta@amd.com>
+Signed-off-by: Arindam Nath <arindam.nath@amd.com>
+Signed-off-by: Jon Mason <jdmason@kudzu.us>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/ntb/test/ntb_perf.c | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/ntb/test/ntb_perf.c b/drivers/ntb/test/ntb_perf.c
+index 972f6d984f6d6..1c93b9f5c73bc 100644
+--- a/drivers/ntb/test/ntb_perf.c
++++ b/drivers/ntb/test/ntb_perf.c
+@@ -557,7 +557,7 @@ static void perf_free_inbuf(struct perf_peer *peer)
+               return;
+       (void)ntb_mw_clear_trans(peer->perf->ntb, peer->pidx, peer->gidx);
+-      dma_free_coherent(&peer->perf->ntb->dev, peer->inbuf_size,
++      dma_free_coherent(&peer->perf->ntb->pdev->dev, peer->inbuf_size,
+                         peer->inbuf, peer->inbuf_xlat);
+       peer->inbuf = NULL;
+ }
+@@ -586,8 +586,9 @@ static int perf_setup_inbuf(struct perf_peer *peer)
+       perf_free_inbuf(peer);
+-      peer->inbuf = dma_alloc_coherent(&perf->ntb->dev, peer->inbuf_size,
+-                                       &peer->inbuf_xlat, GFP_KERNEL);
++      peer->inbuf = dma_alloc_coherent(&perf->ntb->pdev->dev,
++                                       peer->inbuf_size, &peer->inbuf_xlat,
++                                       GFP_KERNEL);
+       if (!peer->inbuf) {
+               dev_err(&perf->ntb->dev, "Failed to alloc inbuf of %pa\n",
+                       &peer->inbuf_size);
+@@ -1554,4 +1555,3 @@ static void __exit perf_exit(void)
+       destroy_workqueue(perf_wq);
+ }
+ module_exit(perf_exit);
+-
+-- 
+2.25.1
+
diff --git a/queue-5.7/ntb_tool-pass-correct-struct-device-to-dma_alloc_coh.patch b/queue-5.7/ntb_tool-pass-correct-struct-device-to-dma_alloc_coh.patch
new file mode 100644 (file)
index 0000000..7c7db39
--- /dev/null
@@ -0,0 +1,61 @@
+From 6ec2277204bde4b21838aeb0a13b658362a80e35 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 5 May 2020 23:21:50 -0500
+Subject: ntb_tool: pass correct struct device to dma_alloc_coherent
+
+From: Sanjay R Mehta <sanju.mehta@amd.com>
+
+[ Upstream commit 433efe720674efd9fdbcef78be75793393cf05db ]
+
+Currently, ntb->dev is passed to dma_alloc_coherent
+and dma_free_coherent calls. The returned dma_addr_t
+is the CPU physical address. This works fine as long
+as IOMMU is disabled. But when IOMMU is enabled, we
+need to make sure that IOVA is returned for dma_addr_t.
+So the correct way to achieve this is by changing the
+first parameter of dma_alloc_coherent() as ntb->pdev->dev
+instead.
+
+Fixes: 5648e56d03fa ("NTB: ntb_perf: Add full multi-port NTB API support")
+Signed-off-by: Sanjay R Mehta <sanju.mehta@amd.com>
+Signed-off-by: Arindam Nath <arindam.nath@amd.com>
+Signed-off-by: Jon Mason <jdmason@kudzu.us>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/ntb/test/ntb_tool.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/ntb/test/ntb_tool.c b/drivers/ntb/test/ntb_tool.c
+index 69da758fe64c8..9eaeb221d9802 100644
+--- a/drivers/ntb/test/ntb_tool.c
++++ b/drivers/ntb/test/ntb_tool.c
+@@ -590,7 +590,7 @@ static int tool_setup_mw(struct tool_ctx *tc, int pidx, int widx,
+       inmw->size = min_t(resource_size_t, req_size, size);
+       inmw->size = round_up(inmw->size, addr_align);
+       inmw->size = round_up(inmw->size, size_align);
+-      inmw->mm_base = dma_alloc_coherent(&tc->ntb->dev, inmw->size,
++      inmw->mm_base = dma_alloc_coherent(&tc->ntb->pdev->dev, inmw->size,
+                                          &inmw->dma_base, GFP_KERNEL);
+       if (!inmw->mm_base)
+               return -ENOMEM;
+@@ -612,7 +612,7 @@ static int tool_setup_mw(struct tool_ctx *tc, int pidx, int widx,
+       return 0;
+ err_free_dma:
+-      dma_free_coherent(&tc->ntb->dev, inmw->size, inmw->mm_base,
++      dma_free_coherent(&tc->ntb->pdev->dev, inmw->size, inmw->mm_base,
+                         inmw->dma_base);
+       inmw->mm_base = NULL;
+       inmw->dma_base = 0;
+@@ -629,7 +629,7 @@ static void tool_free_mw(struct tool_ctx *tc, int pidx, int widx)
+       if (inmw->mm_base != NULL) {
+               ntb_mw_clear_trans(tc->ntb, pidx, widx);
+-              dma_free_coherent(&tc->ntb->dev, inmw->size,
++              dma_free_coherent(&tc->ntb->pdev->dev, inmw->size,
+                                 inmw->mm_base, inmw->dma_base);
+       }
+-- 
+2.25.1
+
diff --git a/queue-5.7/nvme-fc-don-t-call-nvme_cleanup_cmd-for-aens.patch b/queue-5.7/nvme-fc-don-t-call-nvme_cleanup_cmd-for-aens.patch
new file mode 100644 (file)
index 0000000..7a1467b
--- /dev/null
@@ -0,0 +1,46 @@
+From dadbd32c54cba409afcb38f82fe869e567533842 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 29 May 2020 13:37:40 +0200
+Subject: nvme-fc: don't call nvme_cleanup_cmd() for AENs
+
+From: Daniel Wagner <dwagner@suse.de>
+
+[ Upstream commit c9c12e51b82b2bd0c59ac4e27ee5427f382a503f ]
+
+Asynchronous event notifications do not have an associated request.
+When fcp_io() fails we unconditionally call nvme_cleanup_cmd() which
+leads to a crash.
+
+Fixes: 16686f3a6c3c ("nvme: move common call to nvme_cleanup_cmd to core layer")
+Signed-off-by: Daniel Wagner <dwagner@suse.de>
+Reviewed-by: Himanshu Madhani <hmadhani2024@gmail.com>
+Reviewed-by: Hannes Reinecke <hare@suse.de>
+Reviewed-by: James Smart <james.smart@broadcom.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/fc.c | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/nvme/host/fc.c b/drivers/nvme/host/fc.c
+index 5ef4a84c442a1..564e3f220ac79 100644
+--- a/drivers/nvme/host/fc.c
++++ b/drivers/nvme/host/fc.c
+@@ -2300,10 +2300,11 @@ nvme_fc_start_fcp_op(struct nvme_fc_ctrl *ctrl, struct nvme_fc_queue *queue,
+               opstate = atomic_xchg(&op->state, FCPOP_STATE_COMPLETE);
+               __nvme_fc_fcpop_chk_teardowns(ctrl, op, opstate);
+-              if (!(op->flags & FCOP_FLAGS_AEN))
++              if (!(op->flags & FCOP_FLAGS_AEN)) {
+                       nvme_fc_unmap_data(ctrl, op->rq, op);
++                      nvme_cleanup_cmd(op->rq);
++              }
+-              nvme_cleanup_cmd(op->rq);
+               nvme_fc_ctrl_put(ctrl);
+               if (ctrl->rport->remoteport.port_state == FC_OBJSTATE_ONLINE &&
+-- 
+2.25.1
+
diff --git a/queue-5.7/nvme-pci-use-simple-suspend-when-a-hmb-is-enabled.patch b/queue-5.7/nvme-pci-use-simple-suspend-when-a-hmb-is-enabled.patch
new file mode 100644 (file)
index 0000000..eb907a6
--- /dev/null
@@ -0,0 +1,46 @@
+From 38c3f45e173c2936c94395f8dabe3a3d301d47ab Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 3 Jun 2020 08:24:17 +0200
+Subject: nvme-pci: use simple suspend when a HMB is enabled
+
+From: Christoph Hellwig <hch@lst.de>
+
+[ Upstream commit b97120b15ebd3de51325084136d3b9c3cce656d6 ]
+
+While the NVMe specification allows the device to access the host memory
+buffer in host DRAM from all power states, hosts will fail access to
+DRAM during S3 and similar power states.
+
+Fixes: d916b1be94b6 ("nvme-pci: use host managed power state for suspend")
+Signed-off-by: Christoph Hellwig <hch@lst.de>
+Reviewed-by: Keith Busch <kbusch@kernel.org>
+Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
+Signed-off-by: Jens Axboe <axboe@kernel.dk>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/nvme/host/pci.c | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c
+index 076bdd90c9224..4ad629eb3bc66 100644
+--- a/drivers/nvme/host/pci.c
++++ b/drivers/nvme/host/pci.c
+@@ -2958,9 +2958,15 @@ static int nvme_suspend(struct device *dev)
+        * the PCI bus layer to put it into D3 in order to take the PCIe link
+        * down, so as to allow the platform to achieve its minimum low-power
+        * state (which may not be possible if the link is up).
++       *
++       * If a host memory buffer is enabled, shut down the device as the NVMe
++       * specification allows the device to access the host memory buffer in
++       * host DRAM from all power states, but hosts will fail access to DRAM
++       * during S3.
+        */
+       if (pm_suspend_via_firmware() || !ctrl->npss ||
+           !pcie_aspm_enabled(pdev) ||
++          ndev->nr_host_mem_descs ||
+           (ndev->ctrl.quirks & NVME_QUIRK_SIMPLE_SUSPEND))
+               return nvme_disable_prepare_reset(ndev, true);
+-- 
+2.25.1
+
diff --git a/queue-5.7/nvmem-ensure-sysfs-writes-handle-write-protect-pin.patch b/queue-5.7/nvmem-ensure-sysfs-writes-handle-write-protect-pin.patch
new file mode 100644 (file)
index 0000000..38499b2
--- /dev/null
@@ -0,0 +1,120 @@
+From 66453f63fd3adedeb987bf9b6b3438833e6e6778 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 11 May 2020 15:50:41 +0100
+Subject: nvmem: ensure sysfs writes handle write-protect pin
+
+From: Michael Auchter <michael.auchter@ni.com>
+
+[ Upstream commit b96fc5416b099a0c2509ca07a80b140d34db2b9b ]
+
+Commit 2a127da461a9 ("nvmem: add support for the write-protect pin")
+added support for handling write-protect pins to the nvmem core, and
+Commit 1c89074bf850 ("eeprom: at24: remove the write-protect pin support")
+retrofitted the at24 driver to use this support.
+
+These changes broke write() on the nvmem sysfs attribute for eeproms
+which utilize a write-protect pin, as the write callback invokes the
+nvmem device's reg_write callback directly which no longer handles
+changing the state of the write-protect pin.
+
+Change the read and write callbacks for the sysfs attribute to invoke
+nvmme_reg_read/nvmem_reg_write helpers which handle this, rather than
+calling reg_read/reg_write directly.
+
+Fixes: 2a127da461a9 ("nvmem: add support for the write-protect pin")
+Signed-off-by: Michael Auchter <michael.auchter@ni.com>
+Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
+Link: https://lore.kernel.org/r/20200511145042.31223-3-srinivas.kandagatla@linaro.org
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/nvmem/core.c | 52 ++++++++++++++++++++++----------------------
+ 1 file changed, 26 insertions(+), 26 deletions(-)
+
+diff --git a/drivers/nvmem/core.c b/drivers/nvmem/core.c
+index 05c6ae4b0b973..a8300202a7fbb 100644
+--- a/drivers/nvmem/core.c
++++ b/drivers/nvmem/core.c
+@@ -66,6 +66,30 @@ static LIST_HEAD(nvmem_lookup_list);
+ static BLOCKING_NOTIFIER_HEAD(nvmem_notifier);
++static int nvmem_reg_read(struct nvmem_device *nvmem, unsigned int offset,
++                        void *val, size_t bytes)
++{
++      if (nvmem->reg_read)
++              return nvmem->reg_read(nvmem->priv, offset, val, bytes);
++
++      return -EINVAL;
++}
++
++static int nvmem_reg_write(struct nvmem_device *nvmem, unsigned int offset,
++                         void *val, size_t bytes)
++{
++      int ret;
++
++      if (nvmem->reg_write) {
++              gpiod_set_value_cansleep(nvmem->wp_gpio, 0);
++              ret = nvmem->reg_write(nvmem->priv, offset, val, bytes);
++              gpiod_set_value_cansleep(nvmem->wp_gpio, 1);
++              return ret;
++      }
++
++      return -EINVAL;
++}
++
+ #ifdef CONFIG_NVMEM_SYSFS
+ static const char * const nvmem_type_str[] = {
+       [NVMEM_TYPE_UNKNOWN] = "Unknown",
+@@ -122,7 +146,7 @@ static ssize_t bin_attr_nvmem_read(struct file *filp, struct kobject *kobj,
+       if (!nvmem->reg_read)
+               return -EPERM;
+-      rc = nvmem->reg_read(nvmem->priv, pos, buf, count);
++      rc = nvmem_reg_read(nvmem, pos, buf, count);
+       if (rc)
+               return rc;
+@@ -159,7 +183,7 @@ static ssize_t bin_attr_nvmem_write(struct file *filp, struct kobject *kobj,
+       if (!nvmem->reg_write)
+               return -EPERM;
+-      rc = nvmem->reg_write(nvmem->priv, pos, buf, count);
++      rc = nvmem_reg_write(nvmem, pos, buf, count);
+       if (rc)
+               return rc;
+@@ -311,30 +335,6 @@ static void nvmem_sysfs_remove_compat(struct nvmem_device *nvmem,
+ #endif /* CONFIG_NVMEM_SYSFS */
+-static int nvmem_reg_read(struct nvmem_device *nvmem, unsigned int offset,
+-                        void *val, size_t bytes)
+-{
+-      if (nvmem->reg_read)
+-              return nvmem->reg_read(nvmem->priv, offset, val, bytes);
+-
+-      return -EINVAL;
+-}
+-
+-static int nvmem_reg_write(struct nvmem_device *nvmem, unsigned int offset,
+-                         void *val, size_t bytes)
+-{
+-      int ret;
+-
+-      if (nvmem->reg_write) {
+-              gpiod_set_value_cansleep(nvmem->wp_gpio, 0);
+-              ret = nvmem->reg_write(nvmem->priv, offset, val, bytes);
+-              gpiod_set_value_cansleep(nvmem->wp_gpio, 1);
+-              return ret;
+-      }
+-
+-      return -EINVAL;
+-}
+-
+ static void nvmem_release(struct device *dev)
+ {
+       struct nvmem_device *nvmem = to_nvmem_device(dev);
+-- 
+2.25.1
+
diff --git a/queue-5.7/of-fix-a-refcounting-bug-in-__of_attach_node_sysfs.patch b/queue-5.7/of-fix-a-refcounting-bug-in-__of_attach_node_sysfs.patch
new file mode 100644 (file)
index 0000000..528e5e1
--- /dev/null
@@ -0,0 +1,46 @@
+From 8645f1a4ad14d1638174f592da8ebd926924a577 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 20 May 2020 15:04:14 +0300
+Subject: of: Fix a refcounting bug in __of_attach_node_sysfs()
+
+From: Dan Carpenter <dan.carpenter@oracle.com>
+
+[ Upstream commit 8a325dd06f2358ea0888e4ff1c9ca4bc23bd53f3 ]
+
+The problem in this code is that if kobject_add() fails, then it should
+call of_node_put(np) to drop the reference count.  I've actually moved
+the of_node_get(np) later in the function to avoid needing to do clean
+up.
+
+Fixes: 5b2c2f5a0ea3 ("of: overlay: add missing of_node_get() in __of_attach_node_sysfs")
+Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
+Signed-off-by: Rob Herring <robh@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/of/kobj.c | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+diff --git a/drivers/of/kobj.c b/drivers/of/kobj.c
+index c72eef9880417..a32e60b024b8d 100644
+--- a/drivers/of/kobj.c
++++ b/drivers/of/kobj.c
+@@ -134,8 +134,6 @@ int __of_attach_node_sysfs(struct device_node *np)
+       if (!name)
+               return -ENOMEM;
+-      of_node_get(np);
+-
+       rc = kobject_add(&np->kobj, parent, "%s", name);
+       kfree(name);
+       if (rc)
+@@ -144,6 +142,7 @@ int __of_attach_node_sysfs(struct device_node *np)
+       for_each_property_of_node(np, pp)
+               __of_add_property_sysfs(np, pp);
++      of_node_get(np);
+       return 0;
+ }
+-- 
+2.25.1
+
diff --git a/queue-5.7/of-property-do-not-link-to-disabled-devices.patch b/queue-5.7/of-property-do-not-link-to-disabled-devices.patch
new file mode 100644 (file)
index 0000000..008f90d
--- /dev/null
@@ -0,0 +1,56 @@
+From b7a254d264a92205078f69ab4b4f3a3f3a614163 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 20 Apr 2020 14:01:02 +0200
+Subject: of: property: Do not link to disabled devices
+
+From: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
+
+[ Upstream commit 7456427af9def0fec5508dd8b861556038ee96a8 ]
+
+When creating a consumer/supplier relationship between two devices,
+make sure the supplier node is actually active. Otherwise this will
+create a link relationship that will never be fulfilled. This, in the
+worst case scenario, will hang the system during boot.
+
+Note that, in practice, the fact that a device-tree represented
+consumer/supplier relationship isn't fulfilled will not prevent devices
+from successfully probing.
+
+Fixes: a3e1d1a7f5fc ("of: property: Add functional dependency link from DT bindings")
+Signed-off-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
+Reviewed-by: Saravana Kannan <saravanak@google.com>
+Signed-off-by: Rob Herring <robh@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/of/property.c | 14 +++++++++++++-
+ 1 file changed, 13 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/of/property.c b/drivers/of/property.c
+index a8c2b13521b27..6dc542af5a70f 100644
+--- a/drivers/of/property.c
++++ b/drivers/of/property.c
+@@ -1045,8 +1045,20 @@ static int of_link_to_phandle(struct device *dev, struct device_node *sup_np,
+        * Find the device node that contains the supplier phandle.  It may be
+        * @sup_np or it may be an ancestor of @sup_np.
+        */
+-      while (sup_np && !of_find_property(sup_np, "compatible", NULL))
++      while (sup_np) {
++
++              /* Don't allow linking to a disabled supplier */
++              if (!of_device_is_available(sup_np)) {
++                      of_node_put(sup_np);
++                      sup_np = NULL;
++              }
++
++              if (of_find_property(sup_np, "compatible", NULL))
++                      break;
++
+               sup_np = of_get_next_parent(sup_np);
++      }
++
+       if (!sup_np) {
+               dev_dbg(dev, "Not linking to %pOFP - No device\n", tmp_np);
+               return -ENODEV;
+-- 
+2.25.1
+
diff --git a/queue-5.7/of-property-fix-create-device-links-for-all-child-su.patch b/queue-5.7/of-property-fix-create-device-links-for-all-child-su.patch
new file mode 100644 (file)
index 0000000..97b31e8
--- /dev/null
@@ -0,0 +1,46 @@
+From 2fd1118bf63ddc2e1ef3fbdf23de6f147c03e027 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 20 Apr 2020 14:01:01 +0200
+Subject: of: property: Fix create device links for all child-supplier
+ dependencies
+
+From: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
+
+[ Upstream commit ed3655729182a59b9bef1b564c6fc2dcbbbe954e ]
+
+Upon adding a new device from a DT node, we scan its properties and its
+children's properties in order to create a consumer/supplier
+relationship between the device and the property provider.
+
+That said, it's possible for some of the node's children to be disabled,
+which will create links that'll never be fulfilled.
+
+To get around this, use the for_each_available_child_of_node() function
+instead of for_each_available_node() when iterating over the node's
+children.
+
+Fixes: d4387cd11741 ("of: property: Create device links for all child-supplier depencencies")
+Signed-off-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
+Reviewed-by: Saravana Kannan <saravanak@google.com>
+Signed-off-by: Rob Herring <robh@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/of/property.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/of/property.c b/drivers/of/property.c
+index b4916dcc9e725..a8c2b13521b27 100644
+--- a/drivers/of/property.c
++++ b/drivers/of/property.c
+@@ -1296,7 +1296,7 @@ static int of_link_to_suppliers(struct device *dev,
+               if (of_link_property(dev, con_np, p->name))
+                       ret = -ENODEV;
+-      for_each_child_of_node(con_np, child)
++      for_each_available_child_of_node(con_np, child)
+               if (of_link_to_suppliers(dev, child) && !ret)
+                       ret = -EAGAIN;
+-- 
+2.25.1
+
diff --git a/queue-5.7/openrisc-fix-issue-with-argument-clobbering-for-clon.patch b/queue-5.7/openrisc-fix-issue-with-argument-clobbering-for-clon.patch
new file mode 100644 (file)
index 0000000..8287bb6
--- /dev/null
@@ -0,0 +1,48 @@
+From f7c17ab2a1ef679afdc74e3a831d7fc647157517 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 22 Apr 2020 20:24:11 +0900
+Subject: openrisc: Fix issue with argument clobbering for clone/fork
+
+From: Stafford Horne <shorne@gmail.com>
+
+[ Upstream commit 6bd140e14d9aaa734ec37985b8b20a96c0ece948 ]
+
+Working on the OpenRISC glibc port I found that sometimes clone was
+working strange.  That the tls data argument sent in r7 was always
+wrong.  Further investigation revealed that the arguments were getting
+clobbered in the entry code.  This patch removes the code that writes to
+the argument registers.  This was likely due to some old code hanging
+around.
+
+This patch fixes this up for clone and fork.  This fork clobber is
+harmless but also useless so remove.
+
+Signed-off-by: Stafford Horne <shorne@gmail.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/openrisc/kernel/entry.S | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/arch/openrisc/kernel/entry.S b/arch/openrisc/kernel/entry.S
+index e4a78571f8833..c6481cfc5220f 100644
+--- a/arch/openrisc/kernel/entry.S
++++ b/arch/openrisc/kernel/entry.S
+@@ -1166,13 +1166,13 @@ ENTRY(__sys_clone)
+       l.movhi r29,hi(sys_clone)
+       l.ori   r29,r29,lo(sys_clone)
+       l.j     _fork_save_extra_regs_and_call
+-       l.addi r7,r1,0
++       l.nop
+ ENTRY(__sys_fork)
+       l.movhi r29,hi(sys_fork)
+       l.ori   r29,r29,lo(sys_fork)
+       l.j     _fork_save_extra_regs_and_call
+-       l.addi r3,r1,0
++       l.nop
+ ENTRY(sys_rt_sigreturn)
+       l.jal   _sys_rt_sigreturn
+-- 
+2.25.1
+
diff --git a/queue-5.7/ovl-verify-permissions-in-ovl_path_open.patch b/queue-5.7/ovl-verify-permissions-in-ovl_path_open.patch
new file mode 100644 (file)
index 0000000..6d5f4bf
--- /dev/null
@@ -0,0 +1,72 @@
+From d01777f34c182b4f2cd6fc6bb7a6116338a954f2 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 2 Jun 2020 22:20:26 +0200
+Subject: ovl: verify permissions in ovl_path_open()
+
+From: Miklos Szeredi <mszeredi@redhat.com>
+
+[ Upstream commit 56230d956739b9cb1cbde439d76227d77979a04d ]
+
+Check permission before opening a real file.
+
+ovl_path_open() is used by readdir and copy-up routines.
+
+ovl_permission() theoretically already checked copy up permissions, but it
+doesn't hurt to re-do these checks during the actual copy-up.
+
+For directory reading ovl_permission() only checks access to topmost
+underlying layer.  Readdir on a merged directory accesses layers below the
+topmost one as well.  Permission wasn't checked for these layers.
+
+Note: modifying ovl_permission() to perform this check would be far more
+complex and hence more bug prone.  The result is less precise permissions
+returned in access(2).  If this turns out to be an issue, we can revisit
+this bug.
+
+Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/overlayfs/util.c | 27 ++++++++++++++++++++++++++-
+ 1 file changed, 26 insertions(+), 1 deletion(-)
+
+diff --git a/fs/overlayfs/util.c b/fs/overlayfs/util.c
+index 36b60788ee473..a0878039332a4 100644
+--- a/fs/overlayfs/util.c
++++ b/fs/overlayfs/util.c
+@@ -459,7 +459,32 @@ bool ovl_is_whiteout(struct dentry *dentry)
+ struct file *ovl_path_open(struct path *path, int flags)
+ {
+-      return dentry_open(path, flags | O_NOATIME, current_cred());
++      struct inode *inode = d_inode(path->dentry);
++      int err, acc_mode;
++
++      if (flags & ~(O_ACCMODE | O_LARGEFILE))
++              BUG();
++
++      switch (flags & O_ACCMODE) {
++      case O_RDONLY:
++              acc_mode = MAY_READ;
++              break;
++      case O_WRONLY:
++              acc_mode = MAY_WRITE;
++              break;
++      default:
++              BUG();
++      }
++
++      err = inode_permission(inode, acc_mode | MAY_OPEN);
++      if (err)
++              return ERR_PTR(err);
++
++      /* O_NOATIME is an optimization, don't fail if not permitted */
++      if (inode_owner_or_capable(inode))
++              flags |= O_NOATIME;
++
++      return dentry_open(path, flags, current_cred());
+ }
+ /* Caller should hold ovl_inode->lock */
+-- 
+2.25.1
+
diff --git a/queue-5.7/pci-aardvark-don-t-blindly-enable-aspm-l0s-and-don-t.patch b/queue-5.7/pci-aardvark-don-t-blindly-enable-aspm-l0s-and-don-t.patch
new file mode 100644 (file)
index 0000000..190afaa
--- /dev/null
@@ -0,0 +1,69 @@
+From fbe6ca2040171d3ebc391fd1a56f278263872615 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 30 Apr 2020 10:06:15 +0200
+Subject: PCI: aardvark: Don't blindly enable ASPM L0s and don't write to
+ read-only register
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Pali Rohár <pali@kernel.org>
+
+[ Upstream commit 90c6cb4a355e7befcb557d217d1d8b8bd5875a05 ]
+
+Trying to change Link Status register does not have any effect as this
+is a read-only register. Trying to overwrite bits for Negotiated Link
+Width does not make sense.
+
+In future proper change of link width can be done via Lane Count Select
+bits in PCIe Control 0 register.
+
+Trying to unconditionally enable ASPM L0s via ASPM Control bits in Link
+Control register is wrong. There should be at least some detection if
+endpoint supports L0s as isn't mandatory.
+
+Moreover ASPM Control bits in Link Control register are controlled by
+pcie/aspm.c code which sets it according to system ASPM settings,
+immediately after aardvark driver probes. So setting these bits by
+aardvark driver has no long running effect.
+
+Remove code which touches ASPM L0s bits from this driver and let
+kernel's ASPM implementation to set ASPM state properly.
+
+Some users are reporting issues that this code is problematic for some
+Intel wifi cards and removing it fixes them, see e.g.:
+https://bugzilla.kernel.org/show_bug.cgi?id=196339
+
+If problems with Intel wifi cards occur even after this commit, then
+pcie/aspm.c code could be modified / hooked to not enable ASPM L0s state
+for affected problematic cards.
+
+Link: https://lore.kernel.org/r/20200430080625.26070-3-pali@kernel.org
+Tested-by: Tomasz Maciej Nowak <tmn505@gmail.com>
+Signed-off-by: Pali Rohár <pali@kernel.org>
+Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
+Acked-by: Rob Herring <robh@kernel.org>
+Acked-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/pci/controller/pci-aardvark.c | 4 ----
+ 1 file changed, 4 deletions(-)
+
+diff --git a/drivers/pci/controller/pci-aardvark.c b/drivers/pci/controller/pci-aardvark.c
+index 2a20b649f40cc..3a6d07dc0a385 100644
+--- a/drivers/pci/controller/pci-aardvark.c
++++ b/drivers/pci/controller/pci-aardvark.c
+@@ -353,10 +353,6 @@ static void advk_pcie_setup_hw(struct advk_pcie *pcie)
+       advk_pcie_wait_for_link(pcie);
+-      reg = PCIE_CORE_LINK_L0S_ENTRY |
+-              (1 << PCIE_CORE_LINK_WIDTH_SHIFT);
+-      advk_writel(pcie, reg, PCIE_CORE_LINK_CTRL_STAT_REG);
+-
+       reg = advk_readl(pcie, PCIE_CORE_CMD_STATUS_REG);
+       reg |= PCIE_CORE_CMD_MEM_ACCESS_EN |
+               PCIE_CORE_CMD_IO_ACCESS_EN |
+-- 
+2.25.1
+
diff --git a/queue-5.7/pci-aardvark-improve-link-training.patch b/queue-5.7/pci-aardvark-improve-link-training.patch
new file mode 100644 (file)
index 0000000..6f6595b
--- /dev/null
@@ -0,0 +1,218 @@
+From a12c1b37410fed72710333f8121836397e0c949a Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 30 Apr 2020 10:06:17 +0200
+Subject: PCI: aardvark: Improve link training
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Marek Behún <marek.behun@nic.cz>
+
+[ Upstream commit 43fc679ced18006b12d918d7a8a4af392b7fbfe7 ]
+
+Currently the aardvark driver trains link in PCIe gen2 mode. This may
+cause some buggy gen1 cards (such as Compex WLE900VX) to be unstable or
+even not detected. Moreover when ASPM code tries to retrain link second
+time, these cards may stop responding and link goes down. If gen1 is
+used this does not happen.
+
+Unconditionally forcing gen1 is not a good solution since it may have
+performance impact on gen2 cards.
+
+To overcome this, read 'max-link-speed' property (as defined in PCI
+device tree bindings) and use this as max gen mode. Then iteratively try
+link training at this mode or lower until successful. After successful
+link training choose final controller gen based on Negotiated Link Speed
+from Link Status register, which should match card speed.
+
+Link: https://lore.kernel.org/r/20200430080625.26070-5-pali@kernel.org
+Tested-by: Tomasz Maciej Nowak <tmn505@gmail.com>
+Signed-off-by: Pali Rohár <pali@kernel.org>
+Signed-off-by: Marek Behún <marek.behun@nic.cz>
+Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
+Reviewed-by: Rob Herring <robh@kernel.org>
+Acked-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/pci/controller/pci-aardvark.c | 114 ++++++++++++++++++++------
+ 1 file changed, 89 insertions(+), 25 deletions(-)
+
+diff --git a/drivers/pci/controller/pci-aardvark.c b/drivers/pci/controller/pci-aardvark.c
+index 74b90940a9d46..e202f954eb84e 100644
+--- a/drivers/pci/controller/pci-aardvark.c
++++ b/drivers/pci/controller/pci-aardvark.c
+@@ -40,6 +40,7 @@
+ #define PCIE_CORE_LINK_CTRL_STAT_REG                          0xd0
+ #define     PCIE_CORE_LINK_L0S_ENTRY                          BIT(0)
+ #define     PCIE_CORE_LINK_TRAINING                           BIT(5)
++#define     PCIE_CORE_LINK_SPEED_SHIFT                                16
+ #define     PCIE_CORE_LINK_WIDTH_SHIFT                                20
+ #define PCIE_CORE_ERR_CAPCTL_REG                              0x118
+ #define     PCIE_CORE_ERR_CAPCTL_ECRC_CHK_TX                  BIT(5)
+@@ -201,6 +202,7 @@ struct advk_pcie {
+       struct mutex msi_used_lock;
+       u16 msi_msg;
+       int root_bus_nr;
++      int link_gen;
+       struct pci_bridge_emul bridge;
+ };
+@@ -225,20 +227,16 @@ static int advk_pcie_link_up(struct advk_pcie *pcie)
+ static int advk_pcie_wait_for_link(struct advk_pcie *pcie)
+ {
+-      struct device *dev = &pcie->pdev->dev;
+       int retries;
+       /* check if the link is up or not */
+       for (retries = 0; retries < LINK_WAIT_MAX_RETRIES; retries++) {
+-              if (advk_pcie_link_up(pcie)) {
+-                      dev_info(dev, "link up\n");
++              if (advk_pcie_link_up(pcie))
+                       return 0;
+-              }
+               usleep_range(LINK_WAIT_USLEEP_MIN, LINK_WAIT_USLEEP_MAX);
+       }
+-      dev_err(dev, "link never came up\n");
+       return -ETIMEDOUT;
+ }
+@@ -253,6 +251,85 @@ static void advk_pcie_wait_for_retrain(struct advk_pcie *pcie)
+       }
+ }
++static int advk_pcie_train_at_gen(struct advk_pcie *pcie, int gen)
++{
++      int ret, neg_gen;
++      u32 reg;
++
++      /* Setup link speed */
++      reg = advk_readl(pcie, PCIE_CORE_CTRL0_REG);
++      reg &= ~PCIE_GEN_SEL_MSK;
++      if (gen == 3)
++              reg |= SPEED_GEN_3;
++      else if (gen == 2)
++              reg |= SPEED_GEN_2;
++      else
++              reg |= SPEED_GEN_1;
++      advk_writel(pcie, reg, PCIE_CORE_CTRL0_REG);
++
++      /*
++       * Enable link training. This is not needed in every call to this
++       * function, just once suffices, but it does not break anything either.
++       */
++      reg = advk_readl(pcie, PCIE_CORE_CTRL0_REG);
++      reg |= LINK_TRAINING_EN;
++      advk_writel(pcie, reg, PCIE_CORE_CTRL0_REG);
++
++      /*
++       * Start link training immediately after enabling it.
++       * This solves problems for some buggy cards.
++       */
++      reg = advk_readl(pcie, PCIE_CORE_LINK_CTRL_STAT_REG);
++      reg |= PCIE_CORE_LINK_TRAINING;
++      advk_writel(pcie, reg, PCIE_CORE_LINK_CTRL_STAT_REG);
++
++      ret = advk_pcie_wait_for_link(pcie);
++      if (ret)
++              return ret;
++
++      reg = advk_readl(pcie, PCIE_CORE_LINK_CTRL_STAT_REG);
++      neg_gen = (reg >> PCIE_CORE_LINK_SPEED_SHIFT) & 0xf;
++
++      return neg_gen;
++}
++
++static void advk_pcie_train_link(struct advk_pcie *pcie)
++{
++      struct device *dev = &pcie->pdev->dev;
++      int neg_gen = -1, gen;
++
++      /*
++       * Try link training at link gen specified by device tree property
++       * 'max-link-speed'. If this fails, iteratively train at lower gen.
++       */
++      for (gen = pcie->link_gen; gen > 0; --gen) {
++              neg_gen = advk_pcie_train_at_gen(pcie, gen);
++              if (neg_gen > 0)
++                      break;
++      }
++
++      if (neg_gen < 0)
++              goto err;
++
++      /*
++       * After successful training if negotiated gen is lower than requested,
++       * train again on negotiated gen. This solves some stability issues for
++       * some buggy gen1 cards.
++       */
++      if (neg_gen < gen) {
++              gen = neg_gen;
++              neg_gen = advk_pcie_train_at_gen(pcie, gen);
++      }
++
++      if (neg_gen == gen) {
++              dev_info(dev, "link up at gen %i\n", gen);
++              return;
++      }
++
++err:
++      dev_err(dev, "link never came up\n");
++}
++
+ static void advk_pcie_setup_hw(struct advk_pcie *pcie)
+ {
+       u32 reg;
+@@ -288,12 +365,6 @@ static void advk_pcie_setup_hw(struct advk_pcie *pcie)
+               PCIE_CORE_CTRL2_TD_ENABLE;
+       advk_writel(pcie, reg, PCIE_CORE_CTRL2_REG);
+-      /* Set GEN2 */
+-      reg = advk_readl(pcie, PCIE_CORE_CTRL0_REG);
+-      reg &= ~PCIE_GEN_SEL_MSK;
+-      reg |= SPEED_GEN_2;
+-      advk_writel(pcie, reg, PCIE_CORE_CTRL0_REG);
+-
+       /* Set lane X1 */
+       reg = advk_readl(pcie, PCIE_CORE_CTRL0_REG);
+       reg &= ~LANE_CNT_MSK;
+@@ -341,20 +412,7 @@ static void advk_pcie_setup_hw(struct advk_pcie *pcie)
+        */
+       msleep(PCI_PM_D3COLD_WAIT);
+-      /* Enable link training */
+-      reg = advk_readl(pcie, PCIE_CORE_CTRL0_REG);
+-      reg |= LINK_TRAINING_EN;
+-      advk_writel(pcie, reg, PCIE_CORE_CTRL0_REG);
+-
+-      /*
+-       * Start link training immediately after enabling it.
+-       * This solves problems for some buggy cards.
+-       */
+-      reg = advk_readl(pcie, PCIE_CORE_LINK_CTRL_STAT_REG);
+-      reg |= PCIE_CORE_LINK_TRAINING;
+-      advk_writel(pcie, reg, PCIE_CORE_LINK_CTRL_STAT_REG);
+-
+-      advk_pcie_wait_for_link(pcie);
++      advk_pcie_train_link(pcie);
+       reg = advk_readl(pcie, PCIE_CORE_CMD_STATUS_REG);
+       reg |= PCIE_CORE_CMD_MEM_ACCESS_EN |
+@@ -988,6 +1046,12 @@ static int advk_pcie_probe(struct platform_device *pdev)
+       }
+       pcie->root_bus_nr = bus->start;
++      ret = of_pci_get_max_link_speed(dev->of_node);
++      if (ret <= 0 || ret > 3)
++              pcie->link_gen = 3;
++      else
++              pcie->link_gen = ret;
++
+       advk_pcie_setup_hw(pcie);
+       advk_sw_pci_bridge_init(pcie);
+-- 
+2.25.1
+
diff --git a/queue-5.7/pci-aardvark-issue-perst-via-gpio.patch b/queue-5.7/pci-aardvark-issue-perst-via-gpio.patch
new file mode 100644 (file)
index 0000000..2c34cfa
--- /dev/null
@@ -0,0 +1,133 @@
+From 70e91b4bd5eb02eb2b04040758dd20e3c78a4967 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 30 Apr 2020 10:06:18 +0200
+Subject: PCI: aardvark: Issue PERST via GPIO
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Pali Rohár <pali@kernel.org>
+
+[ Upstream commit 5169a9851daaa2782a7bd2bb83d5b1bd224b2879 ]
+
+Add support for issuing PERST via GPIO specified in 'reset-gpios'
+property (as described in PCI device tree bindings).
+
+Some buggy cards (e.g. Compex WLE900VX or WLE1216) are not detected
+after reboot when PERST is not issued during driver initialization.
+
+If bootloader already enabled link training then issuing PERST has no
+effect for some buggy cards (e.g. Compex WLE900VX) and these cards are
+not detected. We therefore clear the LINK_TRAINING_EN register before.
+
+It was observed that Compex WLE900VX card needs to be in PERST reset
+for at least 10ms if bootloader enabled link training.
+
+Tested on Turris MOX.
+
+Link: https://lore.kernel.org/r/20200430080625.26070-6-pali@kernel.org
+Tested-by: Tomasz Maciej Nowak <tmn505@gmail.com>
+Signed-off-by: Pali Rohár <pali@kernel.org>
+Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
+Acked-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/pci/controller/pci-aardvark.c | 43 ++++++++++++++++++++++++++-
+ 1 file changed, 42 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/pci/controller/pci-aardvark.c b/drivers/pci/controller/pci-aardvark.c
+index e202f954eb84e..2ecc79c03ade1 100644
+--- a/drivers/pci/controller/pci-aardvark.c
++++ b/drivers/pci/controller/pci-aardvark.c
+@@ -9,6 +9,7 @@
+  */
+ #include <linux/delay.h>
++#include <linux/gpio.h>
+ #include <linux/interrupt.h>
+ #include <linux/irq.h>
+ #include <linux/irqdomain.h>
+@@ -18,6 +19,7 @@
+ #include <linux/platform_device.h>
+ #include <linux/msi.h>
+ #include <linux/of_address.h>
++#include <linux/of_gpio.h>
+ #include <linux/of_pci.h>
+ #include "../pci.h"
+@@ -204,6 +206,7 @@ struct advk_pcie {
+       int root_bus_nr;
+       int link_gen;
+       struct pci_bridge_emul bridge;
++      struct gpio_desc *reset_gpio;
+ };
+ static inline void advk_writel(struct advk_pcie *pcie, u32 val, u64 reg)
+@@ -330,10 +333,31 @@ err:
+       dev_err(dev, "link never came up\n");
+ }
++static void advk_pcie_issue_perst(struct advk_pcie *pcie)
++{
++      u32 reg;
++
++      if (!pcie->reset_gpio)
++              return;
++
++      /* PERST does not work for some cards when link training is enabled */
++      reg = advk_readl(pcie, PCIE_CORE_CTRL0_REG);
++      reg &= ~LINK_TRAINING_EN;
++      advk_writel(pcie, reg, PCIE_CORE_CTRL0_REG);
++
++      /* 10ms delay is needed for some cards */
++      dev_info(&pcie->pdev->dev, "issuing PERST via reset GPIO for 10ms\n");
++      gpiod_set_value_cansleep(pcie->reset_gpio, 1);
++      usleep_range(10000, 11000);
++      gpiod_set_value_cansleep(pcie->reset_gpio, 0);
++}
++
+ static void advk_pcie_setup_hw(struct advk_pcie *pcie)
+ {
+       u32 reg;
++      advk_pcie_issue_perst(pcie);
++
+       /* Set to Direct mode */
+       reg = advk_readl(pcie, CTRL_CONFIG_REG);
+       reg &= ~(CTRL_MODE_MASK << CTRL_MODE_SHIFT);
+@@ -406,7 +430,8 @@ static void advk_pcie_setup_hw(struct advk_pcie *pcie)
+       /*
+        * PERST# signal could have been asserted by pinctrl subsystem before
+-       * probe() callback has been called, making the endpoint going into
++       * probe() callback has been called or issued explicitly by reset gpio
++       * function advk_pcie_issue_perst(), making the endpoint going into
+        * fundamental reset. As required by PCI Express spec a delay for at
+        * least 100ms after such a reset before link training is needed.
+        */
+@@ -1046,6 +1071,22 @@ static int advk_pcie_probe(struct platform_device *pdev)
+       }
+       pcie->root_bus_nr = bus->start;
++      pcie->reset_gpio = devm_gpiod_get_from_of_node(dev, dev->of_node,
++                                                     "reset-gpios", 0,
++                                                     GPIOD_OUT_LOW,
++                                                     "pcie1-reset");
++      ret = PTR_ERR_OR_ZERO(pcie->reset_gpio);
++      if (ret) {
++              if (ret == -ENOENT) {
++                      pcie->reset_gpio = NULL;
++              } else {
++                      if (ret != -EPROBE_DEFER)
++                              dev_err(dev, "Failed to get reset-gpio: %i\n",
++                                      ret);
++                      return ret;
++              }
++      }
++
+       ret = of_pci_get_max_link_speed(dev->of_node);
+       if (ret <= 0 || ret > 3)
+               pcie->link_gen = 3;
+-- 
+2.25.1
+
diff --git a/queue-5.7/pci-aardvark-train-link-immediately-after-enabling-t.patch b/queue-5.7/pci-aardvark-train-link-immediately-after-enabling-t.patch
new file mode 100644 (file)
index 0000000..101c8f3
--- /dev/null
@@ -0,0 +1,70 @@
+From f0c3fe9cbfbcd8d6c71cf8820a81e2beaa5a52b1 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 30 Apr 2020 10:06:14 +0200
+Subject: PCI: aardvark: Train link immediately after enabling training
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Pali Rohár <pali@kernel.org>
+
+[ Upstream commit 6964494582f56a3882c2c53b0edbfe99eb32b2e1 ]
+
+Adding even 100ms (PCI_PM_D3COLD_WAIT) delay between enabling link
+training and starting link training causes detection issues with some
+buggy cards (such as Compex WLE900VX).
+
+Move the code which enables link training immediately before the one
+which starts link traning.
+
+This fixes detection issues of Compex WLE900VX card on Turris MOX after
+cold boot.
+
+Link: https://lore.kernel.org/r/20200430080625.26070-2-pali@kernel.org
+Fixes: f4c7d053d7f7 ("PCI: aardvark: Wait for endpoint to be ready...")
+Tested-by: Tomasz Maciej Nowak <tmn505@gmail.com>
+Signed-off-by: Pali Rohár <pali@kernel.org>
+Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
+Acked-by: Rob Herring <robh@kernel.org>
+Acked-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/pci/controller/pci-aardvark.c | 15 +++++++++------
+ 1 file changed, 9 insertions(+), 6 deletions(-)
+
+diff --git a/drivers/pci/controller/pci-aardvark.c b/drivers/pci/controller/pci-aardvark.c
+index 3a6d07dc0a385..74b90940a9d46 100644
+--- a/drivers/pci/controller/pci-aardvark.c
++++ b/drivers/pci/controller/pci-aardvark.c
+@@ -300,11 +300,6 @@ static void advk_pcie_setup_hw(struct advk_pcie *pcie)
+       reg |= LANE_COUNT_1;
+       advk_writel(pcie, reg, PCIE_CORE_CTRL0_REG);
+-      /* Enable link training */
+-      reg = advk_readl(pcie, PCIE_CORE_CTRL0_REG);
+-      reg |= LINK_TRAINING_EN;
+-      advk_writel(pcie, reg, PCIE_CORE_CTRL0_REG);
+-
+       /* Enable MSI */
+       reg = advk_readl(pcie, PCIE_CORE_CTRL2_REG);
+       reg |= PCIE_CORE_CTRL2_MSI_ENABLE;
+@@ -346,7 +341,15 @@ static void advk_pcie_setup_hw(struct advk_pcie *pcie)
+        */
+       msleep(PCI_PM_D3COLD_WAIT);
+-      /* Start link training */
++      /* Enable link training */
++      reg = advk_readl(pcie, PCIE_CORE_CTRL0_REG);
++      reg |= LINK_TRAINING_EN;
++      advk_writel(pcie, reg, PCIE_CORE_CTRL0_REG);
++
++      /*
++       * Start link training immediately after enabling it.
++       * This solves problems for some buggy cards.
++       */
+       reg = advk_readl(pcie, PCIE_CORE_LINK_CTRL_STAT_REG);
+       reg |= PCIE_CORE_LINK_TRAINING;
+       advk_writel(pcie, reg, PCIE_CORE_LINK_CTRL_STAT_REG);
+-- 
+2.25.1
+
diff --git a/queue-5.7/pci-allow-pci_resize_resource-for-devices-on-root-bu.patch b/queue-5.7/pci-allow-pci_resize_resource-for-devices-on-root-bu.patch
new file mode 100644 (file)
index 0000000..f424c84
--- /dev/null
@@ -0,0 +1,56 @@
+From bec1ad81890f23683ee04e6b633951391e276f19 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 21 Apr 2020 18:22:56 +0200
+Subject: PCI: Allow pci_resize_resource() for devices on root bus
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Ard Biesheuvel <ardb@kernel.org>
+
+[ Upstream commit d09ddd8190fbdc07696bf34b548ae15aa1816714 ]
+
+When resizing a BAR, pci_reassign_bridge_resources() is invoked to bring
+the bridge windows of parent bridges in line with the new BAR assignment.
+
+This assumes the device whose BAR is being resized lives on a subordinate
+bus, but this is not necessarily the case. A device may live on the root
+bus, in which case dev->bus->self is NULL, and passing a NULL pci_dev
+pointer to pci_reassign_bridge_resources() will cause it to crash.
+
+So let's make the call to pci_reassign_bridge_resources() conditional on
+whether dev->bus->self is non-NULL in the first place.
+
+Fixes: 8bb705e3e79d84e7 ("PCI: Add pci_resize_resource() for resizing BARs")
+Link: https://lore.kernel.org/r/20200421162256.26887-1-ardb@kernel.org
+Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
+Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
+Reviewed-by: Christian König <christian.koenig@amd.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/pci/setup-res.c | 9 +++++----
+ 1 file changed, 5 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/pci/setup-res.c b/drivers/pci/setup-res.c
+index d8ca40a976934..d21fa04fa44d2 100644
+--- a/drivers/pci/setup-res.c
++++ b/drivers/pci/setup-res.c
+@@ -439,10 +439,11 @@ int pci_resize_resource(struct pci_dev *dev, int resno, int size)
+       res->end = res->start + pci_rebar_size_to_bytes(size) - 1;
+       /* Check if the new config works by trying to assign everything. */
+-      ret = pci_reassign_bridge_resources(dev->bus->self, res->flags);
+-      if (ret)
+-              goto error_resize;
+-
++      if (dev->bus->self) {
++              ret = pci_reassign_bridge_resources(dev->bus->self, res->flags);
++              if (ret)
++                      goto error_resize;
++      }
+       return 0;
+ error_resize:
+-- 
+2.25.1
+
diff --git a/queue-5.7/pci-amlogic-meson-don-t-use-fast_link_mode-to-set-up.patch b/queue-5.7/pci-amlogic-meson-don-t-use-fast_link_mode-to-set-up.patch
new file mode 100644 (file)
index 0000000..d07bfe0
--- /dev/null
@@ -0,0 +1,57 @@
+From 02f9cce02f147b3dcd8725b361a8c892b2f34f87 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 29 Apr 2020 17:42:30 +0100
+Subject: PCI: amlogic: meson: Don't use FAST_LINK_MODE to set up link
+
+From: Marc Zyngier <maz@kernel.org>
+
+[ Upstream commit 87dccf09323fc363bd0d072fcc12b96622ab8c69 ]
+
+The vim3l board does not work with a standard PCIe switch (ASM1184e),
+spitting all kind of errors - hinting at HW misconfiguration (no link,
+port enumeration issues, etc).
+
+According to the the Synopsys DWC PCIe Reference Manual, in the section
+dedicated to the PLCR register, bit 7 is described (FAST_LINK_MODE) as:
+
+"Sets all internal timers to fast mode for simulation purposes."
+
+it is sound to set this bit from a simulation perspective, but on actual
+silicon, which expects timers to have a nominal value, it is not.
+
+Make sure the FAST_LINK_MODE bit is cleared when configuring the RC
+to solve this problem.
+
+Link: https://lore.kernel.org/r/20200429164230.309922-1-maz@kernel.org
+Fixes: 9c0ef6d34fdb ("PCI: amlogic: Add the Amlogic Meson PCIe controller driver")
+Signed-off-by: Marc Zyngier <maz@kernel.org>
+[lorenzo.pieralisi@arm.com: commit log]
+Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
+Reviewed-by: Neil Armstrong <narmstrong@baylibre.com>
+Acked-by: Rob Herring <robh@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/pci/controller/dwc/pci-meson.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/pci/controller/dwc/pci-meson.c b/drivers/pci/controller/dwc/pci-meson.c
+index 3715dceca1bfa..ca59ba9e0ecd3 100644
+--- a/drivers/pci/controller/dwc/pci-meson.c
++++ b/drivers/pci/controller/dwc/pci-meson.c
+@@ -289,11 +289,11 @@ static void meson_pcie_init_dw(struct meson_pcie *mp)
+       meson_cfg_writel(mp, val, PCIE_CFG0);
+       val = meson_elb_readl(mp, PCIE_PORT_LINK_CTRL_OFF);
+-      val &= ~LINK_CAPABLE_MASK;
++      val &= ~(LINK_CAPABLE_MASK | FAST_LINK_MODE);
+       meson_elb_writel(mp, val, PCIE_PORT_LINK_CTRL_OFF);
+       val = meson_elb_readl(mp, PCIE_PORT_LINK_CTRL_OFF);
+-      val |= LINK_CAPABLE_X1 | FAST_LINK_MODE;
++      val |= LINK_CAPABLE_X1;
+       meson_elb_writel(mp, val, PCIE_PORT_LINK_CTRL_OFF);
+       val = meson_elb_readl(mp, PCIE_GEN2_CTRL_OFF);
+-- 
+2.25.1
+
diff --git a/queue-5.7/pci-aspm-allow-aspm-on-links-to-pcie-to-pci-pci-x-br.patch b/queue-5.7/pci-aspm-allow-aspm-on-links-to-pcie-to-pci-pci-x-br.patch
new file mode 100644 (file)
index 0000000..bb1528a
--- /dev/null
@@ -0,0 +1,55 @@
+From 58cc8f9608b36a633431010b5474dc0a61f1476e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 6 May 2020 01:34:21 +0800
+Subject: PCI/ASPM: Allow ASPM on links to PCIe-to-PCI/PCI-X Bridges
+
+From: Kai-Heng Feng <kai.heng.feng@canonical.com>
+
+[ Upstream commit 66ff14e59e8a30690755b08bc3042359703fb07a ]
+
+7d715a6c1ae5 ("PCI: add PCI Express ASPM support") added the ability for
+Linux to enable ASPM, but for some undocumented reason, it didn't enable
+ASPM on links where the downstream component is a PCIe-to-PCI/PCI-X Bridge.
+
+Remove this exclusion so we can enable ASPM on these links.
+
+The Dell OptiPlex 7080 mentioned in the bugzilla has a TI XIO2001
+PCIe-to-PCI Bridge.  Enabling ASPM on the link leading to it allows the
+Intel SoC to enter deeper Package C-states, which is a significant power
+savings.
+
+[bhelgaas: commit log]
+Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=207571
+Link: https://lore.kernel.org/r/20200505173423.26968-1-kai.heng.feng@canonical.com
+Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
+Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
+Reviewed-by: Mika Westerberg <mika.westerberg@linux.intel.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/pci/pcie/aspm.c | 10 ----------
+ 1 file changed, 10 deletions(-)
+
+diff --git a/drivers/pci/pcie/aspm.c b/drivers/pci/pcie/aspm.c
+index 2378ed6925346..b17e5ffd31b14 100644
+--- a/drivers/pci/pcie/aspm.c
++++ b/drivers/pci/pcie/aspm.c
+@@ -628,16 +628,6 @@ static void pcie_aspm_cap_init(struct pcie_link_state *link, int blacklist)
+       /* Setup initial capable state. Will be updated later */
+       link->aspm_capable = link->aspm_support;
+-      /*
+-       * If the downstream component has pci bridge function, don't
+-       * do ASPM for now.
+-       */
+-      list_for_each_entry(child, &linkbus->devices, bus_list) {
+-              if (pci_pcie_type(child) == PCI_EXP_TYPE_PCI_BRIDGE) {
+-                      link->aspm_disable = ASPM_STATE_ALL;
+-                      break;
+-              }
+-      }
+       /* Get and check endpoint acceptable latencies */
+       list_for_each_entry(child, &linkbus->devices, bus_list) {
+-- 
+2.25.1
+
diff --git a/queue-5.7/pci-brcmstb-assert-fundamental-reset-on-initializati.patch b/queue-5.7/pci-brcmstb-assert-fundamental-reset-on-initializati.patch
new file mode 100644 (file)
index 0000000..3627cb4
--- /dev/null
@@ -0,0 +1,40 @@
+From 0bd531491954767598bc714ae49a83cb32d4533c Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 7 May 2020 19:20:20 +0200
+Subject: PCI: brcmstb: Assert fundamental reset on initialization
+
+From: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
+
+[ Upstream commit 22e21e51ce755399fd42055a3f668ee4af370881 ]
+
+While preparing the driver for upstream this detail was missed.
+
+If not asserted during the initialization process, devices connected on
+the bus will not be made aware of the internal reset happening. This,
+potentially resulting in unexpected behavior.
+
+Link: https://lore.kernel.org/r/20200507172020.18000-1-nsaenzjulienne@suse.de
+Fixes: c0452137034b ("PCI: brcmstb: Add Broadcom STB PCIe host controller driver")
+Signed-off-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
+Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
+Acked-by: Florian Fainelli <f.fainelli@gmail.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/pci/controller/pcie-brcmstb.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/pci/controller/pcie-brcmstb.c b/drivers/pci/controller/pcie-brcmstb.c
+index c9ecc4d639c19..2297910bf6e47 100644
+--- a/drivers/pci/controller/pcie-brcmstb.c
++++ b/drivers/pci/controller/pcie-brcmstb.c
+@@ -697,6 +697,7 @@ static int brcm_pcie_setup(struct brcm_pcie *pcie)
+       /* Reset the bridge */
+       brcm_pcie_bridge_sw_init_set(pcie, 1);
++      brcm_pcie_perst_set(pcie, 1);
+       usleep_range(100, 200);
+-- 
+2.25.1
+
diff --git a/queue-5.7/pci-brcmstb-fix-window-register-offset-from-4-to-8.patch b/queue-5.7/pci-brcmstb-fix-window-register-offset-from-4-to-8.patch
new file mode 100644 (file)
index 0000000..80329fe
--- /dev/null
@@ -0,0 +1,45 @@
+From 3307ea2deab25f3bfaee0bc1ee9fce93ce63a763 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 7 May 2020 16:15:41 -0400
+Subject: PCI: brcmstb: Fix window register offset from 4 to 8
+
+From: Jim Quinlan <jquinlan@broadcom.com>
+
+[ Upstream commit 077a4fa92a615a4d0f86eae68d777b9dd5e5a95b ]
+
+The outbound memory window registers were being referenced
+with an incorrect stride offset.  This probably wasn't noticed
+previously as there was likely only one such window employed.
+
+Link: https://lore.kernel.org/r/20200507201544.43432-3-james.quinlan@broadcom.com
+Fixes: c0452137034b ("PCI: brcmstb: Add Broadcom STB PCIe host controller driver")
+Signed-off-by: Jim Quinlan <jquinlan@broadcom.com>
+Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
+Acked-by: Florian Fainelli <f.fainelli@gmail.com>
+Acked-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/pci/controller/pcie-brcmstb.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/pci/controller/pcie-brcmstb.c b/drivers/pci/controller/pcie-brcmstb.c
+index 6d79d14527a66..c9ecc4d639c19 100644
+--- a/drivers/pci/controller/pcie-brcmstb.c
++++ b/drivers/pci/controller/pcie-brcmstb.c
+@@ -54,11 +54,11 @@
+ #define PCIE_MISC_CPU_2_PCIE_MEM_WIN0_LO              0x400c
+ #define PCIE_MEM_WIN0_LO(win) \
+-              PCIE_MISC_CPU_2_PCIE_MEM_WIN0_LO + ((win) * 4)
++              PCIE_MISC_CPU_2_PCIE_MEM_WIN0_LO + ((win) * 8)
+ #define PCIE_MISC_CPU_2_PCIE_MEM_WIN0_HI              0x4010
+ #define PCIE_MEM_WIN0_HI(win) \
+-              PCIE_MISC_CPU_2_PCIE_MEM_WIN0_HI + ((win) * 4)
++              PCIE_MISC_CPU_2_PCIE_MEM_WIN0_HI + ((win) * 8)
+ #define PCIE_MISC_RC_BAR1_CONFIG_LO                   0x402c
+ #define  PCIE_MISC_RC_BAR1_CONFIG_LO_SIZE_MASK                0x1f
+-- 
+2.25.1
+
diff --git a/queue-5.7/pci-dwc-fix-inner-msi-irq-domain-registration.patch b/queue-5.7/pci-dwc-fix-inner-msi-irq-domain-registration.patch
new file mode 100644 (file)
index 0000000..94075ac
--- /dev/null
@@ -0,0 +1,48 @@
+From 319e19f466a8523545179d8231290a3ea2985f40 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 1 May 2020 12:39:21 +0100
+Subject: PCI: dwc: Fix inner MSI IRQ domain registration
+
+From: Marc Zyngier <maz@kernel.org>
+
+[ Upstream commit 0414b93e78d87ecc24ae1a7e61fe97deb29fa2f4 ]
+
+On a system that uses the internal DWC MSI widget, I get this
+warning from debugfs when CONFIG_GENERIC_IRQ_DEBUGFS is selected:
+
+  debugfs: File ':soc:pcie@fc000000' in directory 'domains' already present!
+
+This is due to the fact that the DWC MSI code tries to register two
+IRQ domains for the same firmware node, without telling the low
+level code how to distinguish them (by setting a bus token). This
+further confuses debugfs which tries to create corresponding
+files for each domain.
+
+Fix it by tagging the inner domain as DOMAIN_BUS_NEXUS, which is
+the closest thing we have as to "generic MSI".
+
+Link: https://lore.kernel.org/r/20200501113921.366597-1-maz@kernel.org
+Signed-off-by: Marc Zyngier <maz@kernel.org>
+Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
+Acked-by: Jingoo Han <jingoohan1@gmail.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/pci/controller/dwc/pcie-designware-host.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/drivers/pci/controller/dwc/pcie-designware-host.c b/drivers/pci/controller/dwc/pcie-designware-host.c
+index 395feb8ca0512..3c43311bb95c6 100644
+--- a/drivers/pci/controller/dwc/pcie-designware-host.c
++++ b/drivers/pci/controller/dwc/pcie-designware-host.c
+@@ -264,6 +264,8 @@ int dw_pcie_allocate_domains(struct pcie_port *pp)
+               return -ENOMEM;
+       }
++      irq_domain_update_bus_token(pp->irq_domain, DOMAIN_BUS_NEXUS);
++
+       pp->msi_domain = pci_msi_create_irq_domain(fwnode,
+                                                  &dw_pcie_msi_domain_info,
+                                                  pp->irq_domain);
+-- 
+2.25.1
+
diff --git a/queue-5.7/pci-dwc-pci-dra7xx-use-devm_platform_ioremap_resourc.patch b/queue-5.7/pci-dwc-pci-dra7xx-use-devm_platform_ioremap_resourc.patch
new file mode 100644 (file)
index 0000000..314b223
--- /dev/null
@@ -0,0 +1,52 @@
+From ac963deabfd83d22e0c0f13e757f8284dbe2a35c Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 29 Apr 2020 01:50:27 +0000
+Subject: PCI: dwc: pci-dra7xx: Use devm_platform_ioremap_resource_byname()
+
+From: Wei Yongjun <weiyongjun1@huawei.com>
+
+[ Upstream commit c8a119779f5609de8dcd98630f71cc7f1b2e4e8c ]
+
+platform_get_resource() may fail and return NULL, so we had better
+check its return value to avoid a NULL pointer dereference a bit later
+in the code. Fix it to use devm_platform_ioremap_resource_byname()
+instead of calling platform_get_resource_byname() and devm_ioremap().
+
+Link: https://lore.kernel.org/r/20200429015027.134485-1-weiyongjun1@huawei.com
+Signed-off-by: Wei Yongjun <weiyongjun1@huawei.com>
+[lorenzo.pieralisi@arm.com: commit log]
+Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/pci/controller/dwc/pci-dra7xx.c | 8 +++-----
+ 1 file changed, 3 insertions(+), 5 deletions(-)
+
+diff --git a/drivers/pci/controller/dwc/pci-dra7xx.c b/drivers/pci/controller/dwc/pci-dra7xx.c
+index 3b0e58f2de588..6184ebc9392db 100644
+--- a/drivers/pci/controller/dwc/pci-dra7xx.c
++++ b/drivers/pci/controller/dwc/pci-dra7xx.c
+@@ -840,7 +840,6 @@ static int __init dra7xx_pcie_probe(struct platform_device *pdev)
+       struct phy **phy;
+       struct device_link **link;
+       void __iomem *base;
+-      struct resource *res;
+       struct dw_pcie *pci;
+       struct dra7xx_pcie *dra7xx;
+       struct device *dev = &pdev->dev;
+@@ -877,10 +876,9 @@ static int __init dra7xx_pcie_probe(struct platform_device *pdev)
+               return irq;
+       }
+-      res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "ti_conf");
+-      base = devm_ioremap(dev, res->start, resource_size(res));
+-      if (!base)
+-              return -ENOMEM;
++      base = devm_platform_ioremap_resource_byname(pdev, "ti_conf");
++      if (IS_ERR(base))
++              return PTR_ERR(base);
+       phy_count = of_property_count_strings(np, "phy-names");
+       if (phy_count < 0) {
+-- 
+2.25.1
+
diff --git a/queue-5.7/pci-endpoint-functions-pci-epf-test-fix-dma-channel-.patch b/queue-5.7/pci-endpoint-functions-pci-epf-test-fix-dma-channel-.patch
new file mode 100644 (file)
index 0000000..0aeb440
--- /dev/null
@@ -0,0 +1,46 @@
+From ac08791f3a853e3a5889310e1077f4a5f68147b9 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 22 Apr 2020 16:24:47 +0900
+Subject: PCI: endpoint: functions/pci-epf-test: Fix DMA channel release
+
+From: Kunihiko Hayashi <hayashi.kunihiko@socionext.com>
+
+[ Upstream commit 0e86d981f9b7252e9716c5137cd8e4d9ad8ef32f ]
+
+When unbinding pci_epf_test, pci_epf_test_clean_dma_chan() is called in
+pci_epf_test_unbind() even though epf_test->dma_supported is false.
+
+As a result, dma_release_channel() will trigger a NULL pointer
+dereference because dma_chan is not set.
+
+Avoid calling dma_release_channel() if epf_test->dma_supported
+is false.
+
+Link: https://lore.kernel.org/r/1587540287-10458-1-git-send-email-hayashi.kunihiko@socionext.com
+Fixes: 5ebf3fc59bd2 ("PCI: endpoint: functions/pci-epf-test: Add DMA support to transfer data")
+Signed-off-by: Kunihiko Hayashi <hayashi.kunihiko@socionext.com>
+[lorenzo.pieralisi@arm.com: commit log]
+Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.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 | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/drivers/pci/endpoint/functions/pci-epf-test.c b/drivers/pci/endpoint/functions/pci-epf-test.c
+index 60330f3e37516..c89a9561439f9 100644
+--- a/drivers/pci/endpoint/functions/pci-epf-test.c
++++ b/drivers/pci/endpoint/functions/pci-epf-test.c
+@@ -187,6 +187,9 @@ static int pci_epf_test_init_dma_chan(struct pci_epf_test *epf_test)
+  */
+ static void pci_epf_test_clean_dma_chan(struct pci_epf_test *epf_test)
+ {
++      if (!epf_test->dma_supported)
++              return;
++
+       dma_release_channel(epf_test->dma_chan);
+       epf_test->dma_chan = NULL;
+ }
+-- 
+2.25.1
+
diff --git a/queue-5.7/pci-fix-pci_register_host_bridge-device_register-err.patch b/queue-5.7/pci-fix-pci_register_host_bridge-device_register-err.patch
new file mode 100644 (file)
index 0000000..8fdf52b
--- /dev/null
@@ -0,0 +1,43 @@
+From 430dbc6a850d53e69f9379ebe06a930a806af257 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 13 May 2020 17:38:58 -0500
+Subject: PCI: Fix pci_register_host_bridge() device_register() error handling
+
+From: Rob Herring <robh@kernel.org>
+
+[ Upstream commit 1b54ae8327a4d630111c8d88ba7906483ec6010b ]
+
+If device_register() has an error, we should bail out of
+pci_register_host_bridge() rather than continuing on.
+
+Fixes: 37d6a0a6f470 ("PCI: Add pci_register_host_bridge() interface")
+Link: https://lore.kernel.org/r/20200513223859.11295-1-robh@kernel.org
+Signed-off-by: Rob Herring <robh@kernel.org>
+Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
+Reviewed-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
+Reviewed-by: Arnd Bergmann <arnd@arndb.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/pci/probe.c | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
+index c7e3a8267521b..b59a4b0f5f162 100644
+--- a/drivers/pci/probe.c
++++ b/drivers/pci/probe.c
+@@ -909,9 +909,10 @@ static int pci_register_host_bridge(struct pci_host_bridge *bridge)
+               goto free;
+       err = device_register(&bridge->dev);
+-      if (err)
++      if (err) {
+               put_device(&bridge->dev);
+-
++              goto free;
++      }
+       bus->bridge = get_device(&bridge->dev);
+       device_enable_async_suspend(bus->bridge);
+       pci_set_bus_of_node(bus);
+-- 
+2.25.1
+
diff --git a/queue-5.7/pci-pci-bridge-emul-fix-pcie-bit-conflicts.patch b/queue-5.7/pci-pci-bridge-emul-fix-pcie-bit-conflicts.patch
new file mode 100644 (file)
index 0000000..749a5d8
--- /dev/null
@@ -0,0 +1,55 @@
+From 164b3a6349808800b5564f53694a6baab2a43c64 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 11 May 2020 12:21:14 -0400
+Subject: PCI: pci-bridge-emul: Fix PCIe bit conflicts
+
+From: Jon Derrick <jonathan.derrick@intel.com>
+
+[ Upstream commit c88d19181771bd189147681ef38fc1533ebeff4c ]
+
+This patch fixes two bit conflicts in the pci-bridge-emul driver:
+
+1. Bit 3 of Device Status (19 of Device Control) is marked as both
+   Write-1-to-Clear and Read-Only. It should be Write-1-to-Clear.
+   The Read-Only and Reserved bitmasks are shifted by 1 bit due to this
+   error.
+
+2. Bit 12 of Slot Control is marked as both Read-Write and Reserved.
+   It should be Read-Write.
+
+Link: https://lore.kernel.org/r/20200511162117.6674-2-jonathan.derrick@intel.com
+Signed-off-by: Jon Derrick <jonathan.derrick@intel.com>
+Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
+Acked-by: Rob Herring <robh@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/pci/pci-bridge-emul.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/pci/pci-bridge-emul.c b/drivers/pci/pci-bridge-emul.c
+index 4f4f54bc732eb..faa414655f338 100644
+--- a/drivers/pci/pci-bridge-emul.c
++++ b/drivers/pci/pci-bridge-emul.c
+@@ -185,8 +185,8 @@ static const struct pci_bridge_reg_behavior pcie_cap_regs_behavior[] = {
+                * RO, the rest is reserved
+                */
+               .w1c = GENMASK(19, 16),
+-              .ro = GENMASK(20, 19),
+-              .rsvd = GENMASK(31, 21),
++              .ro = GENMASK(21, 20),
++              .rsvd = GENMASK(31, 22),
+       },
+       [PCI_EXP_LNKCAP / 4] = {
+@@ -226,7 +226,7 @@ static const struct pci_bridge_reg_behavior pcie_cap_regs_behavior[] = {
+                       PCI_EXP_SLTSTA_CC | PCI_EXP_SLTSTA_DLLSC) << 16,
+               .ro = (PCI_EXP_SLTSTA_MRLSS | PCI_EXP_SLTSTA_PDS |
+                      PCI_EXP_SLTSTA_EIS) << 16,
+-              .rsvd = GENMASK(15, 12) | (GENMASK(15, 9) << 16),
++              .rsvd = GENMASK(15, 13) | (GENMASK(15, 9) << 16),
+       },
+       [PCI_EXP_RTCTL / 4] = {
+-- 
+2.25.1
+
diff --git a/queue-5.7/pci-pm-assume-ports-without-dll-link-active-train-li.patch b/queue-5.7/pci-pm-assume-ports-without-dll-link-active-train-li.patch
new file mode 100644 (file)
index 0000000..bb23d4b
--- /dev/null
@@ -0,0 +1,113 @@
+From 3b330ce5cbbfe6034d7cbc06486fc447be72b577 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 14 May 2020 16:30:43 +0300
+Subject: PCI/PM: Assume ports without DLL Link Active train links in 100 ms
+
+From: Mika Westerberg <mika.westerberg@linux.intel.com>
+
+[ Upstream commit ec411e02b7a2e785a4ed9ed283207cd14f48699d ]
+
+Kai-Heng Feng reported that it takes a long time (> 1 s) to resume
+Thunderbolt-connected devices from both runtime suspend and system sleep
+(s2idle).
+
+This was because some Downstream Ports that support > 5 GT/s do not also
+support Data Link Layer Link Active reporting.  Per PCIe r5.0 sec 6.6.1:
+
+  With a Downstream Port that supports Link speeds greater than 5.0 GT/s,
+  software must wait a minimum of 100 ms after Link training completes
+  before sending a Configuration Request to the device immediately below
+  that Port. Software can determine when Link training completes by polling
+  the Data Link Layer Link Active bit or by setting up an associated
+  interrupt (see Section 6.7.3.3).
+
+Sec 7.5.3.6 requires such Ports to support DLL Link Active reporting, but
+at least the Intel JHL6240 Thunderbolt 3 Bridge [8086:15c0] and the Intel
+JHL7540 Thunderbolt 3 Bridge [8086:15ea] do not.
+
+Previously we tried to wait for Link training to complete, but since there
+was no DLL Link Active reporting, all we could do was wait the worst-case
+1000 ms, then another 100 ms.
+
+Instead of using the supported speeds to determine whether to wait for Link
+training, check whether the port supports DLL Link Active reporting.  The
+Ports in question do not, so we'll wait only the 100 ms required for Ports
+that support Link speeds <= 5 GT/s.
+
+This of course assumes these Ports always train the Link within 100 ms even
+if they are operating at > 5 GT/s, which is not required by the spec.
+
+[bhelgaas: commit log, comment]
+Link: https://bugzilla.kernel.org/show_bug.cgi?id=206837
+Link: https://lore.kernel.org/r/20200514133043.27429-1-mika.westerberg@linux.intel.com
+Reported-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
+Tested-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
+Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
+Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/pci/pci.c | 30 +++++++++++++++++++++---------
+ 1 file changed, 21 insertions(+), 9 deletions(-)
+
+diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
+index 6d3234f756923..809f2584e3384 100644
+--- a/drivers/pci/pci.c
++++ b/drivers/pci/pci.c
+@@ -4660,7 +4660,8 @@ static int pci_pm_reset(struct pci_dev *dev, int probe)
+  * pcie_wait_for_link_delay - Wait until link is active or inactive
+  * @pdev: Bridge device
+  * @active: waiting for active or inactive?
+- * @delay: Delay to wait after link has become active (in ms)
++ * @delay: Delay to wait after link has become active (in ms). Specify %0
++ *       for no delay.
+  *
+  * Use this to wait till link becomes active or inactive.
+  */
+@@ -4701,7 +4702,7 @@ static bool pcie_wait_for_link_delay(struct pci_dev *pdev, bool active,
+               msleep(10);
+               timeout -= 10;
+       }
+-      if (active && ret)
++      if (active && ret && delay)
+               msleep(delay);
+       else if (ret != active)
+               pci_info(pdev, "Data Link Layer Link Active not %s in 1000 msec\n",
+@@ -4822,17 +4823,28 @@ void pci_bridge_wait_for_secondary_bus(struct pci_dev *dev)
+       if (!pcie_downstream_port(dev))
+               return;
+-      if (pcie_get_speed_cap(dev) <= PCIE_SPEED_5_0GT) {
+-              pci_dbg(dev, "waiting %d ms for downstream link\n", delay);
+-              msleep(delay);
+-      } else {
+-              pci_dbg(dev, "waiting %d ms for downstream link, after activation\n",
+-                      delay);
+-              if (!pcie_wait_for_link_delay(dev, true, delay)) {
++      /*
++       * Per PCIe r5.0, sec 6.6.1, for downstream ports that support
++       * speeds > 5 GT/s, we must wait for link training to complete
++       * before the mandatory delay.
++       *
++       * We can only tell when link training completes via DLL Link
++       * Active, which is required for downstream ports that support
++       * speeds > 5 GT/s (sec 7.5.3.6).  Unfortunately some common
++       * devices do not implement Link Active reporting even when it's
++       * required, so we'll check for that directly instead of checking
++       * the supported link speed.  We assume devices without Link Active
++       * reporting can train in 100 ms regardless of speed.
++       */
++      if (dev->link_active_reporting) {
++              pci_dbg(dev, "waiting for link to train\n");
++              if (!pcie_wait_for_link_delay(dev, true, 0)) {
+                       /* Did not train, no need to wait any further */
+                       return;
+               }
+       }
++      pci_dbg(child, "waiting %d ms to become accessible\n", delay);
++      msleep(delay);
+       if (!pci_device_is_present(child)) {
+               pci_dbg(child, "waiting additional %d ms to become accessible\n", delay);
+-- 
+2.25.1
+
diff --git a/queue-5.7/pci-ptm-inherit-switch-downstream-port-ptm-settings-.patch b/queue-5.7/pci-ptm-inherit-switch-downstream-port-ptm-settings-.patch
new file mode 100644 (file)
index 0000000..237496f
--- /dev/null
@@ -0,0 +1,78 @@
+From 273b40032fb472472fd04b1bb6cdefd6c4503669 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 21 May 2020 15:40:07 -0500
+Subject: PCI/PTM: Inherit Switch Downstream Port PTM settings from Upstream
+ Port
+
+From: Bjorn Helgaas <bhelgaas@google.com>
+
+[ Upstream commit 7b38fd9760f51cc83d80eed2cfbde8b5ead9e93a ]
+
+Except for Endpoints, we enable PTM at enumeration-time.  Previously we did
+not account for the fact that Switch Downstream Ports are not permitted to
+have a PTM capability; their PTM behavior is controlled by the Upstream
+Port (PCIe r5.0, sec 7.9.16).  Since Downstream Ports don't have a PTM
+capability, we did not mark them as "ptm_enabled", which meant that
+pci_enable_ptm() on an Endpoint failed because there was no PTM path to it.
+
+Mark Downstream Ports as "ptm_enabled" if their Upstream Port has PTM
+enabled.
+
+Fixes: eec097d43100 ("PCI: Add pci_enable_ptm() for drivers to enable PTM on endpoints")
+Reported-by: Aditya Paluri <Venkata.AdityaPaluri@synopsys.com>
+Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/pci/pcie/ptm.c | 22 +++++++++++++++++-----
+ 1 file changed, 17 insertions(+), 5 deletions(-)
+
+diff --git a/drivers/pci/pcie/ptm.c b/drivers/pci/pcie/ptm.c
+index 9361f3aa26ab8..357a454cafa07 100644
+--- a/drivers/pci/pcie/ptm.c
++++ b/drivers/pci/pcie/ptm.c
+@@ -39,10 +39,6 @@ void pci_ptm_init(struct pci_dev *dev)
+       if (!pci_is_pcie(dev))
+               return;
+-      pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_PTM);
+-      if (!pos)
+-              return;
+-
+       /*
+        * Enable PTM only on interior devices (root ports, switch ports,
+        * etc.) on the assumption that it causes no link traffic until an
+@@ -52,6 +48,23 @@ void pci_ptm_init(struct pci_dev *dev)
+            pci_pcie_type(dev) == PCI_EXP_TYPE_RC_END))
+               return;
++      /*
++       * Switch Downstream Ports are not permitted to have a PTM
++       * capability; their PTM behavior is controlled by the Upstream
++       * Port (PCIe r5.0, sec 7.9.16).
++       */
++      ups = pci_upstream_bridge(dev);
++      if (pci_pcie_type(dev) == PCI_EXP_TYPE_DOWNSTREAM &&
++          ups && ups->ptm_enabled) {
++              dev->ptm_granularity = ups->ptm_granularity;
++              dev->ptm_enabled = 1;
++              return;
++      }
++
++      pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_PTM);
++      if (!pos)
++              return;
++
+       pci_read_config_dword(dev, pos + PCI_PTM_CAP, &cap);
+       local_clock = (cap & PCI_PTM_GRANULARITY_MASK) >> 8;
+@@ -61,7 +74,6 @@ void pci_ptm_init(struct pci_dev *dev)
+        * the spec recommendation (PCIe r3.1, sec 7.32.3), select the
+        * furthest upstream Time Source as the PTM Root.
+        */
+-      ups = pci_upstream_bridge(dev);
+       if (ups && ups->ptm_enabled) {
+               ctrl = PCI_PTM_CTRL_ENABLE;
+               if (ups->ptm_granularity == 0)
+-- 
+2.25.1
+
diff --git a/queue-5.7/pci-rcar-fix-incorrect-programming-of-ob-windows.patch b/queue-5.7/pci-rcar-fix-incorrect-programming-of-ob-windows.patch
new file mode 100644 (file)
index 0000000..e37fec6
--- /dev/null
@@ -0,0 +1,74 @@
+From 047e2941b7fa75b54505ef87b46b5dca95f549a1 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 4 Oct 2019 14:29:41 +0100
+Subject: PCI: rcar: Fix incorrect programming of OB windows
+
+From: Andrew Murray <andrew.murray@arm.com>
+
+[ Upstream commit 2b9f217433e31d125fb697ca7974d3de3ecc3e92 ]
+
+The outbound windows (PCIEPAUR(x), PCIEPALR(x)) describe a mapping between
+a CPU address (which is determined by the window number 'x') and a
+programmed PCI address - Thus allowing the controller to translate CPU
+accesses into PCI accesses.
+
+However the existing code incorrectly writes the CPU address - lets fix
+this by writing the PCI address instead.
+
+For memory transactions, existing DT users describe a 1:1 identity mapping
+and thus this change should have no effect. However the same isn't true for
+I/O.
+
+Link: https://lore.kernel.org/r/20191004132941.6660-1-andrew.murray@arm.com
+Fixes: c25da4778803 ("PCI: rcar: Add Renesas R-Car PCIe driver")
+Tested-by: Marek Vasut <marek.vasut+renesas@gmail.com>
+Signed-off-by: Andrew Murray <andrew.murray@arm.com>
+Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
+Reviewed-by: Marek Vasut <marek.vasut+renesas@gmail.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/pci/controller/pcie-rcar.c | 9 +++++----
+ 1 file changed, 5 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/pci/controller/pcie-rcar.c b/drivers/pci/controller/pcie-rcar.c
+index 759c6542c5c80..1bae6a4abaaeb 100644
+--- a/drivers/pci/controller/pcie-rcar.c
++++ b/drivers/pci/controller/pcie-rcar.c
+@@ -333,11 +333,12 @@ static struct pci_ops rcar_pcie_ops = {
+ };
+ static void rcar_pcie_setup_window(int win, struct rcar_pcie *pcie,
+-                                 struct resource *res)
++                                 struct resource_entry *window)
+ {
+       /* Setup PCIe address space mappings for each resource */
+       resource_size_t size;
+       resource_size_t res_start;
++      struct resource *res = window->res;
+       u32 mask;
+       rcar_pci_write_reg(pcie, 0x00000000, PCIEPTCTLR(win));
+@@ -351,9 +352,9 @@ static void rcar_pcie_setup_window(int win, struct rcar_pcie *pcie,
+       rcar_pci_write_reg(pcie, mask << 7, PCIEPAMR(win));
+       if (res->flags & IORESOURCE_IO)
+-              res_start = pci_pio_to_address(res->start);
++              res_start = pci_pio_to_address(res->start) - window->offset;
+       else
+-              res_start = res->start;
++              res_start = res->start - window->offset;
+       rcar_pci_write_reg(pcie, upper_32_bits(res_start), PCIEPAUR(win));
+       rcar_pci_write_reg(pcie, lower_32_bits(res_start) & ~0x7F,
+@@ -382,7 +383,7 @@ static int rcar_pcie_setup(struct list_head *resource, struct rcar_pcie *pci)
+               switch (resource_type(res)) {
+               case IORESOURCE_IO:
+               case IORESOURCE_MEM:
+-                      rcar_pcie_setup_window(i, pci, res);
++                      rcar_pcie_setup_window(i, pci, win);
+                       i++;
+                       break;
+               case IORESOURCE_BUS:
+-- 
+2.25.1
+
diff --git a/queue-5.7/pci-v3-semi-fix-a-memory-leak-in-v3_pci_probe-error-.patch b/queue-5.7/pci-v3-semi-fix-a-memory-leak-in-v3_pci_probe-error-.patch
new file mode 100644 (file)
index 0000000..484c502
--- /dev/null
@@ -0,0 +1,42 @@
+From 31625dbc92ef8cecbad736ab1a01d949a95dd51f Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 18 Apr 2020 10:16:37 +0200
+Subject: PCI: v3-semi: Fix a memory leak in v3_pci_probe() error handling
+ paths
+
+From: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
+
+[ Upstream commit bca718988b9008d0d5f504e2d318178fc84958c1 ]
+
+If we fails somewhere in 'v3_pci_probe()', we need to free 'host'.
+
+Use the managed version of 'pci_alloc_host_bridge()' to do that easily.
+The use of managed resources is already widely used in this driver.
+
+Link: https://lore.kernel.org/r/20200418081637.1585-1-christophe.jaillet@wanadoo.fr
+Fixes: 68a15eb7bd0c ("PCI: v3-semi: Add V3 Semiconductor PCI host driver")
+Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
+[lorenzo.pieralisi@arm.com: commit log]
+Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
+Acked-by: Linus Walleij <linus.walleij@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/pci/controller/pci-v3-semi.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/pci/controller/pci-v3-semi.c b/drivers/pci/controller/pci-v3-semi.c
+index bd05221f5a22f..ddcb4571a79b3 100644
+--- a/drivers/pci/controller/pci-v3-semi.c
++++ b/drivers/pci/controller/pci-v3-semi.c
+@@ -720,7 +720,7 @@ static int v3_pci_probe(struct platform_device *pdev)
+       int irq;
+       int ret;
+-      host = pci_alloc_host_bridge(sizeof(*v3));
++      host = devm_pci_alloc_host_bridge(dev, sizeof(*v3));
+       if (!host)
+               return -ENOMEM;
+-- 
+2.25.1
+
diff --git a/queue-5.7/pci-vmd-filter-resource-type-bits-from-shadow-regist.patch b/queue-5.7/pci-vmd-filter-resource-type-bits-from-shadow-regist.patch
new file mode 100644 (file)
index 0000000..8f2ce4b
--- /dev/null
@@ -0,0 +1,55 @@
+From 8148acbb8585cc31c08dfeb127288984c6b0b1ae Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 27 May 2020 23:02:39 -0400
+Subject: PCI: vmd: Filter resource type bits from shadow register
+
+From: Jon Derrick <jonathan.derrick@intel.com>
+
+[ Upstream commit 3e5095eebe015d5a4d566aa5e03c8621add5f0a7 ]
+
+Versions of VMD with the Host Physical Address shadow register use this
+register to calculate the bus address offset needed to do guest
+passthrough of the domain. This register shadows the Host Physical
+Address registers including the resource type bits. After calculating
+the offset, the extra resource type bits lead to the VMD resources being
+over-provisioned at the front and under-provisioned at the back.
+
+Example:
+pci 10000:80:02.0: reg 0x10: [mem 0xf801fffc-0xf803fffb 64bit]
+
+Expected:
+pci 10000:80:02.0: reg 0x10: [mem 0xf8020000-0xf803ffff 64bit]
+
+If other devices are mapped in the over-provisioned front, it could lead
+to resource conflict issues with VMD or those devices.
+
+Link: https://lore.kernel.org/r/20200528030240.16024-3-jonathan.derrick@intel.com
+Fixes: a1a30170138c9 ("PCI: vmd: Fix shadow offsets to reflect spec changes")
+Signed-off-by: Jon Derrick <jonathan.derrick@intel.com>
+Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/pci/controller/vmd.c | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/pci/controller/vmd.c b/drivers/pci/controller/vmd.c
+index dac91d60701de..e386d4eac4070 100644
+--- a/drivers/pci/controller/vmd.c
++++ b/drivers/pci/controller/vmd.c
+@@ -445,9 +445,11 @@ static int vmd_enable_domain(struct vmd_dev *vmd, unsigned long features)
+                       if (!membar2)
+                               return -ENOMEM;
+                       offset[0] = vmd->dev->resource[VMD_MEMBAR1].start -
+-                                      readq(membar2 + MB2_SHADOW_OFFSET);
++                                      (readq(membar2 + MB2_SHADOW_OFFSET) &
++                                       PCI_BASE_ADDRESS_MEM_MASK);
+                       offset[1] = vmd->dev->resource[VMD_MEMBAR2].start -
+-                                      readq(membar2 + MB2_SHADOW_OFFSET + 8);
++                                      (readq(membar2 + MB2_SHADOW_OFFSET + 8) &
++                                       PCI_BASE_ADDRESS_MEM_MASK);
+                       pci_iounmap(vmd->dev, membar2);
+               }
+       }
+-- 
+2.25.1
+
diff --git a/queue-5.7/perf-parse-events-fix-an-incompatible-pointer.patch b/queue-5.7/perf-parse-events-fix-an-incompatible-pointer.patch
new file mode 100644 (file)
index 0000000..164eea5
--- /dev/null
@@ -0,0 +1,43 @@
+From 153e9fffc1fb3010dd5ab807016b7c19c50678a3 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 8 Jun 2020 22:36:09 -0700
+Subject: perf parse-events: Fix an incompatible pointer
+
+From: Ian Rogers <irogers@google.com>
+
+[ Upstream commit c2412fae3f01725615b0de472095a9e16ed30ca9 ]
+
+Arrays are pointer types and don't need their address taking.
+
+Fixes: 8255718f4bed (perf pmu: Expand PMU events by prefix match)
+Signed-off-by: Ian Rogers <irogers@google.com>
+Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
+Cc: Andi Kleen <ak@linux.intel.com>
+Cc: Jiri Olsa <jolsa@redhat.com>
+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/20200609053610.206588-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/parse-events.y | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/tools/perf/util/parse-events.y b/tools/perf/util/parse-events.y
+index 94f8bcd835826..9a41247c602ba 100644
+--- a/tools/perf/util/parse-events.y
++++ b/tools/perf/util/parse-events.y
+@@ -348,7 +348,7 @@ PE_PMU_EVENT_PRE '-' PE_PMU_EVENT_SUF sep_dc
+       struct list_head *list;
+       char pmu_name[128];
+-      snprintf(&pmu_name, 128, "%s-%s", $1, $3);
++      snprintf(pmu_name, sizeof(pmu_name), "%s-%s", $1, $3);
+       free($1);
+       free($3);
+       if (parse_events_multi_pmu_add(_parse_state, pmu_name, &list) < 0)
+-- 
+2.25.1
+
diff --git a/queue-5.7/perf-probe-fix-user-attribute-access-in-kprobes.patch b/queue-5.7/perf-probe-fix-user-attribute-access-in-kprobes.patch
new file mode 100644 (file)
index 0000000..527a495
--- /dev/null
@@ -0,0 +1,133 @@
+From c53a66c9b99923edbc23ce11c2032959e0b2a7c8 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 9 Jun 2020 10:10:18 +0200
+Subject: perf probe: Fix user attribute access in kprobes
+
+From: Sumanth Korikkar <sumanthk@linux.ibm.com>
+
+[ Upstream commit 9256c3031eb9beafa3957c61093104c3c75a6148 ]
+
+Issue:
+
+  # perf probe -a 'do_sched_setscheduler pid policy param->sched_priority@user'
+
+did not work before.
+
+Fix:
+
+Make:
+
+  # perf probe -a 'do_sched_setscheduler pid policy param->sched_priority@user'
+
+output equivalent to ftrace:
+
+  # echo 'p:probe/do_sched_setscheduler _text+517384 pid=%r2:s32 policy=%r3:s32 sched_priority=+u0(%r4):s32' > /sys/kernel/debug/tracing/kprobe_events
+
+Other:
+
+1. Right now, __match_glob() does not handle [u]<offset>. For now, use
+  *u]<offset>.
+
+2. @user attribute was introduced in commit 1e032f7cfa14 ("perf-probe:
+   Add user memory access attribute support")
+
+Test:
+1. perf probe -a 'do_sched_setscheduler  pid policy
+   param->sched_priority@user'
+
+2 ./perf script
+   sched 305669 [000] 1614458.838675: perf_bpf_probe:func: (2904e508)
+   pid=261614 policy=2 sched_priority=1
+
+3. cat /sys/kernel/debug/tracing/trace
+   <...>-309956 [006] .... 1616098.093957: 0: prio: 1
+
+Committer testing:
+
+Before:
+
+  # perf probe -a 'do_sched_setscheduler pid policy param->sched_priority@user'
+  param(type:sched_param) has no member sched_priority@user.
+    Error: Failed to add events.
+  # pahole sched_param
+  struct sched_param {
+       int                        sched_priority;       /*     0     4 */
+
+       /* size: 4, cachelines: 1, members: 1 */
+       /* last cacheline: 4 bytes */
+  };
+  #
+
+After:
+
+  # perf probe -a 'do_sched_setscheduler pid policy param->sched_priority@user'
+  Added new event:
+    probe:do_sched_setscheduler (on do_sched_setscheduler with pid policy sched_priority=param->sched_priority)
+
+  You can now use it in all perf tools, such as:
+
+       perf record -e probe:do_sched_setscheduler -aR sleep 1
+
+  # cat /sys/kernel/debug/tracing/kprobe_events
+  p:probe/do_sched_setscheduler _text+1113792 pid=%di:s32 policy=%si:s32 sched_priority=+u0(%dx):s32
+  #
+
+Fixes: 1e032f7cfa14 ("perf-probe: Add user memory access attribute support")
+Signed-off-by: Sumanth Korikkar <sumanthk@linux.ibm.com>
+Reviewed-by: Thomas Richter <tmricht@linux.ibm.com>
+Acked-by: Masami Hiramatsu <mhiramat@kernel.org>
+Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
+Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
+Cc: Ilya Leoshkevich <iii@linux.ibm.com>
+Cc: Jiri Olsa <jolsa@redhat.com>
+Cc: Steven Rostedt (VMware) <rostedt@goodmis.org>
+Cc: bpf@vger.kernel.org
+LPU-Reference: 20200609081019.60234-2-sumanthk@linux.ibm.com
+Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ tools/perf/util/probe-event.c | 7 +++++--
+ tools/perf/util/probe-file.c  | 2 +-
+ 2 files changed, 6 insertions(+), 3 deletions(-)
+
+diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
+index a08f373d33056..df713a5d1e26a 100644
+--- a/tools/perf/util/probe-event.c
++++ b/tools/perf/util/probe-event.c
+@@ -1575,7 +1575,7 @@ static int parse_perf_probe_arg(char *str, struct perf_probe_arg *arg)
+       }
+       tmp = strchr(str, '@');
+-      if (tmp && tmp != str && strcmp(tmp + 1, "user")) { /* user attr */
++      if (tmp && tmp != str && !strcmp(tmp + 1, "user")) { /* user attr */
+               if (!user_access_is_supported()) {
+                       semantic_error("ftrace does not support user access\n");
+                       return -EINVAL;
+@@ -1995,7 +1995,10 @@ static int __synthesize_probe_trace_arg_ref(struct probe_trace_arg_ref *ref,
+               if (depth < 0)
+                       return depth;
+       }
+-      err = strbuf_addf(buf, "%+ld(", ref->offset);
++      if (ref->user_access)
++              err = strbuf_addf(buf, "%s%ld(", "+u", ref->offset);
++      else
++              err = strbuf_addf(buf, "%+ld(", ref->offset);
+       return (err < 0) ? err : depth;
+ }
+diff --git a/tools/perf/util/probe-file.c b/tools/perf/util/probe-file.c
+index 8c852948513e3..064b63a6a3f31 100644
+--- a/tools/perf/util/probe-file.c
++++ b/tools/perf/util/probe-file.c
+@@ -1044,7 +1044,7 @@ static struct {
+       DEFINE_TYPE(FTRACE_README_PROBE_TYPE_X, "*type: * x8/16/32/64,*"),
+       DEFINE_TYPE(FTRACE_README_KRETPROBE_OFFSET, "*place (kretprobe): *"),
+       DEFINE_TYPE(FTRACE_README_UPROBE_REF_CTR, "*ref_ctr_offset*"),
+-      DEFINE_TYPE(FTRACE_README_USER_ACCESS, "*[u]<offset>*"),
++      DEFINE_TYPE(FTRACE_README_USER_ACCESS, "*u]<offset>*"),
+       DEFINE_TYPE(FTRACE_README_MULTIPROBE_EVENT, "*Create/append/*"),
+       DEFINE_TYPE(FTRACE_README_IMMEDIATE_VALUE, "*\\imm-value,*"),
+ };
+-- 
+2.25.1
+
diff --git a/queue-5.7/perf-report-fix-null-pointer-dereference-in-hists__f.patch b/queue-5.7/perf-report-fix-null-pointer-dereference-in-hists__f.patch
new file mode 100644 (file)
index 0000000..b11f1a3
--- /dev/null
@@ -0,0 +1,46 @@
+From 4b24d626769617266cabef7a98a48e23cd7f4c05 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 8 Jun 2020 13:18:17 -0300
+Subject: perf report: Fix NULL pointer dereference in
+ hists__fprintf_nr_sample_events()
+
+From: Gaurav Singh <gaurav1086@gmail.com>
+
+[ Upstream commit 11b6e5482e178055ec1f2444b55f2518713809d1 ]
+
+The 'evname' variable can be NULL, as it is checked a few lines back,
+check it before using.
+
+Fixes: 9e207ddfa207 ("perf report: Show call graph from reference events")
+Cc: Adrian Hunter <adrian.hunter@intel.com>
+Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
+Cc: Ingo Molnar <mingo@redhat.com>
+Cc: Jiri Olsa <jolsa@kernel.org>
+Cc: Kan Liang <kan.liang@intel.com>
+Cc: Mark Rutland <mark.rutland@arm.com>
+Cc: Namhyung Kim <namhyung@kernel.org>
+Cc: Peter Zijlstra <peterz@infradead.org>
+Link: http://lore.kernel.org/lkml/
+Signed-off-by: Gaurav Singh <gaurav1086@gmail.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ tools/perf/builtin-report.c | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c
+index 26d8fc27e427e..fc7855262162d 100644
+--- a/tools/perf/builtin-report.c
++++ b/tools/perf/builtin-report.c
+@@ -476,8 +476,7 @@ static size_t hists__fprintf_nr_sample_events(struct hists *hists, struct report
+       if (rep->time_str)
+               ret += fprintf(fp, " (time slices: %s)", rep->time_str);
+-      if (symbol_conf.show_ref_callgraph &&
+-          strstr(evname, "call-graph=no")) {
++      if (symbol_conf.show_ref_callgraph && evname && strstr(evname, "call-graph=no")) {
+               ret += fprintf(fp, ", show reference callgraph");
+       }
+-- 
+2.25.1
+
diff --git a/queue-5.7/perf-stat-fix-null-pointer-dereference.patch b/queue-5.7/perf-stat-fix-null-pointer-dereference.patch
new file mode 100644 (file)
index 0000000..dc19c2c
--- /dev/null
@@ -0,0 +1,52 @@
+From 88f6453095e8f939a12136d9838bbdcc78016939 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 5 Jun 2020 17:17:40 +0800
+Subject: perf stat: Fix NULL pointer dereference
+
+From: Hongbo Yao <yaohongbo@huawei.com>
+
+[ Upstream commit c0c652fc705de75f4ba52e93053acc1ed3933e74 ]
+
+If config->aggr_map is NULL and config->aggr_get_id is not NULL,
+the function print_aggr() will still calling arrg_update_shadow(),
+which can result in accessing the invalid pointer.
+
+Fixes: 088519f318be ("perf stat: Move the display functions to stat-display.c")
+Signed-off-by: Hongbo Yao <yaohongbo@huawei.com>
+Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
+Cc: Jiri Olsa <jolsa@redhat.com>
+Cc: Mark Rutland <mark.rutland@arm.com>
+Cc: Namhyung Kim <namhyung@kernel.org>
+Cc: Wei Li <liwei391@huawei.com>
+Link: https://lore.kernel.org/lkml/20200608163625.GC3073@kernel.org
+Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ tools/perf/util/stat-display.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/tools/perf/util/stat-display.c b/tools/perf/util/stat-display.c
+index 9e757d18d713b..cf393c3eea233 100644
+--- a/tools/perf/util/stat-display.c
++++ b/tools/perf/util/stat-display.c
+@@ -671,7 +671,7 @@ static void print_aggr(struct perf_stat_config *config,
+       int s;
+       bool first;
+-      if (!(config->aggr_map || config->aggr_get_id))
++      if (!config->aggr_map || !config->aggr_get_id)
+               return;
+       aggr_update_shadow(config, evlist);
+@@ -1172,7 +1172,7 @@ static void print_percore(struct perf_stat_config *config,
+       int s;
+       bool first = true;
+-      if (!(config->aggr_map || config->aggr_get_id))
++      if (!config->aggr_map || !config->aggr_get_id)
+               return;
+       if (config->percore_show_thread)
+-- 
+2.25.1
+
diff --git a/queue-5.7/phy-cadence-sierra-fix-for-usb3-u1-u2-state.patch b/queue-5.7/phy-cadence-sierra-fix-for-usb3-u1-u2-state.patch
new file mode 100644 (file)
index 0000000..ff6f961
--- /dev/null
@@ -0,0 +1,97 @@
+From dc940fa47f067486d3e46dd48ff8f592393f8562 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 18 May 2020 14:14:13 +0200
+Subject: phy: cadence: sierra: Fix for USB3 U1/U2 state
+
+From: Sanket Parmar <sparmar@cadence.com>
+
+[ Upstream commit 2bcf14ca1a2f3202954f812f380c7fa8127fbd7f ]
+
+Updated values of USB3 related Sierra PHY registers.
+This change fixes USB3 device disconnect issue observed
+while enternig U1/U2 state.
+
+Signed-off-by: Sanket Parmar <sparmar@cadence.com>
+Link: https://lore.kernel.org/r/1589804053-14302-1-git-send-email-sparmar@cadence.com
+Reviewed-by: Roger Quadros <rogerq@ti.com>
+Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/phy/cadence/phy-cadence-sierra.c | 27 ++++++++++++------------
+ 1 file changed, 14 insertions(+), 13 deletions(-)
+
+diff --git a/drivers/phy/cadence/phy-cadence-sierra.c b/drivers/phy/cadence/phy-cadence-sierra.c
+index a5c08e5bd2bf7..faed652b73f79 100644
+--- a/drivers/phy/cadence/phy-cadence-sierra.c
++++ b/drivers/phy/cadence/phy-cadence-sierra.c
+@@ -685,10 +685,10 @@ static struct cdns_reg_pairs cdns_usb_cmn_regs_ext_ssc[] = {
+ static struct cdns_reg_pairs cdns_usb_ln_regs_ext_ssc[] = {
+       {0xFE0A, SIERRA_DET_STANDEC_A_PREG},
+       {0x000F, SIERRA_DET_STANDEC_B_PREG},
+-      {0x00A5, SIERRA_DET_STANDEC_C_PREG},
++      {0x55A5, SIERRA_DET_STANDEC_C_PREG},
+       {0x69ad, SIERRA_DET_STANDEC_D_PREG},
+       {0x0241, SIERRA_DET_STANDEC_E_PREG},
+-      {0x0010, SIERRA_PSM_LANECAL_DLY_A1_RESETS_PREG},
++      {0x0110, SIERRA_PSM_LANECAL_DLY_A1_RESETS_PREG},
+       {0x0014, SIERRA_PSM_A0IN_TMR_PREG},
+       {0xCF00, SIERRA_PSM_DIAG_PREG},
+       {0x001F, SIERRA_PSC_TX_A0_PREG},
+@@ -696,7 +696,7 @@ static struct cdns_reg_pairs cdns_usb_ln_regs_ext_ssc[] = {
+       {0x0003, SIERRA_PSC_TX_A2_PREG},
+       {0x0003, SIERRA_PSC_TX_A3_PREG},
+       {0x0FFF, SIERRA_PSC_RX_A0_PREG},
+-      {0x0619, SIERRA_PSC_RX_A1_PREG},
++      {0x0003, SIERRA_PSC_RX_A1_PREG},
+       {0x0003, SIERRA_PSC_RX_A2_PREG},
+       {0x0001, SIERRA_PSC_RX_A3_PREG},
+       {0x0001, SIERRA_PLLCTRL_SUBRATE_PREG},
+@@ -705,19 +705,19 @@ static struct cdns_reg_pairs cdns_usb_ln_regs_ext_ssc[] = {
+       {0x00CA, SIERRA_CLKPATH_BIASTRIM_PREG},
+       {0x2512, SIERRA_DFE_BIASTRIM_PREG},
+       {0x0000, SIERRA_DRVCTRL_ATTEN_PREG},
+-      {0x873E, SIERRA_CLKPATHCTRL_TMR_PREG},
+-      {0x03CF, SIERRA_RX_CREQ_FLTR_A_MODE1_PREG},
+-      {0x01CE, SIERRA_RX_CREQ_FLTR_A_MODE0_PREG},
++      {0x823E, SIERRA_CLKPATHCTRL_TMR_PREG},
++      {0x078F, SIERRA_RX_CREQ_FLTR_A_MODE1_PREG},
++      {0x078F, SIERRA_RX_CREQ_FLTR_A_MODE0_PREG},
+       {0x7B3C, SIERRA_CREQ_CCLKDET_MODE01_PREG},
+-      {0x033F, SIERRA_RX_CTLE_MAINTENANCE_PREG},
++      {0x023C, SIERRA_RX_CTLE_MAINTENANCE_PREG},
+       {0x3232, SIERRA_CREQ_FSMCLK_SEL_PREG},
+       {0x0000, SIERRA_CREQ_EQ_CTRL_PREG},
+-      {0x8000, SIERRA_CREQ_SPARE_PREG},
++      {0x0000, SIERRA_CREQ_SPARE_PREG},
+       {0xCC44, SIERRA_CREQ_EQ_OPEN_EYE_THRESH_PREG},
+-      {0x8453, SIERRA_CTLELUT_CTRL_PREG},
+-      {0x4110, SIERRA_DFE_ECMP_RATESEL_PREG},
+-      {0x4110, SIERRA_DFE_SMP_RATESEL_PREG},
+-      {0x0002, SIERRA_DEQ_PHALIGN_CTRL},
++      {0x8452, SIERRA_CTLELUT_CTRL_PREG},
++      {0x4121, SIERRA_DFE_ECMP_RATESEL_PREG},
++      {0x4121, SIERRA_DFE_SMP_RATESEL_PREG},
++      {0x0003, SIERRA_DEQ_PHALIGN_CTRL},
+       {0x3200, SIERRA_DEQ_CONCUR_CTRL1_PREG},
+       {0x5064, SIERRA_DEQ_CONCUR_CTRL2_PREG},
+       {0x0030, SIERRA_DEQ_EPIPWR_CTRL2_PREG},
+@@ -725,7 +725,7 @@ static struct cdns_reg_pairs cdns_usb_ln_regs_ext_ssc[] = {
+       {0x5A5A, SIERRA_DEQ_ERRCMP_CTRL_PREG},
+       {0x02F5, SIERRA_DEQ_OFFSET_CTRL_PREG},
+       {0x02F5, SIERRA_DEQ_GAIN_CTRL_PREG},
+-      {0x9A8A, SIERRA_DEQ_VGATUNE_CTRL_PREG},
++      {0x9999, SIERRA_DEQ_VGATUNE_CTRL_PREG},
+       {0x0014, SIERRA_DEQ_GLUT0},
+       {0x0014, SIERRA_DEQ_GLUT1},
+       {0x0014, SIERRA_DEQ_GLUT2},
+@@ -772,6 +772,7 @@ static struct cdns_reg_pairs cdns_usb_ln_regs_ext_ssc[] = {
+       {0x000F, SIERRA_LFPSFILT_NS_PREG},
+       {0x0009, SIERRA_LFPSFILT_RD_PREG},
+       {0x0001, SIERRA_LFPSFILT_MP_PREG},
++      {0x6013, SIERRA_SIGDET_SUPPORT_PREG},
+       {0x8013, SIERRA_SDFILT_H2L_A_PREG},
+       {0x8009, SIERRA_SDFILT_L2H_PREG},
+       {0x0024, SIERRA_RXBUFFER_CTLECTRL_PREG},
+-- 
+2.25.1
+
diff --git a/queue-5.7/phy-ti-j721e-wiz-fix-some-error-return-code-in-wiz_p.patch b/queue-5.7/phy-ti-j721e-wiz-fix-some-error-return-code-in-wiz_p.patch
new file mode 100644 (file)
index 0000000..8563f96
--- /dev/null
@@ -0,0 +1,58 @@
+From ba861f945fe7f949d3dd8b995787905b7859ac15 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 7 May 2020 05:41:09 +0000
+Subject: phy: ti: j721e-wiz: Fix some error return code in wiz_probe()
+
+From: Wei Yongjun <weiyongjun1@huawei.com>
+
+[ Upstream commit e2ae8bca494481a9f38fcd1d52943ac04e654745 ]
+
+Fix to return negative error code from some error handling
+cases instead of 0, as done elsewhere in this function.
+
+Fixes: 091876cc355d ("phy: ti: j721e-wiz: Add support for WIZ module present in TI J721E SoC")
+Reported-by: Hulk Robot <hulkci@huawei.com>
+Signed-off-by: Wei Yongjun <weiyongjun1@huawei.com>
+Acked-by: Roger Quadros <rogerq@ti.com>
+Link: https://lore.kernel.org/r/20200507054109.110849-1-weiyongjun1@huawei.com
+Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/phy/ti/phy-j721e-wiz.c | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/phy/ti/phy-j721e-wiz.c b/drivers/phy/ti/phy-j721e-wiz.c
+index 7b51045df7836..c8e4ff341cefa 100644
+--- a/drivers/phy/ti/phy-j721e-wiz.c
++++ b/drivers/phy/ti/phy-j721e-wiz.c
+@@ -794,8 +794,10 @@ static int wiz_probe(struct platform_device *pdev)
+       }
+       base = devm_ioremap(dev, res.start, resource_size(&res));
+-      if (!base)
++      if (!base) {
++              ret = -ENOMEM;
+               goto err_addr_to_resource;
++      }
+       regmap = devm_regmap_init_mmio(dev, base, &wiz_regmap_config);
+       if (IS_ERR(regmap)) {
+@@ -812,6 +814,7 @@ static int wiz_probe(struct platform_device *pdev)
+       if (num_lanes > WIZ_MAX_LANES) {
+               dev_err(dev, "Cannot support %d lanes\n", num_lanes);
++              ret = -ENODEV;
+               goto err_addr_to_resource;
+       }
+@@ -897,6 +900,7 @@ static int wiz_probe(struct platform_device *pdev)
+       serdes_pdev = of_platform_device_create(child_node, NULL, dev);
+       if (!serdes_pdev) {
+               dev_WARN(dev, "Unable to create SERDES platform device\n");
++              ret = -ENOMEM;
+               goto err_pdev_create;
+       }
+       wiz->serdes_pdev = serdes_pdev;
+-- 
+2.25.1
+
diff --git a/queue-5.7/pinctrl-fix-return-value-about-devm_platform_ioremap.patch b/queue-5.7/pinctrl-fix-return-value-about-devm_platform_ioremap.patch
new file mode 100644 (file)
index 0000000..5dd1fe2
--- /dev/null
@@ -0,0 +1,51 @@
+From 9566792e03902dddc8c88f1d251923f6496561e6 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 23 May 2020 19:45:25 +0800
+Subject: pinctrl: Fix return value about devm_platform_ioremap_resource()
+
+From: Tiezhu Yang <yangtiezhu@loongson.cn>
+
+[ Upstream commit b5d9ff10dca49f4d4b7846c3751c6bec50d07375 ]
+
+When call function devm_platform_ioremap_resource(), we should use IS_ERR()
+to check the return value and return PTR_ERR() if failed.
+
+Fixes: 4b024225c4a8 ("pinctrl: use devm_platform_ioremap_resource() to simplify code")
+Signed-off-by: Tiezhu Yang <yangtiezhu@loongson.cn>
+Link: https://lore.kernel.org/r/1590234326-2194-1-git-send-email-yangtiezhu@loongson.cn
+Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/pinctrl/bcm/pinctrl-bcm281xx.c | 2 +-
+ drivers/pinctrl/pinctrl-at91-pio4.c    | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/pinctrl/bcm/pinctrl-bcm281xx.c b/drivers/pinctrl/bcm/pinctrl-bcm281xx.c
+index f690fc5cd6885..71e6661783006 100644
+--- a/drivers/pinctrl/bcm/pinctrl-bcm281xx.c
++++ b/drivers/pinctrl/bcm/pinctrl-bcm281xx.c
+@@ -1406,7 +1406,7 @@ static int __init bcm281xx_pinctrl_probe(struct platform_device *pdev)
+       pdata->reg_base = devm_platform_ioremap_resource(pdev, 0);
+       if (IS_ERR(pdata->reg_base)) {
+               dev_err(&pdev->dev, "Failed to ioremap MEM resource\n");
+-              return -ENODEV;
++              return PTR_ERR(pdata->reg_base);
+       }
+       /* Initialize the dynamic part of pinctrl_desc */
+diff --git a/drivers/pinctrl/pinctrl-at91-pio4.c b/drivers/pinctrl/pinctrl-at91-pio4.c
+index 694912409fd9e..54222ccddfb19 100644
+--- a/drivers/pinctrl/pinctrl-at91-pio4.c
++++ b/drivers/pinctrl/pinctrl-at91-pio4.c
+@@ -1019,7 +1019,7 @@ static int atmel_pinctrl_probe(struct platform_device *pdev)
+       atmel_pioctrl->reg_base = devm_platform_ioremap_resource(pdev, 0);
+       if (IS_ERR(atmel_pioctrl->reg_base))
+-              return -EINVAL;
++              return PTR_ERR(atmel_pioctrl->reg_base);
+       atmel_pioctrl->clk = devm_clk_get(dev, NULL);
+       if (IS_ERR(atmel_pioctrl->clk)) {
+-- 
+2.25.1
+
diff --git a/queue-5.7/pinctrl-freescale-imx-fix-an-error-handling-path-in-.patch b/queue-5.7/pinctrl-freescale-imx-fix-an-error-handling-path-in-.patch
new file mode 100644 (file)
index 0000000..1840acb
--- /dev/null
@@ -0,0 +1,76 @@
+From 99a69313d598f7e4df0d786ea9da267cb164fdda Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 30 May 2020 22:49:55 +0200
+Subject: pinctrl: freescale: imx: Fix an error handling path in
+ 'imx_pinctrl_probe()'
+
+From: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
+
+[ Upstream commit 11d8da5cabf7c6c3263ba2cd9c00260395867048 ]
+
+'pinctrl_unregister()' should not be called to undo
+'devm_pinctrl_register_and_init()', it is already handled by the framework.
+
+This simplifies the error handling paths of the probe function.
+The 'imx_free_resources()' can be removed as well.
+
+Fixes: a51c158bf0f7 ("pinctrl: imx: use radix trees for groups and functions")
+Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
+Reviewed-by: Dong Aisheng <aisheng.dong@nxp.com>
+Link: https://lore.kernel.org/r/20200530204955.588962-1-christophe.jaillet@wanadoo.fr
+Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/pinctrl/freescale/pinctrl-imx.c | 19 ++-----------------
+ 1 file changed, 2 insertions(+), 17 deletions(-)
+
+diff --git a/drivers/pinctrl/freescale/pinctrl-imx.c b/drivers/pinctrl/freescale/pinctrl-imx.c
+index 9f42036c5fbb8..1f81569c7ae3b 100644
+--- a/drivers/pinctrl/freescale/pinctrl-imx.c
++++ b/drivers/pinctrl/freescale/pinctrl-imx.c
+@@ -774,16 +774,6 @@ static int imx_pinctrl_probe_dt(struct platform_device *pdev,
+       return 0;
+ }
+-/*
+- * imx_free_resources() - free memory used by this driver
+- * @info: info driver instance
+- */
+-static void imx_free_resources(struct imx_pinctrl *ipctl)
+-{
+-      if (ipctl->pctl)
+-              pinctrl_unregister(ipctl->pctl);
+-}
+-
+ int imx_pinctrl_probe(struct platform_device *pdev,
+                     const struct imx_pinctrl_soc_info *info)
+ {
+@@ -874,23 +864,18 @@ int imx_pinctrl_probe(struct platform_device *pdev,
+                                            &ipctl->pctl);
+       if (ret) {
+               dev_err(&pdev->dev, "could not register IMX pinctrl driver\n");
+-              goto free;
++              return ret;
+       }
+       ret = imx_pinctrl_probe_dt(pdev, ipctl);
+       if (ret) {
+               dev_err(&pdev->dev, "fail to probe dt properties\n");
+-              goto free;
++              return ret;
+       }
+       dev_info(&pdev->dev, "initialized IMX pinctrl driver\n");
+       return pinctrl_enable(ipctl->pctl);
+-
+-free:
+-      imx_free_resources(ipctl);
+-
+-      return ret;
+ }
+ static int __maybe_unused imx_pinctrl_suspend(struct device *dev)
+-- 
+2.25.1
+
diff --git a/queue-5.7/pinctrl-freescale-imx-use-devm_of_iomap-to-avoid-a-r.patch b/queue-5.7/pinctrl-freescale-imx-use-devm_of_iomap-to-avoid-a-r.patch
new file mode 100644 (file)
index 0000000..5f16a4d
--- /dev/null
@@ -0,0 +1,50 @@
+From 74ef8ade91ddc78eb6d5d7c866b3b58c4f93a9c6 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 2 Jun 2020 22:06:26 +0200
+Subject: pinctrl: freescale: imx: Use 'devm_of_iomap()' to avoid a resource
+ leak in case of error in 'imx_pinctrl_probe()'
+
+From: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
+
+[ Upstream commit ba403242615c2c99e27af7984b1650771a2cc2c9 ]
+
+Use 'devm_of_iomap()' instead 'of_iomap()' to avoid a resource leak in
+case of error.
+
+Update the error handling code accordingly.
+
+Fixes: 26d8cde5260b ("pinctrl: freescale: imx: add shared input select reg support")
+Suggested-by: Dan Carpenter <dan.carpenter@oracle.com>
+Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
+Reviewed-by: Dan Carpenter <dan.carpenter@oracle.com>
+Link: https://lore.kernel.org/r/20200602200626.677981-1-christophe.jaillet@wanadoo.fr
+Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/pinctrl/freescale/pinctrl-imx.c | 7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/pinctrl/freescale/pinctrl-imx.c b/drivers/pinctrl/freescale/pinctrl-imx.c
+index 1f81569c7ae3b..cb7e0f08d2cf4 100644
+--- a/drivers/pinctrl/freescale/pinctrl-imx.c
++++ b/drivers/pinctrl/freescale/pinctrl-imx.c
+@@ -824,12 +824,13 @@ int imx_pinctrl_probe(struct platform_device *pdev,
+                               return -EINVAL;
+                       }
+-                      ipctl->input_sel_base = of_iomap(np, 0);
++                      ipctl->input_sel_base = devm_of_iomap(&pdev->dev, np,
++                                                            0, NULL);
+                       of_node_put(np);
+-                      if (!ipctl->input_sel_base) {
++                      if (IS_ERR(ipctl->input_sel_base)) {
+                               dev_err(&pdev->dev,
+                                       "iomuxc input select base address not found\n");
+-                              return -ENOMEM;
++                              return PTR_ERR(ipctl->input_sel_base);
+                       }
+               }
+       }
+-- 
+2.25.1
+
diff --git a/queue-5.7/pinctrl-imxl-fix-an-error-handling-path-in-imx1_pinc.patch b/queue-5.7/pinctrl-imxl-fix-an-error-handling-path-in-imx1_pinc.patch
new file mode 100644 (file)
index 0000000..77efc0b
--- /dev/null
@@ -0,0 +1,39 @@
+From d60272fd236c1ebf407fc7bee0769a298e6191c7 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 30 May 2020 22:19:52 +0200
+Subject: pinctrl: imxl: Fix an error handling path in
+ 'imx1_pinctrl_core_probe()'
+
+From: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
+
+[ Upstream commit 9eb728321286c4b31e964d2377fca2368526d408 ]
+
+When 'pinctrl_register()' has been turned into 'devm_pinctrl_register()',
+an error handling path has not been updated.
+
+Axe a now unneeded 'pinctrl_unregister()'.
+
+Fixes: e55e025d1687 ("pinctrl: imxl: Use devm_pinctrl_register() for pinctrl registration")
+Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
+Link: https://lore.kernel.org/r/20200530201952.585798-1-christophe.jaillet@wanadoo.fr
+Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/pinctrl/freescale/pinctrl-imx1-core.c | 1 -
+ 1 file changed, 1 deletion(-)
+
+diff --git a/drivers/pinctrl/freescale/pinctrl-imx1-core.c b/drivers/pinctrl/freescale/pinctrl-imx1-core.c
+index c00d0022d311b..421f7d1886e54 100644
+--- a/drivers/pinctrl/freescale/pinctrl-imx1-core.c
++++ b/drivers/pinctrl/freescale/pinctrl-imx1-core.c
+@@ -638,7 +638,6 @@ int imx1_pinctrl_core_probe(struct platform_device *pdev,
+       ret = of_platform_populate(pdev->dev.of_node, NULL, NULL, &pdev->dev);
+       if (ret) {
+-              pinctrl_unregister(ipctl->pctl);
+               dev_err(&pdev->dev, "Failed to populate subdevices\n");
+               return ret;
+       }
+-- 
+2.25.1
+
diff --git a/queue-5.7/pinctrl-ocelot-always-register-gpio-driver.patch b/queue-5.7/pinctrl-ocelot-always-register-gpio-driver.patch
new file mode 100644 (file)
index 0000000..c35764d
--- /dev/null
@@ -0,0 +1,69 @@
+From cd55bcd00f36ae2311cae9927fec1d58f76b2940 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 13 May 2020 14:55:19 +0200
+Subject: pinctrl: ocelot: Always register GPIO driver
+
+From: Lars Povlsen <lars.povlsen@microchip.com>
+
+[ Upstream commit 550713e33f4338c8596776828a936fd1e3bf35de ]
+
+This fixes the situation where the GPIO controller is not
+used as an interrupt controller as well.
+
+Previously, the driver would silently fail to register even the
+GPIO's. With this change, the driver will only register as an
+interrupt controller if a parent interrupt is provided.
+
+Reviewed-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
+Signed-off-by: Lars Povlsen <lars.povlsen@microchip.com>
+Link: https://lore.kernel.org/r/20200513125532.24585-2-lars.povlsen@microchip.com
+Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/pinctrl/pinctrl-ocelot.c | 30 +++++++++++++++---------------
+ 1 file changed, 15 insertions(+), 15 deletions(-)
+
+diff --git a/drivers/pinctrl/pinctrl-ocelot.c b/drivers/pinctrl/pinctrl-ocelot.c
+index 4b99922d6c7e7..b1bf46ec207fd 100644
+--- a/drivers/pinctrl/pinctrl-ocelot.c
++++ b/drivers/pinctrl/pinctrl-ocelot.c
+@@ -752,21 +752,21 @@ static int ocelot_gpiochip_register(struct platform_device *pdev,
+       gc->of_node = info->dev->of_node;
+       gc->label = "ocelot-gpio";
+-      irq = irq_of_parse_and_map(pdev->dev.of_node, 0);
+-      if (irq <= 0)
+-              return irq;
+-
+-      girq = &gc->irq;
+-      girq->chip = &ocelot_irqchip;
+-      girq->parent_handler = ocelot_irq_handler;
+-      girq->num_parents = 1;
+-      girq->parents = devm_kcalloc(&pdev->dev, 1, sizeof(*girq->parents),
+-                                   GFP_KERNEL);
+-      if (!girq->parents)
+-              return -ENOMEM;
+-      girq->parents[0] = irq;
+-      girq->default_type = IRQ_TYPE_NONE;
+-      girq->handler = handle_edge_irq;
++      irq = irq_of_parse_and_map(gc->of_node, 0);
++      if (irq) {
++              girq = &gc->irq;
++              girq->chip = &ocelot_irqchip;
++              girq->parent_handler = ocelot_irq_handler;
++              girq->num_parents = 1;
++              girq->parents = devm_kcalloc(&pdev->dev, 1,
++                                           sizeof(*girq->parents),
++                                           GFP_KERNEL);
++              if (!girq->parents)
++                      return -ENOMEM;
++              girq->parents[0] = irq;
++              girq->default_type = IRQ_TYPE_NONE;
++              girq->handler = handle_edge_irq;
++      }
+       ret = devm_gpiochip_add_data(&pdev->dev, gc, info);
+       if (ret)
+-- 
+2.25.1
+
diff --git a/queue-5.7/pinctrl-ocelot-fix-gpio-interrupt-decoding-on-jaguar.patch b/queue-5.7/pinctrl-ocelot-fix-gpio-interrupt-decoding-on-jaguar.patch
new file mode 100644 (file)
index 0000000..0893a86
--- /dev/null
@@ -0,0 +1,45 @@
+From b5c5b5ae098cd23e23887e6ae0917b49b2078149 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 13 May 2020 14:55:21 +0200
+Subject: pinctrl: ocelot: Fix GPIO interrupt decoding on Jaguar2
+
+From: Lars Povlsen <lars.povlsen@microchip.com>
+
+[ Upstream commit 0b47afc65453a70bc521e251138418056f65793f ]
+
+This fixes a problem with using the GPIO as an interrupt on Jaguar2
+(and similar), as the register layout of the platforms with 64 GPIO's
+are pairwise, such that the original offset must be multiplied with
+the platform stride.
+
+Fixes: da801ab56ad8 pinctrl: ocelot: add MSCC Jaguar2 support.
+Reviewed-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
+Signed-off-by: Lars Povlsen <lars.povlsen@microchip.com>
+Link: https://lore.kernel.org/r/20200513125532.24585-4-lars.povlsen@microchip.com
+Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/pinctrl/pinctrl-ocelot.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/pinctrl/pinctrl-ocelot.c b/drivers/pinctrl/pinctrl-ocelot.c
+index ed8eac6c14944..4b99922d6c7e7 100644
+--- a/drivers/pinctrl/pinctrl-ocelot.c
++++ b/drivers/pinctrl/pinctrl-ocelot.c
+@@ -714,11 +714,12 @@ static void ocelot_irq_handler(struct irq_desc *desc)
+       struct irq_chip *parent_chip = irq_desc_get_chip(desc);
+       struct gpio_chip *chip = irq_desc_get_handler_data(desc);
+       struct ocelot_pinctrl *info = gpiochip_get_data(chip);
++      unsigned int id_reg = OCELOT_GPIO_INTR_IDENT * info->stride;
+       unsigned int reg = 0, irq, i;
+       unsigned long irqs;
+       for (i = 0; i < info->stride; i++) {
+-              regmap_read(info->map, OCELOT_GPIO_INTR_IDENT + 4 * i, &reg);
++              regmap_read(info->map, id_reg + 4 * i, &reg);
+               if (!reg)
+                       continue;
+-- 
+2.25.1
+
diff --git a/queue-5.7/pinctrl-qcom-ipq6018-add-missing-pins-in-qpic-pin-gr.patch b/queue-5.7/pinctrl-qcom-ipq6018-add-missing-pins-in-qpic-pin-gr.patch
new file mode 100644 (file)
index 0000000..373d7c7
--- /dev/null
@@ -0,0 +1,38 @@
+From 7516764d90c0a0e79ecb725f587526033f6ab996 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 19 Jun 2020 10:01:29 +0530
+Subject: pinctrl: qcom: ipq6018 Add missing pins in qpic pin group
+
+From: Sivaprakash Murugesan <sivaprak@codeaurora.org>
+
+[ Upstream commit 7f5f4de83ca30a4922bb178b80144e2778faad01 ]
+
+The patch adds missing qpic data pins to qpic pingroup. These pins are
+necessary for the qpic nand to work.
+
+Fixes: ef1ea54eab0e ("pinctrl: qcom: Add ipq6018 pinctrl driver")
+Signed-off-by: Sivaprakash Murugesan <sivaprak@codeaurora.org>
+Link: https://lore.kernel.org/r/1592541089-17700-1-git-send-email-sivaprak@codeaurora.org
+Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/pinctrl/qcom/pinctrl-ipq6018.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/pinctrl/qcom/pinctrl-ipq6018.c b/drivers/pinctrl/qcom/pinctrl-ipq6018.c
+index 38c33a778cb8d..ec50a3b4bd161 100644
+--- a/drivers/pinctrl/qcom/pinctrl-ipq6018.c
++++ b/drivers/pinctrl/qcom/pinctrl-ipq6018.c
+@@ -367,7 +367,8 @@ static const char * const wci20_groups[] = {
+ static const char * const qpic_pad_groups[] = {
+       "gpio0", "gpio1", "gpio2", "gpio3", "gpio4", "gpio9", "gpio10",
+-      "gpio11", "gpio17",
++      "gpio11", "gpio17", "gpio15", "gpio12", "gpio13", "gpio14", "gpio5",
++      "gpio6", "gpio7", "gpio8",
+ };
+ static const char * const burn0_groups[] = {
+-- 
+2.25.1
+
diff --git a/queue-5.7/pinctrl-rockchip-fix-memleak-in-rockchip_dt_node_to_.patch b/queue-5.7/pinctrl-rockchip-fix-memleak-in-rockchip_dt_node_to_.patch
new file mode 100644 (file)
index 0000000..783dd20
--- /dev/null
@@ -0,0 +1,64 @@
+From 055ca4ba29552c4f5e62e0ca93b55e8df8a5185e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 6 May 2020 12:09:03 +0200
+Subject: pinctrl: rockchip: fix memleak in rockchip_dt_node_to_map
+
+From: Dafna Hirschfeld <dafna.hirschfeld@collabora.com>
+
+[ Upstream commit d7faa8ffb6be57bf8233a4b5a636d76b83c51ce7 ]
+
+In function rockchip_dt_node_to_map, a new_map variable is
+allocated by:
+
+new_map = devm_kcalloc(pctldev->dev, map_num, sizeof(*new_map),
+                      GFP_KERNEL);
+
+This uses devres and attaches new_map to the pinctrl driver.
+This cause a leak since new_map is not released when the probed
+driver is removed. Fix it by using kcalloc to allocate new_map
+and free it in `rockchip_dt_free_map`
+
+Signed-off-by: Dafna Hirschfeld <dafna.hirschfeld@collabora.com>
+Reviewed-by: Heiko Stuebner <heiko@sntech.de>
+Link: https://lore.kernel.org/r/20200506100903.15420-1-dafna.hirschfeld@collabora.com
+Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/pinctrl/pinctrl-rockchip.c | 7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/pinctrl/pinctrl-rockchip.c b/drivers/pinctrl/pinctrl-rockchip.c
+index 0989513463393..d7869b636889e 100644
+--- a/drivers/pinctrl/pinctrl-rockchip.c
++++ b/drivers/pinctrl/pinctrl-rockchip.c
+@@ -508,8 +508,8 @@ static int rockchip_dt_node_to_map(struct pinctrl_dev *pctldev,
+       }
+       map_num += grp->npins;
+-      new_map = devm_kcalloc(pctldev->dev, map_num, sizeof(*new_map),
+-                                                              GFP_KERNEL);
++
++      new_map = kcalloc(map_num, sizeof(*new_map), GFP_KERNEL);
+       if (!new_map)
+               return -ENOMEM;
+@@ -519,7 +519,7 @@ static int rockchip_dt_node_to_map(struct pinctrl_dev *pctldev,
+       /* create mux map */
+       parent = of_get_parent(np);
+       if (!parent) {
+-              devm_kfree(pctldev->dev, new_map);
++              kfree(new_map);
+               return -EINVAL;
+       }
+       new_map[0].type = PIN_MAP_TYPE_MUX_GROUP;
+@@ -546,6 +546,7 @@ static int rockchip_dt_node_to_map(struct pinctrl_dev *pctldev,
+ static void rockchip_dt_free_map(struct pinctrl_dev *pctldev,
+                                   struct pinctrl_map *map, unsigned num_maps)
+ {
++      kfree(map);
+ }
+ static const struct pinctrl_ops rockchip_pctrl_ops = {
+-- 
+2.25.1
+
diff --git a/queue-5.7/pinctrl-rza1-fix-wrong-array-assignment-of-rza1l_swi.patch b/queue-5.7/pinctrl-rza1-fix-wrong-array-assignment-of-rza1l_swi.patch
new file mode 100644 (file)
index 0000000..88b1834
--- /dev/null
@@ -0,0 +1,48 @@
+From 93d9264c46f560c8e6135337982b8d4d9f132f91 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 17 Apr 2020 19:16:04 +0800
+Subject: pinctrl: rza1: Fix wrong array assignment of rza1l_swio_entries
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Jason Yan <yanaijie@huawei.com>
+
+[ Upstream commit 4b4e8e93eccc2abc4209fe226ec89e7fbe9f3c61 ]
+
+The rza1l_swio_entries referred to the wrong array rza1h_swio_pins,
+which was intended to be rza1l_swio_pins. So let's fix it.
+
+This is detected by the following gcc warning:
+
+drivers/pinctrl/pinctrl-rza1.c:401:35: warning: ‘rza1l_swio_pins’
+defined but not used [-Wunused-const-variable=]
+ static const struct rza1_swio_pin rza1l_swio_pins[] = {
+                                   ^~~~~~~~~~~~~~~
+
+Fixes: 039bc58e73b77723 ("pinctrl: rza1: Add support for RZ/A1L")
+Reported-by: Hulk Robot <hulkci@huawei.com>
+Signed-off-by: Jason Yan <yanaijie@huawei.com>
+Link: https://lore.kernel.org/r/20200417111604.19143-1-yanaijie@huawei.com
+Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/pinctrl/pinctrl-rza1.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/pinctrl/pinctrl-rza1.c b/drivers/pinctrl/pinctrl-rza1.c
+index da2d8365c690e..ff4a7fb518bb3 100644
+--- a/drivers/pinctrl/pinctrl-rza1.c
++++ b/drivers/pinctrl/pinctrl-rza1.c
+@@ -418,7 +418,7 @@ static const struct rza1_bidir_entry rza1l_bidir_entries[RZA1_NPORTS] = {
+ };
+ static const struct rza1_swio_entry rza1l_swio_entries[] = {
+-      [0] = { ARRAY_SIZE(rza1h_swio_pins), rza1h_swio_pins },
++      [0] = { ARRAY_SIZE(rza1l_swio_pins), rza1l_swio_pins },
+ };
+ /* RZ/A1L (r7s72102x) pinmux flags table */
+-- 
+2.25.1
+
diff --git a/queue-5.7/pinctrl-sirf-add-missing-put_device-call-in-sirfsoc_.patch b/queue-5.7/pinctrl-sirf-add-missing-put_device-call-in-sirfsoc_.patch
new file mode 100644 (file)
index 0000000..e7a49f8
--- /dev/null
@@ -0,0 +1,80 @@
+From 8cacfe4099e34b5bdfd56acf4a71d1d14d8fea64 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 3 Jun 2020 09:35:32 +0800
+Subject: pinctrl: sirf: add missing put_device() call in sirfsoc_gpio_probe()
+
+From: yu kuai <yukuai3@huawei.com>
+
+[ Upstream commit 66339f2fba3fa05b0507e1887e4c6abcfc6228a3 ]
+
+A coccicheck run provided information like the following:
+
+drivers/pinctrl/sirf/pinctrl-sirf.c:798:2-8: ERROR: missing put_device;
+call of_find_device_by_node on line 792, but without a corresponding
+object release within this function.
+
+Generated by: scripts/coccinelle/free/put_device.cocci
+
+Thus add a jump target to fix the exception handling for this
+function implementation.
+
+Fixes: 5130216265f6 ("PINCTRL: SiRF: add GPIO and GPIO irq support in CSR SiRFprimaII")
+Signed-off-by: yu kuai <yukuai3@huawei.com>
+Link: https://lore.kernel.org/r/20200603013532.755220-1-yukuai3@huawei.com
+Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/pinctrl/sirf/pinctrl-sirf.c | 20 ++++++++++++++------
+ 1 file changed, 14 insertions(+), 6 deletions(-)
+
+diff --git a/drivers/pinctrl/sirf/pinctrl-sirf.c b/drivers/pinctrl/sirf/pinctrl-sirf.c
+index 1ebcb957c6541..63a287d5795f0 100644
+--- a/drivers/pinctrl/sirf/pinctrl-sirf.c
++++ b/drivers/pinctrl/sirf/pinctrl-sirf.c
+@@ -794,13 +794,17 @@ static int sirfsoc_gpio_probe(struct device_node *np)
+               return -ENODEV;
+       sgpio = devm_kzalloc(&pdev->dev, sizeof(*sgpio), GFP_KERNEL);
+-      if (!sgpio)
+-              return -ENOMEM;
++      if (!sgpio) {
++              err = -ENOMEM;
++              goto out_put_device;
++      }
+       spin_lock_init(&sgpio->lock);
+       regs = of_iomap(np, 0);
+-      if (!regs)
+-              return -ENOMEM;
++      if (!regs) {
++              err = -ENOMEM;
++              goto out_put_device;
++      }
+       sgpio->chip.gc.request = sirfsoc_gpio_request;
+       sgpio->chip.gc.free = sirfsoc_gpio_free;
+@@ -824,8 +828,10 @@ static int sirfsoc_gpio_probe(struct device_node *np)
+       girq->parents = devm_kcalloc(&pdev->dev, SIRFSOC_GPIO_NO_OF_BANKS,
+                                    sizeof(*girq->parents),
+                                    GFP_KERNEL);
+-      if (!girq->parents)
+-              return -ENOMEM;
++      if (!girq->parents) {
++              err = -ENOMEM;
++              goto out_put_device;
++      }
+       for (i = 0; i < SIRFSOC_GPIO_NO_OF_BANKS; i++) {
+               bank = &sgpio->sgpio_bank[i];
+               spin_lock_init(&bank->lock);
+@@ -868,6 +874,8 @@ out_no_range:
+       gpiochip_remove(&sgpio->chip.gc);
+ out:
+       iounmap(regs);
++out_put_device:
++      put_device(&pdev->dev);
+       return err;
+ }
+-- 
+2.25.1
+
diff --git a/queue-5.7/power-supply-bq24257_charger-replace-depends-on-regm.patch b/queue-5.7/power-supply-bq24257_charger-replace-depends-on-regm.patch
new file mode 100644 (file)
index 0000000..2b4f16e
--- /dev/null
@@ -0,0 +1,39 @@
+From 3e425b474141681f98b2959bebc5fe74336b0753 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 13 Apr 2020 16:10:51 +0200
+Subject: power: supply: bq24257_charger: Replace depends on REGMAP_I2C with
+ select
+
+From: Enric Balletbo i Serra <enric.balletbo@collabora.com>
+
+[ Upstream commit 87c3d579c8ed0eaea6b1567d529a8daa85a2bc6c ]
+
+regmap is a library function that gets selected by drivers that need
+it. No driver modules should depend on it. Depending on REGMAP_I2C makes
+this driver only build if another driver already selected REGMAP_I2C,
+as the symbol can't be selected through the menu kernel configuration.
+
+Fixes: 2219a935963e ("power_supply: Add TI BQ24257 charger driver")
+Signed-off-by: Enric Balletbo i Serra <enric.balletbo@collabora.com>
+Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/power/supply/Kconfig | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/power/supply/Kconfig b/drivers/power/supply/Kconfig
+index f3424fdce341a..d37ec0d03237f 100644
+--- a/drivers/power/supply/Kconfig
++++ b/drivers/power/supply/Kconfig
+@@ -577,7 +577,7 @@ config CHARGER_BQ24257
+       tristate "TI BQ24250/24251/24257 battery charger driver"
+       depends on I2C
+       depends on GPIOLIB || COMPILE_TEST
+-      depends on REGMAP_I2C
++      select REGMAP_I2C
+       help
+         Say Y to enable support for the TI BQ24250, BQ24251, and BQ24257 battery
+         chargers.
+-- 
+2.25.1
+
diff --git a/queue-5.7/power-supply-lp8788-fix-an-error-handling-path-in-lp.patch b/queue-5.7/power-supply-lp8788-fix-an-error-handling-path-in-lp.patch
new file mode 100644 (file)
index 0000000..312eb37
--- /dev/null
@@ -0,0 +1,71 @@
+From c310468aa30c6e0d74cdceab8d20935c754b460b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 9 May 2020 10:23:23 +0200
+Subject: power: supply: lp8788: Fix an error handling path in
+ 'lp8788_charger_probe()'
+
+From: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
+
+[ Upstream commit 934ed3847a4ebc75b655659c4d2349ba4337941c ]
+
+In the probe function, in case of error, resources allocated in
+'lp8788_setup_adc_channel()' must be released.
+
+This can be achieved easily by using the devm_ variant of
+'iio_channel_get()'.
+This has the extra benefit to simplify the remove function and to axe the
+'lp8788_release_adc_channel()' function which is now useless.
+
+Fixes: 98a276649358 ("power_supply: Add new lp8788 charger driver")
+Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
+Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/power/supply/lp8788-charger.c | 18 ++----------------
+ 1 file changed, 2 insertions(+), 16 deletions(-)
+
+diff --git a/drivers/power/supply/lp8788-charger.c b/drivers/power/supply/lp8788-charger.c
+index 84a206f42a8e9..e7931ffb7151d 100644
+--- a/drivers/power/supply/lp8788-charger.c
++++ b/drivers/power/supply/lp8788-charger.c
+@@ -572,27 +572,14 @@ static void lp8788_setup_adc_channel(struct device *dev,
+               return;
+       /* ADC channel for battery voltage */
+-      chan = iio_channel_get(dev, pdata->adc_vbatt);
++      chan = devm_iio_channel_get(dev, pdata->adc_vbatt);
+       pchg->chan[LP8788_VBATT] = IS_ERR(chan) ? NULL : chan;
+       /* ADC channel for battery temperature */
+-      chan = iio_channel_get(dev, pdata->adc_batt_temp);
++      chan = devm_iio_channel_get(dev, pdata->adc_batt_temp);
+       pchg->chan[LP8788_BATT_TEMP] = IS_ERR(chan) ? NULL : chan;
+ }
+-static void lp8788_release_adc_channel(struct lp8788_charger *pchg)
+-{
+-      int i;
+-
+-      for (i = 0; i < LP8788_NUM_CHG_ADC; i++) {
+-              if (!pchg->chan[i])
+-                      continue;
+-
+-              iio_channel_release(pchg->chan[i]);
+-              pchg->chan[i] = NULL;
+-      }
+-}
+-
+ static ssize_t lp8788_show_charger_status(struct device *dev,
+                               struct device_attribute *attr, char *buf)
+ {
+@@ -735,7 +722,6 @@ static int lp8788_charger_remove(struct platform_device *pdev)
+       flush_work(&pchg->charger_work);
+       lp8788_irq_unregister(pdev, pchg);
+       lp8788_psy_unregister(pchg);
+-      lp8788_release_adc_channel(pchg);
+       return 0;
+ }
+-- 
+2.25.1
+
diff --git a/queue-5.7/power-supply-smb347-charger-irqstat_d-is-volatile.patch b/queue-5.7/power-supply-smb347-charger-irqstat_d-is-volatile.patch
new file mode 100644 (file)
index 0000000..63a20c2
--- /dev/null
@@ -0,0 +1,38 @@
+From a04a19c257231af64e0ccfa57be572020fa8b6dd Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 29 Mar 2020 18:15:44 +0200
+Subject: power: supply: smb347-charger: IRQSTAT_D is volatile
+
+From: Dmitry Osipenko <digetx@gmail.com>
+
+[ Upstream commit c32ea07a30630ace950e07ffe7a18bdcc25898e1 ]
+
+Fix failure when USB cable is connected:
+smb347 2-006a: reading IRQSTAT_D failed
+
+Fixes: 1502cfe19bac ("smb347-charger: Fix battery status reporting logic for charger faults")
+
+Tested-by: David Heidelberg <david@ixit.cz>
+Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
+Signed-off-by: David Heidelberg <david@ixit.cz>
+Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/power/supply/smb347-charger.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/power/supply/smb347-charger.c b/drivers/power/supply/smb347-charger.c
+index c1d124b8be0c2..d102921b3ab2b 100644
+--- a/drivers/power/supply/smb347-charger.c
++++ b/drivers/power/supply/smb347-charger.c
+@@ -1138,6 +1138,7 @@ static bool smb347_volatile_reg(struct device *dev, unsigned int reg)
+       switch (reg) {
+       case IRQSTAT_A:
+       case IRQSTAT_C:
++      case IRQSTAT_D:
+       case IRQSTAT_E:
+       case IRQSTAT_F:
+       case STAT_A:
+-- 
+2.25.1
+
diff --git a/queue-5.7/powerpc-32s-don-t-warn-when-mapping-ro-data-rox.patch b/queue-5.7/powerpc-32s-don-t-warn-when-mapping-ro-data-rox.patch
new file mode 100644 (file)
index 0000000..fd2ec31
--- /dev/null
@@ -0,0 +1,58 @@
+From f6643e37b04f47108fa59974df8b9a419221d3a4 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 19 May 2020 05:48:56 +0000
+Subject: powerpc/32s: Don't warn when mapping RO data ROX.
+
+From: Christophe Leroy <christophe.leroy@csgroup.eu>
+
+[ Upstream commit 4b19f96a81bceaf0bcf44d79c0855c61158065ec ]
+
+Mapping RO data as ROX is not an issue since that data
+cannot be modified to introduce an exploit.
+
+PPC64 accepts to have RO data mapped ROX, as a trade off
+between kernel size and strictness of protection.
+
+On PPC32, kernel size is even more critical as amount of
+memory is usually small.
+
+Depending on the number of available IBATs, the last IBATs
+might overflow the end of text. Only warn if it crosses
+the end of RO data.
+
+Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
+Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
+Link: https://lore.kernel.org/r/6499f8eeb2a36330e5c9fc1cee9a79374875bd54.1589866984.git.christophe.leroy@csgroup.eu
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/powerpc/mm/book3s32/mmu.c | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+diff --git a/arch/powerpc/mm/book3s32/mmu.c b/arch/powerpc/mm/book3s32/mmu.c
+index 39ba53ca5bb55..a9b2cbc747977 100644
+--- a/arch/powerpc/mm/book3s32/mmu.c
++++ b/arch/powerpc/mm/book3s32/mmu.c
+@@ -187,6 +187,7 @@ void mmu_mark_initmem_nx(void)
+       int i;
+       unsigned long base = (unsigned long)_stext - PAGE_OFFSET;
+       unsigned long top = (unsigned long)_etext - PAGE_OFFSET;
++      unsigned long border = (unsigned long)__init_begin - PAGE_OFFSET;
+       unsigned long size;
+       if (IS_ENABLED(CONFIG_PPC_BOOK3S_601))
+@@ -201,9 +202,10 @@ void mmu_mark_initmem_nx(void)
+               size = block_size(base, top);
+               size = max(size, 128UL << 10);
+               if ((top - base) > size) {
+-                      if (strict_kernel_rwx_enabled())
+-                              pr_warn("Kernel _etext not properly aligned\n");
+                       size <<= 1;
++                      if (strict_kernel_rwx_enabled() && base + size > border)
++                              pr_warn("Some RW data is getting mapped X. "
++                                      "Adjust CONFIG_DATA_SHIFT to avoid that.\n");
+               }
+               setibat(i++, PAGE_OFFSET + base, base, size, PAGE_KERNEL_TEXT);
+               base += size;
+-- 
+2.25.1
+
diff --git a/queue-5.7/powerpc-4xx-don-t-unmap-null-mbase.patch b/queue-5.7/powerpc-4xx-don-t-unmap-null-mbase.patch
new file mode 100644 (file)
index 0000000..44bb8fd
--- /dev/null
@@ -0,0 +1,43 @@
+From 3f9590f7d60bc6beffaba1e21ff473eaafddd5e2 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 21 May 2020 17:26:48 +1000
+Subject: powerpc/4xx: Don't unmap NULL mbase
+
+From: huhai <huhai@tj.kylinos.cn>
+
+[ Upstream commit bcec081ecc940fc38730b29c743bbee661164161 ]
+
+Signed-off-by: huhai <huhai@tj.kylinos.cn>
+Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
+Link: https://lore.kernel.org/r/20200521072648.1254699-1-mpe@ellerman.id.au
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/powerpc/platforms/4xx/pci.c | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+diff --git a/arch/powerpc/platforms/4xx/pci.c b/arch/powerpc/platforms/4xx/pci.c
+index e6e2adcc7b64c..c13d64c3b0194 100644
+--- a/arch/powerpc/platforms/4xx/pci.c
++++ b/arch/powerpc/platforms/4xx/pci.c
+@@ -1242,7 +1242,7 @@ static void __init ppc460sx_pciex_check_link(struct ppc4xx_pciex_port *port)
+       if (mbase == NULL) {
+               printk(KERN_ERR "%pOF: Can't map internal config space !",
+                       port->node);
+-              goto done;
++              return;
+       }
+       while (attempt && (0 == (in_le32(mbase + PECFG_460SX_DLLSTA)
+@@ -1252,9 +1252,7 @@ static void __init ppc460sx_pciex_check_link(struct ppc4xx_pciex_port *port)
+       }
+       if (attempt)
+               port->link = 1;
+-done:
+       iounmap(mbase);
+-
+ }
+ static struct ppc4xx_pciex_hwops ppc460sx_pcie_hwops __initdata = {
+-- 
+2.25.1
+
diff --git a/queue-5.7/powerpc-64-don-t-initialise-init_task-thread.regs.patch b/queue-5.7/powerpc-64-don-t-initialise-init_task-thread.regs.patch
new file mode 100644 (file)
index 0000000..cba2f0a
--- /dev/null
@@ -0,0 +1,182 @@
+From b4d30cb363e0fb0ed230076fd45fd8a5ef0558a3 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 28 Apr 2020 22:31:30 +1000
+Subject: powerpc/64: Don't initialise init_task->thread.regs
+
+From: Michael Ellerman <mpe@ellerman.id.au>
+
+[ Upstream commit 7ffa8b7dc11752827329e4e84a574ea6aaf24716 ]
+
+Aneesh increased the size of struct pt_regs by 16 bytes and started
+seeing this WARN_ON:
+
+  smp: Bringing up secondary CPUs ...
+  ------------[ cut here ]------------
+  WARNING: CPU: 0 PID: 0 at arch/powerpc/kernel/process.c:455 giveup_all+0xb4/0x110
+  Modules linked in:
+  CPU: 0 PID: 0 Comm: swapper/0 Not tainted 5.7.0-rc2-gcc-8.2.0-1.g8f6a41f-default+ #318
+  NIP:  c00000000001a2b4 LR: c00000000001a29c CTR: c0000000031d0000
+  REGS: c0000000026d3980 TRAP: 0700   Not tainted  (5.7.0-rc2-gcc-8.2.0-1.g8f6a41f-default+)
+  MSR:  800000000282b033 <SF,VEC,VSX,EE,FP,ME,IR,DR,RI,LE>  CR: 48048224  XER: 00000000
+  CFAR: c000000000019cc8 IRQMASK: 1
+  GPR00: c00000000001a264 c0000000026d3c20 c0000000026d7200 800000000280b033
+  GPR04: 0000000000000001 0000000000000000 0000000000000077 30206d7372203164
+  GPR08: 0000000000002000 0000000002002000 800000000280b033 3230303030303030
+  GPR12: 0000000000008800 c0000000031d0000 0000000000800050 0000000002000066
+  GPR16: 000000000309a1a0 000000000309a4b0 000000000309a2d8 000000000309a890
+  GPR20: 00000000030d0098 c00000000264da40 00000000fd620000 c0000000ff798080
+  GPR24: c00000000264edf0 c0000001007469f0 00000000fd620000 c0000000020e5e90
+  GPR28: c00000000264edf0 c00000000264d200 000000001db60000 c00000000264d200
+  NIP [c00000000001a2b4] giveup_all+0xb4/0x110
+  LR [c00000000001a29c] giveup_all+0x9c/0x110
+  Call Trace:
+  [c0000000026d3c20] [c00000000001a264] giveup_all+0x64/0x110 (unreliable)
+  [c0000000026d3c90] [c00000000001ae34] __switch_to+0x104/0x480
+  [c0000000026d3cf0] [c000000000e0b8a0] __schedule+0x320/0x970
+  [c0000000026d3dd0] [c000000000e0c518] schedule_idle+0x38/0x70
+  [c0000000026d3df0] [c00000000019c7c8] do_idle+0x248/0x3f0
+  [c0000000026d3e70] [c00000000019cbb8] cpu_startup_entry+0x38/0x40
+  [c0000000026d3ea0] [c000000000011bb0] rest_init+0xe0/0xf8
+  [c0000000026d3ed0] [c000000002004820] start_kernel+0x990/0x9e0
+  [c0000000026d3f90] [c00000000000c49c] start_here_common+0x1c/0x400
+
+Which was unexpected. The warning is checking the thread.regs->msr
+value of the task we are switching from:
+
+  usermsr = tsk->thread.regs->msr;
+  ...
+  WARN_ON((usermsr & MSR_VSX) && !((usermsr & MSR_FP) && (usermsr & MSR_VEC)));
+
+ie. if MSR_VSX is set then both of MSR_FP and MSR_VEC are also set.
+
+Dumping tsk->thread.regs->msr we see that it's: 0x1db60000
+
+Which is not a normal looking MSR, in fact the only valid bit is
+MSR_VSX, all the other bits are reserved in the current definition of
+the MSR.
+
+We can see from the oops that it was swapper/0 that we were switching
+from when we hit the warning, ie. init_task. So its thread.regs points
+to the base (high addresses) in init_stack.
+
+Dumping the content of init_task->thread.regs, with the members of
+pt_regs annotated (the 16 bytes larger version), we see:
+
+  0000000000000000 c000000002780080    gpr[0]     gpr[1]
+  0000000000000000 c000000002666008    gpr[2]     gpr[3]
+  c0000000026d3ed0 0000000000000078    gpr[4]     gpr[5]
+  c000000000011b68 c000000002780080    gpr[6]     gpr[7]
+  0000000000000000 0000000000000000    gpr[8]     gpr[9]
+  c0000000026d3f90 0000800000002200    gpr[10]    gpr[11]
+  c000000002004820 c0000000026d7200    gpr[12]    gpr[13]
+  000000001db60000 c0000000010aabe8    gpr[14]    gpr[15]
+  c0000000010aabe8 c0000000010aabe8    gpr[16]    gpr[17]
+  c00000000294d598 0000000000000000    gpr[18]    gpr[19]
+  0000000000000000 0000000000001ff8    gpr[20]    gpr[21]
+  0000000000000000 c00000000206d608    gpr[22]    gpr[23]
+  c00000000278e0cc 0000000000000000    gpr[24]    gpr[25]
+  000000002fff0000 c000000000000000    gpr[26]    gpr[27]
+  0000000002000000 0000000000000028    gpr[28]    gpr[29]
+  000000001db60000 0000000004750000    gpr[30]    gpr[31]
+  0000000002000000 000000001db60000    nip        msr
+  0000000000000000 0000000000000000    orig_r3    ctr
+  c00000000000c49c 0000000000000000    link       xer
+  0000000000000000 0000000000000000    ccr        softe
+  0000000000000000 0000000000000000    trap       dar
+  0000000000000000 0000000000000000    dsisr      result
+  0000000000000000 0000000000000000    ppr        kuap
+  0000000000000000 0000000000000000    pad[2]     pad[3]
+
+This looks suspiciously like stack frames, not a pt_regs. If we look
+closely we can see return addresses from the stack trace above,
+c000000002004820 (start_kernel) and c00000000000c49c (start_here_common).
+
+init_task->thread.regs is setup at build time in processor.h:
+
+  #define INIT_THREAD  { \
+       .ksp = INIT_SP, \
+       .regs = (struct pt_regs *)INIT_SP - 1, /* XXX bogus, I think */ \
+
+The early boot code where we setup the initial stack is:
+
+  LOAD_REG_ADDR(r3,init_thread_union)
+
+  /* set up a stack pointer */
+  LOAD_REG_IMMEDIATE(r1,THREAD_SIZE)
+  add  r1,r3,r1
+  li   r0,0
+  stdu r0,-STACK_FRAME_OVERHEAD(r1)
+
+Which creates a stack frame of size 112 bytes (STACK_FRAME_OVERHEAD).
+Which is far too small to contain a pt_regs.
+
+So the result is init_task->thread.regs is pointing at some stack
+frames on the init stack, not at a pt_regs.
+
+We have gotten away with this for so long because with pt_regs at its
+current size the MSR happens to point into the first frame, at a
+location that is not written to by the early asm. With the 16 byte
+expansion the MSR falls into the second frame, which is used by the
+compiler, and collides with a saved register that tends to be
+non-zero.
+
+As far as I can see this has been wrong since the original merge of
+64-bit ppc support, back in 2002.
+
+Conceptually swapper should have no regs, it never entered from
+userspace, and in fact that's what we do on 32-bit. It's also
+presumably what the "bogus" comment is referring to.
+
+So I think the right fix is to just not-initialise regs at all. I'm
+slightly worried this will break some code that isn't prepared for a
+NULL regs, but we'll have to see.
+
+Remove the comment in head_64.S which refers to us setting up the
+regs (even though we never did), and is otherwise not really accurate
+any more.
+
+Reported-by: Aneesh Kumar K.V <aneesh.kumar@linux.ibm.com>
+Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
+Link: https://lore.kernel.org/r/20200428123130.73078-1-mpe@ellerman.id.au
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/powerpc/include/asm/processor.h | 1 -
+ arch/powerpc/kernel/head_64.S        | 9 +--------
+ 2 files changed, 1 insertion(+), 9 deletions(-)
+
+diff --git a/arch/powerpc/include/asm/processor.h b/arch/powerpc/include/asm/processor.h
+index eedcbfb9a6ff3..c220cb9eccad9 100644
+--- a/arch/powerpc/include/asm/processor.h
++++ b/arch/powerpc/include/asm/processor.h
+@@ -301,7 +301,6 @@ struct thread_struct {
+ #else
+ #define INIT_THREAD  { \
+       .ksp = INIT_SP, \
+-      .regs = (struct pt_regs *)INIT_SP - 1, /* XXX bogus, I think */ \
+       .addr_limit = KERNEL_DS, \
+       .fpexc_mode = 0, \
+       .fscr = FSCR_TAR | FSCR_EBB \
+diff --git a/arch/powerpc/kernel/head_64.S b/arch/powerpc/kernel/head_64.S
+index ddfbd02140d9b..0e05a9a47a4b3 100644
+--- a/arch/powerpc/kernel/head_64.S
++++ b/arch/powerpc/kernel/head_64.S
+@@ -947,15 +947,8 @@ start_here_multiplatform:
+       std     r0,0(r4)
+ #endif
+-      /* The following gets the stack set up with the regs */
+-      /* pointing to the real addr of the kernel stack.  This is   */
+-      /* all done to support the C function call below which sets  */
+-      /* up the htab.  This is done because we have relocated the  */
+-      /* kernel but are still running in real mode. */
+-
+-      LOAD_REG_ADDR(r3,init_thread_union)
+-
+       /* set up a stack pointer */
++      LOAD_REG_ADDR(r3,init_thread_union)
+       LOAD_REG_IMMEDIATE(r1,THREAD_SIZE)
+       add     r1,r3,r1
+       li      r0,0
+-- 
+2.25.1
+
diff --git a/queue-5.7/powerpc-64s-exception-fix-machine-check-no-loss-idle.patch b/queue-5.7/powerpc-64s-exception-fix-machine-check-no-loss-idle.patch
new file mode 100644 (file)
index 0000000..623e517
--- /dev/null
@@ -0,0 +1,75 @@
+From 5b7fcc14f437b2e5d360885a23f121bd2d0afb07 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 8 May 2020 14:33:53 +1000
+Subject: powerpc/64s/exception: Fix machine check no-loss idle wakeup
+
+From: Nicholas Piggin <npiggin@gmail.com>
+
+[ Upstream commit 8a5054d8cbbe03c68dcb0957c291c942132e4101 ]
+
+The architecture allows for machine check exceptions to cause idle
+wakeups which resume at the 0x200 address which has to return via
+the idle wakeup code, but the early machine check handler is run
+first.
+
+The case of a no state-loss sleep is broken because the early
+handler uses non-volatile register r1 , which is needed for the wakeup
+protocol, but it is not restored.
+
+Fix this by loading r1 from the MCE exception frame before returning
+to the idle wakeup code. Also update the comment which has become
+stale since the idle rewrite in C.
+
+This crash was found and fix confirmed with a machine check injection
+test in qemu powernv model (which is not upstream in qemu yet).
+
+Fixes: 10d91611f426d ("powerpc/64s: Reimplement book3s idle code in C")
+Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
+Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
+Link: https://lore.kernel.org/r/20200508043408.886394-2-npiggin@gmail.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/powerpc/kernel/exceptions-64s.S | 14 ++++++++------
+ 1 file changed, 8 insertions(+), 6 deletions(-)
+
+diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S
+index ebeebab74b564..463372046169a 100644
+--- a/arch/powerpc/kernel/exceptions-64s.S
++++ b/arch/powerpc/kernel/exceptions-64s.S
+@@ -1225,17 +1225,19 @@ EXC_COMMON_BEGIN(machine_check_idle_common)
+       bl      machine_check_queue_event
+       /*
+-       * We have not used any non-volatile GPRs here, and as a rule
+-       * most exception code including machine check does not.
+-       * Therefore PACA_NAPSTATELOST does not need to be set. Idle
+-       * wakeup will restore volatile registers.
++       * GPR-loss wakeups are relatively straightforward, because the
++       * idle sleep code has saved all non-volatile registers on its
++       * own stack, and r1 in PACAR1.
+        *
+-       * Load the original SRR1 into r3 for pnv_powersave_wakeup_mce.
++       * For no-loss wakeups the r1 and lr registers used by the
++       * early machine check handler have to be restored first. r2 is
++       * the kernel TOC, so no need to restore it.
+        *
+        * Then decrement MCE nesting after finishing with the stack.
+        */
+       ld      r3,_MSR(r1)
+       ld      r4,_LINK(r1)
++      ld      r1,GPR1(r1)
+       lhz     r11,PACA_IN_MCE(r13)
+       subi    r11,r11,1
+@@ -1244,7 +1246,7 @@ EXC_COMMON_BEGIN(machine_check_idle_common)
+       mtlr    r4
+       rlwinm  r10,r3,47-31,30,31
+       cmpwi   cr1,r10,2
+-      bltlr   cr1     /* no state loss, return to idle caller */
++      bltlr   cr1     /* no state loss, return to idle caller with r3=SRR1 */
+       b       idle_return_gpr_loss
+ #endif
+-- 
+2.25.1
+
diff --git a/queue-5.7/powerpc-64s-exceptions-machine-check-reconcile-irq-s.patch b/queue-5.7/powerpc-64s-exceptions-machine-check-reconcile-irq-s.patch
new file mode 100644 (file)
index 0000000..b2f0175
--- /dev/null
@@ -0,0 +1,90 @@
+From 031726396a34f595b21befeb48b1ab0034f8bc19 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 8 May 2020 14:33:56 +1000
+Subject: powerpc/64s/exceptions: Machine check reconcile irq state
+
+From: Nicholas Piggin <npiggin@gmail.com>
+
+[ Upstream commit f0fd9dd3c213c947dfb5bc2cad3ef5e30d3258ec ]
+
+pseries fwnmi machine check code pops the soft-irq checks in rtas_call
+(after the next patch to remove rtas_token from this call path).
+Rather than play whack a mole with these and forever having fragile
+code, it seems better to have the early machine check handler perform
+the same kind of reconcile as the other NMI interrupts.
+
+  WARNING: CPU: 0 PID: 493 at arch/powerpc/kernel/irq.c:343
+  CPU: 0 PID: 493 Comm: a Tainted: G        W
+  NIP:  c00000000001ed2c LR: c000000000042c40 CTR: 0000000000000000
+  REGS: c0000001fffd38b0 TRAP: 0700   Tainted: G        W
+  MSR:  8000000000021003 <SF,ME,RI,LE>  CR: 28000488  XER: 00000000
+  CFAR: c00000000001ec90 IRQMASK: 0
+  GPR00: c000000000043820 c0000001fffd3b40 c0000000012ba300 0000000000000000
+  GPR04: 0000000048000488 0000000000000000 0000000000000000 00000000deadbeef
+  GPR08: 0000000000000080 0000000000000000 0000000000000000 0000000000001001
+  GPR12: 0000000000000000 c0000000014a0000 0000000000000000 0000000000000000
+  GPR16: 0000000000000000 0000000000000000 0000000000000000 0000000000000000
+  GPR20: 0000000000000000 0000000000000000 0000000000000000 0000000000000000
+  GPR24: 0000000000000000 0000000000000000 0000000000000000 0000000000000000
+  GPR28: 0000000000000000 0000000000000001 c000000001360810 0000000000000000
+  NIP [c00000000001ed2c] arch_local_irq_restore.part.0+0xac/0x100
+  LR [c000000000042c40] unlock_rtas+0x30/0x90
+  Call Trace:
+  [c0000001fffd3b40] [c000000001360810] 0xc000000001360810 (unreliable)
+  [c0000001fffd3b60] [c000000000043820] rtas_call+0x1c0/0x280
+  [c0000001fffd3bb0] [c0000000000dc328] fwnmi_release_errinfo+0x38/0x70
+  [c0000001fffd3c10] [c0000000000dcd8c] pseries_machine_check_realmode+0x1dc/0x540
+  [c0000001fffd3cd0] [c00000000003fe04] machine_check_early+0x54/0x70
+  [c0000001fffd3d00] [c000000000008384] machine_check_early_common+0x134/0x1f0
+  --- interrupt: 200 at 0x13f1307c8
+      LR = 0x7fff888b8528
+  Instruction dump:
+  60000000 7d2000a6 71298000 41820068 39200002 7d210164 4bffff9c 60000000
+  60000000 7d2000a6 71298000 4c820020 <0fe00000> 4e800020 60000000 60000000
+
+Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
+Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
+Link: https://lore.kernel.org/r/20200508043408.886394-5-npiggin@gmail.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/powerpc/kernel/exceptions-64s.S | 19 +++++++++++++++++++
+ 1 file changed, 19 insertions(+)
+
+diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S
+index 463372046169a..d3e19934cca99 100644
+--- a/arch/powerpc/kernel/exceptions-64s.S
++++ b/arch/powerpc/kernel/exceptions-64s.S
+@@ -1117,11 +1117,30 @@ END_FTR_SECTION_IFSET(CPU_FTR_HVMODE)
+       li      r10,MSR_RI
+       mtmsrd  r10,1
++      /*
++       * Set IRQS_ALL_DISABLED and save PACAIRQHAPPENED (see
++       * system_reset_common)
++       */
++      li      r10,IRQS_ALL_DISABLED
++      stb     r10,PACAIRQSOFTMASK(r13)
++      lbz     r10,PACAIRQHAPPENED(r13)
++      std     r10,RESULT(r1)
++      ori     r10,r10,PACA_IRQ_HARD_DIS
++      stb     r10,PACAIRQHAPPENED(r13)
++
+       addi    r3,r1,STACK_FRAME_OVERHEAD
+       bl      machine_check_early
+       std     r3,RESULT(r1)   /* Save result */
+       ld      r12,_MSR(r1)
++      /*
++       * Restore soft mask settings.
++       */
++      ld      r10,RESULT(r1)
++      stb     r10,PACAIRQHAPPENED(r13)
++      ld      r10,SOFTE(r1)
++      stb     r10,PACAIRQSOFTMASK(r13)
++
+ #ifdef CONFIG_PPC_P7_NAP
+       /*
+        * Check if thread was in power saving mode. We come here when any
+-- 
+2.25.1
+
diff --git a/queue-5.7/powerpc-64s-kuap-add-missing-isync-to-kuap-restore-p.patch b/queue-5.7/powerpc-64s-kuap-add-missing-isync-to-kuap-restore-p.patch
new file mode 100644 (file)
index 0000000..b1a73a7
--- /dev/null
@@ -0,0 +1,62 @@
+From ac82f76742cb7670e0f5b47faa7da8a388187aa9 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 29 Apr 2020 16:56:50 +1000
+Subject: powerpc/64s/kuap: Add missing isync to KUAP restore paths
+
+From: Nicholas Piggin <npiggin@gmail.com>
+
+[ Upstream commit cb2b53cbffe3c388cd676b63f34e54ceb2643ae2 ]
+
+Writing the AMR register is documented to require context
+synchronizing operations before and after, for it to take effect as
+expected. The KUAP restore at interrupt exit time deliberately avoids
+the isync after the AMR update because it only needs to take effect
+after the context synchronizing RFID that soon follows. Add a comment
+for this.
+
+The missing isync before the update doesn't have an obvious
+justification, and seems it could theoretically allow a rogue user
+access to leak past the AMR update. Add isyncs for these.
+
+Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
+Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
+Link: https://lore.kernel.org/r/20200429065654.1677541-3-npiggin@gmail.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/powerpc/include/asm/book3s/64/kup-radix.h | 11 ++++++++++-
+ 1 file changed, 10 insertions(+), 1 deletion(-)
+
+diff --git a/arch/powerpc/include/asm/book3s/64/kup-radix.h b/arch/powerpc/include/asm/book3s/64/kup-radix.h
+index 3bcef989a35df..101d60f16d466 100644
+--- a/arch/powerpc/include/asm/book3s/64/kup-radix.h
++++ b/arch/powerpc/include/asm/book3s/64/kup-radix.h
+@@ -16,7 +16,9 @@
+ #ifdef CONFIG_PPC_KUAP
+       BEGIN_MMU_FTR_SECTION_NESTED(67)
+       ld      \gpr, STACK_REGS_KUAP(r1)
++      isync
+       mtspr   SPRN_AMR, \gpr
++      /* No isync required, see kuap_restore_amr() */
+       END_MMU_FTR_SECTION_NESTED_IFSET(MMU_FTR_RADIX_KUAP, 67)
+ #endif
+ .endm
+@@ -62,8 +64,15 @@
+ static inline void kuap_restore_amr(struct pt_regs *regs)
+ {
+-      if (mmu_has_feature(MMU_FTR_RADIX_KUAP))
++      if (mmu_has_feature(MMU_FTR_RADIX_KUAP)) {
++              isync();
+               mtspr(SPRN_AMR, regs->kuap);
++              /*
++               * No isync required here because we are about to RFI back to
++               * previous context before any user accesses would be made,
++               * which is a CSI.
++               */
++      }
+ }
+ static inline void kuap_check_amr(void)
+-- 
+2.25.1
+
diff --git a/queue-5.7/powerpc-64s-pgtable-fix-an-undefined-behaviour.patch b/queue-5.7/powerpc-64s-pgtable-fix-an-undefined-behaviour.patch
new file mode 100644 (file)
index 0000000..0c262f0
--- /dev/null
@@ -0,0 +1,79 @@
+From 86085629a4b232e52174e45afc240ebb822089a4 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 5 Mar 2020 23:48:52 -0500
+Subject: powerpc/64s/pgtable: fix an undefined behaviour
+
+From: Qian Cai <cai@lca.pw>
+
+[ Upstream commit c2e929b18cea6cbf71364f22d742d9aad7f4677a ]
+
+Booting a power9 server with hash MMU could trigger an undefined
+behaviour because pud_offset(p4d, 0) will do,
+
+0 >> (PAGE_SHIFT:16 + PTE_INDEX_SIZE:8 + H_PMD_INDEX_SIZE:10)
+
+Fix it by converting pud_index() and friends to static inline
+functions.
+
+UBSAN: shift-out-of-bounds in arch/powerpc/mm/ptdump/ptdump.c:282:15
+shift exponent 34 is too large for 32-bit type 'int'
+CPU: 6 PID: 1 Comm: swapper/0 Not tainted 5.6.0-rc4-next-20200303+ #13
+Call Trace:
+dump_stack+0xf4/0x164 (unreliable)
+ubsan_epilogue+0x18/0x78
+__ubsan_handle_shift_out_of_bounds+0x160/0x21c
+walk_pagetables+0x2cc/0x700
+walk_pud at arch/powerpc/mm/ptdump/ptdump.c:282
+(inlined by) walk_pagetables at arch/powerpc/mm/ptdump/ptdump.c:311
+ptdump_check_wx+0x8c/0xf0
+mark_rodata_ro+0x48/0x80
+kernel_init+0x74/0x194
+ret_from_kernel_thread+0x5c/0x74
+
+Suggested-by: Christophe Leroy <christophe.leroy@c-s.fr>
+Signed-off-by: Qian Cai <cai@lca.pw>
+Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
+Reviewed-by: Christophe Leroy <christophe.leroy@c-s.fr>
+Link: https://lore.kernel.org/r/20200306044852.3236-1-cai@lca.pw
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/powerpc/include/asm/book3s/64/pgtable.h | 23 ++++++++++++++++----
+ 1 file changed, 19 insertions(+), 4 deletions(-)
+
+diff --git a/arch/powerpc/include/asm/book3s/64/pgtable.h b/arch/powerpc/include/asm/book3s/64/pgtable.h
+index 368b136517e04..2838b98bc6df2 100644
+--- a/arch/powerpc/include/asm/book3s/64/pgtable.h
++++ b/arch/powerpc/include/asm/book3s/64/pgtable.h
+@@ -998,10 +998,25 @@ extern struct page *pgd_page(pgd_t pgd);
+ #define pud_page_vaddr(pud)   __va(pud_val(pud) & ~PUD_MASKED_BITS)
+ #define pgd_page_vaddr(pgd)   __va(pgd_val(pgd) & ~PGD_MASKED_BITS)
+-#define pgd_index(address) (((address) >> (PGDIR_SHIFT)) & (PTRS_PER_PGD - 1))
+-#define pud_index(address) (((address) >> (PUD_SHIFT)) & (PTRS_PER_PUD - 1))
+-#define pmd_index(address) (((address) >> (PMD_SHIFT)) & (PTRS_PER_PMD - 1))
+-#define pte_index(address) (((address) >> (PAGE_SHIFT)) & (PTRS_PER_PTE - 1))
++static inline unsigned long pgd_index(unsigned long address)
++{
++      return (address >> PGDIR_SHIFT) & (PTRS_PER_PGD - 1);
++}
++
++static inline unsigned long pud_index(unsigned long address)
++{
++      return (address >> PUD_SHIFT) & (PTRS_PER_PUD - 1);
++}
++
++static inline unsigned long pmd_index(unsigned long address)
++{
++      return (address >> PMD_SHIFT) & (PTRS_PER_PMD - 1);
++}
++
++static inline unsigned long pte_index(unsigned long address)
++{
++      return (address >> PAGE_SHIFT) & (PTRS_PER_PTE - 1);
++}
+ /*
+  * Find an entry in a page-table-directory.  We combine the address region
+-- 
+2.25.1
+
diff --git a/queue-5.7/powerpc-8xx-drop-config_8xx_copyback-option.patch b/queue-5.7/powerpc-8xx-drop-config_8xx_copyback-option.patch
new file mode 100644 (file)
index 0000000..fbc466d
--- /dev/null
@@ -0,0 +1,170 @@
+From 7c0b8c6ca396391a229e454f0f553b7af5811d1d Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 19 May 2020 05:49:07 +0000
+Subject: powerpc/8xx: Drop CONFIG_8xx_COPYBACK option
+
+From: Christophe Leroy <christophe.leroy@csgroup.eu>
+
+[ Upstream commit d3efcd38c0b99162d889e36a30425345a18edb33 ]
+
+CONFIG_8xx_COPYBACK was there to help disabling copyback cache mode
+for debuging hardware. But nobody will design new boards with 8xx now.
+
+All 8xx platforms select it, so make it the default and remove
+the option.
+
+Also remove the Mx_RESETVAL values which are pretty useless and hide
+the real value while reading code.
+
+Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
+Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
+Link: https://lore.kernel.org/r/bcc968cda075516eb76e2f25e09821f582c566b4.1589866984.git.christophe.leroy@csgroup.eu
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/powerpc/configs/adder875_defconfig      |  1 -
+ arch/powerpc/configs/ep88xc_defconfig        |  1 -
+ arch/powerpc/configs/mpc866_ads_defconfig    |  1 -
+ arch/powerpc/configs/mpc885_ads_defconfig    |  1 -
+ arch/powerpc/configs/tqm8xx_defconfig        |  1 -
+ arch/powerpc/include/asm/nohash/32/mmu-8xx.h |  2 --
+ arch/powerpc/kernel/head_8xx.S               | 15 +--------------
+ arch/powerpc/platforms/8xx/Kconfig           |  9 ---------
+ 8 files changed, 1 insertion(+), 30 deletions(-)
+
+diff --git a/arch/powerpc/configs/adder875_defconfig b/arch/powerpc/configs/adder875_defconfig
+index f55e23cb176cc..5326bc7392790 100644
+--- a/arch/powerpc/configs/adder875_defconfig
++++ b/arch/powerpc/configs/adder875_defconfig
+@@ -10,7 +10,6 @@ CONFIG_EXPERT=y
+ # CONFIG_BLK_DEV_BSG is not set
+ CONFIG_PARTITION_ADVANCED=y
+ CONFIG_PPC_ADDER875=y
+-CONFIG_8xx_COPYBACK=y
+ CONFIG_GEN_RTC=y
+ CONFIG_HZ_1000=y
+ # CONFIG_SECCOMP is not set
+diff --git a/arch/powerpc/configs/ep88xc_defconfig b/arch/powerpc/configs/ep88xc_defconfig
+index 0e2e5e81a3595..f5c3e72da7196 100644
+--- a/arch/powerpc/configs/ep88xc_defconfig
++++ b/arch/powerpc/configs/ep88xc_defconfig
+@@ -12,7 +12,6 @@ CONFIG_EXPERT=y
+ # CONFIG_BLK_DEV_BSG is not set
+ CONFIG_PARTITION_ADVANCED=y
+ CONFIG_PPC_EP88XC=y
+-CONFIG_8xx_COPYBACK=y
+ CONFIG_GEN_RTC=y
+ CONFIG_HZ_100=y
+ # CONFIG_SECCOMP is not set
+diff --git a/arch/powerpc/configs/mpc866_ads_defconfig b/arch/powerpc/configs/mpc866_ads_defconfig
+index 5320735395e7f..5c56d36cdfc5c 100644
+--- a/arch/powerpc/configs/mpc866_ads_defconfig
++++ b/arch/powerpc/configs/mpc866_ads_defconfig
+@@ -12,7 +12,6 @@ CONFIG_EXPERT=y
+ # CONFIG_BLK_DEV_BSG is not set
+ CONFIG_PARTITION_ADVANCED=y
+ CONFIG_MPC86XADS=y
+-CONFIG_8xx_COPYBACK=y
+ CONFIG_GEN_RTC=y
+ CONFIG_HZ_1000=y
+ CONFIG_MATH_EMULATION=y
+diff --git a/arch/powerpc/configs/mpc885_ads_defconfig b/arch/powerpc/configs/mpc885_ads_defconfig
+index 82a008c04eaec..949ff9ccda5e7 100644
+--- a/arch/powerpc/configs/mpc885_ads_defconfig
++++ b/arch/powerpc/configs/mpc885_ads_defconfig
+@@ -11,7 +11,6 @@ CONFIG_EXPERT=y
+ # CONFIG_VM_EVENT_COUNTERS is not set
+ # CONFIG_BLK_DEV_BSG is not set
+ CONFIG_PARTITION_ADVANCED=y
+-CONFIG_8xx_COPYBACK=y
+ CONFIG_GEN_RTC=y
+ CONFIG_HZ_100=y
+ # CONFIG_SECCOMP is not set
+diff --git a/arch/powerpc/configs/tqm8xx_defconfig b/arch/powerpc/configs/tqm8xx_defconfig
+index eda8bfb2d0a3a..77857d5130223 100644
+--- a/arch/powerpc/configs/tqm8xx_defconfig
++++ b/arch/powerpc/configs/tqm8xx_defconfig
+@@ -15,7 +15,6 @@ CONFIG_MODULE_SRCVERSION_ALL=y
+ # CONFIG_BLK_DEV_BSG is not set
+ CONFIG_PARTITION_ADVANCED=y
+ CONFIG_TQM8XX=y
+-CONFIG_8xx_COPYBACK=y
+ # CONFIG_8xx_CPU15 is not set
+ CONFIG_GEN_RTC=y
+ CONFIG_HZ_100=y
+diff --git a/arch/powerpc/include/asm/nohash/32/mmu-8xx.h b/arch/powerpc/include/asm/nohash/32/mmu-8xx.h
+index 76af5b0cb16ec..26b7cee34dfe5 100644
+--- a/arch/powerpc/include/asm/nohash/32/mmu-8xx.h
++++ b/arch/powerpc/include/asm/nohash/32/mmu-8xx.h
+@@ -19,7 +19,6 @@
+ #define MI_RSV4I      0x08000000      /* Reserve 4 TLB entries */
+ #define MI_PPCS               0x02000000      /* Use MI_RPN prob/priv state */
+ #define MI_IDXMASK    0x00001f00      /* TLB index to be loaded */
+-#define MI_RESETVAL   0x00000000      /* Value of register at reset */
+ /* These are the Ks and Kp from the PowerPC books.  For proper operation,
+  * Ks = 0, Kp = 1.
+@@ -95,7 +94,6 @@
+ #define MD_TWAM               0x04000000      /* Use 4K page hardware assist */
+ #define MD_PPCS               0x02000000      /* Use MI_RPN prob/priv state */
+ #define MD_IDXMASK    0x00001f00      /* TLB index to be loaded */
+-#define MD_RESETVAL   0x04000000      /* Value of register at reset */
+ #define SPRN_M_CASID  793     /* Address space ID (context) to match */
+ #define MC_ASIDMASK   0x0000000f      /* Bits used for ASID value */
+diff --git a/arch/powerpc/kernel/head_8xx.S b/arch/powerpc/kernel/head_8xx.S
+index 073a651787df8..905205c79a25e 100644
+--- a/arch/powerpc/kernel/head_8xx.S
++++ b/arch/powerpc/kernel/head_8xx.S
+@@ -779,10 +779,7 @@ start_here:
+ initial_mmu:
+       li      r8, 0
+       mtspr   SPRN_MI_CTR, r8         /* remove PINNED ITLB entries */
+-      lis     r10, MD_RESETVAL@h
+-#ifndef CONFIG_8xx_COPYBACK
+-      oris    r10, r10, MD_WTDEF@h
+-#endif
++      lis     r10, MD_TWAM@h
+       mtspr   SPRN_MD_CTR, r10        /* remove PINNED DTLB entries */
+       tlbia                   /* Invalidate all TLB entries */
+@@ -857,17 +854,7 @@ initial_mmu:
+       mtspr   SPRN_DC_CST, r8
+       lis     r8, IDC_ENABLE@h
+       mtspr   SPRN_IC_CST, r8
+-#ifdef CONFIG_8xx_COPYBACK
+-      mtspr   SPRN_DC_CST, r8
+-#else
+-      /* For a debug option, I left this here to easily enable
+-       * the write through cache mode
+-       */
+-      lis     r8, DC_SFWT@h
+       mtspr   SPRN_DC_CST, r8
+-      lis     r8, IDC_ENABLE@h
+-      mtspr   SPRN_DC_CST, r8
+-#endif
+       /* Disable debug mode entry on breakpoints */
+       mfspr   r8, SPRN_DER
+ #ifdef CONFIG_PERF_EVENTS
+diff --git a/arch/powerpc/platforms/8xx/Kconfig b/arch/powerpc/platforms/8xx/Kconfig
+index e0fe670f06f60..b37de62d7e7f7 100644
+--- a/arch/powerpc/platforms/8xx/Kconfig
++++ b/arch/powerpc/platforms/8xx/Kconfig
+@@ -98,15 +98,6 @@ menu "MPC8xx CPM Options"
+ # 8xx specific questions.
+ comment "Generic MPC8xx Options"
+-config 8xx_COPYBACK
+-      bool "Copy-Back Data Cache (else Writethrough)"
+-      help
+-        Saying Y here will cause the cache on an MPC8xx processor to be used
+-        in Copy-Back mode.  If you say N here, it is used in Writethrough
+-        mode.
+-
+-        If in doubt, say Y here.
+-
+ config 8xx_GPIO
+       bool "GPIO API Support"
+       select GPIOLIB
+-- 
+2.25.1
+
diff --git a/queue-5.7/powerpc-book3s64-radix-tlb-determine-hugepage-flush-.patch b/queue-5.7/powerpc-book3s64-radix-tlb-determine-hugepage-flush-.patch
new file mode 100644 (file)
index 0000000..7380869
--- /dev/null
@@ -0,0 +1,58 @@
+From 9dee62da348682d21e7c95a803504ac5d70b0989 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 13 May 2020 08:36:16 +0530
+Subject: powerpc/book3s64/radix/tlb: Determine hugepage flush correctly
+
+From: Aneesh Kumar K.V <aneesh.kumar@linux.ibm.com>
+
+[ Upstream commit 8f53f9c0f68ab2168f637494b9e24034899c1310 ]
+
+With a 64K page size flush with start and end:
+
+  (start, end) = (721f680d0000, 721f680e0000)
+
+results in:
+
+  (hstart, hend) = (721f68200000, 721f68000000)
+
+ie. hstart is above hend, which indicates no huge page flush is
+needed.
+
+However the current logic incorrectly sets hflush = true in this case,
+because hstart != hend.
+
+That causes us to call __tlbie_va_range() passing hstart/hend, to do a
+huge page flush even though we don't need to. __tlbie_va_range() will
+skip the actual tlbie operation for start > end. But it will still end
+up calling fixup_tlbie_va_range() and doing the TLB fixups in there,
+which is harmless but unnecessary work.
+
+Reported-by: Bharata B Rao <bharata@linux.ibm.com>
+Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.ibm.com>
+Reviewed-by: Nicholas Piggin <npiggin@gmail.com>
+[mpe: Drop else case, hflush is already false, flesh out change log]
+Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
+Link: https://lore.kernel.org/r/20200513030616.152288-1-aneesh.kumar@linux.ibm.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/powerpc/mm/book3s64/radix_tlb.c | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+diff --git a/arch/powerpc/mm/book3s64/radix_tlb.c b/arch/powerpc/mm/book3s64/radix_tlb.c
+index 758ade2c2b6ed..b5cc9b23cf024 100644
+--- a/arch/powerpc/mm/book3s64/radix_tlb.c
++++ b/arch/powerpc/mm/book3s64/radix_tlb.c
+@@ -884,9 +884,7 @@ is_local:
+               if (IS_ENABLED(CONFIG_TRANSPARENT_HUGEPAGE)) {
+                       hstart = (start + PMD_SIZE - 1) & PMD_MASK;
+                       hend = end & PMD_MASK;
+-                      if (hstart == hend)
+-                              hflush = false;
+-                      else
++                      if (hstart < hend)
+                               hflush = true;
+               }
+-- 
+2.25.1
+
diff --git a/queue-5.7/powerpc-crashkernel-take-mem-option-into-account.patch b/queue-5.7/powerpc-crashkernel-take-mem-option-into-account.patch
new file mode 100644 (file)
index 0000000..49c5a14
--- /dev/null
@@ -0,0 +1,81 @@
+From d19bf0928b80b523bbe872574645bf0049de7602 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 1 Apr 2020 22:00:44 +0800
+Subject: powerpc/crashkernel: Take "mem=" option into account
+
+From: Pingfan Liu <kernelfans@gmail.com>
+
+[ Upstream commit be5470e0c285a68dc3afdea965032f5ddc8269d7 ]
+
+'mem=" option is an easy way to put high pressure on memory during
+some test. Hence after applying the memory limit, instead of total
+mem, the actual usable memory should be considered when reserving mem
+for crashkernel. Otherwise the boot up may experience OOM issue.
+
+E.g. it would reserve 4G prior to the change and 512M afterward, if
+passing
+crashkernel="2G-4G:384M,4G-16G:512M,16G-64G:1G,64G-128G:2G,128G-:4G",
+and mem=5G on a 256G machine.
+
+This issue is powerpc specific because it puts higher priority on
+fadump and kdump reservation than on "mem=". Referring the following
+code:
+    if (fadump_reserve_mem() == 0)
+            reserve_crashkernel();
+    ...
+    /* Ensure that total memory size is page-aligned. */
+    limit = ALIGN(memory_limit ?: memblock_phys_mem_size(), PAGE_SIZE);
+    memblock_enforce_memory_limit(limit);
+
+While on other arches, the effect of "mem=" takes a higher priority
+and pass through memblock_phys_mem_size() before calling
+reserve_crashkernel().
+
+Signed-off-by: Pingfan Liu <kernelfans@gmail.com>
+Reviewed-by: Hari Bathini <hbathini@linux.ibm.com>
+Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
+Link: https://lore.kernel.org/r/1585749644-4148-1-git-send-email-kernelfans@gmail.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/powerpc/kexec/core.c | 8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+diff --git a/arch/powerpc/kexec/core.c b/arch/powerpc/kexec/core.c
+index 078fe3d76feb6..56da5eb2b923a 100644
+--- a/arch/powerpc/kexec/core.c
++++ b/arch/powerpc/kexec/core.c
+@@ -115,11 +115,12 @@ void machine_kexec(struct kimage *image)
+ void __init reserve_crashkernel(void)
+ {
+-      unsigned long long crash_size, crash_base;
++      unsigned long long crash_size, crash_base, total_mem_sz;
+       int ret;
++      total_mem_sz = memory_limit ? memory_limit : memblock_phys_mem_size();
+       /* use common parsing */
+-      ret = parse_crashkernel(boot_command_line, memblock_phys_mem_size(),
++      ret = parse_crashkernel(boot_command_line, total_mem_sz,
+                       &crash_size, &crash_base);
+       if (ret == 0 && crash_size > 0) {
+               crashk_res.start = crash_base;
+@@ -178,6 +179,7 @@ void __init reserve_crashkernel(void)
+       /* Crash kernel trumps memory limit */
+       if (memory_limit && memory_limit <= crashk_res.end) {
+               memory_limit = crashk_res.end + 1;
++              total_mem_sz = memory_limit;
+               printk("Adjusted memory limit for crashkernel, now 0x%llx\n",
+                      memory_limit);
+       }
+@@ -186,7 +188,7 @@ void __init reserve_crashkernel(void)
+                       "for crashkernel (System RAM: %ldMB)\n",
+                       (unsigned long)(crash_size >> 20),
+                       (unsigned long)(crashk_res.start >> 20),
+-                      (unsigned long)(memblock_phys_mem_size() >> 20));
++                      (unsigned long)(total_mem_sz >> 20));
+       if (!memblock_is_region_memory(crashk_res.start, crash_size) ||
+           memblock_reserve(crashk_res.start, crash_size)) {
+-- 
+2.25.1
+
diff --git a/queue-5.7/powerpc-fix-kernel-crash-in-show_instructions-w-debu.patch b/queue-5.7/powerpc-fix-kernel-crash-in-show_instructions-w-debu.patch
new file mode 100644 (file)
index 0000000..0cdfde3
--- /dev/null
@@ -0,0 +1,86 @@
+From 56a0ba998af839e5694fbc883efa53ca1ae44152 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 24 May 2020 15:08:19 +0530
+Subject: powerpc: Fix kernel crash in show_instructions() w/DEBUG_VIRTUAL
+
+From: Aneesh Kumar K.V <aneesh.kumar@linux.ibm.com>
+
+[ Upstream commit a6e2c226c3d51fd93636320e47cabc8a8f0824c5 ]
+
+With CONFIG_DEBUG_VIRTUAL=y, we can hit a BUG() if we take a hard
+lockup watchdog interrupt when in OPAL mode.
+
+This happens in show_instructions() if the kernel takes the watchdog
+NMI IPI, or any other interrupt, with MSR_IR == 0. show_instructions()
+updates the variable pc in the loop and the second iteration will
+result in BUG().
+
+We hit the BUG_ON due the below check in  __va()
+
+  #define __va(x)
+  ({
+       VIRTUAL_BUG_ON((unsigned long)(x) >= PAGE_OFFSET);
+       (void *)(unsigned long)((phys_addr_t)(x) | PAGE_OFFSET);
+  })
+
+Fix it by moving the check out of the loop. Also update nip so that
+the nip == pc check still matches.
+
+Fixes: 4dd7554a6456 ("powerpc/64: Add VIRTUAL_BUG_ON checks for __va and __pa addresses")
+Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.ibm.com>
+[mpe: Use IS_ENABLED(), massage change log]
+Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
+Link: https://lore.kernel.org/r/20200524093822.423487-1-aneesh.kumar@linux.ibm.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/powerpc/kernel/process.c | 20 +++++++++++---------
+ 1 file changed, 11 insertions(+), 9 deletions(-)
+
+diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c
+index 9c21288f86455..774476be591be 100644
+--- a/arch/powerpc/kernel/process.c
++++ b/arch/powerpc/kernel/process.c
+@@ -1241,29 +1241,31 @@ struct task_struct *__switch_to(struct task_struct *prev,
+ static void show_instructions(struct pt_regs *regs)
+ {
+       int i;
++      unsigned long nip = regs->nip;
+       unsigned long pc = regs->nip - (NR_INSN_TO_PRINT * 3 / 4 * sizeof(int));
+       printk("Instruction dump:");
++      /*
++       * If we were executing with the MMU off for instructions, adjust pc
++       * rather than printing XXXXXXXX.
++       */
++      if (!IS_ENABLED(CONFIG_BOOKE) && !(regs->msr & MSR_IR)) {
++              pc = (unsigned long)phys_to_virt(pc);
++              nip = (unsigned long)phys_to_virt(regs->nip);
++      }
++
+       for (i = 0; i < NR_INSN_TO_PRINT; i++) {
+               int instr;
+               if (!(i % 8))
+                       pr_cont("\n");
+-#if !defined(CONFIG_BOOKE)
+-              /* If executing with the IMMU off, adjust pc rather
+-               * than print XXXXXXXX.
+-               */
+-              if (!(regs->msr & MSR_IR))
+-                      pc = (unsigned long)phys_to_virt(pc);
+-#endif
+-
+               if (!__kernel_text_address(pc) ||
+                   probe_kernel_address((const void *)pc, instr)) {
+                       pr_cont("XXXXXXXX ");
+               } else {
+-                      if (regs->nip == pc)
++                      if (nip == pc)
+                               pr_cont("<%08x> ", instr);
+                       else
+                               pr_cont("%08x ", instr);
+-- 
+2.25.1
+
diff --git a/queue-5.7/powerpc-kasan-fix-error-detection-on-memory-allocati.patch b/queue-5.7/powerpc-kasan-fix-error-detection-on-memory-allocati.patch
new file mode 100644 (file)
index 0000000..2970916
--- /dev/null
@@ -0,0 +1,49 @@
+From d616148aa882e5ee7c17cc77532800c6bcb529c1 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 19 May 2020 05:48:43 +0000
+Subject: powerpc/kasan: Fix error detection on memory allocation
+
+From: Christophe Leroy <christophe.leroy@csgroup.eu>
+
+[ Upstream commit d132443a73d7a131775df46f33000f67ed92de1e ]
+
+In case (k_start & PAGE_MASK) doesn't equal (kstart), 'va' will never be
+NULL allthough 'block' is NULL
+
+Check the return of memblock_alloc() directly instead of
+the resulting address in the loop.
+
+Fixes: 509cd3f2b473 ("powerpc/32: Simplify KASAN init")
+Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
+Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
+Link: https://lore.kernel.org/r/7cb8ca82042bfc45a5cfe726c921cd7e7eeb12a3.1589866984.git.christophe.leroy@csgroup.eu
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/powerpc/mm/kasan/kasan_init_32.c | 5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+diff --git a/arch/powerpc/mm/kasan/kasan_init_32.c b/arch/powerpc/mm/kasan/kasan_init_32.c
+index 59e49c0e81543..b7c287adfd598 100644
+--- a/arch/powerpc/mm/kasan/kasan_init_32.c
++++ b/arch/powerpc/mm/kasan/kasan_init_32.c
+@@ -76,15 +76,14 @@ static int __init kasan_init_region(void *start, size_t size)
+               return ret;
+       block = memblock_alloc(k_end - k_start, PAGE_SIZE);
++      if (!block)
++              return -ENOMEM;
+       for (k_cur = k_start & PAGE_MASK; k_cur < k_end; k_cur += PAGE_SIZE) {
+               pmd_t *pmd = pmd_ptr_k(k_cur);
+               void *va = block + k_cur - k_start;
+               pte_t pte = pfn_pte(PHYS_PFN(__pa(va)), PAGE_KERNEL);
+-              if (!va)
+-                      return -ENOMEM;
+-
+               __set_pte_at(&init_mm, k_cur, pte_offset_kernel(pmd, k_cur), pte, 0);
+       }
+       flush_tlb_kernel_range(k_start, k_end);
+-- 
+2.25.1
+
diff --git a/queue-5.7/powerpc-kasan-fix-stack-overflow-by-increasing-threa.patch b/queue-5.7/powerpc-kasan-fix-stack-overflow-by-increasing-threa.patch
new file mode 100644 (file)
index 0000000..7974cdb
--- /dev/null
@@ -0,0 +1,40 @@
+From 0276731716ed7bc38a407c9819e659d2fd8348bb Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 8 Apr 2020 15:58:49 +0000
+Subject: powerpc/kasan: Fix stack overflow by increasing THREAD_SHIFT
+
+From: Christophe Leroy <christophe.leroy@c-s.fr>
+
+[ Upstream commit edbadaf0671072298e506074128b64e003c5812c ]
+
+When CONFIG_KASAN is selected, the stack usage is increased.
+
+In the same way as x86 and arm64 architectures, increase
+THREAD_SHIFT when CONFIG_KASAN is selected.
+
+Fixes: 2edb16efc899 ("powerpc/32: Add KASAN support")
+Reported-by: <erhard_f@mailbox.org>
+Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr>
+Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
+Link: https://bugzilla.kernel.org/show_bug.cgi?id=207129
+Link: https://lore.kernel.org/r/2c50f3b1c9bbaa4217c9a98f3044bd2a36c46a4f.1586361277.git.christophe.leroy@c-s.fr
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/powerpc/Kconfig | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
+index 62aca9efbbbed..310957b988e31 100644
+--- a/arch/powerpc/Kconfig
++++ b/arch/powerpc/Kconfig
+@@ -773,6 +773,7 @@ config THREAD_SHIFT
+       range 13 15
+       default "15" if PPC_256K_PAGES
+       default "14" if PPC64
++      default "14" if KASAN
+       default "13"
+       help
+         Used to define the stack size. The default is almost always what you
+-- 
+2.25.1
+
diff --git a/queue-5.7/powerpc-perf-hv-24x7-fix-inconsistent-output-values-.patch b/queue-5.7/powerpc-perf-hv-24x7-fix-inconsistent-output-values-.patch
new file mode 100644 (file)
index 0000000..612f5f9
--- /dev/null
@@ -0,0 +1,96 @@
+From 1a72b4330e5477dfe98ad10f8b84a4f6e552a61b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 25 May 2020 16:13:03 +0530
+Subject: powerpc/perf/hv-24x7: Fix inconsistent output values incase multiple
+ hv-24x7 events run
+
+From: Kajol Jain <kjain@linux.ibm.com>
+
+[ Upstream commit b4ac18eead28611ff470d0f47a35c4e0ac080d9c ]
+
+Commit 2b206ee6b0df ("powerpc/perf/hv-24x7: Display change in counter
+values")' added to print _change_ in the counter value rather then raw
+value for 24x7 counters. Incase of transactions, the event count
+is set to 0 at the beginning of the transaction. It also sets
+the event's prev_count to the raw value at the time of initialization.
+Because of setting event count to 0, we are seeing some weird behaviour,
+whenever we run multiple 24x7 events at a time.
+
+For example:
+
+command#: ./perf stat -e "{hv_24x7/PM_MCS01_128B_RD_DISP_PORT01,chip=0/,
+                          hv_24x7/PM_MCS01_128B_RD_DISP_PORT01,chip=1/}"
+                          -C 0 -I 1000 sleep 100
+
+     1.000121704                120 hv_24x7/PM_MCS01_128B_RD_DISP_PORT01,chip=0/
+     1.000121704                  5 hv_24x7/PM_MCS01_128B_RD_DISP_PORT01,chip=1/
+     2.000357733                  8 hv_24x7/PM_MCS01_128B_RD_DISP_PORT01,chip=0/
+     2.000357733                 10 hv_24x7/PM_MCS01_128B_RD_DISP_PORT01,chip=1/
+     3.000495215 18,446,744,073,709,551,616 hv_24x7/PM_MCS01_128B_RD_DISP_PORT01,chip=0/
+     3.000495215 18,446,744,073,709,551,616 hv_24x7/PM_MCS01_128B_RD_DISP_PORT01,chip=1/
+     4.000641884                 56 hv_24x7/PM_MCS01_128B_RD_DISP_PORT01,chip=0/
+     4.000641884 18,446,744,073,709,551,616 hv_24x7/PM_MCS01_128B_RD_DISP_PORT01,chip=1/
+     5.000791887 18,446,744,073,709,551,616 hv_24x7/PM_MCS01_128B_RD_DISP_PORT01,chip=0/
+
+Getting these large values in case we do -I.
+
+As we are setting event_count to 0, for interval case, overall event_count is not
+coming in incremental order. As we may can get new delta lesser then previous count.
+Because of which when we print intervals, we are getting negative value which create
+these large values.
+
+This patch removes part where we set event_count to 0 in function
+'h_24x7_event_read'. There won't be much impact as we do set event->hw.prev_count
+to the raw value at the time of initialization to print change value.
+
+With this patch
+In power9 platform
+
+command#: ./perf stat -e "{hv_24x7/PM_MCS01_128B_RD_DISP_PORT01,chip=0/,
+                          hv_24x7/PM_MCS01_128B_RD_DISP_PORT01,chip=1/}"
+                          -C 0 -I 1000 sleep 100
+
+     1.000117685                 93 hv_24x7/PM_MCS01_128B_RD_DISP_PORT01,chip=0/
+     1.000117685                  1 hv_24x7/PM_MCS01_128B_RD_DISP_PORT01,chip=1/
+     2.000349331                 98 hv_24x7/PM_MCS01_128B_RD_DISP_PORT01,chip=0/
+     2.000349331                  2 hv_24x7/PM_MCS01_128B_RD_DISP_PORT01,chip=1/
+     3.000495900                131 hv_24x7/PM_MCS01_128B_RD_DISP_PORT01,chip=0/
+     3.000495900                  4 hv_24x7/PM_MCS01_128B_RD_DISP_PORT01,chip=1/
+     4.000645920                204 hv_24x7/PM_MCS01_128B_RD_DISP_PORT01,chip=0/
+     4.000645920                 61 hv_24x7/PM_MCS01_128B_RD_DISP_PORT01,chip=1/
+     4.284169997                 22 hv_24x7/PM_MCS01_128B_RD_DISP_PORT01,chip=0/
+
+Suggested-by: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com>
+Signed-off-by: Kajol Jain <kjain@linux.ibm.com>
+Tested-by: Madhavan Srinivasan <maddy@linux.ibm.com>
+Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
+Link: https://lore.kernel.org/r/20200525104308.9814-2-kjain@linux.ibm.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/powerpc/perf/hv-24x7.c | 10 ----------
+ 1 file changed, 10 deletions(-)
+
+diff --git a/arch/powerpc/perf/hv-24x7.c b/arch/powerpc/perf/hv-24x7.c
+index 573e0b309c0ca..48e8f4b17b91b 100644
+--- a/arch/powerpc/perf/hv-24x7.c
++++ b/arch/powerpc/perf/hv-24x7.c
+@@ -1400,16 +1400,6 @@ static void h_24x7_event_read(struct perf_event *event)
+                       h24x7hw = &get_cpu_var(hv_24x7_hw);
+                       h24x7hw->events[i] = event;
+                       put_cpu_var(h24x7hw);
+-                      /*
+-                       * Clear the event count so we can compute the _change_
+-                       * in the 24x7 raw counter value at the end of the txn.
+-                       *
+-                       * Note that we could alternatively read the 24x7 value
+-                       * now and save its value in event->hw.prev_count. But
+-                       * that would require issuing a hcall, which would then
+-                       * defeat the purpose of using the txn interface.
+-                       */
+-                      local64_set(&event->count, 0);
+               }
+               put_cpu_var(hv_24x7_reqb);
+-- 
+2.25.1
+
diff --git a/queue-5.7/powerpc-powernv-add-null-check-after-kzalloc.patch b/queue-5.7/powerpc-powernv-add-null-check-after-kzalloc.patch
new file mode 100644 (file)
index 0000000..b32e404
--- /dev/null
@@ -0,0 +1,42 @@
+From 327cee9166674a32817dc40b36ca8fa11bebb921 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 9 May 2020 10:08:38 +0800
+Subject: powerpc/powernv: add NULL check after kzalloc
+
+From: Chen Zhou <chenzhou10@huawei.com>
+
+[ Upstream commit ceffa63acce7165c442395b7d64a11ab8b5c5dca ]
+
+Fixes coccicheck warning:
+
+./arch/powerpc/platforms/powernv/opal.c:813:1-5:
+       alloc with no test, possible model on line 814
+
+Add NULL check after kzalloc.
+
+Signed-off-by: Chen Zhou <chenzhou10@huawei.com>
+Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
+Link: https://lore.kernel.org/r/20200509020838.121660-1-chenzhou10@huawei.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/powerpc/platforms/powernv/opal.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/arch/powerpc/platforms/powernv/opal.c b/arch/powerpc/platforms/powernv/opal.c
+index 2b3dfd0b6cdd8..d95954ad4c0af 100644
+--- a/arch/powerpc/platforms/powernv/opal.c
++++ b/arch/powerpc/platforms/powernv/opal.c
+@@ -811,6 +811,10 @@ static int opal_add_one_export(struct kobject *parent, const char *export_name,
+               goto out;
+       attr = kzalloc(sizeof(*attr), GFP_KERNEL);
++      if (!attr) {
++              rc = -ENOMEM;
++              goto out;
++      }
+       name = kstrdup(export_name, GFP_KERNEL);
+       if (!name) {
+               rc = -ENOMEM;
+-- 
+2.25.1
+
diff --git a/queue-5.7/powerpc-ps3-fix-kexec-shutdown-hang.patch b/queue-5.7/powerpc-ps3-fix-kexec-shutdown-hang.patch
new file mode 100644 (file)
index 0000000..a33ad66
--- /dev/null
@@ -0,0 +1,83 @@
+From 2325ddee819b5c38d66ff2bb573844f71998c81f Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 9 May 2020 18:58:32 +0000
+Subject: powerpc/ps3: Fix kexec shutdown hang
+
+From: Geoff Levand <geoff@infradead.org>
+
+[ Upstream commit 126554465d93b10662742128918a5fc338cda4aa ]
+
+The ps3_mm_region_destroy() and ps3_mm_vas_destroy() routines
+are called very late in the shutdown via kexec's mmu_cleanup_all
+routine.  By the time mmu_cleanup_all runs it is too late to use
+udbg_printf, and calling it will cause PS3 systems to hang.
+
+Remove all debugging statements from ps3_mm_region_destroy() and
+ps3_mm_vas_destroy() and replace any error reporting with calls
+to lv1_panic.
+
+With this change builds with 'DEBUG' defined will not cause kexec
+reboots to hang, and builds with 'DEBUG' defined or not will end
+in lv1_panic if an error is encountered.
+
+Signed-off-by: Geoff Levand <geoff@infradead.org>
+Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
+Link: https://lore.kernel.org/r/7325c4af2b4c989c19d6a26b90b1fec9c0615ddf.1589049250.git.geoff@infradead.org
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/powerpc/platforms/ps3/mm.c | 22 ++++++++++++----------
+ 1 file changed, 12 insertions(+), 10 deletions(-)
+
+diff --git a/arch/powerpc/platforms/ps3/mm.c b/arch/powerpc/platforms/ps3/mm.c
+index 423be34f0f5fb..f42fe4e86ce52 100644
+--- a/arch/powerpc/platforms/ps3/mm.c
++++ b/arch/powerpc/platforms/ps3/mm.c
+@@ -200,13 +200,14 @@ void ps3_mm_vas_destroy(void)
+ {
+       int result;
+-      DBG("%s:%d: map.vas_id    = %llu\n", __func__, __LINE__, map.vas_id);
+-
+       if (map.vas_id) {
+               result = lv1_select_virtual_address_space(0);
+-              BUG_ON(result);
+-              result = lv1_destruct_virtual_address_space(map.vas_id);
+-              BUG_ON(result);
++              result += lv1_destruct_virtual_address_space(map.vas_id);
++
++              if (result) {
++                      lv1_panic(0);
++              }
++
+               map.vas_id = 0;
+       }
+ }
+@@ -304,19 +305,20 @@ static void ps3_mm_region_destroy(struct mem_region *r)
+       int result;
+       if (!r->destroy) {
+-              pr_info("%s:%d: Not destroying high region: %llxh %llxh\n",
+-                      __func__, __LINE__, r->base, r->size);
+               return;
+       }
+-      DBG("%s:%d: r->base = %llxh\n", __func__, __LINE__, r->base);
+-
+       if (r->base) {
+               result = lv1_release_memory(r->base);
+-              BUG_ON(result);
++
++              if (result) {
++                      lv1_panic(0);
++              }
++
+               r->size = r->base = r->offset = 0;
+               map.total = map.rm.size;
+       }
++
+       ps3_mm_set_repository_highmem(NULL);
+ }
+-- 
+2.25.1
+
diff --git a/queue-5.7/powerpc-pseries-ras-fix-fwnmi_valid-off-by-one.patch b/queue-5.7/powerpc-pseries-ras-fix-fwnmi_valid-off-by-one.patch
new file mode 100644 (file)
index 0000000..ad833ed
--- /dev/null
@@ -0,0 +1,46 @@
+From 56041a6883b8c6d93d14bab28b6e029d87ffcbef Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 8 May 2020 14:33:58 +1000
+Subject: powerpc/pseries/ras: Fix FWNMI_VALID off by one
+
+From: Nicholas Piggin <npiggin@gmail.com>
+
+[ Upstream commit deb70f7a35a22dffa55b2c3aac71bc6fb0f486ce ]
+
+This was discovered developing qemu fwnmi sreset support. This
+off-by-one bug means the last 16 bytes of the rtas area can not
+be used for a 16 byte save area.
+
+It's not a serious bug, and QEMU implementation has to retain a
+workaround for old kernels, but it's good to tighten it.
+
+Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
+Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
+Acked-by: Mahesh Salgaonkar <mahesh@linux.ibm.com>
+Link: https://lore.kernel.org/r/20200508043408.886394-7-npiggin@gmail.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/powerpc/platforms/pseries/ras.c | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+diff --git a/arch/powerpc/platforms/pseries/ras.c b/arch/powerpc/platforms/pseries/ras.c
+index 1d1da639b8b7e..16ba5c542e55c 100644
+--- a/arch/powerpc/platforms/pseries/ras.c
++++ b/arch/powerpc/platforms/pseries/ras.c
+@@ -395,10 +395,11 @@ static irqreturn_t ras_error_interrupt(int irq, void *dev_id)
+ /*
+  * Some versions of FWNMI place the buffer inside the 4kB page starting at
+  * 0x7000. Other versions place it inside the rtas buffer. We check both.
++ * Minimum size of the buffer is 16 bytes.
+  */
+ #define VALID_FWNMI_BUFFER(A) \
+-      ((((A) >= 0x7000) && ((A) < 0x7ff0)) || \
+-      (((A) >= rtas.base) && ((A) < (rtas.base + rtas.size - 16))))
++      ((((A) >= 0x7000) && ((A) <= 0x8000 - 16)) || \
++      (((A) >= rtas.base) && ((A) <= (rtas.base + rtas.size - 16))))
+ static inline struct rtas_error_log *fwnmi_get_errlog(void)
+ {
+-- 
+2.25.1
+
diff --git a/queue-5.7/powerpc-ptdump-add-_page_coherent-flag.patch b/queue-5.7/powerpc-ptdump-add-_page_coherent-flag.patch
new file mode 100644 (file)
index 0000000..3066688
--- /dev/null
@@ -0,0 +1,40 @@
+From 0ab861b77ffae70c3682e018d1bdbdc8db3a70c2 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 19 May 2020 05:48:51 +0000
+Subject: powerpc/ptdump: Add _PAGE_COHERENT flag
+
+From: Christophe Leroy <christophe.leroy@csgroup.eu>
+
+[ Upstream commit 3af4786eb429b2df76cbd7ce3bae21467ac3e4fb ]
+
+For platforms using shared.c (4xx, Book3e, Book3s/32), also handle the
+_PAGE_COHERENT flag which corresponds to the M bit of the WIMG flags.
+
+Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
+[mpe: Make it more verbose, use "coherent" rather than "m"]
+Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
+Link: https://lore.kernel.org/r/324c3d860717e8e91fca3bb6c0f8b23e1644a404.1589866984.git.christophe.leroy@csgroup.eu
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/powerpc/mm/ptdump/shared.c | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+diff --git a/arch/powerpc/mm/ptdump/shared.c b/arch/powerpc/mm/ptdump/shared.c
+index f7ed2f187cb01..784f8df17f732 100644
+--- a/arch/powerpc/mm/ptdump/shared.c
++++ b/arch/powerpc/mm/ptdump/shared.c
+@@ -30,6 +30,11 @@ static const struct flag_info flag_array[] = {
+               .val    = _PAGE_PRESENT,
+               .set    = "present",
+               .clear  = "       ",
++      }, {
++              .mask   = _PAGE_COHERENT,
++              .val    = _PAGE_COHERENT,
++              .set    = "coherent",
++              .clear  = "        ",
+       }, {
+               .mask   = _PAGE_GUARDED,
+               .val    = _PAGE_GUARDED,
+-- 
+2.25.1
+
diff --git a/queue-5.7/ps3disk-use-the-default-segment-boundary.patch b/queue-5.7/ps3disk-use-the-default-segment-boundary.patch
new file mode 100644 (file)
index 0000000..480122c
--- /dev/null
@@ -0,0 +1,89 @@
+From 612cb757749178b72a77c29399a255ba9afb05a1 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 9 May 2020 18:58:32 +0000
+Subject: ps3disk: use the default segment boundary
+
+From: Emmanuel Nicolet <emmanuel.nicolet@gmail.com>
+
+[ Upstream commit 720bc316690bd27dea9d71510b50f0cd698ffc32 ]
+
+Since commit dcebd755926b ("block: use bio_for_each_bvec() to compute
+multi-page bvec count"), the kernel will bug_on on the PS3 because
+bio_split() is called with sectors == 0:
+
+  kernel BUG at block/bio.c:1853!
+  Oops: Exception in kernel mode, sig: 5 [#1]
+  BE PAGE_SIZE=4K MMU=Hash PREEMPT SMP NR_CPUS=8 NUMA PS3
+  Modules linked in: firewire_sbp2 rtc_ps3(+) soundcore ps3_gelic(+) \
+  ps3rom(+) firewire_core ps3vram(+) usb_common crc_itu_t
+  CPU: 0 PID: 97 Comm: blkid Not tainted 5.3.0-rc4 #1
+  NIP:  c00000000027d0d0 LR: c00000000027d0b0 CTR: 0000000000000000
+  REGS: c00000000135ae90 TRAP: 0700   Not tainted  (5.3.0-rc4)
+  MSR:  8000000000028032 <SF,EE,IR,DR,RI>  CR: 44008240  XER: 20000000
+  IRQMASK: 0
+  GPR00: c000000000289368 c00000000135b120 c00000000084a500 c000000004ff8300
+  GPR04: 0000000000000c00 c000000004c905e0 c000000004c905e0 000000000000ffff
+  GPR08: 0000000000000000 0000000000000001 0000000000000000 000000000000ffff
+  GPR12: 0000000000000000 c0000000008ef000 000000000000003e 0000000000080001
+  GPR16: 0000000000000100 000000000000ffff 0000000000000000 0000000000000004
+  GPR20: c00000000062fd7e 0000000000000001 000000000000ffff 0000000000000080
+  GPR24: c000000000781788 c00000000135b350 0000000000000080 c000000004c905e0
+  GPR28: c00000000135b348 c000000004ff8300 0000000000000000 c000000004c90000
+  NIP [c00000000027d0d0] .bio_split+0x28/0xac
+  LR [c00000000027d0b0] .bio_split+0x8/0xac
+  Call Trace:
+  [c00000000135b120] [c00000000027d130] .bio_split+0x88/0xac (unreliable)
+  [c00000000135b1b0] [c000000000289368] .__blk_queue_split+0x11c/0x53c
+  [c00000000135b2d0] [c00000000028f614] .blk_mq_make_request+0x80/0x7d4
+  [c00000000135b3d0] [c000000000283a8c] .generic_make_request+0x118/0x294
+  [c00000000135b4b0] [c000000000283d34] .submit_bio+0x12c/0x174
+  [c00000000135b580] [c000000000205a44] .mpage_bio_submit+0x3c/0x4c
+  [c00000000135b600] [c000000000206184] .mpage_readpages+0xa4/0x184
+  [c00000000135b750] [c0000000001ff8fc] .blkdev_readpages+0x24/0x38
+  [c00000000135b7c0] [c0000000001589f0] .read_pages+0x6c/0x1a8
+  [c00000000135b8b0] [c000000000158c74] .__do_page_cache_readahead+0x118/0x184
+  [c00000000135b9b0] [c0000000001591a8] .force_page_cache_readahead+0xe4/0xe8
+  [c00000000135ba50] [c00000000014fc24] .generic_file_read_iter+0x1d8/0x830
+  [c00000000135bb50] [c0000000001ffadc] .blkdev_read_iter+0x40/0x5c
+  [c00000000135bbc0] [c0000000001b9e00] .new_sync_read+0x144/0x1a0
+  [c00000000135bcd0] [c0000000001bc454] .vfs_read+0xa0/0x124
+  [c00000000135bd70] [c0000000001bc7a4] .ksys_read+0x70/0xd8
+  [c00000000135be20] [c00000000000a524] system_call+0x5c/0x70
+  Instruction dump:
+  7fe3fb78 482e30dc 7c0802a6 482e3085 7c9e2378 f821ff71 7ca42b78 7d3e00d0
+  7c7d1b78 79290fe0 7cc53378 69290001 <0b090000> 81230028 7bca0020 7929ba62
+  [ end trace 313fec760f30aa1f ]---
+
+The problem originates from setting the segment boundary of the
+request queue to -1UL. This makes get_max_segment_size() return zero
+when offset is zero, whatever the max segment size. The test with
+BLK_SEG_BOUNDARY_MASK fails and 'mask - (mask & offset) + 1' overflows
+to zero in the return statement.
+
+Not setting the segment boundary and using the default
+value (BLK_SEG_BOUNDARY_MASK) fixes the problem.
+
+Signed-off-by: Emmanuel Nicolet <emmanuel.nicolet@gmail.com>
+Signed-off-by: Geoff Levand <geoff@infradead.org>
+Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
+Link: https://lore.kernel.org/r/060a416c43138f45105c0540eff1a45539f7e2fc.1589049250.git.geoff@infradead.org
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/block/ps3disk.c | 1 -
+ 1 file changed, 1 deletion(-)
+
+diff --git a/drivers/block/ps3disk.c b/drivers/block/ps3disk.c
+index c5c6487a19d5a..7b55811c2a81d 100644
+--- a/drivers/block/ps3disk.c
++++ b/drivers/block/ps3disk.c
+@@ -454,7 +454,6 @@ static int ps3disk_probe(struct ps3_system_bus_device *_dev)
+       queue->queuedata = dev;
+       blk_queue_max_hw_sectors(queue, dev->bounce_size >> 9);
+-      blk_queue_segment_boundary(queue, -1UL);
+       blk_queue_dma_alignment(queue, dev->blk_size-1);
+       blk_queue_logical_block_size(queue, dev->blk_size);
+-- 
+2.25.1
+
diff --git a/queue-5.7/pwm-add-missing-config_-prefix.patch b/queue-5.7/pwm-add-missing-config_-prefix.patch
new file mode 100644 (file)
index 0000000..2af36b1
--- /dev/null
@@ -0,0 +1,40 @@
+From 965654addc5ace0ced1ca79ee87fb57f32e1841c Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 3 Jun 2020 15:40:56 -0700
+Subject: pwm: Add missing "CONFIG_" prefix
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Kees Cook <keescook@chromium.org>
+
+[ Upstream commit f5641d053d46a9a18fe13f2ecb4a7b4a66d9cdf7 ]
+
+The IS_ENABLED() use was missing the CONFIG_ prefix which would have
+lead to skipping this code.
+
+Fixes: 3ad1f3a33286 ("pwm: Implement some checks for lowlevel drivers")
+Signed-off-by: Kees Cook <keescook@chromium.org>
+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/core.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/pwm/core.c b/drivers/pwm/core.c
+index 9973c442b4555..6b3cbc0490c6e 100644
+--- a/drivers/pwm/core.c
++++ b/drivers/pwm/core.c
+@@ -121,7 +121,7 @@ static int pwm_device_request(struct pwm_device *pwm, const char *label)
+               pwm->chip->ops->get_state(pwm->chip, pwm, &pwm->state);
+               trace_pwm_get(pwm, &pwm->state);
+-              if (IS_ENABLED(PWM_DEBUG))
++              if (IS_ENABLED(CONFIG_PWM_DEBUG))
+                       pwm->last = pwm->state;
+       }
+-- 
+2.25.1
+
diff --git a/queue-5.7/pwm-img-call-pm_runtime_put-in-pm_runtime_get_sync-f.patch b/queue-5.7/pwm-img-call-pm_runtime_put-in-pm_runtime_get_sync-f.patch
new file mode 100644 (file)
index 0000000..b77f73c
--- /dev/null
@@ -0,0 +1,51 @@
+From e5d9c4306a412f256ba135b8615f9d1b98b0426d Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 1 Jun 2020 02:11:16 -0500
+Subject: pwm: img: Call pm_runtime_put() in pm_runtime_get_sync() failed case
+
+From: Navid Emamdoost <navid.emamdoost@gmail.com>
+
+[ Upstream commit ca162ce98110b98e7d97b7157328d34dcfdd40a9 ]
+
+Even in failed case of pm_runtime_get_sync(), the usage_count is
+incremented. In order to keep the usage_count with correct value call
+appropriate pm_runtime_put().
+
+Signed-off-by: Navid Emamdoost <navid.emamdoost@gmail.com>
+Signed-off-by: Thierry Reding <thierry.reding@gmail.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/pwm/pwm-img.c | 8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/pwm/pwm-img.c b/drivers/pwm/pwm-img.c
+index c9e57bd109fbf..599a0f66a3845 100644
+--- a/drivers/pwm/pwm-img.c
++++ b/drivers/pwm/pwm-img.c
+@@ -129,8 +129,10 @@ static int img_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm,
+       duty = DIV_ROUND_UP(timebase * duty_ns, period_ns);
+       ret = pm_runtime_get_sync(chip->dev);
+-      if (ret < 0)
++      if (ret < 0) {
++              pm_runtime_put_autosuspend(chip->dev);
+               return ret;
++      }
+       val = img_pwm_readl(pwm_chip, PWM_CTRL_CFG);
+       val &= ~(PWM_CTRL_CFG_DIV_MASK << PWM_CTRL_CFG_DIV_SHIFT(pwm->hwpwm));
+@@ -331,8 +333,10 @@ static int img_pwm_remove(struct platform_device *pdev)
+       int ret;
+       ret = pm_runtime_get_sync(&pdev->dev);
+-      if (ret < 0)
++      if (ret < 0) {
++              pm_runtime_put(&pdev->dev);
+               return ret;
++      }
+       for (i = 0; i < pwm_chip->chip.npwm; i++) {
+               val = img_pwm_readl(pwm_chip, PWM_CTRL_CFG);
+-- 
+2.25.1
+
diff --git a/queue-5.7/pwm-imx27-fix-rounding-behavior.patch b/queue-5.7/pwm-imx27-fix-rounding-behavior.patch
new file mode 100644 (file)
index 0000000..5fa2b09
--- /dev/null
@@ -0,0 +1,89 @@
+From 3b9bb90535c25dabac2ee2527c1f89466893eca5 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 16 Apr 2020 10:02:45 +0200
+Subject: pwm: imx27: Fix rounding behavior
+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 aef1a3799b5cb3ba4841f6034497b179646ccc70 ]
+
+To not trigger the warnings provided by CONFIG_PWM_DEBUG
+
+ - use up-rounding in .get_state()
+ - don't divide by the result of a division
+ - don't use the rounded counter value for the period length to calculate
+   the counter value for the duty cycle
+
+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-imx27.c | 20 ++++++++++----------
+ 1 file changed, 10 insertions(+), 10 deletions(-)
+
+diff --git a/drivers/pwm/pwm-imx27.c b/drivers/pwm/pwm-imx27.c
+index a6e40d4c485f3..732a6f3701e8e 100644
+--- a/drivers/pwm/pwm-imx27.c
++++ b/drivers/pwm/pwm-imx27.c
+@@ -150,13 +150,12 @@ static void pwm_imx27_get_state(struct pwm_chip *chip,
+       prescaler = MX3_PWMCR_PRESCALER_GET(val);
+       pwm_clk = clk_get_rate(imx->clk_per);
+-      pwm_clk = DIV_ROUND_CLOSEST_ULL(pwm_clk, prescaler);
+       val = readl(imx->mmio_base + MX3_PWMPR);
+       period = val >= MX3_PWMPR_MAX ? MX3_PWMPR_MAX : val;
+       /* PWMOUT (Hz) = PWMCLK / (PWMPR + 2) */
+-      tmp = NSEC_PER_SEC * (u64)(period + 2);
+-      state->period = DIV_ROUND_CLOSEST_ULL(tmp, pwm_clk);
++      tmp = NSEC_PER_SEC * (u64)(period + 2) * prescaler;
++      state->period = DIV_ROUND_UP_ULL(tmp, pwm_clk);
+       /*
+        * PWMSAR can be read only if PWM is enabled. If the PWM is disabled,
+@@ -167,8 +166,8 @@ static void pwm_imx27_get_state(struct pwm_chip *chip,
+       else
+               val = imx->duty_cycle;
+-      tmp = NSEC_PER_SEC * (u64)(val);
+-      state->duty_cycle = DIV_ROUND_CLOSEST_ULL(tmp, pwm_clk);
++      tmp = NSEC_PER_SEC * (u64)(val) * prescaler;
++      state->duty_cycle = DIV_ROUND_UP_ULL(tmp, pwm_clk);
+       pwm_imx27_clk_disable_unprepare(imx);
+ }
+@@ -220,22 +219,23 @@ static int pwm_imx27_apply(struct pwm_chip *chip, struct pwm_device *pwm,
+       struct pwm_imx27_chip *imx = to_pwm_imx27_chip(chip);
+       struct pwm_state cstate;
+       unsigned long long c;
++      unsigned long long clkrate;
+       int ret;
+       u32 cr;
+       pwm_get_state(pwm, &cstate);
+-      c = clk_get_rate(imx->clk_per);
+-      c *= state->period;
++      clkrate = clk_get_rate(imx->clk_per);
++      c = clkrate * state->period;
+-      do_div(c, 1000000000);
++      do_div(c, NSEC_PER_SEC);
+       period_cycles = c;
+       prescale = period_cycles / 0x10000 + 1;
+       period_cycles /= prescale;
+-      c = (unsigned long long)period_cycles * state->duty_cycle;
+-      do_div(c, state->period);
++      c = clkrate * state->duty_cycle;
++      do_div(c, NSEC_PER_SEC * prescale);
+       duty_cycles = c;
+       /*
+-- 
+2.25.1
+
diff --git a/queue-5.7/rdma-cm-spurious-warning-triggered-in-cm_destroy_id.patch b/queue-5.7/rdma-cm-spurious-warning-triggered-in-cm_destroy_id.patch
new file mode 100644 (file)
index 0000000..9c6b527
--- /dev/null
@@ -0,0 +1,48 @@
+From 4b087b1191f131cb61d382ed92a3992b5a1caea3 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 3 Jun 2020 06:33:38 -0700
+Subject: RDMA/cm: Spurious WARNING triggered in cm_destroy_id()
+
+From: Ka-Cheong Poon <ka-cheong.poon@oracle.com>
+
+[ Upstream commit fba97dc7fc76b2c9a909fa0b3786d30a9899f5cf ]
+
+If the cm_id state is IB_CM_REP_SENT when cm_destroy_id() is called, it
+calls cm_send_rej_locked().
+
+In cm_send_rej_locked(), it calls cm_enter_timewait() and the state is
+changed to IB_CM_TIMEWAIT.
+
+Now back to cm_destroy_id(), it breaks from the switch statement, and the
+next call is WARN_ON(cm_id->state != IB_CM_IDLE).
+
+This triggers a spurious warning. Instead, the code should goto retest
+after returning from cm_send_rej_locked() to move the state to IDLE.
+
+Fixes: 67b3c8dceac6 ("RDMA/cm: Make sure the cm_id is in the IB_CM_IDLE state in destroy")
+Link: https://lore.kernel.org/r/1591191218-9446-1-git-send-email-ka-cheong.poon@oracle.com
+Signed-off-by: Ka-Cheong Poon <ka-cheong.poon@oracle.com>
+Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/infiniband/core/cm.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/infiniband/core/cm.c b/drivers/infiniband/core/cm.c
+index 17f14e0eafe4d..1c2bf18cda9f6 100644
+--- a/drivers/infiniband/core/cm.c
++++ b/drivers/infiniband/core/cm.c
+@@ -1076,7 +1076,9 @@ retest:
+       case IB_CM_REP_SENT:
+       case IB_CM_MRA_REP_RCVD:
+               ib_cancel_mad(cm_id_priv->av.port->mad_agent, cm_id_priv->msg);
+-              /* Fall through */
++              cm_send_rej_locked(cm_id_priv, IB_CM_REJ_CONSUMER_DEFINED, NULL,
++                                 0, NULL, 0);
++              goto retest;
+       case IB_CM_MRA_REQ_SENT:
+       case IB_CM_REP_RCVD:
+       case IB_CM_MRA_REP_SENT:
+-- 
+2.25.1
+
diff --git a/queue-5.7/rdma-core-fix-several-reference-count-leaks.patch b/queue-5.7/rdma-core-fix-several-reference-count-leaks.patch
new file mode 100644 (file)
index 0000000..8dbee02
--- /dev/null
@@ -0,0 +1,63 @@
+From f7d4d74732ba2704c5265403ac65f6ece22535d9 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 27 May 2020 22:02:30 -0500
+Subject: RDMA/core: Fix several reference count leaks.
+
+From: Qiushi Wu <wu000273@umn.edu>
+
+[ Upstream commit 0b8e125e213204508e1b3c4bdfe69713280b7abd ]
+
+kobject_init_and_add() takes reference even when it fails.  If this
+function returns an error, kobject_put() must be called to properly clean
+up the memory associated with the object. Previous
+commit b8eb718348b8 ("net-sysfs: Fix reference count leak in
+rx|netdev_queue_add_kobject") fixed a similar problem.
+
+Link: https://lore.kernel.org/r/20200528030231.9082-1-wu000273@umn.edu
+Signed-off-by: Qiushi Wu <wu000273@umn.edu>
+Reviewed-by: Jason Gunthorpe <jgg@mellanox.com>
+Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/infiniband/core/sysfs.c | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+diff --git a/drivers/infiniband/core/sysfs.c b/drivers/infiniband/core/sysfs.c
+index 087682e6969e5..defe9cd4c5eeb 100644
+--- a/drivers/infiniband/core/sysfs.c
++++ b/drivers/infiniband/core/sysfs.c
+@@ -1058,8 +1058,7 @@ static int add_port(struct ib_core_device *coredev, int port_num)
+                                  coredev->ports_kobj,
+                                  "%d", port_num);
+       if (ret) {
+-              kfree(p);
+-              return ret;
++              goto err_put;
+       }
+       p->gid_attr_group = kzalloc(sizeof(*p->gid_attr_group), GFP_KERNEL);
+@@ -1072,8 +1071,7 @@ static int add_port(struct ib_core_device *coredev, int port_num)
+       ret = kobject_init_and_add(&p->gid_attr_group->kobj, &gid_attr_type,
+                                  &p->kobj, "gid_attrs");
+       if (ret) {
+-              kfree(p->gid_attr_group);
+-              goto err_put;
++              goto err_put_gid_attrs;
+       }
+       if (device->ops.process_mad && is_full_dev) {
+@@ -1404,8 +1402,10 @@ int ib_port_register_module_stat(struct ib_device *device, u8 port_num,
+               ret = kobject_init_and_add(kobj, ktype, &port->kobj, "%s",
+                                          name);
+-              if (ret)
++              if (ret) {
++                      kobject_put(kobj);
+                       return ret;
++              }
+       }
+       return 0;
+-- 
+2.25.1
+
diff --git a/queue-5.7/rdma-efa-fix-setting-of-wrong-bit-in-get-set_feature.patch b/queue-5.7/rdma-efa-fix-setting-of-wrong-bit-in-get-set_feature.patch
new file mode 100644 (file)
index 0000000..7d28192
--- /dev/null
@@ -0,0 +1,49 @@
+From 98749f1afe39eeb9f1227fce4dc83292f58f6fb5 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 12 May 2020 18:22:03 +0300
+Subject: RDMA/efa: Fix setting of wrong bit in get/set_feature commands
+
+From: Gal Pressman <galpress@amazon.com>
+
+[ Upstream commit cc8a635e24acf2793605f243c913c51b8c3702ab ]
+
+When using a control buffer the ctrl_data bit should be set in order to
+indicate the control buffer address is valid, not ctrl_data_indirect
+which is used when the control buffer itself is indirect.
+
+Fixes: e9c6c5373088 ("RDMA/efa: Add common command handlers")
+Link: https://lore.kernel.org/r/20200512152204.93091-2-galpress@amazon.com
+Reviewed-by: Firas JahJah <firasj@amazon.com>
+Reviewed-by: Yossi Leybovich <sleybo@amazon.com>
+Signed-off-by: Gal Pressman <galpress@amazon.com>
+Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/infiniband/hw/efa/efa_com_cmd.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/infiniband/hw/efa/efa_com_cmd.c b/drivers/infiniband/hw/efa/efa_com_cmd.c
+index eea5574a62e84..69f842c92ff64 100644
+--- a/drivers/infiniband/hw/efa/efa_com_cmd.c
++++ b/drivers/infiniband/hw/efa/efa_com_cmd.c
+@@ -388,7 +388,7 @@ static int efa_com_get_feature_ex(struct efa_com_dev *edev,
+       if (control_buff_size)
+               EFA_SET(&get_cmd.aq_common_descriptor.flags,
+-                      EFA_ADMIN_AQ_COMMON_DESC_CTRL_DATA_INDIRECT, 1);
++                      EFA_ADMIN_AQ_COMMON_DESC_CTRL_DATA, 1);
+       efa_com_set_dma_addr(control_buf_dma_addr,
+                            &get_cmd.control_buffer.address.mem_addr_high,
+@@ -540,7 +540,7 @@ static int efa_com_set_feature_ex(struct efa_com_dev *edev,
+       if (control_buff_size) {
+               set_cmd->aq_common_descriptor.flags = 0;
+               EFA_SET(&set_cmd->aq_common_descriptor.flags,
+-                      EFA_ADMIN_AQ_COMMON_DESC_CTRL_DATA_INDIRECT, 1);
++                      EFA_ADMIN_AQ_COMMON_DESC_CTRL_DATA, 1);
+               efa_com_set_dma_addr(control_buf_dma_addr,
+                                    &set_cmd->control_buffer.address.mem_addr_high,
+                                    &set_cmd->control_buffer.address.mem_addr_low);
+-- 
+2.25.1
+
diff --git a/queue-5.7/rdma-hns-bugfix-for-querying-qkey.patch b/queue-5.7/rdma-hns-bugfix-for-querying-qkey.patch
new file mode 100644 (file)
index 0000000..0e6da37
--- /dev/null
@@ -0,0 +1,38 @@
+From 2404b97a9b6828e87fb9957b94bdbd7825004d02 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 8 May 2020 17:45:51 +0800
+Subject: RDMA/hns: Bugfix for querying qkey
+
+From: Lijun Ou <oulijun@huawei.com>
+
+[ Upstream commit 349be276509455ac2f19fa4051ed773082c6a27e ]
+
+The qkey queried through the query ud qp verb is a fixed value and it
+should be read from qp context.
+
+Fixes: 926a01dc000d ("RDMA/hns: Add QP operations support for hip08 SoC")
+Link: https://lore.kernel.org/r/1588931159-56875-2-git-send-email-liweihang@huawei.com
+Signed-off-by: Lijun Ou <oulijun@huawei.com>
+Signed-off-by: Weihang Li <liweihang@huawei.com>
+Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/infiniband/hw/hns/hns_roce_hw_v2.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c
+index c3316672b70e6..96ff610bbdc4e 100644
+--- a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c
++++ b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c
+@@ -4639,7 +4639,7 @@ static int hns_roce_v2_query_qp(struct ib_qp *ibqp, struct ib_qp_attr *qp_attr,
+       qp_attr->path_mig_state = IB_MIG_ARMED;
+       qp_attr->ah_attr.type   = RDMA_AH_ATTR_TYPE_ROCE;
+       if (hr_qp->ibqp.qp_type == IB_QPT_UD)
+-              qp_attr->qkey = V2_QKEY_VAL;
++              qp_attr->qkey = le32_to_cpu(context.qkey_xrcd);
+       qp_attr->rq_psn = roce_get_field(context.byte_108_rx_reqepsn,
+                                        V2_QPC_BYTE_108_RX_REQ_EPSN_M,
+-- 
+2.25.1
+
diff --git a/queue-5.7/rdma-hns-fix-cmdq-parameter-of-querying-pf-timer-res.patch b/queue-5.7/rdma-hns-fix-cmdq-parameter-of-querying-pf-timer-res.patch
new file mode 100644 (file)
index 0000000..85e115b
--- /dev/null
@@ -0,0 +1,77 @@
+From f8de329d9d7b9919e5db74659478155b9a7d44be Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 8 May 2020 17:45:52 +0800
+Subject: RDMA/hns: Fix cmdq parameter of querying pf timer resource
+
+From: Lang Cheng <chenglang@huawei.com>
+
+[ Upstream commit 441c88d5b3ff80108ff536c6cf80591187015403 ]
+
+The firmware has reduced the number of descriptions of command
+HNS_ROCE_OPC_QUERY_PF_TIMER_RES to 1. The driver needs to adapt, otherwise
+the hardware will report error 4(CMD_NEXT_ERR).
+
+Fixes: 0e40dc2f70cd ("RDMA/hns: Add timer allocation support for hip08")
+Link: https://lore.kernel.org/r/1588931159-56875-3-git-send-email-liweihang@huawei.com
+Signed-off-by: Lang Cheng <chenglang@huawei.com>
+Signed-off-by: Weihang Li <liweihang@huawei.com>
+Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/infiniband/hw/hns/hns_roce_hw_v2.c | 32 ++++++++--------------
+ 1 file changed, 12 insertions(+), 20 deletions(-)
+
+diff --git a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c
+index 96ff610bbdc4e..f9fa80ae55603 100644
+--- a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c
++++ b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c
+@@ -1349,34 +1349,26 @@ static int hns_roce_query_pf_resource(struct hns_roce_dev *hr_dev)
+ static int hns_roce_query_pf_timer_resource(struct hns_roce_dev *hr_dev)
+ {
+       struct hns_roce_pf_timer_res_a *req_a;
+-      struct hns_roce_cmq_desc desc[2];
+-      int ret, i;
++      struct hns_roce_cmq_desc desc;
++      int ret;
+-      for (i = 0; i < 2; i++) {
+-              hns_roce_cmq_setup_basic_desc(&desc[i],
+-                                            HNS_ROCE_OPC_QUERY_PF_TIMER_RES,
+-                                            true);
++      hns_roce_cmq_setup_basic_desc(&desc, HNS_ROCE_OPC_QUERY_PF_TIMER_RES,
++                                    true);
+-              if (i == 0)
+-                      desc[i].flag |= cpu_to_le16(HNS_ROCE_CMD_FLAG_NEXT);
+-              else
+-                      desc[i].flag &= ~cpu_to_le16(HNS_ROCE_CMD_FLAG_NEXT);
+-      }
+-
+-      ret = hns_roce_cmq_send(hr_dev, desc, 2);
++      ret = hns_roce_cmq_send(hr_dev, &desc, 1);
+       if (ret)
+               return ret;
+-      req_a = (struct hns_roce_pf_timer_res_a *)desc[0].data;
++      req_a = (struct hns_roce_pf_timer_res_a *)desc.data;
+       hr_dev->caps.qpc_timer_bt_num =
+-                              roce_get_field(req_a->qpc_timer_bt_idx_num,
+-                                      PF_RES_DATA_1_PF_QPC_TIMER_BT_NUM_M,
+-                                      PF_RES_DATA_1_PF_QPC_TIMER_BT_NUM_S);
++              roce_get_field(req_a->qpc_timer_bt_idx_num,
++                             PF_RES_DATA_1_PF_QPC_TIMER_BT_NUM_M,
++                             PF_RES_DATA_1_PF_QPC_TIMER_BT_NUM_S);
+       hr_dev->caps.cqc_timer_bt_num =
+-                              roce_get_field(req_a->cqc_timer_bt_idx_num,
+-                                      PF_RES_DATA_2_PF_CQC_TIMER_BT_NUM_M,
+-                                      PF_RES_DATA_2_PF_CQC_TIMER_BT_NUM_S);
++              roce_get_field(req_a->cqc_timer_bt_idx_num,
++                             PF_RES_DATA_2_PF_CQC_TIMER_BT_NUM_M,
++                             PF_RES_DATA_2_PF_CQC_TIMER_BT_NUM_S);
+       return 0;
+ }
+-- 
+2.25.1
+
diff --git a/queue-5.7/rdma-iw_cxgb4-cleanup-device-debugfs-entries-on-uld-.patch b/queue-5.7/rdma-iw_cxgb4-cleanup-device-debugfs-entries-on-uld-.patch
new file mode 100644 (file)
index 0000000..c90b964
--- /dev/null
@@ -0,0 +1,35 @@
+From 687a7521dbf3d9f2e1517ac20b7f6dd303ff61f7 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 25 May 2020 00:38:14 +0530
+Subject: RDMA/iw_cxgb4: cleanup device debugfs entries on ULD remove
+
+From: Potnuri Bharat Teja <bharat@chelsio.com>
+
+[ Upstream commit 49ea0c036ede81f126f1a9389d377999fdf5c5a1 ]
+
+Remove device specific debugfs entries immediately if LLD detaches a
+particular ULD device in case of fatal PCI errors.
+
+Link: https://lore.kernel.org/r/20200524190814.17599-1-bharat@chelsio.com
+Signed-off-by: Potnuri Bharat Teja <bharat@chelsio.com>
+Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/infiniband/hw/cxgb4/device.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/infiniband/hw/cxgb4/device.c b/drivers/infiniband/hw/cxgb4/device.c
+index 599340c1f0b82..541dbcf22d0eb 100644
+--- a/drivers/infiniband/hw/cxgb4/device.c
++++ b/drivers/infiniband/hw/cxgb4/device.c
+@@ -953,6 +953,7 @@ void c4iw_dealloc(struct uld_ctx *ctx)
+ static void c4iw_remove(struct uld_ctx *ctx)
+ {
+       pr_debug("c4iw_dev %p\n", ctx->dev);
++      debugfs_remove_recursive(ctx->dev->debugfs_root);
+       c4iw_unregister_device(ctx->dev);
+       c4iw_dealloc(ctx);
+ }
+-- 
+2.25.1
+
diff --git a/queue-5.7/rdma-mlx5-add-init2init-as-a-modify-command.patch b/queue-5.7/rdma-mlx5-add-init2init-as-a-modify-command.patch
new file mode 100644 (file)
index 0000000..7e0ade4
--- /dev/null
@@ -0,0 +1,39 @@
+From e29d7d23dd43c6a565f7b972fdb821dced8ec9c8 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 13 May 2020 12:55:50 +0300
+Subject: RDMA/mlx5: Add init2init as a modify command
+
+From: Aharon Landau <aharonl@mellanox.com>
+
+[ Upstream commit 819f7427bafd494ef7ca4942ec6322db20722d7b ]
+
+Missing INIT2INIT entry in the list of modify commands caused DEVX
+applications to be unable to modify_qp for this transition state. Add the
+MLX5_CMD_OP_INIT2INIT_QP opcode to the list of allowed DEVX opcodes.
+
+Fixes: e662e14d801b ("IB/mlx5: Add DEVX support for modify and query commands")
+Link: https://lore.kernel.org/r/20200513095550.211345-1-leon@kernel.org
+Signed-off-by: Aharon Landau <aharonl@mellanox.com>
+Reviewed-by: Maor Gottlieb <maorg@mellanox.com>
+Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
+Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/infiniband/hw/mlx5/devx.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/infiniband/hw/mlx5/devx.c b/drivers/infiniband/hw/mlx5/devx.c
+index 46e1ab771f106..d0742823ab497 100644
+--- a/drivers/infiniband/hw/mlx5/devx.c
++++ b/drivers/infiniband/hw/mlx5/devx.c
+@@ -819,6 +819,7 @@ static bool devx_is_obj_modify_cmd(const void *in)
+       case MLX5_CMD_OP_SET_L2_TABLE_ENTRY:
+       case MLX5_CMD_OP_RST2INIT_QP:
+       case MLX5_CMD_OP_INIT2RTR_QP:
++      case MLX5_CMD_OP_INIT2INIT_QP:
+       case MLX5_CMD_OP_RTR2RTS_QP:
+       case MLX5_CMD_OP_RTS2RTS_QP:
+       case MLX5_CMD_OP_SQERR2RTS_QP:
+-- 
+2.25.1
+
diff --git a/queue-5.7/rdma-mlx5-fix-udata-response-upon-srq-creation.patch b/queue-5.7/rdma-mlx5-fix-udata-response-upon-srq-creation.patch
new file mode 100644 (file)
index 0000000..c55a8a6
--- /dev/null
@@ -0,0 +1,50 @@
+From 131d80daff40088791ad046ea5a02d5dbd3f7cc6 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 6 Apr 2020 20:35:40 +0300
+Subject: RDMA/mlx5: Fix udata response upon SRQ creation
+
+From: Yishai Hadas <yishaih@mellanox.com>
+
+[ Upstream commit cf26deff9036cd3270af562dbec545239e5c7f07 ]
+
+Fix udata response upon SRQ creation to use the UAPI structure (i.e.
+mlx5_ib_create_srq_resp). It did not zero the reserved field in userspace.
+
+Fixes: e126ba97dba9 ("mlx5: Add driver for Mellanox Connect-IB adapters")
+Link: https://lore.kernel.org/r/20200406173540.1466477-1-leon@kernel.org
+Signed-off-by: Yishai Hadas <yishaih@mellanox.com>
+Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
+Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/infiniband/hw/mlx5/srq.c | 10 ++++++++--
+ 1 file changed, 8 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/infiniband/hw/mlx5/srq.c b/drivers/infiniband/hw/mlx5/srq.c
+index b1a8a91750400..6d1ff13d2283c 100644
+--- a/drivers/infiniband/hw/mlx5/srq.c
++++ b/drivers/infiniband/hw/mlx5/srq.c
+@@ -310,12 +310,18 @@ int mlx5_ib_create_srq(struct ib_srq *ib_srq,
+       srq->msrq.event = mlx5_ib_srq_event;
+       srq->ibsrq.ext.xrc.srq_num = srq->msrq.srqn;
+-      if (udata)
+-              if (ib_copy_to_udata(udata, &srq->msrq.srqn, sizeof(__u32))) {
++      if (udata) {
++              struct mlx5_ib_create_srq_resp resp = {
++                      .srqn = srq->msrq.srqn,
++              };
++
++              if (ib_copy_to_udata(udata, &resp, min(udata->outlen,
++                                   sizeof(resp)))) {
+                       mlx5_ib_dbg(dev, "copy to user failed\n");
+                       err = -EFAULT;
+                       goto err_core;
+               }
++      }
+       init_attr->attr.max_wr = srq->msrq.max - 1;
+-- 
+2.25.1
+
diff --git a/queue-5.7/rdma-srpt-fix-disabling-device-management.patch b/queue-5.7/rdma-srpt-fix-disabling-device-management.patch
new file mode 100644 (file)
index 0000000..0142c90
--- /dev/null
@@ -0,0 +1,55 @@
+From 626fda2ddf065fee3796c0a38c3176c1c8b528ba Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 14 May 2020 14:47:20 +0300
+Subject: RDMA/srpt: Fix disabling device management
+
+From: Kamal Heib <kamalheib1@gmail.com>
+
+[ Upstream commit 23bbd5818e2b0d265aa1835e66f5055f63a8fa4c ]
+
+Avoid disabling device management for devices that don't support
+Management datagrams (MADs) by checking if the "mad_agent" pointer is
+initialized before calling ib_modify_port, also fix the error flow in
+srpt_refresh_port() to disable device management if
+ib_register_mad_agent() fail.
+
+Fixes: 09f8a1486dca ("RDMA/srpt: Fix handling of SR-IOV and iWARP ports")
+Link: https://lore.kernel.org/r/20200514114720.141139-1-kamalheib1@gmail.com
+Signed-off-by: Kamal Heib <kamalheib1@gmail.com>
+Reviewed-by: Bart Van Assche <bvanassche@acm.org>
+Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/infiniband/ulp/srpt/ib_srpt.c | 8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/infiniband/ulp/srpt/ib_srpt.c b/drivers/infiniband/ulp/srpt/ib_srpt.c
+index 98552749d71cb..fcf982c60db6a 100644
+--- a/drivers/infiniband/ulp/srpt/ib_srpt.c
++++ b/drivers/infiniband/ulp/srpt/ib_srpt.c
+@@ -610,6 +610,11 @@ static int srpt_refresh_port(struct srpt_port *sport)
+                              dev_name(&sport->sdev->device->dev), sport->port,
+                              PTR_ERR(sport->mad_agent));
+                       sport->mad_agent = NULL;
++                      memset(&port_modify, 0, sizeof(port_modify));
++                      port_modify.clr_port_cap_mask = IB_PORT_DEVICE_MGMT_SUP;
++                      ib_modify_port(sport->sdev->device, sport->port, 0,
++                                     &port_modify);
++
+               }
+       }
+@@ -633,9 +638,8 @@ static void srpt_unregister_mad_agent(struct srpt_device *sdev)
+       for (i = 1; i <= sdev->device->phys_port_cnt; i++) {
+               sport = &sdev->port[i - 1];
+               WARN_ON(sport->port != i);
+-              if (ib_modify_port(sdev->device, i, 0, &port_modify) < 0)
+-                      pr_err("disabling MAD processing failed.\n");
+               if (sport->mad_agent) {
++                      ib_modify_port(sdev->device, i, 0, &port_modify);
+                       ib_unregister_mad_agent(sport->mad_agent);
+                       sport->mad_agent = NULL;
+               }
+-- 
+2.25.1
+
diff --git a/queue-5.7/rdma-uverbs-fix-create-wq-to-use-the-given-user-hand.patch b/queue-5.7/rdma-uverbs-fix-create-wq-to-use-the-given-user-hand.patch
new file mode 100644 (file)
index 0000000..a652c18
--- /dev/null
@@ -0,0 +1,47 @@
+From 595b36cb9979e118a34a8621b38d972dda29d30a Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 6 May 2020 11:24:42 +0300
+Subject: RDMA/uverbs: Fix create WQ to use the given user handle
+
+From: Yishai Hadas <yishaih@mellanox.com>
+
+[ Upstream commit dbd67252869ba58d086edfa14113e10f8059b97e ]
+
+Fix create WQ to use the given user handle, in addition dropped some
+duplicated code from this flow.
+
+Fixes: fd3c7904db6e ("IB/core: Change idr objects to use the new schema")
+Fixes: f213c0527210 ("IB/uverbs: Add WQ support")
+Link: https://lore.kernel.org/r/20200506082444.14502-9-leon@kernel.org
+Signed-off-by: Yishai Hadas <yishaih@mellanox.com>
+Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
+Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/infiniband/core/uverbs_cmd.c | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+diff --git a/drivers/infiniband/core/uverbs_cmd.c b/drivers/infiniband/core/uverbs_cmd.c
+index 060b4ebbd2ba4..d6e9cc94dd900 100644
+--- a/drivers/infiniband/core/uverbs_cmd.c
++++ b/drivers/infiniband/core/uverbs_cmd.c
+@@ -2959,6 +2959,7 @@ static int ib_uverbs_ex_create_wq(struct uverbs_attr_bundle *attrs)
+       wq_init_attr.event_handler = ib_uverbs_wq_event_handler;
+       wq_init_attr.create_flags = cmd.create_flags;
+       INIT_LIST_HEAD(&obj->uevent.event_list);
++      obj->uevent.uobject.user_handle = cmd.user_handle;
+       wq = pd->device->ops.create_wq(pd, &wq_init_attr, &attrs->driver_udata);
+       if (IS_ERR(wq)) {
+@@ -2976,8 +2977,6 @@ static int ib_uverbs_ex_create_wq(struct uverbs_attr_bundle *attrs)
+       atomic_set(&wq->usecnt, 0);
+       atomic_inc(&pd->usecnt);
+       atomic_inc(&cq->usecnt);
+-      wq->uobject = obj;
+-      obj->uevent.uobject.object = wq;
+       memset(&resp, 0, sizeof(resp));
+       resp.wq_handle = obj->uevent.uobject.id;
+-- 
+2.25.1
+
diff --git a/queue-5.7/remoteproc-fix-idr-initialisation-in-rproc_alloc.patch b/queue-5.7/remoteproc-fix-idr-initialisation-in-rproc_alloc.patch
new file mode 100644 (file)
index 0000000..bebd312
--- /dev/null
@@ -0,0 +1,60 @@
+From 8c0ed2007bd073c9724c140c50564ddefe563152 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 15 Apr 2020 14:48:52 -0600
+Subject: remoteproc: Fix IDR initialisation in rproc_alloc()
+
+From: Alex Elder <elder@linaro.org>
+
+[ Upstream commit 6442df49400b466431979e7634849a464a5f1861 ]
+
+If ida_simple_get() returns an error when called in rproc_alloc(),
+put_device() is called to clean things up.  By this time the rproc
+device type has been assigned, with rproc_type_release() as the
+release function.
+
+The first thing rproc_type_release() does is call:
+    idr_destroy(&rproc->notifyids);
+
+But at the time the ida_simple_get() call is made, the notifyids
+field in the remoteproc structure has not been initialized.
+
+I'm not actually sure this case causes an observable problem, but
+it's incorrect.  Fix this by initializing the notifyids field before
+calling ida_simple_get() in rproc_alloc().
+
+Fixes: b5ab5e24e960 ("remoteproc: maintain a generic child device for each rproc")
+Signed-off-by: Alex Elder <elder@linaro.org>
+Reviewed-by: Mathieu Poirier <mathieu.poirier@linaro.org>
+Reviewed-by: Suman Anna <s-anna@ti.com>
+Reviewed-by: Bjorn Andersson <bjorn.andersson@linaro.org>
+Link: https://lore.kernel.org/r/20200415204858.2448-2-mathieu.poirier@linaro.org
+Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/remoteproc/remoteproc_core.c | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+diff --git a/drivers/remoteproc/remoteproc_core.c b/drivers/remoteproc/remoteproc_core.c
+index be15aace9b3c8..8f79cfd2e4678 100644
+--- a/drivers/remoteproc/remoteproc_core.c
++++ b/drivers/remoteproc/remoteproc_core.c
+@@ -2053,6 +2053,7 @@ struct rproc *rproc_alloc(struct device *dev, const char *name,
+       rproc->dev.type = &rproc_type;
+       rproc->dev.class = &rproc_class;
+       rproc->dev.driver_data = rproc;
++      idr_init(&rproc->notifyids);
+       /* Assign a unique device index and name */
+       rproc->index = ida_simple_get(&rproc_dev_index, 0, 0, GFP_KERNEL);
+@@ -2078,8 +2079,6 @@ struct rproc *rproc_alloc(struct device *dev, const char *name,
+       mutex_init(&rproc->lock);
+-      idr_init(&rproc->notifyids);
+-
+       INIT_LIST_HEAD(&rproc->carveouts);
+       INIT_LIST_HEAD(&rproc->mappings);
+       INIT_LIST_HEAD(&rproc->traces);
+-- 
+2.25.1
+
diff --git a/queue-5.7/remoteproc-mediatek-fix-invalid-use-of-sizeof-in-scp.patch b/queue-5.7/remoteproc-mediatek-fix-invalid-use-of-sizeof-in-scp.patch
new file mode 100644 (file)
index 0000000..0261c7f
--- /dev/null
@@ -0,0 +1,41 @@
+From 01608e29fcf405136e99c8063f6d2af5ed611287 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 9 May 2020 08:42:37 +0000
+Subject: remoteproc/mediatek: fix invalid use of sizeof in scp_ipi_init()
+
+From: Wei Yongjun <weiyongjun1@huawei.com>
+
+[ Upstream commit 8096f80a5c09b716be207eb042c4e40d6cdefbd2 ]
+
+sizeof() when applied to a pointer typed expression gives the
+size of the pointer, not that of the pointed data.
+
+Reviewed-by: Mathieu Poirier <mathieu.poirier@linaro.org>
+Fixes: 63c13d61eafe ("remoteproc/mediatek: add SCP support for mt8183")
+Reported-by: Hulk Robot <hulkci@huawei.com>
+Signed-off-by: Wei Yongjun <weiyongjun1@huawei.com>
+Link: https://lore.kernel.org/r/20200509084237.36293-1-weiyongjun1@huawei.com
+Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/remoteproc/mtk_scp.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/remoteproc/mtk_scp.c b/drivers/remoteproc/mtk_scp.c
+index 2bead57c9cf9b..ac13e7b046a60 100644
+--- a/drivers/remoteproc/mtk_scp.c
++++ b/drivers/remoteproc/mtk_scp.c
+@@ -132,8 +132,8 @@ static int scp_ipi_init(struct mtk_scp *scp)
+               (struct mtk_share_obj __iomem *)(scp->sram_base + recv_offset);
+       scp->send_buf =
+               (struct mtk_share_obj __iomem *)(scp->sram_base + send_offset);
+-      memset_io(scp->recv_buf, 0, sizeof(scp->recv_buf));
+-      memset_io(scp->send_buf, 0, sizeof(scp->send_buf));
++      memset_io(scp->recv_buf, 0, sizeof(*scp->recv_buf));
++      memset_io(scp->send_buf, 0, sizeof(*scp->send_buf));
+       return 0;
+ }
+-- 
+2.25.1
+
diff --git a/queue-5.7/remoteproc-qcom_q6v5_mss-drop-accesses-to-mpss-perph.patch b/queue-5.7/remoteproc-qcom_q6v5_mss-drop-accesses-to-mpss-perph.patch
new file mode 100644 (file)
index 0000000..22a0f85
--- /dev/null
@@ -0,0 +1,288 @@
+From efeab2b23c7ecbc86bc6844ae3599607ef29a7ac Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 15 Apr 2020 20:21:10 +0530
+Subject: remoteproc: qcom_q6v5_mss: Drop accesses to MPSS PERPH register space
+
+From: Sibi Sankar <sibis@codeaurora.org>
+
+[ Upstream commit a9fdc79d488623d36341f0f3d08f5aa1bedb9d53 ]
+
+7C retail devices using MSA based boot will result in a fuse combination
+which will prevent accesses to MSS PERPH register space where the mpss
+clocks and halt-nav reside. So drop all accesses to the MPSS PERPH
+register space. Issuing HALT NAV request and turning on the mss clocks
+as part of SSR will no longer be required since the modem firmware will
+have the necessary fixes to ensure that there are no pending NAV DMA
+transactions.
+
+Tested-by: Evan Green <evgreen@chromium.org>
+Signed-off-by: Sibi Sankar <sibis@codeaurora.org>
+Link: https://lore.kernel.org/r/20200415145110.20624-3-sibis@codeaurora.org
+Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/remoteproc/qcom_q6v5_mss.c | 102 +++++------------------------
+ 1 file changed, 18 insertions(+), 84 deletions(-)
+
+diff --git a/drivers/remoteproc/qcom_q6v5_mss.c b/drivers/remoteproc/qcom_q6v5_mss.c
+index 22416e86a1742..629abcee2c1d5 100644
+--- a/drivers/remoteproc/qcom_q6v5_mss.c
++++ b/drivers/remoteproc/qcom_q6v5_mss.c
+@@ -69,13 +69,9 @@
+ #define AXI_HALTREQ_REG                       0x0
+ #define AXI_HALTACK_REG                       0x4
+ #define AXI_IDLE_REG                  0x8
+-#define NAV_AXI_HALTREQ_BIT           BIT(0)
+-#define NAV_AXI_HALTACK_BIT           BIT(1)
+-#define NAV_AXI_IDLE_BIT              BIT(2)
+ #define AXI_GATING_VALID_OVERRIDE     BIT(0)
+ #define HALT_ACK_TIMEOUT_US           100000
+-#define NAV_HALT_ACK_TIMEOUT_US               200
+ /* QDSP6SS_RESET */
+ #define Q6SS_STOP_CORE                        BIT(0)
+@@ -143,7 +139,7 @@ struct rproc_hexagon_res {
+       int version;
+       bool need_mem_protection;
+       bool has_alt_reset;
+-      bool has_halt_nav;
++      bool has_spare_reg;
+ };
+ struct q6v5 {
+@@ -154,13 +150,11 @@ struct q6v5 {
+       void __iomem *rmb_base;
+       struct regmap *halt_map;
+-      struct regmap *halt_nav_map;
+       struct regmap *conn_map;
+       u32 halt_q6;
+       u32 halt_modem;
+       u32 halt_nc;
+-      u32 halt_nav;
+       u32 conn_box;
+       struct reset_control *mss_restart;
+@@ -206,7 +200,7 @@ struct q6v5 {
+       struct qcom_sysmon *sysmon;
+       bool need_mem_protection;
+       bool has_alt_reset;
+-      bool has_halt_nav;
++      bool has_spare_reg;
+       int mpss_perm;
+       int mba_perm;
+       const char *hexagon_mdt_image;
+@@ -427,21 +421,19 @@ static int q6v5_reset_assert(struct q6v5 *qproc)
+               reset_control_assert(qproc->pdc_reset);
+               ret = reset_control_reset(qproc->mss_restart);
+               reset_control_deassert(qproc->pdc_reset);
+-      } else if (qproc->has_halt_nav) {
++      } else if (qproc->has_spare_reg) {
+               /*
+                * When the AXI pipeline is being reset with the Q6 modem partly
+                * operational there is possibility of AXI valid signal to
+                * glitch, leading to spurious transactions and Q6 hangs. A work
+                * around is employed by asserting the AXI_GATING_VALID_OVERRIDE
+-               * BIT before triggering Q6 MSS reset. Both the HALTREQ and
+-               * AXI_GATING_VALID_OVERRIDE are withdrawn post MSS assert
+-               * followed by a MSS deassert, while holding the PDC reset.
++               * BIT before triggering Q6 MSS reset. AXI_GATING_VALID_OVERRIDE
++               * is withdrawn post MSS assert followed by a MSS deassert,
++               * while holding the PDC reset.
+                */
+               reset_control_assert(qproc->pdc_reset);
+               regmap_update_bits(qproc->conn_map, qproc->conn_box,
+                                  AXI_GATING_VALID_OVERRIDE, 1);
+-              regmap_update_bits(qproc->halt_nav_map, qproc->halt_nav,
+-                                 NAV_AXI_HALTREQ_BIT, 0);
+               reset_control_assert(qproc->mss_restart);
+               reset_control_deassert(qproc->pdc_reset);
+               regmap_update_bits(qproc->conn_map, qproc->conn_box,
+@@ -464,7 +456,7 @@ static int q6v5_reset_deassert(struct q6v5 *qproc)
+               ret = reset_control_reset(qproc->mss_restart);
+               writel(0, qproc->rmb_base + RMB_MBA_ALT_RESET);
+               reset_control_deassert(qproc->pdc_reset);
+-      } else if (qproc->has_halt_nav) {
++      } else if (qproc->has_spare_reg) {
+               ret = reset_control_reset(qproc->mss_restart);
+       } else {
+               ret = reset_control_deassert(qproc->mss_restart);
+@@ -761,32 +753,6 @@ static void q6v5proc_halt_axi_port(struct q6v5 *qproc,
+       regmap_write(halt_map, offset + AXI_HALTREQ_REG, 0);
+ }
+-static void q6v5proc_halt_nav_axi_port(struct q6v5 *qproc,
+-                                     struct regmap *halt_map,
+-                                     u32 offset)
+-{
+-      unsigned int val;
+-      int ret;
+-
+-      /* Check if we're already idle */
+-      ret = regmap_read(halt_map, offset, &val);
+-      if (!ret && (val & NAV_AXI_IDLE_BIT))
+-              return;
+-
+-      /* Assert halt request */
+-      regmap_update_bits(halt_map, offset, NAV_AXI_HALTREQ_BIT,
+-                         NAV_AXI_HALTREQ_BIT);
+-
+-      /* Wait for halt ack*/
+-      regmap_read_poll_timeout(halt_map, offset, val,
+-                               (val & NAV_AXI_HALTACK_BIT),
+-                               5, NAV_HALT_ACK_TIMEOUT_US);
+-
+-      ret = regmap_read(halt_map, offset, &val);
+-      if (ret || !(val & NAV_AXI_IDLE_BIT))
+-              dev_err(qproc->dev, "port failed halt\n");
+-}
+-
+ static int q6v5_mpss_init_image(struct q6v5 *qproc, const struct firmware *fw)
+ {
+       unsigned long dma_attrs = DMA_ATTR_FORCE_CONTIGUOUS;
+@@ -951,9 +917,6 @@ static int q6v5_mba_load(struct q6v5 *qproc)
+ halt_axi_ports:
+       q6v5proc_halt_axi_port(qproc, qproc->halt_map, qproc->halt_q6);
+       q6v5proc_halt_axi_port(qproc, qproc->halt_map, qproc->halt_modem);
+-      if (qproc->has_halt_nav)
+-              q6v5proc_halt_nav_axi_port(qproc, qproc->halt_nav_map,
+-                                         qproc->halt_nav);
+       q6v5proc_halt_axi_port(qproc, qproc->halt_map, qproc->halt_nc);
+ reclaim_mba:
+@@ -1001,9 +964,6 @@ static void q6v5_mba_reclaim(struct q6v5 *qproc)
+       q6v5proc_halt_axi_port(qproc, qproc->halt_map, qproc->halt_q6);
+       q6v5proc_halt_axi_port(qproc, qproc->halt_map, qproc->halt_modem);
+-      if (qproc->has_halt_nav)
+-              q6v5proc_halt_nav_axi_port(qproc, qproc->halt_nav_map,
+-                                         qproc->halt_nav);
+       q6v5proc_halt_axi_port(qproc, qproc->halt_map, qproc->halt_nc);
+       if (qproc->version == MSS_MSM8996) {
+               /*
+@@ -1447,36 +1407,12 @@ static int q6v5_init_mem(struct q6v5 *qproc, struct platform_device *pdev)
+       qproc->halt_modem = args.args[1];
+       qproc->halt_nc = args.args[2];
+-      if (qproc->has_halt_nav) {
+-              struct platform_device *nav_pdev;
+-
++      if (qproc->has_spare_reg) {
+               ret = of_parse_phandle_with_fixed_args(pdev->dev.of_node,
+-                                                     "qcom,halt-nav-regs",
++                                                     "qcom,spare-regs",
+                                                      1, 0, &args);
+               if (ret < 0) {
+-                      dev_err(&pdev->dev, "failed to parse halt-nav-regs\n");
+-                      return -EINVAL;
+-              }
+-
+-              nav_pdev = of_find_device_by_node(args.np);
+-              of_node_put(args.np);
+-              if (!nav_pdev) {
+-                      dev_err(&pdev->dev, "failed to get mss clock device\n");
+-                      return -EPROBE_DEFER;
+-              }
+-
+-              qproc->halt_nav_map = dev_get_regmap(&nav_pdev->dev, NULL);
+-              if (!qproc->halt_nav_map) {
+-                      dev_err(&pdev->dev, "failed to get map from device\n");
+-                      return -EINVAL;
+-              }
+-              qproc->halt_nav = args.args[0];
+-
+-              ret = of_parse_phandle_with_fixed_args(pdev->dev.of_node,
+-                                                     "qcom,halt-nav-regs",
+-                                                     1, 1, &args);
+-              if (ret < 0) {
+-                      dev_err(&pdev->dev, "failed to parse halt-nav-regs\n");
++                      dev_err(&pdev->dev, "failed to parse spare-regs\n");
+                       return -EINVAL;
+               }
+@@ -1562,7 +1498,7 @@ static int q6v5_init_reset(struct q6v5 *qproc)
+               return PTR_ERR(qproc->mss_restart);
+       }
+-      if (qproc->has_alt_reset || qproc->has_halt_nav) {
++      if (qproc->has_alt_reset || qproc->has_spare_reg) {
+               qproc->pdc_reset = devm_reset_control_get_exclusive(qproc->dev,
+                                                                   "pdc_reset");
+               if (IS_ERR(qproc->pdc_reset)) {
+@@ -1688,7 +1624,7 @@ static int q6v5_probe(struct platform_device *pdev)
+       platform_set_drvdata(pdev, qproc);
+-      qproc->has_halt_nav = desc->has_halt_nav;
++      qproc->has_spare_reg = desc->has_spare_reg;
+       ret = q6v5_init_mem(qproc, pdev);
+       if (ret)
+               goto free_rproc;
+@@ -1837,8 +1773,6 @@ static const struct rproc_hexagon_res sc7180_mss = {
+       .active_clk_names = (char*[]){
+               "mnoc_axi",
+               "nav",
+-              "mss_nav",
+-              "mss_crypto",
+               NULL
+       },
+       .active_pd_names = (char*[]){
+@@ -1853,7 +1787,7 @@ static const struct rproc_hexagon_res sc7180_mss = {
+       },
+       .need_mem_protection = true,
+       .has_alt_reset = false,
+-      .has_halt_nav = true,
++      .has_spare_reg = true,
+       .version = MSS_SC7180,
+ };
+@@ -1888,7 +1822,7 @@ static const struct rproc_hexagon_res sdm845_mss = {
+       },
+       .need_mem_protection = true,
+       .has_alt_reset = true,
+-      .has_halt_nav = false,
++      .has_spare_reg = false,
+       .version = MSS_SDM845,
+ };
+@@ -1915,7 +1849,7 @@ static const struct rproc_hexagon_res msm8998_mss = {
+       },
+       .need_mem_protection = true,
+       .has_alt_reset = false,
+-      .has_halt_nav = false,
++      .has_spare_reg = false,
+       .version = MSS_MSM8998,
+ };
+@@ -1945,7 +1879,7 @@ static const struct rproc_hexagon_res msm8996_mss = {
+       },
+       .need_mem_protection = true,
+       .has_alt_reset = false,
+-      .has_halt_nav = false,
++      .has_spare_reg = false,
+       .version = MSS_MSM8996,
+ };
+@@ -1978,7 +1912,7 @@ static const struct rproc_hexagon_res msm8916_mss = {
+       },
+       .need_mem_protection = false,
+       .has_alt_reset = false,
+-      .has_halt_nav = false,
++      .has_spare_reg = false,
+       .version = MSS_MSM8916,
+ };
+@@ -2019,7 +1953,7 @@ static const struct rproc_hexagon_res msm8974_mss = {
+       },
+       .need_mem_protection = false,
+       .has_alt_reset = false,
+-      .has_halt_nav = false,
++      .has_spare_reg = false,
+       .version = MSS_MSM8974,
+ };
+-- 
+2.25.1
+
diff --git a/queue-5.7/remoteproc-qcom_q6v5_mss-map-unmap-mpss-segments-bef.patch b/queue-5.7/remoteproc-qcom_q6v5_mss-map-unmap-mpss-segments-bef.patch
new file mode 100644 (file)
index 0000000..b2470f7
--- /dev/null
@@ -0,0 +1,110 @@
+From cd3e54a250747c60e00784707d0c3f7440c787fb Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 15 Apr 2020 12:46:18 +0530
+Subject: remoteproc: qcom_q6v5_mss: map/unmap mpss segments before/after use
+
+From: Sibi Sankar <sibis@codeaurora.org>
+
+[ Upstream commit be050a3429f46ecf13eb2b80f299479f8bb823fb ]
+
+The application processor accessing the mpss region when the Q6 modem is
+running will lead to an XPU violation. Fix this by un-mapping the mpss
+segments post copy during mpss authentication and coredumps.
+
+Tested-by: Evan Green <evgreen@chromium.org>
+Signed-off-by: Sibi Sankar <sibis@codeaurora.org>
+Link: https://lore.kernel.org/r/20200415071619.6052-1-sibis@codeaurora.org
+Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/remoteproc/qcom_q6v5_mss.c | 31 +++++++++++++++++++-----------
+ 1 file changed, 20 insertions(+), 11 deletions(-)
+
+diff --git a/drivers/remoteproc/qcom_q6v5_mss.c b/drivers/remoteproc/qcom_q6v5_mss.c
+index 5475d4f808a8e..22416e86a1742 100644
+--- a/drivers/remoteproc/qcom_q6v5_mss.c
++++ b/drivers/remoteproc/qcom_q6v5_mss.c
+@@ -1156,7 +1156,13 @@ static int q6v5_mpss_load(struct q6v5 *qproc)
+                       goto release_firmware;
+               }
+-              ptr = qproc->mpss_region + offset;
++              ptr = ioremap_wc(qproc->mpss_phys + offset, phdr->p_memsz);
++              if (!ptr) {
++                      dev_err(qproc->dev,
++                              "unable to map memory region: %pa+%zx-%x\n",
++                              &qproc->mpss_phys, offset, phdr->p_memsz);
++                      goto release_firmware;
++              }
+               if (phdr->p_filesz && phdr->p_offset < fw->size) {
+                       /* Firmware is large enough to be non-split */
+@@ -1165,6 +1171,7 @@ static int q6v5_mpss_load(struct q6v5 *qproc)
+                                       "failed to load segment %d from truncated file %s\n",
+                                       i, fw_name);
+                               ret = -EINVAL;
++                              iounmap(ptr);
+                               goto release_firmware;
+                       }
+@@ -1175,6 +1182,7 @@ static int q6v5_mpss_load(struct q6v5 *qproc)
+                       ret = request_firmware(&seg_fw, fw_name, qproc->dev);
+                       if (ret) {
+                               dev_err(qproc->dev, "failed to load %s\n", fw_name);
++                              iounmap(ptr);
+                               goto release_firmware;
+                       }
+@@ -1187,6 +1195,7 @@ static int q6v5_mpss_load(struct q6v5 *qproc)
+                       memset(ptr + phdr->p_filesz, 0,
+                              phdr->p_memsz - phdr->p_filesz);
+               }
++              iounmap(ptr);
+               size += phdr->p_memsz;
+               code_length = readl(qproc->rmb_base + RMB_PMI_CODE_LENGTH_REG);
+@@ -1236,7 +1245,8 @@ static void qcom_q6v5_dump_segment(struct rproc *rproc,
+       int ret = 0;
+       struct q6v5 *qproc = rproc->priv;
+       unsigned long mask = BIT((unsigned long)segment->priv);
+-      void *ptr = rproc_da_to_va(rproc, segment->da, segment->size);
++      int offset = segment->da - qproc->mpss_reloc;
++      void *ptr = NULL;
+       /* Unlock mba before copying segments */
+       if (!qproc->dump_mba_loaded) {
+@@ -1250,10 +1260,15 @@ static void qcom_q6v5_dump_segment(struct rproc *rproc,
+               }
+       }
+-      if (!ptr || ret)
+-              memset(dest, 0xff, segment->size);
+-      else
++      if (!ret)
++              ptr = ioremap_wc(qproc->mpss_phys + offset, segment->size);
++
++      if (ptr) {
+               memcpy(dest, ptr, segment->size);
++              iounmap(ptr);
++      } else {
++              memset(dest, 0xff, segment->size);
++      }
+       qproc->dump_segment_mask |= mask;
+@@ -1595,12 +1610,6 @@ static int q6v5_alloc_memory_region(struct q6v5 *qproc)
+       qproc->mpss_phys = qproc->mpss_reloc = r.start;
+       qproc->mpss_size = resource_size(&r);
+-      qproc->mpss_region = devm_ioremap_wc(qproc->dev, qproc->mpss_phys, qproc->mpss_size);
+-      if (!qproc->mpss_region) {
+-              dev_err(qproc->dev, "unable to map memory region: %pa+%zx\n",
+-                      &r.start, qproc->mpss_size);
+-              return -EBUSY;
+-      }
+       return 0;
+ }
+-- 
+2.25.1
+
diff --git a/queue-5.7/rtc-mc13xxx-fix-a-double-unlock-issue.patch b/queue-5.7/rtc-mc13xxx-fix-a-double-unlock-issue.patch
new file mode 100644 (file)
index 0000000..94d8b69
--- /dev/null
@@ -0,0 +1,47 @@
+From 8d5c13485efe0a8a1d75461bdfbfb48152513df3 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 3 May 2020 13:22:35 -0500
+Subject: rtc: mc13xxx: fix a double-unlock issue
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Qiushi Wu <wu000273@umn.edu>
+
+[ Upstream commit 8816cd726a4fee197af2d851cbe25991ae19ea14 ]
+
+In function mc13xxx_rtc_probe, the mc13xxx_unlock() is called
+before rtc_register_device(). But in the error path of
+rtc_register_device(), the mc13xxx_unlock() is called again,
+which causes a double-unlock problem. Thus add a call of the
+function “mc13xxx_lock” in an if branch for the completion
+of the exception handling.
+
+Fixes: e4ae7023e182a ("rtc: mc13xxx: set range")
+Signed-off-by: Qiushi Wu <wu000273@umn.edu>
+Link: https://lore.kernel.org/r/20200503182235.1652-1-wu000273@umn.edu
+Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/rtc/rtc-mc13xxx.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/rtc/rtc-mc13xxx.c b/drivers/rtc/rtc-mc13xxx.c
+index afce2c0b4bd67..d6802e6191cbe 100644
+--- a/drivers/rtc/rtc-mc13xxx.c
++++ b/drivers/rtc/rtc-mc13xxx.c
+@@ -308,8 +308,10 @@ static int __init mc13xxx_rtc_probe(struct platform_device *pdev)
+       mc13xxx_unlock(mc13xxx);
+       ret = rtc_register_device(priv->rtc);
+-      if (ret)
++      if (ret) {
++              mc13xxx_lock(mc13xxx);
+               goto err_irq_request;
++      }
+       return 0;
+-- 
+2.25.1
+
diff --git a/queue-5.7/rtc-rc5t619-fix-an-err_ptr-vs-null-check.patch b/queue-5.7/rtc-rc5t619-fix-an-err_ptr-vs-null-check.patch
new file mode 100644 (file)
index 0000000..541f032
--- /dev/null
@@ -0,0 +1,40 @@
+From f08b37ea5402c247bc90462180b784ae45f39ab0 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 7 Apr 2020 12:28:52 +0300
+Subject: rtc: rc5t619: Fix an ERR_PTR vs NULL check
+
+From: Dan Carpenter <dan.carpenter@oracle.com>
+
+[ Upstream commit 11ddbdfb68e4f9791e4bd4f8d7c87d3f19670967 ]
+
+The devm_kzalloc() function returns NULL on error, it doesn't return
+error pointers so this check doesn't work.
+
+Fixes: 540d1e15393d ("rtc: rc5t619: Add Ricoh RC5T619 RTC driver")
+Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
+Link: https://lore.kernel.org/r/20200407092852.GI68494@mwanda
+Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/rtc/rtc-rc5t619.c | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+diff --git a/drivers/rtc/rtc-rc5t619.c b/drivers/rtc/rtc-rc5t619.c
+index 24e386ecbc7ed..dd1a20977478e 100644
+--- a/drivers/rtc/rtc-rc5t619.c
++++ b/drivers/rtc/rtc-rc5t619.c
+@@ -356,10 +356,8 @@ static int rc5t619_rtc_probe(struct platform_device *pdev)
+       int err;
+       rtc = devm_kzalloc(dev, sizeof(*rtc), GFP_KERNEL);
+-      if (IS_ERR(rtc)) {
+-              err = PTR_ERR(rtc);
++      if (!rtc)
+               return -ENOMEM;
+-      }
+       rtc->rn5t618 = rn5t618;
+-- 
+2.25.1
+
diff --git a/queue-5.7/rtc-rv3028-add-missed-check-for-devm_regmap_init_i2c.patch b/queue-5.7/rtc-rv3028-add-missed-check-for-devm_regmap_init_i2c.patch
new file mode 100644 (file)
index 0000000..97401ab
--- /dev/null
@@ -0,0 +1,37 @@
+From ffe079c43c3600defc17b58badd2affaaa189180 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 28 May 2020 18:39:50 +0800
+Subject: rtc: rv3028: Add missed check for devm_regmap_init_i2c()
+
+From: Chuhong Yuan <hslester96@gmail.com>
+
+[ Upstream commit c3b29bf6f166f6ed5f04f9c125477358e0e25df8 ]
+
+rv3028_probe() misses a check for devm_regmap_init_i2c().
+Add the missed check to fix it.
+
+Fixes: e6e7376cfd7b ("rtc: rv3028: add new driver")
+Signed-off-by: Chuhong Yuan <hslester96@gmail.com>
+Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
+Link: https://lore.kernel.org/r/20200528103950.912353-1-hslester96@gmail.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/rtc/rtc-rv3028.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/drivers/rtc/rtc-rv3028.c b/drivers/rtc/rtc-rv3028.c
+index a0ddc86c975a4..ec84db0b3d7ab 100644
+--- a/drivers/rtc/rtc-rv3028.c
++++ b/drivers/rtc/rtc-rv3028.c
+@@ -755,6 +755,8 @@ static int rv3028_probe(struct i2c_client *client)
+               return -ENOMEM;
+       rv3028->regmap = devm_regmap_init_i2c(client, &regmap_config);
++      if (IS_ERR(rv3028->regmap))
++              return PTR_ERR(rv3028->regmap);
+       i2c_set_clientdata(client, rv3028);
+-- 
+2.25.1
+
diff --git a/queue-5.7/rxrpc-adjust-proc-net-rxrpc-calls-to-display-call-de.patch b/queue-5.7/rxrpc-adjust-proc-net-rxrpc-calls-to-display-call-de.patch
new file mode 100644 (file)
index 0000000..c7faec0
--- /dev/null
@@ -0,0 +1,54 @@
+From 09ab1e4c07c2810afbc75ba9347ebd270ec143b7 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 2 May 2020 13:38:23 +0100
+Subject: rxrpc: Adjust /proc/net/rxrpc/calls to display call->debug_id not
+ user_ID
+
+From: David Howells <dhowells@redhat.com>
+
+[ Upstream commit 32f71aa497cfb23d37149c2ef16ad71fce2e45e2 ]
+
+The user ID value isn't actually much use - and leaks a kernel pointer or a
+userspace value - so replace it with the call debug ID, which appears in trace
+points.
+
+Signed-off-by: David Howells <dhowells@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/rxrpc/proc.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/net/rxrpc/proc.c b/net/rxrpc/proc.c
+index 8b179e3c802a1..543afd9bd6642 100644
+--- a/net/rxrpc/proc.c
++++ b/net/rxrpc/proc.c
+@@ -68,7 +68,7 @@ static int rxrpc_call_seq_show(struct seq_file *seq, void *v)
+                        "Proto Local                                          "
+                        " Remote                                         "
+                        " SvID ConnID   CallID   End Use State    Abort   "
+-                       " UserID           TxSeq    TW RxSeq    RW RxSerial RxTimo\n");
++                       " DebugId  TxSeq    TW RxSeq    RW RxSerial RxTimo\n");
+               return 0;
+       }
+@@ -100,7 +100,7 @@ static int rxrpc_call_seq_show(struct seq_file *seq, void *v)
+       rx_hard_ack = READ_ONCE(call->rx_hard_ack);
+       seq_printf(seq,
+                  "UDP   %-47.47s %-47.47s %4x %08x %08x %s %3u"
+-                 " %-8.8s %08x %lx %08x %02x %08x %02x %08x %06lx\n",
++                 " %-8.8s %08x %08x %08x %02x %08x %02x %08x %06lx\n",
+                  lbuff,
+                  rbuff,
+                  call->service_id,
+@@ -110,7 +110,7 @@ static int rxrpc_call_seq_show(struct seq_file *seq, void *v)
+                  atomic_read(&call->usage),
+                  rxrpc_call_states[call->state],
+                  call->abort_code,
+-                 call->user_call_ID,
++                 call->debug_id,
+                  tx_hard_ack, READ_ONCE(call->tx_top) - tx_hard_ack,
+                  rx_hard_ack, READ_ONCE(call->rx_top) - rx_hard_ack,
+                  call->rx_serial,
+-- 
+2.25.1
+
diff --git a/queue-5.7/s390-numa-let-nodes_shift-depend-on-need_multiple_no.patch b/queue-5.7/s390-numa-let-nodes_shift-depend-on-need_multiple_no.patch
new file mode 100644 (file)
index 0000000..5150c62
--- /dev/null
@@ -0,0 +1,51 @@
+From 320a4495b9ef9eec4082d18d73ced741743203c7 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 10 Jun 2020 10:36:05 +0200
+Subject: s390/numa: let NODES_SHIFT depend on NEED_MULTIPLE_NODES
+
+From: Heiko Carstens <heiko.carstens@de.ibm.com>
+
+[ Upstream commit 64438e1bc0cdbe6d30bcdcb976f935eb3c297adc ]
+
+Qian Cai reported:
+"""
+When NUMA=n and nr_node_ids=2, in apply_wqattrs_prepare(), it has,
+
+for_each_node(node) {
+        if (wq_calc_node_cpumask(...
+
+where it will trigger a booting warning,
+
+WARNING: workqueue cpumask: online intersect > possible intersect
+
+because it found 2 nodes and wq_numa_possible_cpumask[1] is an empty
+cpumask.
+"""
+
+Let NODES_SHIFT depend on NEED_MULTIPLE_NODES like it is done
+on other architectures in order to fix this.
+
+Fixes: 701dc81e7412 ("s390/mm: remove fake numa support")
+Reported-by: Qian Cai <cai@lca.pw>
+Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
+Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/s390/Kconfig | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig
+index 2167bce993ff6..ae01be202204b 100644
+--- a/arch/s390/Kconfig
++++ b/arch/s390/Kconfig
+@@ -462,6 +462,7 @@ config NUMA
+ config NODES_SHIFT
+       int
++      depends on NEED_MULTIPLE_NODES
+       default "1"
+ config SCHED_SMT
+-- 
+2.25.1
+
diff --git a/queue-5.7/s390-qdio-consistently-restore-the-irq-handler.patch b/queue-5.7/s390-qdio-consistently-restore-the-irq-handler.patch
new file mode 100644 (file)
index 0000000..893ae51
--- /dev/null
@@ -0,0 +1,157 @@
+From 9dde9aeb2ab8a52e233b9bb5fa080db472997768 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 9 Apr 2020 10:55:16 +0200
+Subject: s390/qdio: consistently restore the IRQ handler
+
+From: Julian Wiedmann <jwi@linux.ibm.com>
+
+[ Upstream commit 7b942b4be971d49cb185ce4690d7fbf94636e88a ]
+
+For rolling back after an error, qdio_establish() calls qdio_shutdown().
+If the error occurs early enough, then the qdio_irq's state still is
+QDIO_IRQ_STATE_INACTIVE and qdio_shutdown() does nothing.
+
+But at _any_ point where qdio_establish() bails out in this way,
+qdio_setup_irq() will have already replaced the IRQ handler. This then
+won't be restored after an early error, and the device can end up being
+returned to the device driver with qdio's IRQ handler still installed.
+
+Slightly reorder qdio_setup_irq() so we can be 100% sure that the IRQ
+handler was replaced. Then fix the bug in qdio_establish() by calling a
+helper that rolls back only the IRQ handler modification.
+
+Also use the new helper in qdio_shutdown() to keep things in sync, and
+slightly clean up the locking while doing so.
+This makes minor semantical changes, but holding setup_mutex gives us
+sufficient leeway to eg. pull qdio_shutdown_thinint() outside of the
+ccwdev lock's scope.
+
+Fixes: 779e6e1c724d ("[S390] qdio: new qdio driver.")
+Signed-off-by: Julian Wiedmann <jwi@linux.ibm.com>
+Reviewed-by: Benjamin Block <bblock@linux.ibm.com>
+Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/s390/cio/qdio.h       |  1 +
+ drivers/s390/cio/qdio_main.c  | 18 +++++-------------
+ drivers/s390/cio/qdio_setup.c | 20 ++++++++++++++++----
+ 3 files changed, 22 insertions(+), 17 deletions(-)
+
+diff --git a/drivers/s390/cio/qdio.h b/drivers/s390/cio/qdio.h
+index b8453b5946794..3cf223bc1d5f4 100644
+--- a/drivers/s390/cio/qdio.h
++++ b/drivers/s390/cio/qdio.h
+@@ -389,6 +389,7 @@ int qdio_setup_get_ssqd(struct qdio_irq *irq_ptr,
+                       struct subchannel_id *schid,
+                       struct qdio_ssqd_desc *data);
+ int qdio_setup_irq(struct qdio_irq *irq_ptr, struct qdio_initialize *init_data);
++void qdio_shutdown_irq(struct qdio_irq *irq);
+ void qdio_print_subchannel_info(struct qdio_irq *irq_ptr);
+ void qdio_release_memory(struct qdio_irq *irq_ptr);
+ int qdio_setup_init(void);
+diff --git a/drivers/s390/cio/qdio_main.c b/drivers/s390/cio/qdio_main.c
+index bcc3ab14e72df..da5a111380201 100644
+--- a/drivers/s390/cio/qdio_main.c
++++ b/drivers/s390/cio/qdio_main.c
+@@ -1154,35 +1154,27 @@ int qdio_shutdown(struct ccw_device *cdev, int how)
+       /* cleanup subchannel */
+       spin_lock_irq(get_ccwdev_lock(cdev));
+-
++      qdio_set_state(irq_ptr, QDIO_IRQ_STATE_CLEANUP);
+       if (how & QDIO_FLAG_CLEANUP_USING_CLEAR)
+               rc = ccw_device_clear(cdev, QDIO_DOING_CLEANUP);
+       else
+               /* default behaviour is halt */
+               rc = ccw_device_halt(cdev, QDIO_DOING_CLEANUP);
++      spin_unlock_irq(get_ccwdev_lock(cdev));
+       if (rc) {
+               DBF_ERROR("%4x SHUTD ERR", irq_ptr->schid.sch_no);
+               DBF_ERROR("rc:%4d", rc);
+               goto no_cleanup;
+       }
+-      qdio_set_state(irq_ptr, QDIO_IRQ_STATE_CLEANUP);
+-      spin_unlock_irq(get_ccwdev_lock(cdev));
+       wait_event_interruptible_timeout(cdev->private->wait_q,
+               irq_ptr->state == QDIO_IRQ_STATE_INACTIVE ||
+               irq_ptr->state == QDIO_IRQ_STATE_ERR,
+               10 * HZ);
+-      spin_lock_irq(get_ccwdev_lock(cdev));
+ no_cleanup:
+       qdio_shutdown_thinint(irq_ptr);
+-
+-      /* restore interrupt handler */
+-      if ((void *)cdev->handler == (void *)qdio_int_handler) {
+-              cdev->handler = irq_ptr->orig_handler;
+-              cdev->private->intparm = 0;
+-      }
+-      spin_unlock_irq(get_ccwdev_lock(cdev));
++      qdio_shutdown_irq(irq_ptr);
+       qdio_set_state(irq_ptr, QDIO_IRQ_STATE_INACTIVE);
+       mutex_unlock(&irq_ptr->setup_mutex);
+@@ -1352,8 +1344,8 @@ int qdio_establish(struct ccw_device *cdev,
+       rc = qdio_establish_thinint(irq_ptr);
+       if (rc) {
++              qdio_shutdown_irq(irq_ptr);
+               mutex_unlock(&irq_ptr->setup_mutex);
+-              qdio_shutdown(cdev, QDIO_FLAG_CLEANUP_USING_CLEAR);
+               return rc;
+       }
+@@ -1371,8 +1363,8 @@ int qdio_establish(struct ccw_device *cdev,
+       if (rc) {
+               DBF_ERROR("%4x est IO ERR", irq_ptr->schid.sch_no);
+               DBF_ERROR("rc:%4x", rc);
++              qdio_shutdown_irq(irq_ptr);
+               mutex_unlock(&irq_ptr->setup_mutex);
+-              qdio_shutdown(cdev, QDIO_FLAG_CLEANUP_USING_CLEAR);
+               return rc;
+       }
+diff --git a/drivers/s390/cio/qdio_setup.c b/drivers/s390/cio/qdio_setup.c
+index 3083edd61f0c9..d12f094db056e 100644
+--- a/drivers/s390/cio/qdio_setup.c
++++ b/drivers/s390/cio/qdio_setup.c
+@@ -491,6 +491,12 @@ int qdio_setup_irq(struct qdio_irq *irq_ptr, struct qdio_initialize *init_data)
+       /* qdr, qib, sls, slsbs, slibs, sbales are filled now */
++      /* set our IRQ handler */
++      spin_lock_irq(get_ccwdev_lock(cdev));
++      irq_ptr->orig_handler = cdev->handler;
++      cdev->handler = qdio_int_handler;
++      spin_unlock_irq(get_ccwdev_lock(cdev));
++
+       /* get qdio commands */
+       ciw = ccw_device_get_ciw(cdev, CIW_TYPE_EQUEUE);
+       if (!ciw) {
+@@ -506,12 +512,18 @@ int qdio_setup_irq(struct qdio_irq *irq_ptr, struct qdio_initialize *init_data)
+       }
+       irq_ptr->aqueue = *ciw;
+-      /* set new interrupt handler */
++      return 0;
++}
++
++void qdio_shutdown_irq(struct qdio_irq *irq)
++{
++      struct ccw_device *cdev = irq->cdev;
++
++      /* restore IRQ handler */
+       spin_lock_irq(get_ccwdev_lock(cdev));
+-      irq_ptr->orig_handler = cdev->handler;
+-      cdev->handler = qdio_int_handler;
++      cdev->handler = irq->orig_handler;
++      cdev->private->intparm = 0;
+       spin_unlock_irq(get_ccwdev_lock(cdev));
+-      return 0;
+ }
+ void qdio_print_subchannel_info(struct qdio_irq *irq_ptr)
+-- 
+2.25.1
+
diff --git a/queue-5.7/s390-qdio-put-thinint-indicator-after-early-error.patch b/queue-5.7/s390-qdio-put-thinint-indicator-after-early-error.patch
new file mode 100644 (file)
index 0000000..ae6520e
--- /dev/null
@@ -0,0 +1,85 @@
+From 3b347351e6b276976d4ff0437d1fcfc811fdc13a Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 9 Apr 2020 09:59:39 +0200
+Subject: s390/qdio: put thinint indicator after early error
+
+From: Julian Wiedmann <jwi@linux.ibm.com>
+
+[ Upstream commit 75e82bec6b2622c6f455b7a543fb5476a5d0eed7 ]
+
+qdio_establish() calls qdio_setup_thinint() via qdio_setup_irq().
+If the subsequent qdio_establish_thinint() fails, we miss to put the
+DSCI again. Thus the DSCI isn't available for re-use. Given enough of
+such errors, we could end up with having only the shared DSCI available.
+
+Merge qdio_setup_thinint() into qdio_establish_thinint(), and deal with
+such an error internally.
+
+Fixes: 779e6e1c724d ("[S390] qdio: new qdio driver.")
+Signed-off-by: Julian Wiedmann <jwi@linux.ibm.com>
+Reviewed-by: Benjamin Block <bblock@linux.ibm.com>
+Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/s390/cio/qdio.h         |  1 -
+ drivers/s390/cio/qdio_setup.c   |  1 -
+ drivers/s390/cio/qdio_thinint.c | 14 ++++++++------
+ 3 files changed, 8 insertions(+), 8 deletions(-)
+
+diff --git a/drivers/s390/cio/qdio.h b/drivers/s390/cio/qdio.h
+index 3cf223bc1d5f4..a2afd7bc100bb 100644
+--- a/drivers/s390/cio/qdio.h
++++ b/drivers/s390/cio/qdio.h
+@@ -364,7 +364,6 @@ static inline int multicast_outbound(struct qdio_q *q)
+ extern u64 last_ai_time;
+ /* prototypes for thin interrupt */
+-void qdio_setup_thinint(struct qdio_irq *irq_ptr);
+ int qdio_establish_thinint(struct qdio_irq *irq_ptr);
+ void qdio_shutdown_thinint(struct qdio_irq *irq_ptr);
+ void tiqdio_add_device(struct qdio_irq *irq_ptr);
+diff --git a/drivers/s390/cio/qdio_setup.c b/drivers/s390/cio/qdio_setup.c
+index d12f094db056e..8edfa0982221f 100644
+--- a/drivers/s390/cio/qdio_setup.c
++++ b/drivers/s390/cio/qdio_setup.c
+@@ -480,7 +480,6 @@ int qdio_setup_irq(struct qdio_irq *irq_ptr, struct qdio_initialize *init_data)
+       }
+       setup_qib(irq_ptr, init_data);
+-      qdio_setup_thinint(irq_ptr);
+       set_impl_params(irq_ptr, init_data->qib_param_field_format,
+                       init_data->qib_param_field,
+                       init_data->input_slib_elements,
+diff --git a/drivers/s390/cio/qdio_thinint.c b/drivers/s390/cio/qdio_thinint.c
+index ae50373617cd4..0faa0ad217326 100644
+--- a/drivers/s390/cio/qdio_thinint.c
++++ b/drivers/s390/cio/qdio_thinint.c
+@@ -227,17 +227,19 @@ int __init tiqdio_register_thinints(void)
+ int qdio_establish_thinint(struct qdio_irq *irq_ptr)
+ {
++      int rc;
++
+       if (!is_thinint_irq(irq_ptr))
+               return 0;
+-      return set_subchannel_ind(irq_ptr, 0);
+-}
+-void qdio_setup_thinint(struct qdio_irq *irq_ptr)
+-{
+-      if (!is_thinint_irq(irq_ptr))
+-              return;
+       irq_ptr->dsci = get_indicator();
+       DBF_HEX(&irq_ptr->dsci, sizeof(void *));
++
++      rc = set_subchannel_ind(irq_ptr, 0);
++      if (rc)
++              put_indicator(irq_ptr->dsci);
++
++      return rc;
+ }
+ void qdio_shutdown_thinint(struct qdio_irq *irq_ptr)
+-- 
+2.25.1
+
diff --git a/queue-5.7/s390-qdio-tear-down-thinint-indicator-after-early-er.patch b/queue-5.7/s390-qdio-tear-down-thinint-indicator-after-early-er.patch
new file mode 100644 (file)
index 0000000..e1cbd8b
--- /dev/null
@@ -0,0 +1,36 @@
+From 50f3487b4d360eade7860b8e4fc2d21b4b749145 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 9 Apr 2020 09:55:05 +0200
+Subject: s390/qdio: tear down thinint indicator after early error
+
+From: Julian Wiedmann <jwi@linux.ibm.com>
+
+[ Upstream commit 68a381746f20e5435206173e22d0a011ef78790e ]
+
+qdio_establish() calls qdio_establish_thinint(), but later has an error
+exit path that doesn't roll this call back. Fix it.
+
+Fixes: 779e6e1c724d ("[S390] qdio: new qdio driver.")
+Signed-off-by: Julian Wiedmann <jwi@linux.ibm.com>
+Reviewed-by: Benjamin Block <bblock@linux.ibm.com>
+Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/s390/cio/qdio_main.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/s390/cio/qdio_main.c b/drivers/s390/cio/qdio_main.c
+index da5a111380201..80cc811bd2e0e 100644
+--- a/drivers/s390/cio/qdio_main.c
++++ b/drivers/s390/cio/qdio_main.c
+@@ -1363,6 +1363,7 @@ int qdio_establish(struct ccw_device *cdev,
+       if (rc) {
+               DBF_ERROR("%4x est IO ERR", irq_ptr->schid.sch_no);
+               DBF_ERROR("rc:%4x", rc);
++              qdio_shutdown_thinint(irq_ptr);
+               qdio_shutdown_irq(irq_ptr);
+               mutex_unlock(&irq_ptr->setup_mutex);
+               return rc;
+-- 
+2.25.1
+
diff --git a/queue-5.7/scripts-headers_install-exit-with-error-on-config-le.patch b/queue-5.7/scripts-headers_install-exit-with-error-on-config-le.patch
new file mode 100644 (file)
index 0000000..3f8498b
--- /dev/null
@@ -0,0 +1,61 @@
+From 7274c4e5db05e7ff78c81e1f7b8cd867c456dd57 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 5 May 2020 18:52:37 -0700
+Subject: scripts: headers_install: Exit with error on config leak
+
+From: Siddharth Gupta <sidgup@codeaurora.org>
+
+[ Upstream commit 5967577231f9b19acd5a59485e9075964065bbe3 ]
+
+Misuse of CONFIG_* in UAPI headers should result in an error. These config
+options can be set in userspace by the user application which includes
+these headers to control the APIs and structures being used in a kernel
+which supports multiple targets.
+
+Signed-off-by: Siddharth Gupta <sidgup@codeaurora.org>
+Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ scripts/headers_install.sh | 11 ++++++-----
+ 1 file changed, 6 insertions(+), 5 deletions(-)
+
+diff --git a/scripts/headers_install.sh b/scripts/headers_install.sh
+index a07668a5c36b1..94a833597a884 100755
+--- a/scripts/headers_install.sh
++++ b/scripts/headers_install.sh
+@@ -64,7 +64,7 @@ configs=$(sed -e '
+       d
+ ' $OUTFILE)
+-# The entries in the following list are not warned.
++# The entries in the following list do not result in an error.
+ # Please do not add a new entry. This list is only for existing ones.
+ # The list will be reduced gradually, and deleted eventually. (hopefully)
+ #
+@@ -98,18 +98,19 @@ include/uapi/linux/raw.h:CONFIG_MAX_RAW_DEVS
+ for c in $configs
+ do
+-      warn=1
++      leak_error=1
+       for ignore in $config_leak_ignores
+       do
+               if echo "$INFILE:$c" | grep -q "$ignore$"; then
+-                      warn=
++                      leak_error=
+                       break
+               fi
+       done
+-      if [ "$warn" = 1 ]; then
+-              echo "warning: $INFILE: leak $c to user-space" >&2
++      if [ "$leak_error" = 1 ]; then
++              echo "error: $INFILE: leak $c to user-space" >&2
++              exit 1
+       fi
+ done
+-- 
+2.25.1
+
diff --git a/queue-5.7/scsi-acornscsi-fix-an-error-handling-path-in-acornsc.patch b/queue-5.7/scsi-acornscsi-fix-an-error-handling-path-in-acornsc.patch
new file mode 100644 (file)
index 0000000..298759e
--- /dev/null
@@ -0,0 +1,40 @@
+From a18f0b547a752c90d1dc6e1c4052178d913ccef4 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 30 May 2020 10:16:22 +0200
+Subject: scsi: acornscsi: Fix an error handling path in acornscsi_probe()
+
+From: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
+
+[ Upstream commit 42c76c9848e13dbe0538d7ae0147a269dfa859cb ]
+
+'ret' is known to be 0 at this point.  Explicitly return -ENOMEM if one of
+the 'ecardm_iomap()' calls fail.
+
+Link: https://lore.kernel.org/r/20200530081622.577888-1-christophe.jaillet@wanadoo.fr
+Fixes: e95a1b656a98 ("[ARM] rpc: acornscsi: update to new style ecard driver")
+Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/scsi/arm/acornscsi.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/scsi/arm/acornscsi.c b/drivers/scsi/arm/acornscsi.c
+index ddb52e7ba6226..9a912fd0f70b5 100644
+--- a/drivers/scsi/arm/acornscsi.c
++++ b/drivers/scsi/arm/acornscsi.c
+@@ -2911,8 +2911,10 @@ static int acornscsi_probe(struct expansion_card *ec, const struct ecard_id *id)
+       ashost->base = ecardm_iomap(ec, ECARD_RES_MEMC, 0, 0);
+       ashost->fast = ecardm_iomap(ec, ECARD_RES_IOCFAST, 0, 0);
+-      if (!ashost->base || !ashost->fast)
++      if (!ashost->base || !ashost->fast) {
++              ret = -ENOMEM;
+               goto out_put;
++      }
+       host->irq = ec->irq;
+       ashost->host = host;
+-- 
+2.25.1
+
diff --git a/queue-5.7/scsi-core-fix-incorrect-usage-of-shost_for_each_devi.patch b/queue-5.7/scsi-core-fix-incorrect-usage-of-shost_for_each_devi.patch
new file mode 100644 (file)
index 0000000..9f62a6c
--- /dev/null
@@ -0,0 +1,67 @@
+From 82bdcaaf273dc8e6c25dae3521d9cbf869bddb7b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 18 May 2020 15:44:20 +0800
+Subject: scsi: core: Fix incorrect usage of shost_for_each_device
+
+From: Ye Bin <yebin10@huawei.com>
+
+[ Upstream commit 4dea170f4fb225984b4f2f1cf0a41d485177b905 ]
+
+shost_for_each_device(sdev, shost) \
+       for ((sdev) = __scsi_iterate_devices((shost), NULL); \
+            (sdev); \
+            (sdev) = __scsi_iterate_devices((shost), (sdev)))
+
+When terminating shost_for_each_device() iteration with break or return,
+scsi_device_put() should be used to prevent stale scsi device references
+from being left behind.
+
+Link: https://lore.kernel.org/r/20200518074420.39275-1-yebin10@huawei.com
+Reviewed-by: Bart Van Assche <bvanassche@acm.org>
+Signed-off-by: Ye Bin <yebin10@huawei.com>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/scsi/scsi_error.c | 2 ++
+ drivers/scsi/scsi_lib.c   | 4 +++-
+ 2 files changed, 5 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c
+index 978be1602f718..927b1e6418423 100644
+--- a/drivers/scsi/scsi_error.c
++++ b/drivers/scsi/scsi_error.c
+@@ -1412,6 +1412,7 @@ static int scsi_eh_stu(struct Scsi_Host *shost,
+                               sdev_printk(KERN_INFO, sdev,
+                                           "%s: skip START_UNIT, past eh deadline\n",
+                                           current->comm));
++                      scsi_device_put(sdev);
+                       break;
+               }
+               stu_scmd = NULL;
+@@ -1478,6 +1479,7 @@ static int scsi_eh_bus_device_reset(struct Scsi_Host *shost,
+                               sdev_printk(KERN_INFO, sdev,
+                                           "%s: skip BDR, past eh deadline\n",
+                                            current->comm));
++                      scsi_device_put(sdev);
+                       break;
+               }
+               bdr_scmd = NULL;
+diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
+index 3ecdae18597d1..b8b4366f12001 100644
+--- a/drivers/scsi/scsi_lib.c
++++ b/drivers/scsi/scsi_lib.c
+@@ -2865,8 +2865,10 @@ scsi_host_unblock(struct Scsi_Host *shost, int new_state)
+       shost_for_each_device(sdev, shost) {
+               ret = scsi_internal_device_unblock(sdev, new_state);
+-              if (ret)
++              if (ret) {
++                      scsi_device_put(sdev);
+                       break;
++              }
+       }
+       return ret;
+ }
+-- 
+2.25.1
+
diff --git a/queue-5.7/scsi-core-free-sgtables-in-case-command-setup-fails.patch b/queue-5.7/scsi-core-free-sgtables-in-case-command-setup-fails.patch
new file mode 100644 (file)
index 0000000..37cb999
--- /dev/null
@@ -0,0 +1,95 @@
+From 9d41c76d699f8811c134da2da3a075cd47cb3951 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 28 Apr 2020 19:45:55 +0900
+Subject: scsi: core: free sgtables in case command setup fails
+
+From: Johannes Thumshirn <johannes.thumshirn@wdc.com>
+
+[ Upstream commit 20a66f2bf280277ab5bb22e27445153b4eb0ac88 ]
+
+In case scsi_setup_fs_cmnd() fails we're not freeing the sgtables allocated
+by scsi_init_io(), thus we leak the allocated memory.
+
+Free the sgtables allocated by scsi_init_io() in case scsi_setup_fs_cmnd()
+fails.
+
+Technically scsi_setup_scsi_cmnd() does not suffer from this problem as it
+can only fail if scsi_init_io() fails, so it does not have sgtables
+allocated. But to maintain symmetry and as a measure of defensive
+programming, free the sgtables on scsi_setup_scsi_cmnd() failure as well.
+scsi_mq_free_sgtables() has safeguards against double-freeing of memory so
+this is safe to do.
+
+While we're at it, rename scsi_mq_free_sgtables() to scsi_free_sgtables().
+
+Link: https://bugzilla.kernel.org/show_bug.cgi?id=205595
+Link: https://lore.kernel.org/r/20200428104605.8143-2-johannes.thumshirn@wdc.com
+Reviewed-by: Christoph Hellwig <hch@lst.de>
+Reviewed-by: Daniel Wagner <dwagner@suse.de>
+Reviewed-by: Hannes Reinecke <hare@suse.de>
+Signed-off-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/scsi/scsi_lib.c | 16 +++++++++++-----
+ 1 file changed, 11 insertions(+), 5 deletions(-)
+
+diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
+index 06c260f6cdae3..3ecdae18597d1 100644
+--- a/drivers/scsi/scsi_lib.c
++++ b/drivers/scsi/scsi_lib.c
+@@ -548,7 +548,7 @@ static void scsi_uninit_cmd(struct scsi_cmnd *cmd)
+       }
+ }
+-static void scsi_mq_free_sgtables(struct scsi_cmnd *cmd)
++static void scsi_free_sgtables(struct scsi_cmnd *cmd)
+ {
+       if (cmd->sdb.table.nents)
+               sg_free_table_chained(&cmd->sdb.table,
+@@ -560,7 +560,7 @@ static void scsi_mq_free_sgtables(struct scsi_cmnd *cmd)
+ static void scsi_mq_uninit_cmd(struct scsi_cmnd *cmd)
+ {
+-      scsi_mq_free_sgtables(cmd);
++      scsi_free_sgtables(cmd);
+       scsi_uninit_cmd(cmd);
+ }
+@@ -1059,7 +1059,7 @@ blk_status_t scsi_init_io(struct scsi_cmnd *cmd)
+       return BLK_STS_OK;
+ out_free_sgtables:
+-      scsi_mq_free_sgtables(cmd);
++      scsi_free_sgtables(cmd);
+       return ret;
+ }
+ EXPORT_SYMBOL(scsi_init_io);
+@@ -1190,6 +1190,7 @@ static blk_status_t scsi_setup_cmnd(struct scsi_device *sdev,
+               struct request *req)
+ {
+       struct scsi_cmnd *cmd = blk_mq_rq_to_pdu(req);
++      blk_status_t ret;
+       if (!blk_rq_bytes(req))
+               cmd->sc_data_direction = DMA_NONE;
+@@ -1199,9 +1200,14 @@ static blk_status_t scsi_setup_cmnd(struct scsi_device *sdev,
+               cmd->sc_data_direction = DMA_FROM_DEVICE;
+       if (blk_rq_is_scsi(req))
+-              return scsi_setup_scsi_cmnd(sdev, req);
++              ret = scsi_setup_scsi_cmnd(sdev, req);
+       else
+-              return scsi_setup_fs_cmnd(sdev, req);
++              ret = scsi_setup_fs_cmnd(sdev, req);
++
++      if (ret != BLK_STS_OK)
++              scsi_free_sgtables(cmd);
++
++      return ret;
+ }
+ static blk_status_t
+-- 
+2.25.1
+
diff --git a/queue-5.7/scsi-cxgb3i-fix-some-leaks-in-init_act_open.patch b/queue-5.7/scsi-cxgb3i-fix-some-leaks-in-init_act_open.patch
new file mode 100644 (file)
index 0000000..a872bb0
--- /dev/null
@@ -0,0 +1,73 @@
+From d5d0415565f46e6a61eec1fee10f4e5f26dd9d1e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 21 May 2020 15:12:21 +0300
+Subject: scsi: cxgb3i: Fix some leaks in init_act_open()
+
+From: Dan Carpenter <dan.carpenter@oracle.com>
+
+[ Upstream commit b6170a49c59c27a10efed26c5a2969403e69aaba ]
+
+There wasn't any clean up done if cxgb3_alloc_atid() failed and also the
+original code didn't release "csk->l2t".
+
+Link: https://lore.kernel.org/r/20200521121221.GA247492@mwanda
+Fixes: 6f7efaabefeb ("[SCSI] cxgb3i: change cxgb3i to use libcxgbi")
+Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/scsi/cxgbi/cxgb3i/cxgb3i.c | 18 ++++++++++++++----
+ 1 file changed, 14 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/scsi/cxgbi/cxgb3i/cxgb3i.c b/drivers/scsi/cxgbi/cxgb3i/cxgb3i.c
+index 524cdbcd29aa4..ec7d01f6e2d58 100644
+--- a/drivers/scsi/cxgbi/cxgb3i/cxgb3i.c
++++ b/drivers/scsi/cxgbi/cxgb3i/cxgb3i.c
+@@ -959,6 +959,7 @@ static int init_act_open(struct cxgbi_sock *csk)
+       struct net_device *ndev = cdev->ports[csk->port_id];
+       struct cxgbi_hba *chba = cdev->hbas[csk->port_id];
+       struct sk_buff *skb = NULL;
++      int ret;
+       log_debug(1 << CXGBI_DBG_TOE | 1 << CXGBI_DBG_SOCK,
+               "csk 0x%p,%u,0x%lx.\n", csk, csk->state, csk->flags);
+@@ -979,16 +980,16 @@ static int init_act_open(struct cxgbi_sock *csk)
+       csk->atid = cxgb3_alloc_atid(t3dev, &t3_client, csk);
+       if (csk->atid < 0) {
+               pr_err("NO atid available.\n");
+-              return -EINVAL;
++              ret = -EINVAL;
++              goto put_sock;
+       }
+       cxgbi_sock_set_flag(csk, CTPF_HAS_ATID);
+       cxgbi_sock_get(csk);
+       skb = alloc_wr(sizeof(struct cpl_act_open_req), 0, GFP_KERNEL);
+       if (!skb) {
+-              cxgb3_free_atid(t3dev, csk->atid);
+-              cxgbi_sock_put(csk);
+-              return -ENOMEM;
++              ret = -ENOMEM;
++              goto free_atid;
+       }
+       skb->sk = (struct sock *)csk;
+       set_arp_failure_handler(skb, act_open_arp_failure);
+@@ -1010,6 +1011,15 @@ static int init_act_open(struct cxgbi_sock *csk)
+       cxgbi_sock_set_state(csk, CTP_ACTIVE_OPEN);
+       send_act_open_req(csk, skb, csk->l2t);
+       return 0;
++
++free_atid:
++      cxgb3_free_atid(t3dev, csk->atid);
++put_sock:
++      cxgbi_sock_put(csk);
++      l2t_release(t3dev, csk->l2t);
++      csk->l2t = NULL;
++
++      return ret;
+ }
+ cxgb3_cpl_handler_func cxgb3i_cpl_handlers[NUM_CPL_CMDS] = {
+-- 
+2.25.1
+
diff --git a/queue-5.7/scsi-hisi_sas-do-not-reset-phy-timer-to-wait-for-str.patch b/queue-5.7/scsi-hisi_sas-do-not-reset-phy-timer-to-wait-for-str.patch
new file mode 100644 (file)
index 0000000..743bb05
--- /dev/null
@@ -0,0 +1,47 @@
+From e67844bb5fe869868ec26f6930e5b877f9f243f5 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 15 May 2020 22:13:42 +0800
+Subject: scsi: hisi_sas: Do not reset phy timer to wait for stray phy up
+
+From: Luo Jiaxing <luojiaxing@huawei.com>
+
+[ Upstream commit e16b9ed61e078d836a0f24a82080cf29d7539c7e ]
+
+We found out that after phy up, the hardware reports another oob interrupt
+but did not follow a phy up interrupt:
+
+oob ready -> phy up -> DEV found -> oob read -> wait phy up -> timeout
+
+We run link reset when wait phy up timeout, and it send a normal disk into
+reset processing. So we made some circumvention action in the code, so that
+this abnormal oob interrupt will not start the timer to wait for phy up.
+
+Link: https://lore.kernel.org/r/1589552025-165012-2-git-send-email-john.garry@huawei.com
+Signed-off-by: Luo Jiaxing <luojiaxing@huawei.com>
+Signed-off-by: John Garry <john.garry@huawei.com>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/scsi/hisi_sas/hisi_sas_main.c | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/scsi/hisi_sas/hisi_sas_main.c b/drivers/scsi/hisi_sas/hisi_sas_main.c
+index 9a6deb21fe4df..11caa4b0d7977 100644
+--- a/drivers/scsi/hisi_sas/hisi_sas_main.c
++++ b/drivers/scsi/hisi_sas/hisi_sas_main.c
+@@ -898,8 +898,11 @@ void hisi_sas_phy_oob_ready(struct hisi_hba *hisi_hba, int phy_no)
+       struct hisi_sas_phy *phy = &hisi_hba->phy[phy_no];
+       struct device *dev = hisi_hba->dev;
++      dev_dbg(dev, "phy%d OOB ready\n", phy_no);
++      if (phy->phy_attached)
++              return;
++
+       if (!timer_pending(&phy->timer)) {
+-              dev_dbg(dev, "phy%d OOB ready\n", phy_no);
+               phy->timer.expires = jiffies + HISI_SAS_WAIT_PHYUP_TIMEOUT * HZ;
+               add_timer(&phy->timer);
+       }
+-- 
+2.25.1
+
diff --git a/queue-5.7/scsi-ibmvscsi-don-t-send-host-info-in-adapter-info-m.patch b/queue-5.7/scsi-ibmvscsi-don-t-send-host-info-in-adapter-info-m.patch
new file mode 100644 (file)
index 0000000..7b44c2d
--- /dev/null
@@ -0,0 +1,46 @@
+From 6a55987e9276f182690ccf34f19c1615baab9839 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 3 Jun 2020 15:36:32 -0500
+Subject: scsi: ibmvscsi: Don't send host info in adapter info MAD after LPM
+
+From: Tyrel Datwyler <tyreld@linux.ibm.com>
+
+[ Upstream commit 4919b33b63c8b69d8dcf2b867431d0e3b6dc6d28 ]
+
+The adapter info MAD is used to send the client info and receive the host
+info as a response. A persistent buffer is used and as such the client info
+is overwritten after the response. During the course of a normal adapter
+reset the client info is refreshed in the buffer in preparation for sending
+the adapter info MAD.
+
+However, in the special case of LPM where we reenable the CRQ instead of a
+full CRQ teardown and reset we fail to refresh the client info in the
+adapter info buffer. As a result, after Live Partition Migration (LPM) we
+erroneously report the host's info as our own.
+
+[mkp: typos]
+
+Link: https://lore.kernel.org/r/20200603203632.18426-1-tyreld@linux.ibm.com
+Signed-off-by: Tyrel Datwyler <tyreld@linux.ibm.com>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/scsi/ibmvscsi/ibmvscsi.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/drivers/scsi/ibmvscsi/ibmvscsi.c b/drivers/scsi/ibmvscsi/ibmvscsi.c
+index 59f0f1030c54a..c5711c659b517 100644
+--- a/drivers/scsi/ibmvscsi/ibmvscsi.c
++++ b/drivers/scsi/ibmvscsi/ibmvscsi.c
+@@ -415,6 +415,8 @@ static int ibmvscsi_reenable_crq_queue(struct crq_queue *queue,
+       int rc = 0;
+       struct vio_dev *vdev = to_vio_dev(hostdata->dev);
++      set_adapter_info(hostdata);
++
+       /* Re-enable the CRQ */
+       do {
+               if (rc)
+-- 
+2.25.1
+
diff --git a/queue-5.7/scsi-iscsi-fix-deadlock-on-recovery-path-during-gfp_.patch b/queue-5.7/scsi-iscsi-fix-deadlock-on-recovery-path-during-gfp_.patch
new file mode 100644 (file)
index 0000000..2771a2a
--- /dev/null
@@ -0,0 +1,275 @@
+From 10823257bcb8f9419252174abe72b02e552066a2 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 19 May 2020 22:29:59 -0400
+Subject: scsi: iscsi: Fix deadlock on recovery path during GFP_IO reclaim
+
+From: Gabriel Krisman Bertazi <krisman@collabora.com>
+
+[ Upstream commit 7e7cd796f2776d055351d80328f45633bbb0aae5 ]
+
+iSCSI suffers from a deadlock in case a management command submitted via
+the netlink socket sleeps on an allocation while holding the rx_queue_mutex
+if that allocation causes a memory reclaim that writebacks to a failed
+iSCSI device.  The recovery procedure can never make progress to recover
+the failed disk or abort outstanding IO operations to complete the reclaim
+(since rx_queue_mutex is locked), thus locking the system.
+
+Nevertheless, just marking all allocations under rx_queue_mutex as GFP_NOIO
+(or locking the userspace process with something like PF_MEMALLOC_NOIO) is
+not enough, since the iSCSI command code relies on other subsystems that
+try to grab locked mutexes, whose threads are GFP_IO, leading to the same
+deadlock. One instance where this situation can be observed is in the
+backtraces below, stitched from multiple bugs reports, involving the kobj
+uevent sent when a session is created.
+
+The root of the problem is not the fact that iSCSI does GFP_IO allocations,
+that is acceptable. The actual problem is that rx_queue_mutex has a very
+large granularity, covering every unrelated netlink command execution at
+the same time as the error recovery path.
+
+The proposed fix leverages the recently added mechanism to stop failed
+connections from the kernel, by enabling it to execute even though a
+management command from the netlink socket is being run (rx_queue_mutex is
+held), provided that the command is known to be safe.  It splits the
+rx_queue_mutex in two mutexes, one protecting from concurrent command
+execution from the netlink socket, and one protecting stop_conn from racing
+with other connection management operations that might conflict with it.
+
+It is not very pretty, but it is the simplest way to resolve the deadlock.
+I considered making it a lock per connection, but some external mutex would
+still be needed to deal with iscsi_if_destroy_conn.
+
+The patch was tested by forcing a memory shrinker (unrelated, but used
+bufio/dm-verity) to reclaim iSCSI pages every time
+ISCSI_UEVENT_CREATE_SESSION happens, which is reasonable to simulate
+reclaims that might happen with GFP_KERNEL on that path.  Then, a faulty
+hung target causes a connection to fail during intensive IO, at the same
+time a new session is added by iscsid.
+
+The following stacktraces are stiches from several bug reports, showing a
+case where the deadlock can happen.
+
+ iSCSI-write
+         holding: rx_queue_mutex
+         waiting: uevent_sock_mutex
+
+         kobject_uevent_env+0x1bd/0x419
+         kobject_uevent+0xb/0xd
+         device_add+0x48a/0x678
+         scsi_add_host_with_dma+0xc5/0x22d
+         iscsi_host_add+0x53/0x55
+         iscsi_sw_tcp_session_create+0xa6/0x129
+         iscsi_if_rx+0x100/0x1247
+         netlink_unicast+0x213/0x4f0
+         netlink_sendmsg+0x230/0x3c0
+
+ iscsi_fail iscsi_conn_failure
+         waiting: rx_queue_mutex
+
+         schedule_preempt_disabled+0x325/0x734
+         __mutex_lock_slowpath+0x18b/0x230
+         mutex_lock+0x22/0x40
+         iscsi_conn_failure+0x42/0x149
+         worker_thread+0x24a/0xbc0
+
+ EventManager_
+         holding: uevent_sock_mutex
+         waiting: dm_bufio_client->lock
+
+         dm_bufio_lock+0xe/0x10
+         shrink+0x34/0xf7
+         shrink_slab+0x177/0x5d0
+         do_try_to_free_pages+0x129/0x470
+         try_to_free_mem_cgroup_pages+0x14f/0x210
+         memcg_kmem_newpage_charge+0xa6d/0x13b0
+         __alloc_pages_nodemask+0x4a3/0x1a70
+         fallback_alloc+0x1b2/0x36c
+         __kmalloc_node_track_caller+0xb9/0x10d0
+         __alloc_skb+0x83/0x2f0
+         kobject_uevent_env+0x26b/0x419
+         dm_kobject_uevent+0x70/0x79
+         dev_suspend+0x1a9/0x1e7
+         ctl_ioctl+0x3e9/0x411
+         dm_ctl_ioctl+0x13/0x17
+         do_vfs_ioctl+0xb3/0x460
+         SyS_ioctl+0x5e/0x90
+
+ MemcgReclaimerD"
+         holding: dm_bufio_client->lock
+         waiting: stuck io to finish (needs iscsi_fail thread to progress)
+
+         schedule at ffffffffbd603618
+         io_schedule at ffffffffbd603ba4
+         do_io_schedule at ffffffffbdaf0d94
+         __wait_on_bit at ffffffffbd6008a6
+         out_of_line_wait_on_bit at ffffffffbd600960
+         wait_on_bit.constprop.10 at ffffffffbdaf0f17
+         __make_buffer_clean at ffffffffbdaf18ba
+         __cleanup_old_buffer at ffffffffbdaf192f
+         shrink at ffffffffbdaf19fd
+         do_shrink_slab at ffffffffbd6ec000
+         shrink_slab at ffffffffbd6ec24a
+         do_try_to_free_pages at ffffffffbd6eda09
+         try_to_free_mem_cgroup_pages at ffffffffbd6ede7e
+         mem_cgroup_resize_limit at ffffffffbd7024c0
+         mem_cgroup_write at ffffffffbd703149
+         cgroup_file_write at ffffffffbd6d9c6e
+         sys_write at ffffffffbd6662ea
+         system_call_fastpath at ffffffffbdbc34a2
+
+Link: https://lore.kernel.org/r/20200520022959.1912856-1-krisman@collabora.com
+Reported-by: Khazhismel Kumykov <khazhy@google.com>
+Reviewed-by: Lee Duncan <lduncan@suse.com>
+Signed-off-by: Gabriel Krisman Bertazi <krisman@collabora.com>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/scsi/scsi_transport_iscsi.c | 64 +++++++++++++++++++++--------
+ 1 file changed, 47 insertions(+), 17 deletions(-)
+
+diff --git a/drivers/scsi/scsi_transport_iscsi.c b/drivers/scsi/scsi_transport_iscsi.c
+index b2a803c512881..ea6d498fa9232 100644
+--- a/drivers/scsi/scsi_transport_iscsi.c
++++ b/drivers/scsi/scsi_transport_iscsi.c
+@@ -1616,6 +1616,12 @@ static DECLARE_TRANSPORT_CLASS(iscsi_connection_class,
+ static struct sock *nls;
+ static DEFINE_MUTEX(rx_queue_mutex);
++/*
++ * conn_mutex protects the {start,bind,stop,destroy}_conn from racing
++ * against the kernel stop_connection recovery mechanism
++ */
++static DEFINE_MUTEX(conn_mutex);
++
+ static LIST_HEAD(sesslist);
+ static LIST_HEAD(sessdestroylist);
+ static DEFINE_SPINLOCK(sesslock);
+@@ -2445,6 +2451,32 @@ int iscsi_offload_mesg(struct Scsi_Host *shost,
+ }
+ EXPORT_SYMBOL_GPL(iscsi_offload_mesg);
++/*
++ * This can be called without the rx_queue_mutex, if invoked by the kernel
++ * stop work. But, in that case, it is guaranteed not to race with
++ * iscsi_destroy by conn_mutex.
++ */
++static void iscsi_if_stop_conn(struct iscsi_cls_conn *conn, int flag)
++{
++      /*
++       * It is important that this path doesn't rely on
++       * rx_queue_mutex, otherwise, a thread doing allocation on a
++       * start_session/start_connection could sleep waiting on a
++       * writeback to a failed iscsi device, that cannot be recovered
++       * because the lock is held.  If we don't hold it here, the
++       * kernel stop_conn_work_fn has a chance to stop the broken
++       * session and resolve the allocation.
++       *
++       * Still, the user invoked .stop_conn() needs to be serialized
++       * with stop_conn_work_fn by a private mutex.  Not pretty, but
++       * it works.
++       */
++      mutex_lock(&conn_mutex);
++      conn->transport->stop_conn(conn, flag);
++      mutex_unlock(&conn_mutex);
++
++}
++
+ static void stop_conn_work_fn(struct work_struct *work)
+ {
+       struct iscsi_cls_conn *conn, *tmp;
+@@ -2463,30 +2495,17 @@ static void stop_conn_work_fn(struct work_struct *work)
+               uint32_t sid = iscsi_conn_get_sid(conn);
+               struct iscsi_cls_session *session;
+-              mutex_lock(&rx_queue_mutex);
+-
+               session = iscsi_session_lookup(sid);
+               if (session) {
+                       if (system_state != SYSTEM_RUNNING) {
+                               session->recovery_tmo = 0;
+-                              conn->transport->stop_conn(conn,
+-                                                         STOP_CONN_TERM);
++                              iscsi_if_stop_conn(conn, STOP_CONN_TERM);
+                       } else {
+-                              conn->transport->stop_conn(conn,
+-                                                         STOP_CONN_RECOVER);
++                              iscsi_if_stop_conn(conn, STOP_CONN_RECOVER);
+                       }
+               }
+               list_del_init(&conn->conn_list_err);
+-
+-              mutex_unlock(&rx_queue_mutex);
+-
+-              /* we don't want to hold rx_queue_mutex for too long,
+-               * for instance if many conns failed at the same time,
+-               * since this stall other iscsi maintenance operations.
+-               * Give other users a chance to proceed.
+-               */
+-              cond_resched();
+       }
+ }
+@@ -2846,8 +2865,11 @@ iscsi_if_destroy_conn(struct iscsi_transport *transport, struct iscsi_uevent *ev
+       spin_unlock_irqrestore(&connlock, flags);
+       ISCSI_DBG_TRANS_CONN(conn, "Destroying transport conn\n");
++
++      mutex_lock(&conn_mutex);
+       if (transport->destroy_conn)
+               transport->destroy_conn(conn);
++      mutex_unlock(&conn_mutex);
+       return 0;
+ }
+@@ -3689,9 +3711,12 @@ iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh, uint32_t *group)
+                       break;
+               }
++              mutex_lock(&conn_mutex);
+               ev->r.retcode = transport->bind_conn(session, conn,
+                                               ev->u.b_conn.transport_eph,
+                                               ev->u.b_conn.is_leading);
++              mutex_unlock(&conn_mutex);
++
+               if (ev->r.retcode || !transport->ep_connect)
+                       break;
+@@ -3713,9 +3738,11 @@ iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh, uint32_t *group)
+       case ISCSI_UEVENT_START_CONN:
+               conn = iscsi_conn_lookup(ev->u.start_conn.sid, ev->u.start_conn.cid);
+               if (conn) {
++                      mutex_lock(&conn_mutex);
+                       ev->r.retcode = transport->start_conn(conn);
+                       if (!ev->r.retcode)
+                               conn->state = ISCSI_CONN_UP;
++                      mutex_unlock(&conn_mutex);
+               }
+               else
+                       err = -EINVAL;
+@@ -3723,17 +3750,20 @@ iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh, uint32_t *group)
+       case ISCSI_UEVENT_STOP_CONN:
+               conn = iscsi_conn_lookup(ev->u.stop_conn.sid, ev->u.stop_conn.cid);
+               if (conn)
+-                      transport->stop_conn(conn, ev->u.stop_conn.flag);
++                      iscsi_if_stop_conn(conn, ev->u.stop_conn.flag);
+               else
+                       err = -EINVAL;
+               break;
+       case ISCSI_UEVENT_SEND_PDU:
+               conn = iscsi_conn_lookup(ev->u.send_pdu.sid, ev->u.send_pdu.cid);
+-              if (conn)
++              if (conn) {
++                      mutex_lock(&conn_mutex);
+                       ev->r.retcode = transport->send_pdu(conn,
+                               (struct iscsi_hdr*)((char*)ev + sizeof(*ev)),
+                               (char*)ev + sizeof(*ev) + ev->u.send_pdu.hdr_size,
+                               ev->u.send_pdu.data_size);
++                      mutex_unlock(&conn_mutex);
++              }
+               else
+                       err = -EINVAL;
+               break;
+-- 
+2.25.1
+
diff --git a/queue-5.7/scsi-iscsi-fix-reference-count-leak-in-iscsi_boot_cr.patch b/queue-5.7/scsi-iscsi-fix-reference-count-leak-in-iscsi_boot_cr.patch
new file mode 100644 (file)
index 0000000..04612e7
--- /dev/null
@@ -0,0 +1,38 @@
+From 4a918cf85556581d0ab3f48a9721ff7251e4916c Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 28 May 2020 15:13:53 -0500
+Subject: scsi: iscsi: Fix reference count leak in iscsi_boot_create_kobj
+
+From: Qiushi Wu <wu000273@umn.edu>
+
+[ Upstream commit 0267ffce562c8bbf9b57ebe0e38445ad04972890 ]
+
+kobject_init_and_add() takes reference even when it fails. If this
+function returns an error, kobject_put() must be called to properly
+clean up the memory associated with the object.
+
+Link: https://lore.kernel.org/r/20200528201353.14849-1-wu000273@umn.edu
+Reviewed-by: Lee Duncan <lduncan@suse.com>
+Signed-off-by: Qiushi Wu <wu000273@umn.edu>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/scsi/iscsi_boot_sysfs.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/scsi/iscsi_boot_sysfs.c b/drivers/scsi/iscsi_boot_sysfs.c
+index e4857b7280338..a64abe38db2d4 100644
+--- a/drivers/scsi/iscsi_boot_sysfs.c
++++ b/drivers/scsi/iscsi_boot_sysfs.c
+@@ -352,7 +352,7 @@ iscsi_boot_create_kobj(struct iscsi_boot_kset *boot_kset,
+       boot_kobj->kobj.kset = boot_kset->kset;
+       if (kobject_init_and_add(&boot_kobj->kobj, &iscsi_boot_ktype,
+                                NULL, name, index)) {
+-              kfree(boot_kobj);
++              kobject_put(&boot_kobj->kobj);
+               return NULL;
+       }
+       boot_kobj->data = data;
+-- 
+2.25.1
+
diff --git a/queue-5.7/scsi-lpfc-fix-lpfc_nodelist-leak-when-processing-uns.patch b/queue-5.7/scsi-lpfc-fix-lpfc_nodelist-leak-when-processing-uns.patch
new file mode 100644 (file)
index 0000000..3c8eb24
--- /dev/null
@@ -0,0 +1,51 @@
+From cad10e5e5d03dc2c9ab178c83e9b8c0af45fa0ce Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 25 May 2020 22:16:24 +0800
+Subject: scsi: lpfc: Fix lpfc_nodelist leak when processing unsolicited event
+
+From: Xiyu Yang <xiyuyang19@fudan.edu.cn>
+
+[ Upstream commit 7217e6e694da3aae6d17db8a7f7460c8d4817ebf ]
+
+In order to create or activate a new node, lpfc_els_unsol_buffer() invokes
+lpfc_nlp_init() or lpfc_enable_node() or lpfc_nlp_get(), all of them will
+return a reference of the specified lpfc_nodelist object to "ndlp" with
+increased refcnt.
+
+When lpfc_els_unsol_buffer() returns, local variable "ndlp" becomes
+invalid, so the refcount should be decreased to keep refcount balanced.
+
+The reference counting issue happens in one exception handling path of
+lpfc_els_unsol_buffer(). When "ndlp" in DEV_LOSS, the function forgets to
+decrease the refcnt increased by lpfc_nlp_init() or lpfc_enable_node() or
+lpfc_nlp_get(), causing a refcnt leak.
+
+Fix this issue by calling lpfc_nlp_put() when "ndlp" in DEV_LOSS.
+
+Link: https://lore.kernel.org/r/1590416184-52592-1-git-send-email-xiyuyang19@fudan.edu.cn
+Reviewed-by: Daniel Wagner <dwagner@suse.de>
+Reviewed-by: James Smart <james.smart@broadcom.com>
+Signed-off-by: Xiyu Yang <xiyuyang19@fudan.edu.cn>
+Signed-off-by: Xin Tan <tanxin.ctf@gmail.com>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/scsi/lpfc/lpfc_els.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/drivers/scsi/lpfc/lpfc_els.c b/drivers/scsi/lpfc/lpfc_els.c
+index 80d1e661b0d4e..35fbcb4d52eb5 100644
+--- a/drivers/scsi/lpfc/lpfc_els.c
++++ b/drivers/scsi/lpfc/lpfc_els.c
+@@ -8514,6 +8514,8 @@ lpfc_els_unsol_buffer(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
+       spin_lock_irq(shost->host_lock);
+       if (ndlp->nlp_flag & NLP_IN_DEV_LOSS) {
+               spin_unlock_irq(shost->host_lock);
++              if (newnode)
++                      lpfc_nlp_put(ndlp);
+               goto dropit;
+       }
+       spin_unlock_irq(shost->host_lock);
+-- 
+2.25.1
+
diff --git a/queue-5.7/scsi-mpt3sas-fix-double-free-warnings.patch b/queue-5.7/scsi-mpt3sas-fix-double-free-warnings.patch
new file mode 100644 (file)
index 0000000..c4eba0c
--- /dev/null
@@ -0,0 +1,43 @@
+From fe3658705bce8fe6ac104936bd8b188500b6aa96 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 8 May 2020 07:07:38 -0400
+Subject: scsi: mpt3sas: Fix double free warnings
+
+From: Suganath Prabu S <suganath-prabu.subramani@broadcom.com>
+
+[ Upstream commit cbbfdb2a2416c9f0cde913cf09670097ac281282 ]
+
+Fix following warning from Smatch static analyser:
+
+drivers/scsi/mpt3sas/mpt3sas_base.c:5256 _base_allocate_memory_pools()
+warn: 'ioc->hpr_lookup' double freed
+
+drivers/scsi/mpt3sas/mpt3sas_base.c:5256 _base_allocate_memory_pools()
+warn: 'ioc->internal_lookup' double freed
+
+Link: https://lore.kernel.org/r/20200508110738.30732-1-suganath-prabu.subramani@broadcom.com
+Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
+Signed-off-by: Suganath Prabu S <suganath-prabu.subramani@broadcom.com>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/scsi/mpt3sas/mpt3sas_base.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/drivers/scsi/mpt3sas/mpt3sas_base.c b/drivers/scsi/mpt3sas/mpt3sas_base.c
+index 663782bb790dc..39d233262039e 100644
+--- a/drivers/scsi/mpt3sas/mpt3sas_base.c
++++ b/drivers/scsi/mpt3sas/mpt3sas_base.c
+@@ -4915,7 +4915,9 @@ _base_release_memory_pools(struct MPT3SAS_ADAPTER *ioc)
+       }
+       kfree(ioc->hpr_lookup);
++      ioc->hpr_lookup = NULL;
+       kfree(ioc->internal_lookup);
++      ioc->internal_lookup = NULL;
+       if (ioc->chain_lookup) {
+               for (i = 0; i < ioc->scsiio_depth; i++) {
+                       for (j = ioc->chains_per_prp_buffer;
+-- 
+2.25.1
+
diff --git a/queue-5.7/scsi-qedf-fix-crash-when-mfw-calls-for-protocol-stat.patch b/queue-5.7/scsi-qedf-fix-crash-when-mfw-calls-for-protocol-stat.patch
new file mode 100644 (file)
index 0000000..eb3db3a
--- /dev/null
@@ -0,0 +1,131 @@
+From dc7d50e6d03a209426555e05f65e68cfdd746078 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 16 Apr 2020 01:43:13 -0700
+Subject: scsi: qedf: Fix crash when MFW calls for protocol stats while
+ function is still probing
+
+From: Chad Dupuis <cdupuis@marvell.com>
+
+[ Upstream commit ad40f5256095c68dc17c991eb976261d5ea2daaa ]
+
+The MFW may make a call to qed and then to qedf for protocol statistics
+while the function is still probing.  If this happens it's possible that
+some members of the struct qedf_ctx may not be fully initialized which can
+result in a NULL pointer dereference or general protection fault.
+
+To prevent this, add a new flag call QEDF_PROBING and set it when the
+__qedf_probe() function is active. Then in the qedf_get_protocol_tlv_data()
+function we can check if the function is still probing and return
+immediantely before any uninitialized structures can be touched.
+
+Link: https://lore.kernel.org/r/20200416084314.18851-9-skashyap@marvell.com
+Signed-off-by: Chad Dupuis <cdupuis@marvell.com>
+Signed-off-by: Saurav Kashyap <skashyap@marvell.com>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/scsi/qedf/qedf.h      |  1 +
+ drivers/scsi/qedf/qedf_main.c | 35 +++++++++++++++++++++++++++++++----
+ 2 files changed, 32 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/scsi/qedf/qedf.h b/drivers/scsi/qedf/qedf.h
+index f3f399fe10c86..0da4e16fb23a6 100644
+--- a/drivers/scsi/qedf/qedf.h
++++ b/drivers/scsi/qedf/qedf.h
+@@ -355,6 +355,7 @@ struct qedf_ctx {
+ #define QEDF_GRCDUMP_CAPTURE          4
+ #define QEDF_IN_RECOVERY              5
+ #define QEDF_DBG_STOP_IO              6
++#define QEDF_PROBING                  8
+       unsigned long flags; /* Miscellaneous state flags */
+       int fipvlan_retries;
+       u8 num_queues;
+diff --git a/drivers/scsi/qedf/qedf_main.c b/drivers/scsi/qedf/qedf_main.c
+index 5b19f5175c5cd..3a7d034729228 100644
+--- a/drivers/scsi/qedf/qedf_main.c
++++ b/drivers/scsi/qedf/qedf_main.c
+@@ -3153,7 +3153,7 @@ static int __qedf_probe(struct pci_dev *pdev, int mode)
+ {
+       int rc = -EINVAL;
+       struct fc_lport *lport;
+-      struct qedf_ctx *qedf;
++      struct qedf_ctx *qedf = NULL;
+       struct Scsi_Host *host;
+       bool is_vf = false;
+       struct qed_ll2_params params;
+@@ -3183,6 +3183,7 @@ static int __qedf_probe(struct pci_dev *pdev, int mode)
+               /* Initialize qedf_ctx */
+               qedf = lport_priv(lport);
++              set_bit(QEDF_PROBING, &qedf->flags);
+               qedf->lport = lport;
+               qedf->ctlr.lp = lport;
+               qedf->pdev = pdev;
+@@ -3206,9 +3207,12 @@ static int __qedf_probe(struct pci_dev *pdev, int mode)
+       } else {
+               /* Init pointers during recovery */
+               qedf = pci_get_drvdata(pdev);
++              set_bit(QEDF_PROBING, &qedf->flags);
+               lport = qedf->lport;
+       }
++      QEDF_INFO(&qedf->dbg_ctx, QEDF_LOG_DISC, "Probe started.\n");
++
+       host = lport->host;
+       /* Allocate mempool for qedf_io_work structs */
+@@ -3513,6 +3517,10 @@ static int __qedf_probe(struct pci_dev *pdev, int mode)
+       else
+               fc_fabric_login(lport);
++      QEDF_INFO(&qedf->dbg_ctx, QEDF_LOG_DISC, "Probe done.\n");
++
++      clear_bit(QEDF_PROBING, &qedf->flags);
++
+       /* All good */
+       return 0;
+@@ -3538,6 +3546,11 @@ err2:
+ err1:
+       scsi_host_put(lport->host);
+ err0:
++      if (qedf) {
++              QEDF_INFO(&qedf->dbg_ctx, QEDF_LOG_DISC, "Probe done.\n");
++
++              clear_bit(QEDF_PROBING, &qedf->flags);
++      }
+       return rc;
+ }
+@@ -3687,11 +3700,25 @@ void qedf_get_protocol_tlv_data(void *dev, void *data)
+ {
+       struct qedf_ctx *qedf = dev;
+       struct qed_mfw_tlv_fcoe *fcoe = data;
+-      struct fc_lport *lport = qedf->lport;
+-      struct Scsi_Host *host = lport->host;
+-      struct fc_host_attrs *fc_host = shost_to_fc_host(host);
++      struct fc_lport *lport;
++      struct Scsi_Host *host;
++      struct fc_host_attrs *fc_host;
+       struct fc_host_statistics *hst;
++      if (!qedf) {
++              QEDF_ERR(NULL, "qedf is null.\n");
++              return;
++      }
++
++      if (test_bit(QEDF_PROBING, &qedf->flags)) {
++              QEDF_ERR(&qedf->dbg_ctx, "Function is still probing.\n");
++              return;
++      }
++
++      lport = qedf->lport;
++      host = lport->host;
++      fc_host = shost_to_fc_host(host);
++
+       /* Force a refresh of the fc_host stats including offload stats */
+       hst = qedf_fc_get_host_stats(host);
+-- 
+2.25.1
+
diff --git a/queue-5.7/scsi-qedi-check-for-buffer-overflow-in-qedi_set_path.patch b/queue-5.7/scsi-qedi-check-for-buffer-overflow-in-qedi_set_path.patch
new file mode 100644 (file)
index 0000000..33207c3
--- /dev/null
@@ -0,0 +1,45 @@
+From e0f4d7fcebdde0860b4c37de82a0b9ba914dcdb6 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 28 Apr 2020 16:19:39 +0300
+Subject: scsi: qedi: Check for buffer overflow in qedi_set_path()
+
+From: Dan Carpenter <dan.carpenter@oracle.com>
+
+[ Upstream commit 4a4c0cfb4be74e216dd4446b254594707455bfc6 ]
+
+Smatch complains that the "path_data->handle" variable is user controlled.
+It comes from iscsi_set_path() so that seems possible.  It's harmless to
+add a limit check.
+
+The qedi->ep_tbl[] array has qedi->max_active_conns elements (which is
+always ISCSI_MAX_SESS_PER_HBA (4096) elements).  The array is allocated in
+the qedi_cm_alloc_mem() function.
+
+Link: https://lore.kernel.org/r/20200428131939.GA696531@mwanda
+Fixes: ace7f46ba5fd ("scsi: qedi: Add QLogic FastLinQ offload iSCSI driver framework.")
+Acked-by: Manish Rangankar <mrangankar@marvell.com>
+Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/scsi/qedi/qedi_iscsi.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/drivers/scsi/qedi/qedi_iscsi.c b/drivers/scsi/qedi/qedi_iscsi.c
+index 1f4a5fb00a057..d2e5b485afeb4 100644
+--- a/drivers/scsi/qedi/qedi_iscsi.c
++++ b/drivers/scsi/qedi/qedi_iscsi.c
+@@ -1218,6 +1218,10 @@ static int qedi_set_path(struct Scsi_Host *shost, struct iscsi_path *path_data)
+       }
+       iscsi_cid = (u32)path_data->handle;
++      if (iscsi_cid >= qedi->max_active_conns) {
++              ret = -EINVAL;
++              goto set_path_exit;
++      }
+       qedi_ep = qedi->ep_tbl[iscsi_cid];
+       QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO,
+                 "iscsi_cid=0x%x, qedi_ep=%p\n", iscsi_cid, qedi_ep);
+-- 
+2.25.1
+
diff --git a/queue-5.7/scsi-qedi-do-not-flush-offload-work-if-arp-not-resol.patch b/queue-5.7/scsi-qedi-do-not-flush-offload-work-if-arp-not-resol.patch
new file mode 100644 (file)
index 0000000..f286500
--- /dev/null
@@ -0,0 +1,97 @@
+From 3f0570e582f27c6b9c1a6301211122ff00876f02 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 7 Apr 2020 23:43:30 -0700
+Subject: scsi: qedi: Do not flush offload work if ARP not resolved
+
+From: Nilesh Javali <njavali@marvell.com>
+
+[ Upstream commit 927527aea0e2a9c1d336c7d33f77f1911481d008 ]
+
+For an unreachable target, offload_work is not initialized and the endpoint
+state is set to OFLDCONN_NONE. This results in a WARN_ON due to the check
+of the work function field being set to zero.
+
+------------[ cut here ]------------
+WARNING: CPU: 24 PID: 18587 at ../kernel/workqueue.c:3037 __flush_work+0x1c1/0x1d0
+:
+Hardware name: HPE ProLiant DL380 Gen10/ProLiant DL380 Gen10, BIOS U30 02/01/2020
+RIP: 0010:__flush_work+0x1c1/0x1d0
+Code: ba 6d 00 03 80 c9 f0 eb b6 48 c7 c7 20 ee 6c a4 e8 52 d3 04 00 0f 0b 31 c0 e9 d1 fe ff
+ff 48 c7 c7 20 ee 6c a4 e8 3d d3 04 00 <0f> 0b 31 c0 e9 bc fe ff ff e8 11 f3 f
+ 00 31 f6
+RSP: 0018:ffffac5a8cd47a80 EFLAGS: 00010282
+RAX: 0000000000000024 RBX: ffff98d68c1fcaf0 RCX: 0000000000000000
+RDX: 0000000000000000 RSI: ffff98ce9fd99898 RDI: ffff98ce9fd99898
+RBP: ffff98d68c1fcbc0 R08: 00000000000006fa R09: 0000000000000001
+R10: ffffac5a8cd47b50 R11: 0000000000000001 R12: 0000000000000000
+R13: 000000000000489b R14: ffff98d68c1fc800 R15: ffff98d692132c00
+FS:  00007f65f7f62280(0000) GS:ffff98ce9fd80000(0000) knlGS:0000000000000000
+CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
+CR2: 00007ffd2435e880 CR3: 0000000809334003 CR4: 00000000007606e0
+DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
+DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
+PKRU: 55555554
+Call Trace:
+ ? class_create_release+0x40/0x40
+ ? klist_put+0x2c/0x80
+ qedi_ep_disconnect+0xdd/0x400 [qedi]
+ iscsi_if_ep_disconnect.isra.20+0x59/0x70 [scsi_transport_iscsi]
+ iscsi_if_rx+0x129b/0x1670 [scsi_transport_iscsi]
+ ? __netlink_lookup+0xe7/0x160
+ netlink_unicast+0x21d/0x300
+ netlink_sendmsg+0x30f/0x430
+ sock_sendmsg+0x5b/0x60
+ ____sys_sendmsg+0x1e2/0x240
+ ? copy_msghdr_from_user+0xd9/0x160
+ ___sys_sendmsg+0x88/0xd0
+ ? ___sys_recvmsg+0xa2/0xe0
+ ? hrtimer_try_to_cancel+0x25/0x100
+ ? do_nanosleep+0x9c/0x170
+ ? __sys_sendmsg+0x5e/0xa0
+ __sys_sendmsg+0x5e/0xa0
+ do_syscall_64+0x60/0x1f0
+ entry_SYSCALL_64_after_hwframe+0x49/0xbe
+RIP: 0033:0x7f65f6f16107
+Code: 64 89 02 48 c7 c0 ff ff ff ff eb b9 0f 1f 80 00 00 00 00 8b 05 aa d2 2b 00 48 63 d2 48
+63 ff 85 c0 75 18 b8 2e 00 00 00 0f 05 <48> 3d 00 f0 ff ff 77 59 f3 c3 0f 1f 8
+    0 00 00 00 00 53 48 89 f3 48
+ RSP: 002b:00007ffd24367ca8 EFLAGS: 00000246 ORIG_RAX: 000000000000002e
+ RAX: ffffffffffffffda RBX: 000055a7aeaaf110 RCX: 00007f65f6f16107
+ RDX: 0000000000000000 RSI: 00007ffd24367cc0 RDI: 0000000000000003
+ RBP: 0000000000000070 R08: 0000000000000000 R09: 0000000000000000
+ R10: 000000000000075c R11: 0000000000000246 R12: 00007ffd24367cc0
+ R13: 000055a7ae560008 R14: 00007ffd24367db0 R15: 0000000000000000
+ ---[ end trace 54f499c05d41f8bb ]---
+
+Only flush if the connection endpoint state if different from
+OFLDCONN_NONE.
+
+[mkp: clarified commit desc]
+
+Link: https://lore.kernel.org/r/20200408064332.19377-5-mrangankar@marvell.com
+Reviewed-by: Lee Duncan <lduncan@suse.com>
+Signed-off-by: Nilesh Javali <njavali@marvell.com>
+Signed-off-by: Manish Rangankar <mrangankar@marvell.com>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/scsi/qedi/qedi_iscsi.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/scsi/qedi/qedi_iscsi.c b/drivers/scsi/qedi/qedi_iscsi.c
+index d2e5b485afeb4..366c65b295a50 100644
+--- a/drivers/scsi/qedi/qedi_iscsi.c
++++ b/drivers/scsi/qedi/qedi_iscsi.c
+@@ -1001,7 +1001,8 @@ static void qedi_ep_disconnect(struct iscsi_endpoint *ep)
+       if (qedi_ep->state == EP_STATE_OFLDCONN_START)
+               goto ep_exit_recover;
+-      flush_work(&qedi_ep->offload_work);
++      if (qedi_ep->state != EP_STATE_OFLDCONN_NONE)
++              flush_work(&qedi_ep->offload_work);
+       if (qedi_ep->conn) {
+               qedi_conn = qedi_ep->conn;
+-- 
+2.25.1
+
diff --git a/queue-5.7/scsi-qla2xxx-fix-issue-with-adapter-s-stopping-state.patch b/queue-5.7/scsi-qla2xxx-fix-issue-with-adapter-s-stopping-state.patch
new file mode 100644 (file)
index 0000000..465bc1c
--- /dev/null
@@ -0,0 +1,91 @@
+From b53436cd1c386db5818406ddd13f8fefc8d2b74d Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 22 Apr 2020 13:55:52 +0300
+Subject: scsi: qla2xxx: Fix issue with adapter's stopping state
+
+From: Viacheslav Dubeyko <v.dubeiko@yadro.com>
+
+[ Upstream commit 803e45550b11c8e43d89812356fe6f105adebdf9 ]
+
+The goal of the following command sequence is to restart the adapter.
+However, the tgt_stop flag remains set, indicating that the adapter is
+still in stopping state even after re-enabling it.
+
+echo 0x7fffffff > /sys/module/qla2xxx/parameters/logging
+modprobe target_core_mod
+modprobe tcm_qla2xxx
+mkdir /sys/kernel/config/target/qla2xxx
+mkdir /sys/kernel/config/target/qla2xxx/<port-name>
+mkdir /sys/kernel/config/target/qla2xxx/<port-name>/tpgt_1
+echo 1 > /sys/kernel/config/target/qla2xxx/<port-name>/tpgt_1/enable
+echo 0 > /sys/kernel/config/target/qla2xxx/<port-name>/tpgt_1/enable
+echo 1 > /sys/kernel/config/target/qla2xxx/<port-name>/tpgt_1/enable
+
+kernel: PID 1396:qla_target.c:1555 qlt_stop_phase1(): tgt_stop 0x0, tgt_stopped 0x0
+kernel: qla2xxx [0001:00:02.0]-e803:1: PID 1396:qla_target.c:1567: Stopping target for host 1(c0000000033557e8)
+kernel: PID 1396:qla_target.c:1579 qlt_stop_phase1(): tgt_stop 0x1, tgt_stopped 0x0
+kernel: PID 1396:qla_target.c:1266 qlt_schedule_sess_for_deletion(): tgt_stop 0x1, tgt_stopped 0x0
+kernel: qla2xxx [0001:00:02.0]-e801:1: PID 1396:qla_target.c:1316: Scheduling sess c00000002d5cd800 for deletion 21:00:00:24:ff:7f:35:c7
+<skipped>
+kernel: qla2xxx [0001:00:02.0]-290a:1: PID 340:qla_target.c:1187: qlt_unreg_sess sess c00000002d5cd800 for deletion 21:00:00:24:ff:7f:35:c7
+<skipped>
+kernel: qla2xxx [0001:00:02.0]-f801:1: PID 340:qla_target.c:1145: Unregistration of sess c00000002d5cd800 21:00:00:24:ff:7f:35:c7 finished fcp_cnt 0
+kernel: PID 340:qla_target.c:1155 qlt_free_session_done(): tgt_stop 0x1, tgt_stopped 0x0
+kernel: qla2xxx [0001:00:02.0]-4807:1: PID 346:qla_os.c:6329: ISP abort scheduled.
+<skipped>
+kernel: qla2xxx [0001:00:02.0]-28f1:1: PID 346:qla_os.c:3956: Mark all dev lost
+kernel: PID 346:qla_target.c:1266 qlt_schedule_sess_for_deletion(): tgt_stop 0x1, tgt_stopped 0x0
+kernel: qla2xxx [0001:00:02.0]-4808:1: PID 346:qla_os.c:6338: ISP abort end.
+<skipped>
+kernel: PID 1396:qla_target.c:6812 qlt_enable_vha(): tgt_stop 0x1, tgt_stopped 0x0
+<skipped>
+kernel: qla2xxx [0001:00:02.0]-4807:1: PID 346:qla_os.c:6329: ISP abort scheduled.
+<skipped>
+kernel: qla2xxx [0001:00:02.0]-4808:1: PID 346:qla_os.c:6338: ISP abort end.
+
+qlt_handle_cmd_for_atio() rejects the request to send commands because the
+adapter is in the stopping state:
+
+kernel: PID 0:qla_target.c:4442 qlt_handle_cmd_for_atio(): tgt_stop 0x1, tgt_stopped 0x0
+kernel: qla2xxx [0001:00:02.0]-3861:1: PID 0:qla_target.c:4447: New command while device c000000005314600 is shutting down
+kernel: qla2xxx [0001:00:02.0]-e85f:1: PID 0:qla_target.c:5728: qla_target: Unable to send command to target
+
+This patch calls qla_stop_phase2() in addition to qlt_stop_phase1() in
+tcm_qla2xxx_tpg_enable_store() and tcm_qla2xxx_npiv_tpg_enable_store(). The
+qlt_stop_phase1() marks adapter as stopping (tgt_stop == 0x1, tgt_stopped
+== 0x0) but qlt_stop_phase2() marks adapter as stopped (tgt_stop == 0x0,
+tgt_stopped == 0x1).
+
+Link: https://lore.kernel.org/r/52be1e8a3537f6c5407eae3edd4c8e08a9545ea5.camel@yadro.com
+Reviewed-by: Roman Bolshakov <r.bolshakov@yadro.com>
+Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com>
+Signed-off-by: Viacheslav Dubeyko <v.dubeiko@yadro.com>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/scsi/qla2xxx/tcm_qla2xxx.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/drivers/scsi/qla2xxx/tcm_qla2xxx.c b/drivers/scsi/qla2xxx/tcm_qla2xxx.c
+index 1f0a185b2a957..bf00ae16b4873 100644
+--- a/drivers/scsi/qla2xxx/tcm_qla2xxx.c
++++ b/drivers/scsi/qla2xxx/tcm_qla2xxx.c
+@@ -949,6 +949,7 @@ static ssize_t tcm_qla2xxx_tpg_enable_store(struct config_item *item,
+               atomic_set(&tpg->lport_tpg_enabled, 0);
+               qlt_stop_phase1(vha->vha_tgt.qla_tgt);
++              qlt_stop_phase2(vha->vha_tgt.qla_tgt);
+       }
+       return count;
+@@ -1111,6 +1112,7 @@ static ssize_t tcm_qla2xxx_npiv_tpg_enable_store(struct config_item *item,
+               atomic_set(&tpg->lport_tpg_enabled, 0);
+               qlt_stop_phase1(vha->vha_tgt.qla_tgt);
++              qlt_stop_phase2(vha->vha_tgt.qla_tgt);
+       }
+       return count;
+-- 
+2.25.1
+
diff --git a/queue-5.7/scsi-qla2xxx-fix-warning-after-fc-target-reset.patch b/queue-5.7/scsi-qla2xxx-fix-warning-after-fc-target-reset.patch
new file mode 100644 (file)
index 0000000..4e005f1
--- /dev/null
@@ -0,0 +1,108 @@
+From 852d4fd8d11713043fecc8b43641db8465dc1ffc Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 10 Apr 2020 11:07:08 +0300
+Subject: scsi: qla2xxx: Fix warning after FC target reset
+
+From: Viacheslav Dubeyko <v.dubeiko@yadro.com>
+
+[ Upstream commit f839544ccff60cbe534282aac68858fc3fb278ca ]
+
+Currently, FC target reset finishes with the warning message:
+
+[84010.596893] ------------[ cut here ]------------
+[84010.596917] WARNING: CPU: 238 PID: 279973 at ../drivers/scsi/qla2xxx/qla_target.c:6644 qlt_enable_vha+0x1d0/0x260 [qla2xxx]
+[84010.596918] Modules linked in: vrf af_packet 8021q garp mrp stp llc netlink_diag target_tatlin_tblock(OEX) dm_ec(OEX) ttln_rdma(OEX) dm_frontend(OEX) nvme_rdma nvmet tcm_qla2xxx iscsi_target_mod target_core_mod at24 nvmem_core pnv_php ipmi_watchdog ipmi_ssif vmx_crypto gf128mul crct10dif_vpmsum qla2xxx rpcrdma nvme_fc powernv_flash(X) nvme_fabrics uio_pdrv_genirq mtd rtc_opal(X) ibmpowernv(X) opal_prd(X) uio scsi_transport_fc i2c_opal(X) ses enclosure ipmi_poweroff ast i2c_algo_bit ttm bmc_mcu(OEX) drm_kms_helper syscopyarea sysfillrect sysimgblt fb_sys_fops drm drm_panel_orientation_quirks agpgart nfsd auth_rpcgss nfs_acl ipmi_powernv(X) lockd ipmi_devintf ipmi_msghandler grace dummy ext4 crc16 jbd2 mbcache sd_mod rdma_ucm ib_iser rdma_cm ib_umad iw_cm ib_ipoib libiscsi scsi_transport_iscsi ib_cm
+[84010.596975]  configfs mlx5_ib ib_uverbs ib_core mlx5_core crc32c_vpmsum xhci_pci xhci_hcd mpt3sas(OEX) tg3 usbcore mlxfw tls raid_class libphy scsi_transport_sas devlink ptp pps_core nvme nvme_core sunrpc dm_mirror dm_region_hash dm_log sg dm_multipath dm_mod scsi_dh_rdac scsi_dh_emc scsi_dh_alua scsi_mod autofs4
+[84010.597001] Supported: Yes, External
+[84010.597004] CPU: 238 PID: 279973 Comm: bash Tainted: G           OE      4.12.14-197.29-default #1 SLE15-SP1
+[84010.597006] task: c000000a104c0000 task.stack: c000000b52188000
+[84010.597007] NIP: d00000001ffd7f78 LR: d00000001ffd7f6c CTR: c0000000001676c0
+[84010.597008] REGS: c000000b5218b910 TRAP: 0700   Tainted: G           OE       (4.12.14-197.29-default)
+[84010.597008] MSR: 900000010282b033 <SF,HV,VEC,VSX,EE,FP,ME,IR,DR,RI,LE,TM[E]>
+[84010.597015]   CR: 48242424  XER: 00000000
+[84010.597016] CFAR: d00000001ff45d08 SOFTE: 1
+               GPR00: d00000001ffd7f6c c000000b5218bb90 d00000002001b228 0000000000000102
+               GPR04: 0000000000000001 0000000000000001 00013d91ed0a5e2d 0000000000000000
+               GPR08: c000000007793300 0000000000000000 0000000000000000 c000000a086e7818
+               GPR12: 0000000000002200 c000000007793300 0000000000000000 000000012bc937c0
+               GPR16: 000000012bbf7ed0 0000000000000000 000000012bc3dd10 0000000000000000
+               GPR20: 000000012bc4db28 0000010036442810 000000012bc97828 000000012bc96c70
+               GPR24: 00000100365b1550 0000000000000000 00000100363f3d80 c000000be20d3080
+               GPR28: c000000bda7eae00 c000000be20db7e8 c000000be20d3778 c000000be20db7e8
+[84010.597042] NIP [d00000001ffd7f78] qlt_enable_vha+0x1d0/0x260 [qla2xxx]
+[84010.597051] LR [d00000001ffd7f6c] qlt_enable_vha+0x1c4/0x260 [qla2xxx]
+[84010.597051] Call Trace:
+[84010.597061] [c000000b5218bb90] [d00000001ffd7f6c] qlt_enable_vha+0x1c4/0x260 [qla2xxx] (unreliable)
+[84010.597064] [c000000b5218bc20] [d000000009820b6c] tcm_qla2xxx_tpg_enable_store+0xc4/0x130 [tcm_qla2xxx]
+[84010.597067] [c000000b5218bcb0] [d0000000185d0e68] configfs_write_file+0xd0/0x190 [configfs]
+[84010.597072] [c000000b5218bd00] [c0000000003d0edc] __vfs_write+0x3c/0x1e0
+[84010.597074] [c000000b5218bd90] [c0000000003d2ea8] vfs_write+0xd8/0x220
+[84010.597076] [c000000b5218bde0] [c0000000003d4ddc] SyS_write+0x6c/0x110
+[84010.597079] [c000000b5218be30] [c00000000000b188] system_call+0x3c/0x130
+[84010.597080] Instruction dump:
+[84010.597082] 7d0050a8 7d084b78 7d0051ad 40c2fff4 7fa3eb78 4bf73965 60000000 7fa3eb78
+[84010.597086] 4bf6dcd9 60000000 2fa30000 419eff40 <0fe00000> 4bffff38 e95f0058 a12a0180
+[84010.597090] ---[ end trace e32abaf6e6fee826 ]---
+
+To reproduce:
+
+echo 0x7fffffff > /sys/module/qla2xxx/parameters/logging
+modprobe target_core_mod
+modprobe tcm_qla2xxx
+mkdir /sys/kernel/config/target/qla2xxx
+mkdir /sys/kernel/config/target/qla2xxx/<port-name>
+mkdir /sys/kernel/config/target/qla2xxx/<port-name>/tpgt_1
+echo 1 > /sys/kernel/config/target/qla2xxx/<port-name>/tpgt_1/enable
+echo 0 > /sys/kernel/config/target/qla2xxx/<port-name>/tpgt_1/enable
+echo 1 > /sys/kernel/config/target/qla2xxx/<port-name>/tpgt_1/enable
+
+SYSTEM START
+kernel: pid 327:drivers/scsi/qla2xxx/qla_init.c:2174 qla2x00_initialize_adapter(): vha->flags.online 0x0
+<...>
+kernel: pid 327:drivers/scsi/qla2xxx/qla_os.c:3444 qla2x00_probe_one(): vha->flags.online 0x1
+
+echo 1 > /sys/kernel/config/target/qla2xxx/21:00:00:24:ff:86:a6:2a/tpgt_1/enable
+kernel: pid 348:drivers/scsi/qla2xxx/qla_init.c:6641 qla2x00_abort_isp_cleanup(): vha->flags.online 0x0, ISP_ABORT_NEEDED 0x0
+<...>
+kernel: pid 348:drivers/scsi/qla2xxx/qla_init.c:6998 qla2x00_restart_isp(): vha->flags.online 0x0
+
+echo 0 > /sys/kernel/config/target/qla2xxx/21:00:00:24:ff:86:a6:2a/tpgt_1/enable
+kernel: pid 348:drivers/scsi/qla2xxx/qla_init.c:6641 qla2x00_abort_isp_cleanup(): vha->flags.online 0x0, ISP_ABORT_NEEDED 0x0
+<...>
+kernel: pid 1404:drivers/scsi/qla2xxx/qla_os.c:1107 qla2x00_wait_for_hba_online(): base_vha->flags.online 0x0
+
+echo 1 > /sys/kernel/config/target/qla2xxx/21:00:00:24:ff:86:a6:2a/tpgt_1/enable
+kernel: pid 1404:drivers/scsi/qla2xxx/qla_os.c:1107 qla2x00_wait_for_hba_online(): base_vha->flags.online 0x0
+kernel: -----------[ cut here ]-----------
+kernel: WARNING: CPU: 1 PID: 1404 at drivers/scsi/qla2xxx/qla_target.c:6654 qlt_enable_vha+0x1e0/0x280 [qla2xxx]
+
+The issue happens because no real ISP reset is executed.  The
+qla2x00_abort_isp(scsi_qla_host_t *vha) function expects that
+vha->flags.online will be not zero for ISP reset procedure.  This patch
+sets vha->flags.online to 1 before calling ->abort_isp() for starting the
+ISP reset.
+
+Link: https://lore.kernel.org/r/1d7b21bf9f7676643239eb3d60eaca7cfa505cf0.camel@yadro.com
+Reviewed-by: Roman Bolshakov <r.bolshakov@yadro.com>
+Signed-off-by: Viacheslav Dubeyko <v.dubeiko@yadro.com>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/scsi/qla2xxx/qla_os.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c
+index 1d9a4866f9a74..9179bb4caed84 100644
+--- a/drivers/scsi/qla2xxx/qla_os.c
++++ b/drivers/scsi/qla2xxx/qla_os.c
+@@ -6871,6 +6871,7 @@ qla2x00_do_dpc(void *data)
+                       if (do_reset && !(test_and_set_bit(ABORT_ISP_ACTIVE,
+                           &base_vha->dpc_flags))) {
++                              base_vha->flags.online = 1;
+                               ql_dbg(ql_dbg_dpc, base_vha, 0x4007,
+                                   "ISP abort scheduled.\n");
+                               if (ha->isp_ops->abort_isp(base_vha)) {
+-- 
+2.25.1
+
diff --git a/queue-5.7/scsi-sr-fix-sr_probe-missing-deallocate-of-device-mi.patch b/queue-5.7/scsi-sr-fix-sr_probe-missing-deallocate-of-device-mi.patch
new file mode 100644 (file)
index 0000000..55b2bc7
--- /dev/null
@@ -0,0 +1,47 @@
+From 33e1e5ba6648520339c99abdb8285e68221e0396 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 30 May 2020 18:59:44 +0100
+Subject: scsi: sr: Fix sr_probe() missing deallocate of device minor
+
+From: Simon Arlott <simon@octiron.net>
+
+[ Upstream commit 6555781b3fdec5e94e6914511496144241df7dee ]
+
+If the cdrom fails to be registered then the device minor should be
+deallocated.
+
+Link: https://lore.kernel.org/r/072dac4b-8402-4de8-36bd-47e7588969cd@0882a8b5-c6c3-11e9-b005-00805fc181fe
+Signed-off-by: Simon Arlott <simon@octiron.net>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/scsi/sr.c | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/scsi/sr.c b/drivers/scsi/sr.c
+index 8d062d4f3ce0b..1e13c6a0f0caf 100644
+--- a/drivers/scsi/sr.c
++++ b/drivers/scsi/sr.c
+@@ -797,7 +797,7 @@ static int sr_probe(struct device *dev)
+       cd->cdi.disk = disk;
+       if (register_cdrom(&cd->cdi))
+-              goto fail_put;
++              goto fail_minor;
+       /*
+        * Initialize block layer runtime PM stuffs before the
+@@ -815,6 +815,10 @@ static int sr_probe(struct device *dev)
+       return 0;
++fail_minor:
++      spin_lock(&sr_index_lock);
++      clear_bit(minor, sr_index_bits);
++      spin_unlock(&sr_index_lock);
+ fail_put:
+       put_disk(disk);
+       mutex_destroy(&cd->lock);
+-- 
+2.25.1
+
diff --git a/queue-5.7/scsi-sr-fix-sr_probe-missing-mutex_destroy.patch b/queue-5.7/scsi-sr-fix-sr_probe-missing-mutex_destroy.patch
new file mode 100644 (file)
index 0000000..9e25c54
--- /dev/null
@@ -0,0 +1,36 @@
+From 0188b4f0c891a3dee1276ff35ec5ea2cbc7b20ef Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 30 May 2020 18:58:25 +0100
+Subject: scsi: sr: Fix sr_probe() missing mutex_destroy
+
+From: Simon Arlott <simon@octiron.net>
+
+[ Upstream commit a247e07f8dadba5da9f188aaf4f96db0302146d9 ]
+
+If the device minor cannot be allocated or the cdrom fails to be registered
+then the mutex should be destroyed.
+
+Link: https://lore.kernel.org/r/06e9de38-eeed-1cab-5e08-e889288935b3@0882a8b5-c6c3-11e9-b005-00805fc181fe
+Fixes: 51a858817dcd ("scsi: sr: get rid of sr global mutex")
+Signed-off-by: Simon Arlott <simon@octiron.net>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/scsi/sr.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/scsi/sr.c b/drivers/scsi/sr.c
+index d2fe3fa470f95..8d062d4f3ce0b 100644
+--- a/drivers/scsi/sr.c
++++ b/drivers/scsi/sr.c
+@@ -817,6 +817,7 @@ static int sr_probe(struct device *dev)
+ fail_put:
+       put_disk(disk);
++      mutex_destroy(&cd->lock);
+ fail_free:
+       kfree(cd);
+ fail:
+-- 
+2.25.1
+
diff --git a/queue-5.7/scsi-target-loopback-fix-read-with-data-and-sensebyt.patch b/queue-5.7/scsi-target-loopback-fix-read-with-data-and-sensebyt.patch
new file mode 100644 (file)
index 0000000..2f514bc
--- /dev/null
@@ -0,0 +1,105 @@
+From c63e6eaa31cab49c3de121f181136fd593a97031 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 28 Apr 2020 20:26:17 +0200
+Subject: scsi: target: loopback: Fix READ with data and sensebytes
+
+From: Bodo Stroesser <bstroesser@ts.fujitsu.com>
+
+[ Upstream commit c68a56736c129f5dd1632856956f9c3e04bae200 ]
+
+We use tcm_loop with tape emulations running on tcmu.
+
+In case application reads a short tape block with a longer READ, or a long
+tape block with a short READ, according to SCC spec data has to be
+tranferred _and_ sensebytes with ILI set and information field containing
+the residual count. Similar problem also exists when using fixed block
+size in READ.
+
+Up to now tcm_loop is not prepared to handle sensebytes if input data is
+provided, as in tcm_loop_queue_data_in() it only sets SAM_STAT_GOOD and, if
+necessary, the residual count.
+
+To fix the bug, the same handling for sensebytes as present in
+tcm_loop_queue_status() must be done in tcm_loop_queue_data_in() also.
+
+After adding this handling, the two function now are nearly identical, so I
+created a single function with two wrappers.
+
+Link: https://lore.kernel.org/r/20200428182617.32726-1-bstroesser@ts.fujitsu.com
+Signed-off-by: Bodo Stroesser <bstroesser@ts.fujitsu.com>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/target/loopback/tcm_loop.c | 36 +++++++++++++-----------------
+ 1 file changed, 15 insertions(+), 21 deletions(-)
+
+diff --git a/drivers/target/loopback/tcm_loop.c b/drivers/target/loopback/tcm_loop.c
+index 3305b47fdf536..16d5a4e117a27 100644
+--- a/drivers/target/loopback/tcm_loop.c
++++ b/drivers/target/loopback/tcm_loop.c
+@@ -545,32 +545,15 @@ static int tcm_loop_write_pending(struct se_cmd *se_cmd)
+       return 0;
+ }
+-static int tcm_loop_queue_data_in(struct se_cmd *se_cmd)
++static int tcm_loop_queue_data_or_status(const char *func,
++              struct se_cmd *se_cmd, u8 scsi_status)
+ {
+       struct tcm_loop_cmd *tl_cmd = container_of(se_cmd,
+                               struct tcm_loop_cmd, tl_se_cmd);
+       struct scsi_cmnd *sc = tl_cmd->sc;
+       pr_debug("%s() called for scsi_cmnd: %p cdb: 0x%02x\n",
+-               __func__, sc, sc->cmnd[0]);
+-
+-      sc->result = SAM_STAT_GOOD;
+-      set_host_byte(sc, DID_OK);
+-      if ((se_cmd->se_cmd_flags & SCF_OVERFLOW_BIT) ||
+-          (se_cmd->se_cmd_flags & SCF_UNDERFLOW_BIT))
+-              scsi_set_resid(sc, se_cmd->residual_count);
+-      sc->scsi_done(sc);
+-      return 0;
+-}
+-
+-static int tcm_loop_queue_status(struct se_cmd *se_cmd)
+-{
+-      struct tcm_loop_cmd *tl_cmd = container_of(se_cmd,
+-                              struct tcm_loop_cmd, tl_se_cmd);
+-      struct scsi_cmnd *sc = tl_cmd->sc;
+-
+-      pr_debug("%s() called for scsi_cmnd: %p cdb: 0x%02x\n",
+-               __func__, sc, sc->cmnd[0]);
++               func, sc, sc->cmnd[0]);
+       if (se_cmd->sense_buffer &&
+          ((se_cmd->se_cmd_flags & SCF_TRANSPORT_TASK_SENSE) ||
+@@ -581,7 +564,7 @@ static int tcm_loop_queue_status(struct se_cmd *se_cmd)
+               sc->result = SAM_STAT_CHECK_CONDITION;
+               set_driver_byte(sc, DRIVER_SENSE);
+       } else
+-              sc->result = se_cmd->scsi_status;
++              sc->result = scsi_status;
+       set_host_byte(sc, DID_OK);
+       if ((se_cmd->se_cmd_flags & SCF_OVERFLOW_BIT) ||
+@@ -591,6 +574,17 @@ static int tcm_loop_queue_status(struct se_cmd *se_cmd)
+       return 0;
+ }
++static int tcm_loop_queue_data_in(struct se_cmd *se_cmd)
++{
++      return tcm_loop_queue_data_or_status(__func__, se_cmd, SAM_STAT_GOOD);
++}
++
++static int tcm_loop_queue_status(struct se_cmd *se_cmd)
++{
++      return tcm_loop_queue_data_or_status(__func__,
++                                           se_cmd, se_cmd->scsi_status);
++}
++
+ static void tcm_loop_queue_tm_rsp(struct se_cmd *se_cmd)
+ {
+       struct tcm_loop_cmd *tl_cmd = container_of(se_cmd,
+-- 
+2.25.1
+
diff --git a/queue-5.7/scsi-target-tcmu-fix-a-use-after-free-in-tcmu_check_.patch b/queue-5.7/scsi-target-tcmu-fix-a-use-after-free-in-tcmu_check_.patch
new file mode 100644 (file)
index 0000000..f1536b5
--- /dev/null
@@ -0,0 +1,48 @@
+From 505582a98c1597cc17a5f0c686f0c727e80c5e29 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 23 May 2020 13:11:29 +0300
+Subject: scsi: target: tcmu: Fix a use after free in
+ tcmu_check_expired_queue_cmd()
+
+From: Dan Carpenter <dan.carpenter@oracle.com>
+
+[ Upstream commit 9d7464b18892332e35ff37f0b024429a1a9835e6 ]
+
+The pr_debug() dereferences "cmd" after we already freed it by calling
+tcmu_free_cmd(cmd).  The debug printk needs to be done earlier.
+
+Link: https://lore.kernel.org/r/20200523101129.GB98132@mwanda
+Fixes: 61fb24822166 ("scsi: target: tcmu: Userspace must not complete queued commands")
+Reviewed-by: Mike Christie <mchristi@redhat.com>
+Reviewed-by: David Disseldorp <ddiss@suse.de>
+Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/target/target_core_user.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/target/target_core_user.c b/drivers/target/target_core_user.c
+index 517570e47958a..b63a1e0c4aa6d 100644
+--- a/drivers/target/target_core_user.c
++++ b/drivers/target/target_core_user.c
+@@ -1292,13 +1292,13 @@ static void tcmu_check_expired_queue_cmd(struct tcmu_cmd *cmd)
+       if (!time_after(jiffies, cmd->deadline))
+               return;
++      pr_debug("Timing out queued cmd %p on dev %s.\n",
++                cmd, cmd->tcmu_dev->name);
++
+       list_del_init(&cmd->queue_entry);
+       se_cmd = cmd->se_cmd;
+       tcmu_free_cmd(cmd);
+-      pr_debug("Timing out queued cmd %p on dev %s.\n",
+-                cmd, cmd->tcmu_dev->name);
+-
+       target_complete_cmd(se_cmd, SAM_STAT_TASK_SET_FULL);
+ }
+-- 
+2.25.1
+
diff --git a/queue-5.7/scsi-target-tcmu-userspace-must-not-complete-queued-.patch b/queue-5.7/scsi-target-tcmu-userspace-must-not-complete-queued-.patch
new file mode 100644 (file)
index 0000000..40cb799
--- /dev/null
@@ -0,0 +1,337 @@
+From 644516017afa04296ba943d45811b677981d26d6 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 18 May 2020 18:48:33 +0200
+Subject: scsi: target: tcmu: Userspace must not complete queued commands
+
+From: Bodo Stroesser <bstroesser@ts.fujitsu.com>
+
+[ Upstream commit 61fb2482216679b9e1e797440c148bb143a5040a ]
+
+When tcmu queues a new command - no matter whether in command ring or in
+qfull_queue - a cmd_id from IDR udev->commands is assigned to the command.
+
+If userspace sends a wrong command completion containing the cmd_id of a
+command on the qfull_queue, tcmu_handle_completions() finds the command in
+the IDR and calls tcmu_handle_completion() for it. This might do some nasty
+things because commands in qfull_queue do not have a valid dbi list.
+
+To fix this bug, we no longer add queued commands to the idr.  Instead the
+cmd_id is assign when a command is written to the command ring.
+
+Due to this change I had to adapt the source code at several places where
+up to now an idr_for_each had been done.
+
+[mkp: fix checkpatch warnings]
+
+Link: https://lore.kernel.org/r/20200518164833.12775-1-bstroesser@ts.fujitsu.com
+Acked-by: Mike Christie <mchristi@redhat.com>
+Signed-off-by: Bodo Stroesser <bstroesser@ts.fujitsu.com>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/target/target_core_user.c | 154 ++++++++++++++----------------
+ 1 file changed, 71 insertions(+), 83 deletions(-)
+
+diff --git a/drivers/target/target_core_user.c b/drivers/target/target_core_user.c
+index f769bb1e37356..517570e47958a 100644
+--- a/drivers/target/target_core_user.c
++++ b/drivers/target/target_core_user.c
+@@ -882,41 +882,24 @@ static inline size_t tcmu_cmd_get_cmd_size(struct tcmu_cmd *tcmu_cmd,
+       return command_size;
+ }
+-static int tcmu_setup_cmd_timer(struct tcmu_cmd *tcmu_cmd, unsigned int tmo,
+-                              struct timer_list *timer)
++static void tcmu_setup_cmd_timer(struct tcmu_cmd *tcmu_cmd, unsigned int tmo,
++                               struct timer_list *timer)
+ {
+-      struct tcmu_dev *udev = tcmu_cmd->tcmu_dev;
+-      int cmd_id;
+-
+-      if (tcmu_cmd->cmd_id)
+-              goto setup_timer;
+-
+-      cmd_id = idr_alloc(&udev->commands, tcmu_cmd, 1, USHRT_MAX, GFP_NOWAIT);
+-      if (cmd_id < 0) {
+-              pr_err("tcmu: Could not allocate cmd id.\n");
+-              return cmd_id;
+-      }
+-      tcmu_cmd->cmd_id = cmd_id;
+-
+-      pr_debug("allocated cmd %u for dev %s tmo %lu\n", tcmu_cmd->cmd_id,
+-               udev->name, tmo / MSEC_PER_SEC);
+-
+-setup_timer:
+       if (!tmo)
+-              return 0;
++              return;
+       tcmu_cmd->deadline = round_jiffies_up(jiffies + msecs_to_jiffies(tmo));
+       if (!timer_pending(timer))
+               mod_timer(timer, tcmu_cmd->deadline);
+-      return 0;
++      pr_debug("Timeout set up for cmd %p, dev = %s, tmo = %lu\n", tcmu_cmd,
++               tcmu_cmd->tcmu_dev->name, tmo / MSEC_PER_SEC);
+ }
+ static int add_to_qfull_queue(struct tcmu_cmd *tcmu_cmd)
+ {
+       struct tcmu_dev *udev = tcmu_cmd->tcmu_dev;
+       unsigned int tmo;
+-      int ret;
+       /*
+        * For backwards compat if qfull_time_out is not set use
+@@ -931,13 +914,11 @@ static int add_to_qfull_queue(struct tcmu_cmd *tcmu_cmd)
+       else
+               tmo = TCMU_TIME_OUT;
+-      ret = tcmu_setup_cmd_timer(tcmu_cmd, tmo, &udev->qfull_timer);
+-      if (ret)
+-              return ret;
++      tcmu_setup_cmd_timer(tcmu_cmd, tmo, &udev->qfull_timer);
+       list_add_tail(&tcmu_cmd->queue_entry, &udev->qfull_queue);
+-      pr_debug("adding cmd %u on dev %s to ring space wait queue\n",
+-               tcmu_cmd->cmd_id, udev->name);
++      pr_debug("adding cmd %p on dev %s to ring space wait queue\n",
++               tcmu_cmd, udev->name);
+       return 0;
+ }
+@@ -959,7 +940,7 @@ static int queue_cmd_ring(struct tcmu_cmd *tcmu_cmd, sense_reason_t *scsi_err)
+       struct tcmu_mailbox *mb;
+       struct tcmu_cmd_entry *entry;
+       struct iovec *iov;
+-      int iov_cnt, ret;
++      int iov_cnt, cmd_id;
+       uint32_t cmd_head;
+       uint64_t cdb_off;
+       bool copy_to_data_area;
+@@ -1060,14 +1041,21 @@ static int queue_cmd_ring(struct tcmu_cmd *tcmu_cmd, sense_reason_t *scsi_err)
+       }
+       entry->req.iov_bidi_cnt = iov_cnt;
+-      ret = tcmu_setup_cmd_timer(tcmu_cmd, udev->cmd_time_out,
+-                                 &udev->cmd_timer);
+-      if (ret) {
+-              tcmu_cmd_free_data(tcmu_cmd, tcmu_cmd->dbi_cnt);
++      cmd_id = idr_alloc(&udev->commands, tcmu_cmd, 1, USHRT_MAX, GFP_NOWAIT);
++      if (cmd_id < 0) {
++              pr_err("tcmu: Could not allocate cmd id.\n");
++              tcmu_cmd_free_data(tcmu_cmd, tcmu_cmd->dbi_cnt);
+               *scsi_err = TCM_OUT_OF_RESOURCES;
+               return -1;
+       }
++      tcmu_cmd->cmd_id = cmd_id;
++
++      pr_debug("allocated cmd id %u for cmd %p dev %s\n", tcmu_cmd->cmd_id,
++               tcmu_cmd, udev->name);
++
++      tcmu_setup_cmd_timer(tcmu_cmd, udev->cmd_time_out, &udev->cmd_timer);
++
+       entry->hdr.cmd_id = tcmu_cmd->cmd_id;
+       /*
+@@ -1279,50 +1267,39 @@ static unsigned int tcmu_handle_completions(struct tcmu_dev *udev)
+       return handled;
+ }
+-static int tcmu_check_expired_cmd(int id, void *p, void *data)
++static void tcmu_check_expired_ring_cmd(struct tcmu_cmd *cmd)
+ {
+-      struct tcmu_cmd *cmd = p;
+-      struct tcmu_dev *udev = cmd->tcmu_dev;
+-      u8 scsi_status;
+       struct se_cmd *se_cmd;
+-      bool is_running;
+-
+-      if (test_bit(TCMU_CMD_BIT_EXPIRED, &cmd->flags))
+-              return 0;
+       if (!time_after(jiffies, cmd->deadline))
+-              return 0;
++              return;
+-      is_running = test_bit(TCMU_CMD_BIT_INFLIGHT, &cmd->flags);
++      set_bit(TCMU_CMD_BIT_EXPIRED, &cmd->flags);
++      list_del_init(&cmd->queue_entry);
+       se_cmd = cmd->se_cmd;
++      cmd->se_cmd = NULL;
+-      if (is_running) {
+-              /*
+-               * If cmd_time_out is disabled but qfull is set deadline
+-               * will only reflect the qfull timeout. Ignore it.
+-               */
+-              if (!udev->cmd_time_out)
+-                      return 0;
++      pr_debug("Timing out inflight cmd %u on dev %s.\n",
++               cmd->cmd_id, cmd->tcmu_dev->name);
+-              set_bit(TCMU_CMD_BIT_EXPIRED, &cmd->flags);
+-              /*
+-               * target_complete_cmd will translate this to LUN COMM FAILURE
+-               */
+-              scsi_status = SAM_STAT_CHECK_CONDITION;
+-              list_del_init(&cmd->queue_entry);
+-              cmd->se_cmd = NULL;
+-      } else {
+-              list_del_init(&cmd->queue_entry);
+-              idr_remove(&udev->commands, id);
+-              tcmu_free_cmd(cmd);
+-              scsi_status = SAM_STAT_TASK_SET_FULL;
+-      }
++      target_complete_cmd(se_cmd, SAM_STAT_CHECK_CONDITION);
++}
+-      pr_debug("Timing out cmd %u on dev %s that is %s.\n",
+-               id, udev->name, is_running ? "inflight" : "queued");
++static void tcmu_check_expired_queue_cmd(struct tcmu_cmd *cmd)
++{
++      struct se_cmd *se_cmd;
+-      target_complete_cmd(se_cmd, scsi_status);
+-      return 0;
++      if (!time_after(jiffies, cmd->deadline))
++              return;
++
++      list_del_init(&cmd->queue_entry);
++      se_cmd = cmd->se_cmd;
++      tcmu_free_cmd(cmd);
++
++      pr_debug("Timing out queued cmd %p on dev %s.\n",
++                cmd, cmd->tcmu_dev->name);
++
++      target_complete_cmd(se_cmd, SAM_STAT_TASK_SET_FULL);
+ }
+ static void tcmu_device_timedout(struct tcmu_dev *udev)
+@@ -1407,16 +1384,15 @@ static struct se_device *tcmu_alloc_device(struct se_hba *hba, const char *name)
+       return &udev->se_dev;
+ }
+-static bool run_qfull_queue(struct tcmu_dev *udev, bool fail)
++static void run_qfull_queue(struct tcmu_dev *udev, bool fail)
+ {
+       struct tcmu_cmd *tcmu_cmd, *tmp_cmd;
+       LIST_HEAD(cmds);
+-      bool drained = true;
+       sense_reason_t scsi_ret;
+       int ret;
+       if (list_empty(&udev->qfull_queue))
+-              return true;
++              return;
+       pr_debug("running %s's cmdr queue forcefail %d\n", udev->name, fail);
+@@ -1425,11 +1401,10 @@ static bool run_qfull_queue(struct tcmu_dev *udev, bool fail)
+       list_for_each_entry_safe(tcmu_cmd, tmp_cmd, &cmds, queue_entry) {
+               list_del_init(&tcmu_cmd->queue_entry);
+-              pr_debug("removing cmd %u on dev %s from queue\n",
+-                       tcmu_cmd->cmd_id, udev->name);
++              pr_debug("removing cmd %p on dev %s from queue\n",
++                       tcmu_cmd, udev->name);
+               if (fail) {
+-                      idr_remove(&udev->commands, tcmu_cmd->cmd_id);
+                       /*
+                        * We were not able to even start the command, so
+                        * fail with busy to allow a retry in case runner
+@@ -1444,10 +1419,8 @@ static bool run_qfull_queue(struct tcmu_dev *udev, bool fail)
+               ret = queue_cmd_ring(tcmu_cmd, &scsi_ret);
+               if (ret < 0) {
+-                      pr_debug("cmd %u on dev %s failed with %u\n",
+-                               tcmu_cmd->cmd_id, udev->name, scsi_ret);
+-
+-                      idr_remove(&udev->commands, tcmu_cmd->cmd_id);
++                      pr_debug("cmd %p on dev %s failed with %u\n",
++                               tcmu_cmd, udev->name, scsi_ret);
+                       /*
+                        * Ignore scsi_ret for now. target_complete_cmd
+                        * drops it.
+@@ -1462,13 +1435,11 @@ static bool run_qfull_queue(struct tcmu_dev *udev, bool fail)
+                        * the queue
+                        */
+                       list_splice_tail(&cmds, &udev->qfull_queue);
+-                      drained = false;
+                       break;
+               }
+       }
+       tcmu_set_next_deadline(&udev->qfull_queue, &udev->qfull_timer);
+-      return drained;
+ }
+ static int tcmu_irqcontrol(struct uio_info *info, s32 irq_on)
+@@ -1652,6 +1623,8 @@ static void tcmu_dev_kref_release(struct kref *kref)
+               if (tcmu_check_and_free_pending_cmd(cmd) != 0)
+                       all_expired = false;
+       }
++      if (!list_empty(&udev->qfull_queue))
++              all_expired = false;
+       idr_destroy(&udev->commands);
+       WARN_ON(!all_expired);
+@@ -2037,9 +2010,6 @@ static void tcmu_reset_ring(struct tcmu_dev *udev, u8 err_level)
+       mutex_lock(&udev->cmdr_lock);
+       idr_for_each_entry(&udev->commands, cmd, i) {
+-              if (!test_bit(TCMU_CMD_BIT_INFLIGHT, &cmd->flags))
+-                      continue;
+-
+               pr_debug("removing cmd %u on dev %s from ring (is expired %d)\n",
+                         cmd->cmd_id, udev->name,
+                         test_bit(TCMU_CMD_BIT_EXPIRED, &cmd->flags));
+@@ -2077,6 +2047,8 @@ static void tcmu_reset_ring(struct tcmu_dev *udev, u8 err_level)
+       del_timer(&udev->cmd_timer);
++      run_qfull_queue(udev, false);
++
+       mutex_unlock(&udev->cmdr_lock);
+ }
+@@ -2698,6 +2670,7 @@ static void find_free_blocks(void)
+ static void check_timedout_devices(void)
+ {
+       struct tcmu_dev *udev, *tmp_dev;
++      struct tcmu_cmd *cmd, *tmp_cmd;
+       LIST_HEAD(devs);
+       spin_lock_bh(&timed_out_udevs_lock);
+@@ -2708,9 +2681,24 @@ static void check_timedout_devices(void)
+               spin_unlock_bh(&timed_out_udevs_lock);
+               mutex_lock(&udev->cmdr_lock);
+-              idr_for_each(&udev->commands, tcmu_check_expired_cmd, NULL);
+-              tcmu_set_next_deadline(&udev->inflight_queue, &udev->cmd_timer);
++              /*
++               * If cmd_time_out is disabled but qfull is set deadline
++               * will only reflect the qfull timeout. Ignore it.
++               */
++              if (udev->cmd_time_out) {
++                      list_for_each_entry_safe(cmd, tmp_cmd,
++                                               &udev->inflight_queue,
++                                               queue_entry) {
++                              tcmu_check_expired_ring_cmd(cmd);
++                      }
++                      tcmu_set_next_deadline(&udev->inflight_queue,
++                                             &udev->cmd_timer);
++              }
++              list_for_each_entry_safe(cmd, tmp_cmd, &udev->qfull_queue,
++                                       queue_entry) {
++                      tcmu_check_expired_queue_cmd(cmd);
++              }
+               tcmu_set_next_deadline(&udev->qfull_queue, &udev->qfull_timer);
+               mutex_unlock(&udev->cmdr_lock);
+-- 
+2.25.1
+
diff --git a/queue-5.7/scsi-ufs-bsg-fix-runtime-pm-imbalance-on-error.patch b/queue-5.7/scsi-ufs-bsg-fix-runtime-pm-imbalance-on-error.patch
new file mode 100644 (file)
index 0000000..94fdf2b
--- /dev/null
@@ -0,0 +1,41 @@
+From a3c8a648062656464037701a3264f4bd2f72f3cd Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 22 May 2020 12:59:29 +0800
+Subject: scsi: ufs-bsg: Fix runtime PM imbalance on error
+
+From: Dinghao Liu <dinghao.liu@zju.edu.cn>
+
+[ Upstream commit a1e17eb03e69bb61bd1b1a14610436b7b9be12d9 ]
+
+When ufs_bsg_alloc_desc_buffer() returns an error code, a pairing runtime
+PM usage counter decrement is needed to keep the counter balanced.
+
+Link: https://lore.kernel.org/r/20200522045932.31795-1-dinghao.liu@zju.edu.cn
+Fixes: 74e5e468b664 (scsi: ufs-bsg: Wake the device before sending raw upiu commands)
+Reviewed-by: Avri Altman <avri.altman@wdc.com>
+Signed-off-by: Dinghao Liu <dinghao.liu@zju.edu.cn>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/scsi/ufs/ufs_bsg.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/scsi/ufs/ufs_bsg.c b/drivers/scsi/ufs/ufs_bsg.c
+index 53dd87628cbe4..516a7f573942f 100644
+--- a/drivers/scsi/ufs/ufs_bsg.c
++++ b/drivers/scsi/ufs/ufs_bsg.c
+@@ -106,8 +106,10 @@ static int ufs_bsg_request(struct bsg_job *job)
+               desc_op = bsg_request->upiu_req.qr.opcode;
+               ret = ufs_bsg_alloc_desc_buffer(hba, job, &desc_buff,
+                                               &desc_len, desc_op);
+-              if (ret)
++              if (ret) {
++                      pm_runtime_put_sync(hba->dev);
+                       goto out;
++              }
+               /* fall through */
+       case UPIU_TRANSACTION_NOP_OUT:
+-- 
+2.25.1
+
diff --git a/queue-5.7/scsi-ufs-don-t-update-urgent-bkops-level-when-toggli.patch b/queue-5.7/scsi-ufs-don-t-update-urgent-bkops-level-when-toggli.patch
new file mode 100644 (file)
index 0000000..140c716
--- /dev/null
@@ -0,0 +1,41 @@
+From 950a5908e8514236b7c0d8cec63c97dfa7d0aed4 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 27 May 2020 19:24:42 -0700
+Subject: scsi: ufs: Don't update urgent bkops level when toggling auto bkops
+
+From: Can Guo <cang@codeaurora.org>
+
+[ Upstream commit be32acff43800c87dc5c707f5d47cc607b76b653 ]
+
+Urgent bkops level is used to compare against actual bkops status read from
+UFS device. Urgent bkops level is set during initialization and might be
+updated in exception event handler during runtime. But it should not be
+updated to the actual bkops status every time when auto bkops is toggled.
+Otherwise, if urgent bkops level is updated to 0, auto bkops shall always
+be kept enabled.
+
+Link: https://lore.kernel.org/r/1590632686-17866-1-git-send-email-cang@codeaurora.org
+Fixes: 24366c2afbb0 ("scsi: ufs: Recheck bkops level if bkops is disabled")
+Reviewed-by: Stanley Chu <stanley.chu@mediatek.com>
+Signed-off-by: Can Guo <cang@codeaurora.org>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/scsi/ufs/ufshcd.c | 1 -
+ 1 file changed, 1 deletion(-)
+
+diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
+index 698e8d20b4bac..52740b60d7869 100644
+--- a/drivers/scsi/ufs/ufshcd.c
++++ b/drivers/scsi/ufs/ufshcd.c
+@@ -5098,7 +5098,6 @@ static int ufshcd_bkops_ctrl(struct ufs_hba *hba,
+               err = ufshcd_enable_auto_bkops(hba);
+       else
+               err = ufshcd_disable_auto_bkops(hba);
+-      hba->urgent_bkops_lvl = curr_status;
+ out:
+       return err;
+ }
+-- 
+2.25.1
+
diff --git a/queue-5.7/scsi-ufs-qcom-fix-scheduling-while-atomic-issue.patch b/queue-5.7/scsi-ufs-qcom-fix-scheduling-while-atomic-issue.patch
new file mode 100644 (file)
index 0000000..e2dd870
--- /dev/null
@@ -0,0 +1,54 @@
+From 73e92cb5f69eaa5fcd17fad297e9a86446491c87 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 25 May 2020 13:41:25 -0700
+Subject: scsi: ufs-qcom: Fix scheduling while atomic issue
+
+From: Jeffrey Hugo <jeffrey.l.hugo@gmail.com>
+
+[ Upstream commit 3be60b564de49875e47974c37fabced893cd0931 ]
+
+ufs_qcom_dump_dbg_regs() uses usleep_range, a sleeping function, but can be
+called from atomic context in the following flow:
+
+ufshcd_intr -> ufshcd_sl_intr -> ufshcd_check_errors ->
+ufshcd_print_host_regs -> ufshcd_vops_dbg_register_dump ->
+ufs_qcom_dump_dbg_regs
+
+This causes a boot crash on the Lenovo Miix 630 when the interrupt is
+handled on the idle thread.
+
+Fix the issue by switching to udelay().
+
+Link: https://lore.kernel.org/r/20200525204125.46171-1-jeffrey.l.hugo@gmail.com
+Fixes: 9c46b8676271 ("scsi: ufs-qcom: dump additional testbus registers")
+Reviewed-by: Bean Huo <beanhuo@micron.com>
+Reviewed-by: Avri Altman <avri.altman@wdc.com>
+Signed-off-by: Jeffrey Hugo <jeffrey.l.hugo@gmail.com>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/scsi/ufs/ufs-qcom.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/scsi/ufs/ufs-qcom.c b/drivers/scsi/ufs/ufs-qcom.c
+index 19aa5c44e0da6..f938867301a05 100644
+--- a/drivers/scsi/ufs/ufs-qcom.c
++++ b/drivers/scsi/ufs/ufs-qcom.c
+@@ -1658,11 +1658,11 @@ static void ufs_qcom_dump_dbg_regs(struct ufs_hba *hba)
+       /* sleep a bit intermittently as we are dumping too much data */
+       ufs_qcom_print_hw_debug_reg_all(hba, NULL, ufs_qcom_dump_regs_wrapper);
+-      usleep_range(1000, 1100);
++      udelay(1000);
+       ufs_qcom_testbus_read(hba);
+-      usleep_range(1000, 1100);
++      udelay(1000);
+       ufs_qcom_print_unipro_testbus(hba);
+-      usleep_range(1000, 1100);
++      udelay(1000);
+ }
+ /**
+-- 
+2.25.1
+
diff --git a/queue-5.7/scsi-ufs-ti-j721e-ufs-fix-unwinding-of-pm_runtime-ch.patch b/queue-5.7/scsi-ufs-ti-j721e-ufs-fix-unwinding-of-pm_runtime-ch.patch
new file mode 100644 (file)
index 0000000..ad52ecd
--- /dev/null
@@ -0,0 +1,71 @@
+From b27b33fb673009f0217bb3246dccb9c7fff036e2 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 26 May 2020 15:33:40 +0530
+Subject: scsi: ufs: ti-j721e-ufs: Fix unwinding of pm_runtime changes
+
+From: Vignesh Raghavendra <vigneshr@ti.com>
+
+[ Upstream commit 22617e21633142dd2b81541cb3b95d6fb59aa85f ]
+
+Fix unwinding of pm_runtime changes when bailing out of driver probe due to
+a failure and also on removal of driver.
+
+Link: https://lore.kernel.org/r/20200526100340.15032-1-vigneshr@ti.com
+Fixes: 6979e56cec97 ("scsi: ufs: Add driver for TI wrapper for Cadence UFS IP")
+Reported-by: Dinghao Liu <dinghao.liu@zju.edu.cn>
+Signed-off-by: Vignesh Raghavendra <vigneshr@ti.com>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/scsi/ufs/ti-j721e-ufs.c | 13 ++++++++++---
+ 1 file changed, 10 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/scsi/ufs/ti-j721e-ufs.c b/drivers/scsi/ufs/ti-j721e-ufs.c
+index 5216d228cdd9a..46bb905b4d6a9 100644
+--- a/drivers/scsi/ufs/ti-j721e-ufs.c
++++ b/drivers/scsi/ufs/ti-j721e-ufs.c
+@@ -32,14 +32,14 @@ static int ti_j721e_ufs_probe(struct platform_device *pdev)
+       ret = pm_runtime_get_sync(dev);
+       if (ret < 0) {
+               pm_runtime_put_noidle(dev);
+-              return ret;
++              goto disable_pm;
+       }
+       /* Select MPHY refclk frequency */
+       clk = devm_clk_get(dev, NULL);
+       if (IS_ERR(clk)) {
+               dev_err(dev, "Cannot claim MPHY clock.\n");
+-              return PTR_ERR(clk);
++              goto clk_err;
+       }
+       clk_rate = clk_get_rate(clk);
+       if (clk_rate == 26000000)
+@@ -54,16 +54,23 @@ static int ti_j721e_ufs_probe(struct platform_device *pdev)
+                                  dev);
+       if (ret) {
+               dev_err(dev, "failed to populate child nodes %d\n", ret);
+-              pm_runtime_put_sync(dev);
++              goto clk_err;
+       }
+       return ret;
++
++clk_err:
++      pm_runtime_put_sync(dev);
++disable_pm:
++      pm_runtime_disable(dev);
++      return ret;
+ }
+ static int ti_j721e_ufs_remove(struct platform_device *pdev)
+ {
+       of_platform_depopulate(&pdev->dev);
+       pm_runtime_put_sync(&pdev->dev);
++      pm_runtime_disable(&pdev->dev);
+       return 0;
+ }
+-- 
+2.25.1
+
diff --git a/queue-5.7/scsi-vhost-notify-tcm-about-the-maximum-sg-entries-s.patch b/queue-5.7/scsi-vhost-notify-tcm-about-the-maximum-sg-entries-s.patch
new file mode 100644 (file)
index 0000000..5caee40
--- /dev/null
@@ -0,0 +1,47 @@
+From 635e6f75ca2030add5b57c229cf9300ce0d36c1e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 22 May 2020 16:51:57 +0000
+Subject: scsi: vhost: Notify TCM about the maximum sg entries supported per
+ command
+
+From: Sudhakar Panneerselvam <sudhakar.panneerselvam@oracle.com>
+
+[ Upstream commit 5ae6a6a915033bfee79e76e0c374d4f927909edc ]
+
+vhost-scsi pre-allocates the maximum sg entries per command and if a
+command requires more than VHOST_SCSI_PREALLOC_SGLS entries, then that
+command is failed by it. This patch lets vhost communicate the max sg limit
+when it registers vhost_scsi_ops with TCM. With this change, TCM would
+report the max sg entries through "Block Limits" VPD page which will be
+typically queried by the SCSI initiator during device discovery. By knowing
+this limit, the initiator could ensure the maximum transfer length is less
+than or equal to what is reported by vhost-scsi.
+
+Link: https://lore.kernel.org/r/1590166317-953-1-git-send-email-sudhakar.panneerselvam@oracle.com
+Cc: Michael S. Tsirkin <mst@redhat.com>
+Cc: Jason Wang <jasowang@redhat.com>
+Cc: Paolo Bonzini <pbonzini@redhat.com>
+Cc: Stefan Hajnoczi <stefanha@redhat.com>
+Reviewed-by: Mike Christie <mchristi@redhat.com>
+Signed-off-by: Sudhakar Panneerselvam <sudhakar.panneerselvam@oracle.com>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/vhost/scsi.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/vhost/scsi.c b/drivers/vhost/scsi.c
+index c39952243fd32..8b104f76f3245 100644
+--- a/drivers/vhost/scsi.c
++++ b/drivers/vhost/scsi.c
+@@ -2280,6 +2280,7 @@ static struct configfs_attribute *vhost_scsi_wwn_attrs[] = {
+ static const struct target_core_fabric_ops vhost_scsi_ops = {
+       .module                         = THIS_MODULE,
+       .fabric_name                    = "vhost",
++      .max_data_sg_nents              = VHOST_SCSI_PREALLOC_SGLS,
+       .tpg_get_wwn                    = vhost_scsi_get_fabric_wwn,
+       .tpg_get_tag                    = vhost_scsi_get_tpgt,
+       .tpg_check_demo_mode            = vhost_scsi_check_true,
+-- 
+2.25.1
+
diff --git a/queue-5.7/selftests-net-in-timestamping-strncpy-needs-to-prese.patch b/queue-5.7/selftests-net-in-timestamping-strncpy-needs-to-prese.patch
new file mode 100644 (file)
index 0000000..87367a7
--- /dev/null
@@ -0,0 +1,68 @@
+From dc344ba6c7b921d5d0086c5b90a658cf7f9eb931 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 8 Jun 2020 15:37:15 -0400
+Subject: selftests/net: in timestamping, strncpy needs to preserve null byte
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: tannerlove <tannerlove@google.com>
+
+[ Upstream commit 8027bc0307ce59759b90679fa5d8b22949586d20 ]
+
+If user passed an interface option longer than 15 characters, then
+device.ifr_name and hwtstamp.ifr_name became non-null-terminated
+strings. The compiler warned about this:
+
+timestamping.c:353:2: warning: ‘strncpy’ specified bound 16 equals \
+destination size [-Wstringop-truncation]
+  353 |  strncpy(device.ifr_name, interface, sizeof(device.ifr_name));
+
+Fixes: cb9eff097831 ("net: new user space API for time stamping of incoming and outgoing packets")
+Signed-off-by: Tanner Love <tannerlove@google.com>
+Acked-by: Willem de Bruijn <willemb@google.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ tools/testing/selftests/net/timestamping.c | 10 ++++++++--
+ 1 file changed, 8 insertions(+), 2 deletions(-)
+
+diff --git a/tools/testing/selftests/net/timestamping.c b/tools/testing/selftests/net/timestamping.c
+index aca3491174a1e..f4bb4fef0f399 100644
+--- a/tools/testing/selftests/net/timestamping.c
++++ b/tools/testing/selftests/net/timestamping.c
+@@ -313,10 +313,16 @@ int main(int argc, char **argv)
+       int val;
+       socklen_t len;
+       struct timeval next;
++      size_t if_len;
+       if (argc < 2)
+               usage(0);
+       interface = argv[1];
++      if_len = strlen(interface);
++      if (if_len >= IFNAMSIZ) {
++              printf("interface name exceeds IFNAMSIZ\n");
++              exit(1);
++      }
+       for (i = 2; i < argc; i++) {
+               if (!strcasecmp(argv[i], "SO_TIMESTAMP"))
+@@ -350,12 +356,12 @@ int main(int argc, char **argv)
+               bail("socket");
+       memset(&device, 0, sizeof(device));
+-      strncpy(device.ifr_name, interface, sizeof(device.ifr_name));
++      memcpy(device.ifr_name, interface, if_len + 1);
+       if (ioctl(sock, SIOCGIFADDR, &device) < 0)
+               bail("getting interface IP address");
+       memset(&hwtstamp, 0, sizeof(hwtstamp));
+-      strncpy(hwtstamp.ifr_name, interface, sizeof(hwtstamp.ifr_name));
++      memcpy(hwtstamp.ifr_name, interface, if_len + 1);
+       hwtstamp.ifr_data = (void *)&hwconfig;
+       memset(&hwconfig, 0, sizeof(hwconfig));
+       hwconfig.tx_type =
+-- 
+2.25.1
+
diff --git a/queue-5.7/selftests-timens-handle-a-case-when-alarm-clocks-are.patch b/queue-5.7/selftests-timens-handle-a-case-when-alarm-clocks-are.patch
new file mode 100644 (file)
index 0000000..d1093ab
--- /dev/null
@@ -0,0 +1,133 @@
+From b0d32101d570567ae345eeab5118081daa152535 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 21 May 2020 00:52:52 -0700
+Subject: selftests/timens: handle a case when alarm clocks are not supported
+
+From: Andrei Vagin <avagin@gmail.com>
+
+[ Upstream commit 558ae0355a91c7d28fdf4c0011bee6ebb5118632 ]
+
+This can happen if a testing node doesn't have RTC (real time clock)
+hardware or it doesn't support alarms.
+
+Fixes: 61c57676035d ("selftests/timens: Add Time Namespace test for supported clocks")
+Acked-by: Vincenzo Frascino <vincenzo.frascino@arm.com>
+Reported-by: Vincenzo Frascino <vincenzo.frascino@arm.com>
+Signed-off-by: Andrei Vagin <avagin@gmail.com>
+Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ tools/testing/selftests/timens/clock_nanosleep.c |  2 +-
+ tools/testing/selftests/timens/timens.c          |  2 +-
+ tools/testing/selftests/timens/timens.h          | 13 ++++++++++++-
+ tools/testing/selftests/timens/timer.c           |  5 +++++
+ tools/testing/selftests/timens/timerfd.c         |  5 +++++
+ 5 files changed, 24 insertions(+), 3 deletions(-)
+
+diff --git a/tools/testing/selftests/timens/clock_nanosleep.c b/tools/testing/selftests/timens/clock_nanosleep.c
+index 8e7b7c72ef65f..72d41b955fb22 100644
+--- a/tools/testing/selftests/timens/clock_nanosleep.c
++++ b/tools/testing/selftests/timens/clock_nanosleep.c
+@@ -119,7 +119,7 @@ int main(int argc, char *argv[])
+       ksft_set_plan(4);
+-      check_config_posix_timers();
++      check_supported_timers();
+       if (unshare_timens())
+               return 1;
+diff --git a/tools/testing/selftests/timens/timens.c b/tools/testing/selftests/timens/timens.c
+index 098be7c83be3e..52b6a1185f52a 100644
+--- a/tools/testing/selftests/timens/timens.c
++++ b/tools/testing/selftests/timens/timens.c
+@@ -155,7 +155,7 @@ int main(int argc, char *argv[])
+       nscheck();
+-      check_config_posix_timers();
++      check_supported_timers();
+       ksft_set_plan(ARRAY_SIZE(clocks) * 2);
+diff --git a/tools/testing/selftests/timens/timens.h b/tools/testing/selftests/timens/timens.h
+index e09e7e39bc52f..d4fc52d471462 100644
+--- a/tools/testing/selftests/timens/timens.h
++++ b/tools/testing/selftests/timens/timens.h
+@@ -14,15 +14,26 @@
+ #endif
+ static int config_posix_timers = true;
++static int config_alarm_timers = true;
+-static inline void check_config_posix_timers(void)
++static inline void check_supported_timers(void)
+ {
++      struct timespec ts;
++
+       if (timer_create(-1, 0, 0) == -1 && errno == ENOSYS)
+               config_posix_timers = false;
++
++      if (clock_gettime(CLOCK_BOOTTIME_ALARM, &ts) == -1 && errno == EINVAL)
++              config_alarm_timers = false;
+ }
+ static inline bool check_skip(int clockid)
+ {
++      if (!config_alarm_timers && clockid == CLOCK_BOOTTIME_ALARM) {
++              ksft_test_result_skip("CLOCK_BOOTTIME_ALARM isn't supported\n");
++              return true;
++      }
++
+       if (config_posix_timers)
+               return false;
+diff --git a/tools/testing/selftests/timens/timer.c b/tools/testing/selftests/timens/timer.c
+index 96dba11ebe446..5e7f0051bd7be 100644
+--- a/tools/testing/selftests/timens/timer.c
++++ b/tools/testing/selftests/timens/timer.c
+@@ -22,6 +22,9 @@ int run_test(int clockid, struct timespec now)
+       timer_t fd;
+       int i;
++      if (check_skip(clockid))
++              return 0;
++
+       for (i = 0; i < 2; i++) {
+               struct sigevent sevp = {.sigev_notify = SIGEV_NONE};
+               int flags = 0;
+@@ -74,6 +77,8 @@ int main(int argc, char *argv[])
+       nscheck();
++      check_supported_timers();
++
+       ksft_set_plan(3);
+       clock_gettime(CLOCK_MONOTONIC, &mtime_now);
+diff --git a/tools/testing/selftests/timens/timerfd.c b/tools/testing/selftests/timens/timerfd.c
+index eff1ec5ff215b..9edd43d6b2c13 100644
+--- a/tools/testing/selftests/timens/timerfd.c
++++ b/tools/testing/selftests/timens/timerfd.c
+@@ -28,6 +28,9 @@ int run_test(int clockid, struct timespec now)
+       long long elapsed;
+       int fd, i;
++      if (check_skip(clockid))
++              return 0;
++
+       if (tclock_gettime(clockid, &now))
+               return pr_perror("clock_gettime(%d)", clockid);
+@@ -81,6 +84,8 @@ int main(int argc, char *argv[])
+       nscheck();
++      check_supported_timers();
++
+       ksft_set_plan(3);
+       clock_gettime(CLOCK_MONOTONIC, &mtime_now);
+-- 
+2.25.1
+
diff --git a/queue-5.7/selftests-vm-pkeys-fix-alloc_random_pkey-to-make-it-.patch b/queue-5.7/selftests-vm-pkeys-fix-alloc_random_pkey-to-make-it-.patch
new file mode 100644 (file)
index 0000000..4d05e36
--- /dev/null
@@ -0,0 +1,60 @@
+From 30546027755086d27369f109952debd202697ce1 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 4 Jun 2020 16:52:05 -0700
+Subject: selftests/vm/pkeys: fix alloc_random_pkey() to make it really random
+
+From: Ram Pai <linuxram@us.ibm.com>
+
+[ Upstream commit 6e373263ce07eeaa6410843179535fbdf561fc31 ]
+
+alloc_random_pkey() was allocating the same pkey every time.  Not all
+pkeys were geting tested.  This fixes it.
+
+Signed-off-by: Ram Pai <linuxram@us.ibm.com>
+Signed-off-by: Sandipan Das <sandipan@linux.ibm.com>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Acked-by: Dave Hansen <dave.hansen@intel.com>
+Cc: Dave Hansen <dave.hansen@intel.com>
+Cc: Florian Weimer <fweimer@redhat.com>
+Cc: "Desnes A. Nunes do Rosario" <desnesn@linux.vnet.ibm.com>
+Cc: Ingo Molnar <mingo@kernel.org>
+Cc: Thiago Jung Bauermann <bauerman@linux.ibm.com>
+Cc: "Aneesh Kumar K.V" <aneesh.kumar@linux.ibm.com>
+Cc: Michael Ellerman <mpe@ellerman.id.au>
+Cc: Michal Hocko <mhocko@kernel.org>
+Cc: Michal Suchanek <msuchanek@suse.de>
+Cc: Shuah Khan <shuah@kernel.org>
+Link: http://lkml.kernel.org/r/0162f55816d4e783a0d6e49e554d0ab9a3c9a23b.1585646528.git.sandipan@linux.ibm.com
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ tools/testing/selftests/x86/protection_keys.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/tools/testing/selftests/x86/protection_keys.c b/tools/testing/selftests/x86/protection_keys.c
+index 480995bceefa5..47191af466174 100644
+--- a/tools/testing/selftests/x86/protection_keys.c
++++ b/tools/testing/selftests/x86/protection_keys.c
+@@ -24,6 +24,7 @@
+ #define _GNU_SOURCE
+ #include <errno.h>
+ #include <linux/futex.h>
++#include <time.h>
+ #include <sys/time.h>
+ #include <sys/syscall.h>
+ #include <string.h>
+@@ -612,10 +613,10 @@ int alloc_random_pkey(void)
+       int nr_alloced = 0;
+       int random_index;
+       memset(alloced_pkeys, 0, sizeof(alloced_pkeys));
++      srand((unsigned int)time(NULL));
+       /* allocate every possible key and make a note of which ones we got */
+       max_nr_pkey_allocs = NR_PKEYS;
+-      max_nr_pkey_allocs = 1;
+       for (i = 0; i < max_nr_pkey_allocs; i++) {
+               int new_pkey = alloc_pkey();
+               if (new_pkey < 0)
+-- 
+2.25.1
+
diff --git a/queue-5.7/serial-8250-fix-max-baud-limit-in-generic-8250-port.patch b/queue-5.7/serial-8250-fix-max-baud-limit-in-generic-8250-port.patch
new file mode 100644 (file)
index 0000000..72a3602
--- /dev/null
@@ -0,0 +1,81 @@
+From 3cd98e58f60890411bb46a83d3fdf8f077e61c1b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 7 May 2020 02:31:32 +0300
+Subject: serial: 8250: Fix max baud limit in generic 8250 port
+
+From: Serge Semin <Sergey.Semin@baikalelectronics.ru>
+
+[ Upstream commit 7b668c064ec33f3d687c3a413d05e355172e6c92 ]
+
+Standard 8250 UART ports are designed in a way so they can communicate
+with baud rates up to 1/16 of a reference frequency. It's expected from
+most of the currently supported UART controllers. That's why the former
+version of serial8250_get_baud_rate() method called uart_get_baud_rate()
+with min and max baud rates passed as (port->uartclk / 16 / UART_DIV_MAX)
+and ((port->uartclk + tolerance) / 16) respectively. Doing otherwise, like
+it was suggested in commit ("serial: 8250_mtk: support big baud rate."),
+caused acceptance of bauds, which was higher than the normal UART
+controllers actually supported. As a result if some user-space program
+requested to set a baud greater than (uartclk / 16) it would have been
+permitted without truncation, but then serial8250_get_divisor(baud)
+(which calls uart_get_divisor() to get the reference clock divisor) would
+have returned a zero divisor. Setting zero divisor will cause an
+unpredictable effect varying from chip to chip. In case of DW APB UART the
+communications just stop.
+
+Lets fix this problem by getting back the limitation of (uartclk +
+tolerance) / 16 maximum baud supported by the generic 8250 port. Mediatek
+8250 UART ports driver developer shouldn't have touched it in the first
+place  notably seeing he already provided a custom version of set_termios()
+callback in that glue-driver which took into account the extended baud
+rate values and accordingly updated the standard and vendor-specific
+divisor latch registers anyway.
+
+Fixes: 81bb549fdf14 ("serial: 8250_mtk: support big baud rate.")
+Signed-off-by: Serge Semin <Sergey.Semin@baikalelectronics.ru>
+Cc: Alexey Malahov <Alexey.Malahov@baikalelectronics.ru>
+Cc: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
+Cc: Paul Burton <paulburton@kernel.org>
+Cc: Ralf Baechle <ralf@linux-mips.org>
+Cc: Arnd Bergmann <arnd@arndb.de>
+Cc: Long Cheng <long.cheng@mediatek.com>
+Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
+Cc: Maxime Ripard <mripard@kernel.org>
+Cc: Catalin Marinas <catalin.marinas@arm.com>
+Cc: Will Deacon <will@kernel.org>
+Cc: Russell King <linux@armlinux.org.uk>
+Cc: linux-mips@vger.kernel.org
+Cc: linux-arm-kernel@lists.infradead.org
+Cc: linux-mediatek@lists.infradead.org
+Link: https://lore.kernel.org/r/20200506233136.11842-2-Sergey.Semin@baikalelectronics.ru
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/tty/serial/8250/8250_port.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/tty/serial/8250/8250_port.c b/drivers/tty/serial/8250/8250_port.c
+index f77bf820b7a30..4d83c85a7389b 100644
+--- a/drivers/tty/serial/8250/8250_port.c
++++ b/drivers/tty/serial/8250/8250_port.c
+@@ -2615,6 +2615,8 @@ static unsigned int serial8250_get_baud_rate(struct uart_port *port,
+                                            struct ktermios *termios,
+                                            struct ktermios *old)
+ {
++      unsigned int tolerance = port->uartclk / 100;
++
+       /*
+        * Ask the core to calculate the divisor for us.
+        * Allow 1% tolerance at the upper limit so uart clks marginally
+@@ -2623,7 +2625,7 @@ static unsigned int serial8250_get_baud_rate(struct uart_port *port,
+        */
+       return uart_get_baud_rate(port, termios, old,
+                                 port->uartclk / 16 / UART_DIV_MAX,
+-                                port->uartclk);
++                                (port->uartclk + tolerance) / 16);
+ }
+ void
+-- 
+2.25.1
+
diff --git a/queue-5.7/series b/queue-5.7/series
new file mode 100644 (file)
index 0000000..d523fc8
--- /dev/null
@@ -0,0 +1,416 @@
+staging-wfx-fix-potential-deadlock-in-wfx_tx_flush.patch
+power-supply-bq24257_charger-replace-depends-on-regm.patch
+clk-sunxi-fix-incorrect-usage-of-round_down.patch
+asoc-tegra-tegra_wm8903-support-nvidia-headset-prope.patch
+rtc-rc5t619-fix-an-err_ptr-vs-null-check.patch
+i2c-piix4-detect-secondary-smbus-controller-on-amd-a.patch
+asoc-sof-imx8-fix-randbuild-error.patch
+iio-pressure-bmp280-tolerate-irq-before-registering.patch
+remoteproc-fix-idr-initialisation-in-rproc_alloc.patch
+clk-qcom-msm8916-fix-the-address-location-of-pll-con.patch
+staging-wfx-check-ssidlen-and-prevent-an-array-overf.patch
+asoc-fsl_esai-disable-exception-interrupt-before-sch.patch
+backlight-lp855x-ensure-regulators-are-disabled-on-p.patch
+arm-dts-renesas-fix-iommu-device-node-names.patch
+asoc-davinci-mcasp-fix-dma_chan-refcnt-leak-when-get.patch
+arm-integrator-add-some-kconfig-selections.patch
+arm-dts-stm32-add-missing-ethernet-phy-reset-on-av96.patch
+arm64-dts-renesas-fix-iommu-device-node-names.patch
+asoc-codecs-wm97xx-fix-ac97-dependency.patch
+arm64-dts-meson-gxbb-kii-pro-fix-board-compatible.patch
+scsi-core-free-sgtables-in-case-command-setup-fails.patch
+scsi-qedi-check-for-buffer-overflow-in-qedi_set_path.patch
+arm64-dts-meson-fixup-scp-sram-nodes.patch
+alsa-hda-realtek-introduce-polarity-for-micmute-led-.patch
+alsa-isa-wavefront-prevent-out-of-bounds-write-in-io.patch
+pci-allow-pci_resize_resource-for-devices-on-root-bu.patch
+pci-endpoint-functions-pci-epf-test-fix-dma-channel-.patch
+scsi-qla2xxx-fix-issue-with-adapter-s-stopping-state.patch
+input-edt-ft5x06-fix-get_default-register-write-acce.patch
+pci-brcmstb-fix-window-register-offset-from-4-to-8.patch
+powerpc-kasan-fix-stack-overflow-by-increasing-threa.patch
+rtc-mc13xxx-fix-a-double-unlock-issue.patch
+iio-bmp280-fix-compensation-of-humidity.patch
+f2fs-compress-let-lz4-compressor-handle-output-buffe.patch
+f2fs-report-delalloc-reserve-as-non-free-in-statfs-f.patch
+i2c-pxa-clear-all-master-action-bits-in-i2c_pxa_stop.patch
+remoteproc-qcom_q6v5_mss-map-unmap-mpss-segments-bef.patch
+clk-samsung-mark-top-isp-and-cam-clocks-on-exynos542.patch
+staging-wfx-fix-output-of-rx_stats-on-big-endian-hos.patch
+usblp-poison-urbs-upon-disconnect.patch
+usb-roles-switch-on-role-switch-uevent-reporting.patch
+serial-8250-fix-max-baud-limit-in-generic-8250-port.patch
+nvmem-ensure-sysfs-writes-handle-write-protect-pin.patch
+misc-fastrpc-fix-an-incomplete-memory-release-in-fas.patch
+misc-fastrpc-fix-potential-fastrpc_invoke_ctx-leak.patch
+dm-mpath-switch-paths-in-dm_blk_ioctl-code-path.patch
+arm64-dts-armada-3720-turris-mox-forbid-sdr104-on-sd.patch
+arm64-dts-armada-3720-turris-mox-fix-sfp-binding.patch
+arm64-dts-juno-fix-gic-child-nodes.patch
+rdma-uverbs-fix-create-wq-to-use-the-given-user-hand.patch
+rdma-srpt-fix-disabling-device-management.patch
+pinctrl-ocelot-fix-gpio-interrupt-decoding-on-jaguar.patch
+clk-renesas-cpg-mssr-fix-stbcr-suspend-resume-handli.patch
+asoc-sof-do-nothing-when-dsp-pm-callbacks-are-not-se.patch
+arm64-dts-fvp-fix-gic-child-nodes.patch
+pci-aardvark-don-t-blindly-enable-aspm-l0s-and-don-t.patch
+ps3disk-use-the-default-segment-boundary.patch
+arm64-dts-fvp-juno-fix-node-address-fields.patch
+vfio-pci-fix-memory-leaks-in-alloc_perm_bits.patch
+arm64-dts-qcom-sc7180-correct-the-pdc-interrupt-rang.patch
+coresight-tmc-fix-tmc-mode-read-in-tmc_read_prepare_.patch
+rdma-mlx5-add-init2init-as-a-modify-command.patch
+scsi-hisi_sas-do-not-reset-phy-timer-to-wait-for-str.patch
+powerpc-book3s64-radix-tlb-determine-hugepage-flush-.patch
+pci-pci-bridge-emul-fix-pcie-bit-conflicts.patch
+m68k-pci-fix-a-memory-leak-in-an-error-handling-path.patch
+habanalabs-don-t-allow-hard-reset-with-open-processe.patch
+usb-cdns3-fix-runtime-pm-imbalance-on-error.patch
+gpio-dwapb-call-acpi_gpiochip_free_interrupts-on-gpi.patch
+usb-gadget-core-sync-interrupt-before-unbind-the-udc.patch
+powerpc-ptdump-add-_page_coherent-flag.patch
+mfd-wm8994-fix-driver-operation-if-loaded-as-modules.patch
+scsi-cxgb3i-fix-some-leaks-in-init_act_open.patch
+clk-zynqmp-fix-memory-leak-in-zynqmp_register_clocks.patch
+scsi-lpfc-fix-lpfc_nodelist-leak-when-processing-uns.patch
+scsi-vhost-notify-tcm-about-the-maximum-sg-entries-s.patch
+clk-clk-flexgen-fix-clock-critical-handling.patch
+ib-mlx5-fix-devx-support-for-mlx5_cmd_op_init2init_q.patch
+powerpc-perf-hv-24x7-fix-inconsistent-output-values-.patch
+nfsd-fix-svc_xprt-refcnt-leak-when-setup-callback-cl.patch
+pci-vmd-filter-resource-type-bits-from-shadow-regist.patch
+rdma-core-fix-several-reference-count-leaks.patch
+cifs-set-up-next-dfs-target-before-generic_ip_connec.patch
+asoc-qcom-q6asm-dai-kcfi-fix.patch
+powerpc-crashkernel-take-mem-option-into-account.patch
+pwm-img-call-pm_runtime_put-in-pm_runtime_get_sync-f.patch
+sparc32-mm-don-t-try-to-free-page-table-pages-if-cto.patch
+clk-sprd-fix-compile-testing.patch
+drm-nouveau-gr-gk20a-use-firmware-version-0.patch
+crypto-omap-sham-huge-buffer-access-fixes.patch
+yam-fix-possible-memory-leak-in-yam_init_driver.patch
+net-mdiobus-disable-preemption-upon-u64_stats-update.patch
+asoc-meson-fix-memory-leak-of-links-if-allocation-of.patch
+ntb-ntb_pingpong-choose-doorbells-based-on-port-numb.patch
+ntb-fix-the-default-port-and-peer-numbers-for-legacy.patch
+mksysmap-fix-the-mismatch-of-.l-symbols-in-system.ma.patch
+apparmor-fix-introspection-of-of-task-mode-for-uncon.patch
+net-dsa-lantiq_gswip-fix-and-improve-the-unsupported.patch
+apparmor-check-put-label-on-apparmor_sk_clone_securi.patch
+f2fs-handle-readonly-filesystem-in-f2fs_ioc_shutdown.patch
+xfs-add-the-missed-xfs_perag_put-for-xfs_ifree_clust.patch
+asoc-meson-add-missing-free_irq-in-error-path.patch
+bpf-sockhash-fix-memory-leak-when-unlinking-sockets-.patch
+scsi-sr-fix-sr_probe-missing-mutex_destroy.patch
+scsi-sr-fix-sr_probe-missing-deallocate-of-device-mi.patch
+scsi-ibmvscsi-don-t-send-host-info-in-adapter-info-m.patch
+media-s5p-mfc-properly-handle-dma_parms-for-the-allo.patch
+media-v4l2-ctrls-unset-correct-hevc-loop-filter-flag.patch
+ibmvnic-flush-existing-work-items-before-device-remo.patch
+bpf-tcp-recv-should-return-0-when-the-peer-socket-is.patch
+apparmor-fix-nnp-subset-test-for-unconfined.patch
+x86-purgatory-disable-various-profiling-and-sanitizi.patch
+arm-dts-bcm283x-use-firmware-pm-driver-for-v3d.patch
+arm64-dts-realtek-rtd129x-fix-gic-cpu-masks-for-rtd1.patch
+staging-greybus-fix-a-missing-check-bug-in-gb_lights.patch
+staging-rtl8712-fix-multiline-derefernce-warnings.patch
+staging-mt7621-pci-fix-pcie-interrupt-mapping.patch
+arm64-dts-mt8173-fix-unit-name-warnings.patch
+scsi-qedi-do-not-flush-offload-work-if-arp-not-resol.patch
+arm64-dts-qcom-msm8916-remove-unit-name-for-thermal-.patch
+arm-dts-sun8i-h2-plus-bananapi-m2-zero-fix-led-polar.patch
+rdma-mlx5-fix-udata-response-upon-srq-creation.patch
+alsa-usb-audio-rme-babyface-pro-mixer-patch.patch
+gpio-dwapb-append-module_alias-for-platform-driver.patch
+scsi-qedf-fix-crash-when-mfw-calls-for-protocol-stat.patch
+iio-buffer-dmaengine-use-zu-specifier-for-sprintf-al.patch
+pinctrl-rza1-fix-wrong-array-assignment-of-rza1l_swi.patch
+virtiofs-schedule-blocking-async-replies-in-separate.patch
+fuse-bug_on-correction-in-fuse_dev_splice_write.patch
+arm64-dts-qcom-fix-pm8150-gpio-interrupts.patch
+firmware-qcom_scm-fix-bogous-abuse-of-dma-direct-int.patch
+arm64-dts-qcom-sm8250-fix-pdc-compatible-and-reg.patch
+staging-gasket-fix-mapping-refcnt-leak-when-put-attr.patch
+staging-gasket-fix-mapping-refcnt-leak-when-register.patch
+alsa-usb-audio-improve-frames-size-computation.patch
+alsa-usb-audio-fix-racy-list-management-in-output-qu.patch
+input-mms114-add-extra-compatible-for-mms345l.patch
+s390-qdio-consistently-restore-the-irq-handler.patch
+s390-qdio-tear-down-thinint-indicator-after-early-er.patch
+s390-qdio-put-thinint-indicator-after-early-error.patch
+staging-wfx-fix-overflow-in-frame-counters.patch
+staging-wfx-fix-double-init-of-tx_policy_upload_work.patch
+tty-hvc-fix-data-abort-due-to-race-in-hvc_open.patch
+slimbus-ngd-get-drvdata-from-correct-device.patch
+gpio-mlxbf2-fix-return-value-check-in-mlxbf2_gpio_ge.patch
+of-property-fix-create-device-links-for-all-child-su.patch
+of-property-do-not-link-to-disabled-devices.patch
+clk-meson-meson8b-fix-the-first-parent-of-vid_pll_in.patch
+clk-meson-meson8b-fix-the-polarity-of-the-reset_n-li.patch
+clk-meson-meson8b-fix-the-vclk_div-1-2-4-6-12-_en-ga.patch
+gpio-pca953x-fix-handling-of-automatic-address-incre.patch
+asoc-component-suppress-uninitialized-variable-warni.patch
+thermal-drivers-ti-soc-thermal-avoid-dereferencing-e.patch
+asoc-rt5682-fix-i2c-soundwire-dependencies.patch
+arm64-dts-meson-g12b-ugoos-am6-fix-board-compatible.patch
+arm64-dts-meson-fix-leds-subnodes-name.patch
+asoc-sof-update-correct-led-status-at-the-first-time.patch
+clk-meson-meson8b-don-t-rely-on-u-boot-to-init-all-g.patch
+asoc-max98373-reorder-max98373_reset-in-resume.patch
+soundwire-slave-don-t-init-debugfs-on-device-registr.patch
+arm-dts-aspeed-ast2600-set-arch-timer-always-on.patch
+arm-dts-aspeed-change-kcs-nodes-to-v2-binding.patch
+hid-intel-ish-hid-avoid-bogus-uninitialized-variable.patch
+usb-dwc3-gadget-properly-handle-clearfeature-halt.patch
+usb-dwc3-meson-g12a-check-return-of-dwc3_meson_g12a_.patch
+usb-dwc3-gadget-properly-handle-failed-kick_transfer.patch
+staging-wilc1000-increase-the-size-of-wid_list-array.patch
+staging-sm750fb-add-missing-case-while-setting-fb_vi.patch
+staging-wfx-avoid-compiler-warning-on-empty-array.patch
+pci-v3-semi-fix-a-memory-leak-in-v3_pci_probe-error-.patch
+i2c-pxa-fix-i2c_pxa_scream_blue_murder-debug-output.patch
+drivers-base-fix-null-pointer-exception-in-__platfor.patch
+pci-rcar-fix-incorrect-programming-of-ob-windows.patch
+pci-aspm-allow-aspm-on-links-to-pcie-to-pci-pci-x-br.patch
+scsi-qla2xxx-fix-warning-after-fc-target-reset.patch
+alsa-firewire-lib-fix-invalid-assignment-to-union-da.patch
+power-supply-lp8788-fix-an-error-handling-path-in-lp.patch
+power-supply-smb347-charger-irqstat_d-is-volatile.patch
+pci-brcmstb-assert-fundamental-reset-on-initializati.patch
+asoc-sof-core-fix-error-return-code-in-sof_probe_con.patch
+remoteproc-mediatek-fix-invalid-use-of-sizeof-in-scp.patch
+arm64-dts-msm8996-fix-csi-irq-types.patch
+scsi-target-loopback-fix-read-with-data-and-sensebyt.patch
+scsi-mpt3sas-fix-double-free-warnings.patch
+f2fs-fix-wrong-stub-helper-update_sit_info.patch
+f2fs-fix-potential-use-after-free-issue.patch
+f2fs-compress-fix-zstd-data-corruption.patch
+um-do-not-evaluate-compiler-s-library-path-when-clea.patch
+unicore32-do-not-evaluate-compiler-s-library-path-wh.patch
+soc-rsnd-add-interrupt-support-for-ssi-busif-buffer.patch
+asoc-ux500-mop500-fix-some-refcounted-resources-issu.patch
+asoc-ti-omap-mcbsp-fix-an-error-handling-path-in-aso.patch
+pinctrl-rockchip-fix-memleak-in-rockchip_dt_node_to_.patch
+remoteproc-qcom_q6v5_mss-drop-accesses-to-mpss-perph.patch
+dlm-remove-bug-before-panic.patch
+phy-ti-j721e-wiz-fix-some-error-return-code-in-wiz_p.patch
+usb-ohci-sm501-fix-error-return-code-in-ohci_hcd_sm5.patch
+arm64-dts-qcom-db820c-fix-invalid-pm8994-supplies.patch
+arm64-dts-qcom-c630-add-wifi-node.patch
+clk-ti-composite-fix-memory-leak.patch
+pci-fix-pci_register_host_bridge-device_register-err.patch
+powerpc-64-don-t-initialise-init_task-thread.regs.patch
+tty-n_gsm-fix-sof-skipping.patch
+tty-n_gsm-fix-waking-up-upper-tty-layer-when-room-av.patch
+staging-wfx-fix-value-of-scan-timeout.patch
+alsa-usb-audio-fixing-upper-volume-limit-for-rme-bab.patch
+alsa-usb-audio-add-duplex-sound-support-for-usb-devi.patch
+hid-add-quirks-for-trust-panora-graphic-tablet.patch
+pci-pm-assume-ports-without-dll-link-active-train-li.patch
+habanalabs-increase-timeout-during-reset.patch
+arm64-dts-marvell-armada-37xx-set-pcie_reset_pin-to-.patch
+pinctrl-ocelot-always-register-gpio-driver.patch
+ipmi-use-vzalloc-instead-of-kmalloc-for-user-creatio.patch
+asoc-codecs-rt-sdw-fix-memory-leak-in-set_sdw_stream.patch
+powerpc-64s-exception-fix-machine-check-no-loss-idle.patch
+powerpc-64s-exceptions-machine-check-reconcile-irq-s.patch
+powerpc-pseries-ras-fix-fwnmi_valid-off-by-one.patch
+pci-aardvark-train-link-immediately-after-enabling-t.patch
+pci-aardvark-improve-link-training.patch
+pci-aardvark-issue-perst-via-gpio.patch
+drivers-phy-sr-usb-do-not-use-internal-fsm-for-usb2-.patch
+phy-cadence-sierra-fix-for-usb3-u1-u2-state.patch
+powerpc-ps3-fix-kexec-shutdown-hang.patch
+iommu-arm-smmu-v3-don-t-reserve-implementation-defin.patch
+vfio-pci-mask-cap-zero.patch
+usb-ohci-platform-fix-a-warning-when-hibernating.patch
+drm-msm-fix-undefined-rd_full-link-error.patch
+drm-msm-mdp5-fix-mdp5_init-error-path-for-failed-mdp.patch
+asoc-intel-bytcr_rt5640-add-quirk-for-toshiba-encore.patch
+usb-host-ehci-mxc-add-error-handling-in-ehci_mxc_drv.patch
+tty-n_gsm-fix-bogus-i-in-gsm_data_kick.patch
+coresight-fix-support-for-sparsely-populated-ports.patch
+coresight-etm4x-fix-use-after-free-of-per-cpu-etm-dr.patch
+fpga-dfl-afu-corrected-error-handling-levels.patch
+clk-samsung-exynos5433-add-ignore_unused-flag-to-scl.patch
+arm-dts-meson-switch-existing-boards-with-rgmii-phy-.patch
+rdma-hns-bugfix-for-querying-qkey.patch
+rdma-hns-fix-cmdq-parameter-of-querying-pf-timer-res.patch
+scsi-target-tcmu-userspace-must-not-complete-queued-.patch
+scsi-core-fix-incorrect-usage-of-shost_for_each_devi.patch
+firmware-imx-scu-fix-possible-memory-leak-in-imx_scu.patch
+fuse-fix-copy_file_range-cache-issues.patch
+fuse-copy_file_range-should-truncate-cache.patch
+arm64-tegra-fix-ethernet-phy-mode-for-jetson-xavier.patch
+arm64-tegra-fix-flag-for-64-bit-resources-in-ranges-.patch
+powerpc-powernv-add-null-check-after-kzalloc.patch
+powerpc-64s-pgtable-fix-an-undefined-behaviour.patch
+powerpc-kasan-fix-error-detection-on-memory-allocati.patch
+dm-zoned-return-null-if-dmz_get_zone_for_reclaim-fai.patch
+rdma-efa-fix-setting-of-wrong-bit-in-get-set_feature.patch
+xen-cpuhotplug-fix-initial-cpu-offlining-for-pv-h-gu.patch
+pci-ptm-inherit-switch-downstream-port-ptm-settings-.patch
+bus-mhi-core-read-transfer-length-from-an-event-prop.patch
+pci-dwc-pci-dra7xx-use-devm_platform_ioremap_resourc.patch
+pci-dwc-fix-inner-msi-irq-domain-registration.patch
+pci-amlogic-meson-don-t-use-fast_link_mode-to-set-up.patch
+iio-light-gp2ap002-take-runtime-pm-reference-on-ligh.patch
+ib-cma-fix-ports-memory-leak-in-cma_configfs.patch
+selftests-timens-handle-a-case-when-alarm-clocks-are.patch
+watchdog-da9062-no-need-to-ping-manually-before-sett.patch
+usb-dwc2-gadget-move-gadget-resume-after-the-core-is.patch
+usb-gadget-udc-s3c2410_udc-remove-pointless-null-che.patch
+usb-gadget-lpc32xx_udc-don-t-dereference-ep-pointer-.patch
+usb-gadget-fix-potential-double-free-in-m66592_probe.patch
+usb-gadget-fix-issue-with-config_ep_by_speed-functio.patch
+pinctrl-fix-return-value-about-devm_platform_ioremap.patch
+scripts-headers_install-exit-with-error-on-config-le.patch
+rdma-iw_cxgb4-cleanup-device-debugfs-entries-on-uld-.patch
+x86-apic-make-tsc-deadline-timer-detection-message-v.patch
+mfd-stmfx-reset-chip-on-resume-as-supply-was-disable.patch
+mfd-stmfx-fix-stmfx_irq_init-error-path.patch
+mfd-stmfx-disable-irq-in-suspend-to-avoid-spurious-i.patch
+mfd-wcd934x-drop-kfree-for-memory-allocated-with-dev.patch
+powerpc-32s-don-t-warn-when-mapping-ro-data-rox.patch
+powerpc-8xx-drop-config_8xx_copyback-option.patch
+asoc-fix-incomplete-error-handling-in-img_i2s_in_pro.patch
+scsi-target-tcmu-fix-a-use-after-free-in-tcmu_check_.patch
+clk-bcm2835-fix-return-type-of-bcm2835_register_gate.patch
+scsi-ufs-qcom-fix-scheduling-while-atomic-issue.patch
+clk-zynqmp-fix-divider2-calculation.patch
+scsi-iscsi-fix-deadlock-on-recovery-path-during-gfp_.patch
+scsi-ufs-ti-j721e-ufs-fix-unwinding-of-pm_runtime-ch.patch
+kvm-ppc-book3s-hv-ignore-kmemleak-false-positives.patch
+kvm-ppc-book3s-fix-some-rcu-list-locks.patch
+kvm-ppc-book3s-hv-relax-check-on-h_svm_init_abort.patch
+clk-sprd-return-correct-type-of-value-for-_sprd_pll_.patch
+clk-ast2600-fix-ahb-clock-divider-for-a1.patch
+misc-xilinx-sdfec-improve-get_user_pages_fast-error-.patch
+dev-mem-revoke-mappings-when-a-driver-claims-the-reg.patch
+asoc-dapm-move-dai_link-widgets-to-runtime-to-fix-us.patch
+net-sunrpc-fix-off-by-one-issues-in-rpc_ntop6.patch
+nfsv4.1-fix-rpc_call_done-assignment-for-bind_conn_t.patch
+of-fix-a-refcounting-bug-in-__of_attach_node_sysfs.patch
+arm-davinci-fix-build-failure-without-i2c.patch
+input-i8042-remove-special-powerpc-handling.patch
+powerpc-4xx-don-t-unmap-null-mbase.patch
+powerpc-64s-kuap-add-missing-isync-to-kuap-restore-p.patch
+extcon-adc-jack-fix-an-error-handling-path-in-adc_ja.patch
+usb-dwc3-meson-g12a-fix-error-path-when-fetching-the.patch
+asoc-fsl_asrc_dma-fix-dma_chan-leak-when-config-dma-.patch
+asoc-sof-intel-hda-fix-generic-hda-codec-support.patch
+vfio-mdev-fix-reference-count-leak-in-add_mdev_suppo.patch
+rtc-rv3028-add-missed-check-for-devm_regmap_init_i2c.patch
+mailbox-imx-fix-return-in-imx_mu_scu_xlate.patch
+mailbox-zynqmp-ipi-fix-null-vs-is_err-check-in-zynqm.patch
+rxrpc-adjust-proc-net-rxrpc-calls-to-display-call-de.patch
+openrisc-fix-issue-with-argument-clobbering-for-clon.patch
+drm-nouveau-disp-gm200-fix-nv_pdisp_sor_hdmi2_ctrl-n.patch
+ceph-don-t-return-estale-if-there-s-still-an-open-fi.patch
+nfsd4-make-drc_slab-global-not-per-net.patch
+pwm-imx27-fix-rounding-behavior.patch
+gfs2-allow-lock_nolock-mount-to-specify-jid-x.patch
+ovl-verify-permissions-in-ovl_path_open.patch
+scsi-iscsi-fix-reference-count-leak-in-iscsi_boot_cr.patch
+scsi-ufs-don-t-update-urgent-bkops-level-when-toggli.patch
+modpost-fix-i-ignore-errors-makeflags-detection.patch
+pinctrl-imxl-fix-an-error-handling-path-in-imx1_pinc.patch
+pinctrl-sirf-add-missing-put_device-call-in-sirfsoc_.patch
+pinctrl-freescale-imx-fix-an-error-handling-path-in-.patch
+pinctrl-freescale-imx-use-devm_of_iomap-to-avoid-a-r.patch
+nfsd-safer-handling-of-corrupted-c_type.patch
+rdma-cm-spurious-warning-triggered-in-cm_destroy_id.patch
+drm-amd-display-revalidate-bandwidth-before-commitin.patch
+ext4-handle-ext4_mark_inode_dirty-errors.patch
+ext4-don-t-block-for-o_direct-if-iocb_nowait-is-set.patch
+crypto-omap-sham-add-proper-load-balancing-support-f.patch
+pwm-add-missing-config_-prefix.patch
+bpf-fix-an-error-code-in-check_btf_func.patch
+geneve-change-from-tx_error-to-tx_dropped-on-missing.patch
+lib-zlib-remove-outdated-and-incorrect-pre-increment.patch
+include-linux-bitops.h-avoid-clang-shift-count-overf.patch
+selftests-vm-pkeys-fix-alloc_random_pkey-to-make-it-.patch
+blktrace-use-errno-instead-of-bi_status.patch
+blktrace-fix-endianness-in-get_pdu_int.patch
+blktrace-fix-endianness-for-blk_log_remap.patch
+kvm-selftests-fix-build-with-make-arch-x86_64.patch
+gfs2-fix-use-after-free-on-transaction-ail-lists.patch
+net-dp83867-fix-of_mdio-config-check.patch
+net-marvell-fix-of_mdio-config-check.patch
+net-mscc-fix-of_mdio-config-check.patch
+ntb_perf-pass-correct-struct-device-to-dma_alloc_coh.patch
+ntb_tool-pass-correct-struct-device-to-dma_alloc_coh.patch
+ntb-ntb_tool-reading-the-link-file-should-not-end-in.patch
+ntb-revert-the-change-to-use-the-ntb-device-dev-for-.patch
+ntb-perf-don-t-require-one-more-memory-window-than-n.patch
+ntb-perf-fix-support-for-hardware-that-doesn-t-have-.patch
+ntb-perf-fix-race-condition-when-run-with-ntb_test.patch
+ntb-ntb_test-fix-bug-when-counting-remote-files.patch
+i2c-icy-fix-build-with-config_amiga_pcmcia-n.patch
+mailbox-imx-add-context-save-restore-for-suspend-res.patch
+arm64-ftrace-change-config_ftrace_with_regs-to-confi.patch
+drivers-perf-hisi-fix-wrong-value-for-all-counters-e.patch
+selftests-net-in-timestamping-strncpy-needs-to-prese.patch
+f2fs-don-t-return-vmalloc-memory-from-f2fs_kmalloc.patch
+afs-fix-memory-leak-in-afs_put_sysnames.patch
+asoc-soc-pcm-dpcm-fix-playback-capture-checks.patch
+asoc-core-only-convert-non-dpcm-link-to-dpcm-link.patch
+asoc-sof-nocodec-conditionally-set-dpcm_capture-dpcm.patch
+asoc-intel-bytcr_rt5640-add-quirk-for-toshiba-encore.patch-12891
+asoc-rt5645-add-platform-data-for-asus-t101ha.patch
+bpf-sockmap-fix-kernel-panic-at-__tcp_bpf_recvmsg.patch
+bpf-sockhash-synchronize-delete-from-bucket-list-on-.patch
+tracing-probe-fix-bpf_task_fd_query-for-kprobes-and-.patch
+drm-sun4i-hdmi-ddc-clk-fix-size-of-m-divider.patch
+libbpf-handle-gcc-noreturn-turned-volatile-quirk.patch
+scsi-acornscsi-fix-an-error-handling-path-in-acornsc.patch
+drm-ast-fix-missing-break-in-switch-statement-for-fo.patch
+x86-idt-keep-spurious-entries-unset-in-system_vector.patch
+x86-mce-dev-mcelog-fix-wstringop-truncation-warning-.patch
+net-filter-permit-reading-net-in-load_bytes_relative.patch
+tools-bpftool-fix-memory-leak-in-codegen-error-cases.patch
+nvme-fc-don-t-call-nvme_cleanup_cmd-for-aens.patch
+nvme-pci-use-simple-suspend-when-a-hmb-is-enabled.patch
+nfs-set-invalid-blocks-after-nfsv4-writes.patch
+nfs-fix-direct-write-throughput-regression.patch
+xdp-fix-xsk_generic_xmit-errno.patch
+iavf-fix-speed-reporting-over-virtchnl.patch
+net-ipa-program-upper-nibbles-of-sequencer-type.patch
+bpf-sockmap-don-t-attach-programs-to-udp-sockets.patch
+bpf-fix-memlock-accounting-for-sock_hash.patch
+libbpf-support-pre-initializing-.bss-global-variable.patch
+bpf-undo-internal-bpf_probe_mem-in-bpf-insns-dump.patch
+usb-xhci-plat-set-pm-runtime-as-active-on-resume.patch
+usb-ehci-platform-set-pm-runtime-as-active-on-resume.patch
+perf-report-fix-null-pointer-dereference-in-hists__f.patch
+perf-stat-fix-null-pointer-dereference.patch
+perf-probe-fix-user-attribute-access-in-kprobes.patch
+perf-parse-events-fix-an-incompatible-pointer.patch
+ext4-stop-overwrite-the-errcode-in-ext4_setup_super.patch
+bcache-fix-potential-deadlock-problem-in-btree_gc_co.patch
+crypto-hisilicon-cap-block-size-at-2-31.patch
+crypto-marvell-octeontx-fix-a-potential-null-derefer.patch
+powerpc-fix-kernel-crash-in-show_instructions-w-debu.patch
+afs-fix-non-setting-of-mtime-when-writing-into-mmap.patch
+afs-afs_write_end-should-change-i_size-under-the-rig.patch
+afs-fix-eof-corruption.patch
+afs-always-include-dir-in-bulk-status-fetch-from-afs.patch
+afs-set-error-flag-rather-than-return-error-from-fil.patch
+afs-remove-the-error-argument-from-afs_protocol_erro.patch
+afs-fix-the-mapping-of-the-uaeoverflow-abort-code.patch
+bnxt_en-simplify-bnxt_resume.patch
+bnxt_en-re-enable-sriov-during-resume.patch
+bnxt_en-fix-aer-reset-logic-on-57500-chips.patch
+bnxt_en-return-from-timer-if-interface-is-not-in-ope.patch
+net-dsa-sja1105-fix-ptp-timestamping-with-large-tc-t.patch
+scsi-ufs-bsg-fix-runtime-pm-imbalance-on-error.patch
+s390-numa-let-nodes_shift-depend-on-need_multiple_no.patch
+block-fix-use-after-free-in-blkdev_get.patch
+mvpp2-remove-module-bugfix.patch
+bareudp-fixed-configuration-to-avoid-having-garbage-.patch
+mlxsw-spectrum-adjust-headroom-buffers-for-8x-ports.patch
+arm64-mm-reserve-hugetlb-cma-after-numa_init.patch
+arm64-hw_breakpoint-don-t-invoke-overflow-handler-on.patch
+libata-use-per-port-sync-for-detach.patch
+drm-encoder_slave-fix-refcouting-error-for-modules.patch
+pinctrl-qcom-ipq6018-add-missing-pins-in-qpic-pin-gr.patch
diff --git a/queue-5.7/slimbus-ngd-get-drvdata-from-correct-device.patch b/queue-5.7/slimbus-ngd-get-drvdata-from-correct-device.patch
new file mode 100644 (file)
index 0000000..492fa87
--- /dev/null
@@ -0,0 +1,50 @@
+From e6871e519630bd30eccbaf43fcc0c855bf3ca391 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 17 Apr 2020 10:36:18 +0100
+Subject: slimbus: ngd: get drvdata from correct device
+
+From: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
+
+[ Upstream commit b58c663059b484f7ff547d076a34cf6d7a302e56 ]
+
+Get drvdata directly from parent instead of ngd dev, as ngd
+dev can probe defer and previously set drvdata will become null.
+
+Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
+Link: https://lore.kernel.org/r/20200417093618.7929-1-srinivas.kandagatla@linaro.org
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/slimbus/qcom-ngd-ctrl.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/slimbus/qcom-ngd-ctrl.c b/drivers/slimbus/qcom-ngd-ctrl.c
+index fc2575fef51ba..7426b5884218a 100644
+--- a/drivers/slimbus/qcom-ngd-ctrl.c
++++ b/drivers/slimbus/qcom-ngd-ctrl.c
+@@ -1361,7 +1361,6 @@ static int of_qcom_slim_ngd_register(struct device *parent,
+               ngd->pdev->driver_override = QCOM_SLIM_NGD_DRV_NAME;
+               ngd->pdev->dev.of_node = node;
+               ctrl->ngd = ngd;
+-              platform_set_drvdata(ngd->pdev, ctrl);
+               platform_device_add(ngd->pdev);
+               ngd->base = ctrl->base + ngd->id * data->offset +
+@@ -1376,12 +1375,13 @@ static int of_qcom_slim_ngd_register(struct device *parent,
+ static int qcom_slim_ngd_probe(struct platform_device *pdev)
+ {
+-      struct qcom_slim_ngd_ctrl *ctrl = platform_get_drvdata(pdev);
+       struct device *dev = &pdev->dev;
++      struct qcom_slim_ngd_ctrl *ctrl = dev_get_drvdata(dev->parent);
+       int ret;
+       ctrl->ctrl.dev = dev;
++      platform_set_drvdata(pdev, ctrl);
+       pm_runtime_use_autosuspend(dev);
+       pm_runtime_set_autosuspend_delay(dev, QCOM_SLIM_NGD_AUTOSUSPEND);
+       pm_runtime_set_suspended(dev);
+-- 
+2.25.1
+
diff --git a/queue-5.7/soc-rsnd-add-interrupt-support-for-ssi-busif-buffer.patch b/queue-5.7/soc-rsnd-add-interrupt-support-for-ssi-busif-buffer.patch
new file mode 100644 (file)
index 0000000..5cd4cb4
--- /dev/null
@@ -0,0 +1,281 @@
+From 6244386e24c8443febe9305dc0480b3a3f532908 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 12 May 2020 17:30:03 +0800
+Subject: SoC: rsnd: add interrupt support for SSI BUSIF buffer
+
+From: Yongbo Zhang <giraffesnn123@gmail.com>
+
+[ Upstream commit 66c705d07d784fb6b4622c6e47b6acae357472db ]
+
+SSI BUSIF buffer is possible to overflow or underflow, especially in a
+hypervisor environment. If there is no interrupt support, it will eventually
+lead to errors in pcm data.
+This patch adds overflow and underflow interrupt support for SSI BUSIF buffer.
+
+Reported-by: Chen Li <licheng0822@thundersoft.com>
+Signed-off-by: Yongbo Zhang <giraffesnn123@gmail.com>
+Tested-by: Chen Li <licheng0822@thundersoft.com>
+Acked-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Link: https://lore.kernel.org/r/20200512093003.28332-1-giraffesnn123@gmail.com
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/soc/sh/rcar/gen.c  |   8 +++
+ sound/soc/sh/rcar/rsnd.h |   9 +++
+ sound/soc/sh/rcar/ssi.c  | 145 +++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 162 insertions(+)
+
+diff --git a/sound/soc/sh/rcar/gen.c b/sound/soc/sh/rcar/gen.c
+index af19010b9d88f..8bd49c8a9517e 100644
+--- a/sound/soc/sh/rcar/gen.c
++++ b/sound/soc/sh/rcar/gen.c
+@@ -224,6 +224,14 @@ static int rsnd_gen2_probe(struct rsnd_priv *priv)
+               RSND_GEN_S_REG(SSI_SYS_STATUS5, 0x884),
+               RSND_GEN_S_REG(SSI_SYS_STATUS6, 0x888),
+               RSND_GEN_S_REG(SSI_SYS_STATUS7, 0x88c),
++              RSND_GEN_S_REG(SSI_SYS_INT_ENABLE0, 0x850),
++              RSND_GEN_S_REG(SSI_SYS_INT_ENABLE1, 0x854),
++              RSND_GEN_S_REG(SSI_SYS_INT_ENABLE2, 0x858),
++              RSND_GEN_S_REG(SSI_SYS_INT_ENABLE3, 0x85c),
++              RSND_GEN_S_REG(SSI_SYS_INT_ENABLE4, 0x890),
++              RSND_GEN_S_REG(SSI_SYS_INT_ENABLE5, 0x894),
++              RSND_GEN_S_REG(SSI_SYS_INT_ENABLE6, 0x898),
++              RSND_GEN_S_REG(SSI_SYS_INT_ENABLE7, 0x89c),
+               RSND_GEN_S_REG(HDMI0_SEL,       0x9e0),
+               RSND_GEN_S_REG(HDMI1_SEL,       0x9e4),
+diff --git a/sound/soc/sh/rcar/rsnd.h b/sound/soc/sh/rcar/rsnd.h
+index ea6cbaa9743ee..d47608ff5facc 100644
+--- a/sound/soc/sh/rcar/rsnd.h
++++ b/sound/soc/sh/rcar/rsnd.h
+@@ -189,6 +189,14 @@ enum rsnd_reg {
+       SSI_SYS_STATUS5,
+       SSI_SYS_STATUS6,
+       SSI_SYS_STATUS7,
++      SSI_SYS_INT_ENABLE0,
++      SSI_SYS_INT_ENABLE1,
++      SSI_SYS_INT_ENABLE2,
++      SSI_SYS_INT_ENABLE3,
++      SSI_SYS_INT_ENABLE4,
++      SSI_SYS_INT_ENABLE5,
++      SSI_SYS_INT_ENABLE6,
++      SSI_SYS_INT_ENABLE7,
+       HDMI0_SEL,
+       HDMI1_SEL,
+       SSI9_BUSIF0_MODE,
+@@ -237,6 +245,7 @@ enum rsnd_reg {
+ #define SSI9_BUSIF_ADINR(i)   (SSI9_BUSIF0_ADINR + (i))
+ #define SSI9_BUSIF_DALIGN(i)  (SSI9_BUSIF0_DALIGN + (i))
+ #define SSI_SYS_STATUS(i)     (SSI_SYS_STATUS0 + (i))
++#define SSI_SYS_INT_ENABLE(i) (SSI_SYS_INT_ENABLE0 + (i))
+ struct rsnd_priv;
+diff --git a/sound/soc/sh/rcar/ssi.c b/sound/soc/sh/rcar/ssi.c
+index 4a7d3413917fc..47d5ddb526f21 100644
+--- a/sound/soc/sh/rcar/ssi.c
++++ b/sound/soc/sh/rcar/ssi.c
+@@ -372,6 +372,9 @@ static void rsnd_ssi_config_init(struct rsnd_mod *mod,
+       u32 wsr         = ssi->wsr;
+       int width;
+       int is_tdm, is_tdm_split;
++      int id = rsnd_mod_id(mod);
++      int i;
++      u32 sys_int_enable = 0;
+       is_tdm          = rsnd_runtime_is_tdm(io);
+       is_tdm_split    = rsnd_runtime_is_tdm_split(io);
+@@ -447,6 +450,38 @@ static void rsnd_ssi_config_init(struct rsnd_mod *mod,
+               cr_mode = DIEN;         /* PIO : enable Data interrupt */
+       }
++      /* enable busif buffer over/under run interrupt. */
++      if (is_tdm || is_tdm_split) {
++              switch (id) {
++              case 0:
++              case 1:
++              case 2:
++              case 3:
++              case 4:
++                      for (i = 0; i < 4; i++) {
++                              sys_int_enable = rsnd_mod_read(mod,
++                                      SSI_SYS_INT_ENABLE(i * 2));
++                              sys_int_enable |= 0xf << (id * 4);
++                              rsnd_mod_write(mod,
++                                             SSI_SYS_INT_ENABLE(i * 2),
++                                             sys_int_enable);
++                      }
++
++                      break;
++              case 9:
++                      for (i = 0; i < 4; i++) {
++                              sys_int_enable = rsnd_mod_read(mod,
++                                      SSI_SYS_INT_ENABLE((i * 2) + 1));
++                              sys_int_enable |= 0xf << 4;
++                              rsnd_mod_write(mod,
++                                             SSI_SYS_INT_ENABLE((i * 2) + 1),
++                                             sys_int_enable);
++                      }
++
++                      break;
++              }
++      }
++
+ init_end:
+       ssi->cr_own     = cr_own;
+       ssi->cr_mode    = cr_mode;
+@@ -496,6 +531,13 @@ static int rsnd_ssi_quit(struct rsnd_mod *mod,
+ {
+       struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
+       struct device *dev = rsnd_priv_to_dev(priv);
++      int is_tdm, is_tdm_split;
++      int id = rsnd_mod_id(mod);
++      int i;
++      u32 sys_int_enable = 0;
++
++      is_tdm          = rsnd_runtime_is_tdm(io);
++      is_tdm_split    = rsnd_runtime_is_tdm_split(io);
+       if (!rsnd_ssi_is_run_mods(mod, io))
+               return 0;
+@@ -517,6 +559,38 @@ static int rsnd_ssi_quit(struct rsnd_mod *mod,
+               ssi->wsr        = 0;
+       }
++      /* disable busif buffer over/under run interrupt. */
++      if (is_tdm || is_tdm_split) {
++              switch (id) {
++              case 0:
++              case 1:
++              case 2:
++              case 3:
++              case 4:
++                      for (i = 0; i < 4; i++) {
++                              sys_int_enable = rsnd_mod_read(mod,
++                                              SSI_SYS_INT_ENABLE(i * 2));
++                              sys_int_enable &= ~(0xf << (id * 4));
++                              rsnd_mod_write(mod,
++                                             SSI_SYS_INT_ENABLE(i * 2),
++                                             sys_int_enable);
++                      }
++
++                      break;
++              case 9:
++                      for (i = 0; i < 4; i++) {
++                              sys_int_enable = rsnd_mod_read(mod,
++                                      SSI_SYS_INT_ENABLE((i * 2) + 1));
++                              sys_int_enable &= ~(0xf << 4);
++                              rsnd_mod_write(mod,
++                                             SSI_SYS_INT_ENABLE((i * 2) + 1),
++                                             sys_int_enable);
++                      }
++
++                      break;
++              }
++      }
++
+       return 0;
+ }
+@@ -622,6 +696,11 @@ static int rsnd_ssi_irq(struct rsnd_mod *mod,
+                       int enable)
+ {
+       u32 val = 0;
++      int is_tdm, is_tdm_split;
++      int id = rsnd_mod_id(mod);
++
++      is_tdm          = rsnd_runtime_is_tdm(io);
++      is_tdm_split    = rsnd_runtime_is_tdm_split(io);
+       if (rsnd_is_gen1(priv))
+               return 0;
+@@ -635,6 +714,19 @@ static int rsnd_ssi_irq(struct rsnd_mod *mod,
+       if (enable)
+               val = rsnd_ssi_is_dma_mode(mod) ? 0x0e000000 : 0x0f000000;
++      if (is_tdm || is_tdm_split) {
++              switch (id) {
++              case 0:
++              case 1:
++              case 2:
++              case 3:
++              case 4:
++              case 9:
++                      val |= 0x0000ff00;
++                      break;
++              }
++      }
++
+       rsnd_mod_write(mod, SSI_INT_ENABLE, val);
+       return 0;
+@@ -651,6 +743,12 @@ static void __rsnd_ssi_interrupt(struct rsnd_mod *mod,
+       u32 status;
+       bool elapsed = false;
+       bool stop = false;
++      int id = rsnd_mod_id(mod);
++      int i;
++      int is_tdm, is_tdm_split;
++
++      is_tdm          = rsnd_runtime_is_tdm(io);
++      is_tdm_split    = rsnd_runtime_is_tdm_split(io);
+       spin_lock(&priv->lock);
+@@ -672,6 +770,53 @@ static void __rsnd_ssi_interrupt(struct rsnd_mod *mod,
+               stop = true;
+       }
++      status = 0;
++
++      if (is_tdm || is_tdm_split) {
++              switch (id) {
++              case 0:
++              case 1:
++              case 2:
++              case 3:
++              case 4:
++                      for (i = 0; i < 4; i++) {
++                              status = rsnd_mod_read(mod,
++                                                     SSI_SYS_STATUS(i * 2));
++                              status &= 0xf << (id * 4);
++
++                              if (status) {
++                                      rsnd_dbg_irq_status(dev,
++                                              "%s err status : 0x%08x\n",
++                                              rsnd_mod_name(mod), status);
++                                      rsnd_mod_write(mod,
++                                                     SSI_SYS_STATUS(i * 2),
++                                                     0xf << (id * 4));
++                                      stop = true;
++                                      break;
++                              }
++                      }
++                      break;
++              case 9:
++                      for (i = 0; i < 4; i++) {
++                              status = rsnd_mod_read(mod,
++                                              SSI_SYS_STATUS((i * 2) + 1));
++                              status &= 0xf << 4;
++
++                              if (status) {
++                                      rsnd_dbg_irq_status(dev,
++                                              "%s err status : 0x%08x\n",
++                                              rsnd_mod_name(mod), status);
++                                      rsnd_mod_write(mod,
++                                              SSI_SYS_STATUS((i * 2) + 1),
++                                              0xf << 4);
++                                      stop = true;
++                                      break;
++                              }
++                      }
++                      break;
++              }
++      }
++
+       rsnd_ssi_status_clear(mod);
+ rsnd_ssi_interrupt_out:
+       spin_unlock(&priv->lock);
+-- 
+2.25.1
+
diff --git a/queue-5.7/soundwire-slave-don-t-init-debugfs-on-device-registr.patch b/queue-5.7/soundwire-slave-don-t-init-debugfs-on-device-registr.patch
new file mode 100644 (file)
index 0000000..ded7414
--- /dev/null
@@ -0,0 +1,40 @@
+From 7b80af14804df08f47278ec4691f673fd539c1ab Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 20 Apr 2020 02:51:15 +0800
+Subject: soundwire: slave: don't init debugfs on device registration error
+
+From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
+
+[ Upstream commit 8893ab5e8ee5d7c12e0fc1dca4a309475064473d ]
+
+The error handling flow seems incorrect, there is no reason to try and
+add debugfs support if the device registration did not
+succeed. Return on error.
+
+Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
+Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com>
+Reviewed-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
+Reviewed-by: Guennadi Liakhovetski <guennadi.liakhovetski@linux.intel.com>
+Link: https://lore.kernel.org/r/20200419185117.4233-2-yung-chuan.liao@linux.intel.com
+Signed-off-by: Vinod Koul <vkoul@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/soundwire/slave.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/drivers/soundwire/slave.c b/drivers/soundwire/slave.c
+index aace57fae7f83..4bacdb187eab8 100644
+--- a/drivers/soundwire/slave.c
++++ b/drivers/soundwire/slave.c
+@@ -68,6 +68,8 @@ static int sdw_slave_add(struct sdw_bus *bus,
+               list_del(&slave->node);
+               mutex_unlock(&bus->bus_lock);
+               put_device(&slave->dev);
++
++              return ret;
+       }
+       sdw_slave_debugfs_init(slave);
+-- 
+2.25.1
+
diff --git a/queue-5.7/sparc32-mm-don-t-try-to-free-page-table-pages-if-cto.patch b/queue-5.7/sparc32-mm-don-t-try-to-free-page-table-pages-if-cto.patch
new file mode 100644 (file)
index 0000000..429f58b
--- /dev/null
@@ -0,0 +1,41 @@
+From b0253612a9184282812bc58af5726cc203544648 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 26 May 2020 18:33:00 +0100
+Subject: sparc32: mm: Don't try to free page-table pages if ctor() fails
+
+From: Will Deacon <will@kernel.org>
+
+[ Upstream commit 454b0289c6b5f2c66164654b80212d15fbef7a03 ]
+
+The pages backing page-table allocations for SRMMU are allocated via
+memblock as part of the "nocache" region initialisation during
+srmmu_paging_init() and should not be freed even if a later call to
+pgtable_pte_page_ctor() fails.
+
+Remove the broken call to __free_page().
+
+Cc: David S. Miller <davem@davemloft.net>
+Cc: Kirill A. Shutemov <kirill@shutemov.name>
+Fixes: 1ae9ae5f7df7 ("sparc: handle pgtable_page_ctor() fail")
+Signed-off-by: Will Deacon <will@kernel.org>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/sparc/mm/srmmu.c | 1 -
+ 1 file changed, 1 deletion(-)
+
+diff --git a/arch/sparc/mm/srmmu.c b/arch/sparc/mm/srmmu.c
+index a8c2f2615fc6f..ecc9e8786d57f 100644
+--- a/arch/sparc/mm/srmmu.c
++++ b/arch/sparc/mm/srmmu.c
+@@ -383,7 +383,6 @@ pgtable_t pte_alloc_one(struct mm_struct *mm)
+               return NULL;
+       page = pfn_to_page(__nocache_pa(pte) >> PAGE_SHIFT);
+       if (!pgtable_pte_page_ctor(page)) {
+-              __free_page(page);
+               return NULL;
+       }
+       return page;
+-- 
+2.25.1
+
diff --git a/queue-5.7/staging-gasket-fix-mapping-refcnt-leak-when-put-attr.patch b/queue-5.7/staging-gasket-fix-mapping-refcnt-leak-when-put-attr.patch
new file mode 100644 (file)
index 0000000..62c76b5
--- /dev/null
@@ -0,0 +1,48 @@
+From 8a8ebf2bc2cf64457bd9ebf12dcd8b8ff22ee355 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 23 Apr 2020 13:14:55 +0800
+Subject: staging: gasket: Fix mapping refcnt leak when put attribute fails
+
+From: Xiyu Yang <xiyuyang19@fudan.edu.cn>
+
+[ Upstream commit 57a66838e1494cd881b7f4e110ec685736e8e3ca ]
+
+gasket_sysfs_put_attr() invokes get_mapping(), which returns a reference
+of the specified gasket_sysfs_mapping object to "mapping" with increased
+refcnt.
+
+When gasket_sysfs_put_attr() returns, local variable "mapping" becomes
+invalid, so the refcount should be decreased to keep refcount balanced.
+
+The reference counting issue happens in one path of
+gasket_sysfs_put_attr(). When mapping attribute is unknown, the function
+forgets to decrease the refcnt increased by get_mapping(), causing a
+refcnt leak.
+
+Fix this issue by calling put_mapping() when put attribute fails due to
+unknown attribute.
+
+Signed-off-by: Xiyu Yang <xiyuyang19@fudan.edu.cn>
+Signed-off-by: Xin Tan <tanxin.ctf@gmail.com>
+Link: https://lore.kernel.org/r/1587618895-13660-1-git-send-email-xiyuyang19@fudan.edu.cn
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/staging/gasket/gasket_sysfs.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/staging/gasket/gasket_sysfs.c b/drivers/staging/gasket/gasket_sysfs.c
+index 5f0e089573a29..ad852ea1d4a92 100644
+--- a/drivers/staging/gasket/gasket_sysfs.c
++++ b/drivers/staging/gasket/gasket_sysfs.c
+@@ -339,6 +339,7 @@ void gasket_sysfs_put_attr(struct device *device,
+       dev_err(device, "Unable to put unknown attribute: %s\n",
+               attr->attr.attr.name);
++      put_mapping(mapping);
+ }
+ EXPORT_SYMBOL(gasket_sysfs_put_attr);
+-- 
+2.25.1
+
diff --git a/queue-5.7/staging-gasket-fix-mapping-refcnt-leak-when-register.patch b/queue-5.7/staging-gasket-fix-mapping-refcnt-leak-when-register.patch
new file mode 100644 (file)
index 0000000..bf61450
--- /dev/null
@@ -0,0 +1,48 @@
+From 72c7685f8dcd6885c7a8befdd4d2b93c3288a354 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 23 Apr 2020 13:15:40 +0800
+Subject: staging: gasket: Fix mapping refcnt leak when register/store fails
+
+From: Xiyu Yang <xiyuyang19@fudan.edu.cn>
+
+[ Upstream commit e3436ce60cf5f5eaedda2b8c622f69feb97595e2 ]
+
+gasket_sysfs_register_store() invokes get_mapping(), which returns a
+reference of the specified gasket_sysfs_mapping object to "mapping" with
+increased refcnt.
+
+When gasket_sysfs_register_store() returns, local variable "mapping"
+becomes invalid, so the refcount should be decreased to keep refcount
+balanced.
+
+The reference counting issue happens in one exception handling path of
+gasket_sysfs_register_store(). When gasket_dev is NULL, the function
+forgets to decrease the refcnt increased by get_mapping(), causing a
+refcnt leak.
+
+Fix this issue by calling put_mapping() when gasket_dev is NULL.
+
+Signed-off-by: Xiyu Yang <xiyuyang19@fudan.edu.cn>
+Signed-off-by: Xin Tan <tanxin.ctf@gmail.com>
+Link: https://lore.kernel.org/r/1587618941-13718-1-git-send-email-xiyuyang19@fudan.edu.cn
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/staging/gasket/gasket_sysfs.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/staging/gasket/gasket_sysfs.c b/drivers/staging/gasket/gasket_sysfs.c
+index ad852ea1d4a92..af26bc9f184a5 100644
+--- a/drivers/staging/gasket/gasket_sysfs.c
++++ b/drivers/staging/gasket/gasket_sysfs.c
+@@ -373,6 +373,7 @@ ssize_t gasket_sysfs_register_store(struct device *device,
+       gasket_dev = mapping->gasket_dev;
+       if (!gasket_dev) {
+               dev_err(device, "Device driver may have been removed\n");
++              put_mapping(mapping);
+               return 0;
+       }
+-- 
+2.25.1
+
diff --git a/queue-5.7/staging-greybus-fix-a-missing-check-bug-in-gb_lights.patch b/queue-5.7/staging-greybus-fix-a-missing-check-bug-in-gb_lights.patch
new file mode 100644 (file)
index 0000000..88aa849
--- /dev/null
@@ -0,0 +1,38 @@
+From 0823e2317f10d0cbbdcbea6161e827f322aae358 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 1 Apr 2020 11:00:17 +0800
+Subject: staging: greybus: fix a missing-check bug in gb_lights_light_config()
+
+From: Chen Zhou <chenzhou10@huawei.com>
+
+[ Upstream commit 9bb086e5ba9495ac150fbbcc5c8c2bccc06261dd ]
+
+In gb_lights_light_config(), 'light->name' is allocated by kstrndup().
+It returns NULL when fails, add check for it.
+
+Signed-off-by: Chen Zhou <chenzhou10@huawei.com>
+Acked-by: Rui Miguel Silva <rmfrfs@gmail.com>
+Link: https://lore.kernel.org/r/20200401030017.100274-1-chenzhou10@huawei.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/staging/greybus/light.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/staging/greybus/light.c b/drivers/staging/greybus/light.c
+index d6ba25f21d807..d2672b65c3f49 100644
+--- a/drivers/staging/greybus/light.c
++++ b/drivers/staging/greybus/light.c
+@@ -1026,7 +1026,8 @@ static int gb_lights_light_config(struct gb_lights *glights, u8 id)
+       light->channels_count = conf.channel_count;
+       light->name = kstrndup(conf.name, NAMES_MAX, GFP_KERNEL);
+-
++      if (!light->name)
++              return -ENOMEM;
+       light->channels = kcalloc(light->channels_count,
+                                 sizeof(struct gb_channel), GFP_KERNEL);
+       if (!light->channels)
+-- 
+2.25.1
+
diff --git a/queue-5.7/staging-mt7621-pci-fix-pcie-interrupt-mapping.patch b/queue-5.7/staging-mt7621-pci-fix-pcie-interrupt-mapping.patch
new file mode 100644 (file)
index 0000000..d7d8ed2
--- /dev/null
@@ -0,0 +1,187 @@
+From 6101726673471e3ebde5d21c1aaf02f176d46985 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 13 Apr 2020 07:59:42 +0200
+Subject: staging: mt7621-pci: fix PCIe interrupt mapping
+
+From: Sergio Paracuellos <sergio.paracuellos@gmail.com>
+
+[ Upstream commit fab6710e4c51f4eb622f95a08322ab5fdbe3f295 ]
+
+MT7621 has three assigned interrupts for the pcie. This
+interrupts should properly being mapped taking into account
+which devices are finally connected in which bus according
+to link status. So the irq mappings should be as follows
+according to link status (three bits indicating which devices
+are link up):
+
+* For PCIe Bus 1 slot 0:
+  - status = 0x2 || status = 0x6 => IRQ = pcie1_irq (24).
+  - status = 0x4 => IRQ = pcie2_irq (25).
+  - default => IRQ = pcie0_irq (23).
+* For PCIe Bus 2 slot 0:
+  - status = 0x5 || status = 0x6 => IRQ = pcie2_irq (25).
+  - default => IRQ = pcie1_irq (24).
+* For PCIe Bus 2 slot 1:
+  - status = 0x5 || status = 0x6 => IRQ = pcie2_irq (25).
+  - default => IRQ = pcie1_irq (24).
+* For PCIe Bus 3 any slot:
+  - default => IRQ = pcie2_irq (25).
+
+Because of this, the function 'of_irq_parse_and_map_pci' cannot
+be used and we need to change device tree information from using
+the 'interrupt-map' and 'interrupt-map-mask' properties into an
+'interrupts' property to be able to get irq information from the
+ports using the 'platform_get_irq' and storing an 'irq-map' into
+the pcie driver data node to properly map correct irq using a
+new 'mt7621_map_irq' function where this map will be read and the
+correct irq returned.
+
+Fixes: 46d093124df4 ("staging: mt7621-pci: improve interrupt mapping")
+Signed-off-by: Sergio Paracuellos <sergio.paracuellos@gmail.com>
+Link: https://lore.kernel.org/r/20200413055942.2714-1-sergio.paracuellos@gmail.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/staging/mt7621-dts/mt7621.dtsi  |  9 +++----
+ drivers/staging/mt7621-pci/pci-mt7621.c | 36 +++++++++++++++++++++++--
+ 2 files changed, 38 insertions(+), 7 deletions(-)
+
+diff --git a/drivers/staging/mt7621-dts/mt7621.dtsi b/drivers/staging/mt7621-dts/mt7621.dtsi
+index 9e5cf68731bb0..82aa93634eda3 100644
+--- a/drivers/staging/mt7621-dts/mt7621.dtsi
++++ b/drivers/staging/mt7621-dts/mt7621.dtsi
+@@ -523,11 +523,10 @@
+                       0x01000000 0 0x00000000 0x1e160000 0 0x00010000 /* io space */
+               >;
+-              #interrupt-cells = <1>;
+-              interrupt-map-mask = <0xF0000 0 0 1>;
+-              interrupt-map = <0x10000 0 0 1 &gic GIC_SHARED 4 IRQ_TYPE_LEVEL_HIGH>,
+-                              <0x20000 0 0 1 &gic GIC_SHARED 24 IRQ_TYPE_LEVEL_HIGH>,
+-                              <0x30000 0 0 1 &gic GIC_SHARED 25 IRQ_TYPE_LEVEL_HIGH>;
++              interrupt-parent = <&gic>;
++              interrupts = <GIC_SHARED 4 IRQ_TYPE_LEVEL_HIGH
++                              GIC_SHARED 24 IRQ_TYPE_LEVEL_HIGH
++                              GIC_SHARED 25 IRQ_TYPE_LEVEL_HIGH>;
+               status = "disabled";
+diff --git a/drivers/staging/mt7621-pci/pci-mt7621.c b/drivers/staging/mt7621-pci/pci-mt7621.c
+index b9d460a9c0419..36207243a71b0 100644
+--- a/drivers/staging/mt7621-pci/pci-mt7621.c
++++ b/drivers/staging/mt7621-pci/pci-mt7621.c
+@@ -97,6 +97,7 @@
+  * @pcie_rst: pointer to port reset control
+  * @gpio_rst: gpio reset
+  * @slot: port slot
++ * @irq: GIC irq
+  * @enabled: indicates if port is enabled
+  */
+ struct mt7621_pcie_port {
+@@ -107,6 +108,7 @@ struct mt7621_pcie_port {
+       struct reset_control *pcie_rst;
+       struct gpio_desc *gpio_rst;
+       u32 slot;
++      int irq;
+       bool enabled;
+ };
+@@ -120,6 +122,7 @@ struct mt7621_pcie_port {
+  * @dev: Pointer to PCIe device
+  * @io_map_base: virtual memory base address for io
+  * @ports: pointer to PCIe port information
++ * @irq_map: irq mapping info according pcie link status
+  * @resets_inverted: depends on chip revision
+  * reset lines are inverted.
+  */
+@@ -135,6 +138,7 @@ struct mt7621_pcie {
+       } offset;
+       unsigned long io_map_base;
+       struct list_head ports;
++      int irq_map[PCIE_P2P_MAX];
+       bool resets_inverted;
+ };
+@@ -279,6 +283,16 @@ static void setup_cm_memory_region(struct mt7621_pcie *pcie)
+       }
+ }
++static int mt7621_map_irq(const struct pci_dev *pdev, u8 slot, u8 pin)
++{
++      struct mt7621_pcie *pcie = pdev->bus->sysdata;
++      struct device *dev = pcie->dev;
++      int irq = pcie->irq_map[slot];
++
++      dev_info(dev, "bus=%d slot=%d irq=%d\n", pdev->bus->number, slot, irq);
++      return irq;
++}
++
+ static int mt7621_pci_parse_request_of_pci_ranges(struct mt7621_pcie *pcie)
+ {
+       struct device *dev = pcie->dev;
+@@ -330,6 +344,7 @@ static int mt7621_pcie_parse_port(struct mt7621_pcie *pcie,
+ {
+       struct mt7621_pcie_port *port;
+       struct device *dev = pcie->dev;
++      struct platform_device *pdev = to_platform_device(dev);
+       struct device_node *pnode = dev->of_node;
+       struct resource regs;
+       char name[10];
+@@ -371,6 +386,12 @@ static int mt7621_pcie_parse_port(struct mt7621_pcie *pcie,
+       port->slot = slot;
+       port->pcie = pcie;
++      port->irq = platform_get_irq(pdev, slot);
++      if (port->irq < 0) {
++              dev_err(dev, "Failed to get IRQ for PCIe%d\n", slot);
++              return -ENXIO;
++      }
++
+       INIT_LIST_HEAD(&port->list);
+       list_add_tail(&port->list, &pcie->ports);
+@@ -585,13 +606,15 @@ static int mt7621_pcie_init_virtual_bridges(struct mt7621_pcie *pcie)
+ {
+       u32 pcie_link_status = 0;
+       u32 n;
+-      int i;
++      int i = 0;
+       u32 p2p_br_devnum[PCIE_P2P_MAX];
++      int irqs[PCIE_P2P_MAX];
+       struct mt7621_pcie_port *port;
+       list_for_each_entry(port, &pcie->ports, list) {
+               u32 slot = port->slot;
++              irqs[i++] = port->irq;
+               if (port->enabled)
+                       pcie_link_status |= BIT(slot);
+       }
+@@ -614,6 +637,15 @@ static int mt7621_pcie_init_virtual_bridges(struct mt7621_pcie *pcie)
+                (p2p_br_devnum[1] << PCIE_P2P_BR_DEVNUM1_SHIFT) |
+                (p2p_br_devnum[2] << PCIE_P2P_BR_DEVNUM2_SHIFT));
++      /* Assign IRQs */
++      n = 0;
++      for (i = 0; i < PCIE_P2P_MAX; i++)
++              if (pcie_link_status & BIT(i))
++                      pcie->irq_map[n++] = irqs[i];
++
++      for (i = n; i < PCIE_P2P_MAX; i++)
++              pcie->irq_map[i] = -1;
++
+       return 0;
+ }
+@@ -638,7 +670,7 @@ static int mt7621_pcie_register_host(struct pci_host_bridge *host,
+       host->busnr = pcie->busn.start;
+       host->dev.parent = pcie->dev;
+       host->ops = &mt7621_pci_ops;
+-      host->map_irq = of_irq_parse_and_map_pci;
++      host->map_irq = mt7621_map_irq;
+       host->swizzle_irq = pci_common_swizzle;
+       host->sysdata = pcie;
+-- 
+2.25.1
+
diff --git a/queue-5.7/staging-rtl8712-fix-multiline-derefernce-warnings.patch b/queue-5.7/staging-rtl8712-fix-multiline-derefernce-warnings.patch
new file mode 100644 (file)
index 0000000..c8273fd
--- /dev/null
@@ -0,0 +1,80 @@
+From bb6d6c722205376e66f08c8409d0ba4db5d9908b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 29 Mar 2020 14:57:47 -0400
+Subject: staging: rtl8712: fix multiline derefernce warnings
+
+From: Aiman Najjar <aiman.najjar@hurranet.com>
+
+[ Upstream commit 269da10b1477c31c660288633c8d613e421b131f ]
+
+This patch fixes remaining checkpatch warnings
+in rtl871x_xmit.c:
+
+WARNING: Avoid multiple line dereference - prefer 'psecuritypriv->PrivacyKeyIndex'
+636: FILE: drivers/staging//rtl8712/rtl871x_xmit.c:636:
++                                            (u8)psecuritypriv->
++                                            PrivacyKeyIndex);
+
+WARNING: Avoid multiple line dereference - prefer 'psecuritypriv->XGrpKeyid'
+643: FILE: drivers/staging//rtl8712/rtl871x_xmit.c:643:
++                                                 (u8)psecuritypriv->
++                                                 XGrpKeyid);
+
+WARNING: Avoid multiple line dereference - prefer 'psecuritypriv->XGrpKeyid'
+652: FILE: drivers/staging//rtl8712/rtl871x_xmit.c:652:
++                                                 (u8)psecuritypriv->
++                                                 XGrpKeyid);
+
+Signed-off-by: Aiman Najjar <aiman.najjar@hurranet.com>
+Reviewed-by: Dan Carpenter <dan.carpenter@oracle.com>
+Link: https://lore.kernel.org/r/98805a72b92e9bbf933e05b827d27944663b7bc1.1585508171.git.aiman.najjar@hurranet.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/staging/rtl8712/rtl871x_xmit.c | 11 ++++-------
+ 1 file changed, 4 insertions(+), 7 deletions(-)
+
+diff --git a/drivers/staging/rtl8712/rtl871x_xmit.c b/drivers/staging/rtl8712/rtl871x_xmit.c
+index f0b85338b567c..57f4fd22b0ff5 100644
+--- a/drivers/staging/rtl8712/rtl871x_xmit.c
++++ b/drivers/staging/rtl8712/rtl871x_xmit.c
+@@ -589,7 +589,7 @@ sint r8712_xmitframe_coalesce(struct _adapter *padapter, _pkt *pkt,
+       addr_t addr;
+       u8 *pframe, *mem_start, *ptxdesc;
+       struct sta_info         *psta;
+-      struct security_priv    *psecuritypriv = &padapter->securitypriv;
++      struct security_priv    *psecpriv = &padapter->securitypriv;
+       struct mlme_priv        *pmlmepriv = &padapter->mlmepriv;
+       struct xmit_priv        *pxmitpriv = &padapter->xmitpriv;
+       struct pkt_attrib       *pattrib = &pxmitframe->attrib;
+@@ -632,15 +632,13 @@ sint r8712_xmitframe_coalesce(struct _adapter *padapter, _pkt *pkt,
+                               case _WEP40_:
+                               case _WEP104_:
+                                       WEP_IV(pattrib->iv, psta->txpn,
+-                                             (u8)psecuritypriv->
+-                                             PrivacyKeyIndex);
++                                             (u8)psecpriv->PrivacyKeyIndex);
+                                       break;
+                               case _TKIP_:
+                                       if (bmcst)
+                                               TKIP_IV(pattrib->iv,
+                                                   psta->txpn,
+-                                                  (u8)psecuritypriv->
+-                                                  XGrpKeyid);
++                                                  (u8)psecpriv->XGrpKeyid);
+                                       else
+                                               TKIP_IV(pattrib->iv, psta->txpn,
+                                                       0);
+@@ -648,8 +646,7 @@ sint r8712_xmitframe_coalesce(struct _adapter *padapter, _pkt *pkt,
+                               case _AES_:
+                                       if (bmcst)
+                                               AES_IV(pattrib->iv, psta->txpn,
+-                                                  (u8)psecuritypriv->
+-                                                  XGrpKeyid);
++                                                  (u8)psecpriv->XGrpKeyid);
+                                       else
+                                               AES_IV(pattrib->iv, psta->txpn,
+                                                      0);
+-- 
+2.25.1
+
diff --git a/queue-5.7/staging-sm750fb-add-missing-case-while-setting-fb_vi.patch b/queue-5.7/staging-sm750fb-add-missing-case-while-setting-fb_vi.patch
new file mode 100644 (file)
index 0000000..0eff737
--- /dev/null
@@ -0,0 +1,36 @@
+From 554964ff2ae1baf100bdd3f069728e7eb2f481fb Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 30 Apr 2020 22:09:24 +0200
+Subject: staging: sm750fb: add missing case while setting FB_VISUAL
+
+From: Matej Dujava <mdujava@kocurkovo.cz>
+
+[ Upstream commit fa90133377f4a7f15a937df6ad55133bb57c5665 ]
+
+Switch statement does not contain all cases: 8, 16, 24, 32.
+This patch will add missing one (24)
+
+Fixes: 81dee67e215b ("staging: sm750fb: add sm750 to staging")
+Signed-off-by: Matej Dujava <mdujava@kocurkovo.cz>
+Link: https://lore.kernel.org/r/1588277366-19354-2-git-send-email-mdujava@kocurkovo.cz
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/staging/sm750fb/sm750.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/staging/sm750fb/sm750.c b/drivers/staging/sm750fb/sm750.c
+index 59568d18ce230..5b72aa81d94c1 100644
+--- a/drivers/staging/sm750fb/sm750.c
++++ b/drivers/staging/sm750fb/sm750.c
+@@ -898,6 +898,7 @@ static int lynxfb_set_fbinfo(struct fb_info *info, int index)
+               fix->visual = FB_VISUAL_PSEUDOCOLOR;
+               break;
+       case 16:
++      case 24:
+       case 32:
+               fix->visual = FB_VISUAL_TRUECOLOR;
+               break;
+-- 
+2.25.1
+
diff --git a/queue-5.7/staging-wfx-avoid-compiler-warning-on-empty-array.patch b/queue-5.7/staging-wfx-avoid-compiler-warning-on-empty-array.patch
new file mode 100644 (file)
index 0000000..c39e212
--- /dev/null
@@ -0,0 +1,74 @@
+From 12862766f891a73b2735ea4b05d2763126f9d1d0 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 29 Apr 2020 16:21:09 +0200
+Subject: staging: wfx: avoid compiler warning on empty array
+
+From: Arnd Bergmann <arnd@arndb.de>
+
+[ Upstream commit 2eeefd3787fdc6319124945d453774be95b97897 ]
+
+When CONFIG_OF is disabled, gcc-9 produces a warning about the
+wfx_sdio_of_match[] array having a declaration without a dimension:
+
+drivers/staging/wfx/bus_sdio.c:159:34: error: array 'wfx_sdio_of_match' assumed to have one element [-Werror]
+  159 | static const struct of_device_id wfx_sdio_of_match[];
+      |                                  ^~~~~~~~~~~~~~~~~
+
+Move the proper declaration up and out of the #ifdef instead.
+
+Fixes: a7a91ca5a23d ("staging: wfx: add infrastructure for new driver")
+Signed-off-by: Arnd Bergmann <arnd@arndb.de>
+Cc: Jerome Pouiller <Jerome.Pouiller@silabs.com>
+Link: https://lore.kernel.org/r/20200429142119.1735196-1-arnd@arndb.de
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/staging/wfx/bus_sdio.c | 19 ++++++++-----------
+ 1 file changed, 8 insertions(+), 11 deletions(-)
+
+diff --git a/drivers/staging/wfx/bus_sdio.c b/drivers/staging/wfx/bus_sdio.c
+index dedc3ff58d3eb..c2e4bd1e3b0a0 100644
+--- a/drivers/staging/wfx/bus_sdio.c
++++ b/drivers/staging/wfx/bus_sdio.c
+@@ -156,7 +156,13 @@ static const struct hwbus_ops wfx_sdio_hwbus_ops = {
+       .align_size             = wfx_sdio_align_size,
+ };
+-static const struct of_device_id wfx_sdio_of_match[];
++static const struct of_device_id wfx_sdio_of_match[] = {
++      { .compatible = "silabs,wfx-sdio" },
++      { .compatible = "silabs,wf200" },
++      { },
++};
++MODULE_DEVICE_TABLE(of, wfx_sdio_of_match);
++
+ static int wfx_sdio_probe(struct sdio_func *func,
+                         const struct sdio_device_id *id)
+ {
+@@ -248,15 +254,6 @@ static const struct sdio_device_id wfx_sdio_ids[] = {
+ };
+ MODULE_DEVICE_TABLE(sdio, wfx_sdio_ids);
+-#ifdef CONFIG_OF
+-static const struct of_device_id wfx_sdio_of_match[] = {
+-      { .compatible = "silabs,wfx-sdio" },
+-      { .compatible = "silabs,wf200" },
+-      { },
+-};
+-MODULE_DEVICE_TABLE(of, wfx_sdio_of_match);
+-#endif
+-
+ struct sdio_driver wfx_sdio_driver = {
+       .name = "wfx-sdio",
+       .id_table = wfx_sdio_ids,
+@@ -264,6 +261,6 @@ struct sdio_driver wfx_sdio_driver = {
+       .remove = wfx_sdio_remove,
+       .drv = {
+               .owner = THIS_MODULE,
+-              .of_match_table = of_match_ptr(wfx_sdio_of_match),
++              .of_match_table = wfx_sdio_of_match,
+       }
+ };
+-- 
+2.25.1
+
diff --git a/queue-5.7/staging-wfx-check-ssidlen-and-prevent-an-array-overf.patch b/queue-5.7/staging-wfx-check-ssidlen-and-prevent-an-array-overf.patch
new file mode 100644 (file)
index 0000000..4d21fea
--- /dev/null
@@ -0,0 +1,42 @@
+From 88ab974de53e8863e73414b24ec9dda65a593839 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 24 Apr 2020 13:42:35 +0300
+Subject: staging: wfx: check ssidlen and prevent an array overflow
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Dan Carpenter <dan.carpenter@oracle.com>
+
+[ Upstream commit 87f86cddda65cab8a7e3df8a00e16abeccaa0730 ]
+
+We need to cap "ssidlen" to prevent a memcpy() overflow.
+
+Fixes: 40115bbc40e2 ("staging: wfx: implement the rest of mac80211 API")
+Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
+Reviewed-by: Jérôme Pouiller <jerome.pouiller@silabs.com>
+Link: https://lore.kernel.org/r/20200424104235.GA416402@mwanda
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/staging/wfx/sta.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/staging/wfx/sta.c b/drivers/staging/wfx/sta.c
+index 9d430346a58bb..969d7a4a7fbd9 100644
+--- a/drivers/staging/wfx/sta.c
++++ b/drivers/staging/wfx/sta.c
+@@ -520,7 +520,9 @@ static void wfx_do_join(struct wfx_vif *wvif)
+               ssidie = ieee80211_bss_get_ie(bss, WLAN_EID_SSID);
+       if (ssidie) {
+               ssidlen = ssidie[1];
+-              memcpy(ssid, &ssidie[2], ssidie[1]);
++              if (ssidlen > IEEE80211_MAX_SSID_LEN)
++                      ssidlen = IEEE80211_MAX_SSID_LEN;
++              memcpy(ssid, &ssidie[2], ssidlen);
+       }
+       rcu_read_unlock();
+-- 
+2.25.1
+
diff --git a/queue-5.7/staging-wfx-fix-double-init-of-tx_policy_upload_work.patch b/queue-5.7/staging-wfx-fix-double-init-of-tx_policy_upload_work.patch
new file mode 100644 (file)
index 0000000..5d16f90
--- /dev/null
@@ -0,0 +1,38 @@
+From b03432f44fc17d607eb286d887252086415745ef Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 27 Apr 2020 15:40:25 +0200
+Subject: staging: wfx: fix double init of tx_policy_upload_work
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Jérôme Pouiller <jerome.pouiller@silabs.com>
+
+[ Upstream commit 6ae0878b4800c7042d35c0fb4c6baabb62621ecc ]
+
+The work_struct tx_policy_upload_work was initialized twice.
+
+Fixes: 99879121bfbb ("staging: wfx: fix the cache of rate policies on interface reset")
+Signed-off-by: Jérôme Pouiller <jerome.pouiller@silabs.com>
+Link: https://lore.kernel.org/r/20200427134031.323403-12-Jerome.Pouiller@silabs.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/staging/wfx/sta.c | 1 -
+ 1 file changed, 1 deletion(-)
+
+diff --git a/drivers/staging/wfx/sta.c b/drivers/staging/wfx/sta.c
+index 969d7a4a7fbd9..b4cd7cb1ce569 100644
+--- a/drivers/staging/wfx/sta.c
++++ b/drivers/staging/wfx/sta.c
+@@ -1049,7 +1049,6 @@ int wfx_add_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
+       init_completion(&wvif->scan_complete);
+       INIT_WORK(&wvif->scan_work, wfx_hw_scan_work);
+-      INIT_WORK(&wvif->tx_policy_upload_work, wfx_tx_policy_upload_work);
+       mutex_unlock(&wdev->conf_mutex);
+       hif_set_macaddr(wvif, vif->addr);
+-- 
+2.25.1
+
diff --git a/queue-5.7/staging-wfx-fix-output-of-rx_stats-on-big-endian-hos.patch b/queue-5.7/staging-wfx-fix-output-of-rx_stats-on-big-endian-hos.patch
new file mode 100644 (file)
index 0000000..7965d4c
--- /dev/null
@@ -0,0 +1,55 @@
+From 80bd85ea5192c99a2019df84078017dee12d1c1e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 12 May 2020 17:04:02 +0200
+Subject: staging: wfx: fix output of rx_stats on big endian hosts
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Jérôme Pouiller <jerome.pouiller@silabs.com>
+
+[ Upstream commit a823d6ecd4904e1a6ffb12964de88fb0bb4802f6 ]
+
+The struct hif_rx_stats contains only little endian values. Thus, it is
+necessary to fix byte ordering before to use them.
+
+Signed-off-by: Jérôme Pouiller <jerome.pouiller@silabs.com>
+Link: https://lore.kernel.org/r/20200512150414.267198-6-Jerome.Pouiller@silabs.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/staging/wfx/debug.c | 11 +++++++----
+ 1 file changed, 7 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/staging/wfx/debug.c b/drivers/staging/wfx/debug.c
+index 1164aba118a18..a73b5bbb578e6 100644
+--- a/drivers/staging/wfx/debug.c
++++ b/drivers/staging/wfx/debug.c
+@@ -142,7 +142,7 @@ static int wfx_rx_stats_show(struct seq_file *seq, void *v)
+       mutex_lock(&wdev->rx_stats_lock);
+       seq_printf(seq, "Timestamp: %dus\n", st->date);
+       seq_printf(seq, "Low power clock: frequency %uHz, external %s\n",
+-                 st->pwr_clk_freq,
++                 le32_to_cpu(st->pwr_clk_freq),
+                  st->is_ext_pwr_clk ? "yes" : "no");
+       seq_printf(seq,
+                  "Num. of frames: %d, PER (x10e4): %d, Throughput: %dKbps/s\n",
+@@ -152,9 +152,12 @@ static int wfx_rx_stats_show(struct seq_file *seq, void *v)
+       for (i = 0; i < ARRAY_SIZE(channel_names); i++) {
+               if (channel_names[i])
+                       seq_printf(seq, "%5s %8d %8d %8d %8d %8d\n",
+-                                 channel_names[i], st->nb_rx_by_rate[i],
+-                                 st->per[i], st->rssi[i] / 100,
+-                                 st->snr[i] / 100, st->cfo[i]);
++                                 channel_names[i],
++                                 le32_to_cpu(st->nb_rx_by_rate[i]),
++                                 le16_to_cpu(st->per[i]),
++                                 (s16)le16_to_cpu(st->rssi[i]) / 100,
++                                 (s16)le16_to_cpu(st->snr[i]) / 100,
++                                 (s16)le16_to_cpu(st->cfo[i]));
+       }
+       mutex_unlock(&wdev->rx_stats_lock);
+-- 
+2.25.1
+
diff --git a/queue-5.7/staging-wfx-fix-overflow-in-frame-counters.patch b/queue-5.7/staging-wfx-fix-overflow-in-frame-counters.patch
new file mode 100644 (file)
index 0000000..1f00abe
--- /dev/null
@@ -0,0 +1,46 @@
+From 9f5a9a3d2c102014f33f465bc0bada0c926c554a Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 27 Apr 2020 15:40:23 +0200
+Subject: staging: wfx: fix overflow in frame counters
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Jérôme Pouiller <jerome.pouiller@silabs.com>
+
+[ Upstream commit 87066173e34b0ca5d041d5519e6bb030b1958184 ]
+
+It has been reported that trying to send small packets of data could
+produce a "inconsistent notification" warning.
+
+It seems that in some circumstances, the number of frame queued in the
+driver could greatly increase and exceed UCHAR_MAX. So the field
+"buffered" from struct sta_priv can overflow.
+
+Just increase the size of "bueffered" to fix the problem.
+
+Fixes: 7d2d2bfdeb82 ("staging: wfx: relocate "buffered" information to sta_priv")
+Signed-off-by: Jérôme Pouiller <jerome.pouiller@silabs.com>
+Link: https://lore.kernel.org/r/20200427134031.323403-10-Jerome.Pouiller@silabs.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/staging/wfx/sta.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/staging/wfx/sta.h b/drivers/staging/wfx/sta.h
+index cf99a8a74a81b..ace845f9ed140 100644
+--- a/drivers/staging/wfx/sta.h
++++ b/drivers/staging/wfx/sta.h
+@@ -37,7 +37,7 @@ struct wfx_grp_addr_table {
+ struct wfx_sta_priv {
+       int link_id;
+       int vif_id;
+-      u8 buffered[IEEE80211_NUM_TIDS];
++      int buffered[IEEE80211_NUM_TIDS];
+       // Ensure atomicity of "buffered" and calls to ieee80211_sta_set_buffered()
+       spinlock_t lock;
+ };
+-- 
+2.25.1
+
diff --git a/queue-5.7/staging-wfx-fix-potential-deadlock-in-wfx_tx_flush.patch b/queue-5.7/staging-wfx-fix-potential-deadlock-in-wfx_tx_flush.patch
new file mode 100644 (file)
index 0000000..d793b9d
--- /dev/null
@@ -0,0 +1,55 @@
+From 6866b19e1451a97bf755131e4b6efad15d44ee57 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 1 Apr 2020 13:04:03 +0200
+Subject: staging: wfx: fix potential deadlock in wfx_tx_flush()
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Jérôme Pouiller <jerome.pouiller@silabs.com>
+
+[ Upstream commit a39e761aa4fefa2a8aaf549217329933b91da7c9 ]
+
+wfx_tx_flush() wait there are no more frame in device buffer. However,
+this event may never happens since wfx_tx_flush() don't forbid to
+enqueue new frames.
+
+Note that wfx_tx_flush() should only ensure that all frames currently in
+hardware queues are sent. So the current code is more restrictive that
+it should.
+
+Note that wfx_tx_flush() release the lock before to return while
+wfx_tx_lock_flush() keep the lock.
+
+Reviewed-by: Dan Carpenter <dan.carpenter@oracle.com>
+Signed-off-by: Jérôme Pouiller <jerome.pouiller@silabs.com>
+Link: https://lore.kernel.org/r/20200401110405.80282-31-Jerome.Pouiller@silabs.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/staging/wfx/queue.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/drivers/staging/wfx/queue.c b/drivers/staging/wfx/queue.c
+index 39d9127ce4b9f..8ae23681e29bc 100644
+--- a/drivers/staging/wfx/queue.c
++++ b/drivers/staging/wfx/queue.c
+@@ -35,6 +35,7 @@ void wfx_tx_flush(struct wfx_dev *wdev)
+       if (wdev->chip_frozen)
+               return;
++      wfx_tx_lock(wdev);
+       mutex_lock(&wdev->hif_cmd.lock);
+       ret = wait_event_timeout(wdev->hif.tx_buffers_empty,
+                                !wdev->hif.tx_buffers_used,
+@@ -47,6 +48,7 @@ void wfx_tx_flush(struct wfx_dev *wdev)
+               wdev->chip_frozen = 1;
+       }
+       mutex_unlock(&wdev->hif_cmd.lock);
++      wfx_tx_unlock(wdev);
+ }
+ void wfx_tx_lock_flush(struct wfx_dev *wdev)
+-- 
+2.25.1
+
diff --git a/queue-5.7/staging-wfx-fix-value-of-scan-timeout.patch b/queue-5.7/staging-wfx-fix-value-of-scan-timeout.patch
new file mode 100644 (file)
index 0000000..a9dfb7a
--- /dev/null
@@ -0,0 +1,41 @@
+From 160dc81ad387b3c4bccb72032ea351e18af387a9 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 15 May 2020 10:33:10 +0200
+Subject: staging: wfx: fix value of scan timeout
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Jérôme Pouiller <jerome.pouiller@silabs.com>
+
+[ Upstream commit 6598b12d6635e8e3060863b84c04e472546ee126 ]
+
+Before to start the scan request, the firmware signals (with a null
+frame) to the AP it won't be able to receive data. This frame can be
+long to send: up to 512TU. The current calculus of the scan timeout does
+not take into account this delay.
+
+Signed-off-by: Jérôme Pouiller <jerome.pouiller@silabs.com>
+Link: https://lore.kernel.org/r/20200515083325.378539-5-Jerome.Pouiller@silabs.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/staging/wfx/hif_tx.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/staging/wfx/hif_tx.c b/drivers/staging/wfx/hif_tx.c
+index 77bca43aca428..20b3045d76674 100644
+--- a/drivers/staging/wfx/hif_tx.c
++++ b/drivers/staging/wfx/hif_tx.c
+@@ -268,7 +268,7 @@ int hif_scan(struct wfx_vif *wvif, struct cfg80211_scan_request *req,
+       tmo_chan_bg = le32_to_cpu(body->max_channel_time) * USEC_PER_TU;
+       tmo_chan_fg = 512 * USEC_PER_TU + body->probe_delay;
+       tmo_chan_fg *= body->num_of_probe_requests;
+-      tmo = chan_num * max(tmo_chan_bg, tmo_chan_fg);
++      tmo = chan_num * max(tmo_chan_bg, tmo_chan_fg) + 512 * USEC_PER_TU;
+       wfx_fill_header(hif, wvif->id, HIF_REQ_ID_START_SCAN, buf_len);
+       ret = wfx_cmd_send(wvif->wdev, hif, NULL, 0, false);
+-- 
+2.25.1
+
diff --git a/queue-5.7/staging-wilc1000-increase-the-size-of-wid_list-array.patch b/queue-5.7/staging-wilc1000-increase-the-size-of-wid_list-array.patch
new file mode 100644 (file)
index 0000000..c0163d8
--- /dev/null
@@ -0,0 +1,51 @@
+From 2bfadbb778ecfcfb4469947578cde166727256c4 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 4 May 2020 17:09:11 +0200
+Subject: staging: wilc1000: Increase the size of wid_list array
+
+From: Oscar Carter <oscar.carter@gmx.com>
+
+[ Upstream commit a4338ed2e1cf724563956ec5f91deeaabfedbe23 ]
+
+Increase by one the size of wid_list array as index variable can reach a
+value of 5. If this happens, an out-of-bounds access is performed.
+
+Also, use a #define instead of a hard-coded literal for the new array
+size.
+
+Addresses-Coverity-ID: 1451981 ("Out-of-bounds access")
+Fixes: f5a3cb90b802d ("staging: wilc1000: add passive scan support")
+Acked-by: Ajay Singh <ajay.kathat@microchip.com>
+Signed-off-by: Oscar Carter <oscar.carter@gmx.com>
+Link: https://lore.kernel.org/r/20200504150911.4470-1-oscar.carter@gmx.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/staging/wilc1000/hif.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/staging/wilc1000/hif.c b/drivers/staging/wilc1000/hif.c
+index 6c7de2f8d3f26..d025a30930157 100644
+--- a/drivers/staging/wilc1000/hif.c
++++ b/drivers/staging/wilc1000/hif.c
+@@ -11,6 +11,8 @@
+ #define WILC_FALSE_FRMWR_CHANNEL              100
++#define WILC_SCAN_WID_LIST_SIZE               6
++
+ struct wilc_rcvd_mac_info {
+       u8 status;
+ };
+@@ -151,7 +153,7 @@ int wilc_scan(struct wilc_vif *vif, u8 scan_source, u8 scan_type,
+             void *user_arg, struct cfg80211_scan_request *request)
+ {
+       int result = 0;
+-      struct wid wid_list[5];
++      struct wid wid_list[WILC_SCAN_WID_LIST_SIZE];
+       u32 index = 0;
+       u32 i, scan_timeout;
+       u8 *buffer;
+-- 
+2.25.1
+
diff --git a/queue-5.7/thermal-drivers-ti-soc-thermal-avoid-dereferencing-e.patch b/queue-5.7/thermal-drivers-ti-soc-thermal-avoid-dereferencing-e.patch
new file mode 100644 (file)
index 0000000..c8d0abd
--- /dev/null
@@ -0,0 +1,57 @@
+From a51ebd6925a195b7d84420e32cb747c8a7b97c0c Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 24 Apr 2020 17:19:44 +0100
+Subject: thermal/drivers/ti-soc-thermal: Avoid dereferencing ERR_PTR
+
+From: Sudip Mukherjee <sudipm.mukherjee@gmail.com>
+
+[ Upstream commit 7440f518dad9d861d76c64956641eeddd3586f75 ]
+
+On error the function ti_bandgap_get_sensor_data() returns the error
+code in ERR_PTR() but we only checked if the return value is NULL or
+not. And, so we can dereference an error code inside ERR_PTR.
+While at it, convert a check to IS_ERR_OR_NULL.
+
+Signed-off-by: Sudip Mukherjee <sudipm.mukherjee@gmail.com>
+Reviewed-by: Amit Kucheria <amit.kucheria@linaro.org>
+Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
+Link: https://lore.kernel.org/r/20200424161944.6044-1-sudipm.mukherjee@gmail.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/thermal/ti-soc-thermal/ti-thermal-common.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/thermal/ti-soc-thermal/ti-thermal-common.c b/drivers/thermal/ti-soc-thermal/ti-thermal-common.c
+index d3e959d01606c..85776db4bf346 100644
+--- a/drivers/thermal/ti-soc-thermal/ti-thermal-common.c
++++ b/drivers/thermal/ti-soc-thermal/ti-thermal-common.c
+@@ -169,7 +169,7 @@ int ti_thermal_expose_sensor(struct ti_bandgap *bgp, int id,
+       data = ti_bandgap_get_sensor_data(bgp, id);
+-      if (!data || IS_ERR(data))
++      if (!IS_ERR_OR_NULL(data))
+               data = ti_thermal_build_data(bgp, id);
+       if (!data)
+@@ -196,7 +196,7 @@ int ti_thermal_remove_sensor(struct ti_bandgap *bgp, int id)
+       data = ti_bandgap_get_sensor_data(bgp, id);
+-      if (data && data->ti_thermal) {
++      if (!IS_ERR_OR_NULL(data) && data->ti_thermal) {
+               if (data->our_zone)
+                       thermal_zone_device_unregister(data->ti_thermal);
+       }
+@@ -262,7 +262,7 @@ int ti_thermal_unregister_cpu_cooling(struct ti_bandgap *bgp, int id)
+       data = ti_bandgap_get_sensor_data(bgp, id);
+-      if (data) {
++      if (!IS_ERR_OR_NULL(data)) {
+               cpufreq_cooling_unregister(data->cool_dev);
+               if (data->policy)
+                       cpufreq_cpu_put(data->policy);
+-- 
+2.25.1
+
diff --git a/queue-5.7/tools-bpftool-fix-memory-leak-in-codegen-error-cases.patch b/queue-5.7/tools-bpftool-fix-memory-leak-in-codegen-error-cases.patch
new file mode 100644 (file)
index 0000000..2b1c274
--- /dev/null
@@ -0,0 +1,44 @@
+From e96b9cd5112ce959bf8903dd6b81c89e3baf3ce3 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 10 Jun 2020 15:08:04 +0200
+Subject: tools, bpftool: Fix memory leak in codegen error cases
+
+From: Tobias Klauser <tklauser@distanz.ch>
+
+[ Upstream commit d4060ac969563113101c79433f2ae005feca1c29 ]
+
+Free the memory allocated for the template on error paths in function
+codegen.
+
+Signed-off-by: Tobias Klauser <tklauser@distanz.ch>
+Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
+Acked-by: Andrii Nakryiko <andriin@fb.com>
+Link: https://lore.kernel.org/bpf/20200610130804.21423-1-tklauser@distanz.ch
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ tools/bpf/bpftool/gen.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/tools/bpf/bpftool/gen.c b/tools/bpf/bpftool/gen.c
+index f8113b3646f52..f5960b48c8615 100644
+--- a/tools/bpf/bpftool/gen.c
++++ b/tools/bpf/bpftool/gen.c
+@@ -225,6 +225,7 @@ static int codegen(const char *template, ...)
+               } else {
+                       p_err("unrecognized character at pos %td in template '%s'",
+                             src - template - 1, template);
++                      free(s);
+                       return -EINVAL;
+               }
+       }
+@@ -235,6 +236,7 @@ static int codegen(const char *template, ...)
+                       if (*src != '\t') {
+                               p_err("not enough tabs at pos %td in template '%s'",
+                                     src - template - 1, template);
++                              free(s);
+                               return -EINVAL;
+                       }
+               }
+-- 
+2.25.1
+
diff --git a/queue-5.7/tracing-probe-fix-bpf_task_fd_query-for-kprobes-and-.patch b/queue-5.7/tracing-probe-fix-bpf_task_fd_query-for-kprobes-and-.patch
new file mode 100644 (file)
index 0000000..729ee0f
--- /dev/null
@@ -0,0 +1,57 @@
+From 06842c9c5ef0ef8a8c28b644d9e152c90a060dcd Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 8 Jun 2020 14:45:32 +0200
+Subject: tracing/probe: Fix bpf_task_fd_query() for kprobes and uprobes
+
+From: Jean-Philippe Brucker <jean-philippe@linaro.org>
+
+[ Upstream commit 22d5bd6867364b41576a712755271a7d6161abd6 ]
+
+Commit 60d53e2c3b75 ("tracing/probe: Split trace_event related data from
+trace_probe") removed the trace_[ku]probe structure from the
+trace_event_call->data pointer. As bpf_get_[ku]probe_info() were
+forgotten in that change, fix them now. These functions are currently
+only used by the bpf_task_fd_query() syscall handler to collect
+information about a perf event.
+
+Fixes: 60d53e2c3b75 ("tracing/probe: Split trace_event related data from trace_probe")
+Signed-off-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
+Signed-off-by: Alexei Starovoitov <ast@kernel.org>
+Acked-by: Yonghong Song <yhs@fb.com>
+Acked-by: Masami Hiramatsu <mhiramat@kernel.org>
+Link: https://lore.kernel.org/bpf/20200608124531.819838-1-jean-philippe@linaro.org
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ kernel/trace/trace_kprobe.c | 2 +-
+ kernel/trace/trace_uprobe.c | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/kernel/trace/trace_kprobe.c b/kernel/trace/trace_kprobe.c
+index 35989383ae113..8eeb95e04bf52 100644
+--- a/kernel/trace/trace_kprobe.c
++++ b/kernel/trace/trace_kprobe.c
+@@ -1629,7 +1629,7 @@ int bpf_get_kprobe_info(const struct perf_event *event, u32 *fd_type,
+       if (perf_type_tracepoint)
+               tk = find_trace_kprobe(pevent, group);
+       else
+-              tk = event->tp_event->data;
++              tk = trace_kprobe_primary_from_call(event->tp_event);
+       if (!tk)
+               return -EINVAL;
+diff --git a/kernel/trace/trace_uprobe.c b/kernel/trace/trace_uprobe.c
+index 2a8e8e9c1c754..fdd47f99b18fd 100644
+--- a/kernel/trace/trace_uprobe.c
++++ b/kernel/trace/trace_uprobe.c
+@@ -1412,7 +1412,7 @@ int bpf_get_uprobe_info(const struct perf_event *event, u32 *fd_type,
+       if (perf_type_tracepoint)
+               tu = find_probe_event(pevent, group);
+       else
+-              tu = event->tp_event->data;
++              tu = trace_uprobe_primary_from_call(event->tp_event);
+       if (!tu)
+               return -EINVAL;
+-- 
+2.25.1
+
diff --git a/queue-5.7/tty-hvc-fix-data-abort-due-to-race-in-hvc_open.patch b/queue-5.7/tty-hvc-fix-data-abort-due-to-race-in-hvc_open.patch
new file mode 100644 (file)
index 0000000..d554bc3
--- /dev/null
@@ -0,0 +1,81 @@
+From 3aee1a097adf760292d154d31dd3fa6959b9c1b1 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 27 Apr 2020 20:26:01 -0700
+Subject: tty: hvc: Fix data abort due to race in hvc_open
+
+From: Raghavendra Rao Ananta <rananta@codeaurora.org>
+
+[ Upstream commit e2bd1dcbe1aa34ff5570b3427c530e4332ecf0fe ]
+
+Potentially, hvc_open() can be called in parallel when two tasks calls
+open() on /dev/hvcX. In such a scenario, if the hp->ops->notifier_add()
+callback in the function fails, where it sets the tty->driver_data to
+NULL, the parallel hvc_open() can see this NULL and cause a memory abort.
+Hence, serialize hvc_open and check if tty->private_data is NULL before
+proceeding ahead.
+
+The issue can be easily reproduced by launching two tasks simultaneously
+that does nothing but open() and close() on /dev/hvcX.
+For example:
+$ ./simple_open_close /dev/hvc0 & ./simple_open_close /dev/hvc0 &
+
+Signed-off-by: Raghavendra Rao Ananta <rananta@codeaurora.org>
+Link: https://lore.kernel.org/r/20200428032601.22127-1-rananta@codeaurora.org
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/tty/hvc/hvc_console.c | 16 ++++++++++++++--
+ 1 file changed, 14 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/tty/hvc/hvc_console.c b/drivers/tty/hvc/hvc_console.c
+index cdcc64ea2554f..f8e43a6faea9b 100644
+--- a/drivers/tty/hvc/hvc_console.c
++++ b/drivers/tty/hvc/hvc_console.c
+@@ -75,6 +75,8 @@ static LIST_HEAD(hvc_structs);
+  */
+ static DEFINE_MUTEX(hvc_structs_mutex);
++/* Mutex to serialize hvc_open */
++static DEFINE_MUTEX(hvc_open_mutex);
+ /*
+  * This value is used to assign a tty->index value to a hvc_struct based
+  * upon order of exposure via hvc_probe(), when we can not match it to
+@@ -346,16 +348,24 @@ static int hvc_install(struct tty_driver *driver, struct tty_struct *tty)
+  */
+ static int hvc_open(struct tty_struct *tty, struct file * filp)
+ {
+-      struct hvc_struct *hp = tty->driver_data;
++      struct hvc_struct *hp;
+       unsigned long flags;
+       int rc = 0;
++      mutex_lock(&hvc_open_mutex);
++
++      hp = tty->driver_data;
++      if (!hp) {
++              rc = -EIO;
++              goto out;
++      }
++
+       spin_lock_irqsave(&hp->port.lock, flags);
+       /* Check and then increment for fast path open. */
+       if (hp->port.count++ > 0) {
+               spin_unlock_irqrestore(&hp->port.lock, flags);
+               hvc_kick();
+-              return 0;
++              goto out;
+       } /* else count == 0 */
+       spin_unlock_irqrestore(&hp->port.lock, flags);
+@@ -383,6 +393,8 @@ static int hvc_open(struct tty_struct *tty, struct file * filp)
+       /* Force wakeup of the polling thread */
+       hvc_kick();
++out:
++      mutex_unlock(&hvc_open_mutex);
+       return rc;
+ }
+-- 
+2.25.1
+
diff --git a/queue-5.7/tty-n_gsm-fix-bogus-i-in-gsm_data_kick.patch b/queue-5.7/tty-n_gsm-fix-bogus-i-in-gsm_data_kick.patch
new file mode 100644 (file)
index 0000000..b2c0b95
--- /dev/null
@@ -0,0 +1,53 @@
+From 57df534f2914a510ab65ad2f56e09ef4d911ab4c Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 18 May 2020 10:45:13 +0200
+Subject: tty: n_gsm: Fix bogus i++ in gsm_data_kick
+
+From: Gregory CLEMENT <gregory.clement@bootlin.com>
+
+[ Upstream commit 4dd31f1ffec6c370c3c2e0c605628bf5e16d5c46 ]
+
+When submitting the previous fix "tty: n_gsm: Fix waking up upper tty
+layer when room available". It was suggested to switch from a while to
+a for loop, but when doing it, there was a remaining bogus i++.
+
+This patch removes this i++ and also reorganizes the code making it more
+compact.
+
+Fixes: e1eaea46bb40 ("tty: n_gsm line discipline")
+Signed-off-by: Gregory CLEMENT <gregory.clement@bootlin.com>
+Link: https://lore.kernel.org/r/20200518084517.2173242-3-gregory.clement@bootlin.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/tty/n_gsm.c | 14 +++-----------
+ 1 file changed, 3 insertions(+), 11 deletions(-)
+
+diff --git a/drivers/tty/n_gsm.c b/drivers/tty/n_gsm.c
+index 0a8f241e537d9..f189579db7c4c 100644
+--- a/drivers/tty/n_gsm.c
++++ b/drivers/tty/n_gsm.c
+@@ -711,17 +711,9 @@ static void gsm_data_kick(struct gsm_mux *gsm, struct gsm_dlci *dlci)
+               } else {
+                       int i = 0;
+-                      for (i = 0; i < NUM_DLCI; i++) {
+-                              struct gsm_dlci *dlci;
+-
+-                              dlci = gsm->dlci[i];
+-                              if (dlci == NULL) {
+-                                      i++;
+-                                      continue;
+-                              }
+-
+-                              tty_port_tty_wakeup(&dlci->port);
+-                      }
++                      for (i = 0; i < NUM_DLCI; i++)
++                              if (gsm->dlci[i])
++                                      tty_port_tty_wakeup(&gsm->dlci[i]->port);
+               }
+       }
+ }
+-- 
+2.25.1
+
diff --git a/queue-5.7/tty-n_gsm-fix-sof-skipping.patch b/queue-5.7/tty-n_gsm-fix-sof-skipping.patch
new file mode 100644 (file)
index 0000000..a7de763
--- /dev/null
@@ -0,0 +1,58 @@
+From 607776cbee842fa7841333001877c5fbd1a791de Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 12 May 2020 13:53:22 +0200
+Subject: tty: n_gsm: Fix SOF skipping
+
+From: Gregory CLEMENT <gregory.clement@bootlin.com>
+
+[ Upstream commit 84d6f81c1fb58b56eba81ff0a36cf31946064b40 ]
+
+For at least some modems like the TELIT LE910, skipping SOF makes
+transfers blocking indefinitely after a short amount of data
+transferred.
+
+Given the small improvement provided by skipping the SOF (just one
+byte on about 100 bytes), it seems better to completely remove this
+"feature" than make it optional.
+
+Fixes: e1eaea46bb40 ("tty: n_gsm line discipline")
+Signed-off-by: Gregory CLEMENT <gregory.clement@bootlin.com>
+Link: https://lore.kernel.org/r/20200512115323.1447922-3-gregory.clement@bootlin.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/tty/n_gsm.c | 8 +-------
+ 1 file changed, 1 insertion(+), 7 deletions(-)
+
+diff --git a/drivers/tty/n_gsm.c b/drivers/tty/n_gsm.c
+index d77ed82a4840e..20b22c55547e0 100644
+--- a/drivers/tty/n_gsm.c
++++ b/drivers/tty/n_gsm.c
+@@ -677,7 +677,6 @@ static void gsm_data_kick(struct gsm_mux *gsm)
+ {
+       struct gsm_msg *msg, *nmsg;
+       int len;
+-      int skip_sof = 0;
+       list_for_each_entry_safe(msg, nmsg, &gsm->tx_list, list) {
+               if (gsm->constipated && msg->addr)
+@@ -699,15 +698,10 @@ static void gsm_data_kick(struct gsm_mux *gsm)
+                       print_hex_dump_bytes("gsm_data_kick: ",
+                                            DUMP_PREFIX_OFFSET,
+                                            gsm->txframe, len);
+-
+-              if (gsm->output(gsm, gsm->txframe + skip_sof,
+-                                              len - skip_sof) < 0)
++              if (gsm->output(gsm, gsm->txframe, len) < 0)
+                       break;
+               /* FIXME: Can eliminate one SOF in many more cases */
+               gsm->tx_bytes -= msg->len;
+-              /* For a burst of frames skip the extra SOF within the
+-                 burst */
+-              skip_sof = 1;
+               list_del(&msg->list);
+               kfree(msg);
+-- 
+2.25.1
+
diff --git a/queue-5.7/tty-n_gsm-fix-waking-up-upper-tty-layer-when-room-av.patch b/queue-5.7/tty-n_gsm-fix-waking-up-upper-tty-layer-when-room-av.patch
new file mode 100644 (file)
index 0000000..8aaf635
--- /dev/null
@@ -0,0 +1,90 @@
+From 19806d66e671e953a4fbebe8692094b980352279 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 12 May 2020 13:53:23 +0200
+Subject: tty: n_gsm: Fix waking up upper tty layer when room available
+
+From: Gregory CLEMENT <gregory.clement@bootlin.com>
+
+[ Upstream commit 01dbb362f0a114fbce19c8abe4cd6f4710e934d5 ]
+
+Warn the upper layer when n_gms is ready to receive data
+again. Without this the associated virtual tty remains blocked
+indefinitely.
+
+Fixes: e1eaea46bb40 ("tty: n_gsm line discipline")
+Signed-off-by: Gregory CLEMENT <gregory.clement@bootlin.com>
+Link: https://lore.kernel.org/r/20200512115323.1447922-4-gregory.clement@bootlin.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/tty/n_gsm.c | 26 ++++++++++++++++++++++----
+ 1 file changed, 22 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/tty/n_gsm.c b/drivers/tty/n_gsm.c
+index 20b22c55547e0..0a8f241e537d9 100644
+--- a/drivers/tty/n_gsm.c
++++ b/drivers/tty/n_gsm.c
+@@ -673,7 +673,7 @@ static struct gsm_msg *gsm_data_alloc(struct gsm_mux *gsm, u8 addr, int len,
+  *    FIXME: lock against link layer control transmissions
+  */
+-static void gsm_data_kick(struct gsm_mux *gsm)
++static void gsm_data_kick(struct gsm_mux *gsm, struct gsm_dlci *dlci)
+ {
+       struct gsm_msg *msg, *nmsg;
+       int len;
+@@ -705,6 +705,24 @@ static void gsm_data_kick(struct gsm_mux *gsm)
+               list_del(&msg->list);
+               kfree(msg);
++
++              if (dlci) {
++                      tty_port_tty_wakeup(&dlci->port);
++              } else {
++                      int i = 0;
++
++                      for (i = 0; i < NUM_DLCI; i++) {
++                              struct gsm_dlci *dlci;
++
++                              dlci = gsm->dlci[i];
++                              if (dlci == NULL) {
++                                      i++;
++                                      continue;
++                              }
++
++                              tty_port_tty_wakeup(&dlci->port);
++                      }
++              }
+       }
+ }
+@@ -756,7 +774,7 @@ static void __gsm_data_queue(struct gsm_dlci *dlci, struct gsm_msg *msg)
+       /* Add to the actual output queue */
+       list_add_tail(&msg->list, &gsm->tx_list);
+       gsm->tx_bytes += msg->len;
+-      gsm_data_kick(gsm);
++      gsm_data_kick(gsm, dlci);
+ }
+ /**
+@@ -1217,7 +1235,7 @@ static void gsm_control_message(struct gsm_mux *gsm, unsigned int command,
+               gsm_control_reply(gsm, CMD_FCON, NULL, 0);
+               /* Kick the link in case it is idling */
+               spin_lock_irqsave(&gsm->tx_lock, flags);
+-              gsm_data_kick(gsm);
++              gsm_data_kick(gsm, NULL);
+               spin_unlock_irqrestore(&gsm->tx_lock, flags);
+               break;
+       case CMD_FCOFF:
+@@ -2539,7 +2557,7 @@ static void gsmld_write_wakeup(struct tty_struct *tty)
+       /* Queue poll */
+       clear_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
+       spin_lock_irqsave(&gsm->tx_lock, flags);
+-      gsm_data_kick(gsm);
++      gsm_data_kick(gsm, NULL);
+       if (gsm->tx_bytes < TX_THRESH_LO) {
+               gsm_dlci_data_sweep(gsm);
+       }
+-- 
+2.25.1
+
diff --git a/queue-5.7/um-do-not-evaluate-compiler-s-library-path-when-clea.patch b/queue-5.7/um-do-not-evaluate-compiler-s-library-path-when-clea.patch
new file mode 100644 (file)
index 0000000..24c8781
--- /dev/null
@@ -0,0 +1,52 @@
+From bf6c6f44d879ab82d20cfb9549f2b56f233d38cb Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 18 Apr 2020 03:04:55 +0900
+Subject: um: do not evaluate compiler's library path when cleaning
+
+From: Masahiro Yamada <masahiroy@kernel.org>
+
+[ Upstream commit 7e49afc03212010d0ee27532a75cfeb0125bd868 ]
+
+Since commit a83e4ca26af8 ("kbuild: remove cc-option switch from
+-Wframe-larger-than="), 'make ARCH=um clean' emits an error message
+as follows:
+
+  $ make ARCH=um clean
+  gcc: error: missing argument to '-Wframe-larger-than='
+
+We do not care compiler flags when cleaning.
+
+Use the '=' operator for lazy expansion because we do not use
+LDFLAGS_pcap.o or LDFLAGS_vde.o when cleaning.
+
+While I was here, I removed the redundant -r option because it
+already exists in the recipe.
+
+Fixes: a83e4ca26af8 ("kbuild: remove cc-option switch from -Wframe-larger-than=")
+Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
+Reviewed-by: Nathan Chancellor <natechancellor@gmail.com>
+Tested-by: Nathan Chancellor <natechancellor@gmail.com> [build]
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/um/drivers/Makefile | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/arch/um/drivers/Makefile b/arch/um/drivers/Makefile
+index a290821e355c2..2a249f6194671 100644
+--- a/arch/um/drivers/Makefile
++++ b/arch/um/drivers/Makefile
+@@ -18,9 +18,9 @@ ubd-objs := ubd_kern.o ubd_user.o
+ port-objs := port_kern.o port_user.o
+ harddog-objs := harddog_kern.o harddog_user.o
+-LDFLAGS_pcap.o := -r $(shell $(CC) $(KBUILD_CFLAGS) -print-file-name=libpcap.a)
++LDFLAGS_pcap.o = $(shell $(CC) $(KBUILD_CFLAGS) -print-file-name=libpcap.a)
+-LDFLAGS_vde.o := -r $(shell $(CC) $(CFLAGS) -print-file-name=libvdeplug.a)
++LDFLAGS_vde.o = $(shell $(CC) $(CFLAGS) -print-file-name=libvdeplug.a)
+ targets := pcap_kern.o pcap_user.o vde_kern.o vde_user.o
+-- 
+2.25.1
+
diff --git a/queue-5.7/unicore32-do-not-evaluate-compiler-s-library-path-wh.patch b/queue-5.7/unicore32-do-not-evaluate-compiler-s-library-path-wh.patch
new file mode 100644 (file)
index 0000000..45d465e
--- /dev/null
@@ -0,0 +1,52 @@
+From 39820784bd3a1e6574a37393c5fa05d36286df23 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 25 Apr 2020 15:06:40 +0900
+Subject: unicore32: do not evaluate compiler's library path when cleaning
+
+From: Masahiro Yamada <masahiroy@kernel.org>
+
+[ Upstream commit 081b4b54ff6c58be2ffcf09d42e5df8f031eacd0 ]
+
+Since commit a83e4ca26af8 ("kbuild: remove cc-option switch from
+-Wframe-larger-than="), 'make ARCH=unicore32 clean' emits error
+messages as follows:
+
+  $ make ARCH=unicore32 clean
+  gcc: error: missing argument to '-Wframe-larger-than='
+  gcc: error: missing argument to '-Wframe-larger-than='
+
+We do not care compiler flags when cleaning.
+
+Use the '=' operator for lazy expansion because we do not use
+GNU_LIBC_A or GNU_LIBGCC_A when cleaning.
+
+Fixes: a83e4ca26af8 ("kbuild: remove cc-option switch from -Wframe-larger-than=")
+Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
+Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/unicore32/lib/Makefile | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/arch/unicore32/lib/Makefile b/arch/unicore32/lib/Makefile
+index 098981a01841b..5af06645b8f01 100644
+--- a/arch/unicore32/lib/Makefile
++++ b/arch/unicore32/lib/Makefile
+@@ -10,12 +10,12 @@ lib-y      += strncpy_from_user.o strnlen_user.o
+ lib-y += clear_user.o copy_page.o
+ lib-y += copy_from_user.o copy_to_user.o
+-GNU_LIBC_A            := $(shell $(CC) $(KBUILD_CFLAGS) -print-file-name=libc.a)
++GNU_LIBC_A            = $(shell $(CC) $(KBUILD_CFLAGS) -print-file-name=libc.a)
+ GNU_LIBC_A_OBJS               := memchr.o memcpy.o memmove.o memset.o
+ GNU_LIBC_A_OBJS               += strchr.o strrchr.o
+ GNU_LIBC_A_OBJS               += rawmemchr.o                  # needed by strrchr.o
+-GNU_LIBGCC_A          := $(shell $(CC) $(KBUILD_CFLAGS) -print-file-name=libgcc.a)
++GNU_LIBGCC_A          = $(shell $(CC) $(KBUILD_CFLAGS) -print-file-name=libgcc.a)
+ GNU_LIBGCC_A_OBJS     := _ashldi3.o _ashrdi3.o _lshrdi3.o
+ GNU_LIBGCC_A_OBJS     += _divsi3.o _modsi3.o _ucmpdi2.o _umodsi3.o _udivsi3.o
+-- 
+2.25.1
+
diff --git a/queue-5.7/usb-cdns3-fix-runtime-pm-imbalance-on-error.patch b/queue-5.7/usb-cdns3-fix-runtime-pm-imbalance-on-error.patch
new file mode 100644 (file)
index 0000000..2ff2161
--- /dev/null
@@ -0,0 +1,45 @@
+From 4ca7ee29b3c279f6a2afa2754b9998dca324a294 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 21 May 2020 15:39:19 +0800
+Subject: usb: cdns3: Fix runtime PM imbalance on error
+
+From: Dinghao Liu <dinghao.liu@zju.edu.cn>
+
+[ Upstream commit e5b913496099527abe46e175e5e2c844367bded0 ]
+
+pm_runtime_get_sync() increments the runtime PM usage counter even
+when it returns an error code. Thus a pairing decrement is needed on
+the error handling path to keep the counter balanced.
+
+Reviewed-by: Peter Chen <peter.chen@nxp.com>
+Signed-off-by: Dinghao Liu <dinghao.liu@zju.edu.cn>
+Signed-off-by: Felipe Balbi <balbi@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/usb/cdns3/cdns3-ti.c | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+diff --git a/drivers/usb/cdns3/cdns3-ti.c b/drivers/usb/cdns3/cdns3-ti.c
+index 5685ba11480bd..e701ab56b0a76 100644
+--- a/drivers/usb/cdns3/cdns3-ti.c
++++ b/drivers/usb/cdns3/cdns3-ti.c
+@@ -138,7 +138,7 @@ static int cdns_ti_probe(struct platform_device *pdev)
+       error = pm_runtime_get_sync(dev);
+       if (error < 0) {
+               dev_err(dev, "pm_runtime_get_sync failed: %d\n", error);
+-              goto err_get;
++              goto err;
+       }
+       /* assert RESET */
+@@ -185,7 +185,6 @@ static int cdns_ti_probe(struct platform_device *pdev)
+ err:
+       pm_runtime_put_sync(data->dev);
+-err_get:
+       pm_runtime_disable(data->dev);
+       return error;
+-- 
+2.25.1
+
diff --git a/queue-5.7/usb-dwc2-gadget-move-gadget-resume-after-the-core-is.patch b/queue-5.7/usb-dwc2-gadget-move-gadget-resume-after-the-core-is.patch
new file mode 100644 (file)
index 0000000..4f7f3db
--- /dev/null
@@ -0,0 +1,51 @@
+From 3ef5e0da7aaf4b7ae13d826daccab70a6a358f55 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 23 Apr 2020 13:55:53 +0200
+Subject: usb: dwc2: gadget: move gadget resume after the core is in L0 state
+
+From: Fabrice Gasnier <fabrice.gasnier@st.com>
+
+[ Upstream commit 8c935deacebb8fac8f41378701eb79d12f3c2e2d ]
+
+When the remote wakeup interrupt is triggered, lx_state is resumed from L2
+to L0 state. But when the gadget resume is called, lx_state is still L2.
+This prevents the resume callback to queue any request. Any attempt
+to queue a request from resume callback will result in:
+- "submit request only in active state" debug message to be issued
+- dwc2_hsotg_ep_queue() returns -EAGAIN
+
+Call the gadget resume routine after the core is in L0 state.
+
+Fixes: f81f46e1f530 ("usb: dwc2: implement hibernation during bus suspend/resume")
+
+Acked-by: Minas Harutyunyan <hminas@synopsys.com>
+Signed-off-by: Fabrice Gasnier <fabrice.gasnier@st.com>
+Signed-off-by: Felipe Balbi <balbi@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/usb/dwc2/core_intr.c | 7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/usb/dwc2/core_intr.c b/drivers/usb/dwc2/core_intr.c
+index 876ff31261d56..55f1d14fc4148 100644
+--- a/drivers/usb/dwc2/core_intr.c
++++ b/drivers/usb/dwc2/core_intr.c
+@@ -416,10 +416,13 @@ static void dwc2_handle_wakeup_detected_intr(struct dwc2_hsotg *hsotg)
+                       if (ret && (ret != -ENOTSUPP))
+                               dev_err(hsotg->dev, "exit power_down failed\n");
++                      /* Change to L0 state */
++                      hsotg->lx_state = DWC2_L0;
+                       call_gadget(hsotg, resume);
++              } else {
++                      /* Change to L0 state */
++                      hsotg->lx_state = DWC2_L0;
+               }
+-              /* Change to L0 state */
+-              hsotg->lx_state = DWC2_L0;
+       } else {
+               if (hsotg->params.power_down)
+                       return;
+-- 
+2.25.1
+
diff --git a/queue-5.7/usb-dwc3-gadget-properly-handle-clearfeature-halt.patch b/queue-5.7/usb-dwc3-gadget-properly-handle-clearfeature-halt.patch
new file mode 100644 (file)
index 0000000..7c77dc7
--- /dev/null
@@ -0,0 +1,91 @@
+From 0efab51ec55cd90ab5310c4ccb299fc127b79bc4 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 5 Mar 2020 13:23:55 -0800
+Subject: usb: dwc3: gadget: Properly handle ClearFeature(halt)
+
+From: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
+
+[ Upstream commit cb11ea56f37a36288cdd0a4799a983ee3aa437dd ]
+
+DWC3 must not issue CLEAR_STALL command to control endpoints. The
+controller automatically clears the STALL when it receives the SETUP
+token. Also, when the driver receives ClearFeature(halt_ep), DWC3 must
+stop any active transfer from the endpoint and give back all the
+requests to the function drivers.
+
+Fixes: 72246da40f37 ("usb: Introduce DesignWare USB3 DRD Driver")
+Signed-off-by: Thinh Nguyen <thinhn@synopsys.com>
+Signed-off-by: Felipe Balbi <balbi@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/usb/dwc3/gadget.c | 36 +++++++++++++++++++++++++++++++++---
+ 1 file changed, 33 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
+index 585cb3deea7ad..ab6562c5b9279 100644
+--- a/drivers/usb/dwc3/gadget.c
++++ b/drivers/usb/dwc3/gadget.c
+@@ -1508,6 +1508,10 @@ static void dwc3_gadget_ep_skip_trbs(struct dwc3_ep *dep, struct dwc3_request *r
+ {
+       int i;
++      /* If req->trb is not set, then the request has not started */
++      if (!req->trb)
++              return;
++
+       /*
+        * If request was already started, this means we had to
+        * stop the transfer. With that we also need to ignore
+@@ -1598,6 +1602,8 @@ int __dwc3_gadget_ep_set_halt(struct dwc3_ep *dep, int value, int protocol)
+ {
+       struct dwc3_gadget_ep_cmd_params        params;
+       struct dwc3                             *dwc = dep->dwc;
++      struct dwc3_request                     *req;
++      struct dwc3_request                     *tmp;
+       int                                     ret;
+       if (usb_endpoint_xfer_isoc(dep->endpoint.desc)) {
+@@ -1634,13 +1640,37 @@ int __dwc3_gadget_ep_set_halt(struct dwc3_ep *dep, int value, int protocol)
+               else
+                       dep->flags |= DWC3_EP_STALL;
+       } else {
++              /*
++               * Don't issue CLEAR_STALL command to control endpoints. The
++               * controller automatically clears the STALL when it receives
++               * the SETUP token.
++               */
++              if (dep->number <= 1) {
++                      dep->flags &= ~(DWC3_EP_STALL | DWC3_EP_WEDGE);
++                      return 0;
++              }
+               ret = dwc3_send_clear_stall_ep_cmd(dep);
+-              if (ret)
++              if (ret) {
+                       dev_err(dwc->dev, "failed to clear STALL on %s\n",
+                                       dep->name);
+-              else
+-                      dep->flags &= ~(DWC3_EP_STALL | DWC3_EP_WEDGE);
++                      return ret;
++              }
++
++              dep->flags &= ~(DWC3_EP_STALL | DWC3_EP_WEDGE);
++
++              dwc3_stop_active_transfer(dep, true, true);
++
++              list_for_each_entry_safe(req, tmp, &dep->started_list, list)
++                      dwc3_gadget_move_cancelled_request(req);
++
++              list_for_each_entry_safe(req, tmp, &dep->pending_list, list)
++                      dwc3_gadget_move_cancelled_request(req);
++
++              if (!(dep->flags & DWC3_EP_END_TRANSFER_PENDING)) {
++                      dep->flags &= ~DWC3_EP_DELAY_START;
++                      dwc3_gadget_ep_cleanup_cancelled_requests(dep);
++              }
+       }
+       return ret;
+-- 
+2.25.1
+
diff --git a/queue-5.7/usb-dwc3-gadget-properly-handle-failed-kick_transfer.patch b/queue-5.7/usb-dwc3-gadget-properly-handle-failed-kick_transfer.patch
new file mode 100644 (file)
index 0000000..40ac4b7
--- /dev/null
@@ -0,0 +1,68 @@
+From cd4f1818da310943a164f84b5088a67d0118b362 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 29 Mar 2020 16:12:57 -0700
+Subject: usb: dwc3: gadget: Properly handle failed kick_transfer
+
+From: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
+
+[ Upstream commit 8d99087c2db863c5fa3a4a1f3cb82b3a493705ca ]
+
+If dwc3 fails to issue START_TRANSFER/UPDATE_TRANSFER command, then we
+should properly end an active transfer and give back all the started
+requests. However if it's for an isoc endpoint, the failure maybe due to
+bus-expiry status. In this case, don't give back the requests and wait
+for the next retry.
+
+Fixes: 72246da40f37 ("usb: Introduce DesignWare USB3 DRD Driver")
+Signed-off-by: Thinh Nguyen <thinhn@synopsys.com>
+Signed-off-by: Felipe Balbi <balbi@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/usb/dwc3/gadget.c | 24 ++++++++++++++++--------
+ 1 file changed, 16 insertions(+), 8 deletions(-)
+
+diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
+index ab6562c5b9279..de3b92680935a 100644
+--- a/drivers/usb/dwc3/gadget.c
++++ b/drivers/usb/dwc3/gadget.c
+@@ -1220,6 +1220,8 @@ static void dwc3_prepare_trbs(struct dwc3_ep *dep)
+       }
+ }
++static void dwc3_gadget_ep_cleanup_cancelled_requests(struct dwc3_ep *dep);
++
+ static int __dwc3_gadget_kick_transfer(struct dwc3_ep *dep)
+ {
+       struct dwc3_gadget_ep_cmd_params params;
+@@ -1259,14 +1261,20 @@ static int __dwc3_gadget_kick_transfer(struct dwc3_ep *dep)
+       ret = dwc3_send_gadget_ep_cmd(dep, cmd, &params);
+       if (ret < 0) {
+-              /*
+-               * FIXME we need to iterate over the list of requests
+-               * here and stop, unmap, free and del each of the linked
+-               * requests instead of what we do now.
+-               */
+-              if (req->trb)
+-                      memset(req->trb, 0, sizeof(struct dwc3_trb));
+-              dwc3_gadget_del_and_unmap_request(dep, req, ret);
++              struct dwc3_request *tmp;
++
++              if (ret == -EAGAIN)
++                      return ret;
++
++              dwc3_stop_active_transfer(dep, true, true);
++
++              list_for_each_entry_safe(req, tmp, &dep->started_list, list)
++                      dwc3_gadget_move_cancelled_request(req);
++
++              /* If ep isn't started, then there's no end transfer pending */
++              if (!(dep->flags & DWC3_EP_END_TRANSFER_PENDING))
++                      dwc3_gadget_ep_cleanup_cancelled_requests(dep);
++
+               return ret;
+       }
+-- 
+2.25.1
+
diff --git a/queue-5.7/usb-dwc3-meson-g12a-check-return-of-dwc3_meson_g12a_.patch b/queue-5.7/usb-dwc3-meson-g12a-check-return-of-dwc3_meson_g12a_.patch
new file mode 100644 (file)
index 0000000..5521881
--- /dev/null
@@ -0,0 +1,38 @@
+From 0773121b1482e9c051fe77a76b5c15dbce5bab62 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 26 Mar 2020 14:44:57 +0100
+Subject: usb: dwc3: meson-g12a: check return of dwc3_meson_g12a_usb_init
+
+From: Neil Armstrong <narmstrong@baylibre.com>
+
+[ Upstream commit 8f5bc1ec770c2bdc8c604ba4119a77d81d8f3529 ]
+
+The dwc3_meson_g12a_usb_init function can return an error, check it.
+
+Fixes: c99993376f72ca ("usb: dwc3: Add Amlogic G12A DWC3 glue")
+Reviewed-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
+Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
+Signed-off-by: Felipe Balbi <balbi@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/usb/dwc3/dwc3-meson-g12a.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/usb/dwc3/dwc3-meson-g12a.c b/drivers/usb/dwc3/dwc3-meson-g12a.c
+index b81d085bc534c..2d257bdfe8485 100644
+--- a/drivers/usb/dwc3/dwc3-meson-g12a.c
++++ b/drivers/usb/dwc3/dwc3-meson-g12a.c
+@@ -525,7 +525,9 @@ static int dwc3_meson_g12a_probe(struct platform_device *pdev)
+       /* Get dr_mode */
+       priv->otg_mode = usb_get_dr_mode(dev);
+-      dwc3_meson_g12a_usb_init(priv);
++      ret = dwc3_meson_g12a_usb_init(priv);
++      if (ret)
++              goto err_disable_clks;
+       /* Init PHYs */
+       for (i = 0 ; i < PHY_COUNT ; ++i) {
+-- 
+2.25.1
+
diff --git a/queue-5.7/usb-dwc3-meson-g12a-fix-error-path-when-fetching-the.patch b/queue-5.7/usb-dwc3-meson-g12a-fix-error-path-when-fetching-the.patch
new file mode 100644 (file)
index 0000000..6ed8a5e
--- /dev/null
@@ -0,0 +1,42 @@
+From 9bc1a825e75793c14fb42b3f59968b1e62f43ee3 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 26 May 2020 22:29:42 +0200
+Subject: usb: dwc3: meson-g12a: fix error path when fetching the reset line
+ fails
+
+From: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
+
+[ Upstream commit be8c1001a7e681e8813882a42ed51c8dbffd8800 ]
+
+Disable and unprepare the clocks when devm_reset_control_get_shared()
+fails. This fixes the error path as this must disable the clocks which
+were previously enabled.
+
+Fixes: 1e355f21d3fb96 ("usb: dwc3: Add Amlogic A1 DWC3 glue")
+Cc: Yue Wang <yue.wang@amlogic.com>
+Cc: Hanjie Lin <hanjie.lin@amlogic.com>
+Acked-by: Neil Armstrong <narmstrong@baylibre.com>
+Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
+Link: https://lore.kernel.org/r/20200526202943.715220-2-martin.blumenstingl@googlemail.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/usb/dwc3/dwc3-meson-g12a.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/usb/dwc3/dwc3-meson-g12a.c b/drivers/usb/dwc3/dwc3-meson-g12a.c
+index 2d257bdfe8485..eabb3bb6fcaa1 100644
+--- a/drivers/usb/dwc3/dwc3-meson-g12a.c
++++ b/drivers/usb/dwc3/dwc3-meson-g12a.c
+@@ -505,7 +505,7 @@ static int dwc3_meson_g12a_probe(struct platform_device *pdev)
+       if (IS_ERR(priv->reset)) {
+               ret = PTR_ERR(priv->reset);
+               dev_err(dev, "failed to get device reset, err=%d\n", ret);
+-              return ret;
++              goto err_disable_clks;
+       }
+       ret = reset_control_reset(priv->reset);
+-- 
+2.25.1
+
diff --git a/queue-5.7/usb-ehci-platform-set-pm-runtime-as-active-on-resume.patch b/queue-5.7/usb-ehci-platform-set-pm-runtime-as-active-on-resume.patch
new file mode 100644 (file)
index 0000000..ed2d213
--- /dev/null
@@ -0,0 +1,51 @@
+From 0cee099c0652888299a037c119f55202311c4679 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 18 May 2020 16:49:31 +0100
+Subject: usb/ehci-platform: Set PM runtime as active on resume
+
+From: Qais Yousef <qais.yousef@arm.com>
+
+[ Upstream commit 16bdc04cc98ab0c74392ceef2475ecc5e73fcf49 ]
+
+Follow suit of ohci-platform.c and perform pm_runtime_set_active() on
+resume.
+
+ohci-platform.c had a warning reported due to the missing
+pm_runtime_set_active() [1].
+
+[1] https://lore.kernel.org/lkml/20200323143857.db5zphxhq4hz3hmd@e107158-lin.cambridge.arm.com/
+
+Acked-by: Alan Stern <stern@rowland.harvard.edu>
+Signed-off-by: Qais Yousef <qais.yousef@arm.com>
+CC: Tony Prisk <linux@prisktech.co.nz>
+CC: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+CC: Mathias Nyman <mathias.nyman@intel.com>
+CC: Oliver Neukum <oneukum@suse.de>
+CC: linux-arm-kernel@lists.infradead.org
+CC: linux-usb@vger.kernel.org
+CC: linux-kernel@vger.kernel.org
+Link: https://lore.kernel.org/r/20200518154931.6144-3-qais.yousef@arm.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/usb/host/ehci-platform.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/drivers/usb/host/ehci-platform.c b/drivers/usb/host/ehci-platform.c
+index e4fc3f66d43bf..e9a49007cce4a 100644
+--- a/drivers/usb/host/ehci-platform.c
++++ b/drivers/usb/host/ehci-platform.c
+@@ -455,6 +455,10 @@ static int ehci_platform_resume(struct device *dev)
+       ehci_resume(hcd, priv->reset_on_resume);
++      pm_runtime_disable(dev);
++      pm_runtime_set_active(dev);
++      pm_runtime_enable(dev);
++
+       if (priv->quirk_poll)
+               quirk_poll_init(priv);
+-- 
+2.25.1
+
diff --git a/queue-5.7/usb-gadget-core-sync-interrupt-before-unbind-the-udc.patch b/queue-5.7/usb-gadget-core-sync-interrupt-before-unbind-the-udc.patch
new file mode 100644 (file)
index 0000000..450756e
--- /dev/null
@@ -0,0 +1,137 @@
+From eb024e63090fcbdb01d843ecfabbc0250ba9ed0e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 10 May 2020 13:30:41 +0800
+Subject: usb: gadget: core: sync interrupt before unbind the udc
+
+From: Peter Chen <peter.chen@nxp.com>
+
+[ Upstream commit 3c73bc52195def14165c3a7d91bdbb33b51725f5 ]
+
+The threaded interrupt handler may still be called after the
+usb_gadget_disconnect is called, it causes the structures used
+at interrupt handler was freed before it uses, eg the
+usb_request. This issue usually occurs we remove the udc function
+during the transfer. Below is the example when doing stress
+test for android switch function, the EP0's request is freed
+by .unbind (configfs_composite_unbind -> composite_dev_cleanup),
+but the threaded handler accesses this request during handling
+setup packet request.
+
+In fact, there is no protection between unbind the udc
+and udc interrupt handling, so we have to avoid the interrupt
+handler is occurred or scheduled during the .unbind flow.
+
+init: Sending signal 9 to service 'adbd' (pid 18077) process group...
+android_work: did not send uevent (0 0 000000007bec2039)
+libprocessgroup: Successfully killed process cgroup uid 0 pid 18077 in 6ms
+init: Service 'adbd' (pid 18077) received signal 9
+init: Sending signal 9 to service 'adbd' (pid 18077) process group...
+libprocessgroup: Successfully killed process cgroup uid 0 pid 18077 in 0ms
+init: processing action (init.svc.adbd=stopped) from (/init.usb.configfs.rc:14)
+init: Received control message 'start' for 'adbd' from pid: 399 (/vendor/bin/hw/android.hardware.usb@1.
+
+init: starting service 'adbd'...
+read descriptors
+read strings
+Unable to handle kernel read from unreadable memory at virtual address 000000000000002a
+android_work: sent uevent USB_STATE=CONNECTED
+Mem abort info:
+  ESR = 0x96000004
+  EC = 0x25: DABT (current EL), IL = 32 bits
+  SET = 0, FnV = 0
+  EA = 0, S1PTW = 0
+Data abort info:
+  ISV = 0, ISS = 0x00000004
+  CM = 0, WnR = 0
+user pgtable: 4k pages, 48-bit VAs, pgdp=00000000e97f1000
+using random self ethernet address
+[000000000000002a] pgd=0000000000000000
+Internal error: Oops: 96000004 [#1] PREEMPT SMP
+Modules linked in:
+CPU: 0 PID: 232 Comm: irq/68-5b110000 Not tainted 5.4.24-06075-g94a6b52b5815 #92
+Hardware name: Freescale i.MX8QXP MEK (DT)
+pstate: 00400085 (nzcv daIf +PAN -UAO)
+using random host ethernet address
+pc : composite_setup+0x5c/0x1730
+lr : android_setup+0xc0/0x148
+sp : ffff80001349bba0
+x29: ffff80001349bba0 x28: ffff00083a50da00
+x27: ffff8000124e6000 x26: ffff800010177950
+x25: 0000000000000040 x24: ffff000834e18010
+x23: 0000000000000000 x22: 0000000000000000
+x21: ffff00083a50da00 x20: ffff00082e75ec40
+x19: 0000000000000000 x18: 0000000000000000
+x17: 0000000000000000 x16: 0000000000000000
+x15: 0000000000000000 x14: 0000000000000000
+x13: 0000000000000000 x12: 0000000000000001
+x11: ffff80001180fb58 x10: 0000000000000040
+x9 : ffff8000120fc980 x8 : 0000000000000000
+x7 : ffff00083f98df50 x6 : 0000000000000100
+x5 : 00000307e8978431 x4 : ffff800011386788
+x3 : 0000000000000000 x2 : ffff800012342000
+x1 : 0000000000000000 x0 : ffff800010c6d3a0
+Call trace:
+ composite_setup+0x5c/0x1730
+ android_setup+0xc0/0x148
+ cdns3_ep0_delegate_req+0x64/0x90
+ cdns3_check_ep0_interrupt_proceed+0x384/0x738
+ cdns3_device_thread_irq_handler+0x124/0x6e0
+ cdns3_thread_irq+0x94/0xa0
+ irq_thread_fn+0x30/0xa0
+ irq_thread+0x150/0x248
+ kthread+0xfc/0x128
+ ret_from_fork+0x10/0x18
+Code: 910e8000 f9400693 12001ed7 79400f79 (3940aa61)
+---[ end trace c685db37f8773fba ]---
+Kernel panic - not syncing: Fatal exception
+SMP: stopping secondary CPUs
+Kernel Offset: disabled
+CPU features: 0x0002,20002008
+Memory Limit: none
+Rebooting in 5 seconds..
+
+Reviewed-by: Jun Li <jun.li@nxp.com>
+Signed-off-by: Peter Chen <peter.chen@nxp.com>
+Signed-off-by: Felipe Balbi <balbi@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/usb/gadget/udc/core.c | 2 ++
+ include/linux/usb/gadget.h    | 2 ++
+ 2 files changed, 4 insertions(+)
+
+diff --git a/drivers/usb/gadget/udc/core.c b/drivers/usb/gadget/udc/core.c
+index 9b11046480fed..2e28dde8376f6 100644
+--- a/drivers/usb/gadget/udc/core.c
++++ b/drivers/usb/gadget/udc/core.c
+@@ -1297,6 +1297,8 @@ static void usb_gadget_remove_driver(struct usb_udc *udc)
+       kobject_uevent(&udc->dev.kobj, KOBJ_CHANGE);
+       usb_gadget_disconnect(udc->gadget);
++      if (udc->gadget->irq)
++              synchronize_irq(udc->gadget->irq);
+       udc->driver->unbind(udc->gadget);
+       usb_gadget_udc_stop(udc);
+diff --git a/include/linux/usb/gadget.h b/include/linux/usb/gadget.h
+index 9411c08a5c7e1..73a6113322c6c 100644
+--- a/include/linux/usb/gadget.h
++++ b/include/linux/usb/gadget.h
+@@ -373,6 +373,7 @@ struct usb_gadget_ops {
+  * @connected: True if gadget is connected.
+  * @lpm_capable: If the gadget max_speed is FULL or HIGH, this flag
+  *    indicates that it supports LPM as per the LPM ECN & errata.
++ * @irq: the interrupt number for device controller.
+  *
+  * Gadgets have a mostly-portable "gadget driver" implementing device
+  * functions, handling all usb configurations and interfaces.  Gadget
+@@ -427,6 +428,7 @@ struct usb_gadget {
+       unsigned                        deactivated:1;
+       unsigned                        connected:1;
+       unsigned                        lpm_capable:1;
++      int                             irq;
+ };
+ #define work_to_gadget(w)     (container_of((w), struct usb_gadget, work))
+-- 
+2.25.1
+
diff --git a/queue-5.7/usb-gadget-fix-issue-with-config_ep_by_speed-functio.patch b/queue-5.7/usb-gadget-fix-issue-with-config_ep_by_speed-functio.patch
new file mode 100644 (file)
index 0000000..6205c3d
--- /dev/null
@@ -0,0 +1,226 @@
+From 07423fc007cc0a811a3b171936e623eaa440bb76 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 18 May 2020 12:08:45 +0200
+Subject: usb: gadget: Fix issue with config_ep_by_speed function
+
+From: Pawel Laszczak <pawell@cadence.com>
+
+[ Upstream commit 5d363120aa548ba52d58907a295eee25f8207ed2 ]
+
+This patch adds new config_ep_by_speed_and_alt function which
+extends the config_ep_by_speed about alt parameter.
+This additional parameter allows to find proper usb_ss_ep_comp_descriptor.
+
+Problem has appeared during testing f_tcm (BOT/UAS) driver function.
+
+f_tcm function for SS use array of headers for both  BOT/UAS alternate
+setting:
+
+static struct usb_descriptor_header *uasp_ss_function_desc[] = {
+        (struct usb_descriptor_header *) &bot_intf_desc,
+        (struct usb_descriptor_header *) &uasp_ss_bi_desc,
+        (struct usb_descriptor_header *) &bot_bi_ep_comp_desc,
+        (struct usb_descriptor_header *) &uasp_ss_bo_desc,
+        (struct usb_descriptor_header *) &bot_bo_ep_comp_desc,
+
+        (struct usb_descriptor_header *) &uasp_intf_desc,
+        (struct usb_descriptor_header *) &uasp_ss_bi_desc,
+        (struct usb_descriptor_header *) &uasp_bi_ep_comp_desc,
+        (struct usb_descriptor_header *) &uasp_bi_pipe_desc,
+        (struct usb_descriptor_header *) &uasp_ss_bo_desc,
+        (struct usb_descriptor_header *) &uasp_bo_ep_comp_desc,
+        (struct usb_descriptor_header *) &uasp_bo_pipe_desc,
+        (struct usb_descriptor_header *) &uasp_ss_status_desc,
+        (struct usb_descriptor_header *) &uasp_status_in_ep_comp_desc,
+        (struct usb_descriptor_header *) &uasp_status_pipe_desc,
+        (struct usb_descriptor_header *) &uasp_ss_cmd_desc,
+        (struct usb_descriptor_header *) &uasp_cmd_comp_desc,
+        (struct usb_descriptor_header *) &uasp_cmd_pipe_desc,
+        NULL,
+};
+
+The first 5 descriptors are associated with BOT alternate setting,
+and others are associated with UAS.
+
+During handling UAS alternate setting f_tcm driver invokes
+config_ep_by_speed and this function sets incorrect companion endpoint
+descriptor in usb_ep object.
+
+Instead setting ep->comp_desc to uasp_bi_ep_comp_desc function in this
+case set ep->comp_desc to uasp_ss_bi_desc.
+
+This is due to the fact that it searches endpoint based on endpoint
+address:
+
+        for_each_ep_desc(speed_desc, d_spd) {
+                chosen_desc = (struct usb_endpoint_descriptor *)*d_spd;
+                if (chosen_desc->bEndpoitAddress == _ep->address)
+                        goto ep_found;
+        }
+
+And in result it uses the descriptor from BOT alternate setting
+instead UAS.
+
+Finally, it causes that controller driver during enabling endpoints
+detect that just enabled endpoint for bot.
+
+Signed-off-by: Jayshri Pawar <jpawar@cadence.com>
+Signed-off-by: Pawel Laszczak <pawell@cadence.com>
+Signed-off-by: Felipe Balbi <balbi@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/usb/gadget/composite.c | 78 ++++++++++++++++++++++++++--------
+ include/linux/usb/composite.h  |  3 ++
+ 2 files changed, 64 insertions(+), 17 deletions(-)
+
+diff --git a/drivers/usb/gadget/composite.c b/drivers/usb/gadget/composite.c
+index cb4950cf1cdcb..5c1eb96a5c571 100644
+--- a/drivers/usb/gadget/composite.c
++++ b/drivers/usb/gadget/composite.c
+@@ -96,40 +96,43 @@ function_descriptors(struct usb_function *f,
+ }
+ /**
+- * next_ep_desc() - advance to the next EP descriptor
++ * next_desc() - advance to the next desc_type descriptor
+  * @t: currect pointer within descriptor array
++ * @desc_type: descriptor type
+  *
+- * Return: next EP descriptor or NULL
++ * Return: next desc_type descriptor or NULL
+  *
+- * Iterate over @t until either EP descriptor found or
++ * Iterate over @t until either desc_type descriptor found or
+  * NULL (that indicates end of list) encountered
+  */
+ static struct usb_descriptor_header**
+-next_ep_desc(struct usb_descriptor_header **t)
++next_desc(struct usb_descriptor_header **t, u8 desc_type)
+ {
+       for (; *t; t++) {
+-              if ((*t)->bDescriptorType == USB_DT_ENDPOINT)
++              if ((*t)->bDescriptorType == desc_type)
+                       return t;
+       }
+       return NULL;
+ }
+ /*
+- * for_each_ep_desc()- iterate over endpoint descriptors in the
+- *            descriptors list
+- * @start:    pointer within descriptor array.
+- * @ep_desc:  endpoint descriptor to use as the loop cursor
++ * for_each_desc() - iterate over desc_type descriptors in the
++ * descriptors list
++ * @start: pointer within descriptor array.
++ * @iter_desc: desc_type descriptor to use as the loop cursor
++ * @desc_type: wanted descriptr type
+  */
+-#define for_each_ep_desc(start, ep_desc) \
+-      for (ep_desc = next_ep_desc(start); \
+-            ep_desc; ep_desc = next_ep_desc(ep_desc+1))
++#define for_each_desc(start, iter_desc, desc_type) \
++      for (iter_desc = next_desc(start, desc_type); \
++           iter_desc; iter_desc = next_desc(iter_desc + 1, desc_type))
+ /**
+- * config_ep_by_speed() - configures the given endpoint
++ * config_ep_by_speed_and_alt() - configures the given endpoint
+  * according to gadget speed.
+  * @g: pointer to the gadget
+  * @f: usb function
+  * @_ep: the endpoint to configure
++ * @alt: alternate setting number
+  *
+  * Return: error code, 0 on success
+  *
+@@ -142,11 +145,13 @@ next_ep_desc(struct usb_descriptor_header **t)
+  * Note: the supplied function should hold all the descriptors
+  * for supported speeds
+  */
+-int config_ep_by_speed(struct usb_gadget *g,
+-                      struct usb_function *f,
+-                      struct usb_ep *_ep)
++int config_ep_by_speed_and_alt(struct usb_gadget *g,
++                              struct usb_function *f,
++                              struct usb_ep *_ep,
++                              u8 alt)
+ {
+       struct usb_endpoint_descriptor *chosen_desc = NULL;
++      struct usb_interface_descriptor *int_desc = NULL;
+       struct usb_descriptor_header **speed_desc = NULL;
+       struct usb_ss_ep_comp_descriptor *comp_desc = NULL;
+@@ -182,8 +187,21 @@ int config_ep_by_speed(struct usb_gadget *g,
+       default:
+               speed_desc = f->fs_descriptors;
+       }
++
++      /* find correct alternate setting descriptor */
++      for_each_desc(speed_desc, d_spd, USB_DT_INTERFACE) {
++              int_desc = (struct usb_interface_descriptor *)*d_spd;
++
++              if (int_desc->bAlternateSetting == alt) {
++                      speed_desc = d_spd;
++                      goto intf_found;
++              }
++      }
++      return -EIO;
++
++intf_found:
+       /* find descriptors */
+-      for_each_ep_desc(speed_desc, d_spd) {
++      for_each_desc(speed_desc, d_spd, USB_DT_ENDPOINT) {
+               chosen_desc = (struct usb_endpoint_descriptor *)*d_spd;
+               if (chosen_desc->bEndpointAddress == _ep->address)
+                       goto ep_found;
+@@ -237,6 +255,32 @@ ep_found:
+       }
+       return 0;
+ }
++EXPORT_SYMBOL_GPL(config_ep_by_speed_and_alt);
++
++/**
++ * config_ep_by_speed() - configures the given endpoint
++ * according to gadget speed.
++ * @g: pointer to the gadget
++ * @f: usb function
++ * @_ep: the endpoint to configure
++ *
++ * Return: error code, 0 on success
++ *
++ * This function chooses the right descriptors for a given
++ * endpoint according to gadget speed and saves it in the
++ * endpoint desc field. If the endpoint already has a descriptor
++ * assigned to it - overwrites it with currently corresponding
++ * descriptor. The endpoint maxpacket field is updated according
++ * to the chosen descriptor.
++ * Note: the supplied function should hold all the descriptors
++ * for supported speeds
++ */
++int config_ep_by_speed(struct usb_gadget *g,
++                      struct usb_function *f,
++                      struct usb_ep *_ep)
++{
++      return config_ep_by_speed_and_alt(g, f, _ep, 0);
++}
+ EXPORT_SYMBOL_GPL(config_ep_by_speed);
+ /**
+diff --git a/include/linux/usb/composite.h b/include/linux/usb/composite.h
+index 8675e145ea8b3..2040696d75b6e 100644
+--- a/include/linux/usb/composite.h
++++ b/include/linux/usb/composite.h
+@@ -249,6 +249,9 @@ int usb_function_activate(struct usb_function *);
+ int usb_interface_id(struct usb_configuration *, struct usb_function *);
++int config_ep_by_speed_and_alt(struct usb_gadget *g, struct usb_function *f,
++                              struct usb_ep *_ep, u8 alt);
++
+ int config_ep_by_speed(struct usb_gadget *g, struct usb_function *f,
+                       struct usb_ep *_ep);
+-- 
+2.25.1
+
diff --git a/queue-5.7/usb-gadget-fix-potential-double-free-in-m66592_probe.patch b/queue-5.7/usb-gadget-fix-potential-double-free-in-m66592_probe.patch
new file mode 100644 (file)
index 0000000..452b157
--- /dev/null
@@ -0,0 +1,38 @@
+From 55a923b9f57e1ab8ef3df323d50f074b0bf30b9a Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 22 May 2020 23:06:25 -0500
+Subject: usb: gadget: fix potential double-free in m66592_probe.
+
+From: Qiushi Wu <wu000273@umn.edu>
+
+[ Upstream commit 44734a594196bf1d474212f38fe3a0d37a73278b ]
+
+m66592_free_request() is called under label "err_add_udc"
+and "clean_up", and m66592->ep0_req is not set to NULL after
+first free, leading to a double-free. Fix this issue by
+setting m66592->ep0_req to NULL after the first free.
+
+Fixes: 0f91349b89f3 ("usb: gadget: convert all users to the new udc infrastructure")
+Signed-off-by: Qiushi Wu <wu000273@umn.edu>
+Signed-off-by: Felipe Balbi <balbi@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/usb/gadget/udc/m66592-udc.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/usb/gadget/udc/m66592-udc.c b/drivers/usb/gadget/udc/m66592-udc.c
+index 75d16a8902e6d..931e6362a13da 100644
+--- a/drivers/usb/gadget/udc/m66592-udc.c
++++ b/drivers/usb/gadget/udc/m66592-udc.c
+@@ -1667,7 +1667,7 @@ static int m66592_probe(struct platform_device *pdev)
+ err_add_udc:
+       m66592_free_request(&m66592->ep[0].ep, m66592->ep0_req);
+-
++      m66592->ep0_req = NULL;
+ clean_up3:
+       if (m66592->pdata->on_chip) {
+               clk_disable(m66592->clk);
+-- 
+2.25.1
+
diff --git a/queue-5.7/usb-gadget-lpc32xx_udc-don-t-dereference-ep-pointer-.patch b/queue-5.7/usb-gadget-lpc32xx_udc-don-t-dereference-ep-pointer-.patch
new file mode 100644 (file)
index 0000000..e321774
--- /dev/null
@@ -0,0 +1,71 @@
+From 76fc04976ab4d9fcbc4f83a627dfe09c53fd69b9 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 21 May 2020 16:13:00 +0100
+Subject: usb: gadget: lpc32xx_udc: don't dereference ep pointer before null
+ check
+
+From: Colin Ian King <colin.king@canonical.com>
+
+[ Upstream commit eafa80041645cd7604c4357b1a0cd4a3c81f2227 ]
+
+Currently pointer ep is being dereferenced before it is null checked
+leading to a null pointer dereference issue.  Fix this by only assigning
+pointer udc once ep is known to be not null.  Also remove a debug
+message that requires a valid udc which may not be possible at that
+point.
+
+Addresses-Coverity: ("Dereference before null check")
+Fixes: 24a28e428351 ("USB: gadget driver for LPC32xx")
+Signed-off-by: Colin Ian King <colin.king@canonical.com>
+Signed-off-by: Felipe Balbi <balbi@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/usb/gadget/udc/lpc32xx_udc.c | 11 ++++++-----
+ 1 file changed, 6 insertions(+), 5 deletions(-)
+
+diff --git a/drivers/usb/gadget/udc/lpc32xx_udc.c b/drivers/usb/gadget/udc/lpc32xx_udc.c
+index cb997b82c0088..465d0b7c6522a 100644
+--- a/drivers/usb/gadget/udc/lpc32xx_udc.c
++++ b/drivers/usb/gadget/udc/lpc32xx_udc.c
+@@ -1614,17 +1614,17 @@ static int lpc32xx_ep_enable(struct usb_ep *_ep,
+                            const struct usb_endpoint_descriptor *desc)
+ {
+       struct lpc32xx_ep *ep = container_of(_ep, struct lpc32xx_ep, ep);
+-      struct lpc32xx_udc *udc = ep->udc;
++      struct lpc32xx_udc *udc;
+       u16 maxpacket;
+       u32 tmp;
+       unsigned long flags;
+       /* Verify EP data */
+       if ((!_ep) || (!ep) || (!desc) ||
+-          (desc->bDescriptorType != USB_DT_ENDPOINT)) {
+-              dev_dbg(udc->dev, "bad ep or descriptor\n");
++          (desc->bDescriptorType != USB_DT_ENDPOINT))
+               return -EINVAL;
+-      }
++
++      udc = ep->udc;
+       maxpacket = usb_endpoint_maxp(desc);
+       if ((maxpacket == 0) || (maxpacket > ep->maxpacket)) {
+               dev_dbg(udc->dev, "bad ep descriptor's packet size\n");
+@@ -1872,7 +1872,7 @@ static int lpc32xx_ep_dequeue(struct usb_ep *_ep, struct usb_request *_req)
+ static int lpc32xx_ep_set_halt(struct usb_ep *_ep, int value)
+ {
+       struct lpc32xx_ep *ep = container_of(_ep, struct lpc32xx_ep, ep);
+-      struct lpc32xx_udc *udc = ep->udc;
++      struct lpc32xx_udc *udc;
+       unsigned long flags;
+       if ((!ep) || (ep->hwep_num <= 1))
+@@ -1882,6 +1882,7 @@ static int lpc32xx_ep_set_halt(struct usb_ep *_ep, int value)
+       if (ep->is_in)
+               return -EAGAIN;
++      udc = ep->udc;
+       spin_lock_irqsave(&udc->lock, flags);
+       if (value == 1) {
+-- 
+2.25.1
+
diff --git a/queue-5.7/usb-gadget-udc-s3c2410_udc-remove-pointless-null-che.patch b/queue-5.7/usb-gadget-udc-s3c2410_udc-remove-pointless-null-che.patch
new file mode 100644 (file)
index 0000000..0c532f9
--- /dev/null
@@ -0,0 +1,57 @@
+From 2ba29a04cb697a482d22ed5f2407c05dddfa7abc Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 23 Apr 2020 09:29:24 -0700
+Subject: USB: gadget: udc: s3c2410_udc: Remove pointless NULL check in
+ s3c2410_udc_nuke
+
+From: Nathan Chancellor <natechancellor@gmail.com>
+
+[ Upstream commit 7a0fbcf7c308920bc6116b3a5fb21c8cc5fec128 ]
+
+Clang warns:
+
+drivers/usb/gadget/udc/s3c2410_udc.c:255:11: warning: comparison of
+address of 'ep->queue' equal to a null pointer is always false
+[-Wtautological-pointer-compare]
+        if (&ep->queue == NULL)
+             ~~~~^~~~~    ~~~~
+1 warning generated.
+
+It is not wrong, queue is not a pointer so if ep is not NULL, the
+address of queue cannot be NULL. No other driver does a check like this
+and this check has been around since the driver was first introduced,
+presumably with no issues so it does not seem like this check should be
+something else. Just remove it.
+
+Commit afe956c577b2d ("kbuild: Enable -Wtautological-compare") exposed
+this but it is not the root cause of the warning.
+
+Fixes: 3fc154b6b8134 ("USB Gadget driver for Samsung s3c2410 ARM SoC")
+Link: https://github.com/ClangBuiltLinux/linux/issues/1004
+Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>
+Reported-by: kbuild test robot <lkp@intel.com>
+Signed-off-by: Nathan Chancellor <natechancellor@gmail.com>
+Signed-off-by: Felipe Balbi <balbi@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/usb/gadget/udc/s3c2410_udc.c | 4 ----
+ 1 file changed, 4 deletions(-)
+
+diff --git a/drivers/usb/gadget/udc/s3c2410_udc.c b/drivers/usb/gadget/udc/s3c2410_udc.c
+index 0507a2ca0f552..80002d97b59d8 100644
+--- a/drivers/usb/gadget/udc/s3c2410_udc.c
++++ b/drivers/usb/gadget/udc/s3c2410_udc.c
+@@ -251,10 +251,6 @@ static void s3c2410_udc_done(struct s3c2410_ep *ep,
+ static void s3c2410_udc_nuke(struct s3c2410_udc *udc,
+               struct s3c2410_ep *ep, int status)
+ {
+-      /* Sanity check */
+-      if (&ep->queue == NULL)
+-              return;
+-
+       while (!list_empty(&ep->queue)) {
+               struct s3c2410_request *req;
+               req = list_entry(ep->queue.next, struct s3c2410_request,
+-- 
+2.25.1
+
diff --git a/queue-5.7/usb-host-ehci-mxc-add-error-handling-in-ehci_mxc_drv.patch b/queue-5.7/usb-host-ehci-mxc-add-error-handling-in-ehci_mxc_drv.patch
new file mode 100644 (file)
index 0000000..5fa459c
--- /dev/null
@@ -0,0 +1,39 @@
+From dec7133b47d621ff5ac8b53065bbf43db943431b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 13 May 2020 21:26:47 +0800
+Subject: USB: host: ehci-mxc: Add error handling in ehci_mxc_drv_probe()
+
+From: Tang Bin <tangbin@cmss.chinamobile.com>
+
+[ Upstream commit d49292025f79693d3348f8e2029a8b4703be0f0a ]
+
+The function ehci_mxc_drv_probe() does not perform sufficient error
+checking after executing platform_get_irq(), thus fix it.
+
+Fixes: 7e8d5cd93fac ("USB: Add EHCI support for MX27 and MX31 based boards")
+Signed-off-by: Zhang Shengju <zhangshengju@cmss.chinamobile.com>
+Signed-off-by: Tang Bin <tangbin@cmss.chinamobile.com>
+Reviewed-by: Peter Chen <peter.chen@nxp.com>
+Link: https://lore.kernel.org/r/20200513132647.5456-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/ehci-mxc.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/drivers/usb/host/ehci-mxc.c b/drivers/usb/host/ehci-mxc.c
+index c9f91e6c72b6a..7f65c86047ddd 100644
+--- a/drivers/usb/host/ehci-mxc.c
++++ b/drivers/usb/host/ehci-mxc.c
+@@ -50,6 +50,8 @@ static int ehci_mxc_drv_probe(struct platform_device *pdev)
+       }
+       irq = platform_get_irq(pdev, 0);
++      if (irq < 0)
++              return irq;
+       hcd = usb_create_hcd(&ehci_mxc_hc_driver, dev, dev_name(dev));
+       if (!hcd)
+-- 
+2.25.1
+
diff --git a/queue-5.7/usb-ohci-platform-fix-a-warning-when-hibernating.patch b/queue-5.7/usb-ohci-platform-fix-a-warning-when-hibernating.patch
new file mode 100644 (file)
index 0000000..3cdc883
--- /dev/null
@@ -0,0 +1,102 @@
+From 021bab669404d0eb8a5769139970f0c911088cc0 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 18 May 2020 16:49:29 +0100
+Subject: usb/ohci-platform: Fix a warning when hibernating
+
+From: Qais Yousef <qais.yousef@arm.com>
+
+[ Upstream commit 1cb3b0095c3d0bb96912bfbbce4fc006d41f367c ]
+
+The following warning was observed when attempting to suspend to disk
+using a USB flash as a swap device.
+
+[  111.779649] ------------[ cut here ]------------
+[  111.788382] URB (____ptrval____) submitted while active
+[  111.796646] WARNING: CPU: 3 PID: 365 at drivers/usb/core/urb.c:363 usb_submit_urb+0x3d8/0x590
+[  111.805417] Modules linked in:
+[  111.808584] CPU: 3 PID: 365 Comm: kworker/3:2 Not tainted 5.6.0-rc6-00002-gdfd1731f9a3e-dirty #545
+[  111.817796] Hardware name: ARM Juno development board (r2) (DT)
+[  111.823896] Workqueue: usb_hub_wq hub_event
+[  111.828217] pstate: 60000005 (nZCv daif -PAN -UAO)
+[  111.833156] pc : usb_submit_urb+0x3d8/0x590
+[  111.837471] lr : usb_submit_urb+0x3d8/0x590
+[  111.841783] sp : ffff800018de38b0
+[  111.845205] x29: ffff800018de38b0 x28: 0000000000000003
+[  111.850682] x27: ffff000970530b20 x26: ffff8000133fd000
+[  111.856159] x25: ffff8000133fd000 x24: ffff800018de3b38
+[  111.861635] x23: 0000000000000004 x22: 0000000000000c00
+[  111.867112] x21: 0000000000000000 x20: 00000000fffffff0
+[  111.872589] x19: ffff0009704e7a00 x18: ffffffffffffffff
+[  111.878065] x17: 00000000a7c8f4bc x16: 000000002af33de8
+[  111.883542] x15: ffff8000133fda88 x14: 0720072007200720
+[  111.889019] x13: 0720072007200720 x12: 0720072007200720
+[  111.894496] x11: 0000000000000000 x10: 00000000a5286134
+[  111.899973] x9 : 0000000000000002 x8 : ffff000970c837a0
+[  111.905449] x7 : 0000000000000000 x6 : ffff800018de3570
+[  111.910926] x5 : 0000000000000001 x4 : 0000000000000003
+[  111.916401] x3 : 0000000000000000 x2 : ffff800013427118
+[  111.921879] x1 : 9d4e965b4b7d7c00 x0 : 0000000000000000
+[  111.927356] Call trace:
+[  111.929892]  usb_submit_urb+0x3d8/0x590
+[  111.933852]  hub_activate+0x108/0x7f0
+[  111.937633]  hub_resume+0xac/0x148
+[  111.941149]  usb_resume_interface.isra.10+0x60/0x138
+[  111.946265]  usb_resume_both+0xe4/0x140
+[  111.950225]  usb_runtime_resume+0x24/0x30
+[  111.954365]  __rpm_callback+0xdc/0x138
+[  111.958236]  rpm_callback+0x34/0x98
+[  111.961841]  rpm_resume+0x4a8/0x720
+[  111.965445]  rpm_resume+0x50c/0x720
+[  111.969049]  __pm_runtime_resume+0x4c/0xb8
+[  111.973276]  usb_autopm_get_interface+0x28/0x60
+[  111.977948]  hub_event+0x80/0x16d8
+[  111.981466]  process_one_work+0x2a4/0x748
+[  111.985604]  worker_thread+0x48/0x498
+[  111.989387]  kthread+0x13c/0x140
+[  111.992725]  ret_from_fork+0x10/0x18
+[  111.996415] irq event stamp: 354
+[  111.999756] hardirqs last  enabled at (353): [<ffff80001019ea1c>] console_unlock+0x504/0x5b8
+[  112.008441] hardirqs last disabled at (354): [<ffff8000100a95d0>] do_debug_exception+0x1a8/0x258
+[  112.017479] softirqs last  enabled at (350): [<ffff8000100818a4>] __do_softirq+0x4bc/0x568
+[  112.025984] softirqs last disabled at (343): [<ffff8000101145a4>] irq_exit+0x144/0x150
+[  112.034129] ---[ end trace dc96030b9cf6c8a3 ]---
+
+The problem was tracked down to a missing call to
+pm_runtime_set_active() on resume in ohci-platform.
+
+Link: https://lore.kernel.org/lkml/20200323143857.db5zphxhq4hz3hmd@e107158-lin.cambridge.arm.com/
+Acked-by: Alan Stern <stern@rowland.harvard.edu>
+Signed-off-by: Qais Yousef <qais.yousef@arm.com>
+CC: Tony Prisk <linux@prisktech.co.nz>
+CC: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+CC: Mathias Nyman <mathias.nyman@intel.com>
+CC: Oliver Neukum <oneukum@suse.de>
+CC: linux-arm-kernel@lists.infradead.org
+CC: linux-usb@vger.kernel.org
+CC: linux-kernel@vger.kernel.org
+Link: https://lore.kernel.org/r/20200518154931.6144-1-qais.yousef@arm.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/usb/host/ohci-platform.c | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+diff --git a/drivers/usb/host/ohci-platform.c b/drivers/usb/host/ohci-platform.c
+index 7addfc2cbadce..4a8456f12a73d 100644
+--- a/drivers/usb/host/ohci-platform.c
++++ b/drivers/usb/host/ohci-platform.c
+@@ -299,6 +299,11 @@ static int ohci_platform_resume(struct device *dev)
+       }
+       ohci_resume(hcd, false);
++
++      pm_runtime_disable(dev);
++      pm_runtime_set_active(dev);
++      pm_runtime_enable(dev);
++
+       return 0;
+ }
+ #endif /* CONFIG_PM_SLEEP */
+-- 
+2.25.1
+
diff --git a/queue-5.7/usb-ohci-sm501-fix-error-return-code-in-ohci_hcd_sm5.patch b/queue-5.7/usb-ohci-sm501-fix-error-return-code-in-ohci_hcd_sm5.patch
new file mode 100644 (file)
index 0000000..a634b2d
--- /dev/null
@@ -0,0 +1,43 @@
+From 2935d17145b87739b4710de49b24c7f979932f7b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 6 May 2020 13:56:25 +0000
+Subject: USB: ohci-sm501: fix error return code in ohci_hcd_sm501_drv_probe()
+
+From: Wei Yongjun <weiyongjun1@huawei.com>
+
+[ Upstream commit b919e077cccfbb77beb98809568b2fb0b4d113ec ]
+
+Fix to return a negative error code from the error handling
+case instead of 0, as done elsewhere in this function.
+
+Fixes: 7d9e6f5aebe8 ("usb: host: ohci-sm501: init genalloc for local memory")
+Signed-off-by: Wei Yongjun <weiyongjun1@huawei.com>
+Acked-by: Alan Stern <stern@rowland.harvard.edu>
+Link: https://lore.kernel.org/r/20200506135625.106910-1-weiyongjun1@huawei.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/usb/host/ohci-sm501.c | 7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/usb/host/ohci-sm501.c b/drivers/usb/host/ohci-sm501.c
+index c158cda9e4b9b..cff9652403270 100644
+--- a/drivers/usb/host/ohci-sm501.c
++++ b/drivers/usb/host/ohci-sm501.c
+@@ -157,9 +157,10 @@ static int ohci_hcd_sm501_drv_probe(struct platform_device *pdev)
+        * the call to usb_hcd_setup_local_mem() below does just that.
+        */
+-      if (usb_hcd_setup_local_mem(hcd, mem->start,
+-                                  mem->start - mem->parent->start,
+-                                  resource_size(mem)) < 0)
++      retval = usb_hcd_setup_local_mem(hcd, mem->start,
++                                       mem->start - mem->parent->start,
++                                       resource_size(mem));
++      if (retval < 0)
+               goto err5;
+       retval = usb_add_hcd(hcd, irq, IRQF_SHARED);
+       if (retval)
+-- 
+2.25.1
+
diff --git a/queue-5.7/usb-roles-switch-on-role-switch-uevent-reporting.patch b/queue-5.7/usb-roles-switch-on-role-switch-uevent-reporting.patch
new file mode 100644 (file)
index 0000000..6848e7e
--- /dev/null
@@ -0,0 +1,64 @@
+From 6b2de44742462b114f531622fe44445c4ae53e2d Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 8 May 2020 17:29:37 +0100
+Subject: usb: roles: Switch on role-switch uevent reporting
+
+From: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
+
+[ Upstream commit 3e63cff384e625f09758ce8f4d01ae3033402b63 ]
+
+Right now we don't report to user-space a role switch when doing a
+usb_role_switch_set_role() despite having registered the uevent callbacks.
+
+This patch switches on the notifications allowing user-space to see
+role-switch change notifications and subsequently determine the current
+controller data-role.
+
+example:
+PFX=/devices/platform/soc/78d9000.usb/ci_hdrc.0
+
+root@somebox# udevadm monitor -p
+
+KERNEL[49.894994] change $PFX/usb_role/ci_hdrc.0-role-switch (usb_role)
+ACTION=change
+DEVPATH=$PFX/usb_role/ci_hdrc.0-role-switch
+SUBSYSTEM=usb_role
+DEVTYPE=usb_role_switch
+USB_ROLE_SWITCH=ci_hdrc.0-role-switch
+SEQNUM=2432
+
+Cc: Heikki Krogerus <heikki.krogerus@linux.intel.com>
+Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Cc: Chunfeng Yun <chunfeng.yun@mediatek.com>
+Cc: Suzuki K Poulose <suzuki.poulose@arm.com>
+Cc: Alexandre Belloni <alexandre.belloni@bootlin.com>
+Cc: Wen Yang <wenyang@linux.alibaba.com>
+Cc: chenqiwu <chenqiwu@xiaomi.com>
+Cc: linux-kernel@vger.kernel.org
+Signed-off-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
+Link: https://lore.kernel.org/r/20200508162937.2566818-1-bryan.odonoghue@linaro.org
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/usb/roles/class.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/usb/roles/class.c b/drivers/usb/roles/class.c
+index 5b17709821dfd..27d92af296351 100644
+--- a/drivers/usb/roles/class.c
++++ b/drivers/usb/roles/class.c
+@@ -49,8 +49,10 @@ int usb_role_switch_set_role(struct usb_role_switch *sw, enum usb_role role)
+       mutex_lock(&sw->lock);
+       ret = sw->set(sw, role);
+-      if (!ret)
++      if (!ret) {
+               sw->role = role;
++              kobject_uevent(&sw->dev.kobj, KOBJ_CHANGE);
++      }
+       mutex_unlock(&sw->lock);
+-- 
+2.25.1
+
diff --git a/queue-5.7/usb-xhci-plat-set-pm-runtime-as-active-on-resume.patch b/queue-5.7/usb-xhci-plat-set-pm-runtime-as-active-on-resume.patch
new file mode 100644 (file)
index 0000000..b4e412b
--- /dev/null
@@ -0,0 +1,56 @@
+From f7d3186c8f65d9e4bb5621bcd7ce096d7fdef3db Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 18 May 2020 16:49:30 +0100
+Subject: usb/xhci-plat: Set PM runtime as active on resume
+
+From: Qais Yousef <qais.yousef@arm.com>
+
+[ Upstream commit 79112cc3c29f4a8c73a21428fbcbcb0afb005e3e ]
+
+Follow suit of ohci-platform.c and perform pm_runtime_set_active() on
+resume.
+
+ohci-platform.c had a warning reported due to the missing
+pm_runtime_set_active() [1].
+
+[1] https://lore.kernel.org/lkml/20200323143857.db5zphxhq4hz3hmd@e107158-lin.cambridge.arm.com/
+
+Signed-off-by: Qais Yousef <qais.yousef@arm.com>
+CC: Tony Prisk <linux@prisktech.co.nz>
+CC: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+CC: Mathias Nyman <mathias.nyman@intel.com>
+CC: Oliver Neukum <oneukum@suse.de>
+CC: linux-arm-kernel@lists.infradead.org
+CC: linux-usb@vger.kernel.org
+CC: linux-kernel@vger.kernel.org
+Link: https://lore.kernel.org/r/20200518154931.6144-2-qais.yousef@arm.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/usb/host/xhci-plat.c | 10 +++++++++-
+ 1 file changed, 9 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c
+index ea460b9682d5f..ca82e2c61ddc0 100644
+--- a/drivers/usb/host/xhci-plat.c
++++ b/drivers/usb/host/xhci-plat.c
+@@ -409,7 +409,15 @@ static int __maybe_unused xhci_plat_resume(struct device *dev)
+       if (ret)
+               return ret;
+-      return xhci_resume(xhci, 0);
++      ret = xhci_resume(xhci, 0);
++      if (ret)
++              return ret;
++
++      pm_runtime_disable(dev);
++      pm_runtime_set_active(dev);
++      pm_runtime_enable(dev);
++
++      return 0;
+ }
+ static int __maybe_unused xhci_plat_runtime_suspend(struct device *dev)
+-- 
+2.25.1
+
diff --git a/queue-5.7/usblp-poison-urbs-upon-disconnect.patch b/queue-5.7/usblp-poison-urbs-upon-disconnect.patch
new file mode 100644 (file)
index 0000000..33f66d1
--- /dev/null
@@ -0,0 +1,50 @@
+From 40b6b1b8744516c65a3237b5a2803298c106fc40 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 7 May 2020 10:58:06 +0200
+Subject: usblp: poison URBs upon disconnect
+
+From: Oliver Neukum <oneukum@suse.com>
+
+[ Upstream commit 296a193b06120aa6ae7cf5c0d7b5e5b55968026e ]
+
+syzkaller reported an URB that should have been killed to be active.
+We do not understand it, but this should fix the issue if it is real.
+
+Signed-off-by: Oliver Neukum <oneukum@suse.com>
+Reported-by: syzbot+be5b5f86a162a6c281e6@syzkaller.appspotmail.com
+Link: https://lore.kernel.org/r/20200507085806.5793-1-oneukum@suse.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/usb/class/usblp.c | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/usb/class/usblp.c b/drivers/usb/class/usblp.c
+index 0d8e3f3804a3f..084c48c5848fc 100644
+--- a/drivers/usb/class/usblp.c
++++ b/drivers/usb/class/usblp.c
+@@ -468,7 +468,8 @@ static int usblp_release(struct inode *inode, struct file *file)
+       usb_autopm_put_interface(usblp->intf);
+       if (!usblp->present)            /* finish cleanup from disconnect */
+-              usblp_cleanup(usblp);
++              usblp_cleanup(usblp);   /* any URBs must be dead */
++
+       mutex_unlock(&usblp_mutex);
+       return 0;
+ }
+@@ -1375,9 +1376,11 @@ static void usblp_disconnect(struct usb_interface *intf)
+       usblp_unlink_urbs(usblp);
+       mutex_unlock(&usblp->mut);
++      usb_poison_anchored_urbs(&usblp->urbs);
+       if (!usblp->used)
+               usblp_cleanup(usblp);
++
+       mutex_unlock(&usblp_mutex);
+ }
+-- 
+2.25.1
+
diff --git a/queue-5.7/vfio-mdev-fix-reference-count-leak-in-add_mdev_suppo.patch b/queue-5.7/vfio-mdev-fix-reference-count-leak-in-add_mdev_suppo.patch
new file mode 100644 (file)
index 0000000..cbb5dd7
--- /dev/null
@@ -0,0 +1,41 @@
+From 23d1df8276c02e57fa600def59fe7cfd443fc5a5 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 27 May 2020 21:01:09 -0500
+Subject: vfio/mdev: Fix reference count leak in add_mdev_supported_type
+
+From: Qiushi Wu <wu000273@umn.edu>
+
+[ Upstream commit aa8ba13cae3134b8ef1c1b6879f66372531da738 ]
+
+kobject_init_and_add() takes reference even when it fails.
+If this function returns an error, kobject_put() must be called to
+properly clean up the memory associated with the object. Thus,
+replace kfree() by kobject_put() to fix this issue. Previous
+commit "b8eb718348b8" fixed a similar problem.
+
+Fixes: 7b96953bc640 ("vfio: Mediated device Core driver")
+Signed-off-by: Qiushi Wu <wu000273@umn.edu>
+Reviewed-by: Cornelia Huck <cohuck@redhat.com>
+Reviewed-by: Kirti Wankhede <kwankhede@nvidia.com>
+Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/vfio/mdev/mdev_sysfs.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/vfio/mdev/mdev_sysfs.c b/drivers/vfio/mdev/mdev_sysfs.c
+index 8ad14e5c02bf8..917fd84c1c6f2 100644
+--- a/drivers/vfio/mdev/mdev_sysfs.c
++++ b/drivers/vfio/mdev/mdev_sysfs.c
+@@ -110,7 +110,7 @@ static struct mdev_type *add_mdev_supported_type(struct mdev_parent *parent,
+                                  "%s-%s", dev_driver_string(parent->dev),
+                                  group->name);
+       if (ret) {
+-              kfree(type);
++              kobject_put(&type->kobj);
+               return ERR_PTR(ret);
+       }
+-- 
+2.25.1
+
diff --git a/queue-5.7/vfio-pci-fix-memory-leaks-in-alloc_perm_bits.patch b/queue-5.7/vfio-pci-fix-memory-leaks-in-alloc_perm_bits.patch
new file mode 100644 (file)
index 0000000..b2d739b
--- /dev/null
@@ -0,0 +1,74 @@
+From 42c78d08ae57522f16dd732b7a85d995052bd667 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 10 May 2020 12:16:56 -0400
+Subject: vfio/pci: fix memory leaks in alloc_perm_bits()
+
+From: Qian Cai <cai@lca.pw>
+
+[ Upstream commit 3e63b94b6274324ff2e7d8615df31586de827c4e ]
+
+vfio_pci_disable() calls vfio_config_free() but forgets to call
+free_perm_bits() resulting in memory leaks,
+
+unreferenced object 0xc000000c4db2dee0 (size 16):
+  comm "qemu-kvm", pid 4305, jiffies 4295020272 (age 3463.780s)
+  hex dump (first 16 bytes):
+    00 00 ff 00 ff ff ff ff ff ff ff ff ff ff 00 00  ................
+  backtrace:
+    [<00000000a6a4552d>] alloc_perm_bits+0x58/0xe0 [vfio_pci]
+    [<00000000ac990549>] vfio_config_init+0xdf0/0x11b0 [vfio_pci]
+    init_pci_cap_msi_perm at drivers/vfio/pci/vfio_pci_config.c:1125
+    (inlined by) vfio_msi_cap_len at drivers/vfio/pci/vfio_pci_config.c:1180
+    (inlined by) vfio_cap_len at drivers/vfio/pci/vfio_pci_config.c:1241
+    (inlined by) vfio_cap_init at drivers/vfio/pci/vfio_pci_config.c:1468
+    (inlined by) vfio_config_init at drivers/vfio/pci/vfio_pci_config.c:1707
+    [<000000006db873a1>] vfio_pci_open+0x234/0x700 [vfio_pci]
+    [<00000000630e1906>] vfio_group_fops_unl_ioctl+0x8e0/0xb84 [vfio]
+    [<000000009e34c54f>] ksys_ioctl+0xd8/0x130
+    [<000000006577923d>] sys_ioctl+0x28/0x40
+    [<000000006d7b1cf2>] system_call_exception+0x114/0x1e0
+    [<0000000008ea7dd5>] system_call_common+0xf0/0x278
+unreferenced object 0xc000000c4db2e330 (size 16):
+  comm "qemu-kvm", pid 4305, jiffies 4295020272 (age 3463.780s)
+  hex dump (first 16 bytes):
+    00 ff ff 00 ff ff ff ff ff ff ff ff ff ff 00 00  ................
+  backtrace:
+    [<000000004c71914f>] alloc_perm_bits+0x44/0xe0 [vfio_pci]
+    [<00000000ac990549>] vfio_config_init+0xdf0/0x11b0 [vfio_pci]
+    [<000000006db873a1>] vfio_pci_open+0x234/0x700 [vfio_pci]
+    [<00000000630e1906>] vfio_group_fops_unl_ioctl+0x8e0/0xb84 [vfio]
+    [<000000009e34c54f>] ksys_ioctl+0xd8/0x130
+    [<000000006577923d>] sys_ioctl+0x28/0x40
+    [<000000006d7b1cf2>] system_call_exception+0x114/0x1e0
+    [<0000000008ea7dd5>] system_call_common+0xf0/0x278
+
+Fixes: 89e1f7d4c66d ("vfio: Add PCI device driver")
+Signed-off-by: Qian Cai <cai@lca.pw>
+[aw: rolled in follow-up patch]
+Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/vfio/pci/vfio_pci_config.c | 7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/vfio/pci/vfio_pci_config.c b/drivers/vfio/pci/vfio_pci_config.c
+index 90c0b80f8acf9..43b95f9cdaf7b 100644
+--- a/drivers/vfio/pci/vfio_pci_config.c
++++ b/drivers/vfio/pci/vfio_pci_config.c
+@@ -1728,8 +1728,11 @@ void vfio_config_free(struct vfio_pci_device *vdev)
+       vdev->vconfig = NULL;
+       kfree(vdev->pci_config_map);
+       vdev->pci_config_map = NULL;
+-      kfree(vdev->msi_perm);
+-      vdev->msi_perm = NULL;
++      if (vdev->msi_perm) {
++              free_perm_bits(vdev->msi_perm);
++              kfree(vdev->msi_perm);
++              vdev->msi_perm = NULL;
++      }
+ }
+ /*
+-- 
+2.25.1
+
diff --git a/queue-5.7/vfio-pci-mask-cap-zero.patch b/queue-5.7/vfio-pci-mask-cap-zero.patch
new file mode 100644 (file)
index 0000000..fdb6f49
--- /dev/null
@@ -0,0 +1,50 @@
+From 86b696e4a4eb53dbc828a72fd8886a7631db8eee Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 8 Apr 2020 11:45:28 -0600
+Subject: vfio-pci: Mask cap zero
+
+From: Alex Williamson <alex.williamson@redhat.com>
+
+[ Upstream commit bc138db1b96264b9c1779cf18d5a3b186aa90066 ]
+
+The PCI Code and ID Assignment Specification changed capability ID 0
+from reserved to a NULL capability in the v1.1 revision.  The NULL
+capability is defined to include only the 16-bit capability header,
+ie. only the ID and next pointer.  Unfortunately vfio-pci creates a
+map of config space, where ID 0 is used to reserve the standard type
+0 header.  Finding an actual capability with this ID therefore results
+in a bogus range marked in that map and conflicts with subsequent
+capabilities.  As this seems to be a dummy capability anyway and we
+already support dropping capabilities, let's hide this one rather than
+delving into the potentially subtle dependencies within our map.
+
+Seen on an NVIDIA Tesla T4.
+
+Reviewed-by: Cornelia Huck <cohuck@redhat.com>
+Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/vfio/pci/vfio_pci_config.c | 7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/vfio/pci/vfio_pci_config.c b/drivers/vfio/pci/vfio_pci_config.c
+index 43b95f9cdaf7b..814bcbe0dd4e9 100644
+--- a/drivers/vfio/pci/vfio_pci_config.c
++++ b/drivers/vfio/pci/vfio_pci_config.c
+@@ -1462,7 +1462,12 @@ static int vfio_cap_init(struct vfio_pci_device *vdev)
+               if (ret)
+                       return ret;
+-              if (cap <= PCI_CAP_ID_MAX) {
++              /*
++               * ID 0 is a NULL capability, conflicting with our fake
++               * PCI_CAP_ID_BASIC.  As it has no content, consider it
++               * hidden for now.
++               */
++              if (cap && cap <= PCI_CAP_ID_MAX) {
+                       len = pci_cap_length[cap];
+                       if (len == 0xFF) { /* Variable length */
+                               len = vfio_cap_len(vdev, cap, pos);
+-- 
+2.25.1
+
diff --git a/queue-5.7/virtiofs-schedule-blocking-async-replies-in-separate.patch b/queue-5.7/virtiofs-schedule-blocking-async-replies-in-separate.patch
new file mode 100644 (file)
index 0000000..a4f69d8
--- /dev/null
@@ -0,0 +1,205 @@
+From 00d55e4a4b39042573fb2a92659a9ac8aaaa0409 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 20 Apr 2020 17:01:34 +0200
+Subject: virtiofs: schedule blocking async replies in separate worker
+
+From: Vivek Goyal <vgoyal@redhat.com>
+
+[ Upstream commit bb737bbe48bea9854455cb61ea1dc06e92ce586c ]
+
+In virtiofs (unlike in regular fuse) processing of async replies is
+serialized.  This can result in a deadlock in rare corner cases when
+there's a circular dependency between the completion of two or more async
+replies.
+
+Such a deadlock can be reproduced with xfstests:generic/503 if TEST_DIR ==
+SCRATCH_MNT (which is a misconfiguration):
+
+ - Process A is waiting for page lock in worker thread context and blocked
+   (virtio_fs_requests_done_work()).
+ - Process B is holding page lock and waiting for pending writes to
+   finish (fuse_wait_on_page_writeback()).
+ - Write requests are waiting in virtqueue and can't complete because
+   worker thread is blocked on page lock (process A).
+
+Fix this by creating a unique work_struct for each async reply that can
+block (O_DIRECT read).
+
+Fixes: a62a8ef9d97d ("virtio-fs: add virtiofs filesystem")
+Signed-off-by: Vivek Goyal <vgoyal@redhat.com>
+Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/fuse/file.c      |   1 +
+ fs/fuse/fuse_i.h    |   1 +
+ fs/fuse/virtio_fs.c | 106 +++++++++++++++++++++++++++++---------------
+ 3 files changed, 73 insertions(+), 35 deletions(-)
+
+diff --git a/fs/fuse/file.c b/fs/fuse/file.c
+index 9d67b830fb7a2..d400b71b98d55 100644
+--- a/fs/fuse/file.c
++++ b/fs/fuse/file.c
+@@ -712,6 +712,7 @@ static ssize_t fuse_async_req_send(struct fuse_conn *fc,
+       spin_unlock(&io->lock);
+       ia->ap.args.end = fuse_aio_complete_req;
++      ia->ap.args.may_block = io->should_dirty;
+       err = fuse_simple_background(fc, &ia->ap.args, GFP_KERNEL);
+       if (err)
+               fuse_aio_complete_req(fc, &ia->ap.args, err);
+diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h
+index ca344bf714045..d7cde216fc871 100644
+--- a/fs/fuse/fuse_i.h
++++ b/fs/fuse/fuse_i.h
+@@ -249,6 +249,7 @@ struct fuse_args {
+       bool out_argvar:1;
+       bool page_zeroing:1;
+       bool page_replace:1;
++      bool may_block:1;
+       struct fuse_in_arg in_args[3];
+       struct fuse_arg out_args[2];
+       void (*end)(struct fuse_conn *fc, struct fuse_args *args, int error);
+diff --git a/fs/fuse/virtio_fs.c b/fs/fuse/virtio_fs.c
+index bade747689033..0c6ef5d3c6ab8 100644
+--- a/fs/fuse/virtio_fs.c
++++ b/fs/fuse/virtio_fs.c
+@@ -60,6 +60,12 @@ struct virtio_fs_forget {
+       struct virtio_fs_forget_req req;
+ };
++struct virtio_fs_req_work {
++      struct fuse_req *req;
++      struct virtio_fs_vq *fsvq;
++      struct work_struct done_work;
++};
++
+ static int virtio_fs_enqueue_req(struct virtio_fs_vq *fsvq,
+                                struct fuse_req *req, bool in_flight);
+@@ -485,19 +491,67 @@ static void copy_args_from_argbuf(struct fuse_args *args, struct fuse_req *req)
+ }
+ /* Work function for request completion */
++static void virtio_fs_request_complete(struct fuse_req *req,
++                                     struct virtio_fs_vq *fsvq)
++{
++      struct fuse_pqueue *fpq = &fsvq->fud->pq;
++      struct fuse_conn *fc = fsvq->fud->fc;
++      struct fuse_args *args;
++      struct fuse_args_pages *ap;
++      unsigned int len, i, thislen;
++      struct page *page;
++
++      /*
++       * TODO verify that server properly follows FUSE protocol
++       * (oh.uniq, oh.len)
++       */
++      args = req->args;
++      copy_args_from_argbuf(args, req);
++
++      if (args->out_pages && args->page_zeroing) {
++              len = args->out_args[args->out_numargs - 1].size;
++              ap = container_of(args, typeof(*ap), args);
++              for (i = 0; i < ap->num_pages; i++) {
++                      thislen = ap->descs[i].length;
++                      if (len < thislen) {
++                              WARN_ON(ap->descs[i].offset);
++                              page = ap->pages[i];
++                              zero_user_segment(page, len, thislen);
++                              len = 0;
++                      } else {
++                              len -= thislen;
++                      }
++              }
++      }
++
++      spin_lock(&fpq->lock);
++      clear_bit(FR_SENT, &req->flags);
++      spin_unlock(&fpq->lock);
++
++      fuse_request_end(fc, req);
++      spin_lock(&fsvq->lock);
++      dec_in_flight_req(fsvq);
++      spin_unlock(&fsvq->lock);
++}
++
++static void virtio_fs_complete_req_work(struct work_struct *work)
++{
++      struct virtio_fs_req_work *w =
++              container_of(work, typeof(*w), done_work);
++
++      virtio_fs_request_complete(w->req, w->fsvq);
++      kfree(w);
++}
++
+ static void virtio_fs_requests_done_work(struct work_struct *work)
+ {
+       struct virtio_fs_vq *fsvq = container_of(work, struct virtio_fs_vq,
+                                                done_work);
+       struct fuse_pqueue *fpq = &fsvq->fud->pq;
+-      struct fuse_conn *fc = fsvq->fud->fc;
+       struct virtqueue *vq = fsvq->vq;
+       struct fuse_req *req;
+-      struct fuse_args_pages *ap;
+       struct fuse_req *next;
+-      struct fuse_args *args;
+-      unsigned int len, i, thislen;
+-      struct page *page;
++      unsigned int len;
+       LIST_HEAD(reqs);
+       /* Collect completed requests off the virtqueue */
+@@ -515,38 +569,20 @@ static void virtio_fs_requests_done_work(struct work_struct *work)
+       /* End requests */
+       list_for_each_entry_safe(req, next, &reqs, list) {
+-              /*
+-               * TODO verify that server properly follows FUSE protocol
+-               * (oh.uniq, oh.len)
+-               */
+-              args = req->args;
+-              copy_args_from_argbuf(args, req);
+-
+-              if (args->out_pages && args->page_zeroing) {
+-                      len = args->out_args[args->out_numargs - 1].size;
+-                      ap = container_of(args, typeof(*ap), args);
+-                      for (i = 0; i < ap->num_pages; i++) {
+-                              thislen = ap->descs[i].length;
+-                              if (len < thislen) {
+-                                      WARN_ON(ap->descs[i].offset);
+-                                      page = ap->pages[i];
+-                                      zero_user_segment(page, len, thislen);
+-                                      len = 0;
+-                              } else {
+-                                      len -= thislen;
+-                              }
+-                      }
+-              }
+-
+-              spin_lock(&fpq->lock);
+-              clear_bit(FR_SENT, &req->flags);
+               list_del_init(&req->list);
+-              spin_unlock(&fpq->lock);
+-              fuse_request_end(fc, req);
+-              spin_lock(&fsvq->lock);
+-              dec_in_flight_req(fsvq);
+-              spin_unlock(&fsvq->lock);
++              /* blocking async request completes in a worker context */
++              if (req->args->may_block) {
++                      struct virtio_fs_req_work *w;
++
++                      w = kzalloc(sizeof(*w), GFP_NOFS | __GFP_NOFAIL);
++                      INIT_WORK(&w->done_work, virtio_fs_complete_req_work);
++                      w->fsvq = fsvq;
++                      w->req = req;
++                      schedule_work(&w->done_work);
++              } else {
++                      virtio_fs_request_complete(req, fsvq);
++              }
+       }
+ }
+-- 
+2.25.1
+
diff --git a/queue-5.7/watchdog-da9062-no-need-to-ping-manually-before-sett.patch b/queue-5.7/watchdog-da9062-no-need-to-ping-manually-before-sett.patch
new file mode 100644 (file)
index 0000000..fb079e8
--- /dev/null
@@ -0,0 +1,49 @@
+From 5d6f13256bbfd79712cdc4624021e13b075e7514 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 3 Apr 2020 15:07:28 +0200
+Subject: watchdog: da9062: No need to ping manually before setting timeout
+
+From: Stefan Riedmueller <s.riedmueller@phytec.de>
+
+[ Upstream commit a0948ddba65f4f6d3cfb5e2b84685485d0452966 ]
+
+There is actually no need to ping the watchdog before disabling it
+during timeout change. Disabling the watchdog already takes care of
+resetting the counter.
+
+This fixes an issue during boot when the userspace watchdog handler takes
+over and the watchdog is already running. Opening the watchdog in this case
+leads to the first ping and directly after that without the required
+heartbeat delay a second ping issued by the set_timeout call. Due to the
+missing delay this resulted in a reset.
+
+Signed-off-by: Stefan Riedmueller <s.riedmueller@phytec.de>
+Reviewed-by: Guenter Roeck <linux@roeck-us.net>
+Reviewed-by: Adam Thomson <Adam.Thomson.Opensource@diasemi.com>
+Link: https://lore.kernel.org/r/20200403130728.39260-3-s.riedmueller@phytec.de
+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/da9062_wdt.c | 5 -----
+ 1 file changed, 5 deletions(-)
+
+diff --git a/drivers/watchdog/da9062_wdt.c b/drivers/watchdog/da9062_wdt.c
+index 0ad15d55071ce..18dec438d5188 100644
+--- a/drivers/watchdog/da9062_wdt.c
++++ b/drivers/watchdog/da9062_wdt.c
+@@ -58,11 +58,6 @@ static int da9062_wdt_update_timeout_register(struct da9062_watchdog *wdt,
+                                             unsigned int regval)
+ {
+       struct da9062 *chip = wdt->hw;
+-      int ret;
+-
+-      ret = da9062_reset_watchdog_timer(wdt);
+-      if (ret)
+-              return ret;
+       regmap_update_bits(chip->regmap,
+                                 DA9062AA_CONTROL_D,
+-- 
+2.25.1
+
diff --git a/queue-5.7/x86-apic-make-tsc-deadline-timer-detection-message-v.patch b/queue-5.7/x86-apic-make-tsc-deadline-timer-detection-message-v.patch
new file mode 100644 (file)
index 0000000..3f34583
--- /dev/null
@@ -0,0 +1,47 @@
+From aa5e42f605563b904155d8f395bc4bd34ebdfdfe Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 25 May 2020 12:38:39 +0200
+Subject: x86/apic: Make TSC deadline timer detection message visible
+
+From: Borislav Petkov <bp@suse.de>
+
+[ Upstream commit de308d1815c9e8fe602a958c5c76142ff6501d75 ]
+
+The commit
+
+  c84cb3735fd5 ("x86/apic: Move TSC deadline timer debug printk")
+
+removed the message which said that the deadline timer was enabled.
+It added a pr_debug() message which is issued when deadline timer
+validation succeeds.
+
+Well, issued only when CONFIG_DYNAMIC_DEBUG is enabled - otherwise
+pr_debug() calls get optimized away if DEBUG is not defined in the
+compilation unit.
+
+Therefore, make the above message pr_info() so that it is visible in
+dmesg.
+
+Signed-off-by: Borislav Petkov <bp@suse.de>
+Link: https://lkml.kernel.org/r/20200525104218.27018-1-bp@alien8.de
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/x86/kernel/apic/apic.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c
+index e53dda210cd73..21d2f1de10578 100644
+--- a/arch/x86/kernel/apic/apic.c
++++ b/arch/x86/kernel/apic/apic.c
+@@ -2093,7 +2093,7 @@ void __init init_apic_mappings(void)
+       unsigned int new_apicid;
+       if (apic_validate_deadline_timer())
+-              pr_debug("TSC deadline timer available\n");
++              pr_info("TSC deadline timer available\n");
+       if (x2apic_mode) {
+               boot_cpu_physical_apicid = read_apic_id();
+-- 
+2.25.1
+
diff --git a/queue-5.7/x86-idt-keep-spurious-entries-unset-in-system_vector.patch b/queue-5.7/x86-idt-keep-spurious-entries-unset-in-system_vector.patch
new file mode 100644 (file)
index 0000000..4a2189a
--- /dev/null
@@ -0,0 +1,52 @@
+From 1bac90e594735272df2a569d94486b185ab223af Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 28 Apr 2020 11:38:24 +0200
+Subject: x86/idt: Keep spurious entries unset in system_vectors
+
+From: Vitaly Kuznetsov <vkuznets@redhat.com>
+
+[ Upstream commit 1f1fbc70c10e81f70e9fbe2102d439c883269811 ]
+
+With commit dc20b2d52653 ("x86/idt: Move interrupt gate initialization to
+IDT code") non assigned system vectors are also marked as used in
+'used_vectors' (now 'system_vectors') bitmap. This makes checks in
+arch_show_interrupts() whether a particular system vector is allocated to
+always pass and e.g. 'Hyper-V reenlightenment interrupts' entry always
+shows up in /proc/interrupts.
+
+Another side effect of having all unassigned system vectors marked as used
+is that irq_matrix_debug_show() will wrongly count them among 'System'
+vectors.
+
+As it is now ensured that alloc_intr_gate() is not called after init, it is
+possible to leave unused entries in 'system_vectors' unset to fix these
+issues.
+
+Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com>
+Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
+Link: https://lkml.kernel.org/r/20200428093824.1451532-4-vkuznets@redhat.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/x86/kernel/idt.c | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+diff --git a/arch/x86/kernel/idt.c b/arch/x86/kernel/idt.c
+index 87ef69a72c52e..7bb4c3cbf4dcd 100644
+--- a/arch/x86/kernel/idt.c
++++ b/arch/x86/kernel/idt.c
+@@ -318,7 +318,11 @@ void __init idt_setup_apic_and_irq_gates(void)
+ #ifdef CONFIG_X86_LOCAL_APIC
+       for_each_clear_bit_from(i, system_vectors, NR_VECTORS) {
+-              set_bit(i, system_vectors);
++              /*
++               * Don't set the non assigned system vectors in the
++               * system_vectors bitmap. Otherwise they show up in
++               * /proc/interrupts.
++               */
+               entry = spurious_entries_start + 8 * (i - FIRST_SYSTEM_VECTOR);
+               set_intr_gate(i, entry);
+       }
+-- 
+2.25.1
+
diff --git a/queue-5.7/x86-mce-dev-mcelog-fix-wstringop-truncation-warning-.patch b/queue-5.7/x86-mce-dev-mcelog-fix-wstringop-truncation-warning-.patch
new file mode 100644 (file)
index 0000000..d0e5117
--- /dev/null
@@ -0,0 +1,49 @@
+From eb1e50a931f9057132e3d39760d15c8fd389a19d Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 27 May 2020 11:28:08 -0700
+Subject: x86/mce/dev-mcelog: Fix -Wstringop-truncation warning about strncpy()
+
+From: Tony Luck <tony.luck@intel.com>
+
+[ Upstream commit 7ccddc4613db446dc3cbb69a3763ba60ec651d13 ]
+
+The kbuild test robot reported this warning:
+
+  arch/x86/kernel/cpu/mce/dev-mcelog.c: In function 'dev_mcelog_init_device':
+  arch/x86/kernel/cpu/mce/dev-mcelog.c:346:2: warning: 'strncpy' output \
+    truncated before terminating nul copying 12 bytes from a string of the \
+    same length [-Wstringop-truncation]
+
+This is accurate, but I don't care that the trailing NUL character isn't
+copied. The string being copied is just a magic number signature so that
+crash dump tools can be sure they are decoding the right blob of memory.
+
+Use memcpy() instead of strncpy().
+
+Fixes: d8ecca4043f2 ("x86/mce/dev-mcelog: Dynamically allocate space for machine check records")
+Reported-by: kbuild test robot <lkp@intel.com>
+Signed-off-by: Tony Luck <tony.luck@intel.com>
+Signed-off-by: Borislav Petkov <bp@suse.de>
+Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
+Link: https://lkml.kernel.org/r/20200527182808.27737-1-tony.luck@intel.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/x86/kernel/cpu/mce/dev-mcelog.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/arch/x86/kernel/cpu/mce/dev-mcelog.c b/arch/x86/kernel/cpu/mce/dev-mcelog.c
+index d089567a9ce82..bcb379b2fd42e 100644
+--- a/arch/x86/kernel/cpu/mce/dev-mcelog.c
++++ b/arch/x86/kernel/cpu/mce/dev-mcelog.c
+@@ -343,7 +343,7 @@ static __init int dev_mcelog_init_device(void)
+       if (!mcelog)
+               return -ENOMEM;
+-      strncpy(mcelog->signature, MCE_LOG_SIGNATURE, sizeof(mcelog->signature));
++      memcpy(mcelog->signature, MCE_LOG_SIGNATURE, sizeof(mcelog->signature));
+       mcelog->len = mce_log_len;
+       mcelog->recordlen = sizeof(struct mce);
+-- 
+2.25.1
+
diff --git a/queue-5.7/x86-purgatory-disable-various-profiling-and-sanitizi.patch b/queue-5.7/x86-purgatory-disable-various-profiling-and-sanitizi.patch
new file mode 100644 (file)
index 0000000..d8b108c
--- /dev/null
@@ -0,0 +1,62 @@
+From 13a9eeeba7309485221914b605a982aa33a330ef Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 17 Mar 2020 14:08:40 +0100
+Subject: x86/purgatory: Disable various profiling and sanitizing options
+
+From: Hans de Goede <hdegoede@redhat.com>
+
+[ Upstream commit e2ac07c06058ae2d58b45bbf2a2a352771d76fcb ]
+
+Since the purgatory is a special stand-alone binary, various profiling
+and sanitizing options must be disabled. Having these options enabled
+typically will cause dependencies on various special symbols exported by
+special libs / stubs used by these frameworks. Since the purgatory is
+special, it is not linked against these stubs causing missing symbols in
+the purgatory if these options are not disabled.
+
+Sync the set of disabled profiling and sanitizing options with that from
+drivers/firmware/efi/libstub/Makefile, adding
+-DDISABLE_BRANCH_PROFILING to the CFLAGS and setting:
+
+  GCOV_PROFILE                    := n
+  UBSAN_SANITIZE                  := n
+
+This fixes broken references to ftrace_likely_update() when
+CONFIG_TRACE_BRANCH_PROFILING is enabled and to __gcov_init() and
+__gcov_exit() when CONFIG_GCOV_KERNEL is enabled.
+
+Signed-off-by: Hans de Goede <hdegoede@redhat.com>
+Signed-off-by: Borislav Petkov <bp@suse.de>
+Link: https://lkml.kernel.org/r/20200317130841.290418-1-hdegoede@redhat.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/x86/purgatory/Makefile | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+diff --git a/arch/x86/purgatory/Makefile b/arch/x86/purgatory/Makefile
+index fb4ee54443799..9733d1cc791dd 100644
+--- a/arch/x86/purgatory/Makefile
++++ b/arch/x86/purgatory/Makefile
+@@ -17,7 +17,10 @@ CFLAGS_sha256.o := -D__DISABLE_EXPORTS
+ LDFLAGS_purgatory.ro := -e purgatory_start -r --no-undefined -nostdlib -z nodefaultlib
+ targets += purgatory.ro
++# Sanitizer, etc. runtimes are unavailable and cannot be linked here.
++GCOV_PROFILE  := n
+ KASAN_SANITIZE        := n
++UBSAN_SANITIZE        := n
+ KCOV_INSTRUMENT := n
+ # These are adjustments to the compiler flags used for objects that
+@@ -25,7 +28,7 @@ KCOV_INSTRUMENT := n
+ PURGATORY_CFLAGS_REMOVE := -mcmodel=kernel
+ PURGATORY_CFLAGS := -mcmodel=large -ffreestanding -fno-zero-initialized-in-bss
+-PURGATORY_CFLAGS += $(DISABLE_STACKLEAK_PLUGIN)
++PURGATORY_CFLAGS += $(DISABLE_STACKLEAK_PLUGIN) -DDISABLE_BRANCH_PROFILING
+ # Default KBUILD_CFLAGS can have -pg option set when FTRACE is enabled. That
+ # in turn leaves some undefined symbols like __fentry__ in purgatory and not
+-- 
+2.25.1
+
diff --git a/queue-5.7/xdp-fix-xsk_generic_xmit-errno.patch b/queue-5.7/xdp-fix-xsk_generic_xmit-errno.patch
new file mode 100644 (file)
index 0000000..edd8735
--- /dev/null
@@ -0,0 +1,45 @@
+From 517e4bfdbb0dbc00818d2024b4570186815b7710 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 11 Jun 2020 13:11:06 +0800
+Subject: xdp: Fix xsk_generic_xmit errno
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Li RongQing <lirongqing@baidu.com>
+
+[ Upstream commit aa2cad0600ed2ca6a0ab39948d4db1666b6c962b ]
+
+Propagate sock_alloc_send_skb error code, not set it to
+EAGAIN unconditionally, when fail to allocate skb, which
+might cause that user space unnecessary loops.
+
+Fixes: 35fcde7f8deb ("xsk: support for Tx")
+Signed-off-by: Li RongQing <lirongqing@baidu.com>
+Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
+Acked-by: Björn Töpel <bjorn.topel@intel.com>
+Link: https://lore.kernel.org/bpf/1591852266-24017-1-git-send-email-lirongqing@baidu.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/xdp/xsk.c | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+diff --git a/net/xdp/xsk.c b/net/xdp/xsk.c
+index c350108aa38de..a4676107fad05 100644
+--- a/net/xdp/xsk.c
++++ b/net/xdp/xsk.c
+@@ -397,10 +397,8 @@ static int xsk_generic_xmit(struct sock *sk)
+               len = desc.len;
+               skb = sock_alloc_send_skb(sk, len, 1, &err);
+-              if (unlikely(!skb)) {
+-                      err = -EAGAIN;
++              if (unlikely(!skb))
+                       goto out;
+-              }
+               skb_put(skb, len);
+               addr = desc.addr;
+-- 
+2.25.1
+
diff --git a/queue-5.7/xen-cpuhotplug-fix-initial-cpu-offlining-for-pv-h-gu.patch b/queue-5.7/xen-cpuhotplug-fix-initial-cpu-offlining-for-pv-h-gu.patch
new file mode 100644 (file)
index 0000000..fb60e02
--- /dev/null
@@ -0,0 +1,59 @@
+From 938d5662384809f37937ba0113abbbeb8eae2f84 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 8 May 2020 18:28:43 -0400
+Subject: xen/cpuhotplug: Fix initial CPU offlining for PV(H) guests
+
+From: Boris Ostrovsky <boris.ostrovsky@oracle.com>
+
+[ Upstream commit c54b071c192dfe8061336f650ceaf358e6386e0b ]
+
+Commit a926f81d2f6c ("xen/cpuhotplug: Replace cpu_up/down() with
+device_online/offline()") replaced cpu_down() with device_offline()
+call which requires that the CPU has been registered before. This
+registration, however, happens later from topology_init() which
+is called as subsys_initcall(). setup_vcpu_hotplug_event(), on the
+other hand, is invoked earlier, during arch_initcall().
+
+As result, booting a PV(H) guest with vcpus < maxvcpus causes a crash.
+
+Move setup_vcpu_hotplug_event() (and therefore setup_cpu_watcher()) to
+late_initcall(). In addition, instead of performing all offlining steps
+in setup_cpu_watcher() simply call disable_hotplug_cpu().
+
+Fixes: a926f81d2f6c (xen/cpuhotplug: Replace cpu_up/down() with device_online/offline()"
+Signed-off-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
+Link: https://lore.kernel.org/r/1588976923-3667-1-git-send-email-boris.ostrovsky@oracle.com
+Reviewed-by: Juergen Gross <jgross@suse.com>
+Signed-off-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/xen/cpu_hotplug.c | 8 +++-----
+ 1 file changed, 3 insertions(+), 5 deletions(-)
+
+diff --git a/drivers/xen/cpu_hotplug.c b/drivers/xen/cpu_hotplug.c
+index ec975decb5def..b96b11e2b571d 100644
+--- a/drivers/xen/cpu_hotplug.c
++++ b/drivers/xen/cpu_hotplug.c
+@@ -93,10 +93,8 @@ static int setup_cpu_watcher(struct notifier_block *notifier,
+       (void)register_xenbus_watch(&cpu_watch);
+       for_each_possible_cpu(cpu) {
+-              if (vcpu_online(cpu) == 0) {
+-                      device_offline(get_cpu_device(cpu));
+-                      set_cpu_present(cpu, false);
+-              }
++              if (vcpu_online(cpu) == 0)
++                      disable_hotplug_cpu(cpu);
+       }
+       return NOTIFY_DONE;
+@@ -119,5 +117,5 @@ static int __init setup_vcpu_hotplug_event(void)
+       return 0;
+ }
+-arch_initcall(setup_vcpu_hotplug_event);
++late_initcall(setup_vcpu_hotplug_event);
+-- 
+2.25.1
+
diff --git a/queue-5.7/xfs-add-the-missed-xfs_perag_put-for-xfs_ifree_clust.patch b/queue-5.7/xfs-add-the-missed-xfs_perag_put-for-xfs_ifree_clust.patch
new file mode 100644 (file)
index 0000000..25579fd
--- /dev/null
@@ -0,0 +1,41 @@
+From f1cb0214bbbb8b9781197991c91f4d35b9ddacfd Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 3 Jun 2020 09:27:28 -0700
+Subject: xfs: Add the missed xfs_perag_put() for xfs_ifree_cluster()
+
+From: Chuhong Yuan <hslester96@gmail.com>
+
+[ Upstream commit 8cc0072469723459dc6bd7beff81b2b3149f4cf4 ]
+
+xfs_ifree_cluster() calls xfs_perag_get() at the beginning, but forgets to
+call xfs_perag_put() in one failed path.
+Add the missed function call to fix it.
+
+Fixes: ce92464c180b ("xfs: make xfs_trans_get_buf return an error code")
+Signed-off-by: Chuhong Yuan <hslester96@gmail.com>
+Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
+Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/xfs/xfs_inode.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c
+index d1772786af29d..8845faa8161a9 100644
+--- a/fs/xfs/xfs_inode.c
++++ b/fs/xfs/xfs_inode.c
+@@ -2639,8 +2639,10 @@ xfs_ifree_cluster(
+               error = xfs_trans_get_buf(tp, mp->m_ddev_targp, blkno,
+                               mp->m_bsize * igeo->blocks_per_cluster,
+                               XBF_UNMAPPED, &bp);
+-              if (error)
++              if (error) {
++                      xfs_perag_put(pag);
+                       return error;
++              }
+               /*
+                * This buffer may not have been correctly initialised as we
+-- 
+2.25.1
+
diff --git a/queue-5.7/yam-fix-possible-memory-leak-in-yam_init_driver.patch b/queue-5.7/yam-fix-possible-memory-leak-in-yam_init_driver.patch
new file mode 100644 (file)
index 0000000..58a31f0
--- /dev/null
@@ -0,0 +1,36 @@
+From d51d6fd1b896f44545f153b064e80618a78c87d7 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 4 Jun 2020 20:18:51 +0800
+Subject: yam: fix possible memory leak in yam_init_driver
+
+From: Wang Hai <wanghai38@huawei.com>
+
+[ Upstream commit 98749b7188affbf2900c2aab704a8853901d1139 ]
+
+If register_netdev(dev) fails, free_netdev(dev) needs
+to be called, otherwise a memory leak will occur.
+
+Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
+Reported-by: Hulk Robot <hulkci@huawei.com>
+Signed-off-by: Wang Hai <wanghai38@huawei.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/hamradio/yam.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/net/hamradio/yam.c b/drivers/net/hamradio/yam.c
+index 71cdef9fb56bc..5ab53e9942f30 100644
+--- a/drivers/net/hamradio/yam.c
++++ b/drivers/net/hamradio/yam.c
+@@ -1133,6 +1133,7 @@ static int __init yam_init_driver(void)
+               err = register_netdev(dev);
+               if (err) {
+                       printk(KERN_WARNING "yam: cannot register net device %s\n", dev->name);
++                      free_netdev(dev);
+                       goto error;
+               }
+               yam_devs[i] = dev;
+-- 
+2.25.1
+