From b82d4be0e284e515301bfceafabc7bc5009e5f1c Mon Sep 17 00:00:00 2001 From: Sasha Levin Date: Mon, 22 Jun 2020 08:46:11 -0400 Subject: [PATCH] Fixes for 5.4 Signed-off-by: Sasha Levin --- ...d-should-change-i_size-under-the-rig.patch | 44 ++ ...de-dir-in-bulk-status-fetch-from-afs.patch | 59 +++ queue-5.4/afs-fix-eof-corruption.patch | 103 ++++ ...-fix-memory-leak-in-afs_put_sysnames.patch | 36 ++ ...ting-of-mtime-when-writing-into-mmap.patch | 39 ++ ...apping-of-the-uaeoverflow-abort-code.patch | 39 ++ ...ag-rather-than-return-error-from-fil.patch | 479 ++++++++++++++++++ ...b-fix-invalid-assignment-to-union-da.patch | 41 ++ ...-introduce-polarity-for-micmute-led-.patch | 79 +++ ...nt-prevent-out-of-bounds-write-in-io.patch | 49 ++ ...dd-duplex-sound-support-for-usb-devi.patch | 297 +++++++++++ ...ix-racy-list-management-in-output-qu.patch | 51 ++ ...udio-improve-frames-size-computation.patch | 167 ++++++ ...ut-label-on-apparmor_sk_clone_securi.patch | 194 +++++++ ...rospection-of-of-task-mode-for-uncon.patch | 63 +++ ...r-fix-nnp-subset-test-for-unconfined.patch | 125 +++++ ...itch-existing-boards-with-rgmii-phy-.patch | 72 +++ ...-renesas-fix-iommu-device-node-names.patch | 463 +++++++++++++++++ ...d-missing-ethernet-phy-reset-on-av96.patch | 43 ++ ...-plus-bananapi-m2-zero-fix-led-polar.patch | 43 ++ ...tegrator-add-some-kconfig-selections.patch | 61 +++ ...mada-3720-turris-mox-fix-sfp-binding.patch | 40 ++ ...-3720-turris-mox-forbid-sdr104-on-sd.patch | 42 ++ .../arm64-dts-fvp-fix-gic-child-nodes.patch | 171 +++++++ ...dts-fvp-juno-fix-node-address-fields.patch | 172 +++++++ .../arm64-dts-juno-fix-gic-child-nodes.patch | 132 +++++ ...arm64-dts-meson-fixup-scp-sram-nodes.patch | 85 ++++ .../arm64-dts-msm8996-fix-csi-irq-types.patch | 55 ++ ...64-dts-mt8173-fix-unit-name-warnings.patch | 130 +++++ ...-dts-qcom-fix-pm8150-gpio-interrupts.patch | 107 ++++ ...sm8916-remove-unit-name-for-thermal-.patch | 84 +++ ...int-don-t-invoke-overflow-handler-on.patch | 109 ++++ ...-ethernet-phy-mode-for-jetson-xavier.patch | 44 ++ ...flag-for-64-bit-resources-in-ranges-.patch | 81 +++ ...y-convert-non-dpcm-link-to-dpcm-link.patch | 72 +++ ...sp-fix-dma_chan-refcnt-leak-when-get.patch | 53 ++ ...ete-error-handling-in-img_i2s_in_pro.patch | 37 ++ ...a-fix-dma_chan-leak-when-config-dma-.patch | 46 ++ ...sable-exception-interrupt-before-sch.patch | 41 ++ ..._rt5640-add-quirk-for-toshiba-encore.patch | 52 ++ ...0-add-quirk-for-toshiba-encore.patch-14146 | 51 ++ ...373-reorder-max98373_reset-in-resume.patch | 56 ++ ...n-add-missing-free_irq-in-error-path.patch | 53 ++ queue-5.4/asoc-qcom-q6asm-dai-kcfi-fix.patch | 111 ++++ ...45-add-platform-data-for-asus-t101ha.patch | 60 +++ ...x-error-return-code-in-sof_probe_con.patch | 37 ++ ...ing-when-dsp-pm-callbacks-are-not-se.patch | 60 +++ .../asoc-sof-imx8-fix-randbuild-error.patch | 50 ++ ...-conditionally-set-dpcm_capture-dpcm.patch | 51 ++ ..._wm8903-support-nvidia-headset-prope.patch | 54 ++ ...sp-fix-an-error-handling-path-in-aso.patch | 71 +++ ...0-fix-some-refcounted-resources-issu.patch | 58 +++ ...-ensure-regulators-are-disabled-on-p.patch | 123 +++++ ...tial-deadlock-problem-in-btree_gc_co.patch | 96 ++++ ...ace-fix-endianness-for-blk_log_remap.patch | 64 +++ ...ktrace-fix-endianness-in-get_pdu_int.patch | 35 ++ ...trace-use-errno-instead-of-bi_status.patch | 50 ++ ...ock-fix-use-after-free-in-blkdev_get.patch | 199 ++++++++ ...rom-timer-if-interface-is-not-in-ope.patch | 37 ++ ...fix-memlock-accounting-for-sock_hash.patch | 59 +++ ...-memory-leak-when-unlinking-sockets-.patch | 56 ++ ...chronize-delete-from-bucket-list-on-.patch | 116 +++++ ...ix-kernel-panic-at-__tcp_bpf_recvmsg.patch | 63 +++ ...n-estale-if-there-s-still-an-open-fi.patch | 61 +++ ...-dfs-target-before-generic_ip_connec.patch | 104 ++++ ...ast2600-fix-ahb-clock-divider-for-a1.patch | 81 +++ ...return-type-of-bcm2835_register_gate.patch | 59 +++ ...-flexgen-fix-clock-critical-handling.patch | 37 ++ ...b-don-t-rely-on-u-boot-to-init-all-g.patch | 84 +++ ...b-fix-the-first-parent-of-vid_pll_in.patch | 48 ++ ...b-fix-the-polarity-of-the-reset_n-li.patch | 167 ++++++ ...b-fix-the-vclk_div-1-2-4-6-12-_en-ga.patch | 81 +++ ...-fix-the-address-location-of-pll-con.patch | 94 ++++ ...mssr-fix-stbcr-suspend-resume-handli.patch | 60 +++ ...os5433-add-ignore_unused-flag-to-scl.patch | 68 +++ ...-top-isp-and-cam-clocks-on-exynos542.patch | 92 ++++ ...correct-type-of-value-for-_sprd_pll_.patch | 41 ++ ...xi-fix-incorrect-usage-of-round_down.patch | 39 ++ .../clk-ti-composite-fix-memory-leak.patch | 38 ++ ...emory-leak-in-zynqmp_register_clocks.patch | 100 ++++ ...x-tmc-mode-read-in-tmc_read_prepare_.patch | 93 ++++ ...-add-proper-load-balancing-support-f.patch | 169 ++++++ ...appings-when-a-driver-claims-the-reg.patch | 263 ++++++++++ queue-5.4/dlm-remove-bug-before-panic.patch | 51 ++ ...itch-paths-in-dm_blk_ioctl-code-path.patch | 49 ++ ...null-if-dmz_get_zone_for_reclaim-fai.patch | 64 +++ ...-null-pointer-exception-in-__platfor.patch | 85 ++++ ...i-fix-wrong-value-for-all-counters-e.patch | 41 ++ ...sb-do-not-use-internal-fsm-for-usb2-.patch | 150 ++++++ ...revalidate-bandwidth-before-commitin.patch | 61 +++ ...ave-fix-refcouting-error-for-modules.patch | 50 ++ ...-mdp5_init-error-path-for-failed-mdp.patch | 37 ++ ...-gm200-fix-nv_pdisp_sor_hdmi2_ctrl-n.patch | 40 ++ ...i-hdmi-ddc-clk-fix-size-of-m-divider.patch | 51 ++ ...rite-the-errcode-in-ext4_setup_super.patch | 38 ++ ...fix-an-error-handling-path-in-adc_ja.patch | 49 ++ ...urn-vmalloc-memory-from-f2fs_kmalloc.patch | 114 +++++ ...only-filesystem-in-f2fs_ioc_shutdown.patch | 44 ++ ...lloc-reserve-as-non-free-in-statfs-f.patch | 41 ++ ...-fix-possible-memory-leak-in-imx_scu.patch | 37 ++ ...m-fix-bogous-abuse-of-dma-direct-int.patch | 72 +++ ...-afu-corrected-error-handling-levels.patch | 44 ++ ...opy_file_range-should-truncate-cache.patch | 66 +++ ...use-fix-copy_file_range-cache-issues.patch | 63 +++ ...om-tx_error-to-tx_dropped-on-missing.patch | 64 +++ ...w-lock_nolock-mount-to-specify-jid-x.patch | 46 ++ ...-after-free-on-transaction-ail-lists.patch | 79 +++ ...end-module_alias-for-platform-driver.patch | 77 +++ ...acpi_gpiochip_free_interrupts-on-gpi.patch | 78 +++ ...-handling-of-automatic-address-incre.patch | 146 ++++++ ...nalabs-increase-timeout-during-reset.patch | 44 ++ ...irks-for-trust-panora-graphic-tablet.patch | 75 +++ ...d-avoid-bogus-uninitialized-variable.patch | 56 ++ ...fix-build-with-config_amiga_pcmcia-n.patch | 39 ++ ...-secondary-smbus-controller-on-amd-a.patch | 51 ++ ...l-master-action-bits-in-i2c_pxa_stop.patch | 45 ++ ..._pxa_scream_blue_murder-debug-output.patch | 54 ++ ...vf-fix-speed-reporting-over-virtchnl.patch | 330 ++++++++++++ ...ix-ports-memory-leak-in-cma_configfs.patch | 54 ++ ...-support-for-mlx5_cmd_op_init2init_q.patch | 43 ++ ...-bmp280-fix-compensation-of-humidity.patch | 50 ++ ...p280-tolerate-irq-before-registering.patch | 58 +++ ...tops.h-avoid-clang-shift-count-overf.patch | 65 +++ ...-fix-get_default-register-write-acce.patch | 59 +++ ...8042-remove-special-powerpc-handling.patch | 127 +++++ ...114-add-extra-compatible-for-mms345l.patch | 88 ++++ ...-instead-of-kmalloc-for-user-creatio.patch | 87 ++++ ...m-ppc-book3s-fix-some-rcu-list-locks.patch | 165 ++++++ ...s-hv-ignore-kmemleak-false-positives.patch | 101 ++++ ...outdated-and-incorrect-pre-increment.patch | 279 ++++++++++ .../libata-use-per-port-sync-for-detach.patch | 93 ++++ ...e-gcc-noreturn-turned-volatile-quirk.patch | 108 ++++ ...emory-leak-in-an-error-handling-path.patch | 40 ++ ...pi-fix-null-vs-is_err-check-in-zynqm.patch | 81 +++ ...e-irq-in-suspend-to-avoid-spurious-i.patch | 68 +++ ...-stmfx-fix-stmfx_irq_init-error-path.patch | 49 ++ ...chip-on-resume-as-supply-was-disable.patch | 42 ++ ...river-operation-if-loaded-as-modules.patch | 38 ++ ...-an-incomplete-memory-release-in-fas.patch | 43 ++ ...ix-potential-fastrpc_invoke_ctx-leak.patch | 59 +++ ...c-improve-get_user_pages_fast-error-.patch | 97 ++++ ...-mismatch-of-.l-symbols-in-system.ma.patch | 46 ++ queue-5.4/mvpp2-remove-module-bugfix.patch | 58 +++ ...swip-fix-and-improve-the-unsupported.patch | 47 ++ ...t-reading-net-in-load_bytes_relative.patch | 74 +++ ...net-marvell-fix-of_mdio-config-check.patch | 38 ++ ...c-fix-off-by-one-issues-in-rpc_ntop6.patch | 45 ++ ...et-invalid-blocks-after-nfsv4-writes.patch | 114 +++++ ...t-refcnt-leak-when-setup-callback-cl.patch | 44 ++ ...d-safer-handling-of-corrupted-c_type.patch | 36 ++ ...sd4-make-drc_slab-global-not-per-net.patch | 250 +++++++++ ...call_done-assignment-for-bind_conn_t.patch | 33 ++ ...ult-port-and-peer-numbers-for-legacy.patch | 69 +++ ...-choose-doorbells-based-on-port-numb.patch | 71 +++ ...t-fix-bug-when-counting-remote-files.patch | 39 ++ ...ding-the-link-file-should-not-end-in.patch | 51 ++ ...equire-one-more-memory-window-than-n.patch | 38 ++ ...ace-condition-when-run-with-ntb_test.patch | 81 +++ ...port-for-hardware-that-doesn-t-have-.patch | 52 ++ ...hange-to-use-the-ntb-device-dev-for-.patch | 44 ++ ...rrect-struct-device-to-dma_alloc_coh.patch | 61 +++ ...rrect-struct-device-to-dma_alloc_coh.patch | 61 +++ ...simple-suspend-when-a-hmb-is-enabled.patch | 46 ++ ...unting-bug-in-__of_attach_node_sysfs.patch | 46 ++ ...ue-with-argument-clobbering-for-clon.patch | 48 ++ ...-verify-permissions-in-ovl_path_open.patch | 72 +++ ...-t-blindly-enable-aspm-l0s-and-don-t.patch | 69 +++ ...size_resource-for-devices-on-root-bu.patch | 56 ++ ...n-don-t-use-fast_link_mode-to-set-up.patch | 57 +++ ...spm-on-links-to-pcie-to-pci-pci-x-br.patch | 55 ++ ...ix-inner-msi-irq-domain-registration.patch | 48 ++ ...ster_host_bridge-device_register-err.patch | 43 ++ ...i-bridge-emul-fix-pcie-bit-conflicts.patch | 55 ++ ...rts-without-dll-link-active-train-li.patch | 113 +++++ ...switch-downstream-port-ptm-settings-.patch | 78 +++ ...-incorrect-programming-of-ob-windows.patch | 74 +++ ...a-memory-leak-in-v3_pci_probe-error-.patch | 42 ++ ...esource-type-bits-from-shadow-regist.patch | 55 ++ ...null-pointer-dereference-in-hists__f.patch | 46 ++ ...rf-stat-fix-null-pointer-dereference.patch | 52 ++ ...e-imx-fix-an-error-handling-path-in-.patch | 76 +++ ...e-imx-use-devm_of_iomap-to-avoid-a-r.patch | 50 ++ ...-an-error-handling-path-in-imx1_pinc.patch | 39 ++ ...ix-gpio-interrupt-decoding-on-jaguar.patch | 45 ++ ...-fix-memleak-in-rockchip_dt_node_to_.patch | 64 +++ ...-wrong-array-assignment-of-rza1l_swi.patch | 48 ++ ...4257_charger-replace-depends-on-regm.patch | 39 ++ ...788-fix-an-error-handling-path-in-lp.patch | 71 +++ ...smb347-charger-irqstat_d-is-volatile.patch | 38 ++ ...-don-t-warn-when-mapping-ro-data-rox.patch | 58 +++ .../powerpc-4xx-don-t-unmap-null-mbase.patch | 43 ++ ...n-t-initialise-init_task-thread.regs.patch | 182 +++++++ ...ption-fix-machine-check-no-loss-idle.patch | 75 +++ ...s-pgtable-fix-an-undefined-behaviour.patch | 79 +++ ...hkernel-take-mem-option-into-account.patch | 81 +++ ...el-crash-in-show_instructions-w-debu.patch | 86 ++++ ...x-stack-overflow-by-increasing-threa.patch | 40 ++ ...24x7-fix-inconsistent-output-values-.patch | 96 ++++ .../powerpc-ps3-fix-kexec-shutdown-hang.patch | 83 +++ ...eries-ras-fix-fwnmi_valid-off-by-one.patch | 46 ++ ...werpc-ptdump-add-_page_coherent-flag.patch | 40 ++ ...isk-use-the-default-segment-boundary.patch | 89 ++++ ...runtime_put-in-pm_runtime_get_sync-f.patch | 51 ++ ...re-fix-several-reference-count-leaks.patch | 63 +++ .../rdma-hns-bugfix-for-querying-qkey.patch | 38 ++ ...q-parameter-of-querying-pf-timer-res.patch | 77 +++ ...eanup-device-debugfs-entries-on-uld-.patch | 35 ++ ...x5-add-init2init-as-a-modify-command.patch | 39 ++ ...fix-udata-response-upon-srq-creation.patch | 50 ++ ...ix-idr-initialisation-in-rproc_alloc.patch | 60 +++ ...q6v5_mss-map-unmap-mpss-segments-bef.patch | 110 ++++ ...tc-mc13xxx-fix-a-double-unlock-issue.patch | 47 ++ ...issed-check-for-devm_regmap_init_i2c.patch | 37 ++ ...c-net-rxrpc-calls-to-display-call-de.patch | 54 ++ ...-thinint-indicator-after-early-error.patch | 85 ++++ ...install-exit-with-error-on-config-le.patch | 61 +++ ...ix-an-error-handling-path-in-acornsc.patch | 40 ++ ...sgtables-in-case-command-setup-fails.patch | 95 ++++ ...gb3i-fix-some-leaks-in-init_act_open.patch | 73 +++ ...-not-reset-phy-timer-to-wait-for-str.patch | 47 ++ ...n-t-send-host-info-in-adapter-info-m.patch | 46 ++ ...eference-count-leak-in-iscsi_boot_cr.patch | 38 ++ ...fc_nodelist-leak-when-processing-uns.patch | 51 ++ ...csi-mpt3sas-fix-double-free-warnings.patch | 43 ++ ...ash-when-mfw-calls-for-protocol-stat.patch | 131 +++++ ...for-buffer-overflow-in-qedi_set_path.patch | 45 ++ ...-flush-offload-work-if-arp-not-resol.patch | 97 ++++ ...-issue-with-adapter-s-stopping-state.patch | 91 ++++ ...xx-fix-warning-after-fc-target-reset.patch | 108 ++++ ...robe-missing-deallocate-of-device-mi.patch | 47 ++ ...back-fix-read-with-data-and-sensebyt.patch | 105 ++++ ...-fix-a-use-after-free-in-tcmu_check_.patch | 48 ++ ...-userspace-must-not-complete-queued-.patch | 337 ++++++++++++ ...sg-fix-runtime-pm-imbalance-on-error.patch | 41 ++ ...pdate-urgent-bkops-level-when-toggli.patch | 41 ++ ...om-fix-scheduling-while-atomic-issue.patch | 54 ++ ...y-tcm-about-the-maximum-sg-entries-s.patch | 47 ++ ...-timestamping-strncpy-needs-to-prese.patch | 68 +++ ...ys-fix-alloc_random_pkey-to-make-it-.patch | 60 +++ ...-max-baud-limit-in-generic-8250-port.patch | 81 +++ ...1-make-sure-we-initialize-the-port.l.patch | 87 ++++ queue-5.4/series | 282 +++++++++++ ...-ngd-get-drvdata-from-correct-device.patch | 50 ++ ...terrupt-support-for-ssi-busif-buffer.patch | 281 ++++++++++ ...don-t-init-debugfs-on-device-registr.patch | 40 ++ ...-try-to-free-page-table-pages-if-cto.patch | 41 ++ ...ix-mapping-refcnt-leak-when-put-attr.patch | 48 ++ ...ix-mapping-refcnt-leak-when-register.patch | 48 ++ ...fix-a-missing-check-bug-in-gb_lights.patch | 38 ++ ...12-fix-multiline-derefernce-warnings.patch | 80 +++ ...add-missing-case-while-setting-fb_vi.patch | 36 ++ ...-increase-the-size-of-wid_list-array.patch | 51 ++ ...ti-soc-thermal-avoid-dereferencing-e.patch | 57 +++ ...x-bpf_task_fd_query-for-kprobes-and-.patch | 57 +++ ...x-data-abort-due-to-race-in-hvc_open.patch | 81 +++ ...y-n_gsm-fix-bogus-i-in-gsm_data_kick.patch | 53 ++ queue-5.4/tty-n_gsm-fix-sof-skipping.patch | 58 +++ ...king-up-upper-tty-layer-when-room-av.patch | 90 ++++ ...move-gadget-resume-after-the-core-is.patch | 51 ++ ...et-properly-handle-clearfeature-halt.patch | 91 ++++ ...properly-handle-failed-kick_transfer.patch | 68 +++ ...m-set-pm-runtime-as-active-on-resume.patch | 51 ++ ...sync-interrupt-before-unbind-the-udc.patch | 137 +++++ ...ssue-with-config_ep_by_speed-functio.patch | 226 +++++++++ ...otential-double-free-in-m66592_probe.patch | 38 ++ ...xx_udc-don-t-dereference-ep-pointer-.patch | 71 +++ ...3c2410_udc-remove-pointless-null-che.patch | 57 +++ ...c-add-error-handling-in-ehci_mxc_drv.patch | 39 ++ ...-platform-add-a-quirk-to-avoid-stuck.patch | 237 +++++++++ ...tform-fix-a-warning-when-hibernating.patch | 102 ++++ ...ix-error-return-code-in-ohci_hcd_sm5.patch | 43 ++ ...t-set-pm-runtime-as-active-on-resume.patch | 56 ++ .../usblp-poison-urbs-upon-disconnect.patch | 50 ++ ...ference-count-leak-in-add_mdev_suppo.patch | 41 ++ ...-fix-memory-leaks-in-alloc_perm_bits.patch | 74 +++ queue-5.4/vfio-pci-mask-cap-zero.patch | 50 ++ ...e-blocking-async-replies-in-separate.patch | 205 ++++++++ ...no-need-to-ping-manually-before-sett.patch | 49 ++ ...c-deadline-timer-detection-message-v.patch | 47 ++ ...rious-entries-unset-in-system_vector.patch | 52 ++ ...sable-various-profiling-and-sanitizi.patch | 62 +++ .../xdp-fix-xsk_generic_xmit-errno.patch | 45 ++ ...sible-memory-leak-in-yam_init_driver.patch | 36 ++ 283 files changed, 21786 insertions(+) create mode 100644 queue-5.4/afs-afs_write_end-should-change-i_size-under-the-rig.patch create mode 100644 queue-5.4/afs-always-include-dir-in-bulk-status-fetch-from-afs.patch create mode 100644 queue-5.4/afs-fix-eof-corruption.patch create mode 100644 queue-5.4/afs-fix-memory-leak-in-afs_put_sysnames.patch create mode 100644 queue-5.4/afs-fix-non-setting-of-mtime-when-writing-into-mmap.patch create mode 100644 queue-5.4/afs-fix-the-mapping-of-the-uaeoverflow-abort-code.patch create mode 100644 queue-5.4/afs-set-error-flag-rather-than-return-error-from-fil.patch create mode 100644 queue-5.4/alsa-firewire-lib-fix-invalid-assignment-to-union-da.patch create mode 100644 queue-5.4/alsa-hda-realtek-introduce-polarity-for-micmute-led-.patch create mode 100644 queue-5.4/alsa-isa-wavefront-prevent-out-of-bounds-write-in-io.patch create mode 100644 queue-5.4/alsa-usb-audio-add-duplex-sound-support-for-usb-devi.patch create mode 100644 queue-5.4/alsa-usb-audio-fix-racy-list-management-in-output-qu.patch create mode 100644 queue-5.4/alsa-usb-audio-improve-frames-size-computation.patch create mode 100644 queue-5.4/apparmor-check-put-label-on-apparmor_sk_clone_securi.patch create mode 100644 queue-5.4/apparmor-fix-introspection-of-of-task-mode-for-uncon.patch create mode 100644 queue-5.4/apparmor-fix-nnp-subset-test-for-unconfined.patch create mode 100644 queue-5.4/arm-dts-meson-switch-existing-boards-with-rgmii-phy-.patch create mode 100644 queue-5.4/arm-dts-renesas-fix-iommu-device-node-names.patch create mode 100644 queue-5.4/arm-dts-stm32-add-missing-ethernet-phy-reset-on-av96.patch create mode 100644 queue-5.4/arm-dts-sun8i-h2-plus-bananapi-m2-zero-fix-led-polar.patch create mode 100644 queue-5.4/arm-integrator-add-some-kconfig-selections.patch create mode 100644 queue-5.4/arm64-dts-armada-3720-turris-mox-fix-sfp-binding.patch create mode 100644 queue-5.4/arm64-dts-armada-3720-turris-mox-forbid-sdr104-on-sd.patch create mode 100644 queue-5.4/arm64-dts-fvp-fix-gic-child-nodes.patch create mode 100644 queue-5.4/arm64-dts-fvp-juno-fix-node-address-fields.patch create mode 100644 queue-5.4/arm64-dts-juno-fix-gic-child-nodes.patch create mode 100644 queue-5.4/arm64-dts-meson-fixup-scp-sram-nodes.patch create mode 100644 queue-5.4/arm64-dts-msm8996-fix-csi-irq-types.patch create mode 100644 queue-5.4/arm64-dts-mt8173-fix-unit-name-warnings.patch create mode 100644 queue-5.4/arm64-dts-qcom-fix-pm8150-gpio-interrupts.patch create mode 100644 queue-5.4/arm64-dts-qcom-msm8916-remove-unit-name-for-thermal-.patch create mode 100644 queue-5.4/arm64-hw_breakpoint-don-t-invoke-overflow-handler-on.patch create mode 100644 queue-5.4/arm64-tegra-fix-ethernet-phy-mode-for-jetson-xavier.patch create mode 100644 queue-5.4/arm64-tegra-fix-flag-for-64-bit-resources-in-ranges-.patch create mode 100644 queue-5.4/asoc-core-only-convert-non-dpcm-link-to-dpcm-link.patch create mode 100644 queue-5.4/asoc-davinci-mcasp-fix-dma_chan-refcnt-leak-when-get.patch create mode 100644 queue-5.4/asoc-fix-incomplete-error-handling-in-img_i2s_in_pro.patch create mode 100644 queue-5.4/asoc-fsl_asrc_dma-fix-dma_chan-leak-when-config-dma-.patch create mode 100644 queue-5.4/asoc-fsl_esai-disable-exception-interrupt-before-sch.patch create mode 100644 queue-5.4/asoc-intel-bytcr_rt5640-add-quirk-for-toshiba-encore.patch create mode 100644 queue-5.4/asoc-intel-bytcr_rt5640-add-quirk-for-toshiba-encore.patch-14146 create mode 100644 queue-5.4/asoc-max98373-reorder-max98373_reset-in-resume.patch create mode 100644 queue-5.4/asoc-meson-add-missing-free_irq-in-error-path.patch create mode 100644 queue-5.4/asoc-qcom-q6asm-dai-kcfi-fix.patch create mode 100644 queue-5.4/asoc-rt5645-add-platform-data-for-asus-t101ha.patch create mode 100644 queue-5.4/asoc-sof-core-fix-error-return-code-in-sof_probe_con.patch create mode 100644 queue-5.4/asoc-sof-do-nothing-when-dsp-pm-callbacks-are-not-se.patch create mode 100644 queue-5.4/asoc-sof-imx8-fix-randbuild-error.patch create mode 100644 queue-5.4/asoc-sof-nocodec-conditionally-set-dpcm_capture-dpcm.patch create mode 100644 queue-5.4/asoc-tegra-tegra_wm8903-support-nvidia-headset-prope.patch create mode 100644 queue-5.4/asoc-ti-omap-mcbsp-fix-an-error-handling-path-in-aso.patch create mode 100644 queue-5.4/asoc-ux500-mop500-fix-some-refcounted-resources-issu.patch create mode 100644 queue-5.4/backlight-lp855x-ensure-regulators-are-disabled-on-p.patch create mode 100644 queue-5.4/bcache-fix-potential-deadlock-problem-in-btree_gc_co.patch create mode 100644 queue-5.4/blktrace-fix-endianness-for-blk_log_remap.patch create mode 100644 queue-5.4/blktrace-fix-endianness-in-get_pdu_int.patch create mode 100644 queue-5.4/blktrace-use-errno-instead-of-bi_status.patch create mode 100644 queue-5.4/block-fix-use-after-free-in-blkdev_get.patch create mode 100644 queue-5.4/bnxt_en-return-from-timer-if-interface-is-not-in-ope.patch create mode 100644 queue-5.4/bpf-fix-memlock-accounting-for-sock_hash.patch create mode 100644 queue-5.4/bpf-sockhash-fix-memory-leak-when-unlinking-sockets-.patch create mode 100644 queue-5.4/bpf-sockhash-synchronize-delete-from-bucket-list-on-.patch create mode 100644 queue-5.4/bpf-sockmap-fix-kernel-panic-at-__tcp_bpf_recvmsg.patch create mode 100644 queue-5.4/ceph-don-t-return-estale-if-there-s-still-an-open-fi.patch create mode 100644 queue-5.4/cifs-set-up-next-dfs-target-before-generic_ip_connec.patch create mode 100644 queue-5.4/clk-ast2600-fix-ahb-clock-divider-for-a1.patch create mode 100644 queue-5.4/clk-bcm2835-fix-return-type-of-bcm2835_register_gate.patch create mode 100644 queue-5.4/clk-clk-flexgen-fix-clock-critical-handling.patch create mode 100644 queue-5.4/clk-meson-meson8b-don-t-rely-on-u-boot-to-init-all-g.patch create mode 100644 queue-5.4/clk-meson-meson8b-fix-the-first-parent-of-vid_pll_in.patch create mode 100644 queue-5.4/clk-meson-meson8b-fix-the-polarity-of-the-reset_n-li.patch create mode 100644 queue-5.4/clk-meson-meson8b-fix-the-vclk_div-1-2-4-6-12-_en-ga.patch create mode 100644 queue-5.4/clk-qcom-msm8916-fix-the-address-location-of-pll-con.patch create mode 100644 queue-5.4/clk-renesas-cpg-mssr-fix-stbcr-suspend-resume-handli.patch create mode 100644 queue-5.4/clk-samsung-exynos5433-add-ignore_unused-flag-to-scl.patch create mode 100644 queue-5.4/clk-samsung-mark-top-isp-and-cam-clocks-on-exynos542.patch create mode 100644 queue-5.4/clk-sprd-return-correct-type-of-value-for-_sprd_pll_.patch create mode 100644 queue-5.4/clk-sunxi-fix-incorrect-usage-of-round_down.patch create mode 100644 queue-5.4/clk-ti-composite-fix-memory-leak.patch create mode 100644 queue-5.4/clk-zynqmp-fix-memory-leak-in-zynqmp_register_clocks.patch create mode 100644 queue-5.4/coresight-tmc-fix-tmc-mode-read-in-tmc_read_prepare_.patch create mode 100644 queue-5.4/crypto-omap-sham-add-proper-load-balancing-support-f.patch create mode 100644 queue-5.4/dev-mem-revoke-mappings-when-a-driver-claims-the-reg.patch create mode 100644 queue-5.4/dlm-remove-bug-before-panic.patch create mode 100644 queue-5.4/dm-mpath-switch-paths-in-dm_blk_ioctl-code-path.patch create mode 100644 queue-5.4/dm-zoned-return-null-if-dmz_get_zone_for_reclaim-fai.patch create mode 100644 queue-5.4/drivers-base-fix-null-pointer-exception-in-__platfor.patch create mode 100644 queue-5.4/drivers-perf-hisi-fix-wrong-value-for-all-counters-e.patch create mode 100644 queue-5.4/drivers-phy-sr-usb-do-not-use-internal-fsm-for-usb2-.patch create mode 100644 queue-5.4/drm-amd-display-revalidate-bandwidth-before-commitin.patch create mode 100644 queue-5.4/drm-encoder_slave-fix-refcouting-error-for-modules.patch create mode 100644 queue-5.4/drm-msm-mdp5-fix-mdp5_init-error-path-for-failed-mdp.patch create mode 100644 queue-5.4/drm-nouveau-disp-gm200-fix-nv_pdisp_sor_hdmi2_ctrl-n.patch create mode 100644 queue-5.4/drm-sun4i-hdmi-ddc-clk-fix-size-of-m-divider.patch create mode 100644 queue-5.4/ext4-stop-overwrite-the-errcode-in-ext4_setup_super.patch create mode 100644 queue-5.4/extcon-adc-jack-fix-an-error-handling-path-in-adc_ja.patch create mode 100644 queue-5.4/f2fs-don-t-return-vmalloc-memory-from-f2fs_kmalloc.patch create mode 100644 queue-5.4/f2fs-handle-readonly-filesystem-in-f2fs_ioc_shutdown.patch create mode 100644 queue-5.4/f2fs-report-delalloc-reserve-as-non-free-in-statfs-f.patch create mode 100644 queue-5.4/firmware-imx-scu-fix-possible-memory-leak-in-imx_scu.patch create mode 100644 queue-5.4/firmware-qcom_scm-fix-bogous-abuse-of-dma-direct-int.patch create mode 100644 queue-5.4/fpga-dfl-afu-corrected-error-handling-levels.patch create mode 100644 queue-5.4/fuse-copy_file_range-should-truncate-cache.patch create mode 100644 queue-5.4/fuse-fix-copy_file_range-cache-issues.patch create mode 100644 queue-5.4/geneve-change-from-tx_error-to-tx_dropped-on-missing.patch create mode 100644 queue-5.4/gfs2-allow-lock_nolock-mount-to-specify-jid-x.patch create mode 100644 queue-5.4/gfs2-fix-use-after-free-on-transaction-ail-lists.patch create mode 100644 queue-5.4/gpio-dwapb-append-module_alias-for-platform-driver.patch create mode 100644 queue-5.4/gpio-dwapb-call-acpi_gpiochip_free_interrupts-on-gpi.patch create mode 100644 queue-5.4/gpio-pca953x-fix-handling-of-automatic-address-incre.patch create mode 100644 queue-5.4/habanalabs-increase-timeout-during-reset.patch create mode 100644 queue-5.4/hid-add-quirks-for-trust-panora-graphic-tablet.patch create mode 100644 queue-5.4/hid-intel-ish-hid-avoid-bogus-uninitialized-variable.patch create mode 100644 queue-5.4/i2c-icy-fix-build-with-config_amiga_pcmcia-n.patch create mode 100644 queue-5.4/i2c-piix4-detect-secondary-smbus-controller-on-amd-a.patch create mode 100644 queue-5.4/i2c-pxa-clear-all-master-action-bits-in-i2c_pxa_stop.patch create mode 100644 queue-5.4/i2c-pxa-fix-i2c_pxa_scream_blue_murder-debug-output.patch create mode 100644 queue-5.4/iavf-fix-speed-reporting-over-virtchnl.patch create mode 100644 queue-5.4/ib-cma-fix-ports-memory-leak-in-cma_configfs.patch create mode 100644 queue-5.4/ib-mlx5-fix-devx-support-for-mlx5_cmd_op_init2init_q.patch create mode 100644 queue-5.4/iio-bmp280-fix-compensation-of-humidity.patch create mode 100644 queue-5.4/iio-pressure-bmp280-tolerate-irq-before-registering.patch create mode 100644 queue-5.4/include-linux-bitops.h-avoid-clang-shift-count-overf.patch create mode 100644 queue-5.4/input-edt-ft5x06-fix-get_default-register-write-acce.patch create mode 100644 queue-5.4/input-i8042-remove-special-powerpc-handling.patch create mode 100644 queue-5.4/input-mms114-add-extra-compatible-for-mms345l.patch create mode 100644 queue-5.4/ipmi-use-vzalloc-instead-of-kmalloc-for-user-creatio.patch create mode 100644 queue-5.4/kvm-ppc-book3s-fix-some-rcu-list-locks.patch create mode 100644 queue-5.4/kvm-ppc-book3s-hv-ignore-kmemleak-false-positives.patch create mode 100644 queue-5.4/lib-zlib-remove-outdated-and-incorrect-pre-increment.patch create mode 100644 queue-5.4/libata-use-per-port-sync-for-detach.patch create mode 100644 queue-5.4/libbpf-handle-gcc-noreturn-turned-volatile-quirk.patch create mode 100644 queue-5.4/m68k-pci-fix-a-memory-leak-in-an-error-handling-path.patch create mode 100644 queue-5.4/mailbox-zynqmp-ipi-fix-null-vs-is_err-check-in-zynqm.patch create mode 100644 queue-5.4/mfd-stmfx-disable-irq-in-suspend-to-avoid-spurious-i.patch create mode 100644 queue-5.4/mfd-stmfx-fix-stmfx_irq_init-error-path.patch create mode 100644 queue-5.4/mfd-stmfx-reset-chip-on-resume-as-supply-was-disable.patch create mode 100644 queue-5.4/mfd-wm8994-fix-driver-operation-if-loaded-as-modules.patch create mode 100644 queue-5.4/misc-fastrpc-fix-an-incomplete-memory-release-in-fas.patch create mode 100644 queue-5.4/misc-fastrpc-fix-potential-fastrpc_invoke_ctx-leak.patch create mode 100644 queue-5.4/misc-xilinx-sdfec-improve-get_user_pages_fast-error-.patch create mode 100644 queue-5.4/mksysmap-fix-the-mismatch-of-.l-symbols-in-system.ma.patch create mode 100644 queue-5.4/mvpp2-remove-module-bugfix.patch create mode 100644 queue-5.4/net-dsa-lantiq_gswip-fix-and-improve-the-unsupported.patch create mode 100644 queue-5.4/net-filter-permit-reading-net-in-load_bytes_relative.patch create mode 100644 queue-5.4/net-marvell-fix-of_mdio-config-check.patch create mode 100644 queue-5.4/net-sunrpc-fix-off-by-one-issues-in-rpc_ntop6.patch create mode 100644 queue-5.4/nfs-set-invalid-blocks-after-nfsv4-writes.patch create mode 100644 queue-5.4/nfsd-fix-svc_xprt-refcnt-leak-when-setup-callback-cl.patch create mode 100644 queue-5.4/nfsd-safer-handling-of-corrupted-c_type.patch create mode 100644 queue-5.4/nfsd4-make-drc_slab-global-not-per-net.patch create mode 100644 queue-5.4/nfsv4.1-fix-rpc_call_done-assignment-for-bind_conn_t.patch create mode 100644 queue-5.4/ntb-fix-the-default-port-and-peer-numbers-for-legacy.patch create mode 100644 queue-5.4/ntb-ntb_pingpong-choose-doorbells-based-on-port-numb.patch create mode 100644 queue-5.4/ntb-ntb_test-fix-bug-when-counting-remote-files.patch create mode 100644 queue-5.4/ntb-ntb_tool-reading-the-link-file-should-not-end-in.patch create mode 100644 queue-5.4/ntb-perf-don-t-require-one-more-memory-window-than-n.patch create mode 100644 queue-5.4/ntb-perf-fix-race-condition-when-run-with-ntb_test.patch create mode 100644 queue-5.4/ntb-perf-fix-support-for-hardware-that-doesn-t-have-.patch create mode 100644 queue-5.4/ntb-revert-the-change-to-use-the-ntb-device-dev-for-.patch create mode 100644 queue-5.4/ntb_perf-pass-correct-struct-device-to-dma_alloc_coh.patch create mode 100644 queue-5.4/ntb_tool-pass-correct-struct-device-to-dma_alloc_coh.patch create mode 100644 queue-5.4/nvme-pci-use-simple-suspend-when-a-hmb-is-enabled.patch create mode 100644 queue-5.4/of-fix-a-refcounting-bug-in-__of_attach_node_sysfs.patch create mode 100644 queue-5.4/openrisc-fix-issue-with-argument-clobbering-for-clon.patch create mode 100644 queue-5.4/ovl-verify-permissions-in-ovl_path_open.patch create mode 100644 queue-5.4/pci-aardvark-don-t-blindly-enable-aspm-l0s-and-don-t.patch create mode 100644 queue-5.4/pci-allow-pci_resize_resource-for-devices-on-root-bu.patch create mode 100644 queue-5.4/pci-amlogic-meson-don-t-use-fast_link_mode-to-set-up.patch create mode 100644 queue-5.4/pci-aspm-allow-aspm-on-links-to-pcie-to-pci-pci-x-br.patch create mode 100644 queue-5.4/pci-dwc-fix-inner-msi-irq-domain-registration.patch create mode 100644 queue-5.4/pci-fix-pci_register_host_bridge-device_register-err.patch create mode 100644 queue-5.4/pci-pci-bridge-emul-fix-pcie-bit-conflicts.patch create mode 100644 queue-5.4/pci-pm-assume-ports-without-dll-link-active-train-li.patch create mode 100644 queue-5.4/pci-ptm-inherit-switch-downstream-port-ptm-settings-.patch create mode 100644 queue-5.4/pci-rcar-fix-incorrect-programming-of-ob-windows.patch create mode 100644 queue-5.4/pci-v3-semi-fix-a-memory-leak-in-v3_pci_probe-error-.patch create mode 100644 queue-5.4/pci-vmd-filter-resource-type-bits-from-shadow-regist.patch create mode 100644 queue-5.4/perf-report-fix-null-pointer-dereference-in-hists__f.patch create mode 100644 queue-5.4/perf-stat-fix-null-pointer-dereference.patch create mode 100644 queue-5.4/pinctrl-freescale-imx-fix-an-error-handling-path-in-.patch create mode 100644 queue-5.4/pinctrl-freescale-imx-use-devm_of_iomap-to-avoid-a-r.patch create mode 100644 queue-5.4/pinctrl-imxl-fix-an-error-handling-path-in-imx1_pinc.patch create mode 100644 queue-5.4/pinctrl-ocelot-fix-gpio-interrupt-decoding-on-jaguar.patch create mode 100644 queue-5.4/pinctrl-rockchip-fix-memleak-in-rockchip_dt_node_to_.patch create mode 100644 queue-5.4/pinctrl-rza1-fix-wrong-array-assignment-of-rza1l_swi.patch create mode 100644 queue-5.4/power-supply-bq24257_charger-replace-depends-on-regm.patch create mode 100644 queue-5.4/power-supply-lp8788-fix-an-error-handling-path-in-lp.patch create mode 100644 queue-5.4/power-supply-smb347-charger-irqstat_d-is-volatile.patch create mode 100644 queue-5.4/powerpc-32s-don-t-warn-when-mapping-ro-data-rox.patch create mode 100644 queue-5.4/powerpc-4xx-don-t-unmap-null-mbase.patch create mode 100644 queue-5.4/powerpc-64-don-t-initialise-init_task-thread.regs.patch create mode 100644 queue-5.4/powerpc-64s-exception-fix-machine-check-no-loss-idle.patch create mode 100644 queue-5.4/powerpc-64s-pgtable-fix-an-undefined-behaviour.patch create mode 100644 queue-5.4/powerpc-crashkernel-take-mem-option-into-account.patch create mode 100644 queue-5.4/powerpc-fix-kernel-crash-in-show_instructions-w-debu.patch create mode 100644 queue-5.4/powerpc-kasan-fix-stack-overflow-by-increasing-threa.patch create mode 100644 queue-5.4/powerpc-perf-hv-24x7-fix-inconsistent-output-values-.patch create mode 100644 queue-5.4/powerpc-ps3-fix-kexec-shutdown-hang.patch create mode 100644 queue-5.4/powerpc-pseries-ras-fix-fwnmi_valid-off-by-one.patch create mode 100644 queue-5.4/powerpc-ptdump-add-_page_coherent-flag.patch create mode 100644 queue-5.4/ps3disk-use-the-default-segment-boundary.patch create mode 100644 queue-5.4/pwm-img-call-pm_runtime_put-in-pm_runtime_get_sync-f.patch create mode 100644 queue-5.4/rdma-core-fix-several-reference-count-leaks.patch create mode 100644 queue-5.4/rdma-hns-bugfix-for-querying-qkey.patch create mode 100644 queue-5.4/rdma-hns-fix-cmdq-parameter-of-querying-pf-timer-res.patch create mode 100644 queue-5.4/rdma-iw_cxgb4-cleanup-device-debugfs-entries-on-uld-.patch create mode 100644 queue-5.4/rdma-mlx5-add-init2init-as-a-modify-command.patch create mode 100644 queue-5.4/rdma-mlx5-fix-udata-response-upon-srq-creation.patch create mode 100644 queue-5.4/remoteproc-fix-idr-initialisation-in-rproc_alloc.patch create mode 100644 queue-5.4/remoteproc-qcom_q6v5_mss-map-unmap-mpss-segments-bef.patch create mode 100644 queue-5.4/rtc-mc13xxx-fix-a-double-unlock-issue.patch create mode 100644 queue-5.4/rtc-rv3028-add-missed-check-for-devm_regmap_init_i2c.patch create mode 100644 queue-5.4/rxrpc-adjust-proc-net-rxrpc-calls-to-display-call-de.patch create mode 100644 queue-5.4/s390-qdio-put-thinint-indicator-after-early-error.patch create mode 100644 queue-5.4/scripts-headers_install-exit-with-error-on-config-le.patch create mode 100644 queue-5.4/scsi-acornscsi-fix-an-error-handling-path-in-acornsc.patch create mode 100644 queue-5.4/scsi-core-free-sgtables-in-case-command-setup-fails.patch create mode 100644 queue-5.4/scsi-cxgb3i-fix-some-leaks-in-init_act_open.patch create mode 100644 queue-5.4/scsi-hisi_sas-do-not-reset-phy-timer-to-wait-for-str.patch create mode 100644 queue-5.4/scsi-ibmvscsi-don-t-send-host-info-in-adapter-info-m.patch create mode 100644 queue-5.4/scsi-iscsi-fix-reference-count-leak-in-iscsi_boot_cr.patch create mode 100644 queue-5.4/scsi-lpfc-fix-lpfc_nodelist-leak-when-processing-uns.patch create mode 100644 queue-5.4/scsi-mpt3sas-fix-double-free-warnings.patch create mode 100644 queue-5.4/scsi-qedf-fix-crash-when-mfw-calls-for-protocol-stat.patch create mode 100644 queue-5.4/scsi-qedi-check-for-buffer-overflow-in-qedi_set_path.patch create mode 100644 queue-5.4/scsi-qedi-do-not-flush-offload-work-if-arp-not-resol.patch create mode 100644 queue-5.4/scsi-qla2xxx-fix-issue-with-adapter-s-stopping-state.patch create mode 100644 queue-5.4/scsi-qla2xxx-fix-warning-after-fc-target-reset.patch create mode 100644 queue-5.4/scsi-sr-fix-sr_probe-missing-deallocate-of-device-mi.patch create mode 100644 queue-5.4/scsi-target-loopback-fix-read-with-data-and-sensebyt.patch create mode 100644 queue-5.4/scsi-target-tcmu-fix-a-use-after-free-in-tcmu_check_.patch create mode 100644 queue-5.4/scsi-target-tcmu-userspace-must-not-complete-queued-.patch create mode 100644 queue-5.4/scsi-ufs-bsg-fix-runtime-pm-imbalance-on-error.patch create mode 100644 queue-5.4/scsi-ufs-don-t-update-urgent-bkops-level-when-toggli.patch create mode 100644 queue-5.4/scsi-ufs-qcom-fix-scheduling-while-atomic-issue.patch create mode 100644 queue-5.4/scsi-vhost-notify-tcm-about-the-maximum-sg-entries-s.patch create mode 100644 queue-5.4/selftests-net-in-timestamping-strncpy-needs-to-prese.patch create mode 100644 queue-5.4/selftests-vm-pkeys-fix-alloc_random_pkey-to-make-it-.patch create mode 100644 queue-5.4/serial-8250-fix-max-baud-limit-in-generic-8250-port.patch create mode 100644 queue-5.4/serial-amba-pl011-make-sure-we-initialize-the-port.l.patch create mode 100644 queue-5.4/series create mode 100644 queue-5.4/slimbus-ngd-get-drvdata-from-correct-device.patch create mode 100644 queue-5.4/soc-rsnd-add-interrupt-support-for-ssi-busif-buffer.patch create mode 100644 queue-5.4/soundwire-slave-don-t-init-debugfs-on-device-registr.patch create mode 100644 queue-5.4/sparc32-mm-don-t-try-to-free-page-table-pages-if-cto.patch create mode 100644 queue-5.4/staging-gasket-fix-mapping-refcnt-leak-when-put-attr.patch create mode 100644 queue-5.4/staging-gasket-fix-mapping-refcnt-leak-when-register.patch create mode 100644 queue-5.4/staging-greybus-fix-a-missing-check-bug-in-gb_lights.patch create mode 100644 queue-5.4/staging-rtl8712-fix-multiline-derefernce-warnings.patch create mode 100644 queue-5.4/staging-sm750fb-add-missing-case-while-setting-fb_vi.patch create mode 100644 queue-5.4/staging-wilc1000-increase-the-size-of-wid_list-array.patch create mode 100644 queue-5.4/thermal-drivers-ti-soc-thermal-avoid-dereferencing-e.patch create mode 100644 queue-5.4/tracing-probe-fix-bpf_task_fd_query-for-kprobes-and-.patch create mode 100644 queue-5.4/tty-hvc-fix-data-abort-due-to-race-in-hvc_open.patch create mode 100644 queue-5.4/tty-n_gsm-fix-bogus-i-in-gsm_data_kick.patch create mode 100644 queue-5.4/tty-n_gsm-fix-sof-skipping.patch create mode 100644 queue-5.4/tty-n_gsm-fix-waking-up-upper-tty-layer-when-room-av.patch create mode 100644 queue-5.4/usb-dwc2-gadget-move-gadget-resume-after-the-core-is.patch create mode 100644 queue-5.4/usb-dwc3-gadget-properly-handle-clearfeature-halt.patch create mode 100644 queue-5.4/usb-dwc3-gadget-properly-handle-failed-kick_transfer.patch create mode 100644 queue-5.4/usb-ehci-platform-set-pm-runtime-as-active-on-resume.patch create mode 100644 queue-5.4/usb-gadget-core-sync-interrupt-before-unbind-the-udc.patch create mode 100644 queue-5.4/usb-gadget-fix-issue-with-config_ep_by_speed-functio.patch create mode 100644 queue-5.4/usb-gadget-fix-potential-double-free-in-m66592_probe.patch create mode 100644 queue-5.4/usb-gadget-lpc32xx_udc-don-t-dereference-ep-pointer-.patch create mode 100644 queue-5.4/usb-gadget-udc-s3c2410_udc-remove-pointless-null-che.patch create mode 100644 queue-5.4/usb-host-ehci-mxc-add-error-handling-in-ehci_mxc_drv.patch create mode 100644 queue-5.4/usb-host-ehci-platform-add-a-quirk-to-avoid-stuck.patch create mode 100644 queue-5.4/usb-ohci-platform-fix-a-warning-when-hibernating.patch create mode 100644 queue-5.4/usb-ohci-sm501-fix-error-return-code-in-ohci_hcd_sm5.patch create mode 100644 queue-5.4/usb-xhci-plat-set-pm-runtime-as-active-on-resume.patch create mode 100644 queue-5.4/usblp-poison-urbs-upon-disconnect.patch create mode 100644 queue-5.4/vfio-mdev-fix-reference-count-leak-in-add_mdev_suppo.patch create mode 100644 queue-5.4/vfio-pci-fix-memory-leaks-in-alloc_perm_bits.patch create mode 100644 queue-5.4/vfio-pci-mask-cap-zero.patch create mode 100644 queue-5.4/virtiofs-schedule-blocking-async-replies-in-separate.patch create mode 100644 queue-5.4/watchdog-da9062-no-need-to-ping-manually-before-sett.patch create mode 100644 queue-5.4/x86-apic-make-tsc-deadline-timer-detection-message-v.patch create mode 100644 queue-5.4/x86-idt-keep-spurious-entries-unset-in-system_vector.patch create mode 100644 queue-5.4/x86-purgatory-disable-various-profiling-and-sanitizi.patch create mode 100644 queue-5.4/xdp-fix-xsk_generic_xmit-errno.patch create mode 100644 queue-5.4/yam-fix-possible-memory-leak-in-yam_init_driver.patch diff --git a/queue-5.4/afs-afs_write_end-should-change-i_size-under-the-rig.patch b/queue-5.4/afs-afs_write_end-should-change-i_size-under-the-rig.patch new file mode 100644 index 00000000000..ae20e960601 --- /dev/null +++ b/queue-5.4/afs-afs_write_end-should-change-i_size-under-the-rig.patch @@ -0,0 +1,44 @@ +From 7d0a7fb2ab7e6efedc921108d24c1a21b435a9c9 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Signed-off-by: Sasha Levin +--- + 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.4/afs-always-include-dir-in-bulk-status-fetch-from-afs.patch b/queue-5.4/afs-always-include-dir-in-bulk-status-fetch-from-afs.patch new file mode 100644 index 00000000000..6c6733f2b73 --- /dev/null +++ b/queue-5.4/afs-always-include-dir-in-bulk-status-fetch-from-afs.patch @@ -0,0 +1,59 @@ +From c1c1c4ff2ca92c3cc947d215258b2dccd199d7e0 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Suggested-by: Jeffrey Altman +Signed-off-by: David Howells +Signed-off-by: Sasha Levin +--- + 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.4/afs-fix-eof-corruption.patch b/queue-5.4/afs-fix-eof-corruption.patch new file mode 100644 index 00000000000..a085b2448e7 --- /dev/null +++ b/queue-5.4/afs-fix-eof-corruption.patch @@ -0,0 +1,103 @@ +From 1a81079e2a3f11c35cdecf146112429a4e601560 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 13 Jun 2020 00:03:48 +0100 +Subject: afs: Fix EOF corruption + +From: David Howells + +[ 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 +Signed-off-by: Sasha Levin +--- + 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 46d2d7cb461da..a74e8e209454b 100644 +--- a/fs/afs/inode.c ++++ b/fs/afs/inode.c +@@ -171,6 +171,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)); + +@@ -226,6 +227,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 +@@ -233,11 +235,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.4/afs-fix-memory-leak-in-afs_put_sysnames.patch b/queue-5.4/afs-fix-memory-leak-in-afs_put_sysnames.patch new file mode 100644 index 00000000000..3328bf6dc35 --- /dev/null +++ b/queue-5.4/afs-fix-memory-leak-in-afs_put_sysnames.patch @@ -0,0 +1,36 @@ +From 121584d40690831de403cc368343d7f02faaa53a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 2 Jun 2020 09:30:45 +0800 +Subject: afs: Fix memory leak in afs_put_sysnames() + +From: Zhihao Cheng + +[ 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 +Signed-off-by: David Howells +Signed-off-by: Sasha Levin +--- + fs/afs/proc.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/fs/afs/proc.c b/fs/afs/proc.c +index fba2ec3a3a9c9..106b27011f6d5 100644 +--- a/fs/afs/proc.c ++++ b/fs/afs/proc.c +@@ -562,6 +562,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.4/afs-fix-non-setting-of-mtime-when-writing-into-mmap.patch b/queue-5.4/afs-fix-non-setting-of-mtime-when-writing-into-mmap.patch new file mode 100644 index 00000000000..60ba1a03a5a --- /dev/null +++ b/queue-5.4/afs-fix-non-setting-of-mtime-when-writing-into-mmap.patch @@ -0,0 +1,39 @@ +From 7efb112fe774b622ff37d6c4e37460757f5b7577 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 12 Jun 2020 00:15:13 +0100 +Subject: afs: Fix non-setting of mtime when writing into mmap + +From: David Howells + +[ 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 +Signed-off-by: Sasha Levin +--- + 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.4/afs-fix-the-mapping-of-the-uaeoverflow-abort-code.patch b/queue-5.4/afs-fix-the-mapping-of-the-uaeoverflow-abort-code.patch new file mode 100644 index 00000000000..b0a299ff123 --- /dev/null +++ b/queue-5.4/afs-fix-the-mapping-of-the-uaeoverflow-abort-code.patch @@ -0,0 +1,39 @@ +From 837cd494979cde6603c5f0f62aa1e90b16389eda Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 14 Jun 2020 22:12:05 +0100 +Subject: afs: Fix the mapping of the UAEOVERFLOW abort code + +From: David Howells + +[ 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 +Signed-off-by: Sasha Levin +--- + 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.4/afs-set-error-flag-rather-than-return-error-from-fil.patch b/queue-5.4/afs-set-error-flag-rather-than-return-error-from-fil.patch new file mode 100644 index 00000000000..07cace2cff9 --- /dev/null +++ b/queue-5.4/afs-set-error-flag-rather-than-return-error-from-fil.patch @@ -0,0 +1,479 @@ +From 8d6f154849414cda5a4603afb5b943f58a0bd160 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Signed-off-by: Sasha Levin +--- + 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 0a4fed9e706b7..5c2729fc07e52 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); + +@@ -579,12 +572,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); + +@@ -693,9 +682,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]"); +@@ -786,12 +773,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]"); +@@ -880,12 +863,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]"); +@@ -988,16 +967,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]"); +@@ -1105,9 +1080,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]"); +@@ -1285,9 +1258,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]"); +@@ -1956,9 +1927,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); + +@@ -2064,10 +2033,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; +@@ -2245,9 +2211,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++; +@@ -2328,9 +2292,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 485cc3b2aaa8a..555ad7c9afcb6 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 52aa90fb4fbd9..6adab30a83993 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 8af7f093305d8..d21cf61d86b9f 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); + +@@ -645,12 +636,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); + +@@ -803,14 +790,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); +@@ -890,10 +872,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; + } +@@ -975,12 +954,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; +@@ -1062,12 +1037,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]"); +@@ -1155,13 +1126,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; +@@ -1846,9 +1815,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) +@@ -2068,9 +2035,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.4/alsa-firewire-lib-fix-invalid-assignment-to-union-da.patch b/queue-5.4/alsa-firewire-lib-fix-invalid-assignment-to-union-da.patch new file mode 100644 index 00000000000..6ba6aab8fa2 --- /dev/null +++ b/queue-5.4/alsa-firewire-lib-fix-invalid-assignment-to-union-da.patch @@ -0,0 +1,41 @@ +From 6f3d6eb749a733c2d785e44d773e7887153afd8d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Link: https://lore.kernel.org/r/20200508043635.349339-2-o-takashi@sakamocchi.jp +Signed-off-by: Takashi Iwai +Signed-off-by: Sasha Levin +--- + 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.4/alsa-hda-realtek-introduce-polarity-for-micmute-led-.patch b/queue-5.4/alsa-hda-realtek-introduce-polarity-for-micmute-led-.patch new file mode 100644 index 00000000000..9ef8ef5a29e --- /dev/null +++ b/queue-5.4/alsa-hda-realtek-introduce-polarity-for-micmute-led-.patch @@ -0,0 +1,79 @@ +From 03470766299d1eff1fbfca07639181e61347b803 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 30 Apr 2020 16:32:51 +0800 +Subject: ALSA: hda/realtek - Introduce polarity for micmute LED GPIO + +From: Kai-Heng Feng + +[ 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 +Link: https://lore.kernel.org/r/20200430083255.5093-1-kai.heng.feng@canonical.com +Signed-off-by: Takashi Iwai +Signed-off-by: Sasha Levin +--- + 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 df5afac0b600c..459a7d61326ec 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.4/alsa-isa-wavefront-prevent-out-of-bounds-write-in-io.patch b/queue-5.4/alsa-isa-wavefront-prevent-out-of-bounds-write-in-io.patch new file mode 100644 index 00000000000..a13e8a828d9 --- /dev/null +++ b/queue-5.4/alsa-isa-wavefront-prevent-out-of-bounds-write-in-io.patch @@ -0,0 +1,49 @@ +From 368454a04d34bcbae13f2fba6b060975dfc74e33 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 1 May 2020 12:40:11 +0300 +Subject: ALSA: isa/wavefront: prevent out of bounds write in ioctl + +From: Dan Carpenter + +[ 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 +Link: https://lore.kernel.org/r/20200501094011.GA960082@mwanda +Signed-off-by: Takashi Iwai +Signed-off-by: Sasha Levin +--- + 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.4/alsa-usb-audio-add-duplex-sound-support-for-usb-devi.patch b/queue-5.4/alsa-usb-audio-add-duplex-sound-support-for-usb-devi.patch new file mode 100644 index 00000000000..14fb1471822 --- /dev/null +++ b/queue-5.4/alsa-usb-audio-add-duplex-sound-support-for-usb-devi.patch @@ -0,0 +1,297 @@ +From 46f078be01d01a6daa6e8e8e523bfeaf3b2d2c78 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +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 +Signed-off-by: Sasha Levin +--- + 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 e52d129085c0d..6c391e5fad2a7 100644 +--- a/sound/usb/pcm.c ++++ b/sound/usb/pcm.c +@@ -386,6 +386,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; +@@ -484,12 +486,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.4/alsa-usb-audio-fix-racy-list-management-in-output-qu.patch b/queue-5.4/alsa-usb-audio-fix-racy-list-management-in-output-qu.patch new file mode 100644 index 00000000000..02cec88d773 --- /dev/null +++ b/queue-5.4/alsa-usb-audio-fix-racy-list-management-in-output-qu.patch @@ -0,0 +1,51 @@ +From d0ce26b40c0c6dcefff933aed033b94ce3f24e4e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 24 Apr 2020 09:40:16 +0200 +Subject: ALSA: usb-audio: Fix racy list management in output queue + +From: Takashi Iwai + +[ 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 +Signed-off-by: Sasha Levin +--- + 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.4/alsa-usb-audio-improve-frames-size-computation.patch b/queue-5.4/alsa-usb-audio-improve-frames-size-computation.patch new file mode 100644 index 00000000000..f0c56cddaa1 --- /dev/null +++ b/queue-5.4/alsa-usb-audio-improve-frames-size-computation.patch @@ -0,0 +1,167 @@ +From 36b2d1a6b94a6d62f380a8bd2187bbb57ea8186d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 24 Apr 2020 05:24:48 +0300 +Subject: ALSA: usb-audio: Improve frames size computation + +From: Alexander Tsoy + +[ 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 +Link: https://lore.kernel.org/r/20200424022449.14972-1-alexander@tsoy.me +Signed-off-by: Takashi Iwai +Signed-off-by: Sasha Levin +--- + 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 ad8f38380aa3e..e52d129085c0d 100644 +--- a/sound/usb/pcm.c ++++ b/sound/usb/pcm.c +@@ -1575,6 +1575,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.4/apparmor-check-put-label-on-apparmor_sk_clone_securi.patch b/queue-5.4/apparmor-check-put-label-on-apparmor_sk_clone_securi.patch new file mode 100644 index 00000000000..62c2743a765 --- /dev/null +++ b/queue-5.4/apparmor-check-put-label-on-apparmor_sk_clone_securi.patch @@ -0,0 +1,194 @@ +From 24f45adac314568c29339c26a02e01c843416632 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 2 Jun 2020 18:15:16 -0300 +Subject: apparmor: check/put label on apparmor_sk_clone_security() + +From: Mauricio Faria de Oliveira + +[ 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 + #include + #include + #include + #include + + 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 + + + [ 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 +Signed-off-by: Mauricio Faria de Oliveira +Signed-off-by: John Johansen +Signed-off-by: Sasha Levin +--- + security/apparmor/lsm.c | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/security/apparmor/lsm.c b/security/apparmor/lsm.c +index ec3a928af8299..e31965dc6dd1f 100644 +--- a/security/apparmor/lsm.c ++++ b/security/apparmor/lsm.c +@@ -791,7 +791,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.4/apparmor-fix-introspection-of-of-task-mode-for-uncon.patch b/queue-5.4/apparmor-fix-introspection-of-of-task-mode-for-uncon.patch new file mode 100644 index 00000000000..bd35861dbf0 --- /dev/null +++ b/queue-5.4/apparmor-fix-introspection-of-of-task-mode-for-uncon.patch @@ -0,0 +1,63 @@ +From e23bf83278095742e95c705e8da24a339b7c2f8b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 5 Jun 2020 18:12:21 -0700 +Subject: apparmor: fix introspection of of task mode for unconfined tasks + +From: John Johansen + +[ 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 +Signed-off-by: Sasha Levin +--- + 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.4/apparmor-fix-nnp-subset-test-for-unconfined.patch b/queue-5.4/apparmor-fix-nnp-subset-test-for-unconfined.patch new file mode 100644 index 00000000000..1352cd25e33 --- /dev/null +++ b/queue-5.4/apparmor-fix-nnp-subset-test-for-unconfined.patch @@ -0,0 +1,125 @@ +From f0f9432ca6a4932bfdba83e71317022415bf96bf Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 25 Sep 2019 08:02:48 -0700 +Subject: apparmor: fix nnp subset test for unconfined + +From: John Johansen + +[ 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 +Signed-off-by: Sasha Levin +--- + 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 5dedc0173b024..1a33f490e6670 100644 +--- a/security/apparmor/domain.c ++++ b/security/apparmor/domain.c +@@ -935,7 +935,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; +@@ -1213,7 +1214,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; +@@ -1234,7 +1235,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; +@@ -1429,7 +1430,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.4/arm-dts-meson-switch-existing-boards-with-rgmii-phy-.patch b/queue-5.4/arm-dts-meson-switch-existing-boards-with-rgmii-phy-.patch new file mode 100644 index 00000000000..62a01ef9f75 --- /dev/null +++ b/queue-5.4/arm-dts-meson-switch-existing-boards-with-rgmii-phy-.patch @@ -0,0 +1,72 @@ +From 048abb09d16bddb1e4770633a2a1b4adb0029243 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Signed-off-by: Kevin Hilman +Link: https://lore.kernel.org/r/20200512215148.540322-3-martin.blumenstingl@googlemail.com +Signed-off-by: Sasha Levin +--- + 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 a24eccc354b95..10f6d601eadb2 100644 +--- a/arch/arm/boot/dts/meson8b-odroidc1.dts ++++ b/arch/arm/boot/dts/meson8b-odroidc1.dts +@@ -202,9 +202,8 @@ + pinctrl-0 = <ð_rgmii_pins>; + pinctrl-names = "default"; + +- phy-mode = "rgmii"; + phy-handle = <ð_phy>; +- amlogic,tx-delay-ns = <4>; ++ phy-mode = "rgmii-id"; + + nvmem-cells = <ðernet_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 = <ð_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.4/arm-dts-renesas-fix-iommu-device-node-names.patch b/queue-5.4/arm-dts-renesas-fix-iommu-device-node-names.patch new file mode 100644 index 00000000000..d6d48ea233d --- /dev/null +++ b/queue-5.4/arm-dts-renesas-fix-iommu-device-node-names.patch @@ -0,0 +1,463 @@ +From 83b1113c7b54d26b617bdc5b4b711df39c1dabda Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Reviewed-by: Niklas Söderlund +Link: https://lore.kernel.org/r/1587461756-13317-1-git-send-email-yoshihiro.shimoda.uh@renesas.com +Signed-off-by: Geert Uytterhoeven +Signed-off-by: Sasha Levin +--- + 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 de981d629bddd..fdd267819319e 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 fa74a262107bc..8264481bf8764 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 c53f7ff20695f..c306713f2ab7d 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 5a2747758f676..e3ba00a22eebf 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 6f875502453cf..a26f86ccc5794 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 bf05110fac4e2..fa38397950188 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 8d797d34816e3..9dd952479e680 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.4/arm-dts-stm32-add-missing-ethernet-phy-reset-on-av96.patch b/queue-5.4/arm-dts-stm32-add-missing-ethernet-phy-reset-on-av96.patch new file mode 100644 index 00000000000..d1a9a3ff1f6 --- /dev/null +++ b/queue-5.4/arm-dts-stm32-add-missing-ethernet-phy-reset-on-av96.patch @@ -0,0 +1,43 @@ +From f0bc249f37a0fa10c9766d6e003c834889bd6603 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 22 Apr 2020 12:45:58 +0200 +Subject: ARM: dts: stm32: Add missing ethernet PHY reset on AV96 + +From: Marek Vasut + +[ Upstream commit 010ca9fe500bfe365860b50220ff80541c18f0e1 ] + +Add PHY reset GPIO on AV96 ethernet PHY. + +Reviewed-by: Manivannan Sadhasivam +Signed-off-by: Marek Vasut +Cc: Alexandre Torgue +Cc: Manivannan Sadhasivam +Cc: Maxime Coquelin +Cc: Patrice Chotard +Cc: Patrick Delaunay +Cc: linux-stm32@st-md-mailman.stormreply.com +To: linux-arm-kernel@lists.infradead.org +Signed-off-by: Alexandre Torgue +Signed-off-by: Sasha Levin +--- + 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 2e4742c53d048..7b8c3f25861c9 100644 +--- a/arch/arm/boot/dts/stm32mp157a-avenger96.dts ++++ b/arch/arm/boot/dts/stm32mp157a-avenger96.dts +@@ -91,6 +91,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.4/arm-dts-sun8i-h2-plus-bananapi-m2-zero-fix-led-polar.patch b/queue-5.4/arm-dts-sun8i-h2-plus-bananapi-m2-zero-fix-led-polar.patch new file mode 100644 index 00000000000..2d5e87de8cc --- /dev/null +++ b/queue-5.4/arm-dts-sun8i-h2-plus-bananapi-m2-zero-fix-led-polar.patch @@ -0,0 +1,43 @@ +From 7c6fc25b71af89d1006a63acb0eaa46715dfe7e2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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é + +[ 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é +Cc: Icenowy Zheng +Cc: Maxime Ripard +Signed-off-by: Maxime Ripard +Signed-off-by: Sasha Levin +--- + 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.4/arm-integrator-add-some-kconfig-selections.patch b/queue-5.4/arm-integrator-add-some-kconfig-selections.patch new file mode 100644 index 00000000000..9d19fb1dad7 --- /dev/null +++ b/queue-5.4/arm-integrator-add-some-kconfig-selections.patch @@ -0,0 +1,61 @@ +From 860d992908e4abf954aa567f08fc35e412cca497 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 13 Feb 2020 15:27:54 +0100 +Subject: ARM: integrator: Add some Kconfig selections + +From: Linus Walleij + +[ 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 +Signed-off-by: Sasha Levin +--- + 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.4/arm64-dts-armada-3720-turris-mox-fix-sfp-binding.patch b/queue-5.4/arm64-dts-armada-3720-turris-mox-fix-sfp-binding.patch new file mode 100644 index 00000000000..deb9832f7ef --- /dev/null +++ b/queue-5.4/arm64-dts-armada-3720-turris-mox-fix-sfp-binding.patch @@ -0,0 +1,40 @@ +From 2cee4366da87bf82803484c9078f17f628b62955 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Cc: Gregory CLEMENT +Signed-off-by: Gregory CLEMENT +Signed-off-by: Sasha Levin +--- + 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 01f66056d7d51..c3668187b8446 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.4/arm64-dts-armada-3720-turris-mox-forbid-sdr104-on-sd.patch b/queue-5.4/arm64-dts-armada-3720-turris-mox-forbid-sdr104-on-sd.patch new file mode 100644 index 00000000000..38f734afc91 --- /dev/null +++ b/queue-5.4/arm64-dts-armada-3720-turris-mox-forbid-sdr104-on-sd.patch @@ -0,0 +1,42 @@ +From 6e87635da5c31c343ace9e6df9a4e98d41602518 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Cc: Gregory CLEMENT +Signed-off-by: Gregory CLEMENT +Signed-off-by: Sasha Levin +--- + 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 5f350cc71a2fd..01f66056d7d51 100644 +--- a/arch/arm64/boot/dts/marvell/armada-3720-turris-mox.dts ++++ b/arch/arm64/boot/dts/marvell/armada-3720-turris-mox.dts +@@ -171,6 +171,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.4/arm64-dts-fvp-fix-gic-child-nodes.patch b/queue-5.4/arm64-dts-fvp-fix-gic-child-nodes.patch new file mode 100644 index 00000000000..234194765c2 --- /dev/null +++ b/queue-5.4/arm64-dts-fvp-fix-gic-child-nodes.patch @@ -0,0 +1,171 @@ +From 991a455566eec0909a7431bff1f1427e089b408d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 13 May 2020 11:30:06 +0100 +Subject: arm64: dts: fvp: Fix GIC child nodes + +From: Andre Przywara + +[ 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 +Signed-off-by: Sudeep Holla +Signed-off-by: Sasha Levin +--- + .../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 3f78373f708a2..2a6aa43241b3b 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.4/arm64-dts-fvp-juno-fix-node-address-fields.patch b/queue-5.4/arm64-dts-fvp-juno-fix-node-address-fields.patch new file mode 100644 index 00000000000..a93fcfeb8e0 --- /dev/null +++ b/queue-5.4/arm64-dts-fvp-juno-fix-node-address-fields.patch @@ -0,0 +1,172 @@ +From 05ea9008557482d9453b4eefa3d5a0eee6ed1580 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 13 May 2020 11:29:58 +0100 +Subject: arm64: dts: fvp/juno: Fix node address fields + +From: Andre Przywara + +[ 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 +Signed-off-by: Sudeep Holla +Signed-off-by: Sasha Levin +--- + 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 dfae90adbb7ca..ce64bfb22f22a 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 2a6aa43241b3b..05d1657170b49 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 9f60dacb4f80f..1234a8cfc0a92 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 57b0b9d7f3fae..29e6962c70bd9 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 03a7bf079c8ff..ad20076357f50 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.4/arm64-dts-juno-fix-gic-child-nodes.patch b/queue-5.4/arm64-dts-juno-fix-gic-child-nodes.patch new file mode 100644 index 00000000000..4b9c6179e48 --- /dev/null +++ b/queue-5.4/arm64-dts-juno-fix-gic-child-nodes.patch @@ -0,0 +1,132 @@ +From 5150c314b30d420a0466f714c0e36650ce163753 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 13 May 2020 11:30:05 +0100 +Subject: arm64: dts: juno: Fix GIC child nodes + +From: Andre Przywara + +[ 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 +Signed-off-by: Sudeep Holla +Signed-off-by: Sasha Levin +--- + 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 8c11660bbe40c..c47f76b01c4b5 100644 +--- a/arch/arm64/boot/dts/arm/juno-base.dtsi ++++ b/arch/arm64/boot/dts/arm/juno-base.dtsi +@@ -62,35 +62,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 = ; +- 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>; + }; + }; + +@@ -519,10 +519,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 */ +@@ -786,19 +786,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 { +@@ -808,6 +808,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.4/arm64-dts-meson-fixup-scp-sram-nodes.patch b/queue-5.4/arm64-dts-meson-fixup-scp-sram-nodes.patch new file mode 100644 index 00000000000..a9585782752 --- /dev/null +++ b/queue-5.4/arm64-dts-meson-fixup-scp-sram-nodes.patch @@ -0,0 +1,85 @@ +From 6b624c3843594f3bcc0301d9a4bd2c4c3e03a71d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 26 Mar 2020 17:59:55 +0100 +Subject: arm64: dts: meson: fixup SCP sram nodes + +From: Neil Armstrong + +[ 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 +Signed-off-by: Kevin Hilman +Link: https://lore.kernel.org/r/20200326165958.19274-3-narmstrong@baylibre.com +Signed-off-by: Sasha Levin +--- + 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 bb4a2acb9970a..502c4ac45c29e 100644 +--- a/arch/arm64/boot/dts/amlogic/meson-axg.dtsi ++++ b/arch/arm64/boot/dts/amlogic/meson-axg.dtsi +@@ -1728,18 +1728,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 6733050d735fe..ce230d6ac35cd 100644 +--- a/arch/arm64/boot/dts/amlogic/meson-gx.dtsi ++++ b/arch/arm64/boot/dts/amlogic/meson-gx.dtsi +@@ -345,20 +345,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.4/arm64-dts-msm8996-fix-csi-irq-types.patch b/queue-5.4/arm64-dts-msm8996-fix-csi-irq-types.patch new file mode 100644 index 00000000000..def3f19ce77 --- /dev/null +++ b/queue-5.4/arm64-dts-msm8996-fix-csi-irq-types.patch @@ -0,0 +1,55 @@ +From ac86ed9df9f4bc51b019c77c1ea499bea6cbdddb Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 21 Apr 2020 14:00:24 +0200 +Subject: arm64: dts: msm8996: Fix CSI IRQ types + +From: Loic Poulain + +[ 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 +Link: https://lore.kernel.org/r/1587470425-13726-1-git-send-email-loic.poulain@linaro.org +Signed-off-by: Bjorn Andersson +Signed-off-by: Sasha Levin +--- + 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 fbb8ce78f95be..d303df3887d9f 100644 +--- a/arch/arm64/boot/dts/qcom/msm8996.dtsi ++++ b/arch/arm64/boot/dts/qcom/msm8996.dtsi +@@ -1681,16 +1681,16 @@ + "csi_clk_mux", + "vfe0", + "vfe1"; +- interrupts = , +- , +- , +- , +- , +- , +- , +- , +- , +- ; ++ interrupts = , ++ , ++ , ++ , ++ , ++ , ++ , ++ , ++ , ++ ; + interrupt-names = "csiphy0", + "csiphy1", + "csiphy2", +-- +2.25.1 + diff --git a/queue-5.4/arm64-dts-mt8173-fix-unit-name-warnings.patch b/queue-5.4/arm64-dts-mt8173-fix-unit-name-warnings.patch new file mode 100644 index 00000000000..b8c2c922013 --- /dev/null +++ b/queue-5.4/arm64-dts-mt8173-fix-unit-name-warnings.patch @@ -0,0 +1,130 @@ +From cef0034f8a80989684d7ea1c621f19509b111f7b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 10 Feb 2020 14:35:22 +0800 +Subject: arm64: dts: mt8173: fix unit name warnings + +From: Hsin-Yi Wang + +[ 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 +Link: https://lore.kernel.org/r/20200210063523.133333-4-hsinyi@chromium.org +[mb: drop fixes for '_' in property name] +Signed-off-by: Matthias Brugger +Signed-off-by: Sasha Levin +--- + 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 5891b71514328..dec5e4113ce4c 100644 +--- a/arch/arm64/boot/dts/mediatek/mt8173.dtsi ++++ b/arch/arm64/boot/dts/mediatek/mt8173.dtsi +@@ -238,21 +238,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>; +@@ -268,19 +268,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"; +@@ -288,13 +288,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>; +@@ -308,7 +308,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>; +@@ -360,7 +360,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>; +@@ -567,7 +567,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.4/arm64-dts-qcom-fix-pm8150-gpio-interrupts.patch b/queue-5.4/arm64-dts-qcom-fix-pm8150-gpio-interrupts.patch new file mode 100644 index 00000000000..1ec842b70f2 --- /dev/null +++ b/queue-5.4/arm64-dts-qcom-fix-pm8150-gpio-interrupts.patch @@ -0,0 +1,107 @@ +From 84ad98d356ab7df9dc9a25b677fa688a97386325 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 20 Apr 2020 11:35:43 -0400 +Subject: arm64: dts: qcom: fix pm8150 gpio interrupts + +From: Jonathan Marek + +[ 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 +Signed-off-by: Jonathan Marek +Link: https://lore.kernel.org/r/20200420153543.14512-1-jonathan@marek.ca +Signed-off-by: Bjorn Andersson +Signed-off-by: Sasha Levin +--- + 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.4/arm64-dts-qcom-msm8916-remove-unit-name-for-thermal-.patch b/queue-5.4/arm64-dts-qcom-msm8916-remove-unit-name-for-thermal-.patch new file mode 100644 index 00000000000..85eee594e79 --- /dev/null +++ b/queue-5.4/arm64-dts-qcom-msm8916-remove-unit-name-for-thermal-.patch @@ -0,0 +1,84 @@ +From 4a2cd8efb1b9376ae6968ca723e95a0ce51b9845 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 30 Mar 2020 15:36:26 +0530 +Subject: arm64: dts: qcom: msm8916: remove unit name for thermal trip points + +From: Amit Kucheria + +[ 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 +Link: https://lore.kernel.org/r/2d3d045c18a2fb85b28cf304aa11ae6e6538d75e.1585562459.git.amit.kucheria@linaro.org +Signed-off-by: Bjorn Andersson +Signed-off-by: Sasha Levin +--- + 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 5ea9fb8f2f87d..340da154d4e37 100644 +--- a/arch/arm64/boot/dts/qcom/msm8916.dtsi ++++ b/arch/arm64/boot/dts/qcom/msm8916.dtsi +@@ -212,7 +212,7 @@ + thermal-sensors = <&tsens 3>; + + trips { +- cpu2_3_alert0: trip-point@0 { ++ cpu2_3_alert0: trip-point0 { + temperature = <75000>; + hysteresis = <2000>; + type = "passive"; +@@ -242,7 +242,7 @@ + thermal-sensors = <&tsens 2>; + + trips { +- gpu_alert0: trip-point@0 { ++ gpu_alert0: trip-point0 { + temperature = <75000>; + hysteresis = <2000>; + type = "passive"; +@@ -262,7 +262,7 @@ + thermal-sensors = <&tsens 1>; + + trips { +- cam_alert0: trip-point@0 { ++ cam_alert0: trip-point0 { + temperature = <75000>; + hysteresis = <2000>; + type = "hot"; +@@ -277,7 +277,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.4/arm64-hw_breakpoint-don-t-invoke-overflow-handler-on.patch b/queue-5.4/arm64-hw_breakpoint-don-t-invoke-overflow-handler-on.patch new file mode 100644 index 00000000000..7d9812deb8b --- /dev/null +++ b/queue-5.4/arm64-hw_breakpoint-don-t-invoke-overflow-handler-on.patch @@ -0,0 +1,109 @@ +From 7fc824958a3373075afbb0c440a361be8c11b1ff Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 29 May 2020 14:12:18 +0100 +Subject: arm64: hw_breakpoint: Don't invoke overflow handler on uaccess + watchpoints + +From: Will Deacon + +[ 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 +Cc: James Morse +Fixes: 57f4959bad0a ("arm64: kernel: Add support for User Access Override") +Reported-by: Luis Machado +Signed-off-by: Will Deacon +Signed-off-by: Sasha Levin +--- + 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 38ee1514cd9cd..b4a1607958246 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.4/arm64-tegra-fix-ethernet-phy-mode-for-jetson-xavier.patch b/queue-5.4/arm64-tegra-fix-ethernet-phy-mode-for-jetson-xavier.patch new file mode 100644 index 00000000000..895b4fc4fe7 --- /dev/null +++ b/queue-5.4/arm64-tegra-fix-ethernet-phy-mode-for-jetson-xavier.patch @@ -0,0 +1,44 @@ +From ece2c539b0ec34c9f84495a4141d6a3ff404b154 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 1 May 2020 08:27:56 +0100 +Subject: arm64: tegra: Fix ethernet phy-mode for Jetson Xavier + +From: Jon Hunter + +[ 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 +Signed-off-by: Thierry Reding +Signed-off-by: Sasha Levin +--- + arch/arm64/boot/dts/nvidia/tegra194-p2888.dtsi | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/arm64/boot/dts/nvidia/tegra194-p2888.dtsi b/arch/arm64/boot/dts/nvidia/tegra194-p2888.dtsi +index 02909a48dfcd9..7899759a12f80 100644 +--- a/arch/arm64/boot/dts/nvidia/tegra194-p2888.dtsi ++++ b/arch/arm64/boot/dts/nvidia/tegra194-p2888.dtsi +@@ -32,7 +32,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.4/arm64-tegra-fix-flag-for-64-bit-resources-in-ranges-.patch b/queue-5.4/arm64-tegra-fix-flag-for-64-bit-resources-in-ranges-.patch new file mode 100644 index 00000000000..be7c17b0b3e --- /dev/null +++ b/queue-5.4/arm64-tegra-fix-flag-for-64-bit-resources-in-ranges-.patch @@ -0,0 +1,81 @@ +From d69fe250bc2de640a579508be836b1094ad0baee Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 14 May 2020 19:24:37 +0530 +Subject: arm64: tegra: Fix flag for 64-bit resources in 'ranges' property + +From: Vidya Sagar + +[ 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 +Signed-off-by: Thierry Reding +Signed-off-by: Sasha Levin +--- + 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 457b815d57f40..2f3926719434a 100644 +--- a/arch/arm64/boot/dts/nvidia/tegra194.dtsi ++++ b/arch/arm64/boot/dts/nvidia/tegra194.dtsi +@@ -1192,7 +1192,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) */ + }; + +@@ -1238,7 +1238,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) */ + }; + +@@ -1284,7 +1284,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) */ + }; + +@@ -1330,7 +1330,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) */ + }; + +@@ -1376,7 +1376,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) */ + }; + +@@ -1426,7 +1426,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.4/asoc-core-only-convert-non-dpcm-link-to-dpcm-link.patch b/queue-5.4/asoc-core-only-convert-non-dpcm-link-to-dpcm-link.patch new file mode 100644 index 00000000000..102f8c089c4 --- /dev/null +++ b/queue-5.4/asoc-core-only-convert-non-dpcm-link-to-dpcm-link.patch @@ -0,0 +1,72 @@ +From a470b682c47bca5575cef99d871fd3dc18a08943 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 8 Jun 2020 14:44:13 -0500 +Subject: ASoC: core: only convert non DPCM link to DPCM link + +From: Bard Liao + +[ 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 +Signed-off-by: Bard Liao +Signed-off-by: Pierre-Louis Bossart +Reviewed-by: Guennadi Liakhovetski +Reviewed-by: Daniel Baluta +Reviewed-by: Bard Liao +Link: https://lore.kernel.org/r/20200608194415.4663-3-pierre-louis.bossart@linux.intel.com +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + 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 0215e2c94bf08..9df20768a8f29 100644 +--- a/sound/soc/soc-core.c ++++ b/sound/soc/soc-core.c +@@ -1895,9 +1895,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.4/asoc-davinci-mcasp-fix-dma_chan-refcnt-leak-when-get.patch b/queue-5.4/asoc-davinci-mcasp-fix-dma_chan-refcnt-leak-when-get.patch new file mode 100644 index 00000000000..2358d541e41 --- /dev/null +++ b/queue-5.4/asoc-davinci-mcasp-fix-dma_chan-refcnt-leak-when-get.patch @@ -0,0 +1,53 @@ +From dd15b7aeafc4d0d4df6424dd0112204808f4a1a9 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Signed-off-by: Xin Tan +Acked-by: Peter Ujfalusi +Link: https://lore.kernel.org/r/1587818916-38730-1-git-send-email-xiyuyang19@fudan.edu.cn +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + 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 7aa3c32e4a492..0541071f454bd 100644 +--- a/sound/soc/ti/davinci-mcasp.c ++++ b/sound/soc/ti/davinci-mcasp.c +@@ -1875,8 +1875,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.4/asoc-fix-incomplete-error-handling-in-img_i2s_in_pro.patch b/queue-5.4/asoc-fix-incomplete-error-handling-in-img_i2s_in_pro.patch new file mode 100644 index 00000000000..f0d4eba80d4 --- /dev/null +++ b/queue-5.4/asoc-fix-incomplete-error-handling-in-img_i2s_in_pro.patch @@ -0,0 +1,37 @@ +From 6191a34f6e924ee512852615a47a6fe3cfdbbcca Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 25 May 2020 00:50:11 -0500 +Subject: ASoC: fix incomplete error-handling in img_i2s_in_probe. + +From: Qiushi Wu + +[ 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 +Link: https://lore.kernel.org/r/20200525055011.31925-1-wu000273@umn.edu +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + 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 fdd2c73fd2fac..869fe0068cbd3 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.4/asoc-fsl_asrc_dma-fix-dma_chan-leak-when-config-dma-.patch b/queue-5.4/asoc-fsl_asrc_dma-fix-dma_chan-leak-when-config-dma-.patch new file mode 100644 index 00000000000..d263428155f --- /dev/null +++ b/queue-5.4/asoc-fsl_asrc_dma-fix-dma_chan-leak-when-config-dma-.patch @@ -0,0 +1,46 @@ +From 206da34698caa37d392399a84b850b3fab291972 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Signed-off-by: Xin Tan +Link: https://lore.kernel.org/r/1590415966-52416-1-git-send-email-xiyuyang19@fudan.edu.cn +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + 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 01052a0808b0b..5aee6b8366d27 100644 +--- a/sound/soc/fsl/fsl_asrc_dma.c ++++ b/sound/soc/fsl/fsl_asrc_dma.c +@@ -241,6 +241,7 @@ static int fsl_asrc_dma_hw_params(struct snd_pcm_substream *substream, + 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.4/asoc-fsl_esai-disable-exception-interrupt-before-sch.patch b/queue-5.4/asoc-fsl_esai-disable-exception-interrupt-before-sch.patch new file mode 100644 index 00000000000..b5f52ba554f --- /dev/null +++ b/queue-5.4/asoc-fsl_esai-disable-exception-interrupt-before-sch.patch @@ -0,0 +1,41 @@ +From 60f2de427866cd4728891d6add6c1b0d6ceb5286 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 27 Apr 2020 14:23:21 +0800 +Subject: ASoC: fsl_esai: Disable exception interrupt before scheduling tasklet + +From: Shengjiu Wang + +[ 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 +Acked-by: Nicolin Chen +Link: https://lore.kernel.org/r/a8f2ad955aac9e52587beedc1133b3efbe746895.1587968824.git.shengjiu.wang@nxp.com +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + 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.4/asoc-intel-bytcr_rt5640-add-quirk-for-toshiba-encore.patch b/queue-5.4/asoc-intel-bytcr_rt5640-add-quirk-for-toshiba-encore.patch new file mode 100644 index 00000000000..a1cef533e8d --- /dev/null +++ b/queue-5.4/asoc-intel-bytcr_rt5640-add-quirk-for-toshiba-encore.patch @@ -0,0 +1,52 @@ +From 39af812f12d672f14dfbbfe6d6e25fbd0532dce0 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Acked-by: Pierre-Louis Bossart +Link: https://lore.kernel.org/r/20200518072416.5348-1-hdegoede@redhat.com +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + 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 e62e1d7815aa9..f222e1091bae7 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.4/asoc-intel-bytcr_rt5640-add-quirk-for-toshiba-encore.patch-14146 b/queue-5.4/asoc-intel-bytcr_rt5640-add-quirk-for-toshiba-encore.patch-14146 new file mode 100644 index 00000000000..5e0674eb5be --- /dev/null +++ b/queue-5.4/asoc-intel-bytcr_rt5640-add-quirk-for-toshiba-encore.patch-14146 @@ -0,0 +1,51 @@ +From a0b83480c82d08a0598095d1b112efc17b4fa7a3 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Acked-by: Pierre-Louis Bossart +Link: https://lore.kernel.org/r/20200608204634.93407-1-hdegoede@redhat.com +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + 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 f222e1091bae7..f7964d1ec486f 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.4/asoc-max98373-reorder-max98373_reset-in-resume.patch b/queue-5.4/asoc-max98373-reorder-max98373_reset-in-resume.patch new file mode 100644 index 00000000000..c63f5f9ac47 --- /dev/null +++ b/queue-5.4/asoc-max98373-reorder-max98373_reset-in-resume.patch @@ -0,0 +1,56 @@ +From 4da34a5c58cdd34be4f24930c8a05af8985fc82b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 1 May 2020 18:44:21 -0500 +Subject: ASoC: max98373: reorder max98373_reset() in resume + +From: Yong Zhi + +[ 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 +Link: https://lore.kernel.org/r/1588376661-29799-1-git-send-email-yong.zhi@intel.com +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + 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.4/asoc-meson-add-missing-free_irq-in-error-path.patch b/queue-5.4/asoc-meson-add-missing-free_irq-in-error-path.patch new file mode 100644 index 00000000000..c1ac9419e23 --- /dev/null +++ b/queue-5.4/asoc-meson-add-missing-free_irq-in-error-path.patch @@ -0,0 +1,53 @@ +From f2f7643f1220928e9be09fed9ce35ae0e8f31efe Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 6 Jun 2020 17:31:03 +0200 +Subject: ASoC: meson: add missing free_irq() in error path + +From: Pavel Machek (CIP) + +[ Upstream commit 3b8a299a58b2afce464ae11324b59dcf0f1d10a7 ] + +free_irq() is missing in case of error, fix that. + +Signed-off-by: Pavel Machek (CIP) +Reviewed-by: Jerome Brunet + +Link: https://lore.kernel.org/r/20200606153103.GA17905@amd +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + 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 d286dff3171d2..898ef1d5608f9 100644 +--- a/sound/soc/meson/axg-fifo.c ++++ b/sound/soc/meson/axg-fifo.c +@@ -244,7 +244,7 @@ static int axg_fifo_pcm_open(struct snd_pcm_substream *ss) + /* 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, +@@ -264,8 +264,14 @@ static int axg_fifo_pcm_open(struct snd_pcm_substream *ss) + /* 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; + } + +-- +2.25.1 + diff --git a/queue-5.4/asoc-qcom-q6asm-dai-kcfi-fix.patch b/queue-5.4/asoc-qcom-q6asm-dai-kcfi-fix.patch new file mode 100644 index 00000000000..cffab38b1ba --- /dev/null +++ b/queue-5.4/asoc-qcom-q6asm-dai-kcfi-fix.patch @@ -0,0 +1,111 @@ +From 223621014651e662aeb001b9b8493a2890b87df5 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 29 May 2020 21:38:23 +0000 +Subject: ASoC: qcom: q6asm-dai: kCFI fix + +From: John Stultz + +[ 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 +Reviewed-by: Srinivas Kandagatla +Cc: Patrick Lai +Cc: Banajit Goswami +Cc: Liam Girdwood +Cc: Mark Brown +Cc: Jaroslav Kysela +Cc: Takashi Iwai +Cc: Srinivas Kandagatla +Cc: Vinod Koul +Cc: Kuninori Morimoto +Cc: Stephan Gerhold +Cc: Sami Tolvanen +Cc: Todd Kjos +Cc: Alistair Delva +Cc: Amit Pundir +Cc: Sumit Semwal +Cc: alsa-devel@alsa-project.org +Link: https://lore.kernel.org/r/20200529213823.98812-1-john.stultz@linaro.org +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + 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 548eb4fa2da64..9f0ffdcef637e 100644 +--- a/sound/soc/qcom/qdsp6/q6asm-dai.c ++++ b/sound/soc/qcom/qdsp6/q6asm-dai.c +@@ -171,7 +171,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; +@@ -494,7 +494,7 @@ static struct snd_pcm_ops q6asm_dai_ops = { + }; + + 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.4/asoc-rt5645-add-platform-data-for-asus-t101ha.patch b/queue-5.4/asoc-rt5645-add-platform-data-for-asus-t101ha.patch new file mode 100644 index 00000000000..cb59989b822 --- /dev/null +++ b/queue-5.4/asoc-rt5645-add-platform-data-for-asus-t101ha.patch @@ -0,0 +1,60 @@ +From affab08e7dbf405da7cd160b0e0bde4616acfb1a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 8 Jun 2020 22:46:34 +0200 +Subject: ASoC: rt5645: Add platform-data for Asus T101HA + +From: Hans de Goede + +[ 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 +Acked-by: Pierre-Louis Bossart +Link: https://lore.kernel.org/r/20200608204634.93407-2-hdegoede@redhat.com +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + 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 19662ee330d6b..c83f7f5da96b7 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, +@@ -3702,6 +3708,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.4/asoc-sof-core-fix-error-return-code-in-sof_probe_con.patch b/queue-5.4/asoc-sof-core-fix-error-return-code-in-sof_probe_con.patch new file mode 100644 index 00000000000..6683a7ad08c --- /dev/null +++ b/queue-5.4/asoc-sof-core-fix-error-return-code-in-sof_probe_con.patch @@ -0,0 +1,37 @@ +From 9ece77f5d34f4a2744072c74f1d8294982f73143 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 9 May 2020 09:33:37 +0000 +Subject: ASoC: SOF: core: fix error return code in sof_probe_continue() + +From: Wei Yongjun + +[ 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 +Signed-off-by: Wei Yongjun +Link: https://lore.kernel.org/r/20200509093337.78897-1-weiyongjun1@huawei.com +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + 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 12aec140819a2..2a6b84d2781ee 100644 +--- a/sound/soc/sof/core.c ++++ b/sound/soc/sof/core.c +@@ -372,6 +372,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.4/asoc-sof-do-nothing-when-dsp-pm-callbacks-are-not-se.patch b/queue-5.4/asoc-sof-do-nothing-when-dsp-pm-callbacks-are-not-se.patch new file mode 100644 index 00000000000..ee977b83614 --- /dev/null +++ b/queue-5.4/asoc-sof-do-nothing-when-dsp-pm-callbacks-are-not-se.patch @@ -0,0 +1,60 @@ +From 82b72b17cb092471aa40f6e8a81bdc0be93d443f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 15 May 2020 16:59:51 +0300 +Subject: ASoC: SOF: Do nothing when DSP PM callbacks are not set + +From: Daniel Baluta + +[ 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 +Signed-off-by: Kai Vehmanen +Reviewed-by: Pierre-Louis Bossart +Reviewed-by: Ranjani Sridharan +Link: https://lore.kernel.org/r/20200515135958.17511-2-kai.vehmanen@linux.intel.com +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + 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 195af259e78e3..128680b09c20b 100644 +--- a/sound/soc/sof/pm.c ++++ b/sound/soc/sof/pm.c +@@ -266,7 +266,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 */ +@@ -346,7 +349,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.4/asoc-sof-imx8-fix-randbuild-error.patch b/queue-5.4/asoc-sof-imx8-fix-randbuild-error.patch new file mode 100644 index 00000000000..28bcba9ebac --- /dev/null +++ b/queue-5.4/asoc-sof-imx8-fix-randbuild-error.patch @@ -0,0 +1,50 @@ +From afb801a89b4a1077ccee56918d48a9d591905aec Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 9 Apr 2020 10:18:28 +0300 +Subject: ASoC: SOF: imx8: Fix randbuild error + +From: YueHaibing + +[ 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 +Signed-off-by: YueHaibing +Signed-off-by: Daniel Baluta +Link: https://lore.kernel.org/r/20200409071832.2039-2-daniel.baluta@oss.nxp.com +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + 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 71f318bc2c74f..b4f0426685c42 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.4/asoc-sof-nocodec-conditionally-set-dpcm_capture-dpcm.patch b/queue-5.4/asoc-sof-nocodec-conditionally-set-dpcm_capture-dpcm.patch new file mode 100644 index 00000000000..36c648a7904 --- /dev/null +++ b/queue-5.4/asoc-sof-nocodec-conditionally-set-dpcm_capture-dpcm.patch @@ -0,0 +1,51 @@ +From d0f7f44baf3ddc764a81fd8c33e5d140aae626c3 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 8 Jun 2020 14:44:15 -0500 +Subject: ASoC: SOF: nocodec: conditionally set dpcm_capture/dpcm_playback + flags + +From: Pierre-Louis Bossart + +[ 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 +Reviewed-by: Guennadi Liakhovetski +Reviewed-by: Daniel Baluta +Reviewed-by: Bard Liao +Link: https://lore.kernel.org/r/20200608194415.4663-5-pierre-louis.bossart@linux.intel.com +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + 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 3d128e5a132c0..ea0fe9a09f3f5 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.4/asoc-tegra-tegra_wm8903-support-nvidia-headset-prope.patch b/queue-5.4/asoc-tegra-tegra_wm8903-support-nvidia-headset-prope.patch new file mode 100644 index 00000000000..006e0c7dd26 --- /dev/null +++ b/queue-5.4/asoc-tegra-tegra_wm8903-support-nvidia-headset-prope.patch @@ -0,0 +1,54 @@ +From 86f1e2f0d7e9267368c412e607bd03e8f1b809b3 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 30 Mar 2020 23:40:11 +0300 +Subject: ASoC: tegra: tegra_wm8903: Support nvidia, headset property + +From: Dmitry Osipenko + +[ 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 +Link: https://lore.kernel.org/r/20200330204011.18465-3-digetx@gmail.com +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + 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 6211dfda21957..0fa01cacfec9a 100644 +--- a/sound/soc/tegra/tegra_wm8903.c ++++ b/sound/soc/tegra/tegra_wm8903.c +@@ -159,6 +159,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; +@@ -171,12 +172,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.4/asoc-ti-omap-mcbsp-fix-an-error-handling-path-in-aso.patch b/queue-5.4/asoc-ti-omap-mcbsp-fix-an-error-handling-path-in-aso.patch new file mode 100644 index 00000000000..11ac5a6d190 --- /dev/null +++ b/queue-5.4/asoc-ti-omap-mcbsp-fix-an-error-handling-path-in-aso.patch @@ -0,0 +1,71 @@ +From f490200a325b6d8671803a59edce58362c96481e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Acked-by: Peter Ujfalusi +Link: https://lore.kernel.org/r/20200512134325.252073-1-christophe.jaillet@wanadoo.fr +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + 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 26b503bbdb5fe..3273b317fa3b9 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.4/asoc-ux500-mop500-fix-some-refcounted-resources-issu.patch b/queue-5.4/asoc-ux500-mop500-fix-some-refcounted-resources-issu.patch new file mode 100644 index 00000000000..c7b9bed1187 --- /dev/null +++ b/queue-5.4/asoc-ux500-mop500-fix-some-refcounted-resources-issu.patch @@ -0,0 +1,58 @@ +From b32cbfe7654497d38e270637ae871d16884866f1 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 12 May 2020 12:07:05 +0200 +Subject: ASoC: ux500: mop500: Fix some refcounted resources issues + +From: Christophe JAILLET + +[ 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 +Link: https://lore.kernel.org/r/20200512100705.246349-1-christophe.jaillet@wanadoo.fr +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + 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.4/backlight-lp855x-ensure-regulators-are-disabled-on-p.patch b/queue-5.4/backlight-lp855x-ensure-regulators-are-disabled-on-p.patch new file mode 100644 index 00000000000..0b03ca71c8d --- /dev/null +++ b/queue-5.4/backlight-lp855x-ensure-regulators-are-disabled-on-p.patch @@ -0,0 +1,123 @@ +From 5aa7fcb7db8efd0c3480ad193b7a0a3f67ae9d6d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 24 Feb 2020 14:07:48 +0000 +Subject: backlight: lp855x: Ensure regulators are disabled on probe failure + +From: Jon Hunter + +[ 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 +Reviewed-by: Daniel Thompson +Signed-off-by: Lee Jones +Signed-off-by: Sasha Levin +--- + 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.4/bcache-fix-potential-deadlock-problem-in-btree_gc_co.patch b/queue-5.4/bcache-fix-potential-deadlock-problem-in-btree_gc_co.patch new file mode 100644 index 00000000000..b91713f5a0d --- /dev/null +++ b/queue-5.4/bcache-fix-potential-deadlock-problem-in-btree_gc_co.patch @@ -0,0 +1,96 @@ +From 41bf23a46b694b51b34a3e75cdc29629b8e26bca Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 15 Jun 2020 00:53:30 +0800 +Subject: bcache: fix potential deadlock problem in btree_gc_coalesce + +From: Zhiqiang Liu + +[ 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 +Signed-off-by: Coly Li +Signed-off-by: Jens Axboe +Signed-off-by: Sasha Levin +--- + 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 46a8b5a91c386..3c1109fceb2fb 100644 +--- a/drivers/md/bcache/btree.c ++++ b/drivers/md/bcache/btree.c +@@ -1442,7 +1442,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 */ +@@ -1471,7 +1471,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); +@@ -1517,6 +1517,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.4/blktrace-fix-endianness-for-blk_log_remap.patch b/queue-5.4/blktrace-fix-endianness-for-blk_log_remap.patch new file mode 100644 index 00000000000..0390e053857 --- /dev/null +++ b/queue-5.4/blktrace-fix-endianness-for-blk_log_remap.patch @@ -0,0 +1,64 @@ +From b33ed7f89a9666266116b21acb089c139178f0c4 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 4 Jun 2020 00:13:30 -0700 +Subject: blktrace: fix endianness for blk_log_remap() + +From: Chaitanya Kulkarni + +[ 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 +Signed-off-by: Jens Axboe +Signed-off-by: Sasha Levin +--- + 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 23e5f86c99215..a677aa84ccb6e 100644 +--- a/kernel/trace/blktrace.c ++++ b/kernel/trace/blktrace.c +@@ -1266,17 +1266,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); + +@@ -1402,13 +1391,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.4/blktrace-fix-endianness-in-get_pdu_int.patch b/queue-5.4/blktrace-fix-endianness-in-get_pdu_int.patch new file mode 100644 index 00000000000..da918d41efb --- /dev/null +++ b/queue-5.4/blktrace-fix-endianness-in-get_pdu_int.patch @@ -0,0 +1,35 @@ +From 27f0f343f77c5ba2be4a348b71384c9fc2043a75 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 4 Jun 2020 00:13:29 -0700 +Subject: blktrace: fix endianness in get_pdu_int() + +From: Chaitanya Kulkarni + +[ Upstream commit 71df3fd82e7cccec7b749a8607a4662d9f7febdd ] + +In function get_pdu_len() replace variable type from __u64 to +__be64. This fixes sparse warning. + +Signed-off-by: Chaitanya Kulkarni +Signed-off-by: Jens Axboe +Signed-off-by: Sasha Levin +--- + kernel/trace/blktrace.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/kernel/trace/blktrace.c b/kernel/trace/blktrace.c +index 9e02e1ce0ac01..23e5f86c99215 100644 +--- a/kernel/trace/blktrace.c ++++ b/kernel/trace/blktrace.c +@@ -1262,7 +1262,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.4/blktrace-use-errno-instead-of-bi_status.patch b/queue-5.4/blktrace-use-errno-instead-of-bi_status.patch new file mode 100644 index 00000000000..aa41e0cedcd --- /dev/null +++ b/queue-5.4/blktrace-use-errno-instead-of-bi_status.patch @@ -0,0 +1,50 @@ +From f156cf13badc6254daf7e895ad379cea485a171b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 4 Jun 2020 00:13:28 -0700 +Subject: blktrace: use errno instead of bi_status + +From: Chaitanya Kulkarni + +[ 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 +Signed-off-by: Jens Axboe +Signed-off-by: Sasha Levin +--- + 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 e7e483cdbea61..9e02e1ce0ac01 100644 +--- a/kernel/trace/blktrace.c ++++ b/kernel/trace/blktrace.c +@@ -999,8 +999,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(); + } +@@ -1037,7 +1039,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.4/block-fix-use-after-free-in-blkdev_get.patch b/queue-5.4/block-fix-use-after-free-in-blkdev_get.patch new file mode 100644 index 00000000000..75aa1339f25 --- /dev/null +++ b/queue-5.4/block-fix-use-after-free-in-blkdev_get.patch @@ -0,0 +1,199 @@ +From f23dffa42eac731429584e705c3b610d4f1b6d56 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 16 Jun 2020 20:16:55 +0800 +Subject: block: Fix use-after-free in blkdev_get() + +From: Jason Yan + +[ 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 +Signed-off-by: Jason Yan +Tested-by: Sedat Dilek +Reviewed-by: Jan Kara +Reviewed-by: Christoph Hellwig +Reviewed-by: Dan Carpenter +Cc: Christoph Hellwig +Cc: Jens Axboe +Cc: Ming Lei +Cc: Jan Kara +Cc: Dan Carpenter +Signed-off-by: Jens Axboe +Signed-off-by: Sasha Levin +--- + 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 34644ce4b5025..2dc9c73a4cb29 100644 +--- a/fs/block_dev.c ++++ b/fs/block_dev.c +@@ -1546,10 +1546,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: +@@ -1618,8 +1616,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) || +@@ -1669,7 +1669,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; + } +@@ -1736,6 +1735,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.4/bnxt_en-return-from-timer-if-interface-is-not-in-ope.patch b/queue-5.4/bnxt_en-return-from-timer-if-interface-is-not-in-ope.patch new file mode 100644 index 00000000000..13dbcec06a5 --- /dev/null +++ b/queue-5.4/bnxt_en-return-from-timer-if-interface-is-not-in-ope.patch @@ -0,0 +1,37 @@ +From 5ade61a41b331ee6c8ad59b729eefb003f4f7108 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + 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 63ee0c49be7cf..b5147bd6cba6d 100644 +--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c ++++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c +@@ -9992,7 +9992,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.4/bpf-fix-memlock-accounting-for-sock_hash.patch b/queue-5.4/bpf-fix-memlock-accounting-for-sock_hash.patch new file mode 100644 index 00000000000..a2f3df2cb35 --- /dev/null +++ b/queue-5.4/bpf-fix-memlock-accounting-for-sock_hash.patch @@ -0,0 +1,59 @@ +From cbe228f7c6af2ab20f96a0befb82d802818dcb5f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 11 Jun 2020 17:08:57 -0700 +Subject: bpf: Fix memlock accounting for sock_hash + +From: Andrey Ignatov + +[ 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 +Signed-off-by: Alexei Starovoitov +Link: https://lore.kernel.org/bpf/20200612000857.2881453-1-rdna@fb.com +Signed-off-by: Sasha Levin +--- + 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 b22e9f1191803..6bbc118bf00e9 100644 +--- a/net/core/sock_map.c ++++ b/net/core/sock_map.c +@@ -837,11 +837,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.4/bpf-sockhash-fix-memory-leak-when-unlinking-sockets-.patch b/queue-5.4/bpf-sockhash-fix-memory-leak-when-unlinking-sockets-.patch new file mode 100644 index 00000000000..8b009991fc3 --- /dev/null +++ b/queue-5.4/bpf-sockhash-fix-memory-leak-when-unlinking-sockets-.patch @@ -0,0 +1,56 @@ +From 539737141e590bbdf899ec7ad1665256c0c2ac3d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Signed-off-by: Alexei Starovoitov +Acked-by: John Fastabend +Link: https://lore.kernel.org/bpf/20200607205229.2389672-2-jakub@cloudflare.com +Signed-off-by: Sasha Levin +--- + 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 8291568b707fc..ba65c608c2282 100644 +--- a/net/core/sock_map.c ++++ b/net/core/sock_map.c +@@ -879,6 +879,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.4/bpf-sockhash-synchronize-delete-from-bucket-list-on-.patch b/queue-5.4/bpf-sockhash-synchronize-delete-from-bucket-list-on-.patch new file mode 100644 index 00000000000..9c0b3340a2a --- /dev/null +++ b/queue-5.4/bpf-sockhash-synchronize-delete-from-bucket-list-on-.patch @@ -0,0 +1,116 @@ +From 238b69808a752c33568c538af9398efd325811bb Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 7 Jun 2020 22:52:29 +0200 +Subject: bpf, sockhash: Synchronize delete from bucket list on map free + +From: Jakub Sitnicki + +[ 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 +Signed-off-by: Jakub Sitnicki +Signed-off-by: Alexei Starovoitov +Acked-by: John Fastabend +Link: https://lore.kernel.org/bpf/20200607205229.2389672-3-jakub@cloudflare.com +Signed-off-by: Sasha Levin +--- + 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 ba65c608c2282..b22e9f1191803 100644 +--- a/net/core/sock_map.c ++++ b/net/core/sock_map.c +@@ -861,6 +861,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; +@@ -872,13 +873,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.4/bpf-sockmap-fix-kernel-panic-at-__tcp_bpf_recvmsg.patch b/queue-5.4/bpf-sockmap-fix-kernel-panic-at-__tcp_bpf_recvmsg.patch new file mode 100644 index 00000000000..a5a908f440f --- /dev/null +++ b/queue-5.4/bpf-sockmap-fix-kernel-panic-at-__tcp_bpf_recvmsg.patch @@ -0,0 +1,63 @@ +From d8f7102aab433070f3caf8172cee5fe901ba743b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 5 Jun 2020 16:46:25 +0800 +Subject: bpf/sockmap: Fix kernel panic at __tcp_bpf_recvmsg + +From: dihu + +[ 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 +Signed-off-by: Alexei Starovoitov +Acked-by: John Fastabend +Acked-by: Jakub Sitnicki +Link: https://lore.kernel.org/bpf/20200605084625.9783-1-anny.hu@linux.alibaba.com +Signed-off-by: Sasha Levin +--- + 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 69b0254083904..ad9f382027311 100644 +--- a/net/ipv4/tcp_bpf.c ++++ b/net/ipv4/tcp_bpf.c +@@ -96,6 +96,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.4/ceph-don-t-return-estale-if-there-s-still-an-open-fi.patch b/queue-5.4/ceph-don-t-return-estale-if-there-s-still-an-open-fi.patch new file mode 100644 index 00000000000..a0ba2571c8e --- /dev/null +++ b/queue-5.4/ceph-don-t-return-estale-if-there-s-still-an-open-fi.patch @@ -0,0 +1,61 @@ +From 377b3a8c161df8172c0b64234c8e41c153307206 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Reviewed-by: Jeff Layton +Acked-by: Amir Goldstein +Signed-off-by: Ilya Dryomov +Signed-off-by: Sasha Levin +--- + 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.4/cifs-set-up-next-dfs-target-before-generic_ip_connec.patch b/queue-5.4/cifs-set-up-next-dfs-target-before-generic_ip_connec.patch new file mode 100644 index 00000000000..613eaf254a9 --- /dev/null +++ b/queue-5.4/cifs-set-up-next-dfs-target-before-generic_ip_connec.patch @@ -0,0 +1,104 @@ +From 1256b162042c9aa6a8023bd8d23307c91be0501a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 19 May 2020 15:38:27 -0300 +Subject: cifs: set up next DFS target before generic_ip_connect() + +From: Paulo Alcantara + +[ 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) +Reviewed-by: Aurelien Aptel +Signed-off-by: Steve French +Signed-off-by: Sasha Levin +--- + 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 721b2560caa74..947c4aad5d6a4 100644 +--- a/fs/cifs/connect.c ++++ b/fs/cifs/connect.c +@@ -614,26 +614,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.4/clk-ast2600-fix-ahb-clock-divider-for-a1.patch b/queue-5.4/clk-ast2600-fix-ahb-clock-divider-for-a1.patch new file mode 100644 index 00000000000..7c8cde9feaf --- /dev/null +++ b/queue-5.4/clk-ast2600-fix-ahb-clock-divider-for-a1.patch @@ -0,0 +1,81 @@ +From 350090d194acf5751ac38f8c7d79fcc03cbe2a8e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 8 Apr 2020 15:36:16 -0500 +Subject: clk: ast2600: Fix AHB clock divider for A1 + +From: Eddie James + +[ 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 +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 +Signed-off-by: Sasha Levin +--- + 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 b1318e6b655bc..675cab6fa7814 100644 +--- a/drivers/clk/clk-ast2600.c ++++ b/drivers/clk/clk-ast2600.c +@@ -599,14 +599,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); + +@@ -636,11 +644,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.4/clk-bcm2835-fix-return-type-of-bcm2835_register_gate.patch b/queue-5.4/clk-bcm2835-fix-return-type-of-bcm2835_register_gate.patch new file mode 100644 index 00000000000..c12e23b8e9a --- /dev/null +++ b/queue-5.4/clk-bcm2835-fix-return-type-of-bcm2835_register_gate.patch @@ -0,0 +1,59 @@ +From 993aabcf4d7806e72ec1b20f58886e9dfe4e31b2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 16 May 2020 01:08:06 -0700 +Subject: clk: bcm2835: Fix return type of bcm2835_register_gate + +From: Nathan Chancellor + +[ 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 +Link: https://lkml.kernel.org/r/20200516080806.1459784-1-natechancellor@gmail.com +Signed-off-by: Stephen Boyd +Signed-off-by: Sasha Levin +--- + 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 802e488fd3c3d..6e5d635f030f4 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.4/clk-clk-flexgen-fix-clock-critical-handling.patch b/queue-5.4/clk-clk-flexgen-fix-clock-critical-handling.patch new file mode 100644 index 00000000000..ae1cbfaf6e0 --- /dev/null +++ b/queue-5.4/clk-clk-flexgen-fix-clock-critical-handling.patch @@ -0,0 +1,37 @@ +From 6290d55d25ad010e32728ee07250729e4115af60 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 22 Mar 2020 15:07:40 +0100 +Subject: clk: clk-flexgen: fix clock-critical handling + +From: Alain Volmat + +[ 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 +Link: https://lkml.kernel.org/r/20200322140740.3970-1-avolmat@me.com +Reviewed-by: Patrice Chotard +Signed-off-by: Stephen Boyd +Signed-off-by: Sasha Levin +--- + 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.4/clk-meson-meson8b-don-t-rely-on-u-boot-to-init-all-g.patch b/queue-5.4/clk-meson-meson8b-don-t-rely-on-u-boot-to-init-all-g.patch new file mode 100644 index 00000000000..419d05ea644 --- /dev/null +++ b/queue-5.4/clk-meson-meson8b-don-t-rely-on-u-boot-to-init-all-g.patch @@ -0,0 +1,84 @@ +From 3dd6534e16a1ce7f2f249ec4c72e447d97dea6cd Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Signed-off-by: Jerome Brunet +Link: https://lore.kernel.org/r/20200501215717.735393-1-martin.blumenstingl@googlemail.com +Signed-off-by: Sasha Levin +--- + 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 4f9b79ed79d7d..082178a0f41a3 100644 +--- a/drivers/clk/meson/meson8b.c ++++ b/drivers/clk/meson/meson8b.c +@@ -1910,6 +1910,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 */ }, +@@ -1943,6 +1950,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.4/clk-meson-meson8b-fix-the-first-parent-of-vid_pll_in.patch b/queue-5.4/clk-meson-meson8b-fix-the-first-parent-of-vid_pll_in.patch new file mode 100644 index 00000000000..935e9471d57 --- /dev/null +++ b/queue-5.4/clk-meson-meson8b-fix-the-first-parent-of-vid_pll_in.patch @@ -0,0 +1,48 @@ +From 084ca7b9c3944b075901b0c11f709d8deb28b4e7 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Signed-off-by: Martin Blumenstingl +Signed-off-by: Jerome Brunet +Link: https://lore.kernel.org/r/20200417184127.1319871-2-martin.blumenstingl@googlemail.com +Signed-off-by: Sasha Levin +--- + 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 8856ce476ccfa..ab0b56daec548 100644 +--- a/drivers/clk/meson/meson8b.c ++++ b/drivers/clk/meson/meson8b.c +@@ -1071,7 +1071,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.4/clk-meson-meson8b-fix-the-polarity-of-the-reset_n-li.patch b/queue-5.4/clk-meson-meson8b-fix-the-polarity-of-the-reset_n-li.patch new file mode 100644 index 00000000000..179bea46d52 --- /dev/null +++ b/queue-5.4/clk-meson-meson8b-fix-the-polarity-of-the-reset_n-li.patch @@ -0,0 +1,167 @@ +From cbef9aca390754672d40aae7cc734e24da7aae9b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 17 Apr 2020 20:41:25 +0200 +Subject: clk: meson: meson8b: Fix the polarity of the RESET_N lines + +From: Martin Blumenstingl + +[ 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 +Signed-off-by: Jerome Brunet +Link: https://lore.kernel.org/r/20200417184127.1319871-3-martin.blumenstingl@googlemail.com +Signed-off-by: Sasha Levin +--- + 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 ab0b56daec548..52337a100a90d 100644 +--- a/drivers/clk/meson/meson8b.c ++++ b/drivers/clk/meson/meson8b.c +@@ -3491,54 +3491,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, + }, + }; + +@@ -3547,22 +3580,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.4/clk-meson-meson8b-fix-the-vclk_div-1-2-4-6-12-_en-ga.patch b/queue-5.4/clk-meson-meson8b-fix-the-vclk_div-1-2-4-6-12-_en-ga.patch new file mode 100644 index 00000000000..4cd5aa40138 --- /dev/null +++ b/queue-5.4/clk-meson-meson8b-fix-the-vclk_div-1-2-4-6-12-_en-ga.patch @@ -0,0 +1,81 @@ +From b4265a259485a9cf779581a33f8bf12e4aec5482 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Signed-off-by: Jerome Brunet +Link: https://lore.kernel.org/r/20200417184127.1319871-4-martin.blumenstingl@googlemail.com +Signed-off-by: Sasha Levin +--- + 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 52337a100a90d..4f9b79ed79d7d 100644 +--- a/drivers/clk/meson/meson8b.c ++++ b/drivers/clk/meson/meson8b.c +@@ -1207,7 +1207,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){ +@@ -1237,7 +1237,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){ +@@ -1267,7 +1267,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){ +@@ -1297,7 +1297,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){ +@@ -1327,7 +1327,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.4/clk-qcom-msm8916-fix-the-address-location-of-pll-con.patch b/queue-5.4/clk-qcom-msm8916-fix-the-address-location-of-pll-con.patch new file mode 100644 index 00000000000..383feb0beeb --- /dev/null +++ b/queue-5.4/clk-qcom-msm8916-fix-the-address-location-of-pll-con.patch @@ -0,0 +1,94 @@ +From 4990b73dbb11ca6eefbbcdb22469e0b39a40e3f3 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Cc: Andy Gross +Cc: Bjorn Andersson +Cc: Michael Turquette +Cc: Stephen Boyd +Signed-off-by: Bryan O'Donoghue +Link: https://lkml.kernel.org/r/20200329124116.4185447-1-bryan.odonoghue@linaro.org +Signed-off-by: Stephen Boyd +Signed-off-by: Sasha Levin +--- + 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.4/clk-renesas-cpg-mssr-fix-stbcr-suspend-resume-handli.patch b/queue-5.4/clk-renesas-cpg-mssr-fix-stbcr-suspend-resume-handli.patch new file mode 100644 index 00000000000..b54d715d1a5 --- /dev/null +++ b/queue-5.4/clk-renesas-cpg-mssr-fix-stbcr-suspend-resume-handli.patch @@ -0,0 +1,60 @@ +From b2de5977e8eb770ed34973faa30853cf938175bc Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 7 May 2020 09:47:13 +0200 +Subject: clk: renesas: cpg-mssr: Fix STBCR suspend/resume handling + +From: Geert Uytterhoeven + +[ 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 +Link: https://lore.kernel.org/r/20200507074713.30113-1-geert+renesas@glider.be +Signed-off-by: Sasha Levin +--- + 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 132cc96895e3a..6f9612c169afe 100644 +--- a/drivers/clk/renesas/renesas-cpg-mssr.c ++++ b/drivers/clk/renesas/renesas-cpg-mssr.c +@@ -800,7 +800,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)); + } + +@@ -860,8 +861,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.4/clk-samsung-exynos5433-add-ignore_unused-flag-to-scl.patch b/queue-5.4/clk-samsung-exynos5433-add-ignore_unused-flag-to-scl.patch new file mode 100644 index 00000000000..01d38c052e2 --- /dev/null +++ b/queue-5.4/clk-samsung-exynos5433-add-ignore_unused-flag-to-scl.patch @@ -0,0 +1,68 @@ +From 01ead0c6d950a411fd0dc27fa765c670096a57af Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 19 May 2020 12:26:52 +0200 +Subject: clk: samsung: exynos5433: Add IGNORE_UNUSED flag to sclk_i2s1 + +From: Marek Szyprowski + +[ 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 +Signed-off-by: Sylwester Nawrocki +Signed-off-by: Sasha Levin +--- + 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.4/clk-samsung-mark-top-isp-and-cam-clocks-on-exynos542.patch b/queue-5.4/clk-samsung-mark-top-isp-and-cam-clocks-on-exynos542.patch new file mode 100644 index 00000000000..037acf89c57 --- /dev/null +++ b/queue-5.4/clk-samsung-mark-top-isp-and-cam-clocks-on-exynos542.patch @@ -0,0 +1,92 @@ +From 1f435302e39a6242922c9215128365edb1726755 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Acked-by: Chanwoo Choi +Signed-off-by: Sylwester Nawrocki +Signed-off-by: Sasha Levin +--- + 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 27fd274e92f87..dfef5f0833dbe 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), + }; +@@ -940,25 +940,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", +@@ -1158,8 +1158,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.4/clk-sprd-return-correct-type-of-value-for-_sprd_pll_.patch b/queue-5.4/clk-sprd-return-correct-type-of-value-for-_sprd_pll_.patch new file mode 100644 index 00000000000..443bc46fe58 --- /dev/null +++ b/queue-5.4/clk-sprd-return-correct-type-of-value-for-_sprd_pll_.patch @@ -0,0 +1,41 @@ +From 6b8a3eff4dd59c0361b29e0481b8e6a9c7e3aa93 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Link: https://lkml.kernel.org/r/20200519030036.1785-2-zhang.lyra@gmail.com +Reviewed-by: Baolin Wang +Signed-off-by: Stephen Boyd +Signed-off-by: Sasha Levin +--- + 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 640270f51aa56..eb8862752c2b2 100644 +--- a/drivers/clk/sprd/pll.c ++++ b/drivers/clk/sprd/pll.c +@@ -105,7 +105,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.4/clk-sunxi-fix-incorrect-usage-of-round_down.patch b/queue-5.4/clk-sunxi-fix-incorrect-usage-of-round_down.patch new file mode 100644 index 00000000000..147c09d2bbc --- /dev/null +++ b/queue-5.4/clk-sunxi-fix-incorrect-usage-of-round_down.patch @@ -0,0 +1,39 @@ +From 6802ee6136d155e010cd9874aae3416cfc5f9773 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 17 Mar 2020 22:13:32 +0100 +Subject: clk: sunxi: Fix incorrect usage of round_down() + +From: Rikard Falkeborn + +[ 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 +Signed-off-by: Maxime Ripard +Signed-off-by: Sasha Levin +--- + 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.4/clk-ti-composite-fix-memory-leak.patch b/queue-5.4/clk-ti-composite-fix-memory-leak.patch new file mode 100644 index 00000000000..564d0255af1 --- /dev/null +++ b/queue-5.4/clk-ti-composite-fix-memory-leak.patch @@ -0,0 +1,38 @@ +From 9649f8fc05cd59ed6857a173dc520ba5af8b011f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 29 Apr 2020 16:13:39 +0300 +Subject: clk: ti: composite: fix memory leak + +From: Tero Kristo + +[ 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 +Signed-off-by: Tero Kristo +Link: https://lkml.kernel.org/r/20200429131341.4697-2-t-kristo@ti.com +Acked-by: Tony Lindgren +Signed-off-by: Stephen Boyd +Signed-off-by: Sasha Levin +--- + 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.4/clk-zynqmp-fix-memory-leak-in-zynqmp_register_clocks.patch b/queue-5.4/clk-zynqmp-fix-memory-leak-in-zynqmp_register_clocks.patch new file mode 100644 index 00000000000..ea8d430381f --- /dev/null +++ b/queue-5.4/clk-zynqmp-fix-memory-leak-in-zynqmp_register_clocks.patch @@ -0,0 +1,100 @@ +From b60384a3f19c527f0014767851a765ada05066c5 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 2 Mar 2020 13:50:43 -0800 +Subject: clk: zynqmp: fix memory leak in zynqmp_register_clocks + +From: Quanyang Wang + +[ 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 +Signed-off-by: Michal Simek +Signed-off-by: Tejas Patel +Signed-off-by: Jolly Shah +Link: https://lkml.kernel.org/r/1583185843-20707-5-git-send-email-jolly.shah@xilinx.com +Signed-off-by: Stephen Boyd +Signed-off-by: Sasha Levin +--- + 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 a11f93ecbf34a..6f057ab9df03b 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.4/coresight-tmc-fix-tmc-mode-read-in-tmc_read_prepare_.patch b/queue-5.4/coresight-tmc-fix-tmc-mode-read-in-tmc_read_prepare_.patch new file mode 100644 index 00000000000..077ccdba4a3 --- /dev/null +++ b/queue-5.4/coresight-tmc-fix-tmc-mode-read-in-tmc_read_prepare_.patch @@ -0,0 +1,93 @@ +From 0b22e493ee8d5a4c6ab0664f4e7fb9be2f170dfb Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Suggested-by: Mathieu Poirier +Signed-off-by: Sai Prakash Ranjan +Signed-off-by: Mathieu Poirier +Link: https://lore.kernel.org/r/20200518180242.7916-14-mathieu.poirier@linaro.org +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + 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.4/crypto-omap-sham-add-proper-load-balancing-support-f.patch b/queue-5.4/crypto-omap-sham-add-proper-load-balancing-support-f.patch new file mode 100644 index 00000000000..9e9b66488b7 --- /dev/null +++ b/queue-5.4/crypto-omap-sham-add-proper-load-balancing-support-f.patch @@ -0,0 +1,169 @@ +From 74072ff6831704def632232e407cb735afe63408 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 27 May 2020 15:24:29 +0300 +Subject: crypto: omap-sham - add proper load balancing support for multicore + +From: Tero Kristo + +[ 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 +Signed-off-by: Herbert Xu +Signed-off-by: Sasha Levin +--- + 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 ac80bc6af0930..aba5db3c0588f 100644 +--- a/drivers/crypto/omap-sham.c ++++ b/drivers/crypto/omap-sham.c +@@ -165,8 +165,6 @@ struct omap_sham_hmac_ctx { + }; + + struct omap_sham_ctx { +- struct omap_sham_dev *dd; +- + unsigned long flags; + + /* fallback stuff */ +@@ -918,27 +916,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; + +@@ -1187,8 +1193,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; + +@@ -1198,7 +1203,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; +@@ -1302,21 +1307,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; +@@ -1334,7 +1326,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++) { +@@ -2136,6 +2128,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); +@@ -2163,6 +2156,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; + +@@ -2214,9 +2210,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.4/dev-mem-revoke-mappings-when-a-driver-claims-the-reg.patch b/queue-5.4/dev-mem-revoke-mappings-when-a-driver-claims-the-reg.patch new file mode 100644 index 00000000000..efa2a47451b --- /dev/null +++ b/queue-5.4/dev-mem-revoke-mappings-when-a-driver-claims-the-reg.patch @@ -0,0 +1,263 @@ +From 30ebd1b3eb8b81424370904a24e76fa3a4ab5c06 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 21 May 2020 14:06:17 -0700 +Subject: /dev/mem: Revoke mappings when a driver claims the region + +From: Dan Williams + +[ 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 +Cc: Ingo Molnar +Cc: Kees Cook +Cc: Matthew Wilcox +Cc: Russell King +Cc: Andrew Morton +Cc: Greg Kroah-Hartman +Fixes: 90a545e98126 ("restrict /dev/mem to idle io memory ranges") +Signed-off-by: Dan Williams +Reviewed-by: Kees Cook +Link: https://lore.kernel.org/r/159009507306.847224.8502634072429766747.stgit@dwillia2-desk3.amr.corp.intel.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + 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 + #include + #include ++#include ++#include ++#include + + #ifdef CONFIG_IA64 + # include + #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 7bddddfc76d6a..fdc201d614607 100644 +--- a/include/linux/ioport.h ++++ b/include/linux/ioport.h +@@ -300,5 +300,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 903cc2d2750b2..84ae605c06431 100644 +--- a/include/uapi/linux/magic.h ++++ b/include/uapi/linux/magic.h +@@ -93,6 +93,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 + + #endif /* __LINUX_MAGIC_H__ */ +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.4/dlm-remove-bug-before-panic.patch b/queue-5.4/dlm-remove-bug-before-panic.patch new file mode 100644 index 00000000000..0ff88c4f21a --- /dev/null +++ b/queue-5.4/dlm-remove-bug-before-panic.patch @@ -0,0 +1,51 @@ +From 40c162cdf71c18e0a29d1401d7639a01008de131 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 7 May 2020 23:34:28 +0200 +Subject: dlm: remove BUG() before panic() + +From: Arnd Bergmann + +[ 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 +Cc: clang-built-linux@googlegroups.com +Signed-off-by: Arnd Bergmann +Signed-off-by: David Teigland +Signed-off-by: Sasha Levin +--- + 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.4/dm-mpath-switch-paths-in-dm_blk_ioctl-code-path.patch b/queue-5.4/dm-mpath-switch-paths-in-dm_blk_ioctl-code-path.patch new file mode 100644 index 00000000000..6bf9874370d --- /dev/null +++ b/queue-5.4/dm-mpath-switch-paths-in-dm_blk_ioctl-code-path.patch @@ -0,0 +1,49 @@ +From 41ca6865ff1b30478d74ce9b5bb1870c9730e721 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 20 Apr 2020 22:29:09 +0200 +Subject: dm mpath: switch paths in dm_blk_ioctl() code path + +From: Martin Wilck + +[ 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 +Reviewed-by: Hannes Reinecke +Signed-off-by: Mike Snitzer +Signed-off-by: Sasha Levin +--- + 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 456d790c918c0..f2de4c73cc8fa 100644 +--- a/drivers/md/dm-mpath.c ++++ b/drivers/md/dm-mpath.c +@@ -1856,7 +1856,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.4/dm-zoned-return-null-if-dmz_get_zone_for_reclaim-fai.patch b/queue-5.4/dm-zoned-return-null-if-dmz_get_zone_for_reclaim-fai.patch new file mode 100644 index 00000000000..db8bfdceff4 --- /dev/null +++ b/queue-5.4/dm-zoned-return-null-if-dmz_get_zone_for_reclaim-fai.patch @@ -0,0 +1,64 @@ +From 249d210e290682d97422cfae931e2d12e189d9a5 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Reviewed-by: Damien Le Moal +Signed-off-by: Mike Snitzer +Signed-off-by: Sasha Levin +--- + 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 e0a6cf9239f1c..e6b0039d07aa8 100644 +--- a/drivers/md/dm-zoned-metadata.c ++++ b/drivers/md/dm-zoned-metadata.c +@@ -1589,7 +1589,7 @@ static struct dm_zone *dmz_get_rnd_zone_for_reclaim(struct dmz_metadata *zmd) + return dzone; + } + +- return ERR_PTR(-EBUSY); ++ return NULL; + } + + /* +@@ -1609,7 +1609,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.4/drivers-base-fix-null-pointer-exception-in-__platfor.patch b/queue-5.4/drivers-base-fix-null-pointer-exception-in-__platfor.patch new file mode 100644 index 00000000000..95644cb10a3 --- /dev/null +++ b/queue-5.4/drivers-base-fix-null-pointer-exception-in-__platfor.patch @@ -0,0 +1,85 @@ +From e9dfc6baf1f3e71a5e29efbf5e180ddc85e954af Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Link: https://lore.kernel.org/r/20200408214003.3356-1-sathyanarayanan.kuppuswamy@linux.intel.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/base/platform.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/drivers/base/platform.c b/drivers/base/platform.c +index 604a461848c98..0b67d41bab8ff 100644 +--- a/drivers/base/platform.c ++++ b/drivers/base/platform.c +@@ -802,6 +802,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.4/drivers-perf-hisi-fix-wrong-value-for-all-counters-e.patch b/queue-5.4/drivers-perf-hisi-fix-wrong-value-for-all-counters-e.patch new file mode 100644 index 00000000000..5ce1165f372 --- /dev/null +++ b/queue-5.4/drivers-perf-hisi-fix-wrong-value-for-all-counters-e.patch @@ -0,0 +1,41 @@ +From f7721d9518ffabe73fcad71bf4f3336ace5a0b73 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 5 Jun 2020 17:43:41 +0800 +Subject: drivers/perf: hisi: Fix wrong value for all counters enable + +From: Shaokun Zhang + +[ 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 +Cc: Will Deacon +Cc: Mark Rutland +Link: https://lore.kernel.org/r/1591350221-32275-1-git-send-email-zhangshaokun@hisilicon.com +Signed-off-by: Will Deacon +Signed-off-by: Sasha Levin +--- + 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 078b8dc572503..c5b0950c2a7a9 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.4/drivers-phy-sr-usb-do-not-use-internal-fsm-for-usb2-.patch b/queue-5.4/drivers-phy-sr-usb-do-not-use-internal-fsm-for-usb2-.patch new file mode 100644 index 00000000000..fa7eef0cdd6 --- /dev/null +++ b/queue-5.4/drivers-phy-sr-usb-do-not-use-internal-fsm-for-usb2-.patch @@ -0,0 +1,150 @@ +From 8a0c0c72965bf1b7755cb170804b80d1f16c9a18 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Signed-off-by: Rayagonda Kokatanur +Link: https://lore.kernel.org/r/20200513173947.10919-1-rayagonda.kokatanur@broadcom.com +Signed-off-by: Kishon Vijay Abraham I +Signed-off-by: Sasha Levin +--- + 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.4/drm-amd-display-revalidate-bandwidth-before-commitin.patch b/queue-5.4/drm-amd-display-revalidate-bandwidth-before-commitin.patch new file mode 100644 index 00000000000..8d88db2d057 --- /dev/null +++ b/queue-5.4/drm-amd-display-revalidate-bandwidth-before-commitin.patch @@ -0,0 +1,61 @@ +From 1a4d4f87f8ef4039dc49d618eb8fd94130eb33db Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 2 Jun 2020 20:42:33 -0400 +Subject: drm/amd/display: Revalidate bandwidth before commiting DC updates + +From: Nicholas Kazlauskas + +[ 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 +Reviewed-by: Hersen Wu +Signed-off-by: Alex Deucher +Signed-off-by: Sasha Levin +--- + 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 2028dc017f7a0..b95a58aa82d91 100644 +--- a/drivers/gpu/drm/amd/display/dc/core/dc.c ++++ b/drivers/gpu/drm/amd/display/dc/core/dc.c +@@ -2230,6 +2230,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.4/drm-encoder_slave-fix-refcouting-error-for-modules.patch b/queue-5.4/drm-encoder_slave-fix-refcouting-error-for-modules.patch new file mode 100644 index 00000000000..f625784ee39 --- /dev/null +++ b/queue-5.4/drm-encoder_slave-fix-refcouting-error-for-modules.patch @@ -0,0 +1,50 @@ +From 51ba17b16faa4fecf3f630b54e7916636dbf0b70 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 15 Jun 2020 09:58:10 +0200 +Subject: drm: encoder_slave: fix refcouting error for modules + +From: Wolfram Sang + +[ 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 +Reviewed-by: Emil Velikov +Acked-by: Daniel Vetter +Signed-off-by: Wolfram Sang +Signed-off-by: Sasha Levin +--- + 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.4/drm-msm-mdp5-fix-mdp5_init-error-path-for-failed-mdp.patch b/queue-5.4/drm-msm-mdp5-fix-mdp5_init-error-path-for-failed-mdp.patch new file mode 100644 index 00000000000..43ee1f5044d --- /dev/null +++ b/queue-5.4/drm-msm-mdp5-fix-mdp5_init-error-path-for-failed-mdp.patch @@ -0,0 +1,37 @@ +From 3a83985f4f1eeb31e1e892b157a51fd85e153353 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Reviewed-by: Abhinav Kumar +Signed-off-by: Rob Clark +Signed-off-by: Sasha Levin +--- + 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 91cd76a2bab11..77823ccdd0f8f 100644 +--- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c ++++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c +@@ -1037,7 +1037,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.4/drm-nouveau-disp-gm200-fix-nv_pdisp_sor_hdmi2_ctrl-n.patch b/queue-5.4/drm-nouveau-disp-gm200-fix-nv_pdisp_sor_hdmi2_ctrl-n.patch new file mode 100644 index 00000000000..f64dc339b4d --- /dev/null +++ b/queue-5.4/drm-nouveau-disp-gm200-fix-nv_pdisp_sor_hdmi2_ctrl-n.patch @@ -0,0 +1,40 @@ +From 795c9f1b6a9c1388ce95c3c1bdf6ccd1ea2f5c81 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Signed-off-by: Sasha Levin +--- + 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.4/drm-sun4i-hdmi-ddc-clk-fix-size-of-m-divider.patch b/queue-5.4/drm-sun4i-hdmi-ddc-clk-fix-size-of-m-divider.patch new file mode 100644 index 00000000000..482d45d61cc --- /dev/null +++ b/queue-5.4/drm-sun4i-hdmi-ddc-clk-fix-size-of-m-divider.patch @@ -0,0 +1,51 @@ +From 1b4c1297e44c0b9e1158e9276458741ebf0a95a5 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 13 Apr 2020 11:54:57 +0200 +Subject: drm/sun4i: hdmi ddc clk: Fix size of m divider + +From: Jernej Skrabec + +[ 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 +Reviewed-by: Chen-Yu Tsai +Signed-off-by: Maxime Ripard +Link: https://patchwork.freedesktop.org/patch/msgid/20200413095457.1176754-1-jernej.skrabec@siol.net +Signed-off-by: Sasha Levin +--- + 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.4/ext4-stop-overwrite-the-errcode-in-ext4_setup_super.patch b/queue-5.4/ext4-stop-overwrite-the-errcode-in-ext4_setup_super.patch new file mode 100644 index 00000000000..576976852ec --- /dev/null +++ b/queue-5.4/ext4-stop-overwrite-the-errcode-in-ext4_setup_super.patch @@ -0,0 +1,38 @@ +From d5ee26390cc5e050e97c1c3d36b02b2a69ffe996 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 1 Jun 2020 15:34:04 +0800 +Subject: ext4: stop overwrite the errcode in ext4_setup_super + +From: yangerkun + +[ 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 +Reviewed-by: Jan Kara +Link: https://lore.kernel.org/r/20200601073404.3712492-1-yangerkun@huawei.com +Signed-off-by: Theodore Ts'o +Signed-off-by: Sasha Levin +--- + fs/ext4/super.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/fs/ext4/super.c b/fs/ext4/super.c +index d3500eaf900e2..830160ad07a63 100644 +--- a/fs/ext4/super.c ++++ b/fs/ext4/super.c +@@ -2294,6 +2294,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.4/extcon-adc-jack-fix-an-error-handling-path-in-adc_ja.patch b/queue-5.4/extcon-adc-jack-fix-an-error-handling-path-in-adc_ja.patch new file mode 100644 index 00000000000..0fcc8af9baa --- /dev/null +++ b/queue-5.4/extcon-adc-jack-fix-an-error-handling-path-in-adc_ja.patch @@ -0,0 +1,49 @@ +From 29984924cba0a58b86d6f595c1599c2fa6bb4b3d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Signed-off-by: Chanwoo Choi +Signed-off-by: Sasha Levin +--- + 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.4/f2fs-don-t-return-vmalloc-memory-from-f2fs_kmalloc.patch b/queue-5.4/f2fs-don-t-return-vmalloc-memory-from-f2fs_kmalloc.patch new file mode 100644 index 00000000000..2a33b590901 --- /dev/null +++ b/queue-5.4/f2fs-don-t-return-vmalloc-memory-from-f2fs_kmalloc.patch @@ -0,0 +1,114 @@ +From 62ceba4520ea6515839c0e5625c055222f7f3e14 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 4 Jun 2020 21:57:48 -0700 +Subject: f2fs: don't return vmalloc() memory from f2fs_kmalloc() + +From: Eric Biggers + +[ 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 +Reviewed-by: Chao Yu +Signed-off-by: Jaegeuk Kim +Signed-off-by: Sasha Levin +--- + 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 a28ffecc0f95a..bbd07fe8a4921 100644 +--- a/fs/f2fs/checkpoint.c ++++ b/fs/f2fs/checkpoint.c +@@ -892,8 +892,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 a26ea1e6ba88f..c22ca7d867ee5 100644 +--- a/fs/f2fs/f2fs.h ++++ b/fs/f2fs/f2fs.h +@@ -2790,18 +2790,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(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 f14401a77d601..90a20bd129614 100644 +--- a/fs/f2fs/node.c ++++ b/fs/f2fs/node.c +@@ -2933,7 +2933,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; +@@ -3066,9 +3066,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 d89c85177e092..f4b882ee48ddf 100644 +--- a/fs/f2fs/super.c ++++ b/fs/f2fs/super.c +@@ -2901,7 +2901,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.4/f2fs-handle-readonly-filesystem-in-f2fs_ioc_shutdown.patch b/queue-5.4/f2fs-handle-readonly-filesystem-in-f2fs_ioc_shutdown.patch new file mode 100644 index 00000000000..32e11622b73 --- /dev/null +++ b/queue-5.4/f2fs-handle-readonly-filesystem-in-f2fs_ioc_shutdown.patch @@ -0,0 +1,44 @@ +From cdba48b79bb71e6b4679e6033988e413fe2b546c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 8 Jun 2020 20:03:16 +0800 +Subject: f2fs: handle readonly filesystem in f2fs_ioc_shutdown() + +From: Chao Yu + +[ 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 +Signed-off-by: Jaegeuk Kim +Signed-off-by: Sasha Levin +--- + 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 c3a9da79ac997..5d94abe467a4f 100644 +--- a/fs/f2fs/file.c ++++ b/fs/f2fs/file.c +@@ -2056,8 +2056,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.4/f2fs-report-delalloc-reserve-as-non-free-in-statfs-f.patch b/queue-5.4/f2fs-report-delalloc-reserve-as-non-free-in-statfs-f.patch new file mode 100644 index 00000000000..e67286571e3 --- /dev/null +++ b/queue-5.4/f2fs-report-delalloc-reserve-as-non-free-in-statfs-f.patch @@ -0,0 +1,41 @@ +From a3b72059b90f595ba99a7797d0cc4301c90ac89d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Reviewed-by: Chao Yu +Signed-off-by: Jaegeuk Kim +Signed-off-by: Sasha Levin +--- + 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 e36543c9f2b78..d89c85177e092 100644 +--- a/fs/f2fs/super.c ++++ b/fs/f2fs/super.c +@@ -1230,7 +1230,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.4/firmware-imx-scu-fix-possible-memory-leak-in-imx_scu.patch b/queue-5.4/firmware-imx-scu-fix-possible-memory-leak-in-imx_scu.patch new file mode 100644 index 00000000000..678a7b847be --- /dev/null +++ b/queue-5.4/firmware-imx-scu-fix-possible-memory-leak-in-imx_scu.patch @@ -0,0 +1,37 @@ +From 1ddf71d3bf15242f4871cc83d62a1c34890e4a50 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 6 May 2020 05:14:10 +0000 +Subject: firmware: imx: scu: Fix possible memory leak in imx_scu_probe() + +From: Wei Yongjun + +[ 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 +Reviewed-by: Dong Aisheng +Signed-off-by: Shawn Guo +Signed-off-by: Sasha Levin +--- + 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 e48d971ffb617..a3b11bc71dcb8 100644 +--- a/drivers/firmware/imx/imx-scu.c ++++ b/drivers/firmware/imx/imx-scu.c +@@ -300,6 +300,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.4/firmware-qcom_scm-fix-bogous-abuse-of-dma-direct-int.patch b/queue-5.4/firmware-qcom_scm-fix-bogous-abuse-of-dma-direct-int.patch new file mode 100644 index 00000000000..678643f28ef --- /dev/null +++ b/queue-5.4/firmware-qcom_scm-fix-bogous-abuse-of-dma-direct-int.patch @@ -0,0 +1,72 @@ +From 0901186dcb48aeb6bdfca311f52a7e6671ad86e4 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 14 Apr 2020 14:31:36 +0200 +Subject: firmware: qcom_scm: fix bogous abuse of dma-direct internals + +From: Christoph Hellwig + +[ 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 +Signed-off-by: Christoph Hellwig +Link: https://lore.kernel.org/r/20200414123136.441454-1-hch@lst.de +Signed-off-by: Bjorn Andersson +Signed-off-by: Sasha Levin +--- + 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 4802ab170fe51..b9fdc20b4eb9b 100644 +--- a/drivers/firmware/qcom_scm.c ++++ b/drivers/firmware/qcom_scm.c +@@ -9,7 +9,6 @@ + #include + #include + #include +-#include + #include + #include + #include +@@ -441,8 +440,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; +@@ -459,10 +457,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; +@@ -490,7 +487,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.4/fpga-dfl-afu-corrected-error-handling-levels.patch b/queue-5.4/fpga-dfl-afu-corrected-error-handling-levels.patch new file mode 100644 index 00000000000..c89d4e07dda --- /dev/null +++ b/queue-5.4/fpga-dfl-afu-corrected-error-handling-levels.patch @@ -0,0 +1,44 @@ +From ad20ce9e843be4e618a5a4afa68844aa4dabbf0d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 18 May 2020 23:49:51 +0530 +Subject: fpga: dfl: afu: Corrected error handling levels + +From: Souptick Joarder + +[ 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 +Acked-by: Wu Hao +Reviewed-by: Xu Yilun +Link: https://lore.kernel.org/r/1589825991-3545-1-git-send-email-jrdr.linux@gmail.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + 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.4/fuse-copy_file_range-should-truncate-cache.patch b/queue-5.4/fuse-copy_file_range-should-truncate-cache.patch new file mode 100644 index 00000000000..ee2b91b324a --- /dev/null +++ b/queue-5.4/fuse-copy_file_range-should-truncate-cache.patch @@ -0,0 +1,66 @@ +From 79963f6b6c41113f5c7c3e3cc458667a567f85de Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 20 May 2020 11:39:35 +0200 +Subject: fuse: copy_file_range should truncate cache + +From: Miklos Szeredi + +[ 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 +Signed-off-by: Sasha Levin +--- + fs/fuse/file.c | 22 ++++++++++++++++++++++ + 1 file changed, 22 insertions(+) + +diff --git a/fs/fuse/file.c b/fs/fuse/file.c +index e730e3d8ad996..66214707a9456 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.4/fuse-fix-copy_file_range-cache-issues.patch b/queue-5.4/fuse-fix-copy_file_range-cache-issues.patch new file mode 100644 index 00000000000..e96917de9e4 --- /dev/null +++ b/queue-5.4/fuse-fix-copy_file_range-cache-issues.patch @@ -0,0 +1,63 @@ +From 189b992adc5feb11a9e5371bb8f003aec4dc74d6 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 20 May 2020 11:39:35 +0200 +Subject: fuse: fix copy_file_range cache issues + +From: Miklos Szeredi + +[ 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 +Signed-off-by: Sasha Levin +--- + 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 713d55a61890e..e730e3d8ad996 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.4/geneve-change-from-tx_error-to-tx_dropped-on-missing.patch b/queue-5.4/geneve-change-from-tx_error-to-tx_dropped-on-missing.patch new file mode 100644 index 00000000000..49c3f4989c0 --- /dev/null +++ b/queue-5.4/geneve-change-from-tx_error-to-tx_dropped-on-missing.patch @@ -0,0 +1,64 @@ +From 5bd147962685205ac63f3e17d1f2af23d9d5ecec Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 3 Jun 2020 11:12:14 +0200 +Subject: geneve: change from tx_error to tx_dropped on missing metadata + +From: Jiri Benc + +[ 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 +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + 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 aa101f72d4055..cac75c7d1d018 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.4/gfs2-allow-lock_nolock-mount-to-specify-jid-x.patch b/queue-5.4/gfs2-allow-lock_nolock-mount-to-specify-jid-x.patch new file mode 100644 index 00000000000..b63234717d9 --- /dev/null +++ b/queue-5.4/gfs2-allow-lock_nolock-mount-to-specify-jid-x.patch @@ -0,0 +1,46 @@ +From 2ab602cbf572d5fb24a12bc830808dec1c421cb9 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 29 Apr 2020 08:45:54 -0500 +Subject: gfs2: Allow lock_nolock mount to specify jid=X + +From: Bob Peterson + +[ 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" + +Resulted in: +mount: wrong fs type, bad option, bad superblock on + +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 +Signed-off-by: Andreas Gruenbacher +Signed-off-by: Sasha Levin +--- + 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 18daf494abab9..c26c864590cc3 100644 +--- a/fs/gfs2/ops_fstype.c ++++ b/fs/gfs2/ops_fstype.c +@@ -911,7 +911,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.4/gfs2-fix-use-after-free-on-transaction-ail-lists.patch b/queue-5.4/gfs2-fix-use-after-free-on-transaction-ail-lists.patch new file mode 100644 index 00000000000..bd1f0c0bc70 --- /dev/null +++ b/queue-5.4/gfs2-fix-use-after-free-on-transaction-ail-lists.patch @@ -0,0 +1,79 @@ +From b91954d6dad7ef3a2efc06c99ecb12b862342306 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 4 Jun 2020 14:28:58 -0500 +Subject: gfs2: fix use-after-free on transaction ail lists + +From: Bob Peterson + +[ 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 +Signed-off-by: Andreas Gruenbacher +Signed-off-by: Sasha Levin +--- + 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 110e5c4db8192..a4b6a49462a41 100644 +--- a/fs/gfs2/log.c ++++ b/fs/gfs2/log.c +@@ -881,8 +881,10 @@ void gfs2_log_flush(struct gfs2_sbd *sdp, struct gfs2_glock *gl, u32 flags) + * @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; +@@ -893,6 +895,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) +@@ -904,7 +911,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.4/gpio-dwapb-append-module_alias-for-platform-driver.patch b/queue-5.4/gpio-dwapb-append-module_alias-for-platform-driver.patch new file mode 100644 index 00000000000..24e70f60bb6 --- /dev/null +++ b/queue-5.4/gpio-dwapb-append-module_alias-for-platform-driver.patch @@ -0,0 +1,77 @@ +From 778649b5ba5af4f26c58121e7a2d3d3b11794e50 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 15 Apr 2020 17:15:21 +0300 +Subject: gpio: dwapb: Append MODULE_ALIAS for platform driver + +From: Andy Shevchenko + +[ 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 +Tested-by: Serge Semin +Reviewed-by: Serge Semin +Link: https://lore.kernel.org/r/20200415141534.31240-2-andriy.shevchenko@linux.intel.com +Signed-off-by: Linus Walleij +Signed-off-by: Sasha Levin +--- + 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.4/gpio-dwapb-call-acpi_gpiochip_free_interrupts-on-gpi.patch b/queue-5.4/gpio-dwapb-call-acpi_gpiochip_free_interrupts-on-gpi.patch new file mode 100644 index 00000000000..00accda1557 --- /dev/null +++ b/queue-5.4/gpio-dwapb-call-acpi_gpiochip_free_interrupts-on-gpi.patch @@ -0,0 +1,78 @@ +From 461433a28289261f470092296f66cb018e07a83a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Tested-by: Serge Semin +Acked-by: Serge Semin +Link: https://lore.kernel.org/r/20200519131233.59032-1-andriy.shevchenko@linux.intel.com +Signed-off-by: Linus Walleij +Signed-off-by: Sasha Levin +--- + 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.4/gpio-pca953x-fix-handling-of-automatic-address-incre.patch b/queue-5.4/gpio-pca953x-fix-handling-of-automatic-address-incre.patch new file mode 100644 index 00000000000..8f989db9b77 --- /dev/null +++ b/queue-5.4/gpio-pca953x-fix-handling-of-automatic-address-incre.patch @@ -0,0 +1,146 @@ +From 23860ad0c679cb1e25b972f10615546873f490b5 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Signed-off-by: Uwe Kleine-König +Tested-by: Andy Shevchenko +Reviewed-by: Andy Shevchenko +Signed-off-by: Andy Shevchenko +Signed-off-by: Bartosz Golaszewski +Signed-off-by: Sasha Levin +--- + 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 3edc1762803ac..29ba26742c8f5 100644 +--- a/drivers/gpio/gpio-pca953x.c ++++ b/drivers/gpio/gpio-pca953x.c +@@ -306,8 +306,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, +@@ -318,18 +332,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; + } + +@@ -897,6 +899,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(struct pca953x_chip), GFP_KERNEL); +@@ -960,7 +963,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; +@@ -991,7 +1004,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.4/habanalabs-increase-timeout-during-reset.patch b/queue-5.4/habanalabs-increase-timeout-during-reset.patch new file mode 100644 index 00000000000..c218df6508d --- /dev/null +++ b/queue-5.4/habanalabs-increase-timeout-during-reset.patch @@ -0,0 +1,44 @@ +From 63fce80d1bcbe3665c6c69ec60526f09edf81c99 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 27 Mar 2020 16:38:37 +0300 +Subject: habanalabs: increase timeout during reset + +From: Oded Gabbay + +[ 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 +Signed-off-by: Oded Gabbay +Signed-off-by: Sasha Levin +--- + 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 75862be53c60e..30addffd76f53 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.4/hid-add-quirks-for-trust-panora-graphic-tablet.patch b/queue-5.4/hid-add-quirks-for-trust-panora-graphic-tablet.patch new file mode 100644 index 00000000000..d30a1a90c30 --- /dev/null +++ b/queue-5.4/hid-add-quirks-for-trust-panora-graphic-tablet.patch @@ -0,0 +1,75 @@ +From 267da1ef881a3a27e6aaa3e5f9ffa10304b4e7be Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 8 May 2020 17:26:04 +0200 +Subject: HID: Add quirks for Trust Panora Graphic Tablet + +From: Cristian Klein + +[ 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 +Signed-off-by: Jiri Kosina +Signed-off-by: Sasha Levin +--- + 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 13b7222ef2c91..c552a6bc627eb 100644 +--- a/drivers/hid/hid-ids.h ++++ b/drivers/hid/hid-ids.h +@@ -1147,6 +1147,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 90ec2390ef688..168fdaa1999fe 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.4/hid-intel-ish-hid-avoid-bogus-uninitialized-variable.patch b/queue-5.4/hid-intel-ish-hid-avoid-bogus-uninitialized-variable.patch new file mode 100644 index 00000000000..39adf18c0eb --- /dev/null +++ b/queue-5.4/hid-intel-ish-hid-avoid-bogus-uninitialized-variable.patch @@ -0,0 +1,56 @@ +From 457c23cbc288b7ae8846abd755079ab020ebadee Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 28 Apr 2020 23:53:29 +0200 +Subject: HID: intel-ish-hid: avoid bogus uninitialized-variable warning + +From: Arnd Bergmann + +[ 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 :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 +Acked-by: Srinivas Pandruvada +Signed-off-by: Jiri Kosina +Signed-off-by: Sasha Levin +--- + 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.4/i2c-icy-fix-build-with-config_amiga_pcmcia-n.patch b/queue-5.4/i2c-icy-fix-build-with-config_amiga_pcmcia-n.patch new file mode 100644 index 00000000000..b6675f35cf1 --- /dev/null +++ b/queue-5.4/i2c-icy-fix-build-with-config_amiga_pcmcia-n.patch @@ -0,0 +1,39 @@ +From fd6f86d6fc425defcc191094869e370603568b57 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 7 Jun 2020 20:28:12 +0200 +Subject: i2c: icy: Fix build with CONFIG_AMIGA_PCMCIA=n + +From: Max Staudt + +[ 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 +Signed-off-by: Max Staudt +Signed-off-by: Wolfram Sang +Signed-off-by: Sasha Levin +--- + 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 8382eb64b4241..d6c17506dba4a 100644 +--- a/drivers/i2c/busses/i2c-icy.c ++++ b/drivers/i2c/busses/i2c-icy.c +@@ -43,6 +43,7 @@ + #include + #include + ++#include + #include + #include + +-- +2.25.1 + diff --git a/queue-5.4/i2c-piix4-detect-secondary-smbus-controller-on-amd-a.patch b/queue-5.4/i2c-piix4-detect-secondary-smbus-controller-on-amd-a.patch new file mode 100644 index 00000000000..44cf48df0c0 --- /dev/null +++ b/queue-5.4/i2c-piix4-detect-secondary-smbus-controller-on-amd-a.patch @@ -0,0 +1,51 @@ +From b5ed650865ade102c02bac239cece34f9ee2aef8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 10 Apr 2020 15:48:44 -0500 +Subject: i2c: piix4: Detect secondary SMBus controller on AMD AM4 chipsets + +From: Adam Honse + +[ 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 +Reviewed-by: Jean Delvare +Reviewed-by: Sebastian Reichel +Tested-by: Sebastian Reichel +Signed-off-by: Wolfram Sang +Signed-off-by: Sasha Levin +--- + 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.4/i2c-pxa-clear-all-master-action-bits-in-i2c_pxa_stop.patch b/queue-5.4/i2c-pxa-clear-all-master-action-bits-in-i2c_pxa_stop.patch new file mode 100644 index 00000000000..2a25b960b34 --- /dev/null +++ b/queue-5.4/i2c-pxa-clear-all-master-action-bits-in-i2c_pxa_stop.patch @@ -0,0 +1,45 @@ +From 060d30ba9ca8edadbe64114a4e05a2a8cee48c25 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Signed-off-by: Wolfram Sang +Signed-off-by: Sasha Levin +--- + 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 2c3c3d6935c0f..c9cbc9894bacf 100644 +--- a/drivers/i2c/busses/i2c-pxa.c ++++ b/drivers/i2c/busses/i2c-pxa.c +@@ -706,11 +706,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.4/i2c-pxa-fix-i2c_pxa_scream_blue_murder-debug-output.patch b/queue-5.4/i2c-pxa-fix-i2c_pxa_scream_blue_murder-debug-output.patch new file mode 100644 index 00000000000..46692d93a89 --- /dev/null +++ b/queue-5.4/i2c-pxa-fix-i2c_pxa_scream_blue_murder-debug-output.patch @@ -0,0 +1,54 @@ +From 88617d5fdfc6720374ffbcef0f46b93414aa1151 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 27 Apr 2020 19:49:22 +0100 +Subject: i2c: pxa: fix i2c_pxa_scream_blue_murder() debug output + +From: Russell King + +[ 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 +Signed-off-by: Wolfram Sang +Signed-off-by: Sasha Levin +--- + 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 c9cbc9894bacf..d0c557c8d80f5 100644 +--- a/drivers/i2c/busses/i2c-pxa.c ++++ b/drivers/i2c/busses/i2c-pxa.c +@@ -312,11 +312,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.4/iavf-fix-speed-reporting-over-virtchnl.patch b/queue-5.4/iavf-fix-speed-reporting-over-virtchnl.patch new file mode 100644 index 00000000000..69696f6c6f4 --- /dev/null +++ b/queue-5.4/iavf-fix-speed-reporting-over-virtchnl.patch @@ -0,0 +1,330 @@ +From b5b3f743b2e76edb4508b34eda16e80c004127ce Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 5 Jun 2020 10:09:43 -0700 +Subject: iavf: fix speed reporting over virtchnl + +From: Brett Creeley + +[ 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 +Signed-off-by: Sergey Nemov +Signed-off-by: Paul Greenwalt +Signed-off-by: Tony Nguyen +Signed-off-by: Jeff Kirsher +Signed-off-by: Sasha Levin +--- + 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 bd1b1ed323f4f..6b9117a350fac 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 dad3eec8ccd86..758bef02a2a86 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 8e16be960e96b..bacc5fb7eba2c 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 1ab9cb339acb4..9655318803b71 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; +@@ -918,6 +919,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 +@@ -927,37 +930,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; + } + + /** +@@ -1187,12 +1252,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.4/ib-cma-fix-ports-memory-leak-in-cma_configfs.patch b/queue-5.4/ib-cma-fix-ports-memory-leak-in-cma_configfs.patch new file mode 100644 index 00000000000..7f7405431a6 --- /dev/null +++ b/queue-5.4/ib-cma-fix-ports-memory-leak-in-cma_configfs.patch @@ -0,0 +1,54 @@ +From bd3a5d10efc804633df15b30269221d3868513ab Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 21 May 2020 10:26:50 +0300 +Subject: IB/cma: Fix ports memory leak in cma_configfs + +From: Maor Gottlieb + +[ 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 +Signed-off-by: Leon Romanovsky +Signed-off-by: Jason Gunthorpe +Signed-off-by: Sasha Levin +--- + 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 8b0b5ae22e4c8..726e70b682497 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.4/ib-mlx5-fix-devx-support-for-mlx5_cmd_op_init2init_q.patch b/queue-5.4/ib-mlx5-fix-devx-support-for-mlx5_cmd_op_init2init_q.patch new file mode 100644 index 00000000000..e7c27ab376e --- /dev/null +++ b/queue-5.4/ib-mlx5-fix-devx-support-for-mlx5_cmd_op_init2init_q.patch @@ -0,0 +1,43 @@ +From c301d8e5f0a24ef35244948799b513847847e897 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Reviewed-by: Maor Gottlieb +Signed-off-by: Leon Romanovsky +Signed-off-by: Jason Gunthorpe +Signed-off-by: Sasha Levin +--- + 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 bba7ab0784305..fd75a9043bf15 100644 +--- a/drivers/infiniband/hw/mlx5/devx.c ++++ b/drivers/infiniband/hw/mlx5/devx.c +@@ -489,6 +489,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.4/iio-bmp280-fix-compensation-of-humidity.patch b/queue-5.4/iio-bmp280-fix-compensation-of-humidity.patch new file mode 100644 index 00000000000..48a1341b6a7 --- /dev/null +++ b/queue-5.4/iio-bmp280-fix-compensation-of-humidity.patch @@ -0,0 +1,50 @@ +From 76052095a16f6cc76e05e380230b0fb1b9e6bdda Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 4 May 2020 20:10:34 +0200 +Subject: iio: bmp280: fix compensation of humidity + +From: Andreas Klinger + +[ 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 +Signed-off-by: Jonathan Cameron +Signed-off-by: Sasha Levin +--- + 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 084a1d56cc2f0..0a95afaa48fe6 100644 +--- a/drivers/iio/pressure/bmp280-core.c ++++ b/drivers/iio/pressure/bmp280-core.c +@@ -264,6 +264,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.4/iio-pressure-bmp280-tolerate-irq-before-registering.patch b/queue-5.4/iio-pressure-bmp280-tolerate-irq-before-registering.patch new file mode 100644 index 00000000000..3b7be295c92 --- /dev/null +++ b/queue-5.4/iio-pressure-bmp280-tolerate-irq-before-registering.patch @@ -0,0 +1,58 @@ +From 3920618cf3e3466325c5bed90042f80c0abb5ca7 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 23 Mar 2020 12:41:25 +0200 +Subject: iio: pressure: bmp280: Tolerate IRQ before registering + +From: Andy Shevchenko + +[ 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] +[ 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 +Acked-by: Linus Walleij +Signed-off-by: Jonathan Cameron +Signed-off-by: Sasha Levin +--- + 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 8d0f15f27dc55..084a1d56cc2f0 100644 +--- a/drivers/iio/pressure/bmp280-core.c ++++ b/drivers/iio/pressure/bmp280-core.c +@@ -706,7 +706,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) +@@ -962,6 +962,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.4/include-linux-bitops.h-avoid-clang-shift-count-overf.patch b/queue-5.4/include-linux-bitops.h-avoid-clang-shift-count-overf.patch new file mode 100644 index 00000000000..08473dd5e4a --- /dev/null +++ b/queue-5.4/include-linux-bitops.h-avoid-clang-shift-count-overf.patch @@ -0,0 +1,65 @@ +From fd3f34f8db3218e98de9be409f6dc77e6cfb155f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 4 Jun 2020 16:50:30 -0700 +Subject: include/linux/bitops.h: avoid clang shift-count-overflow warnings + +From: Arnd Bergmann + +[ 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 +Signed-off-by: Andrew Morton +Acked-by: Christian Brauner +Cc: Andy Shevchenko +Cc: Rasmus Villemoes +Cc: Josh Poimboeuf +Cc: Nick Desaulniers +Link: http://lkml.kernel.org/r/20200505135513.65265-1-arnd@arndb.de +Signed-off-by: Linus Torvalds +Signed-off-by: Sasha Levin +--- + 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 c94a9ff9f082e..4f0e62cbf2ffe 100644 +--- a/include/linux/bitops.h ++++ b/include/linux/bitops.h +@@ -57,7 +57,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.4/input-edt-ft5x06-fix-get_default-register-write-acce.patch b/queue-5.4/input-edt-ft5x06-fix-get_default-register-write-acce.patch new file mode 100644 index 00000000000..98e534c038d --- /dev/null +++ b/queue-5.4/input-edt-ft5x06-fix-get_default-register-write-acce.patch @@ -0,0 +1,59 @@ +From 5a8f9d5494b2f06b371e003e6b5fb37f8274b898 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 9 May 2020 14:34:35 -0700 +Subject: Input: edt-ft5x06 - fix get_default register write access + +From: Marco Felsch + +[ 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 +Link: https://lore.kernel.org/r/20200227112819.16754-2-m.felsch@pengutronix.de +Signed-off-by: Dmitry Torokhov +Signed-off-by: Sasha Levin +--- + 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 240e8de24cd24..b41b97c962edc 100644 +--- a/drivers/input/touchscreen/edt-ft5x06.c ++++ b/drivers/input/touchscreen/edt-ft5x06.c +@@ -935,19 +935,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.4/input-i8042-remove-special-powerpc-handling.patch b/queue-5.4/input-i8042-remove-special-powerpc-handling.patch new file mode 100644 index 00000000000..1cd6398cca2 --- /dev/null +++ b/queue-5.4/input-i8042-remove-special-powerpc-handling.patch @@ -0,0 +1,127 @@ +From 7b5215d91caaa0bacbcb61131c5880cbf4800c34 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 18 May 2020 11:10:43 -0700 +Subject: input: i8042 - Remove special PowerPC handling + +From: Nathan Chancellor + +[ 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 +Signed-off-by: Nathan Chancellor +Signed-off-by: Michael Ellerman +Acked-by: Dmitry Torokhov +Link: https://lore.kernel.org/r/20200518181043.3363953-1-natechancellor@gmail.com +Signed-off-by: Sasha Levin +--- + 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.4/input-mms114-add-extra-compatible-for-mms345l.patch b/queue-5.4/input-mms114-add-extra-compatible-for-mms345l.patch new file mode 100644 index 00000000000..2b95456aa04 --- /dev/null +++ b/queue-5.4/input-mms114-add-extra-compatible-for-mms345l.patch @@ -0,0 +1,88 @@ +From 4566cf7c5e4157b89c6f9914e5536d9203cfa082 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 25 Apr 2020 13:06:31 -0700 +Subject: Input: mms114 - add extra compatible for mms345l + +From: Stephan Gerhold + +[ 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 +Reviewed-by: Andi Shyti +Link: https://lore.kernel.org/r/20200423102431.2715-1-stephan@gerhold.net +Signed-off-by: Dmitry Torokhov +Signed-off-by: Sasha Levin +--- + 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 fca908ba4841f..fb28fd2d6f1c5 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); +@@ -598,6 +608,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.4/ipmi-use-vzalloc-instead-of-kmalloc-for-user-creatio.patch b/queue-5.4/ipmi-use-vzalloc-instead-of-kmalloc-for-user-creatio.patch new file mode 100644 index 00000000000..c8d6460ea56 --- /dev/null +++ b/queue-5.4/ipmi-use-vzalloc-instead-of-kmalloc-for-user-creatio.patch @@ -0,0 +1,87 @@ +From 74654de229279784dc98c263c4aee6ceff907d6d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 17 Apr 2020 12:48:28 +0800 +Subject: ipmi: use vzalloc instead of kmalloc for user creation + +From: Feng Tang + +[ 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 +Signed-off-by: Corey Minyard +Signed-off-by: Sasha Levin +--- + 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 90f5292e2051c..ac656a6d5daf1 100644 +--- a/drivers/char/ipmi/ipmi_msghandler.c ++++ b/drivers/char/ipmi/ipmi_msghandler.c +@@ -33,6 +33,7 @@ + #include + #include + #include ++#include + + #define IPMI_DRIVER_VERSION "39.2" + +@@ -1170,7 +1171,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, +@@ -1202,7 +1203,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; + +@@ -1249,7 +1250,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.4/kvm-ppc-book3s-fix-some-rcu-list-locks.patch b/queue-5.4/kvm-ppc-book3s-fix-some-rcu-list-locks.patch new file mode 100644 index 00000000000..6f9bad42eba --- /dev/null +++ b/queue-5.4/kvm-ppc-book3s-fix-some-rcu-list-locks.patch @@ -0,0 +1,165 @@ +From 8d711959bc9ad83caaba046225cf96068e4efeb6 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 10 May 2020 01:18:34 -0400 +Subject: KVM: PPC: Book3S: Fix some RCU-list locks + +From: Qian Cai + +[ 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 +Signed-off-by: Paul Mackerras +Signed-off-by: Sasha Levin +--- + 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 5834db0a54c66..03b947429e4de 100644 +--- a/arch/powerpc/kvm/book3s_64_vio.c ++++ b/arch/powerpc/kvm/book3s_64_vio.c +@@ -74,6 +74,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); +@@ -88,7 +89,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, +@@ -106,12 +109,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); + +@@ -144,6 +149,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; +@@ -151,14 +157,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) { +@@ -364,18 +373,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.4/kvm-ppc-book3s-hv-ignore-kmemleak-false-positives.patch b/queue-5.4/kvm-ppc-book3s-hv-ignore-kmemleak-false-positives.patch new file mode 100644 index 00000000000..12e5422c3c6 --- /dev/null +++ b/queue-5.4/kvm-ppc-book3s-hv-ignore-kmemleak-false-positives.patch @@ -0,0 +1,101 @@ +From eddc2406b398c1890b93e38c929309f6ba352edc Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 13 May 2020 09:39:15 -0400 +Subject: KVM: PPC: Book3S HV: Ignore kmemleak false positives + +From: Qian Cai + +[ 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 +Signed-off-by: Paul Mackerras +Signed-off-by: Sasha Levin +--- + 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 2d415c36a61d3..43b56f8f6bebd 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.4/lib-zlib-remove-outdated-and-incorrect-pre-increment.patch b/queue-5.4/lib-zlib-remove-outdated-and-incorrect-pre-increment.patch new file mode 100644 index 00000000000..531c7d612b5 --- /dev/null +++ b/queue-5.4/lib-zlib-remove-outdated-and-incorrect-pre-increment.patch @@ -0,0 +1,279 @@ +From 5a1bc17f0966ef7dfa900e18a57444a9b5a2b020 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 4 Jun 2020 16:50:17 -0700 +Subject: lib/zlib: remove outdated and incorrect pre-increment optimization + +From: Jann Horn + +[ 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 +Signed-off-by: Andrew Morton +Cc: Mikhail Zaslonko +Link: http://lkml.kernel.org/r/20200507123112.252723-1-jannh@google.com +Signed-off-by: Linus Torvalds +Signed-off-by: Sasha Levin +--- + 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.4/libata-use-per-port-sync-for-detach.patch b/queue-5.4/libata-use-per-port-sync-for-detach.patch new file mode 100644 index 00000000000..d4641c3b6d5 --- /dev/null +++ b/queue-5.4/libata-use-per-port-sync-for-detach.patch @@ -0,0 +1,93 @@ +From 031e917a58dfb5c096f07bf659daa94b86d6202b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 3 Jun 2020 15:48:19 +0800 +Subject: libata: Use per port sync for detach + +From: Kai-Heng Feng + +[ 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 +Signed-off-by: Kai-Heng Feng +Tested-by: John Garry +BugLink: https://bugs.launchpad.net/bugs/1867983 +Signed-off-by: Jens Axboe +Signed-off-by: Sasha Levin +--- + 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 581595b355736..35f75c691d7cf 100644 +--- a/drivers/ata/libata-core.c ++++ b/drivers/ata/libata-core.c +@@ -41,7 +41,6 @@ + #include + #include + #include +-#include + #include + #include + #include +@@ -6592,7 +6591,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; +@@ -6732,11 +6731,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 c44e4cfbcb16a..b9970f5bab67c 100644 +--- a/include/linux/libata.h ++++ b/include/linux/libata.h +@@ -22,6 +22,7 @@ + #include + #include + #include ++#include + + /* + * Define if arch has non-standard setup. This is a _PCI_ standard +@@ -870,6 +871,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.4/libbpf-handle-gcc-noreturn-turned-volatile-quirk.patch b/queue-5.4/libbpf-handle-gcc-noreturn-turned-volatile-quirk.patch new file mode 100644 index 00000000000..5b04724b364 --- /dev/null +++ b/queue-5.4/libbpf-handle-gcc-noreturn-turned-volatile-quirk.patch @@ -0,0 +1,108 @@ +From a9991e095dd500c62efa2ef9a39b05f09435ad36 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 9 Jun 2020 22:23:35 -0700 +Subject: libbpf: Handle GCC noreturn-turned-volatile quirk + +From: Andrii Nakryiko + +[ 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 +Signed-off-by: Andrii Nakryiko +Signed-off-by: Daniel Borkmann +Tested-by: Jean-Philippe Brucker +Link: https://lore.kernel.org/bpf/20200610052335.2862559-1-andriin@fb.com +Signed-off-by: Sasha Levin +--- + 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 87f27e2664c5d..d9e386b8f47ed 100644 +--- a/tools/lib/bpf/btf_dump.c ++++ b/tools/lib/bpf/btf_dump.c +@@ -1141,6 +1141,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) + { +@@ -1239,14 +1253,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); +@@ -1274,7 +1281,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.4/m68k-pci-fix-a-memory-leak-in-an-error-handling-path.patch b/queue-5.4/m68k-pci-fix-a-memory-leak-in-an-error-handling-path.patch new file mode 100644 index 00000000000..0f648dd4dad --- /dev/null +++ b/queue-5.4/m68k-pci-fix-a-memory-leak-in-an-error-handling-path.patch @@ -0,0 +1,40 @@ +From 055152a27257fe12f0025a697782438429a40dbf Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 18 Apr 2020 09:07:51 +0200 +Subject: m68k/PCI: Fix a memory leak in an error handling path + +From: Christophe JAILLET + +[ 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 +Reviewed-by: Geert Uytterhoeven +Signed-off-by: Greg Ungerer +Signed-off-by: Sasha Levin +--- + 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.4/mailbox-zynqmp-ipi-fix-null-vs-is_err-check-in-zynqm.patch b/queue-5.4/mailbox-zynqmp-ipi-fix-null-vs-is_err-check-in-zynqm.patch new file mode 100644 index 00000000000..f26e88182b0 --- /dev/null +++ b/queue-5.4/mailbox-zynqmp-ipi-fix-null-vs-is_err-check-in-zynqm.patch @@ -0,0 +1,81 @@ +From 6d102cde95bc1f95c366e78caa51fd69bdd84681 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Signed-off-by: Jassi Brar +Signed-off-by: Sasha Levin +--- + 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.4/mfd-stmfx-disable-irq-in-suspend-to-avoid-spurious-i.patch b/queue-5.4/mfd-stmfx-disable-irq-in-suspend-to-avoid-spurious-i.patch new file mode 100644 index 00000000000..b07c95b1a7b --- /dev/null +++ b/queue-5.4/mfd-stmfx-disable-irq-in-suspend-to-avoid-spurious-i.patch @@ -0,0 +1,68 @@ +From c29f2a8927d05a61cc1e172fb7c40f02800acca1 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 22 Apr 2020 11:08:33 +0200 +Subject: mfd: stmfx: Disable IRQ in suspend to avoid spurious interrupt + +From: Amelie Delaunay + +[ 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 +Signed-off-by: Lee Jones +Signed-off-by: Sasha Levin +--- + 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.4/mfd-stmfx-fix-stmfx_irq_init-error-path.patch b/queue-5.4/mfd-stmfx-fix-stmfx_irq_init-error-path.patch new file mode 100644 index 00000000000..bc558dff830 --- /dev/null +++ b/queue-5.4/mfd-stmfx-fix-stmfx_irq_init-error-path.patch @@ -0,0 +1,49 @@ +From 94ad0930ef8e4289f5ff5b74d88ae8ed1e42e1ca Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 22 Apr 2020 11:08:32 +0200 +Subject: mfd: stmfx: Fix stmfx_irq_init error path + +From: Amelie Delaunay + +[ 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 +Signed-off-by: Lee Jones +Signed-off-by: Sasha Levin +--- + 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.4/mfd-stmfx-reset-chip-on-resume-as-supply-was-disable.patch b/queue-5.4/mfd-stmfx-reset-chip-on-resume-as-supply-was-disable.patch new file mode 100644 index 00000000000..9ccb437fa3a --- /dev/null +++ b/queue-5.4/mfd-stmfx-reset-chip-on-resume-as-supply-was-disable.patch @@ -0,0 +1,42 @@ +From c661340956bf77808d27e8d14a3e8f279d4cbd42 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 22 Apr 2020 11:08:31 +0200 +Subject: mfd: stmfx: Reset chip on resume as supply was disabled + +From: Amelie Delaunay + +[ 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 +Signed-off-by: Lee Jones +Signed-off-by: Sasha Levin +--- + 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.4/mfd-wm8994-fix-driver-operation-if-loaded-as-modules.patch b/queue-5.4/mfd-wm8994-fix-driver-operation-if-loaded-as-modules.patch new file mode 100644 index 00000000000..726f1637497 --- /dev/null +++ b/queue-5.4/mfd-wm8994-fix-driver-operation-if-loaded-as-modules.patch @@ -0,0 +1,38 @@ +From f0743f00f665e152085f42a6e8a43ec2c1d10442 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 27 Apr 2020 09:48:29 +0200 +Subject: mfd: wm8994: Fix driver operation if loaded as modules + +From: Marek Szyprowski + +[ 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 +Acked-by: Charles Keepax +Signed-off-by: Lee Jones +Signed-off-by: Sasha Levin +--- + 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 "); ++MODULE_SOFTDEP("pre: wm8994_regulator"); +-- +2.25.1 + diff --git a/queue-5.4/misc-fastrpc-fix-an-incomplete-memory-release-in-fas.patch b/queue-5.4/misc-fastrpc-fix-an-incomplete-memory-release-in-fas.patch new file mode 100644 index 00000000000..135cee40931 --- /dev/null +++ b/queue-5.4/misc-fastrpc-fix-an-incomplete-memory-release-in-fas.patch @@ -0,0 +1,43 @@ +From 5f2af4eb717ef066dc37ef56dd988492616af3f9 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 11 May 2020 17:27:22 +0100 +Subject: misc: fastrpc: Fix an incomplete memory release in + fastrpc_rpmsg_probe() + +From: Srinivas Kandagatla + +[ 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 +Reviewed-by: Bjorn Andersson +Link: https://lore.kernel.org/r/20200511162722.2552-1-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + 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 842f2210dc7e2..ee3291f7e6156 100644 +--- a/drivers/misc/fastrpc.c ++++ b/drivers/misc/fastrpc.c +@@ -1434,8 +1434,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.4/misc-fastrpc-fix-potential-fastrpc_invoke_ctx-leak.patch b/queue-5.4/misc-fastrpc-fix-potential-fastrpc_invoke_ctx-leak.patch new file mode 100644 index 00000000000..e75852f3e7d --- /dev/null +++ b/queue-5.4/misc-fastrpc-fix-potential-fastrpc_invoke_ctx-leak.patch @@ -0,0 +1,59 @@ +From c7ca41986e102c212ed1519f7ca390345557adb3 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 12 May 2020 12:09:30 +0100 +Subject: misc: fastrpc: fix potential fastrpc_invoke_ctx leak + +From: Srinivas Kandagatla + +[ 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 +Signed-off-by: Srinivas Kandagatla +Reviewed-by: Bjorn Andersson +Link: https://lore.kernel.org/r/20200512110930.2550-1-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + 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 ee3291f7e6156..3a5d2890fe2aa 100644 +--- a/drivers/misc/fastrpc.c ++++ b/drivers/misc/fastrpc.c +@@ -886,6 +886,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; +@@ -901,7 +902,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.4/misc-xilinx-sdfec-improve-get_user_pages_fast-error-.patch b/queue-5.4/misc-xilinx-sdfec-improve-get_user_pages_fast-error-.patch new file mode 100644 index 00000000000..6eb74059b5d --- /dev/null +++ b/queue-5.4/misc-xilinx-sdfec-improve-get_user_pages_fast-error-.patch @@ -0,0 +1,97 @@ +From b54f885b50535b97d9bbc1d8ab7763194548f3d5 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 26 May 2020 18:26:26 -0700 +Subject: misc: xilinx-sdfec: improve get_user_pages_fast() error handling + +From: John Hubbard + +[ 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 +Cc: Dragan Cvetic +Cc: Arnd Bergmann +Cc: Greg Kroah-Hartman +Cc: Michal Simek +Cc: linux-arm-kernel@lists.infradead.org +Signed-off-by: John Hubbard +Link: https://lore.kernel.org/r/20200527012628.1100649-2-jhubbard@nvidia.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + 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 48ba7e02bed72..d4c14b617201e 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.4/mksysmap-fix-the-mismatch-of-.l-symbols-in-system.ma.patch b/queue-5.4/mksysmap-fix-the-mismatch-of-.l-symbols-in-system.ma.patch new file mode 100644 index 00000000000..7019dd6673b --- /dev/null +++ b/queue-5.4/mksysmap-fix-the-mismatch-of-.l-symbols-in-system.ma.patch @@ -0,0 +1,46 @@ +From 8884c7f4783f8b2b70b0726185ce869fba13fb4d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 2 Jun 2020 15:45:17 +0800 +Subject: mksysmap: Fix the mismatch of '.L' symbols in System.map + +From: ashimida + +[ 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 +Signed-off-by: Masahiro Yamada +Signed-off-by: Sasha Levin +--- + 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.4/mvpp2-remove-module-bugfix.patch b/queue-5.4/mvpp2-remove-module-bugfix.patch new file mode 100644 index 00000000000..02fc6c0f1ec --- /dev/null +++ b/queue-5.4/mvpp2-remove-module-bugfix.patch @@ -0,0 +1,58 @@ +From 120c8834b3596e8c4b4c11818e5915f0e1d6b7f0 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 16 Jun 2020 06:35:29 +0200 +Subject: mvpp2: remove module bugfix + +From: Sven Auhagen + +[ 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 +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + 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 373b8c8328501..cf5d447af7db2 100644 +--- a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c ++++ b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c +@@ -5925,8 +5925,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); + +@@ -5940,7 +5940,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.4/net-dsa-lantiq_gswip-fix-and-improve-the-unsupported.patch b/queue-5.4/net-dsa-lantiq_gswip-fix-and-improve-the-unsupported.patch new file mode 100644 index 00000000000..a6cede3ed5b --- /dev/null +++ b/queue-5.4/net-dsa-lantiq_gswip-fix-and-improve-the-unsupported.patch @@ -0,0 +1,47 @@ +From 46db6fad1a54fc0119a5ffe18106541de77ac307 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 7 Jun 2020 15:02:58 +0200 +Subject: net: dsa: lantiq_gswip: fix and improve the unsupported interface + error + +From: Martin Blumenstingl + +[ 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 +Acked-by: Hauke Mehrtens +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + 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 a69c9b9878b7d..636966e93517e 100644 +--- a/drivers/net/dsa/lantiq_gswip.c ++++ b/drivers/net/dsa/lantiq_gswip.c +@@ -1451,7 +1451,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.4/net-filter-permit-reading-net-in-load_bytes_relative.patch b/queue-5.4/net-filter-permit-reading-net-in-load_bytes_relative.patch new file mode 100644 index 00000000000..fa8d59a5a31 --- /dev/null +++ b/queue-5.4/net-filter-permit-reading-net-in-load_bytes_relative.patch @@ -0,0 +1,74 @@ +From b072ddae23bcd1ceda6d222be24677da7db55298 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Signed-off-by: Daniel Borkmann +Reviewed-by: Stanislav Fomichev +Link: https://lore.kernel.org/bpf/76bb820ddb6a95f59a772ecbd8c8a336f646b362.1591812755.git.zhuyifei@google.com +Signed-off-by: Sasha Levin +--- + 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 f1f2304822e3b..a0a492f7cf9ce 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.4/net-marvell-fix-of_mdio-config-check.patch b/queue-5.4/net-marvell-fix-of_mdio-config-check.patch new file mode 100644 index 00000000000..f2704ac212f --- /dev/null +++ b/queue-5.4/net-marvell-fix-of_mdio-config-check.patch @@ -0,0 +1,38 @@ +From 86a32766f788743cf035a72a097e3b39d7616ca5 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 5 Jun 2020 09:01:06 -0500 +Subject: net: marvell: Fix OF_MDIO config check + +From: Dan Murphy + +[ 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 +Reviewed-by: Florian Fainelli +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + 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 a7796134e3be0..91cf1d1672637 100644 +--- a/drivers/net/phy/marvell.c ++++ b/drivers/net/phy/marvell.c +@@ -358,7 +358,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.4/net-sunrpc-fix-off-by-one-issues-in-rpc_ntop6.patch b/queue-5.4/net-sunrpc-fix-off-by-one-issues-in-rpc_ntop6.patch new file mode 100644 index 00000000000..6d77e096377 --- /dev/null +++ b/queue-5.4/net-sunrpc-fix-off-by-one-issues-in-rpc_ntop6.patch @@ -0,0 +1,45 @@ +From a9064275185c30395739c26c8be6519fbbf263c4 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 28 Mar 2020 14:56:55 +0300 +Subject: net: sunrpc: Fix off-by-one issues in 'rpc_ntop6' + +From: Fedor Tokarev + +[ 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 +Signed-off-by: Anna Schumaker +Signed-off-by: Sasha Levin +--- + 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 d024af4be85e8..105d17af4abcc 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.4/nfs-set-invalid-blocks-after-nfsv4-writes.patch b/queue-5.4/nfs-set-invalid-blocks-after-nfsv4-writes.patch new file mode 100644 index 00000000000..6cb47e5aa7b --- /dev/null +++ b/queue-5.4/nfs-set-invalid-blocks-after-nfsv4-writes.patch @@ -0,0 +1,114 @@ +From 7e6073c702cc2748eb0587c0cd60d1e64ced7a88 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 21 May 2020 17:17:21 +0800 +Subject: nfs: set invalid blocks after NFSv4 writes + +From: Zheng Bin + +[ 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 +Signed-off-by: Anna Schumaker +Signed-off-by: Sasha Levin +--- + 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 3802c88e83720..6de41f7412808 100644 +--- a/fs/nfs/inode.c ++++ b/fs/nfs/inode.c +@@ -826,6 +826,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)) +@@ -1750,7 +1752,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; + } + +@@ -1857,7 +1860,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); +@@ -2019,8 +2023,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 570a60c2f4f48..ad09c0cc54645 100644 +--- a/include/linux/nfs_fs.h ++++ b/include/linux/nfs_fs.h +@@ -225,6 +225,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.4/nfsd-fix-svc_xprt-refcnt-leak-when-setup-callback-cl.patch b/queue-5.4/nfsd-fix-svc_xprt-refcnt-leak-when-setup-callback-cl.patch new file mode 100644 index 00000000000..79a4f930f3e --- /dev/null +++ b/queue-5.4/nfsd-fix-svc_xprt-refcnt-leak-when-setup-callback-cl.patch @@ -0,0 +1,44 @@ +From c7d74ed6fb5f5107a5d6beed966cb091a6e4ffcb Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 25 May 2020 22:15:41 +0800 +Subject: nfsd: Fix svc_xprt refcnt leak when setup callback client failed + +From: Xiyu Yang + +[ 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 +Signed-off-by: Xin Tan +Signed-off-by: J. Bruce Fields +Signed-off-by: Sasha Levin +--- + fs/nfsd/nfs4callback.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/fs/nfsd/nfs4callback.c b/fs/nfsd/nfs4callback.c +index afca3287184b9..efe55d101b0ed 100644 +--- a/fs/nfsd/nfs4callback.c ++++ b/fs/nfsd/nfs4callback.c +@@ -1230,6 +1230,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.4/nfsd-safer-handling-of-corrupted-c_type.patch b/queue-5.4/nfsd-safer-handling-of-corrupted-c_type.patch new file mode 100644 index 00000000000..6c60c45af43 --- /dev/null +++ b/queue-5.4/nfsd-safer-handling-of-corrupted-c_type.patch @@ -0,0 +1,36 @@ +From 1c3f6c3dbe8eca8e0d40e9ca754fcc874238c441 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 3 Jun 2020 11:12:32 -0400 +Subject: nfsd: safer handling of corrupted c_type + +From: J. Bruce Fields + +[ 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 +Signed-off-by: Sasha Levin +--- + 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.4/nfsd4-make-drc_slab-global-not-per-net.patch b/queue-5.4/nfsd4-make-drc_slab-global-not-per-net.patch new file mode 100644 index 00000000000..f676ff61268 --- /dev/null +++ b/queue-5.4/nfsd4-make-drc_slab-global-not-per-net.patch @@ -0,0 +1,250 @@ +From f043685a61247acd48c0f75826d6098554ecc717 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 1 Jun 2020 17:44:45 -0400 +Subject: nfsd4: make drc_slab global, not per-net + +From: J. Bruce Fields + +[ 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 +Fixes: 3ba75830ce17 "drc containerization" +Signed-off-by: J. Bruce Fields +Signed-off-by: Sasha Levin +--- + 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 9a4ef815fb8c1..ed53e206a2996 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 d77c5261c03cb..159feae6af8ba 100644 +--- a/fs/nfsd/nfsctl.c ++++ b/fs/nfsd/nfsctl.c +@@ -1534,6 +1534,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) +@@ -1547,6 +1550,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(); +@@ -1561,6 +1566,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.4/nfsv4.1-fix-rpc_call_done-assignment-for-bind_conn_t.patch b/queue-5.4/nfsv4.1-fix-rpc_call_done-assignment-for-bind_conn_t.patch new file mode 100644 index 00000000000..f84f9a719cb --- /dev/null +++ b/queue-5.4/nfsv4.1-fix-rpc_call_done-assignment-for-bind_conn_t.patch @@ -0,0 +1,33 @@ +From 5cc58bce31698e730c0cf7794e71b3be83572447 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ Upstream commit 1c709b766e73e54d64b1dde1b7cfbcf25bcb15b9 ] + +Fixes: 02a95dee8cf0 ("NFS add callback_ops to nfs4_proc_bind_conn_to_session_callback") +Signed-off-by: Olga Kornievskaia +Signed-off-by: Anna Schumaker +Signed-off-by: Sasha Levin +--- + 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 e257653f25abd..33c17c69aeaa3 100644 +--- a/fs/nfs/nfs4proc.c ++++ b/fs/nfs/nfs4proc.c +@@ -7870,7 +7870,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.4/ntb-fix-the-default-port-and-peer-numbers-for-legacy.patch b/queue-5.4/ntb-fix-the-default-port-and-peer-numbers-for-legacy.patch new file mode 100644 index 00000000000..74b2ae6485f --- /dev/null +++ b/queue-5.4/ntb-fix-the-default-port-and-peer-numbers-for-legacy.patch @@ -0,0 +1,69 @@ +From f67d3a8db5a2858f3f515dd36e44b7d497f87544 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 9 Jan 2019 12:22:28 -0700 +Subject: NTB: Fix the default port and peer numbers for legacy drivers + +From: Logan Gunthorpe + +[ 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 +Acked-by: Allen Hubbe +Tested-by: Alexander Fomichev +Signed-off-by: Jon Mason +Signed-off-by: Sasha Levin +--- + 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.4/ntb-ntb_pingpong-choose-doorbells-based-on-port-numb.patch b/queue-5.4/ntb-ntb_pingpong-choose-doorbells-based-on-port-numb.patch new file mode 100644 index 00000000000..3a34da7b3f1 --- /dev/null +++ b/queue-5.4/ntb-ntb_pingpong-choose-doorbells-based-on-port-numb.patch @@ -0,0 +1,71 @@ +From 1be67158560921536b291ecf365988f02d461208 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 9 Jan 2019 12:22:29 -0700 +Subject: NTB: ntb_pingpong: Choose doorbells based on port number + +From: Logan Gunthorpe + +[ 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 +Acked-by: Allen Hubbe +Tested-by: Alexander Fomichev +Signed-off-by: Jon Mason +Signed-off-by: Sasha Levin +--- + 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 65865e460ab87..18d00eec7b025 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); + +@@ -435,4 +434,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.4/ntb-ntb_test-fix-bug-when-counting-remote-files.patch b/queue-5.4/ntb-ntb_test-fix-bug-when-counting-remote-files.patch new file mode 100644 index 00000000000..51fcdb9ae74 --- /dev/null +++ b/queue-5.4/ntb-ntb_test-fix-bug-when-counting-remote-files.patch @@ -0,0 +1,39 @@ +From 9d763c348812b9914273044f5f4d5e8493543ce0 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 9 Jan 2019 12:22:33 -0700 +Subject: NTB: ntb_test: Fix bug when counting remote files + +From: Logan Gunthorpe + +[ 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 +Acked-by: Allen Hubbe +Tested-by: Alexander Fomichev +Signed-off-by: Jon Mason +Signed-off-by: Sasha Levin +--- + 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.4/ntb-ntb_tool-reading-the-link-file-should-not-end-in.patch b/queue-5.4/ntb-ntb_tool-reading-the-link-file-should-not-end-in.patch new file mode 100644 index 00000000000..da14ec50912 --- /dev/null +++ b/queue-5.4/ntb-ntb_tool-reading-the-link-file-should-not-end-in.patch @@ -0,0 +1,51 @@ +From 7fc6831d43f7659fd569c061d894fb9384d31b0d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Acked-by: Allen Hubbe +Tested-by: Alexander Fomichev +Signed-off-by: Jon Mason +Signed-off-by: Sasha Levin +--- + 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 025747c1568ea..311d6ab8d0160 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.4/ntb-perf-don-t-require-one-more-memory-window-than-n.patch b/queue-5.4/ntb-perf-don-t-require-one-more-memory-window-than-n.patch new file mode 100644 index 00000000000..eb37262fd37 --- /dev/null +++ b/queue-5.4/ntb-perf-don-t-require-one-more-memory-window-than-n.patch @@ -0,0 +1,38 @@ +From 35a666f647153c26190cf9f1acb31915eb38f3f6 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Acked-by: Allen Hubbe +Tested-by: Alexander Fomichev +Signed-off-by: Jon Mason +Signed-off-by: Sasha Levin +--- + 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 52c29791fc02a..3817eadab2cf9 100644 +--- a/drivers/ntb/test/ntb_perf.c ++++ b/drivers/ntb/test/ntb_perf.c +@@ -653,7 +653,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.4/ntb-perf-fix-race-condition-when-run-with-ntb_test.patch b/queue-5.4/ntb-perf-fix-race-condition-when-run-with-ntb_test.patch new file mode 100644 index 00000000000..884b0970bf7 --- /dev/null +++ b/queue-5.4/ntb-perf-fix-race-condition-when-run-with-ntb_test.patch @@ -0,0 +1,81 @@ +From 53b6669737a8255e968dd2bfddea5ccaf3d227f4 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 9 Jan 2019 12:22:32 -0700 +Subject: NTB: perf: Fix race condition when run with ntb_test + +From: Logan Gunthorpe + +[ 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 +Acked-by: Allen Hubbe +Tested-by: Alexander Fomichev +Signed-off-by: Jon Mason +Signed-off-by: Sasha Levin +--- + 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 281170887ad06..5ce4766a6c9eb 100644 +--- a/drivers/ntb/test/ntb_perf.c ++++ b/drivers/ntb/test/ntb_perf.c +@@ -158,6 +158,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) +@@ -546,6 +548,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; + } +@@ -637,6 +640,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) { +@@ -1052,8 +1056,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; +@@ -1419,6 +1424,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.4/ntb-perf-fix-support-for-hardware-that-doesn-t-have-.patch b/queue-5.4/ntb-perf-fix-support-for-hardware-that-doesn-t-have-.patch new file mode 100644 index 00000000000..8bb3534ad64 --- /dev/null +++ b/queue-5.4/ntb-perf-fix-support-for-hardware-that-doesn-t-have-.patch @@ -0,0 +1,52 @@ +From 02f723b721ab00ac7e09c53f1ef92554a55e8caa Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Acked-by: Allen Hubbe +Tested-by: Alexander Fomichev +Signed-off-by: Jon Mason +Signed-off-by: Sasha Levin +--- + 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 3817eadab2cf9..281170887ad06 100644 +--- a/drivers/ntb/test/ntb_perf.c ++++ b/drivers/ntb/test/ntb_perf.c +@@ -1423,6 +1423,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.4/ntb-revert-the-change-to-use-the-ntb-device-dev-for-.patch b/queue-5.4/ntb-revert-the-change-to-use-the-ntb-device-dev-for-.patch new file mode 100644 index 00000000000..14e6b443728 --- /dev/null +++ b/queue-5.4/ntb-revert-the-change-to-use-the-ntb-device-dev-for-.patch @@ -0,0 +1,44 @@ +From 254466246995d33f4ebef4b7f16c9cdca231770c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Tested-by: Alexander Fomichev +Signed-off-by: Jon Mason +Signed-off-by: Sasha Levin +--- + 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.4/ntb_perf-pass-correct-struct-device-to-dma_alloc_coh.patch b/queue-5.4/ntb_perf-pass-correct-struct-device-to-dma_alloc_coh.patch new file mode 100644 index 00000000000..c2bd18eabcb --- /dev/null +++ b/queue-5.4/ntb_perf-pass-correct-struct-device-to-dma_alloc_coh.patch @@ -0,0 +1,61 @@ +From 34d08be0a9cd96acfda2a5cee27b855325fbcef2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 5 May 2020 23:21:49 -0500 +Subject: ntb_perf: pass correct struct device to dma_alloc_coherent + +From: Sanjay R Mehta + +[ 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 +Signed-off-by: Sanjay R Mehta +Signed-off-by: Arindam Nath +Signed-off-by: Jon Mason +Signed-off-by: Sasha Levin +--- + 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 e9b7c2dfc7301..52c29791fc02a 100644 +--- a/drivers/ntb/test/ntb_perf.c ++++ b/drivers/ntb/test/ntb_perf.c +@@ -556,7 +556,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; + } +@@ -585,8 +585,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); +@@ -1517,4 +1518,3 @@ static void __exit perf_exit(void) + destroy_workqueue(perf_wq); + } + module_exit(perf_exit); +- +-- +2.25.1 + diff --git a/queue-5.4/ntb_tool-pass-correct-struct-device-to-dma_alloc_coh.patch b/queue-5.4/ntb_tool-pass-correct-struct-device-to-dma_alloc_coh.patch new file mode 100644 index 00000000000..14ebf30d6f8 --- /dev/null +++ b/queue-5.4/ntb_tool-pass-correct-struct-device-to-dma_alloc_coh.patch @@ -0,0 +1,61 @@ +From 082f7c71f85da4d7bada9b4848748bf414d6a149 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 5 May 2020 23:21:50 -0500 +Subject: ntb_tool: pass correct struct device to dma_alloc_coherent + +From: Sanjay R Mehta + +[ 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 +Signed-off-by: Arindam Nath +Signed-off-by: Jon Mason +Signed-off-by: Sasha Levin +--- + 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 d592c0ffbd198..025747c1568ea 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.4/nvme-pci-use-simple-suspend-when-a-hmb-is-enabled.patch b/queue-5.4/nvme-pci-use-simple-suspend-when-a-hmb-is-enabled.patch new file mode 100644 index 00000000000..a11cac837a2 --- /dev/null +++ b/queue-5.4/nvme-pci-use-simple-suspend-when-a-hmb-is-enabled.patch @@ -0,0 +1,46 @@ +From 414662317f7ecc6c13d6d276d8c894360c17e1cb Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 3 Jun 2020 08:24:17 +0200 +Subject: nvme-pci: use simple suspend when a HMB is enabled + +From: Christoph Hellwig + +[ 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 +Reviewed-by: Keith Busch +Reviewed-by: Sagi Grimberg +Signed-off-by: Jens Axboe +Signed-off-by: Sasha Levin +--- + 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 1c2129493508f..a13cae1901962 100644 +--- a/drivers/nvme/host/pci.c ++++ b/drivers/nvme/host/pci.c +@@ -2971,9 +2971,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.4/of-fix-a-refcounting-bug-in-__of_attach_node_sysfs.patch b/queue-5.4/of-fix-a-refcounting-bug-in-__of_attach_node_sysfs.patch new file mode 100644 index 00000000000..98b594c1b28 --- /dev/null +++ b/queue-5.4/of-fix-a-refcounting-bug-in-__of_attach_node_sysfs.patch @@ -0,0 +1,46 @@ +From 3e8de17e9c44ac7e0afdb690aab3db912566dd55 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 20 May 2020 15:04:14 +0300 +Subject: of: Fix a refcounting bug in __of_attach_node_sysfs() + +From: Dan Carpenter + +[ 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 +Signed-off-by: Rob Herring +Signed-off-by: Sasha Levin +--- + 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.4/openrisc-fix-issue-with-argument-clobbering-for-clon.patch b/queue-5.4/openrisc-fix-issue-with-argument-clobbering-for-clon.patch new file mode 100644 index 00000000000..4dfb449adb1 --- /dev/null +++ b/queue-5.4/openrisc-fix-issue-with-argument-clobbering-for-clon.patch @@ -0,0 +1,48 @@ +From 1228b37691043054d03a769f01ee19385560ab07 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 22 Apr 2020 20:24:11 +0900 +Subject: openrisc: Fix issue with argument clobbering for clone/fork + +From: Stafford Horne + +[ 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 +Signed-off-by: Sasha Levin +--- + 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.4/ovl-verify-permissions-in-ovl_path_open.patch b/queue-5.4/ovl-verify-permissions-in-ovl_path_open.patch new file mode 100644 index 00000000000..3224f79e5c9 --- /dev/null +++ b/queue-5.4/ovl-verify-permissions-in-ovl_path_open.patch @@ -0,0 +1,72 @@ +From fd3b50197726327cc1db1cc1f76c9e2232912d0e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 2 Jun 2020 22:20:26 +0200 +Subject: ovl: verify permissions in ovl_path_open() + +From: Miklos Szeredi + +[ 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 +Signed-off-by: Sasha Levin +--- + 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 f5678a3f83508..eb325322a893d 100644 +--- a/fs/overlayfs/util.c ++++ b/fs/overlayfs/util.c +@@ -475,7 +475,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.4/pci-aardvark-don-t-blindly-enable-aspm-l0s-and-don-t.patch b/queue-5.4/pci-aardvark-don-t-blindly-enable-aspm-l0s-and-don-t.patch new file mode 100644 index 00000000000..c3fc4c2077b --- /dev/null +++ b/queue-5.4/pci-aardvark-don-t-blindly-enable-aspm-l0s-and-don-t.patch @@ -0,0 +1,69 @@ +From eff9a427bcb0949fd4dc5262e0e1247afc0f0807 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Signed-off-by: Pali Rohár +Signed-off-by: Lorenzo Pieralisi +Acked-by: Rob Herring +Acked-by: Thomas Petazzoni +Signed-off-by: Sasha Levin +--- + 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 97245e0765483..f2481e80e2723 100644 +--- a/drivers/pci/controller/pci-aardvark.c ++++ b/drivers/pci/controller/pci-aardvark.c +@@ -344,10 +344,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.4/pci-allow-pci_resize_resource-for-devices-on-root-bu.patch b/queue-5.4/pci-allow-pci_resize_resource-for-devices-on-root-bu.patch new file mode 100644 index 00000000000..a99e8f03e2c --- /dev/null +++ b/queue-5.4/pci-allow-pci_resize_resource-for-devices-on-root-bu.patch @@ -0,0 +1,56 @@ +From 562f20539a1a57adb9afb4c305512df7346ce0c1 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Signed-off-by: Bjorn Helgaas +Reviewed-by: Christian König +Signed-off-by: Sasha Levin +--- + 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.4/pci-amlogic-meson-don-t-use-fast_link_mode-to-set-up.patch b/queue-5.4/pci-amlogic-meson-don-t-use-fast_link_mode-to-set-up.patch new file mode 100644 index 00000000000..0dc81ca2576 --- /dev/null +++ b/queue-5.4/pci-amlogic-meson-don-t-use-fast_link_mode-to-set-up.patch @@ -0,0 +1,57 @@ +From 473be40dd9b6c749b92e73826b07db17e0628c01 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +[lorenzo.pieralisi@arm.com: commit log] +Signed-off-by: Lorenzo Pieralisi +Reviewed-by: Neil Armstrong +Acked-by: Rob Herring +Signed-off-by: Sasha Levin +--- + 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 b927a92e3463e..8c9f887048746 100644 +--- a/drivers/pci/controller/dwc/pci-meson.c ++++ b/drivers/pci/controller/dwc/pci-meson.c +@@ -301,11 +301,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.4/pci-aspm-allow-aspm-on-links-to-pcie-to-pci-pci-x-br.patch b/queue-5.4/pci-aspm-allow-aspm-on-links-to-pcie-to-pci-pci-x-br.patch new file mode 100644 index 00000000000..88b8c07a992 --- /dev/null +++ b/queue-5.4/pci-aspm-allow-aspm-on-links-to-pcie-to-pci-pci-x-br.patch @@ -0,0 +1,55 @@ +From 1f01b23048205be5a99cea51779f077e5758f3da Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Signed-off-by: Bjorn Helgaas +Reviewed-by: Mika Westerberg +Signed-off-by: Sasha Levin +--- + 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 5a1bbf2cb7e98..4a0ec34062d60 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.4/pci-dwc-fix-inner-msi-irq-domain-registration.patch b/queue-5.4/pci-dwc-fix-inner-msi-irq-domain-registration.patch new file mode 100644 index 00000000000..07821f19c2e --- /dev/null +++ b/queue-5.4/pci-dwc-fix-inner-msi-irq-domain-registration.patch @@ -0,0 +1,48 @@ +From 0651f770c9bb39ad654e577751c314f815e84b58 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 1 May 2020 12:39:21 +0100 +Subject: PCI: dwc: Fix inner MSI IRQ domain registration + +From: Marc Zyngier + +[ 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 +Signed-off-by: Lorenzo Pieralisi +Acked-by: Jingoo Han +Signed-off-by: Sasha Levin +--- + 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 8615f1548882a..fbcb211cceb43 100644 +--- a/drivers/pci/controller/dwc/pcie-designware-host.c ++++ b/drivers/pci/controller/dwc/pcie-designware-host.c +@@ -263,6 +263,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.4/pci-fix-pci_register_host_bridge-device_register-err.patch b/queue-5.4/pci-fix-pci_register_host_bridge-device_register-err.patch new file mode 100644 index 00000000000..bedb7db31f5 --- /dev/null +++ b/queue-5.4/pci-fix-pci_register_host_bridge-device_register-err.patch @@ -0,0 +1,43 @@ +From 9e49762e207118a290f7163ea115d96ceba79cd9 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 13 May 2020 17:38:58 -0500 +Subject: PCI: Fix pci_register_host_bridge() device_register() error handling + +From: Rob Herring + +[ 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 +Signed-off-by: Bjorn Helgaas +Reviewed-by: Lorenzo Pieralisi +Reviewed-by: Arnd Bergmann +Signed-off-by: Sasha Levin +--- + 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 83d909abc61d1..8fa13486f2f15 100644 +--- a/drivers/pci/probe.c ++++ b/drivers/pci/probe.c +@@ -867,9 +867,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.4/pci-pci-bridge-emul-fix-pcie-bit-conflicts.patch b/queue-5.4/pci-pci-bridge-emul-fix-pcie-bit-conflicts.patch new file mode 100644 index 00000000000..1dbc971970e --- /dev/null +++ b/queue-5.4/pci-pci-bridge-emul-fix-pcie-bit-conflicts.patch @@ -0,0 +1,55 @@ +From 7216db5812523e4c1117538e30915554c714fa0c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 11 May 2020 12:21:14 -0400 +Subject: PCI: pci-bridge-emul: Fix PCIe bit conflicts + +From: Jon Derrick + +[ 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 +Signed-off-by: Lorenzo Pieralisi +Acked-by: Rob Herring +Signed-off-by: Sasha Levin +--- + 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 5fd90105510d9..d3b6b9a056185 100644 +--- a/drivers/pci/pci-bridge-emul.c ++++ b/drivers/pci/pci-bridge-emul.c +@@ -195,8 +195,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] = { +@@ -236,7 +236,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.4/pci-pm-assume-ports-without-dll-link-active-train-li.patch b/queue-5.4/pci-pm-assume-ports-without-dll-link-active-train-li.patch new file mode 100644 index 00000000000..eca6605f2df --- /dev/null +++ b/queue-5.4/pci-pm-assume-ports-without-dll-link-active-train-li.patch @@ -0,0 +1,113 @@ +From 00ba009426590d881679f39831aa04212fc7d161 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Tested-by: Kai-Heng Feng +Signed-off-by: Mika Westerberg +Signed-off-by: Bjorn Helgaas +Signed-off-by: Sasha Levin +--- + 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 c73e8095a8491..689f0280c038b 100644 +--- a/drivers/pci/pci.c ++++ b/drivers/pci/pci.c +@@ -4608,7 +4608,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. + */ +@@ -4649,7 +4650,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", +@@ -4770,17 +4771,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.4/pci-ptm-inherit-switch-downstream-port-ptm-settings-.patch b/queue-5.4/pci-ptm-inherit-switch-downstream-port-ptm-settings-.patch new file mode 100644 index 00000000000..58c7e64968c --- /dev/null +++ b/queue-5.4/pci-ptm-inherit-switch-downstream-port-ptm-settings-.patch @@ -0,0 +1,78 @@ +From cf4305ba58e3d7310cf1a0b77ee300e3f93759d7 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 21 May 2020 15:40:07 -0500 +Subject: PCI/PTM: Inherit Switch Downstream Port PTM settings from Upstream + Port + +From: Bjorn Helgaas + +[ 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 +Signed-off-by: Bjorn Helgaas +Signed-off-by: Sasha Levin +--- + 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.4/pci-rcar-fix-incorrect-programming-of-ob-windows.patch b/queue-5.4/pci-rcar-fix-incorrect-programming-of-ob-windows.patch new file mode 100644 index 00000000000..0dc1925f0a8 --- /dev/null +++ b/queue-5.4/pci-rcar-fix-incorrect-programming-of-ob-windows.patch @@ -0,0 +1,74 @@ +From b8d9c3021b78edd5981ac4aa59622329f3d8d628 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 4 Oct 2019 14:29:41 +0100 +Subject: PCI: rcar: Fix incorrect programming of OB windows + +From: Andrew Murray + +[ 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 +Signed-off-by: Andrew Murray +Signed-off-by: Lorenzo Pieralisi +Reviewed-by: Marek Vasut +Signed-off-by: Sasha Levin +--- + 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 1ad0b56f11b4b..04114352d0e7b 100644 +--- a/drivers/pci/controller/pcie-rcar.c ++++ b/drivers/pci/controller/pcie-rcar.c +@@ -335,11 +335,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)); +@@ -353,9 +354,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, +@@ -384,7 +385,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.4/pci-v3-semi-fix-a-memory-leak-in-v3_pci_probe-error-.patch b/queue-5.4/pci-v3-semi-fix-a-memory-leak-in-v3_pci_probe-error-.patch new file mode 100644 index 00000000000..e9166aef5cc --- /dev/null +++ b/queue-5.4/pci-v3-semi-fix-a-memory-leak-in-v3_pci_probe-error-.patch @@ -0,0 +1,42 @@ +From 878e5dbbc2966073619f51285d11bae27ed2ca2a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +[lorenzo.pieralisi@arm.com: commit log] +Signed-off-by: Lorenzo Pieralisi +Acked-by: Linus Walleij +Signed-off-by: Sasha Levin +--- + 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 d219404bad92b..9a86bb7448acf 100644 +--- a/drivers/pci/controller/pci-v3-semi.c ++++ b/drivers/pci/controller/pci-v3-semi.c +@@ -743,7 +743,7 @@ static int v3_pci_probe(struct platform_device *pdev) + int ret; + LIST_HEAD(res); + +- 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.4/pci-vmd-filter-resource-type-bits-from-shadow-regist.patch b/queue-5.4/pci-vmd-filter-resource-type-bits-from-shadow-regist.patch new file mode 100644 index 00000000000..281d1fcef68 --- /dev/null +++ b/queue-5.4/pci-vmd-filter-resource-type-bits-from-shadow-regist.patch @@ -0,0 +1,55 @@ +From 87766fd5b4fc18c61d4119a77262103833a37bb0 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 27 May 2020 23:02:39 -0400 +Subject: PCI: vmd: Filter resource type bits from shadow register + +From: Jon Derrick + +[ 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 +Signed-off-by: Lorenzo Pieralisi +Signed-off-by: Sasha Levin +--- + 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 afc1a3d240b57..87348ecfe3fcf 100644 +--- a/drivers/pci/controller/vmd.c ++++ b/drivers/pci/controller/vmd.c +@@ -593,9 +593,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.4/perf-report-fix-null-pointer-dereference-in-hists__f.patch b/queue-5.4/perf-report-fix-null-pointer-dereference-in-hists__f.patch new file mode 100644 index 00000000000..b870d4422b8 --- /dev/null +++ b/queue-5.4/perf-report-fix-null-pointer-dereference-in-hists__f.patch @@ -0,0 +1,46 @@ +From 794ea42e47513d56c328bdeac376467b215486bc Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Cc: Alexander Shishkin +Cc: Ingo Molnar +Cc: Jiri Olsa +Cc: Kan Liang +Cc: Mark Rutland +Cc: Namhyung Kim +Cc: Peter Zijlstra +Link: http://lore.kernel.org/lkml/ +Signed-off-by: Gaurav Singh +Signed-off-by: Sasha Levin +--- + 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 4d8db41b949a4..d3c0b04e2e22b 100644 +--- a/tools/perf/builtin-report.c ++++ b/tools/perf/builtin-report.c +@@ -462,8 +462,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.4/perf-stat-fix-null-pointer-dereference.patch b/queue-5.4/perf-stat-fix-null-pointer-dereference.patch new file mode 100644 index 00000000000..febf1cd02d1 --- /dev/null +++ b/queue-5.4/perf-stat-fix-null-pointer-dereference.patch @@ -0,0 +1,52 @@ +From 504b82851bc742e3a66ec2ead0d954380a6b762d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 5 Jun 2020 17:17:40 +0800 +Subject: perf stat: Fix NULL pointer dereference + +From: Hongbo Yao + +[ 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 +Cc: Alexander Shishkin +Cc: Jiri Olsa +Cc: Mark Rutland +Cc: Namhyung Kim +Cc: Wei Li +Link: https://lore.kernel.org/lkml/20200608163625.GC3073@kernel.org +Signed-off-by: Arnaldo Carvalho de Melo +Signed-off-by: Sasha Levin +--- + 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 ed3b0ac2f7850..373e399e57d28 100644 +--- a/tools/perf/util/stat-display.c ++++ b/tools/perf/util/stat-display.c +@@ -661,7 +661,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); +@@ -1140,7 +1140,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; + + for (s = 0; s < config->aggr_map->nr; s++) { +-- +2.25.1 + diff --git a/queue-5.4/pinctrl-freescale-imx-fix-an-error-handling-path-in-.patch b/queue-5.4/pinctrl-freescale-imx-fix-an-error-handling-path-in-.patch new file mode 100644 index 00000000000..136b17d4be7 --- /dev/null +++ b/queue-5.4/pinctrl-freescale-imx-fix-an-error-handling-path-in-.patch @@ -0,0 +1,76 @@ +From 219e16c555750e40c5ef72efb654df97080f00a8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Reviewed-by: Dong Aisheng +Link: https://lore.kernel.org/r/20200530204955.588962-1-christophe.jaillet@wanadoo.fr +Signed-off-by: Linus Walleij +Signed-off-by: Sasha Levin +--- + 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.4/pinctrl-freescale-imx-use-devm_of_iomap-to-avoid-a-r.patch b/queue-5.4/pinctrl-freescale-imx-use-devm_of_iomap-to-avoid-a-r.patch new file mode 100644 index 00000000000..a03b5ea06ce --- /dev/null +++ b/queue-5.4/pinctrl-freescale-imx-use-devm_of_iomap-to-avoid-a-r.patch @@ -0,0 +1,50 @@ +From dc4af01da9e16223769a534984b494aaa6b7952a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Signed-off-by: Christophe JAILLET +Reviewed-by: Dan Carpenter +Link: https://lore.kernel.org/r/20200602200626.677981-1-christophe.jaillet@wanadoo.fr +Signed-off-by: Linus Walleij +Signed-off-by: Sasha Levin +--- + 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.4/pinctrl-imxl-fix-an-error-handling-path-in-imx1_pinc.patch b/queue-5.4/pinctrl-imxl-fix-an-error-handling-path-in-imx1_pinc.patch new file mode 100644 index 00000000000..8b7fe67b509 --- /dev/null +++ b/queue-5.4/pinctrl-imxl-fix-an-error-handling-path-in-imx1_pinc.patch @@ -0,0 +1,39 @@ +From 10853b7a56179373d22ad26e196dd29dd9879038 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Link: https://lore.kernel.org/r/20200530201952.585798-1-christophe.jaillet@wanadoo.fr +Signed-off-by: Linus Walleij +Signed-off-by: Sasha Levin +--- + 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 7e29e3fecdb24..5bb183c0ce310 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.4/pinctrl-ocelot-fix-gpio-interrupt-decoding-on-jaguar.patch b/queue-5.4/pinctrl-ocelot-fix-gpio-interrupt-decoding-on-jaguar.patch new file mode 100644 index 00000000000..86c0db2a088 --- /dev/null +++ b/queue-5.4/pinctrl-ocelot-fix-gpio-interrupt-decoding-on-jaguar.patch @@ -0,0 +1,45 @@ +From 27eaade6e15c69011353431b2a6ca0bbc996331f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 13 May 2020 14:55:21 +0200 +Subject: pinctrl: ocelot: Fix GPIO interrupt decoding on Jaguar2 + +From: Lars Povlsen + +[ 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 +Signed-off-by: Lars Povlsen +Link: https://lore.kernel.org/r/20200513125532.24585-4-lars.povlsen@microchip.com +Signed-off-by: Linus Walleij +Signed-off-by: Sasha Levin +--- + 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 fb76fb2e9ea54..0a951a75c82b3 100644 +--- a/drivers/pinctrl/pinctrl-ocelot.c ++++ b/drivers/pinctrl/pinctrl-ocelot.c +@@ -711,11 +711,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, ®); ++ regmap_read(info->map, id_reg + 4 * i, ®); + if (!reg) + continue; + +-- +2.25.1 + diff --git a/queue-5.4/pinctrl-rockchip-fix-memleak-in-rockchip_dt_node_to_.patch b/queue-5.4/pinctrl-rockchip-fix-memleak-in-rockchip_dt_node_to_.patch new file mode 100644 index 00000000000..64f1fef57e6 --- /dev/null +++ b/queue-5.4/pinctrl-rockchip-fix-memleak-in-rockchip_dt_node_to_.patch @@ -0,0 +1,64 @@ +From 4528c80a8aecfdf4970c6821d7b06f9c1f5c7225 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 6 May 2020 12:09:03 +0200 +Subject: pinctrl: rockchip: fix memleak in rockchip_dt_node_to_map + +From: Dafna Hirschfeld + +[ 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 +Reviewed-by: Heiko Stuebner +Link: https://lore.kernel.org/r/20200506100903.15420-1-dafna.hirschfeld@collabora.com +Signed-off-by: Linus Walleij +Signed-off-by: Sasha Levin +--- + 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 dc0bbf198cbcf..1bd8840e11a6e 100644 +--- a/drivers/pinctrl/pinctrl-rockchip.c ++++ b/drivers/pinctrl/pinctrl-rockchip.c +@@ -506,8 +506,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; + +@@ -517,7 +517,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; +@@ -544,6 +544,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.4/pinctrl-rza1-fix-wrong-array-assignment-of-rza1l_swi.patch b/queue-5.4/pinctrl-rza1-fix-wrong-array-assignment-of-rza1l_swi.patch new file mode 100644 index 00000000000..a971618fbb3 --- /dev/null +++ b/queue-5.4/pinctrl-rza1-fix-wrong-array-assignment-of-rza1l_swi.patch @@ -0,0 +1,48 @@ +From 7a857d06c8cbec5bf007478af834f9107e0aa83f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Signed-off-by: Jason Yan +Link: https://lore.kernel.org/r/20200417111604.19143-1-yanaijie@huawei.com +Signed-off-by: Geert Uytterhoeven +Signed-off-by: Sasha Levin +--- + 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 017fc6b3e27ec..ca9da61cfc4eb 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.4/power-supply-bq24257_charger-replace-depends-on-regm.patch b/queue-5.4/power-supply-bq24257_charger-replace-depends-on-regm.patch new file mode 100644 index 00000000000..80df52e10ed --- /dev/null +++ b/queue-5.4/power-supply-bq24257_charger-replace-depends-on-regm.patch @@ -0,0 +1,39 @@ +From e97a6d8bc0b9b7e0933a17d889c94a52f9e9e113 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Signed-off-by: Sebastian Reichel +Signed-off-by: Sasha Levin +--- + 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 c84a7b1caeb68..d6fdc10c29f0b 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.4/power-supply-lp8788-fix-an-error-handling-path-in-lp.patch b/queue-5.4/power-supply-lp8788-fix-an-error-handling-path-in-lp.patch new file mode 100644 index 00000000000..8384bb6ba3f --- /dev/null +++ b/queue-5.4/power-supply-lp8788-fix-an-error-handling-path-in-lp.patch @@ -0,0 +1,71 @@ +From 8949b12ce00e1723bfe1ad9ee2582894c00f379e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Signed-off-by: Sebastian Reichel +Signed-off-by: Sasha Levin +--- + 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.4/power-supply-smb347-charger-irqstat_d-is-volatile.patch b/queue-5.4/power-supply-smb347-charger-irqstat_d-is-volatile.patch new file mode 100644 index 00000000000..84dc9a82bf8 --- /dev/null +++ b/queue-5.4/power-supply-smb347-charger-irqstat_d-is-volatile.patch @@ -0,0 +1,38 @@ +From 36e62e03583ec136c4a295ea21250fb20be7120e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 29 Mar 2020 18:15:44 +0200 +Subject: power: supply: smb347-charger: IRQSTAT_D is volatile + +From: Dmitry Osipenko + +[ 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 +Signed-off-by: Dmitry Osipenko +Signed-off-by: David Heidelberg +Signed-off-by: Sebastian Reichel +Signed-off-by: Sasha Levin +--- + 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.4/powerpc-32s-don-t-warn-when-mapping-ro-data-rox.patch b/queue-5.4/powerpc-32s-don-t-warn-when-mapping-ro-data-rox.patch new file mode 100644 index 00000000000..1025a5cf54b --- /dev/null +++ b/queue-5.4/powerpc-32s-don-t-warn-when-mapping-ro-data-rox.patch @@ -0,0 +1,58 @@ +From 9b897a52f41c1621e250e50b48fd1a9bf4fbac7a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 19 May 2020 05:48:56 +0000 +Subject: powerpc/32s: Don't warn when mapping RO data ROX. + +From: Christophe Leroy + +[ 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 +Signed-off-by: Michael Ellerman +Link: https://lore.kernel.org/r/6499f8eeb2a36330e5c9fc1cee9a79374875bd54.1589866984.git.christophe.leroy@csgroup.eu +Signed-off-by: Sasha Levin +--- + 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 84d5fab94f8f8..1424a120710e4 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.4/powerpc-4xx-don-t-unmap-null-mbase.patch b/queue-5.4/powerpc-4xx-don-t-unmap-null-mbase.patch new file mode 100644 index 00000000000..5eb52665fa6 --- /dev/null +++ b/queue-5.4/powerpc-4xx-don-t-unmap-null-mbase.patch @@ -0,0 +1,43 @@ +From 31e06fb7952b6de54c03774f6fbdff71db88c141 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 21 May 2020 17:26:48 +1000 +Subject: powerpc/4xx: Don't unmap NULL mbase + +From: huhai + +[ Upstream commit bcec081ecc940fc38730b29c743bbee661164161 ] + +Signed-off-by: huhai +Signed-off-by: Michael Ellerman +Link: https://lore.kernel.org/r/20200521072648.1254699-1-mpe@ellerman.id.au +Signed-off-by: Sasha Levin +--- + 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.4/powerpc-64-don-t-initialise-init_task-thread.regs.patch b/queue-5.4/powerpc-64-don-t-initialise-init_task-thread.regs.patch new file mode 100644 index 00000000000..b857e600855 --- /dev/null +++ b/queue-5.4/powerpc-64-don-t-initialise-init_task-thread.regs.patch @@ -0,0 +1,182 @@ +From f7acc26beca3d40ff2224a4aa98eb69de026b023 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 28 Apr 2020 22:31:30 +1000 +Subject: powerpc/64: Don't initialise init_task->thread.regs + +From: Michael Ellerman + +[ 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 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 +Signed-off-by: Michael Ellerman +Link: https://lore.kernel.org/r/20200428123130.73078-1-mpe@ellerman.id.au +Signed-off-by: Sasha Levin +--- + 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 a9993e7a443bc..64b998db9d3e9 100644 +--- a/arch/powerpc/include/asm/processor.h ++++ b/arch/powerpc/include/asm/processor.h +@@ -291,7 +291,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 ad79fddb974de..780f527eabd2c 100644 +--- a/arch/powerpc/kernel/head_64.S ++++ b/arch/powerpc/kernel/head_64.S +@@ -945,15 +945,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.4/powerpc-64s-exception-fix-machine-check-no-loss-idle.patch b/queue-5.4/powerpc-64s-exception-fix-machine-check-no-loss-idle.patch new file mode 100644 index 00000000000..3460898ea10 --- /dev/null +++ b/queue-5.4/powerpc-64s-exception-fix-machine-check-no-loss-idle.patch @@ -0,0 +1,75 @@ +From 98f3a8edbd72c496dadd010025eb51c41fd1d712 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 8 May 2020 14:33:53 +1000 +Subject: powerpc/64s/exception: Fix machine check no-loss idle wakeup + +From: Nicholas Piggin + +[ 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 +Signed-off-by: Michael Ellerman +Link: https://lore.kernel.org/r/20200508043408.886394-2-npiggin@gmail.com +Signed-off-by: Sasha Levin +--- + 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 d0018dd17e0a6..70ac8a6ba0c18 100644 +--- a/arch/powerpc/kernel/exceptions-64s.S ++++ b/arch/powerpc/kernel/exceptions-64s.S +@@ -1090,17 +1090,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 +@@ -1109,7 +1111,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.4/powerpc-64s-pgtable-fix-an-undefined-behaviour.patch b/queue-5.4/powerpc-64s-pgtable-fix-an-undefined-behaviour.patch new file mode 100644 index 00000000000..c382e0715f7 --- /dev/null +++ b/queue-5.4/powerpc-64s-pgtable-fix-an-undefined-behaviour.patch @@ -0,0 +1,79 @@ +From 382e68303356e5b35ca5bb6dfe8fa5656e420541 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 5 Mar 2020 23:48:52 -0500 +Subject: powerpc/64s/pgtable: fix an undefined behaviour + +From: Qian Cai + +[ 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 +Signed-off-by: Qian Cai +Signed-off-by: Michael Ellerman +Reviewed-by: Christophe Leroy +Link: https://lore.kernel.org/r/20200306044852.3236-1-cai@lca.pw +Signed-off-by: Sasha Levin +--- + 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 a143d394ff46f..e1eb8aa9cfbbb 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.4/powerpc-crashkernel-take-mem-option-into-account.patch b/queue-5.4/powerpc-crashkernel-take-mem-option-into-account.patch new file mode 100644 index 00000000000..3ed8b85e043 --- /dev/null +++ b/queue-5.4/powerpc-crashkernel-take-mem-option-into-account.patch @@ -0,0 +1,81 @@ +From 33b2fb09be76c10079421318fdab2faa46f7ef2c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 1 Apr 2020 22:00:44 +0800 +Subject: powerpc/crashkernel: Take "mem=" option into account + +From: Pingfan Liu + +[ 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 +Reviewed-by: Hari Bathini +Signed-off-by: Michael Ellerman +Link: https://lore.kernel.org/r/1585749644-4148-1-git-send-email-kernelfans@gmail.com +Signed-off-by: Sasha Levin +--- + arch/powerpc/kernel/machine_kexec.c | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +diff --git a/arch/powerpc/kernel/machine_kexec.c b/arch/powerpc/kernel/machine_kexec.c +index c4ed328a7b963..7a1c11a7cba5a 100644 +--- a/arch/powerpc/kernel/machine_kexec.c ++++ b/arch/powerpc/kernel/machine_kexec.c +@@ -114,11 +114,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; +@@ -177,6 +178,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); + } +@@ -185,7 +187,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.4/powerpc-fix-kernel-crash-in-show_instructions-w-debu.patch b/queue-5.4/powerpc-fix-kernel-crash-in-show_instructions-w-debu.patch new file mode 100644 index 00000000000..89fe485ebd3 --- /dev/null +++ b/queue-5.4/powerpc-fix-kernel-crash-in-show_instructions-w-debu.patch @@ -0,0 +1,86 @@ +From 43f07752951df2216d66032fab583172c10041a6 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +[mpe: Use IS_ENABLED(), massage change log] +Signed-off-by: Michael Ellerman +Link: https://lore.kernel.org/r/20200524093822.423487-1-aneesh.kumar@linux.ibm.com +Signed-off-by: Sasha Levin +--- + 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 639ceae7da9d8..bd0c258a1d5dd 100644 +--- a/arch/powerpc/kernel/process.c ++++ b/arch/powerpc/kernel/process.c +@@ -1218,29 +1218,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.4/powerpc-kasan-fix-stack-overflow-by-increasing-threa.patch b/queue-5.4/powerpc-kasan-fix-stack-overflow-by-increasing-threa.patch new file mode 100644 index 00000000000..10cc7f25161 --- /dev/null +++ b/queue-5.4/powerpc-kasan-fix-stack-overflow-by-increasing-threa.patch @@ -0,0 +1,40 @@ +From d648312ba5566cf791eec5f648a50e9e57d4e5ff Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 8 Apr 2020 15:58:49 +0000 +Subject: powerpc/kasan: Fix stack overflow by increasing THREAD_SHIFT + +From: Christophe Leroy + +[ 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: +Signed-off-by: Christophe Leroy +Signed-off-by: Michael Ellerman +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 +--- + arch/powerpc/Kconfig | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig +index 44431dc06982f..ad620637cbd11 100644 +--- a/arch/powerpc/Kconfig ++++ b/arch/powerpc/Kconfig +@@ -747,6 +747,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.4/powerpc-perf-hv-24x7-fix-inconsistent-output-values-.patch b/queue-5.4/powerpc-perf-hv-24x7-fix-inconsistent-output-values-.patch new file mode 100644 index 00000000000..f0920a3cf84 --- /dev/null +++ b/queue-5.4/powerpc-perf-hv-24x7-fix-inconsistent-output-values-.patch @@ -0,0 +1,96 @@ +From 1a341022f6d2c455db13bb74b168d51561d3f3c8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Signed-off-by: Kajol Jain +Tested-by: Madhavan Srinivasan +Signed-off-by: Michael Ellerman +Link: https://lore.kernel.org/r/20200525104308.9814-2-kjain@linux.ibm.com +Signed-off-by: Sasha Levin +--- + 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.4/powerpc-ps3-fix-kexec-shutdown-hang.patch b/queue-5.4/powerpc-ps3-fix-kexec-shutdown-hang.patch new file mode 100644 index 00000000000..239d171043b --- /dev/null +++ b/queue-5.4/powerpc-ps3-fix-kexec-shutdown-hang.patch @@ -0,0 +1,83 @@ +From ce27be3eb9da1ccc585bab8a63edc4f7bdde7286 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 9 May 2020 18:58:32 +0000 +Subject: powerpc/ps3: Fix kexec shutdown hang + +From: Geoff Levand + +[ 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 +Signed-off-by: Michael Ellerman +Link: https://lore.kernel.org/r/7325c4af2b4c989c19d6a26b90b1fec9c0615ddf.1589049250.git.geoff@infradead.org +Signed-off-by: Sasha Levin +--- + 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.4/powerpc-pseries-ras-fix-fwnmi_valid-off-by-one.patch b/queue-5.4/powerpc-pseries-ras-fix-fwnmi_valid-off-by-one.patch new file mode 100644 index 00000000000..ebfc7bd3bce --- /dev/null +++ b/queue-5.4/powerpc-pseries-ras-fix-fwnmi_valid-off-by-one.patch @@ -0,0 +1,46 @@ +From 4fec7c577fc8b8cab25c3df1e22ddcd0e642dac0 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 8 May 2020 14:33:58 +1000 +Subject: powerpc/pseries/ras: Fix FWNMI_VALID off by one + +From: Nicholas Piggin + +[ 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 +Signed-off-by: Michael Ellerman +Acked-by: Mahesh Salgaonkar +Link: https://lore.kernel.org/r/20200508043408.886394-7-npiggin@gmail.com +Signed-off-by: Sasha Levin +--- + 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 753adeb624f23..13ef77fd648f4 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.4/powerpc-ptdump-add-_page_coherent-flag.patch b/queue-5.4/powerpc-ptdump-add-_page_coherent-flag.patch new file mode 100644 index 00000000000..ee2058b3975 --- /dev/null +++ b/queue-5.4/powerpc-ptdump-add-_page_coherent-flag.patch @@ -0,0 +1,40 @@ +From 6a594b50533e07482e60803c9ce53f686faf3392 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 19 May 2020 05:48:51 +0000 +Subject: powerpc/ptdump: Add _PAGE_COHERENT flag + +From: Christophe Leroy + +[ 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 +[mpe: Make it more verbose, use "coherent" rather than "m"] +Signed-off-by: Michael Ellerman +Link: https://lore.kernel.org/r/324c3d860717e8e91fca3bb6c0f8b23e1644a404.1589866984.git.christophe.leroy@csgroup.eu +Signed-off-by: Sasha Levin +--- + 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.4/ps3disk-use-the-default-segment-boundary.patch b/queue-5.4/ps3disk-use-the-default-segment-boundary.patch new file mode 100644 index 00000000000..03ac209ec91 --- /dev/null +++ b/queue-5.4/ps3disk-use-the-default-segment-boundary.patch @@ -0,0 +1,89 @@ +From bef92003cf68c7fbe490bf0181d4ff429ed95392 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 9 May 2020 18:58:32 +0000 +Subject: ps3disk: use the default segment boundary + +From: Emmanuel Nicolet + +[ 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 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 +Signed-off-by: Geoff Levand +Signed-off-by: Michael Ellerman +Link: https://lore.kernel.org/r/060a416c43138f45105c0540eff1a45539f7e2fc.1589049250.git.geoff@infradead.org +Signed-off-by: Sasha Levin +--- + 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.4/pwm-img-call-pm_runtime_put-in-pm_runtime_get_sync-f.patch b/queue-5.4/pwm-img-call-pm_runtime_put-in-pm_runtime_get_sync-f.patch new file mode 100644 index 00000000000..da16a58f426 --- /dev/null +++ b/queue-5.4/pwm-img-call-pm_runtime_put-in-pm_runtime_get_sync-f.patch @@ -0,0 +1,51 @@ +From 1aa26ce7873f376784171bd8e67e6ec1fa3b3f6f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Signed-off-by: Thierry Reding +Signed-off-by: Sasha Levin +--- + 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.4/rdma-core-fix-several-reference-count-leaks.patch b/queue-5.4/rdma-core-fix-several-reference-count-leaks.patch new file mode 100644 index 00000000000..38ac41c204c --- /dev/null +++ b/queue-5.4/rdma-core-fix-several-reference-count-leaks.patch @@ -0,0 +1,63 @@ +From 960f7c5d4efbf3cc99b804e179fddf7b557e44d3 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 27 May 2020 22:02:30 -0500 +Subject: RDMA/core: Fix several reference count leaks. + +From: Qiushi Wu + +[ 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 +Reviewed-by: Jason Gunthorpe +Signed-off-by: Jason Gunthorpe +Signed-off-by: Sasha Levin +--- + 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 7a50cedcef1f6..091cca9d88ed7 100644 +--- a/drivers/infiniband/core/sysfs.c ++++ b/drivers/infiniband/core/sysfs.c +@@ -1060,8 +1060,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); +@@ -1074,8 +1073,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) { +@@ -1406,8 +1404,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.4/rdma-hns-bugfix-for-querying-qkey.patch b/queue-5.4/rdma-hns-bugfix-for-querying-qkey.patch new file mode 100644 index 00000000000..e1986d87404 --- /dev/null +++ b/queue-5.4/rdma-hns-bugfix-for-querying-qkey.patch @@ -0,0 +1,38 @@ +From 8ccd2583b643b63102a9d01df6da2a73e156ca53 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 8 May 2020 17:45:51 +0800 +Subject: RDMA/hns: Bugfix for querying qkey + +From: Lijun Ou + +[ 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 +Signed-off-by: Weihang Li +Signed-off-by: Jason Gunthorpe +Signed-off-by: Sasha Levin +--- + 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 4540b00ccee94..9a8053bd01e22 100644 +--- a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c ++++ b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c +@@ -4564,7 +4564,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.4/rdma-hns-fix-cmdq-parameter-of-querying-pf-timer-res.patch b/queue-5.4/rdma-hns-fix-cmdq-parameter-of-querying-pf-timer-res.patch new file mode 100644 index 00000000000..de1aad11a62 --- /dev/null +++ b/queue-5.4/rdma-hns-fix-cmdq-parameter-of-querying-pf-timer-res.patch @@ -0,0 +1,77 @@ +From 2c5b1ae1d6662f665a11d3e33602c584ee29ca4e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 8 May 2020 17:45:52 +0800 +Subject: RDMA/hns: Fix cmdq parameter of querying pf timer resource + +From: Lang Cheng + +[ 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 +Signed-off-by: Weihang Li +Signed-off-by: Jason Gunthorpe +Signed-off-by: Sasha Levin +--- + 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 9a8053bd01e22..0502c90c83edd 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.4/rdma-iw_cxgb4-cleanup-device-debugfs-entries-on-uld-.patch b/queue-5.4/rdma-iw_cxgb4-cleanup-device-debugfs-entries-on-uld-.patch new file mode 100644 index 00000000000..c483008a6b4 --- /dev/null +++ b/queue-5.4/rdma-iw_cxgb4-cleanup-device-debugfs-entries-on-uld-.patch @@ -0,0 +1,35 @@ +From 34a2d21df210662c165163d96bd87038bd88c1bc Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 25 May 2020 00:38:14 +0530 +Subject: RDMA/iw_cxgb4: cleanup device debugfs entries on ULD remove + +From: Potnuri Bharat Teja + +[ 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 +Signed-off-by: Jason Gunthorpe +Signed-off-by: Sasha Levin +--- + 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.4/rdma-mlx5-add-init2init-as-a-modify-command.patch b/queue-5.4/rdma-mlx5-add-init2init-as-a-modify-command.patch new file mode 100644 index 00000000000..84c9aaca9d6 --- /dev/null +++ b/queue-5.4/rdma-mlx5-add-init2init-as-a-modify-command.patch @@ -0,0 +1,39 @@ +From 1c6b9e14e8d06a39c53375af450fd0ea0401c993 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 13 May 2020 12:55:50 +0300 +Subject: RDMA/mlx5: Add init2init as a modify command + +From: Aharon Landau + +[ 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 +Reviewed-by: Maor Gottlieb +Signed-off-by: Leon Romanovsky +Signed-off-by: Jason Gunthorpe +Signed-off-by: Sasha Levin +--- + 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 d609f4659afb7..bba7ab0784305 100644 +--- a/drivers/infiniband/hw/mlx5/devx.c ++++ b/drivers/infiniband/hw/mlx5/devx.c +@@ -814,6 +814,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.4/rdma-mlx5-fix-udata-response-upon-srq-creation.patch b/queue-5.4/rdma-mlx5-fix-udata-response-upon-srq-creation.patch new file mode 100644 index 00000000000..285bbe1a01a --- /dev/null +++ b/queue-5.4/rdma-mlx5-fix-udata-response-upon-srq-creation.patch @@ -0,0 +1,50 @@ +From af978b4c970f67b24ca1df1da7898bffbeb334d6 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 6 Apr 2020 20:35:40 +0300 +Subject: RDMA/mlx5: Fix udata response upon SRQ creation + +From: Yishai Hadas + +[ 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 +Signed-off-by: Leon Romanovsky +Signed-off-by: Jason Gunthorpe +Signed-off-by: Sasha Levin +--- + 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 4e7fde86c96b3..c29c1f7da4a14 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.4/remoteproc-fix-idr-initialisation-in-rproc_alloc.patch b/queue-5.4/remoteproc-fix-idr-initialisation-in-rproc_alloc.patch new file mode 100644 index 00000000000..4000c615a68 --- /dev/null +++ b/queue-5.4/remoteproc-fix-idr-initialisation-in-rproc_alloc.patch @@ -0,0 +1,60 @@ +From b084e1e22238e199957061c65d9b109dd6d5346a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 15 Apr 2020 14:48:52 -0600 +Subject: remoteproc: Fix IDR initialisation in rproc_alloc() + +From: Alex Elder + +[ 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 +Reviewed-by: Mathieu Poirier +Reviewed-by: Suman Anna +Reviewed-by: Bjorn Andersson +Link: https://lore.kernel.org/r/20200415204858.2448-2-mathieu.poirier@linaro.org +Signed-off-by: Bjorn Andersson +Signed-off-by: Sasha Levin +--- + 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 0896b3614eb11..ce92ae227aa10 100644 +--- a/drivers/remoteproc/remoteproc_core.c ++++ b/drivers/remoteproc/remoteproc_core.c +@@ -2036,6 +2036,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); +@@ -2060,8 +2061,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.4/remoteproc-qcom_q6v5_mss-map-unmap-mpss-segments-bef.patch b/queue-5.4/remoteproc-qcom_q6v5_mss-map-unmap-mpss-segments-bef.patch new file mode 100644 index 00000000000..e19fe26b75a --- /dev/null +++ b/queue-5.4/remoteproc-qcom_q6v5_mss-map-unmap-mpss-segments-bef.patch @@ -0,0 +1,110 @@ +From 19916e52b7f8ecc96154d967efbd9393cf32e9b6 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 15 Apr 2020 12:46:18 +0530 +Subject: remoteproc: qcom_q6v5_mss: map/unmap mpss segments before/after use + +From: Sibi Sankar + +[ 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 +Signed-off-by: Sibi Sankar +Link: https://lore.kernel.org/r/20200415071619.6052-1-sibis@codeaurora.org +Signed-off-by: Bjorn Andersson +Signed-off-by: Sasha Levin +--- + 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 6ba065d5c4d95..d84e9f306086b 100644 +--- a/drivers/remoteproc/qcom_q6v5_mss.c ++++ b/drivers/remoteproc/qcom_q6v5_mss.c +@@ -1005,7 +1005,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 */ +@@ -1014,6 +1020,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; + } + +@@ -1024,6 +1031,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; + } + +@@ -1036,6 +1044,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; + } + +@@ -1075,7 +1084,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) { +@@ -1089,10 +1099,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; + +@@ -1393,12 +1408,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.4/rtc-mc13xxx-fix-a-double-unlock-issue.patch b/queue-5.4/rtc-mc13xxx-fix-a-double-unlock-issue.patch new file mode 100644 index 00000000000..6822114f8d5 --- /dev/null +++ b/queue-5.4/rtc-mc13xxx-fix-a-double-unlock-issue.patch @@ -0,0 +1,47 @@ +From 26ec701b26d09fea80e337bdf8463f360a1315a9 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Link: https://lore.kernel.org/r/20200503182235.1652-1-wu000273@umn.edu +Signed-off-by: Alexandre Belloni +Signed-off-by: Sasha Levin +--- + 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.4/rtc-rv3028-add-missed-check-for-devm_regmap_init_i2c.patch b/queue-5.4/rtc-rv3028-add-missed-check-for-devm_regmap_init_i2c.patch new file mode 100644 index 00000000000..65738463589 --- /dev/null +++ b/queue-5.4/rtc-rv3028-add-missed-check-for-devm_regmap_init_i2c.patch @@ -0,0 +1,37 @@ +From 38c2da50e5fee79d9f555f8ffd0a8906f183ee5b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 28 May 2020 18:39:50 +0800 +Subject: rtc: rv3028: Add missed check for devm_regmap_init_i2c() + +From: Chuhong Yuan + +[ 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 +Signed-off-by: Alexandre Belloni +Link: https://lore.kernel.org/r/20200528103950.912353-1-hslester96@gmail.com +Signed-off-by: Sasha Levin +--- + 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 2b316661a5782..bbdfebd706442 100644 +--- a/drivers/rtc/rtc-rv3028.c ++++ b/drivers/rtc/rtc-rv3028.c +@@ -625,6 +625,8 @@ static int rv3028_probe(struct i2c_client *client) + return -ENOMEM; + + rv3028->regmap = devm_regmap_init_i2c(client, ®map_config); ++ if (IS_ERR(rv3028->regmap)) ++ return PTR_ERR(rv3028->regmap); + + i2c_set_clientdata(client, rv3028); + +-- +2.25.1 + diff --git a/queue-5.4/rxrpc-adjust-proc-net-rxrpc-calls-to-display-call-de.patch b/queue-5.4/rxrpc-adjust-proc-net-rxrpc-calls-to-display-call-de.patch new file mode 100644 index 00000000000..10195de424f --- /dev/null +++ b/queue-5.4/rxrpc-adjust-proc-net-rxrpc-calls-to-display-call-de.patch @@ -0,0 +1,54 @@ +From bda9bb55299c4731b1186e186d6111ba36c5cad8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Signed-off-by: Sasha Levin +--- + 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.4/s390-qdio-put-thinint-indicator-after-early-error.patch b/queue-5.4/s390-qdio-put-thinint-indicator-after-early-error.patch new file mode 100644 index 00000000000..b6359a3bf50 --- /dev/null +++ b/queue-5.4/s390-qdio-put-thinint-indicator-after-early-error.patch @@ -0,0 +1,85 @@ +From 77f8a2788089e4331d9a91dac3a8adbbbf534a5a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 9 Apr 2020 09:59:39 +0200 +Subject: s390/qdio: put thinint indicator after early error + +From: Julian Wiedmann + +[ 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 +Reviewed-by: Benjamin Block +Signed-off-by: Vasily Gorbik +Signed-off-by: Sasha Levin +--- + 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 a58b45df95d7e..3b0a4483a2520 100644 +--- a/drivers/s390/cio/qdio.h ++++ b/drivers/s390/cio/qdio.h +@@ -372,7 +372,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_input_queues(struct qdio_irq *irq_ptr); +diff --git a/drivers/s390/cio/qdio_setup.c b/drivers/s390/cio/qdio_setup.c +index ee0b3c5862110..9dc56aa3ae559 100644 +--- a/drivers/s390/cio/qdio_setup.c ++++ b/drivers/s390/cio/qdio_setup.c +@@ -479,7 +479,6 @@ int qdio_setup_irq(struct qdio_initialize *init_data) + setup_queues(irq_ptr, 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 93ee067c10cab..ddf780b12d408 100644 +--- a/drivers/s390/cio/qdio_thinint.c ++++ b/drivers/s390/cio/qdio_thinint.c +@@ -268,17 +268,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.4/scripts-headers_install-exit-with-error-on-config-le.patch b/queue-5.4/scripts-headers_install-exit-with-error-on-config-le.patch new file mode 100644 index 00000000000..286bad07e63 --- /dev/null +++ b/queue-5.4/scripts-headers_install-exit-with-error-on-config-le.patch @@ -0,0 +1,61 @@ +From 3b9c3174a98266206e51c3dccf5de312b5f02ebb Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 5 May 2020 18:52:37 -0700 +Subject: scripts: headers_install: Exit with error on config leak + +From: Siddharth Gupta + +[ 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 +Signed-off-by: Masahiro Yamada +Signed-off-by: Sasha Levin +--- + 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.4/scsi-acornscsi-fix-an-error-handling-path-in-acornsc.patch b/queue-5.4/scsi-acornscsi-fix-an-error-handling-path-in-acornsc.patch new file mode 100644 index 00000000000..963164ecae7 --- /dev/null +++ b/queue-5.4/scsi-acornscsi-fix-an-error-handling-path-in-acornsc.patch @@ -0,0 +1,40 @@ +From 516f7bb5497be733931975ee62772511d8febc8f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 30 May 2020 10:16:22 +0200 +Subject: scsi: acornscsi: Fix an error handling path in acornscsi_probe() + +From: Christophe JAILLET + +[ 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 +Signed-off-by: Martin K. Petersen +Signed-off-by: Sasha Levin +--- + 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 d12dd89538df2..deab66598910d 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.4/scsi-core-free-sgtables-in-case-command-setup-fails.patch b/queue-5.4/scsi-core-free-sgtables-in-case-command-setup-fails.patch new file mode 100644 index 00000000000..efbb3fd2f45 --- /dev/null +++ b/queue-5.4/scsi-core-free-sgtables-in-case-command-setup-fails.patch @@ -0,0 +1,95 @@ +From c53bc9a7b4bb4bd715dca8ab6d78b2e44813bfc8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 28 Apr 2020 19:45:55 +0900 +Subject: scsi: core: free sgtables in case command setup fails + +From: Johannes Thumshirn + +[ 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 +Reviewed-by: Daniel Wagner +Reviewed-by: Hannes Reinecke +Signed-off-by: Johannes Thumshirn +Signed-off-by: Martin K. Petersen +Signed-off-by: Sasha Levin +--- + 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 91c007d26c1ef..206c9f53e9e7a 100644 +--- a/drivers/scsi/scsi_lib.c ++++ b/drivers/scsi/scsi_lib.c +@@ -551,7 +551,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, +@@ -563,7 +563,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); + scsi_del_cmd_from_list(cmd); + } +@@ -1063,7 +1063,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); +@@ -1214,6 +1214,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; +@@ -1223,9 +1224,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.4/scsi-cxgb3i-fix-some-leaks-in-init_act_open.patch b/queue-5.4/scsi-cxgb3i-fix-some-leaks-in-init_act_open.patch new file mode 100644 index 00000000000..a676af02d3a --- /dev/null +++ b/queue-5.4/scsi-cxgb3i-fix-some-leaks-in-init_act_open.patch @@ -0,0 +1,73 @@ +From 8e0182bffba006c23637edf6eabd5b8562661ec6 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 21 May 2020 15:12:21 +0300 +Subject: scsi: cxgb3i: Fix some leaks in init_act_open() + +From: Dan Carpenter + +[ 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 +Signed-off-by: Martin K. Petersen +Signed-off-by: Sasha Levin +--- + 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.4/scsi-hisi_sas-do-not-reset-phy-timer-to-wait-for-str.patch b/queue-5.4/scsi-hisi_sas-do-not-reset-phy-timer-to-wait-for-str.patch new file mode 100644 index 00000000000..8cc88bb25af --- /dev/null +++ b/queue-5.4/scsi-hisi_sas-do-not-reset-phy-timer-to-wait-for-str.patch @@ -0,0 +1,47 @@ +From 8a8a4a1b50ac6621f5798763bbd576e60d6fb2c5 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Signed-off-by: John Garry +Signed-off-by: Martin K. Petersen +Signed-off-by: Sasha Levin +--- + 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 6f4692f0d7143..031aa4043c5ea 100644 +--- a/drivers/scsi/hisi_sas/hisi_sas_main.c ++++ b/drivers/scsi/hisi_sas/hisi_sas_main.c +@@ -904,8 +904,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.4/scsi-ibmvscsi-don-t-send-host-info-in-adapter-info-m.patch b/queue-5.4/scsi-ibmvscsi-don-t-send-host-info-in-adapter-info-m.patch new file mode 100644 index 00000000000..529c6ec0ecb --- /dev/null +++ b/queue-5.4/scsi-ibmvscsi-don-t-send-host-info-in-adapter-info-m.patch @@ -0,0 +1,46 @@ +From 2313ebf24c948420790c1dc9e96e370a7797122b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Signed-off-by: Martin K. Petersen +Signed-off-by: Sasha Levin +--- + 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.4/scsi-iscsi-fix-reference-count-leak-in-iscsi_boot_cr.patch b/queue-5.4/scsi-iscsi-fix-reference-count-leak-in-iscsi_boot_cr.patch new file mode 100644 index 00000000000..aaf544adf80 --- /dev/null +++ b/queue-5.4/scsi-iscsi-fix-reference-count-leak-in-iscsi_boot_cr.patch @@ -0,0 +1,38 @@ +From dab3a5bf48fe48698c0c88caea469553b436f768 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 28 May 2020 15:13:53 -0500 +Subject: scsi: iscsi: Fix reference count leak in iscsi_boot_create_kobj + +From: Qiushi Wu + +[ 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 +Signed-off-by: Qiushi Wu +Signed-off-by: Martin K. Petersen +Signed-off-by: Sasha Levin +--- + 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.4/scsi-lpfc-fix-lpfc_nodelist-leak-when-processing-uns.patch b/queue-5.4/scsi-lpfc-fix-lpfc_nodelist-leak-when-processing-uns.patch new file mode 100644 index 00000000000..570323a0df4 --- /dev/null +++ b/queue-5.4/scsi-lpfc-fix-lpfc_nodelist-leak-when-processing-uns.patch @@ -0,0 +1,51 @@ +From f2794375b9adf24e6cbabdbe9be19ac68a8dc71e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 25 May 2020 22:16:24 +0800 +Subject: scsi: lpfc: Fix lpfc_nodelist leak when processing unsolicited event + +From: Xiyu Yang + +[ 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 +Reviewed-by: James Smart +Signed-off-by: Xiyu Yang +Signed-off-by: Xin Tan +Signed-off-by: Martin K. Petersen +Signed-off-by: Sasha Levin +--- + 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 66f8867dd8377..94d8f28341009 100644 +--- a/drivers/scsi/lpfc/lpfc_els.c ++++ b/drivers/scsi/lpfc/lpfc_els.c +@@ -8394,6 +8394,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.4/scsi-mpt3sas-fix-double-free-warnings.patch b/queue-5.4/scsi-mpt3sas-fix-double-free-warnings.patch new file mode 100644 index 00000000000..2b6b1226f3f --- /dev/null +++ b/queue-5.4/scsi-mpt3sas-fix-double-free-warnings.patch @@ -0,0 +1,43 @@ +From fbdb41592e7b6b9822892ebcbfc2897637cceeb6 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 8 May 2020 07:07:38 -0400 +Subject: scsi: mpt3sas: Fix double free warnings + +From: Suganath Prabu S + +[ 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 +Signed-off-by: Suganath Prabu S +Signed-off-by: Martin K. Petersen +Signed-off-by: Sasha Levin +--- + 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 752b71cfbe12c..7fd1d731555f9 100644 +--- a/drivers/scsi/mpt3sas/mpt3sas_base.c ++++ b/drivers/scsi/mpt3sas/mpt3sas_base.c +@@ -4777,7 +4777,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.4/scsi-qedf-fix-crash-when-mfw-calls-for-protocol-stat.patch b/queue-5.4/scsi-qedf-fix-crash-when-mfw-calls-for-protocol-stat.patch new file mode 100644 index 00000000000..b2b7aa84090 --- /dev/null +++ b/queue-5.4/scsi-qedf-fix-crash-when-mfw-calls-for-protocol-stat.patch @@ -0,0 +1,131 @@ +From f5dc695533b4ac601a3eb94647844f7b96855387 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Signed-off-by: Saurav Kashyap +Signed-off-by: Martin K. Petersen +Signed-off-by: Sasha Levin +--- + 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 59ca98f12afd5..3d0e345947c1f 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.4/scsi-qedi-check-for-buffer-overflow-in-qedi_set_path.patch b/queue-5.4/scsi-qedi-check-for-buffer-overflow-in-qedi_set_path.patch new file mode 100644 index 00000000000..335657d5775 --- /dev/null +++ b/queue-5.4/scsi-qedi-check-for-buffer-overflow-in-qedi_set_path.patch @@ -0,0 +1,45 @@ +From ffeca39c1007a74c733becbd9702967998f7eb97 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 28 Apr 2020 16:19:39 +0300 +Subject: scsi: qedi: Check for buffer overflow in qedi_set_path() + +From: Dan Carpenter + +[ 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 +Signed-off-by: Dan Carpenter +Signed-off-by: Martin K. Petersen +Signed-off-by: Sasha Levin +--- + 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 8829880a54c38..84a639698343c 100644 +--- a/drivers/scsi/qedi/qedi_iscsi.c ++++ b/drivers/scsi/qedi/qedi_iscsi.c +@@ -1214,6 +1214,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.4/scsi-qedi-do-not-flush-offload-work-if-arp-not-resol.patch b/queue-5.4/scsi-qedi-do-not-flush-offload-work-if-arp-not-resol.patch new file mode 100644 index 00000000000..b5a7de6453d --- /dev/null +++ b/queue-5.4/scsi-qedi-do-not-flush-offload-work-if-arp-not-resol.patch @@ -0,0 +1,97 @@ +From 25226bf46f6e2a33d581e93f88bb049dbdc4efe9 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 7 Apr 2020 23:43:30 -0700 +Subject: scsi: qedi: Do not flush offload work if ARP not resolved + +From: Nilesh Javali + +[ 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 +Signed-off-by: Nilesh Javali +Signed-off-by: Manish Rangankar +Signed-off-by: Martin K. Petersen +Signed-off-by: Sasha Levin +--- + 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 84a639698343c..0f57c80734061 100644 +--- a/drivers/scsi/qedi/qedi_iscsi.c ++++ b/drivers/scsi/qedi/qedi_iscsi.c +@@ -997,7 +997,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.4/scsi-qla2xxx-fix-issue-with-adapter-s-stopping-state.patch b/queue-5.4/scsi-qla2xxx-fix-issue-with-adapter-s-stopping-state.patch new file mode 100644 index 00000000000..0a3a6beefa5 --- /dev/null +++ b/queue-5.4/scsi-qla2xxx-fix-issue-with-adapter-s-stopping-state.patch @@ -0,0 +1,91 @@ +From 7c6c60ea5470a4588b74c5f3bd64ef162015d96d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 22 Apr 2020 13:55:52 +0300 +Subject: scsi: qla2xxx: Fix issue with adapter's stopping state + +From: Viacheslav Dubeyko + +[ 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/ +mkdir /sys/kernel/config/target/qla2xxx//tpgt_1 +echo 1 > /sys/kernel/config/target/qla2xxx//tpgt_1/enable +echo 0 > /sys/kernel/config/target/qla2xxx//tpgt_1/enable +echo 1 > /sys/kernel/config/target/qla2xxx//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 + +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 + +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. + +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. + +kernel: PID 1396:qla_target.c:6812 qlt_enable_vha(): tgt_stop 0x1, tgt_stopped 0x0 + +kernel: qla2xxx [0001:00:02.0]-4807:1: PID 346:qla_os.c:6329: ISP abort scheduled. + +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 +Reviewed-by: Himanshu Madhani +Signed-off-by: Viacheslav Dubeyko +Signed-off-by: Martin K. Petersen +Signed-off-by: Sasha Levin +--- + 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 abe7f79bb7895..744cd93189da3 100644 +--- a/drivers/scsi/qla2xxx/tcm_qla2xxx.c ++++ b/drivers/scsi/qla2xxx/tcm_qla2xxx.c +@@ -926,6 +926,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; +@@ -1088,6 +1089,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.4/scsi-qla2xxx-fix-warning-after-fc-target-reset.patch b/queue-5.4/scsi-qla2xxx-fix-warning-after-fc-target-reset.patch new file mode 100644 index 00000000000..8483b2c4ebf --- /dev/null +++ b/queue-5.4/scsi-qla2xxx-fix-warning-after-fc-target-reset.patch @@ -0,0 +1,108 @@ +From 27ec6405e8de6a644991be2219a9e6ead84016f5 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 10 Apr 2020 11:07:08 +0300 +Subject: scsi: qla2xxx: Fix warning after FC target reset + +From: Viacheslav Dubeyko + +[ 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 +[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/ +mkdir /sys/kernel/config/target/qla2xxx//tpgt_1 +echo 1 > /sys/kernel/config/target/qla2xxx//tpgt_1/enable +echo 0 > /sys/kernel/config/target/qla2xxx//tpgt_1/enable +echo 1 > /sys/kernel/config/target/qla2xxx//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 +Signed-off-by: Viacheslav Dubeyko +Signed-off-by: Martin K. Petersen +Signed-off-by: Sasha Levin +--- + 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 03d272a09e26d..d7ec4083a0911 100644 +--- a/drivers/scsi/qla2xxx/qla_os.c ++++ b/drivers/scsi/qla2xxx/qla_os.c +@@ -6295,6 +6295,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.4/scsi-sr-fix-sr_probe-missing-deallocate-of-device-mi.patch b/queue-5.4/scsi-sr-fix-sr_probe-missing-deallocate-of-device-mi.patch new file mode 100644 index 00000000000..25dcd204ccd --- /dev/null +++ b/queue-5.4/scsi-sr-fix-sr_probe-missing-deallocate-of-device-mi.patch @@ -0,0 +1,47 @@ +From a9a585f0d7186c3906cd7c3eebb2cdad9a9b29b4 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 30 May 2020 18:59:44 +0100 +Subject: scsi: sr: Fix sr_probe() missing deallocate of device minor + +From: Simon Arlott + +[ 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 +Signed-off-by: Martin K. Petersen +Signed-off-by: Sasha Levin +--- + 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 4664fdf75c0f1..70a28f6fb1d0d 100644 +--- a/drivers/scsi/sr.c ++++ b/drivers/scsi/sr.c +@@ -750,7 +750,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 +@@ -768,6 +768,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); + fail_free: +-- +2.25.1 + diff --git a/queue-5.4/scsi-target-loopback-fix-read-with-data-and-sensebyt.patch b/queue-5.4/scsi-target-loopback-fix-read-with-data-and-sensebyt.patch new file mode 100644 index 00000000000..855a1e6a5d4 --- /dev/null +++ b/queue-5.4/scsi-target-loopback-fix-read-with-data-and-sensebyt.patch @@ -0,0 +1,105 @@ +From fe1deb822166a90c67638e7c33cea5acde624136 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 28 Apr 2020 20:26:17 +0200 +Subject: scsi: target: loopback: Fix READ with data and sensebytes + +From: Bodo Stroesser + +[ 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 +Signed-off-by: Martin K. Petersen +Signed-off-by: Sasha Levin +--- + 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.4/scsi-target-tcmu-fix-a-use-after-free-in-tcmu_check_.patch b/queue-5.4/scsi-target-tcmu-fix-a-use-after-free-in-tcmu_check_.patch new file mode 100644 index 00000000000..23383a086d2 --- /dev/null +++ b/queue-5.4/scsi-target-tcmu-fix-a-use-after-free-in-tcmu_check_.patch @@ -0,0 +1,48 @@ +From 71bbfe85b9beb7e4723381b3f3c0d34f510f9b6e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Reviewed-by: David Disseldorp +Signed-off-by: Dan Carpenter +Signed-off-by: Martin K. Petersen +Signed-off-by: Sasha Levin +--- + 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 70c64e69a1d29..a497e7c1f4fcc 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.4/scsi-target-tcmu-userspace-must-not-complete-queued-.patch b/queue-5.4/scsi-target-tcmu-userspace-must-not-complete-queued-.patch new file mode 100644 index 00000000000..bf137b46509 --- /dev/null +++ b/queue-5.4/scsi-target-tcmu-userspace-must-not-complete-queued-.patch @@ -0,0 +1,337 @@ +From c6d8eda6e5fc0e9f38bb73457f49c240a7b235db Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 18 May 2020 18:48:33 +0200 +Subject: scsi: target: tcmu: Userspace must not complete queued commands + +From: Bodo Stroesser + +[ 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 +Signed-off-by: Bodo Stroesser +Signed-off-by: Martin K. Petersen +Signed-off-by: Sasha Levin +--- + 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 9425354aef99c..70c64e69a1d29 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.4/scsi-ufs-bsg-fix-runtime-pm-imbalance-on-error.patch b/queue-5.4/scsi-ufs-bsg-fix-runtime-pm-imbalance-on-error.patch new file mode 100644 index 00000000000..90150858898 --- /dev/null +++ b/queue-5.4/scsi-ufs-bsg-fix-runtime-pm-imbalance-on-error.patch @@ -0,0 +1,41 @@ +From e0f469b7add6ece2c38270852e49896cd6f519d8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 22 May 2020 12:59:29 +0800 +Subject: scsi: ufs-bsg: Fix runtime PM imbalance on error + +From: Dinghao Liu + +[ 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 +Signed-off-by: Dinghao Liu +Signed-off-by: Martin K. Petersen +Signed-off-by: Sasha Levin +--- + 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 d2197a31abe58..bad366e491591 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.4/scsi-ufs-don-t-update-urgent-bkops-level-when-toggli.patch b/queue-5.4/scsi-ufs-don-t-update-urgent-bkops-level-when-toggli.patch new file mode 100644 index 00000000000..e7f6dcf5b17 --- /dev/null +++ b/queue-5.4/scsi-ufs-don-t-update-urgent-bkops-level-when-toggli.patch @@ -0,0 +1,41 @@ +From 068d42f1592d8ce43f628b5e9604714acce74046 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Signed-off-by: Can Guo +Signed-off-by: Martin K. Petersen +Signed-off-by: Sasha Levin +--- + 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 bc73181b0405a..2b6853c7375c9 100644 +--- a/drivers/scsi/ufs/ufshcd.c ++++ b/drivers/scsi/ufs/ufshcd.c +@@ -5101,7 +5101,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.4/scsi-ufs-qcom-fix-scheduling-while-atomic-issue.patch b/queue-5.4/scsi-ufs-qcom-fix-scheduling-while-atomic-issue.patch new file mode 100644 index 00000000000..7068254a2a0 --- /dev/null +++ b/queue-5.4/scsi-ufs-qcom-fix-scheduling-while-atomic-issue.patch @@ -0,0 +1,54 @@ +From 7b5c103b3cf578767dfb2fee84f94a16bbbe8617 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 25 May 2020 13:41:25 -0700 +Subject: scsi: ufs-qcom: Fix scheduling while atomic issue + +From: Jeffrey Hugo + +[ 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 +Reviewed-by: Avri Altman +Signed-off-by: Jeffrey Hugo +Signed-off-by: Martin K. Petersen +Signed-off-by: Sasha Levin +--- + 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 411ef60b2c145..c49e9f6c46f87 100644 +--- a/drivers/scsi/ufs/ufs-qcom.c ++++ b/drivers/scsi/ufs/ufs-qcom.c +@@ -1546,11 +1546,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.4/scsi-vhost-notify-tcm-about-the-maximum-sg-entries-s.patch b/queue-5.4/scsi-vhost-notify-tcm-about-the-maximum-sg-entries-s.patch new file mode 100644 index 00000000000..9114ee9acec --- /dev/null +++ b/queue-5.4/scsi-vhost-notify-tcm-about-the-maximum-sg-entries-s.patch @@ -0,0 +1,47 @@ +From 639ff055a88116ba9a6ff4506db2123db7fb5fac Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Cc: Jason Wang +Cc: Paolo Bonzini +Cc: Stefan Hajnoczi +Reviewed-by: Mike Christie +Signed-off-by: Sudhakar Panneerselvam +Signed-off-by: Martin K. Petersen +Signed-off-by: Sasha Levin +--- + drivers/vhost/scsi.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/vhost/scsi.c b/drivers/vhost/scsi.c +index a9caf1bc3c3ef..88ce114790d75 100644 +--- a/drivers/vhost/scsi.c ++++ b/drivers/vhost/scsi.c +@@ -2290,6 +2290,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.4/selftests-net-in-timestamping-strncpy-needs-to-prese.patch b/queue-5.4/selftests-net-in-timestamping-strncpy-needs-to-prese.patch new file mode 100644 index 00000000000..6239c2dd70c --- /dev/null +++ b/queue-5.4/selftests-net-in-timestamping-strncpy-needs-to-prese.patch @@ -0,0 +1,68 @@ +From dcb414db9d22ac2f8d9e39b37306427c28b805bb Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Acked-by: Willem de Bruijn +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + .../selftests/networking/timestamping/timestamping.c | 10 ++++++++-- + 1 file changed, 8 insertions(+), 2 deletions(-) + +diff --git a/tools/testing/selftests/networking/timestamping/timestamping.c b/tools/testing/selftests/networking/timestamping/timestamping.c +index aca3491174a1e..f4bb4fef0f399 100644 +--- a/tools/testing/selftests/networking/timestamping/timestamping.c ++++ b/tools/testing/selftests/networking/timestamping/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.4/selftests-vm-pkeys-fix-alloc_random_pkey-to-make-it-.patch b/queue-5.4/selftests-vm-pkeys-fix-alloc_random_pkey-to-make-it-.patch new file mode 100644 index 00000000000..11803d5fc3d --- /dev/null +++ b/queue-5.4/selftests-vm-pkeys-fix-alloc_random_pkey-to-make-it-.patch @@ -0,0 +1,60 @@ +From f07fa48fa158ca94e2eb36d968832ee5cee349c5 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Signed-off-by: Sandipan Das +Signed-off-by: Andrew Morton +Acked-by: Dave Hansen +Cc: Dave Hansen +Cc: Florian Weimer +Cc: "Desnes A. Nunes do Rosario" +Cc: Ingo Molnar +Cc: Thiago Jung Bauermann +Cc: "Aneesh Kumar K.V" +Cc: Michael Ellerman +Cc: Michal Hocko +Cc: Michal Suchanek +Cc: Shuah Khan +Link: http://lkml.kernel.org/r/0162f55816d4e783a0d6e49e554d0ab9a3c9a23b.1585646528.git.sandipan@linux.ibm.com +Signed-off-by: Linus Torvalds +Signed-off-by: Sasha Levin +--- + 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 + #include ++#include + #include + #include + #include +@@ -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.4/serial-8250-fix-max-baud-limit-in-generic-8250-port.patch b/queue-5.4/serial-8250-fix-max-baud-limit-in-generic-8250-port.patch new file mode 100644 index 00000000000..8eb84f86c14 --- /dev/null +++ b/queue-5.4/serial-8250-fix-max-baud-limit-in-generic-8250-port.patch @@ -0,0 +1,81 @@ +From 00c4031cab7f2fee93677bf2225087829bde44c2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 7 May 2020 02:31:32 +0300 +Subject: serial: 8250: Fix max baud limit in generic 8250 port + +From: Serge Semin + +[ 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 +Cc: Alexey Malahov +Cc: Thomas Bogendoerfer +Cc: Paul Burton +Cc: Ralf Baechle +Cc: Arnd Bergmann +Cc: Long Cheng +Cc: Andy Shevchenko +Cc: Maxime Ripard +Cc: Catalin Marinas +Cc: Will Deacon +Cc: Russell King +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 +Signed-off-by: Sasha Levin +--- + 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 2c65c775bf5aa..dbb27303a6b49 100644 +--- a/drivers/tty/serial/8250/8250_port.c ++++ b/drivers/tty/serial/8250/8250_port.c +@@ -2539,6 +2539,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 +@@ -2547,7 +2549,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.4/serial-amba-pl011-make-sure-we-initialize-the-port.l.patch b/queue-5.4/serial-amba-pl011-make-sure-we-initialize-the-port.l.patch new file mode 100644 index 00000000000..c1be657f017 --- /dev/null +++ b/queue-5.4/serial-amba-pl011-make-sure-we-initialize-the-port.l.patch @@ -0,0 +1,87 @@ +From 9d07b5a5806f6a4f75f8e4367a33d06396bc0b89 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 28 Apr 2020 18:40:50 +0000 +Subject: serial: amba-pl011: Make sure we initialize the port.lock spinlock + +From: John Stultz + +[ Upstream commit 8508f4cba308f785b2fd4b8c38849c117b407297 ] + +Valentine reported seeing: + +[ 3.626638] INFO: trying to register non-static key. +[ 3.626639] the code is fine but needs lockdep annotation. +[ 3.626640] turning off the locking correctness validator. +[ 3.626644] CPU: 7 PID: 51 Comm: kworker/7:1 Not tainted 5.7.0-rc2-00115-g8c2e9790f196 #116 +[ 3.626646] Hardware name: HiKey960 (DT) +[ 3.626656] Workqueue: events deferred_probe_work_func +[ 3.632476] sd 0:0:0:0: [sda] Optimal transfer size 8192 bytes not a multiple of physical block size (16384 bytes) +[ 3.640220] Call trace: +[ 3.640225] dump_backtrace+0x0/0x1b8 +[ 3.640227] show_stack+0x20/0x30 +[ 3.640230] dump_stack+0xec/0x158 +[ 3.640234] register_lock_class+0x598/0x5c0 +[ 3.640235] __lock_acquire+0x80/0x16c0 +[ 3.640236] lock_acquire+0xf4/0x4a0 +[ 3.640241] _raw_spin_lock_irqsave+0x70/0xa8 +[ 3.640245] uart_add_one_port+0x388/0x4b8 +[ 3.640248] pl011_register_port+0x70/0xf0 +[ 3.640250] pl011_probe+0x184/0x1b8 +[ 3.640254] amba_probe+0xdc/0x180 +[ 3.640256] really_probe+0xe0/0x338 +[ 3.640257] driver_probe_device+0x60/0xf8 +[ 3.640259] __device_attach_driver+0x8c/0xd0 +[ 3.640260] bus_for_each_drv+0x84/0xd8 +[ 3.640261] __device_attach+0xe4/0x140 +[ 3.640263] device_initial_probe+0x1c/0x28 +[ 3.640265] bus_probe_device+0xa4/0xb0 +[ 3.640266] deferred_probe_work_func+0x7c/0xb8 +[ 3.640269] process_one_work+0x2c0/0x768 +[ 3.640271] worker_thread+0x4c/0x498 +[ 3.640272] kthread+0x14c/0x158 +[ 3.640275] ret_from_fork+0x10/0x1c + +Which seems to be due to the fact that after allocating the uap +structure, nothing initializes the spinlock. + +Its a little confusing, as uart_port_spin_lock_init() is one +place where the lock is supposed to be initialized, but it has +an exception for the case where the port is a console. + +This makes it seem like a deeper fix is needed to properly +register the console, but I'm not sure what that entails, and +Andy suggested that this approach is less invasive. + +Thus, this patch resolves the issue by initializing the spinlock +in the driver, and resolves the resulting warning. + +Cc: Andy Shevchenko +Cc: Russell King +Cc: Jiri Slaby +Cc: linux-serial@vger.kernel.org +Reported-by: Valentin Schneider +Reviewed-by: Andy Shevchenko +Signed-off-by: John Stultz +Reviewed-and-tested-by: Valentin Schneider +Link: https://lore.kernel.org/r/20200428184050.6501-1-john.stultz@linaro.org +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/tty/serial/amba-pl011.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/tty/serial/amba-pl011.c b/drivers/tty/serial/amba-pl011.c +index b0b6895463952..de3e8c24c03e7 100644 +--- a/drivers/tty/serial/amba-pl011.c ++++ b/drivers/tty/serial/amba-pl011.c +@@ -2585,6 +2585,7 @@ static int pl011_setup_port(struct device *dev, struct uart_amba_port *uap, + uap->port.fifosize = uap->fifosize; + uap->port.flags = UPF_BOOT_AUTOCONF; + uap->port.line = index; ++ spin_lock_init(&uap->port.lock); + + amba_ports[index] = uap; + +-- +2.25.1 + diff --git a/queue-5.4/series b/queue-5.4/series new file mode 100644 index 00000000000..8e461851e70 --- /dev/null +++ b/queue-5.4/series @@ -0,0 +1,282 @@ +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 +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 +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 +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 +scsi-qla2xxx-fix-issue-with-adapter-s-stopping-state.patch +input-edt-ft5x06-fix-get_default-register-write-acce.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-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 +usblp-poison-urbs-upon-disconnect.patch +serial-8250-fix-max-baud-limit-in-generic-8250-port.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 +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 +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 +pci-pci-bridge-emul-fix-pcie-bit-conflicts.patch +m68k-pci-fix-a-memory-leak-in-an-error-handling-path.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 +yam-fix-possible-memory-leak-in-yam_init_driver.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 +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-deallocate-of-device-mi.patch +scsi-ibmvscsi-don-t-send-host-info-in-adapter-info-m.patch +apparmor-fix-nnp-subset-test-for-unconfined.patch +x86-purgatory-disable-various-profiling-and-sanitizi.patch +staging-greybus-fix-a-missing-check-bug-in-gb_lights.patch +staging-rtl8712-fix-multiline-derefernce-warnings.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 +gpio-dwapb-append-module_alias-for-platform-driver.patch +scsi-qedf-fix-crash-when-mfw-calls-for-protocol-stat.patch +pinctrl-rza1-fix-wrong-array-assignment-of-rza1l_swi.patch +virtiofs-schedule-blocking-async-replies-in-separate.patch +arm64-dts-qcom-fix-pm8150-gpio-interrupts.patch +firmware-qcom_scm-fix-bogous-abuse-of-dma-direct-int.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-put-thinint-indicator-after-early-error.patch +tty-hvc-fix-data-abort-due-to-race-in-hvc_open.patch +slimbus-ngd-get-drvdata-from-correct-device.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 +thermal-drivers-ti-soc-thermal-avoid-dereferencing-e.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 +hid-intel-ish-hid-avoid-bogus-uninitialized-variable.patch +usb-dwc3-gadget-properly-handle-clearfeature-halt.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 +pci-v3-semi-fix-a-memory-leak-in-v3_pci_probe-error-.patch +i2c-pxa-fix-i2c_pxa_scream_blue_murder-debug-output.patch +serial-amba-pl011-make-sure-we-initialize-the-port.l.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 +asoc-sof-core-fix-error-return-code-in-sof_probe_con.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 +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 +dlm-remove-bug-before-panic.patch +usb-ohci-sm501-fix-error-return-code-in-ohci_hcd_sm5.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 +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 +ipmi-use-vzalloc-instead-of-kmalloc-for-user-creatio.patch +powerpc-64s-exception-fix-machine-check-no-loss-idle.patch +powerpc-pseries-ras-fix-fwnmi_valid-off-by-one.patch +drivers-phy-sr-usb-do-not-use-internal-fsm-for-usb2-.patch +powerpc-ps3-fix-kexec-shutdown-hang.patch +vfio-pci-mask-cap-zero.patch +usb-ohci-platform-fix-a-warning-when-hibernating.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 +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 +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-64s-pgtable-fix-an-undefined-behaviour.patch +dm-zoned-return-null-if-dmz_get_zone_for_reclaim-fai.patch +pci-ptm-inherit-switch-downstream-port-ptm-settings-.patch +pci-dwc-fix-inner-msi-irq-domain-registration.patch +pci-amlogic-meson-don-t-use-fast_link_mode-to-set-up.patch +ib-cma-fix-ports-memory-leak-in-cma_configfs.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 +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 +powerpc-32s-don-t-warn-when-mapping-ro-data-rox.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 +kvm-ppc-book3s-hv-ignore-kmemleak-false-positives.patch +kvm-ppc-book3s-fix-some-rcu-list-locks.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 +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 +input-i8042-remove-special-powerpc-handling.patch +powerpc-4xx-don-t-unmap-null-mbase.patch +extcon-adc-jack-fix-an-error-handling-path-in-adc_ja.patch +asoc-fsl_asrc_dma-fix-dma_chan-leak-when-config-dma-.patch +vfio-mdev-fix-reference-count-leak-in-add_mdev_suppo.patch +rtc-rv3028-add-missed-check-for-devm_regmap_init_i2c.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 +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 +pinctrl-imxl-fix-an-error-handling-path-in-imx1_pinc.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 +drm-amd-display-revalidate-bandwidth-before-commitin.patch +crypto-omap-sham-add-proper-load-balancing-support-f.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 +gfs2-fix-use-after-free-on-transaction-ail-lists.patch +net-marvell-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 +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-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-14146 +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 +x86-idt-keep-spurious-entries-unset-in-system_vector.patch +net-filter-permit-reading-net-in-load_bytes_relative.patch +nvme-pci-use-simple-suspend-when-a-hmb-is-enabled.patch +nfs-set-invalid-blocks-after-nfsv4-writes.patch +xdp-fix-xsk_generic_xmit-errno.patch +iavf-fix-speed-reporting-over-virtchnl.patch +bpf-fix-memlock-accounting-for-sock_hash.patch +usb-xhci-plat-set-pm-runtime-as-active-on-resume.patch +usb-host-ehci-platform-add-a-quirk-to-avoid-stuck.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 +ext4-stop-overwrite-the-errcode-in-ext4_setup_super.patch +bcache-fix-potential-deadlock-problem-in-btree_gc_co.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-fix-the-mapping-of-the-uaeoverflow-abort-code.patch +bnxt_en-return-from-timer-if-interface-is-not-in-ope.patch +scsi-ufs-bsg-fix-runtime-pm-imbalance-on-error.patch +block-fix-use-after-free-in-blkdev_get.patch +mvpp2-remove-module-bugfix.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 diff --git a/queue-5.4/slimbus-ngd-get-drvdata-from-correct-device.patch b/queue-5.4/slimbus-ngd-get-drvdata-from-correct-device.patch new file mode 100644 index 00000000000..ad500033825 --- /dev/null +++ b/queue-5.4/slimbus-ngd-get-drvdata-from-correct-device.patch @@ -0,0 +1,50 @@ +From 2ee4798de0f2b1765876ae7c555513e74f205bac Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 17 Apr 2020 10:36:18 +0100 +Subject: slimbus: ngd: get drvdata from correct device + +From: Srinivas Kandagatla + +[ 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 +Link: https://lore.kernel.org/r/20200417093618.7929-1-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + 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 29fbab55c3b38..01a17d84b6064 100644 +--- a/drivers/slimbus/qcom-ngd-ctrl.c ++++ b/drivers/slimbus/qcom-ngd-ctrl.c +@@ -1354,7 +1354,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 + +@@ -1369,12 +1368,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.4/soc-rsnd-add-interrupt-support-for-ssi-busif-buffer.patch b/queue-5.4/soc-rsnd-add-interrupt-support-for-ssi-busif-buffer.patch new file mode 100644 index 00000000000..08b192068ca --- /dev/null +++ b/queue-5.4/soc-rsnd-add-interrupt-support-for-ssi-busif-buffer.patch @@ -0,0 +1,281 @@ +From 8ffb3528c9ed80011f5c9c78691de983839606f5 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 12 May 2020 17:30:03 +0800 +Subject: SoC: rsnd: add interrupt support for SSI BUSIF buffer + +From: Yongbo Zhang + +[ 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 +Signed-off-by: Yongbo Zhang +Tested-by: Chen Li +Acked-by: Kuninori Morimoto +Link: https://lore.kernel.org/r/20200512093003.28332-1-giraffesnn123@gmail.com +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + 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.4/soundwire-slave-don-t-init-debugfs-on-device-registr.patch b/queue-5.4/soundwire-slave-don-t-init-debugfs-on-device-registr.patch new file mode 100644 index 00000000000..6e5dfad5c27 --- /dev/null +++ b/queue-5.4/soundwire-slave-don-t-init-debugfs-on-device-registr.patch @@ -0,0 +1,40 @@ +From a8b65f3577d024bc405689b47f0138e687d1865b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 20 Apr 2020 02:51:15 +0800 +Subject: soundwire: slave: don't init debugfs on device registration error + +From: Pierre-Louis Bossart + +[ 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 +Signed-off-by: Bard Liao +Reviewed-by: Ranjani Sridharan +Reviewed-by: Guennadi Liakhovetski +Link: https://lore.kernel.org/r/20200419185117.4233-2-yung-chuan.liao@linux.intel.com +Signed-off-by: Vinod Koul +Signed-off-by: Sasha Levin +--- + drivers/soundwire/slave.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/drivers/soundwire/slave.c b/drivers/soundwire/slave.c +index 6473fa602f82c..611f4f5bc36ab 100644 +--- a/drivers/soundwire/slave.c ++++ b/drivers/soundwire/slave.c +@@ -57,6 +57,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.4/sparc32-mm-don-t-try-to-free-page-table-pages-if-cto.patch b/queue-5.4/sparc32-mm-don-t-try-to-free-page-table-pages-if-cto.patch new file mode 100644 index 00000000000..4fedd9d75f2 --- /dev/null +++ b/queue-5.4/sparc32-mm-don-t-try-to-free-page-table-pages-if-cto.patch @@ -0,0 +1,41 @@ +From ed534714ea58132937d04f4dfd8233a4ad6e24d6 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Cc: Kirill A. Shutemov +Fixes: 1ae9ae5f7df7 ("sparc: handle pgtable_page_ctor() fail") +Signed-off-by: Will Deacon +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + 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 cc3ad64479ac3..9e256d4d1f4cf 100644 +--- a/arch/sparc/mm/srmmu.c ++++ b/arch/sparc/mm/srmmu.c +@@ -379,7 +379,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.4/staging-gasket-fix-mapping-refcnt-leak-when-put-attr.patch b/queue-5.4/staging-gasket-fix-mapping-refcnt-leak-when-put-attr.patch new file mode 100644 index 00000000000..243e6a64662 --- /dev/null +++ b/queue-5.4/staging-gasket-fix-mapping-refcnt-leak-when-put-attr.patch @@ -0,0 +1,48 @@ +From f1f3ad72ddc75dc0b54b5b6810b2f413cb14576b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 23 Apr 2020 13:14:55 +0800 +Subject: staging: gasket: Fix mapping refcnt leak when put attribute fails + +From: Xiyu Yang + +[ 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 +Signed-off-by: Xin Tan +Link: https://lore.kernel.org/r/1587618895-13660-1-git-send-email-xiyuyang19@fudan.edu.cn +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + 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.4/staging-gasket-fix-mapping-refcnt-leak-when-register.patch b/queue-5.4/staging-gasket-fix-mapping-refcnt-leak-when-register.patch new file mode 100644 index 00000000000..f1a2a11ba0c --- /dev/null +++ b/queue-5.4/staging-gasket-fix-mapping-refcnt-leak-when-register.patch @@ -0,0 +1,48 @@ +From bc216bb96f93cc08638acb02b773dd3c74c350fb Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 23 Apr 2020 13:15:40 +0800 +Subject: staging: gasket: Fix mapping refcnt leak when register/store fails + +From: Xiyu Yang + +[ 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 +Signed-off-by: Xin Tan +Link: https://lore.kernel.org/r/1587618941-13718-1-git-send-email-xiyuyang19@fudan.edu.cn +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + 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.4/staging-greybus-fix-a-missing-check-bug-in-gb_lights.patch b/queue-5.4/staging-greybus-fix-a-missing-check-bug-in-gb_lights.patch new file mode 100644 index 00000000000..a0b67e9c594 --- /dev/null +++ b/queue-5.4/staging-greybus-fix-a-missing-check-bug-in-gb_lights.patch @@ -0,0 +1,38 @@ +From 89d5de81b3fce751b9d223ca1aabb410b6827e33 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Acked-by: Rui Miguel Silva +Link: https://lore.kernel.org/r/20200401030017.100274-1-chenzhou10@huawei.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + 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.4/staging-rtl8712-fix-multiline-derefernce-warnings.patch b/queue-5.4/staging-rtl8712-fix-multiline-derefernce-warnings.patch new file mode 100644 index 00000000000..b64b269a933 --- /dev/null +++ b/queue-5.4/staging-rtl8712-fix-multiline-derefernce-warnings.patch @@ -0,0 +1,80 @@ +From 4414f3fe9f4743246fd86d77d38bd3ffc9a0b534 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 29 Mar 2020 14:57:47 -0400 +Subject: staging: rtl8712: fix multiline derefernce warnings + +From: Aiman Najjar + +[ 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 +Reviewed-by: Dan Carpenter +Link: https://lore.kernel.org/r/98805a72b92e9bbf933e05b827d27944663b7bc1.1585508171.git.aiman.najjar@hurranet.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + 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 cc5809e49e356..7a821921c0da1 100644 +--- a/drivers/staging/rtl8712/rtl871x_xmit.c ++++ b/drivers/staging/rtl8712/rtl871x_xmit.c +@@ -590,7 +590,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; +@@ -633,15 +633,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); +@@ -649,8 +647,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.4/staging-sm750fb-add-missing-case-while-setting-fb_vi.patch b/queue-5.4/staging-sm750fb-add-missing-case-while-setting-fb_vi.patch new file mode 100644 index 00000000000..52a661d81c7 --- /dev/null +++ b/queue-5.4/staging-sm750fb-add-missing-case-while-setting-fb_vi.patch @@ -0,0 +1,36 @@ +From f0dadaa7fb6abdfbec0fa2966d9367e529e495c6 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 30 Apr 2020 22:09:24 +0200 +Subject: staging: sm750fb: add missing case while setting FB_VISUAL + +From: Matej Dujava + +[ 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 +Link: https://lore.kernel.org/r/1588277366-19354-2-git-send-email-mdujava@kocurkovo.cz +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + 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.4/staging-wilc1000-increase-the-size-of-wid_list-array.patch b/queue-5.4/staging-wilc1000-increase-the-size-of-wid_list-array.patch new file mode 100644 index 00000000000..45497cd839b --- /dev/null +++ b/queue-5.4/staging-wilc1000-increase-the-size-of-wid_list-array.patch @@ -0,0 +1,51 @@ +From 2c4805b86bb9526ab4de28d267b19207a0231e94 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 4 May 2020 17:09:11 +0200 +Subject: staging: wilc1000: Increase the size of wid_list array + +From: Oscar Carter + +[ 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 +Signed-off-by: Oscar Carter +Link: https://lore.kernel.org/r/20200504150911.4470-1-oscar.carter@gmx.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/staging/wilc1000/wilc_hif.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/drivers/staging/wilc1000/wilc_hif.c b/drivers/staging/wilc1000/wilc_hif.c +index 77d0732f451be..221e3d93db148 100644 +--- a/drivers/staging/wilc1000/wilc_hif.c ++++ b/drivers/staging/wilc1000/wilc_hif.c +@@ -12,6 +12,8 @@ + #define WILC_FALSE_FRMWR_CHANNEL 100 + #define WILC_MAX_RATES_SUPPORTED 12 + ++#define WILC_SCAN_WID_LIST_SIZE 6 ++ + struct wilc_rcvd_mac_info { + u8 status; + }; +@@ -233,7 +235,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.4/thermal-drivers-ti-soc-thermal-avoid-dereferencing-e.patch b/queue-5.4/thermal-drivers-ti-soc-thermal-avoid-dereferencing-e.patch new file mode 100644 index 00000000000..a3bfd219309 --- /dev/null +++ b/queue-5.4/thermal-drivers-ti-soc-thermal-avoid-dereferencing-e.patch @@ -0,0 +1,57 @@ +From aeea17b1d4290c318ee22a14386c64978bd3e3d2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 24 Apr 2020 17:19:44 +0100 +Subject: thermal/drivers/ti-soc-thermal: Avoid dereferencing ERR_PTR + +From: Sudip Mukherjee + +[ 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 +Reviewed-by: Amit Kucheria +Signed-off-by: Daniel Lezcano +Link: https://lore.kernel.org/r/20200424161944.6044-1-sudipm.mukherjee@gmail.com +Signed-off-by: Sasha Levin +--- + 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.4/tracing-probe-fix-bpf_task_fd_query-for-kprobes-and-.patch b/queue-5.4/tracing-probe-fix-bpf_task_fd_query-for-kprobes-and-.patch new file mode 100644 index 00000000000..4cba93b2311 --- /dev/null +++ b/queue-5.4/tracing-probe-fix-bpf_task_fd_query-for-kprobes-and-.patch @@ -0,0 +1,57 @@ +From 795e0137137f9ea152d1f34ef5ed8f86134580b8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Signed-off-by: Alexei Starovoitov +Acked-by: Yonghong Song +Acked-by: Masami Hiramatsu +Link: https://lore.kernel.org/bpf/20200608124531.819838-1-jean-philippe@linaro.org +Signed-off-by: Sasha Levin +--- + 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 fba4b48451f6c..26de9c6549566 100644 +--- a/kernel/trace/trace_kprobe.c ++++ b/kernel/trace/trace_kprobe.c +@@ -1464,7 +1464,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 2619bc5ed520c..5294843de6efd 100644 +--- a/kernel/trace/trace_uprobe.c ++++ b/kernel/trace/trace_uprobe.c +@@ -1405,7 +1405,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.4/tty-hvc-fix-data-abort-due-to-race-in-hvc_open.patch b/queue-5.4/tty-hvc-fix-data-abort-due-to-race-in-hvc_open.patch new file mode 100644 index 00000000000..e031af2f9a7 --- /dev/null +++ b/queue-5.4/tty-hvc-fix-data-abort-due-to-race-in-hvc_open.patch @@ -0,0 +1,81 @@ +From d5eae15af54820a7535bc639f772aaa0f416ea65 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Link: https://lore.kernel.org/r/20200428032601.22127-1-rananta@codeaurora.org +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + 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.4/tty-n_gsm-fix-bogus-i-in-gsm_data_kick.patch b/queue-5.4/tty-n_gsm-fix-bogus-i-in-gsm_data_kick.patch new file mode 100644 index 00000000000..291f2b346f3 --- /dev/null +++ b/queue-5.4/tty-n_gsm-fix-bogus-i-in-gsm_data_kick.patch @@ -0,0 +1,53 @@ +From 964c912e8f86c3834dd2a2a2d8cabc478018ee36 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 18 May 2020 10:45:13 +0200 +Subject: tty: n_gsm: Fix bogus i++ in gsm_data_kick + +From: Gregory CLEMENT + +[ 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 +Link: https://lore.kernel.org/r/20200518084517.2173242-3-gregory.clement@bootlin.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + 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 8a0d66a05af59..75408b9f232da 100644 +--- a/drivers/tty/n_gsm.c ++++ b/drivers/tty/n_gsm.c +@@ -703,17 +703,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.4/tty-n_gsm-fix-sof-skipping.patch b/queue-5.4/tty-n_gsm-fix-sof-skipping.patch new file mode 100644 index 00000000000..a3d3710f07f --- /dev/null +++ b/queue-5.4/tty-n_gsm-fix-sof-skipping.patch @@ -0,0 +1,58 @@ +From f5729fb504d7960e6fa6daf89c8d5bd56105625b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 12 May 2020 13:53:22 +0200 +Subject: tty: n_gsm: Fix SOF skipping + +From: Gregory CLEMENT + +[ 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 +Link: https://lore.kernel.org/r/20200512115323.1447922-3-gregory.clement@bootlin.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + 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 36a3eb4ad4c55..a5165f989fcf6 100644 +--- a/drivers/tty/n_gsm.c ++++ b/drivers/tty/n_gsm.c +@@ -669,7 +669,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) +@@ -691,15 +690,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.4/tty-n_gsm-fix-waking-up-upper-tty-layer-when-room-av.patch b/queue-5.4/tty-n_gsm-fix-waking-up-upper-tty-layer-when-room-av.patch new file mode 100644 index 00000000000..b8d272d6b3f --- /dev/null +++ b/queue-5.4/tty-n_gsm-fix-waking-up-upper-tty-layer-when-room-av.patch @@ -0,0 +1,90 @@ +From f88ace85c5d1a7ed6e50f7cebf3fb9b126822d2e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Link: https://lore.kernel.org/r/20200512115323.1447922-4-gregory.clement@bootlin.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + 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 a5165f989fcf6..8a0d66a05af59 100644 +--- a/drivers/tty/n_gsm.c ++++ b/drivers/tty/n_gsm.c +@@ -665,7 +665,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; +@@ -697,6 +697,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); ++ } ++ } + } + } + +@@ -748,7 +766,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); + } + + /** +@@ -1209,7 +1227,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: +@@ -2519,7 +2537,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.4/usb-dwc2-gadget-move-gadget-resume-after-the-core-is.patch b/queue-5.4/usb-dwc2-gadget-move-gadget-resume-after-the-core-is.patch new file mode 100644 index 00000000000..04d0c2fc2cc --- /dev/null +++ b/queue-5.4/usb-dwc2-gadget-move-gadget-resume-after-the-core-is.patch @@ -0,0 +1,51 @@ +From 0cfd0e582701717e698d5f0445e1845c51f1b08d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Signed-off-by: Fabrice Gasnier +Signed-off-by: Felipe Balbi +Signed-off-by: Sasha Levin +--- + 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 6af6add3d4c0b..6272b4ae4740f 100644 +--- a/drivers/usb/dwc2/core_intr.c ++++ b/drivers/usb/dwc2/core_intr.c +@@ -421,10 +421,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.4/usb-dwc3-gadget-properly-handle-clearfeature-halt.patch b/queue-5.4/usb-dwc3-gadget-properly-handle-clearfeature-halt.patch new file mode 100644 index 00000000000..f1cfb82dd8d --- /dev/null +++ b/queue-5.4/usb-dwc3-gadget-properly-handle-clearfeature-halt.patch @@ -0,0 +1,91 @@ +From 1210f9713552fde4cc62967744eb8456438e5612 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 5 Mar 2020 13:23:55 -0800 +Subject: usb: dwc3: gadget: Properly handle ClearFeature(halt) + +From: Thinh Nguyen + +[ 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 +Signed-off-by: Felipe Balbi +Signed-off-by: Sasha Levin +--- + 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 c30c5b1c478c2..05180a09e70d4 100644 +--- a/drivers/usb/dwc3/gadget.c ++++ b/drivers/usb/dwc3/gadget.c +@@ -1505,6 +1505,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 +@@ -1595,6 +1599,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)) { +@@ -1631,13 +1637,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.4/usb-dwc3-gadget-properly-handle-failed-kick_transfer.patch b/queue-5.4/usb-dwc3-gadget-properly-handle-failed-kick_transfer.patch new file mode 100644 index 00000000000..6fd7c78fd3a --- /dev/null +++ b/queue-5.4/usb-dwc3-gadget-properly-handle-failed-kick_transfer.patch @@ -0,0 +1,68 @@ +From 51598ce6ad345cf8c525cf1c880f9340d9e555cf Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 29 Mar 2020 16:12:57 -0700 +Subject: usb: dwc3: gadget: Properly handle failed kick_transfer + +From: Thinh Nguyen + +[ 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 +Signed-off-by: Felipe Balbi +Signed-off-by: Sasha Levin +--- + 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 05180a09e70d4..17340864a5408 100644 +--- a/drivers/usb/dwc3/gadget.c ++++ b/drivers/usb/dwc3/gadget.c +@@ -1217,6 +1217,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; +@@ -1256,14 +1258,20 @@ static int __dwc3_gadget_kick_transfer(struct dwc3_ep *dep) + + ret = dwc3_send_gadget_ep_cmd(dep, cmd, ¶ms); + 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.4/usb-ehci-platform-set-pm-runtime-as-active-on-resume.patch b/queue-5.4/usb-ehci-platform-set-pm-runtime-as-active-on-resume.patch new file mode 100644 index 00000000000..0be2eed89f4 --- /dev/null +++ b/queue-5.4/usb-ehci-platform-set-pm-runtime-as-active-on-resume.patch @@ -0,0 +1,51 @@ +From ebfac87a412fe4f7032b4c6096aeecebcc8d011f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 18 May 2020 16:49:31 +0100 +Subject: usb/ehci-platform: Set PM runtime as active on resume + +From: Qais Yousef + +[ 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 +Signed-off-by: Qais Yousef +CC: Tony Prisk +CC: Greg Kroah-Hartman +CC: Mathias Nyman +CC: Oliver Neukum +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 +Signed-off-by: Sasha Levin +--- + 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.4/usb-gadget-core-sync-interrupt-before-unbind-the-udc.patch b/queue-5.4/usb-gadget-core-sync-interrupt-before-unbind-the-udc.patch new file mode 100644 index 00000000000..56aee5212bd --- /dev/null +++ b/queue-5.4/usb-gadget-core-sync-interrupt-before-unbind-the-udc.patch @@ -0,0 +1,137 @@ +From 251921e3af8d48ac49188ce8e5950a7830d471dd Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 10 May 2020 13:30:41 +0800 +Subject: usb: gadget: core: sync interrupt before unbind the udc + +From: Peter Chen + +[ 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 +Signed-off-by: Peter Chen +Signed-off-by: Felipe Balbi +Signed-off-by: Sasha Levin +--- + 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 51fa614b40794..0e7820158aaa9 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 124462d65eac4..67f5adc9b8753 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.4/usb-gadget-fix-issue-with-config_ep_by_speed-functio.patch b/queue-5.4/usb-gadget-fix-issue-with-config_ep_by_speed-functio.patch new file mode 100644 index 00000000000..ef429f9a191 --- /dev/null +++ b/queue-5.4/usb-gadget-fix-issue-with-config_ep_by_speed-functio.patch @@ -0,0 +1,226 @@ +From 32756e5dd9d839b0f3f584faad71674e2fe3ff21 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 18 May 2020 12:08:45 +0200 +Subject: usb: gadget: Fix issue with config_ep_by_speed function + +From: Pawel Laszczak + +[ 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 +Signed-off-by: Pawel Laszczak +Signed-off-by: Felipe Balbi +Signed-off-by: Sasha Levin +--- + 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 d98ca1566e95d..f75ff1a75dc45 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.4/usb-gadget-fix-potential-double-free-in-m66592_probe.patch b/queue-5.4/usb-gadget-fix-potential-double-free-in-m66592_probe.patch new file mode 100644 index 00000000000..0e05086a63f --- /dev/null +++ b/queue-5.4/usb-gadget-fix-potential-double-free-in-m66592_probe.patch @@ -0,0 +1,38 @@ +From 3585d1788652a7986923ed7766f2c7e976d364ee Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 22 May 2020 23:06:25 -0500 +Subject: usb: gadget: fix potential double-free in m66592_probe. + +From: Qiushi Wu + +[ 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 +Signed-off-by: Felipe Balbi +Signed-off-by: Sasha Levin +--- + 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 a8288df6aadf0..ea59b56e54023 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.4/usb-gadget-lpc32xx_udc-don-t-dereference-ep-pointer-.patch b/queue-5.4/usb-gadget-lpc32xx_udc-don-t-dereference-ep-pointer-.patch new file mode 100644 index 00000000000..fefbec71bc6 --- /dev/null +++ b/queue-5.4/usb-gadget-lpc32xx_udc-don-t-dereference-ep-pointer-.patch @@ -0,0 +1,71 @@ +From f45dd7f66b0be80b545c0c7c30ecca923635c179 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Signed-off-by: Felipe Balbi +Signed-off-by: Sasha Levin +--- + 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 bf6c81e2f8ccc..6d2f1f98f13df 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.4/usb-gadget-udc-s3c2410_udc-remove-pointless-null-che.patch b/queue-5.4/usb-gadget-udc-s3c2410_udc-remove-pointless-null-che.patch new file mode 100644 index 00000000000..1f1df5fe4ad --- /dev/null +++ b/queue-5.4/usb-gadget-udc-s3c2410_udc-remove-pointless-null-che.patch @@ -0,0 +1,57 @@ +From f0716501890eee2e9a9460b7e9af0b968b241e7c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Reported-by: kbuild test robot +Signed-off-by: Nathan Chancellor +Signed-off-by: Felipe Balbi +Signed-off-by: Sasha Levin +--- + 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 f82208fbc2495..5dcc0692b95c7 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.4/usb-host-ehci-mxc-add-error-handling-in-ehci_mxc_drv.patch b/queue-5.4/usb-host-ehci-mxc-add-error-handling-in-ehci_mxc_drv.patch new file mode 100644 index 00000000000..e42c470bbef --- /dev/null +++ b/queue-5.4/usb-host-ehci-mxc-add-error-handling-in-ehci_mxc_drv.patch @@ -0,0 +1,39 @@ +From 712801db299ce21f41e05d79e99db1138f8bfbd9 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Signed-off-by: Tang Bin +Reviewed-by: Peter Chen +Link: https://lore.kernel.org/r/20200513132647.5456-1-tangbin@cmss.chinamobile.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + 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.4/usb-host-ehci-platform-add-a-quirk-to-avoid-stuck.patch b/queue-5.4/usb-host-ehci-platform-add-a-quirk-to-avoid-stuck.patch new file mode 100644 index 00000000000..0e690423174 --- /dev/null +++ b/queue-5.4/usb-host-ehci-platform-add-a-quirk-to-avoid-stuck.patch @@ -0,0 +1,237 @@ +From 3b18de9ed2b061135247a72f9a357d9a57740eb7 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 27 Jan 2020 17:37:42 +0900 +Subject: usb: host: ehci-platform: add a quirk to avoid stuck + +From: Yoshihiro Shimoda + +[ Upstream commit cc7eac1e4afdd151085be4d0341a155760388653 ] + +Since EHCI/OHCI controllers on R-Car Gen3 SoCs are possible to +be getting stuck very rarely after a full/low usb device was +disconnected. To detect/recover from such a situation, the controllers +require a special way which poll the EHCI PORTSC register and changes +the OHCI functional state. + +So, this patch adds a polling timer into the ehci-platform driver, +and if the ehci driver detects the issue by the EHCI PORTSC register, +the ehci driver removes a companion device (= the OHCI controller) +to change the OHCI functional state to USB Reset once. And then, +the ehci driver adds the companion device again. + +Signed-off-by: Yoshihiro Shimoda +Acked-by: Alan Stern +Link: https://lore.kernel.org/r/1580114262-25029-1-git-send-email-yoshihiro.shimoda.uh@renesas.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/usb/host/ehci-platform.c | 127 +++++++++++++++++++++++++++++++ + include/linux/usb/ehci_def.h | 2 +- + 2 files changed, 128 insertions(+), 1 deletion(-) + +diff --git a/drivers/usb/host/ehci-platform.c b/drivers/usb/host/ehci-platform.c +index 769749ca5961a..e4fc3f66d43bf 100644 +--- a/drivers/usb/host/ehci-platform.c ++++ b/drivers/usb/host/ehci-platform.c +@@ -29,6 +29,8 @@ + #include + #include + #include ++#include ++#include + #include + #include + #include +@@ -44,6 +46,9 @@ struct ehci_platform_priv { + struct clk *clks[EHCI_MAX_CLKS]; + struct reset_control *rsts; + bool reset_on_resume; ++ bool quirk_poll; ++ struct timer_list poll_timer; ++ struct delayed_work poll_work; + }; + + static const char hcd_name[] = "ehci-platform"; +@@ -118,6 +123,111 @@ static struct usb_ehci_pdata ehci_platform_defaults = { + .power_off = ehci_platform_power_off, + }; + ++/** ++ * quirk_poll_check_port_status - Poll port_status if the device sticks ++ * @ehci: the ehci hcd pointer ++ * ++ * Since EHCI/OHCI controllers on R-Car Gen3 SoCs are possible to be getting ++ * stuck very rarely after a full/low usb device was disconnected. To ++ * detect such a situation, the controllers require a special way which poll ++ * the EHCI PORTSC register. ++ * ++ * Return: true if the controller's port_status indicated getting stuck ++ */ ++static bool quirk_poll_check_port_status(struct ehci_hcd *ehci) ++{ ++ u32 port_status = ehci_readl(ehci, &ehci->regs->port_status[0]); ++ ++ if (!(port_status & PORT_OWNER) && ++ (port_status & PORT_POWER) && ++ !(port_status & PORT_CONNECT) && ++ (port_status & PORT_LS_MASK)) ++ return true; ++ ++ return false; ++} ++ ++/** ++ * quirk_poll_rebind_companion - rebind comanion device to recover ++ * @ehci: the ehci hcd pointer ++ * ++ * Since EHCI/OHCI controllers on R-Car Gen3 SoCs are possible to be getting ++ * stuck very rarely after a full/low usb device was disconnected. To ++ * recover from such a situation, the controllers require changing the OHCI ++ * functional state. ++ */ ++static void quirk_poll_rebind_companion(struct ehci_hcd *ehci) ++{ ++ struct device *companion_dev; ++ struct usb_hcd *hcd = ehci_to_hcd(ehci); ++ ++ companion_dev = usb_of_get_companion_dev(hcd->self.controller); ++ if (!companion_dev) ++ return; ++ ++ device_release_driver(companion_dev); ++ if (device_attach(companion_dev) < 0) ++ ehci_err(ehci, "%s: failed\n", __func__); ++ ++ put_device(companion_dev); ++} ++ ++static void quirk_poll_work(struct work_struct *work) ++{ ++ struct ehci_platform_priv *priv = ++ container_of(to_delayed_work(work), struct ehci_platform_priv, ++ poll_work); ++ struct ehci_hcd *ehci = container_of((void *)priv, struct ehci_hcd, ++ priv); ++ ++ /* check the status twice to reduce misdetection rate */ ++ if (!quirk_poll_check_port_status(ehci)) ++ return; ++ udelay(10); ++ if (!quirk_poll_check_port_status(ehci)) ++ return; ++ ++ ehci_dbg(ehci, "%s: detected getting stuck. rebind now!\n", __func__); ++ quirk_poll_rebind_companion(ehci); ++} ++ ++static void quirk_poll_timer(struct timer_list *t) ++{ ++ struct ehci_platform_priv *priv = from_timer(priv, t, poll_timer); ++ struct ehci_hcd *ehci = container_of((void *)priv, struct ehci_hcd, ++ priv); ++ ++ if (quirk_poll_check_port_status(ehci)) { ++ /* ++ * Now scheduling the work for testing the port more. Note that ++ * updating the status is possible to be delayed when ++ * reconnection. So, this uses delayed work with 5 ms delay ++ * to avoid misdetection. ++ */ ++ schedule_delayed_work(&priv->poll_work, msecs_to_jiffies(5)); ++ } ++ ++ mod_timer(&priv->poll_timer, jiffies + HZ); ++} ++ ++static void quirk_poll_init(struct ehci_platform_priv *priv) ++{ ++ INIT_DELAYED_WORK(&priv->poll_work, quirk_poll_work); ++ timer_setup(&priv->poll_timer, quirk_poll_timer, 0); ++ mod_timer(&priv->poll_timer, jiffies + HZ); ++} ++ ++static void quirk_poll_end(struct ehci_platform_priv *priv) ++{ ++ del_timer_sync(&priv->poll_timer); ++ cancel_delayed_work(&priv->poll_work); ++} ++ ++static const struct soc_device_attribute quirk_poll_match[] = { ++ { .family = "R-Car Gen3" }, ++ { /* sentinel*/ } ++}; ++ + static int ehci_platform_probe(struct platform_device *dev) + { + struct usb_hcd *hcd; +@@ -176,6 +286,9 @@ static int ehci_platform_probe(struct platform_device *dev) + "has-transaction-translator")) + hcd->has_tt = 1; + ++ if (soc_device_match(quirk_poll_match)) ++ priv->quirk_poll = true; ++ + for (clk = 0; clk < EHCI_MAX_CLKS; clk++) { + priv->clks[clk] = of_clk_get(dev->dev.of_node, clk); + if (IS_ERR(priv->clks[clk])) { +@@ -247,6 +360,9 @@ static int ehci_platform_probe(struct platform_device *dev) + device_enable_async_suspend(hcd->self.controller); + platform_set_drvdata(dev, hcd); + ++ if (priv->quirk_poll) ++ quirk_poll_init(priv); ++ + return err; + + err_power: +@@ -273,6 +389,9 @@ static int ehci_platform_remove(struct platform_device *dev) + struct ehci_platform_priv *priv = hcd_to_ehci_priv(hcd); + int clk; + ++ if (priv->quirk_poll) ++ quirk_poll_end(priv); ++ + usb_remove_hcd(hcd); + + if (pdata->power_off) +@@ -297,9 +416,13 @@ static int ehci_platform_suspend(struct device *dev) + struct usb_hcd *hcd = dev_get_drvdata(dev); + struct usb_ehci_pdata *pdata = dev_get_platdata(dev); + struct platform_device *pdev = to_platform_device(dev); ++ struct ehci_platform_priv *priv = hcd_to_ehci_priv(hcd); + bool do_wakeup = device_may_wakeup(dev); + int ret; + ++ if (priv->quirk_poll) ++ quirk_poll_end(priv); ++ + ret = ehci_suspend(hcd, do_wakeup); + if (ret) + return ret; +@@ -331,6 +454,10 @@ static int ehci_platform_resume(struct device *dev) + } + + ehci_resume(hcd, priv->reset_on_resume); ++ ++ if (priv->quirk_poll) ++ quirk_poll_init(priv); ++ + return 0; + } + #endif /* CONFIG_PM_SLEEP */ +diff --git a/include/linux/usb/ehci_def.h b/include/linux/usb/ehci_def.h +index a15ce99dfc2d6..78e0063555575 100644 +--- a/include/linux/usb/ehci_def.h ++++ b/include/linux/usb/ehci_def.h +@@ -151,7 +151,7 @@ struct ehci_regs { + #define PORT_OWNER (1<<13) /* true: companion hc owns this port */ + #define PORT_POWER (1<<12) /* true: has power (see PPC) */ + #define PORT_USB11(x) (((x)&(3<<10)) == (1<<10)) /* USB 1.1 device */ +-/* 11:10 for detecting lowspeed devices (reset vs release ownership) */ ++#define PORT_LS_MASK (3<<10) /* Link status (SE0, K or J */ + /* 9 reserved */ + #define PORT_LPM (1<<9) /* LPM transaction */ + #define PORT_RESET (1<<8) /* reset port */ +-- +2.25.1 + diff --git a/queue-5.4/usb-ohci-platform-fix-a-warning-when-hibernating.patch b/queue-5.4/usb-ohci-platform-fix-a-warning-when-hibernating.patch new file mode 100644 index 00000000000..a8940528a5c --- /dev/null +++ b/queue-5.4/usb-ohci-platform-fix-a-warning-when-hibernating.patch @@ -0,0 +1,102 @@ +From 71168bea2db09f1f6d73bc3aa8dc167a054bca96 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 18 May 2020 16:49:29 +0100 +Subject: usb/ohci-platform: Fix a warning when hibernating + +From: Qais Yousef + +[ 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): [] console_unlock+0x504/0x5b8 +[ 112.008441] hardirqs last disabled at (354): [] do_debug_exception+0x1a8/0x258 +[ 112.017479] softirqs last enabled at (350): [] __do_softirq+0x4bc/0x568 +[ 112.025984] softirqs last disabled at (343): [] 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 +Signed-off-by: Qais Yousef +CC: Tony Prisk +CC: Greg Kroah-Hartman +CC: Mathias Nyman +CC: Oliver Neukum +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 +Signed-off-by: Sasha Levin +--- + 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.4/usb-ohci-sm501-fix-error-return-code-in-ohci_hcd_sm5.patch b/queue-5.4/usb-ohci-sm501-fix-error-return-code-in-ohci_hcd_sm5.patch new file mode 100644 index 00000000000..1939b839837 --- /dev/null +++ b/queue-5.4/usb-ohci-sm501-fix-error-return-code-in-ohci_hcd_sm5.patch @@ -0,0 +1,43 @@ +From b59012f40c538acab12445ceb83827e5af0332d6 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Acked-by: Alan Stern +Link: https://lore.kernel.org/r/20200506135625.106910-1-weiyongjun1@huawei.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + 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.4/usb-xhci-plat-set-pm-runtime-as-active-on-resume.patch b/queue-5.4/usb-xhci-plat-set-pm-runtime-as-active-on-resume.patch new file mode 100644 index 00000000000..fb07143b4fd --- /dev/null +++ b/queue-5.4/usb-xhci-plat-set-pm-runtime-as-active-on-resume.patch @@ -0,0 +1,56 @@ +From 64d3d203ef5da7802e42a3e743baccbed9de2700 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 18 May 2020 16:49:30 +0100 +Subject: usb/xhci-plat: Set PM runtime as active on resume + +From: Qais Yousef + +[ 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 +CC: Tony Prisk +CC: Greg Kroah-Hartman +CC: Mathias Nyman +CC: Oliver Neukum +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 +Signed-off-by: Sasha Levin +--- + 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 52c625c023410..60d06e9b600f8 100644 +--- a/drivers/usb/host/xhci-plat.c ++++ b/drivers/usb/host/xhci-plat.c +@@ -410,7 +410,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.4/usblp-poison-urbs-upon-disconnect.patch b/queue-5.4/usblp-poison-urbs-upon-disconnect.patch new file mode 100644 index 00000000000..0f4b590617e --- /dev/null +++ b/queue-5.4/usblp-poison-urbs-upon-disconnect.patch @@ -0,0 +1,50 @@ +From b74595eee2d937be792bb9c524906362df0ea79b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 7 May 2020 10:58:06 +0200 +Subject: usblp: poison URBs upon disconnect + +From: Oliver Neukum + +[ 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 +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 +Signed-off-by: Sasha Levin +--- + 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.4/vfio-mdev-fix-reference-count-leak-in-add_mdev_suppo.patch b/queue-5.4/vfio-mdev-fix-reference-count-leak-in-add_mdev_suppo.patch new file mode 100644 index 00000000000..aff47adc9f3 --- /dev/null +++ b/queue-5.4/vfio-mdev-fix-reference-count-leak-in-add_mdev_suppo.patch @@ -0,0 +1,41 @@ +From 1010afed5e7eb3cae2314d5825a2e7ad7a1deb12 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 27 May 2020 21:01:09 -0500 +Subject: vfio/mdev: Fix reference count leak in add_mdev_supported_type + +From: Qiushi Wu + +[ 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 +Reviewed-by: Cornelia Huck +Reviewed-by: Kirti Wankhede +Signed-off-by: Alex Williamson +Signed-off-by: Sasha Levin +--- + 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 7570c7602ab40..f32c582611eb6 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.4/vfio-pci-fix-memory-leaks-in-alloc_perm_bits.patch b/queue-5.4/vfio-pci-fix-memory-leaks-in-alloc_perm_bits.patch new file mode 100644 index 00000000000..fb18cbcdf60 --- /dev/null +++ b/queue-5.4/vfio-pci-fix-memory-leaks-in-alloc_perm_bits.patch @@ -0,0 +1,74 @@ +From 2f17d5a91a59bd7e916cdd73f68167fa75c3b58d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 10 May 2020 12:16:56 -0400 +Subject: vfio/pci: fix memory leaks in alloc_perm_bits() + +From: Qian Cai + +[ 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 +[aw: rolled in follow-up patch] +Signed-off-by: Alex Williamson +Signed-off-by: Sasha Levin +--- + 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 f0891bd8444c7..c4d0cf9a1ab94 100644 +--- a/drivers/vfio/pci/vfio_pci_config.c ++++ b/drivers/vfio/pci/vfio_pci_config.c +@@ -1726,8 +1726,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.4/vfio-pci-mask-cap-zero.patch b/queue-5.4/vfio-pci-mask-cap-zero.patch new file mode 100644 index 00000000000..3fe0f747bfd --- /dev/null +++ b/queue-5.4/vfio-pci-mask-cap-zero.patch @@ -0,0 +1,50 @@ +From 5328ba0ae55fd6acb311e48cf1d513453d9873e2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 8 Apr 2020 11:45:28 -0600 +Subject: vfio-pci: Mask cap zero + +From: Alex Williamson + +[ 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 +Signed-off-by: Alex Williamson +Signed-off-by: Sasha Levin +--- + 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 c4d0cf9a1ab94..d6359c37c9e55 100644 +--- a/drivers/vfio/pci/vfio_pci_config.c ++++ b/drivers/vfio/pci/vfio_pci_config.c +@@ -1460,7 +1460,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.4/virtiofs-schedule-blocking-async-replies-in-separate.patch b/queue-5.4/virtiofs-schedule-blocking-async-replies-in-separate.patch new file mode 100644 index 00000000000..19f69c3439b --- /dev/null +++ b/queue-5.4/virtiofs-schedule-blocking-async-replies-in-separate.patch @@ -0,0 +1,205 @@ +From a8654cc329a3f9f6c6fb4f0673cc573c600f7de4 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 20 Apr 2020 17:01:34 +0200 +Subject: virtiofs: schedule blocking async replies in separate worker + +From: Vivek Goyal + +[ 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 +Signed-off-by: Miklos Szeredi +Signed-off-by: Sasha Levin +--- + 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 3dd37a998ea93..713d55a61890e 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 a5c86048b96ed..7505f81027623 100644 +--- a/fs/fuse/virtio_fs.c ++++ b/fs/fuse/virtio_fs.c +@@ -55,6 +55,12 @@ struct virtio_fs_forget { + struct list_head list; + }; + ++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); + +@@ -443,19 +449,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 */ +@@ -473,38 +527,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.4/watchdog-da9062-no-need-to-ping-manually-before-sett.patch b/queue-5.4/watchdog-da9062-no-need-to-ping-manually-before-sett.patch new file mode 100644 index 00000000000..569c6aa4a8d --- /dev/null +++ b/queue-5.4/watchdog-da9062-no-need-to-ping-manually-before-sett.patch @@ -0,0 +1,49 @@ +From eccbb336f575ef32647a80072e24c5bcbe6195b5 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 3 Apr 2020 15:07:28 +0200 +Subject: watchdog: da9062: No need to ping manually before setting timeout + +From: Stefan Riedmueller + +[ 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 +Reviewed-by: Guenter Roeck +Reviewed-by: Adam Thomson +Link: https://lore.kernel.org/r/20200403130728.39260-3-s.riedmueller@phytec.de +Signed-off-by: Guenter Roeck +Signed-off-by: Wim Van Sebroeck +Signed-off-by: Sasha Levin +--- + 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 e92f38fcb7a4a..1b9bcfed39e96 100644 +--- a/drivers/watchdog/da9062_wdt.c ++++ b/drivers/watchdog/da9062_wdt.c +@@ -55,11 +55,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.4/x86-apic-make-tsc-deadline-timer-detection-message-v.patch b/queue-5.4/x86-apic-make-tsc-deadline-timer-detection-message-v.patch new file mode 100644 index 00000000000..58870f07940 --- /dev/null +++ b/queue-5.4/x86-apic-make-tsc-deadline-timer-detection-message-v.patch @@ -0,0 +1,47 @@ +From ea7b06edc36136d2233c48423d3cad4f01df722f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 25 May 2020 12:38:39 +0200 +Subject: x86/apic: Make TSC deadline timer detection message visible + +From: Borislav Petkov + +[ 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 +Link: https://lkml.kernel.org/r/20200525104218.27018-1-bp@alien8.de +Signed-off-by: Sasha Levin +--- + 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 25b8c45467fcd..fce94c799f015 100644 +--- a/arch/x86/kernel/apic/apic.c ++++ b/arch/x86/kernel/apic/apic.c +@@ -2099,7 +2099,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.4/x86-idt-keep-spurious-entries-unset-in-system_vector.patch b/queue-5.4/x86-idt-keep-spurious-entries-unset-in-system_vector.patch new file mode 100644 index 00000000000..f5a301444cb --- /dev/null +++ b/queue-5.4/x86-idt-keep-spurious-entries-unset-in-system_vector.patch @@ -0,0 +1,52 @@ +From d26bc147261d470090a8e443aac51850dec6f56b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 28 Apr 2020 11:38:24 +0200 +Subject: x86/idt: Keep spurious entries unset in system_vectors + +From: Vitaly Kuznetsov + +[ 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 +Signed-off-by: Thomas Gleixner +Link: https://lkml.kernel.org/r/20200428093824.1451532-4-vkuznets@redhat.com +Signed-off-by: Sasha Levin +--- + 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.4/x86-purgatory-disable-various-profiling-and-sanitizi.patch b/queue-5.4/x86-purgatory-disable-various-profiling-and-sanitizi.patch new file mode 100644 index 00000000000..4e55c93aba7 --- /dev/null +++ b/queue-5.4/x86-purgatory-disable-various-profiling-and-sanitizi.patch @@ -0,0 +1,62 @@ +From 52c98bc16fcd1bb5680eb2504e6d1819dcab3b14 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 17 Mar 2020 14:08:40 +0100 +Subject: x86/purgatory: Disable various profiling and sanitizing options + +From: Hans de Goede + +[ 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 +Signed-off-by: Borislav Petkov +Link: https://lkml.kernel.org/r/20200317130841.290418-1-hdegoede@redhat.com +Signed-off-by: Sasha Levin +--- + 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.4/xdp-fix-xsk_generic_xmit-errno.patch b/queue-5.4/xdp-fix-xsk_generic_xmit-errno.patch new file mode 100644 index 00000000000..1500a072c72 --- /dev/null +++ b/queue-5.4/xdp-fix-xsk_generic_xmit-errno.patch @@ -0,0 +1,45 @@ +From 20aa9ac8af5d01a13bdaa1586e5c2a84b0c02377 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Signed-off-by: Daniel Borkmann +Acked-by: Björn Töpel +Link: https://lore.kernel.org/bpf/1591852266-24017-1-git-send-email-lirongqing@baidu.com +Signed-off-by: Sasha Levin +--- + 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 7181a30666b4a..f9eb5efb237c7 100644 +--- a/net/xdp/xsk.c ++++ b/net/xdp/xsk.c +@@ -362,10 +362,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.4/yam-fix-possible-memory-leak-in-yam_init_driver.patch b/queue-5.4/yam-fix-possible-memory-leak-in-yam_init_driver.patch new file mode 100644 index 00000000000..ddbf248c3aa --- /dev/null +++ b/queue-5.4/yam-fix-possible-memory-leak-in-yam_init_driver.patch @@ -0,0 +1,36 @@ +From 18d4b93fbb13e95913c1ce7f607e9990062d5703 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 4 Jun 2020 20:18:51 +0800 +Subject: yam: fix possible memory leak in yam_init_driver + +From: Wang Hai + +[ 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 +Signed-off-by: Wang Hai +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + 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 + -- 2.47.3