6.1.88-rc1 review
Subsystems (3)
Greg Kroah-Hartman
maintainercover 6.1.88-rc1 review
This is the start of the stable review cycle for the 6.1.88 release. There are 141 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu, 25 Apr 2024 21:38:28 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.1.88-rc1.gz
or in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git linux-6.1.y
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 6.1.88-rc1
Johan Hovold <[email protected]>
PCI/ASPM: Fix deadlock when enabling ASPM
Namjae Jeon <[email protected]>
ksmbd: common: use struct_group_attr instead of struct_group for network_open_info
Marios Makassikis <[email protected]>
ksmbd: clear RENAME_NOREPLACE before calling vfs_rename
Namjae Jeon <[email protected]>
ksmbd: validate request buffer size in smb2_allocate_rsp_buf()
Namjae Jeon <[email protected]>
ksmbd: fix slab-out-of-bounds in smb2_allocate_rsp_buf
Arınç ÜNAL <[email protected]>
net: dsa: mt7530: fix enabling EEE on MT7531 switch on all boards
Arınç ÜNAL <[email protected]>
net: dsa: mt7530: fix improper frames on all 25MHz and 40MHz XTAL MT7530
Vladimir Oltean <[email protected]>
net: dsa: introduce preferred_default_local_cpu_port and use on MT7530
Arınç ÜNAL <[email protected]>
net: dsa: mt7530: set all CPU ports in MT7531_CPU_PMAP
Jeongjun Park <[email protected]>
nilfs2: fix OOB in nilfs_set_de_type
Qiang Zhang <[email protected]>
bootconfig: use memblock_free_late to free xbc memory to buddy
Dave Airlie <[email protected]>
nouveau: fix instmem race condition around ptr stores
Zack Rusin <[email protected]>
drm/vmwgfx: Fix crtc's atomic check conditional
Zack Rusin <[email protected]>
drm/vmwgfx: Sort primary plane formats by order of preference
xinhui pan <[email protected]>
drm/amdgpu: validate the parameters of bo mapping operations more clearly
Miaohe Lin <[email protected]>
mm/memory-failure: fix deadlock when hugetlb_optimize_vmemmap is enabled
Yuntao Wang <[email protected]>
init/main.c: Fix potential static_command_line memory overflow
Yaxiong Tian <[email protected]>
arm64: hibernate: Fix level3 translation fault in swsusp_save()
Sandipan Das <[email protected]>
KVM: x86/pmu: Do not mask LVTPC when handling a PMI on AMD platforms
Sean Christopherson <[email protected]>
KVM: x86/pmu: Disable support for adaptive PEBS
Sean Christopherson <[email protected]>
KVM: x86: Snapshot if a vCPU's vendor model is AMD vs. Intel compatible
Alan Stern <[email protected]>
fs: sysfs: Fix reference leak in sysfs_break_active_protection()
Samuel Thibault <[email protected]>
speakup: Avoid crash on very long word
Alexander Usyskin <[email protected]>
mei: me: disable RPL-S on SPS and IGN firmwares
Norihiko Hama <[email protected]>
usb: gadget: f_ncm: Fix UAF ncm object at re-bind after usb ep transport error
Kai-Heng Feng <[email protected]>
usb: Disable USB3 LPM at shutdown
Minas Harutyunyan <[email protected]>
usb: dwc2: host: Fix dereference issue in DDMA completion flow.
Greg Kroah-Hartman <[email protected]>
Revert "usb: cdc-wdm: close race between read and workqueue"
Daniele Palmas <[email protected]>
USB: serial: option: add Telit FN920C04 rmnet compositions
Vanillan Wang <[email protected]>
USB: serial: option: add Rolling RW101-GL and RW135-GL support
Jerry Meng <[email protected]>
USB: serial: option: support Quectel EM060K sub-models
Coia Prant <[email protected]>
USB: serial: option: add Lonsung U8300/U9300 product
Chuanhong Guo <[email protected]>
USB: serial: option: add support for Fibocom FM650/FG650
bolan wang <[email protected]>
USB: serial: option: add Fibocom FM135-GL variants
Uwe Kleine-König <[email protected]>
serial: stm32: Reset .throttled state in .startup()
Uwe Kleine-König <[email protected]>
serial: stm32: Return IRQ_NONE in the ISR if no handling happend
Finn Thain <[email protected]>
serial/pmac_zilog: Remove flawed mitigation for rx irq flood
Emil Kronborg <[email protected]>
serial: mxs-auart: add spinlock around changing cts state
Nikita Zhandarovich <[email protected]>
comedi: vmk80xx: fix incomplete endpoint checking
Gil Fine <[email protected]>
thunderbolt: Fix wake configurations after device unplug
Gil Fine <[email protected]>
thunderbolt: Avoid notify PM core about runtime PM resume
Carlos Llamas <[email protected]>
binder: check offset alignment in binder_get_object()
Ai Chao <[email protected]>
ALSA: hda/realtek - Enable audio jacks of Haier Boyue G42 with ALC269VC
Eric Biggers <[email protected]>
x86/cpufeatures: Fix dependencies for GFNI, VAES, and VPCLMULQDQ
Josh Poimboeuf <[email protected]>
x86/bugs: Fix BHI retpoline check
Pin-yen Lin <[email protected]>
clk: mediatek: Do a runtime PM get on controllers during probe
AngeloGioacchino Del Regno <[email protected]>
clk: mediatek: clk-mtk: Extend mtk_clk_simple_probe()
AngeloGioacchino Del Regno <[email protected]>
clk: mediatek: clk-mux: Propagate struct device for mtk-mux
AngeloGioacchino Del Regno <[email protected]>
clk: mediatek: clk-mtk: Propagate struct device for composites
AngeloGioacchino Del Regno <[email protected]>
clk: mediatek: clk-gate: Propagate struct device with mtk_clk_register_gates()
AngeloGioacchino Del Regno <[email protected]>
clk: mediatek: mt8192: Propagate struct device for gate clocks
AngeloGioacchino Del Regno <[email protected]>
clk: mediatek: mt8192: Correctly unregister and free clocks on failure
Stephen Boyd <[email protected]>
clk: Get runtime PM before walking tree for clk_summary
Vishal Badole <[email protected]>
clk: Show active consumers of clocks in debugfs
Yu Zhe <[email protected]>
clk: remove unnecessary (void*) conversions
Stephen Boyd <[email protected]>
clk: Get runtime PM before walking tree during disable_unused
Stephen Boyd <[email protected]>
clk: Initialize struct clk_core kref earlier
Konrad Dybcio <[email protected]>
clk: Print an info line before disabling unused clocks
Stephen Boyd <[email protected]>
clk: Remove prepare_lock hold assertion in __clk_release()
Hardik Gajjar <[email protected]>
usb: new quirk to reduce the SET_ADDRESS request timeout
Hardik Gajjar <[email protected]>
usb: xhci: Add timeout argument in address_device USB HCD callback
Brenton Simpson <[email protected]>
drm: panel-orientation-quirks: Add quirk for Lenovo Legion Go
Geoffrey D. Bennett <[email protected]>
ALSA: scarlett2: Rename scarlett_gen2 to scarlett2
Ilpo Järvinen <[email protected]>
PCI: Simplify pcie_capability_clear_and_set_word() to ..._clear_word()
Bjorn Helgaas <[email protected]>
PCI/DPC: Use FIELD_GET()
Geoffrey D. Bennett <[email protected]>
ALSA: scarlett2: Add Focusrite Clarett 2Pre and 4Pre USB support
Geoffrey D. Bennett <[email protected]>
ALSA: scarlett2: Add Focusrite Clarett+ 2Pre and 4Pre support
Geoffrey D. Bennett <[email protected]>
ALSA: scarlett2: Add correct product series name to messages
Geoffrey D. Bennett <[email protected]>
ALSA: scarlett2: Default mixer driver to enabled
Niklas Schnelle <[email protected]>
usb: pci-quirks: group AMD specific quirk code together
Linus Walleij <[email protected]>
ASoC: ti: Convert Pandora ASoC to GPIO descriptors
Geoffrey D. Bennett <[email protected]>
ALSA: scarlett2: Add support for Clarett 8Pre USB
Geoffrey D. Bennett <[email protected]>
ALSA: scarlett2: Move USB IDs out from device_info struct
Rob Herring <[email protected]>
ARM: davinci: Drop unused includes
Kelvin Cao <[email protected]>
PCI: switchtec: Add support for PCIe Gen5 devices
Kelvin Cao <[email protected]>
PCI: switchtec: Use normal comment style
Niklas Schnelle <[email protected]>
PCI: Make quirk using inw() depend on HAS_IOPORT
Maciej W. Rozycki <[email protected]>
PCI: Execute quirk_enable_clear_retrain_link() earlier
Mika Westerberg <[email protected]>
thunderbolt: Add debug log for link controller power quirk
Mika Westerberg <[email protected]>
thunderbolt: Log function name of the called quirk
Arnd Bergmann <[email protected]>
x86/quirks: Include linux/pnp.h for arch_pnpbios_disabled()
Mike Pastore <[email protected]>
PCI: Delay after FLR of Solidigm P44 Pro NVMe
Christophe JAILLET <[email protected]>
usb: pci-quirks: Reduce the length of a spinlock section in usb_amd_find_chipset_info()
David Yang <[email protected]>
HID: kye: Sort kye devices
Alvaro Karsz <[email protected]>
PCI: Avoid FLR for SolidRun SNET DPU rev 1
Dmitry Torokhov <[email protected]>
ARM: OMAP2+: pdata-quirks: stop including wl12xx.h
Dmitry Torokhov <[email protected]>
ARM: omap2: n8x0: stop instantiating codec platform data
Dmitry Baryshkov <[email protected]>
drm/panel: visionox-rm69299: don't unregister DSI device
Mikhail Kobuk <[email protected]>
drm: nv04: Fix out of bounds access
Peter Oberparleiter <[email protected]>
s390/cio: fix race condition during online processing
Peter Oberparleiter <[email protected]>
s390/qdio: handle deferred cc1
Michael Guralnik <[email protected]>
RDMA/mlx5: Fix port number for counter query in multi-port configuration
Mark Zhang <[email protected]>
RDMA/cm: Print the old state when cm_destroy_id gets timeout
Yanjun.Zhu <[email protected]>
RDMA/rxe: Fix the problem "mutex_destroy missing"
Siddharth Vadapalli <[email protected]>
net: ethernet: ti: am65-cpsw-nuss: cleanup DMA Channels before using them
Arınç ÜNAL <[email protected]>
net: dsa: mt7530: fix mirroring frames received on local port
Lei Chen <[email protected]>
tun: limit printing rate when illegal packet received by tun dev
Michal Swiatkowski <[email protected]>
ice: tc: allow zero flags in parsing tc flower
Carolina Jubran <[email protected]>
net/mlx5e: Prevent deadlock while disabling aRFS
Shay Drory <[email protected]>
net/mlx5: Lag, restore buckets number to default after hash LAG deactivation
Kuniyuki Iwashima <[email protected]>
af_unix: Don't peek OOB data without MSG_OOB.
Kuniyuki Iwashima <[email protected]>
af_unix: Call manage_oob() for every skb in unix_stream_read_generic().
Pablo Neira Ayuso <[email protected]>
netfilter: flowtable: incorrect pppoe tuple
Pablo Neira Ayuso <[email protected]>
netfilter: flowtable: validate pppoe header
Florian Westphal <[email protected]>
netfilter: nft_set_pipapo: do not free live element
Pablo Neira Ayuso <[email protected]>
netfilter: br_netfilter: skip conntrack input hook for promisc packets
Ziyang Xuan <[email protected]>
netfilter: nf_tables: Fix potential data-race in __nft_obj_type_get()
Ziyang Xuan <[email protected]>
netfilter: nf_tables: Fix potential data-race in __nft_expr_type_get()
Ard Biesheuvel <[email protected]>
x86/efistub: Remap kernel text read-only before dropping NX attribute
Ard Biesheuvel <[email protected]>
x86/sev: Move early startup code into .head.text section
Ard Biesheuvel <[email protected]>
x86/sme: Move early SME kernel encryption handling into .head.text
Hou Wenlong <[email protected]>
x86/head/64: Move the __head definition to <asm/init.h>
Hou Wenlong <[email protected]>
x86/head/64: Add missing __head annotation to startup_64_load_idt()
Pasha Tatashin <[email protected]>
x86/mm: Remove P*D_PAGE_MASK and P*D_PAGE_SIZE macros
Ard Biesheuvel <[email protected]>
x86/efistub: Use 1:1 file:memory mapping for PE/COFF .compat section
Ard Biesheuvel <[email protected]>
x86/boot: Increase section and file alignment to 4k/512
Ard Biesheuvel <[email protected]>
x86/boot: Split off PE/COFF .data section
Ard Biesheuvel <[email protected]>
x86/boot: Drop PE/COFF .reloc section
Ard Biesheuvel <[email protected]>
x86/boot: Construct PE/COFF .text section from assembler
Ard Biesheuvel <[email protected]>
x86/boot: Derive file size from _edata symbol
Ard Biesheuvel <[email protected]>
x86/boot: Define setup size in linker script
Ard Biesheuvel <[email protected]>
x86/boot: Set EFI handover offset directly in header asm
Ard Biesheuvel <[email protected]>
x86/boot: Grab kernel_info offset from zoffset header directly
Ard Biesheuvel <[email protected]>
x86/boot: Drop references to startup_64
Ard Biesheuvel <[email protected]>
x86/boot: Drop redundant code setting the root device
Ard Biesheuvel <[email protected]>
x86/boot: Omit compression buffer from PE/COFF image memory footprint
Ard Biesheuvel <[email protected]>
x86/boot: Remove the 'bugger off' message
Ard Biesheuvel <[email protected]>
x86/efi: Drop alignment flags from PE section headers
Ard Biesheuvel <[email protected]>
x86/efistub: Reinstate soft limit for initrd loading
Ard Biesheuvel <[email protected]>
x86/efi: Disregard setup header of loaded image
Ard Biesheuvel <[email protected]>
x86/efi: Drop EFI stub .bss from .data section
Janusz Krzysztofik <[email protected]>
drm/i915/vma: Fix UAF on destroy against retire race
Jose Ignacio Tornos Martinez <[email protected]>
net: usb: ax88179_178a: avoid writing the mac address before first reading
Jason A. Donenfeld <[email protected]>
random: handle creditable entropy from atomic process context
Yuanhe Shu <[email protected]>
selftests/ftrace: Limit length in subsystem-enable tests
Steven Rostedt (Google) <[email protected]>
SUNRPC: Fix rpcgss_context trace event acceptor field
Alexey Izbyshev <[email protected]>
io_uring: Fix io_cqring_wait() not restoring sigmask on get_timespec64() failure
Dillon Varone <[email protected]>
drm/amd/display: Do not recursively call manual trigger programming
Tim Huang <[email protected]>
drm/amdgpu: fix incorrect number of active RBs for gfx11
Hawking Zhang <[email protected]>
drm/amdgpu: fix incorrect active rb bitmap for gfx11
Zack Rusin <[email protected]>
drm/vmwgfx: Enable DMA mappings with SEV
-------------
Diffstat:
Documentation/admin-guide/kernel-parameters.txt | 3 +
MAINTAINERS | 2 +-
Makefile | 4 +-
arch/arm/mach-davinci/pdata-quirks.c | 2 +-
arch/arm/mach-omap2/board-n8x0.c | 5 -
arch/arm/mach-omap2/common-board-devices.h | 2 -
arch/arm/mach-omap2/pdata-quirks.c | 12 +-
arch/arm64/mm/pageattr.c | 3 -
arch/x86/boot/Makefile | 2 +-
arch/x86/boot/compressed/Makefile | 2 +-
arch/x86/boot/compressed/misc.c | 1 +
arch/x86/boot/compressed/sev.c | 3 +
arch/x86/boot/compressed/vmlinux.lds.S | 6 +-
arch/x86/boot/header.S | 211 +++++++---------
arch/x86/boot/setup.ld | 14 +-
arch/x86/boot/tools/build.c | 273 +--------------------
arch/x86/include/asm/boot.h | 1 +
arch/x86/include/asm/init.h | 2 +
arch/x86/include/asm/kvm_host.h | 1 +
arch/x86/include/asm/mem_encrypt.h | 8 +-
arch/x86/include/asm/page_types.h | 12 +-
arch/x86/include/asm/sev.h | 10 +-
arch/x86/kernel/amd_gart_64.c | 2 +-
arch/x86/kernel/cpu/bugs.c | 11 +-
arch/x86/kernel/cpu/cpuid-deps.c | 6 +-
arch/x86/kernel/head64.c | 7 +-
arch/x86/kernel/platform-quirks.c | 1 +
arch/x86/kernel/sev-shared.c | 23 +-
arch/x86/kernel/sev.c | 11 +-
arch/x86/kvm/cpuid.c | 1 +
arch/x86/kvm/cpuid.h | 10 +
arch/x86/kvm/lapic.c | 3 +-
arch/x86/kvm/mmu/mmu.c | 2 +-
arch/x86/kvm/vmx/vmx.c | 24 +-
arch/x86/kvm/x86.c | 2 +-
arch/x86/mm/mem_encrypt_boot.S | 4 +-
arch/x86/mm/mem_encrypt_identity.c | 58 ++---
arch/x86/mm/pat/set_memory.c | 6 +-
arch/x86/mm/pti.c | 2 +-
drivers/accessibility/speakup/main.c | 2 +-
drivers/android/binder.c | 4 +-
drivers/char/random.c | 10 +-
drivers/clk/clk.c | 201 +++++++++++----
drivers/clk/mediatek/clk-gate.c | 23 +-
drivers/clk/mediatek/clk-gate.h | 7 +-
drivers/clk/mediatek/clk-mt2701-aud.c | 4 +-
drivers/clk/mediatek/clk-mt2701-eth.c | 4 +-
drivers/clk/mediatek/clk-mt2701-g3d.c | 2 +-
drivers/clk/mediatek/clk-mt2701-hif.c | 4 +-
drivers/clk/mediatek/clk-mt2701-mm.c | 4 +-
drivers/clk/mediatek/clk-mt2701.c | 22 +-
drivers/clk/mediatek/clk-mt2712-mm.c | 4 +-
drivers/clk/mediatek/clk-mt2712.c | 24 +-
drivers/clk/mediatek/clk-mt6765.c | 13 +-
drivers/clk/mediatek/clk-mt6779-mm.c | 4 +-
drivers/clk/mediatek/clk-mt6779.c | 21 +-
drivers/clk/mediatek/clk-mt6795-infracfg.c | 3 +-
drivers/clk/mediatek/clk-mt6795-mm.c | 3 +-
drivers/clk/mediatek/clk-mt6795-pericfg.c | 6 +-
drivers/clk/mediatek/clk-mt6795-topckgen.c | 6 +-
drivers/clk/mediatek/clk-mt6797-mm.c | 4 +-
drivers/clk/mediatek/clk-mt6797.c | 7 +-
drivers/clk/mediatek/clk-mt7622-aud.c | 4 +-
drivers/clk/mediatek/clk-mt7622-eth.c | 8 +-
drivers/clk/mediatek/clk-mt7622-hif.c | 8 +-
drivers/clk/mediatek/clk-mt7622.c | 22 +-
drivers/clk/mediatek/clk-mt7629-eth.c | 7 +-
drivers/clk/mediatek/clk-mt7629-hif.c | 8 +-
drivers/clk/mediatek/clk-mt7629.c | 18 +-
drivers/clk/mediatek/clk-mt7986-eth.c | 10 +-
drivers/clk/mediatek/clk-mt7986-infracfg.c | 7 +-
drivers/clk/mediatek/clk-mt7986-topckgen.c | 3 +-
drivers/clk/mediatek/clk-mt8135.c | 18 +-
drivers/clk/mediatek/clk-mt8167-aud.c | 2 +-
drivers/clk/mediatek/clk-mt8167-img.c | 2 +-
drivers/clk/mediatek/clk-mt8167-mfgcfg.c | 2 +-
drivers/clk/mediatek/clk-mt8167-mm.c | 4 +-
drivers/clk/mediatek/clk-mt8167-vdec.c | 3 +-
drivers/clk/mediatek/clk-mt8167.c | 12 +-
drivers/clk/mediatek/clk-mt8173-mm.c | 4 +-
drivers/clk/mediatek/clk-mt8173.c | 34 +--
drivers/clk/mediatek/clk-mt8183-audio.c | 4 +-
drivers/clk/mediatek/clk-mt8183-mm.c | 4 +-
drivers/clk/mediatek/clk-mt8183.c | 36 +--
drivers/clk/mediatek/clk-mt8186-mcu.c | 3 +-
drivers/clk/mediatek/clk-mt8186-mm.c | 3 +-
drivers/clk/mediatek/clk-mt8186-topckgen.c | 9 +-
drivers/clk/mediatek/clk-mt8192-aud.c | 3 +-
drivers/clk/mediatek/clk-mt8192-mm.c | 3 +-
drivers/clk/mediatek/clk-mt8192.c | 88 +++++--
drivers/clk/mediatek/clk-mt8195-apmixedsys.c | 3 +-
drivers/clk/mediatek/clk-mt8195-topckgen.c | 9 +-
drivers/clk/mediatek/clk-mt8195-vdo0.c | 3 +-
drivers/clk/mediatek/clk-mt8195-vdo1.c | 3 +-
drivers/clk/mediatek/clk-mt8365-mm.c | 5 +-
drivers/clk/mediatek/clk-mt8365.c | 14 +-
drivers/clk/mediatek/clk-mt8516-aud.c | 2 +-
drivers/clk/mediatek/clk-mt8516.c | 12 +-
drivers/clk/mediatek/clk-mtk.c | 127 +++++++++-
drivers/clk/mediatek/clk-mtk.h | 13 +-
drivers/clk/mediatek/clk-mux.c | 14 +-
drivers/clk/mediatek/clk-mux.h | 3 +-
drivers/comedi/drivers/vmk80xx.c | 35 +--
drivers/firmware/efi/libstub/Makefile | 7 -
drivers/firmware/efi/libstub/x86-stub.c | 58 ++---
drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 72 ++++--
drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c | 80 ++++--
drivers/gpu/drm/amd/display/dc/dcn32/dcn32_optc.c | 3 -
drivers/gpu/drm/drm_panel_orientation_quirks.c | 6 +
drivers/gpu/drm/i915/i915_vma.c | 42 +++-
drivers/gpu/drm/nouveau/nouveau_bios.c | 13 +-
drivers/gpu/drm/nouveau/nvkm/subdev/instmem/nv50.c | 7 +-
drivers/gpu/drm/panel/panel-visionox-rm69299.c | 2 -
drivers/gpu/drm/vmwgfx/vmwgfx_drv.c | 11 +-
drivers/gpu/drm/vmwgfx/vmwgfx_kms.c | 11 +-
drivers/gpu/drm/vmwgfx/vmwgfx_kms.h | 4 +-
drivers/hid/hid-ids.h | 2 +-
drivers/hid/hid-kye.c | 66 ++---
drivers/hid/hid-quirks.c | 6 +-
drivers/infiniband/core/cm.c | 11 +-
drivers/infiniband/hw/mlx5/mad.c | 3 +-
drivers/infiniband/sw/rxe/rxe.c | 2 +
drivers/misc/mei/pci-me.c | 2 +-
drivers/net/dsa/mt7530.c | 58 +++--
drivers/net/dsa/mt7530.h | 6 +
drivers/net/ethernet/intel/ice/ice_tc_lib.c | 2 +-
drivers/net/ethernet/mellanox/mlx5/core/en_arfs.c | 27 +-
drivers/net/ethernet/mellanox/mlx5/core/lag/lag.c | 4 +-
drivers/net/ethernet/ti/am65-cpsw-nuss.c | 18 ++
drivers/net/tun.c | 18 +-
drivers/net/usb/ax88179_178a.c | 4 +-
drivers/pci/bus.c | 49 ++--
drivers/pci/pci.c | 78 ++++--
drivers/pci/pci.h | 4 +-
drivers/pci/pcie/aspm.c | 21 +-
drivers/pci/pcie/dpc.c | 5 +-
drivers/pci/quirks.c | 70 +++++-
drivers/pci/switch/switchtec.c | 158 +++++++-----
drivers/s390/cio/device.c | 13 +-
drivers/s390/cio/qdio_main.c | 28 ++-
drivers/thunderbolt/quirks.c | 2 +
drivers/thunderbolt/switch.c | 50 +++-
drivers/thunderbolt/tb.c | 4 +-
drivers/thunderbolt/tb.h | 3 +-
drivers/thunderbolt/usb4.c | 13 +-
drivers/tty/serial/mxs-auart.c | 8 +-
drivers/tty/serial/pmac_zilog.c | 14 --
drivers/tty/serial/stm32-usart.c | 13 +-
drivers/usb/class/cdc-wdm.c | 6 +-
drivers/usb/core/hub.c | 15 +-
drivers/usb/core/port.c | 4 +-
drivers/usb/core/quirks.c | 7 +
drivers/usb/dwc2/hcd_ddma.c | 4 +-
drivers/usb/gadget/function/f_ncm.c | 4 +-
drivers/usb/host/pci-quirks.c | 123 +++++-----
drivers/usb/host/pci-quirks.h | 14 +-
drivers/usb/host/xhci-mem.c | 2 +
drivers/usb/host/xhci-ring.c | 11 +-
drivers/usb/host/xhci.c | 23 +-
drivers/usb/host/xhci.h | 9 +-
drivers/usb/serial/option.c | 40 +++
fs/nilfs2/dir.c | 2 +-
fs/smb/common/smb2pdu.h | 2 +-
fs/smb/server/server.c | 13 +-
fs/smb/server/smb2pdu.c | 4 +
fs/smb/server/vfs.c | 5 +
fs/sysfs/file.c | 2 +
include/linux/bootconfig.h | 7 +-
include/linux/pci.h | 5 +
include/linux/pci_ids.h | 2 +
include/linux/switchtec.h | 1 +
include/linux/usb/hcd.h | 5 +-
include/linux/usb/quirks.h | 3 +
include/net/dsa.h | 8 +
include/net/netfilter/nf_flow_table.h | 12 +-
include/trace/events/rpcgss.h | 4 +-
include/uapi/linux/pci_regs.h | 1 +
init/main.c | 2 +
io_uring/io_uring.c | 16 +-
lib/bootconfig.c | 19 +-
mm/memory-failure.c | 18 +-
net/bridge/br_input.c | 15 +-
net/bridge/br_netfilter_hooks.c | 6 +
net/bridge/br_private.h | 1 +
net/bridge/netfilter/nf_conntrack_bridge.c | 14 +-
net/dsa/dsa2.c | 24 +-
net/netfilter/nf_flow_table_inet.c | 3 +-
net/netfilter/nf_flow_table_ip.c | 10 +-
net/netfilter/nf_tables_api.c | 16 +-
net/netfilter/nft_set_pipapo.c | 14 +-
net/unix/af_unix.c | 12 +-
sound/pci/hda/patch_realtek.c | 1 +
sound/soc/ti/omap3pandora.c | 63 ++---
sound/usb/Makefile | 2 +-
sound/usb/mixer_quirks.c | 9 +-
.../{mixer_scarlett_gen2.c => mixer_scarlett2.c} | 257 +++++++++++++------
sound/usb/mixer_scarlett2.h | 7 +
sound/usb/mixer_scarlett_gen2.h | 7 -
.../ftrace/test.d/event/subsystem-enable.tc | 6 +-
199 files changed, 2147 insertions(+), 1497 deletions(-)Greg Kroah-Hartman
maintainerPATCH 1/141 drm/vmwgfx: Enable DMA mappings with SEV
6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zack Rusin <[email protected]>
[ Upstream commit 4c08f01934ab67d1d283d5cbaa52b923abcfe4cd ]
Enable DMA mappings in vmwgfx after TTM has been fixed in commit 3bf3710e3718 ("drm/ttm: Add a generic TTM memcpy move for page-based iomem")
This enables full guest-backed memory support and in particular allows usage of screen targets as the presentation mechanism.
--- drivers/gpu/drm/vmwgfx/vmwgfx_drv.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-)
drivers/gpu/drm/vmwgfx/vmwgfx_drv.c +6 -5
@@ -663,11 +663,12 @@ static int vmw_dma_select_mode(struct vmw_private *dev_priv) [vmw_dma_map_populate] = "Caching DMA mappings.", [vmw_dma_map_bind] = "Giving up DMA mappings early."}; -/* TTM currently doesn't fully support SEV encryption. */ -if (cc_platform_has (CC_ATTR_MEM_ENCRYPT )) -return -EINVAL ; - -if (vmw_force_coherent) +/* +* When running with SEV we always want dma mappings, because +* otherwise ttm tt pool pages will bounce through swiotlb running +* out of available space. +*/ +if (vmw_force_coherent ||cc_platform_has (CC_ATTR_MEM_ENCRYPT )) dev_priv->map_mode = vmw_dma_alloc_coherent;else if (vmw_restrict_iommu) dev_priv->map_mode = vmw_dma_map_bind;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 2/141 drm/amdgpu: fix incorrect active rb bitmap for gfx11
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hawking Zhang <[email protected]>
[ Upstream commit f9c35f4fffc6cb5bbb23f546f48c045aef012518 ]
GFX v11 changes RB_BACKEND_DISABLE related registers from per SA to global ones. The approach to query active rb bitmap needs to be changed accordingly. Query per SE setting returns wrong active RB bitmap especially in the case when some of SA are disabled. With the new approach, driver will generate the active rb bitmap based on active SA bitmap and global active RB bitmap.
Stable-dep-of: bbca7f414ae9 ("drm/amdgpu: fix incorrect number of active RBs for gfx11")
--- drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c | 78 +++++++++++++++++--------- 1 file changed, 52 insertions(+), 26 deletions(-)
drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c +52 -26
@@ -1531,44 +1531,70 @@ static void gfx_v11_0_select_se_sh(struct amdgpu_device *adev, u32 se_num,WREG32_SOC15 (GC ,0 , regGRBM_GFX_INDEX, data); } -static u32 gfx_v11_0_get_rb_active_bitmap (struct amdgpu_device *adev) +static u32 gfx_v11_0_get_sa_active_bitmap (struct amdgpu_device *adev) { -u32 data, mask; +u32 gc_disabled_sa_mask, gc_user_disabled_sa_mask, sa_mask; + + gc_disabled_sa_mask =RREG32_SOC15 (GC ,0 , regCC_GC_SA_UNIT_DISABLE); + gc_disabled_sa_mask =REG_GET_FIELD (gc_disabled_sa_mask, +CC_GC_SA_UNIT_DISABLE , +SA_DISABLE ); + gc_user_disabled_sa_mask =RREG32_SOC15 (GC ,0 , regGC_USER_SA_UNIT_DISABLE); + gc_user_disabled_sa_mask =REG_GET_FIELD (gc_user_disabled_sa_mask, +GC_USER_SA_UNIT_DISABLE , +SA_DISABLE ); + sa_mask =amdgpu_gfx_create_bitmask (adev->gfx.config.max_sh_per_se * + adev->gfx.config.max_shader_engines); - data =RREG32_SOC15 (GC ,0 , regCC_RB_BACKEND_DISABLE); - data |=RREG32_SOC15 (GC ,0 , regGC_USER_RB_BACKEND_DISABLE); +return sa_mask & (~(gc_disabled_sa_mask | gc_user_disabled_sa_mask)); +} - data &=CC_RB_BACKEND_DISABLE__BACKEND_DISABLE_MASK ; - data >>=GC_USER_RB_BACKEND_DISABLE__BACKEND_DISABLE__SHIFT ; +static u32 gfx_v11_0_get_rb_active_bitmap (struct amdgpu_device *adev) +{ +u32 gc_disabled_rb_mask, gc_user_disabled_rb_mask; +u32 rb_mask; - mask =amdgpu_gfx_create_bitmask (adev->gfx.config.max_backends_per_se / - adev->gfx.config.max_sh_per_se); + gc_disabled_rb_mask =RREG32_SOC15 (GC ,0 , regCC_RB_BACKEND_DISABLE); + gc_disabled_rb_mask =REG_GET_FIELD (gc_disabled_rb_mask, +CC_RB_BACKEND_DISABLE , +BACKEND_DISABLE ); + gc_user_disabled_rb_mask =RREG32_SOC15 (GC ,0 , regGC_USER_RB_BACKEND_DISABLE); + gc_user_disabled_rb_mask =REG_GET_FIELD (gc_user_disabled_rb_mask, +GC_USER_RB_BACKEND_DISABLE , +BACKEND_DISABLE ); + rb_mask =amdgpu_gfx_create_bitmask (adev->gfx.config.max_backends_per_se * + adev->gfx.config.max_shader_engines); -return (~data) & mask; +return rb_mask & (~(gc_disabled_rb_mask | gc_user_disabled_rb_mask)); }static void gfx_v11_0_setup_rb (struct amdgpu_device *adev) { -int i, j; -u32 data; -u32 active_rbs =0 ; -u32 rb_bitmap_width_per_sh = adev->gfx.config.max_backends_per_se / - adev->gfx.config.max_sh_per_se; +u32 rb_bitmap_width_per_sa; +u32 max_sa; +u32 active_sa_bitmap; +u32 global_active_rb_bitmap; +u32 active_rb_bitmap =0 ; +u32 i; -mutex_lock (&adev->grbm_idx_mutex); -for (i =0 ; i < adev->gfx.config.max_shader_engines; i++) { -for (j =0 ; j < adev->gfx.config.max_sh_per_se; j++) { -gfx_v11_0_select_se_sh (adev, i, j,0xffffffff ); - data =gfx_v11_0_get_rb_active_bitmap (adev); - active_rbs |= data << ((i * adev->gfx.config.max_sh_per_se + j) * - rb_bitmap_width_per_sh); - } +/* query sa bitmap from SA_UNIT_DISABLE registers */ + active_sa_bitmap =gfx_v11_0_get_sa_active_bitmap (adev); +/* query rb bitmap from RB_BACKEND_DISABLE registers */ + global_active_rb_bitmap =gfx_v11_0_get_rb_active_bitmap (adev); + +/* generate active rb bitmap according to active sa bitmap */ + max_sa = adev->gfx.config.max_shader_engines * + adev->gfx.config.max_sh_per_se; + rb_bitmap_width_per_sa = adev->gfx.config.max_backends_per_se / + adev->gfx.config.max_sh_per_se; +for (i =0 ; i < max_sa; i++) { +if (active_sa_bitmap & (1 << i)) + active_rb_bitmap |= (0x3 << (i * rb_bitmap_width_per_sa)); } -gfx_v11_0_select_se_sh (adev,0xffffffff ,0xffffffff ,0xffffffff ); -mutex_unlock (&adev->grbm_idx_mutex); - adev->gfx.config.backend_enable_mask = active_rbs; - adev->gfx.config.num_rbs =hweight32 (active_rbs); + active_rb_bitmap |= global_active_rb_bitmap; + adev->gfx.config.backend_enable_mask = active_rb_bitmap; + adev->gfx.config.num_rbs =hweight32 (active_rb_bitmap); }#define DEFAULT_SH_MEM_BASES (0x6000)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 3/141 drm/amdgpu: fix incorrect number of active RBs for gfx11
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tim Huang <[email protected]>
[ Upstream commit bbca7f414ae9a12ea231cdbafd79c607e3337ea8 ]
The RB bitmap should be global active RB bitmap & active RB bitmap based on active SA.
--- drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c +1 -1
@@ -1592,7 +1592,7 @@ static void gfx_v11_0_setup_rb(struct amdgpu_device *adev) active_rb_bitmap |= (0x3 << (i * rb_bitmap_width_per_sa)); } - active_rb_bitmap |= global_active_rb_bitmap; + active_rb_bitmap &= global_active_rb_bitmap; adev->gfx.config.backend_enable_mask = active_rb_bitmap; adev->gfx.config.num_rbs =hweight32 (active_rb_bitmap); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 4/141 drm/amd/display: Do not recursively call manual trigger programming
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dillon Varone <[email protected]>
[ Upstream commit 953927587f37b731abdeabe46ad44a3b3ec67a52 ]
[WHY&HOW]
We should not be recursively calling the manual trigger programming function when FAMS is not in use.
--- drivers/gpu/drm/amd/display/dc/dcn32/dcn32_optc.c | 3 --- 1 file changed, 3 deletions(-)
drivers/gpu/drm/amd/display/dc/dcn32/dcn32_optc.c +0 -3
@@ -216,9 +216,6 @@ static void optc32_setup_manual_trigger(struct timing_generator *optc)OTG_V_TOTAL_MAX_SEL ,1 ,OTG_FORCE_LOCK_ON_EVENT ,0 , OTG_SET_V_TOTAL_MIN_MASK, (1 << 1)); /* TRIGA */ - -// Setup manual flow control for EOF via TRIG_A - optc->funcs->setup_manual_trigger (optc); } }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 5/141 io_uring: Fix io_cqring_wait() not restoring sigmask on get_timespec64() failure
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexey Izbyshev <[email protected]>
Commit 978e5c19dfefc271e5550efba92fcef0d3f62864 upstream.
This bug was introduced in commit 950e79dd7313 ("io_uring: minor io_cqring_wait() optimization"), which was made in preparation for adc8682ec690 ("io_uring: Add support for napi_busy_poll"). The latter got reverted in cb3182167325 ("Revert "io_uring: Add support for napi_busy_poll""), so simply undo the former as well.
--- io_uring/io_uring.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-)
io_uring/io_uring.c +8 -8
@@ -2426,6 +2426,14 @@ static int io_cqring_wait(struct io_ringreturn 0 ; }while (ret >0 ); +if (uts) { +struct timespec64 ts; + +if (get_timespec64 (&ts, uts)) +return -EFAULT ; + timeout =ktime_add_ns (timespec64_to_ktime (ts),ktime_get_ns ()); + } +if (sig) {#ifdef CONFIG_COMPAT if (in_compat_syscall ())
@@ -2439,14 +2447,6 @@ static int io_cqring_wait(struct io_ringreturn ret; } -if (uts) { -struct timespec64 ts; - -if (get_timespec64 (&ts, uts)) -return -EFAULT ; - timeout =ktime_add_ns (timespec64_to_ktime (ts),ktime_get_ns ()); - } -init_waitqueue_func_entry (&iowq.wq, io_wake_function); iowq.wq.private = current;INIT_LIST_HEAD (&iowq.wq.entry);
Greg Kroah-Hartman
maintainerPATCH 6/141 SUNRPC: Fix rpcgss_context trace event acceptor field
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Steven Rostedt (Google) <[email protected]>
commit a4833e3abae132d613ce7da0e0c9a9465d1681fa upstream.
The rpcgss_context trace event acceptor field is a dynamically sized string that records the "data" parameter. But this parameter is also dependent on the "len" field to determine the size of the data.
It needs to use __string_len() helper macro where the length can be passed in. It also incorrectly uses strncpy() to save it instead of __assign_str(). As these macros can change, it is not wise to open code them in trace events.
As of commit c759e609030c ("tracing: Remove __assign_str_len()"), __assign_str() can be used for both __string() and __string_len() fields. Before that commit, __assign_str_len() is required to be used. This needs to be noted for backporting. (In actuality, commit c1fa617caeb0 ("tracing:
Rework __assign_str() and __string() to not duplicate getting the string") is the commit that makes __string_str_len() obsolete).
--- include/trace/events/rpcgss.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
include/trace/events/rpcgss.h +2 -2
@@ -587,7 +587,7 @@ TRACE_EVENT(rpcgss_context, __field(unsigned int, timeout) __field(u32, window_size) __field(int, len) - __string(acceptor, data) + __string_len(acceptor, data, len) ), TP_fast_assign(
@@ -596,7 +596,7 @@ TRACE_EVENT(rpcgss_context, __entry->timeout = timeout; __entry->window_size = window_size; __entry->len = len; -strncpy (__get_str (acceptor), data, len); +__assign_str (acceptor, data); ), TP_printk("win_size=%u expiry=%lu now=%lu timeout=%u acceptor=%.*s",
Greg Kroah-Hartman
maintainerPATCH 7/141 selftests/ftrace: Limit length in subsystem-enable tests
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yuanhe Shu <[email protected]>
commit 1a4ea83a6e67f1415a1f17c1af5e9c814c882bb5 upstream.
While sched* events being traced and sched* events continuously happen, "[xx] event tracing - enable/disable with subsystem level files" would not stop as on some slower systems it seems to take forever. Select the first 100 lines of output would be enough to judge whether there are more than 3 types of sched events.
--- tools/testing/selftests/ftrace/test.d/event/subsystem-enable.tc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
tools/testing/selftests/ftrace/test.d/event/subsystem-enable.tc +3 -3
@@ -18,7 +18,7 @@ echo 'sched:*' > set_event yield -count=`cat trace | grep -v ^# | awk '{ print $5 }' | sort -u | wc -l` +count=`head -n 100 trace | grep -v ^# | awk '{ print $5 }' | sort -u | wc -l` if [ $count -lt 3 ]; then fail "at least fork, exec and exit events should be recorded" fi
@@ -29,7 +29,7 @@ echo 1 > events/sched/enable yield -count=`cat trace | grep -v ^# | awk '{ print $5 }' | sort -u | wc -l` +count=`head -n 100 trace | grep -v ^# | awk '{ print $5 }' | sort -u | wc -l` if [ $count -lt 3 ]; then fail "at least fork, exec and exit events should be recorded" fi
@@ -40,7 +40,7 @@ echo 0 > events/sched/enable yield -count=`cat trace | grep -v ^# | awk '{ print $5 }' | sort -u | wc -l` +count=`head -n 100 trace | grep -v ^# | awk '{ print $5 }' | sort -u | wc -l` if [ $count -ne 0 ]; then fail "any of scheduler events should not be recorded" fi
Greg Kroah-Hartman
maintainerPATCH 8/141 random: handle creditable entropy from atomic process context
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jason A. Donenfeld <[email protected]>
commit e871abcda3b67d0820b4182ebe93435624e9c6a4 upstream.
The entropy accounting changes a static key when the RNG has initialized, since it only ever initializes once. Static key changes, however, cannot be made from atomic context, so depending on where the last creditable entropy comes from, the static key change might need to be deferred to a worker.
Previously the code used the execute_in_process_context() helper function, which accounts for whether or not the caller is in_interrupt(). However, that doesn't account for the case where the caller is actually in process context but is holding a spinlock.
This turned out to be the case with input_handle_event() in drivers/input/input.c contributing entropy:
[<ffffffd613025ba0>] die+0xa8/0x2fc [<ffffffd613027428>] bug_handler+0x44/0xec [<ffffffd613016964>] brk_handler+0x90/0x144 [<ffffffd613041e58>] do_debug_exception+0xa0/0x148 [<ffffffd61400c208>] el1_dbg+0x60/0x7c [<ffffffd61400c000>] el1h_64_sync_handler+0x38/0x90 [<ffffffd613011294>] el1h_64_sync+0x64/0x6c [<ffffffd613102d88>] __might_resched+0x1fc/0x2e8 [<ffffffd613102b54>] __might_sleep+0x44/0x7c [<ffffffd6130b6eac>] cpus_read_lock+0x1c/0xec [<ffffffd6132c2820>] static_key_enable+0x14/0x38 [<ffffffd61400ac08>] crng_set_ready+0x14/0x28 [<ffffffd6130df4dc>] execute_in_process_context+0xb8/0xf8 [<ffffffd61400ab30>] _credit_init_bits+0x118/0x1dc [<ffffffd6138580c8>] add_timer_randomness+0x264/0x270 [<ffffffd613857e54>] add_input_randomness+0x38/0x48 [<ffffffd613a80f94>] input_handle_event+0x2b8/0x490 [<ffffffd613a81310>] input_event+0x6c/0x98
According to Guoyong, it's not really possible to refactor the various drivers to never hold a spinlock there. And in_atomic() isn't reliable.
So, rather than trying to be too fancy, just punt the change in the static key to a workqueue always. There's basically no drawback of doing this, as the code already needed to account for the static key not changing immediately, and given that it's just an optimization, there's not exactly a hurry to change the static key right away, so deferal is fine.
--- drivers/char/random.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
drivers/char/random.c +5 -5
@@ -683,7 +683,7 @@ static void extract_entropy(void *buf, sstatic void __cold _credit_init_bits (size_t bits) { -static struct execute_work set_ready; + static DECLARE_WORK(set_ready, crng_set_ready);unsigned int new, orig, add;unsigned long flags;
@@ -699,8 +699,8 @@ static void __cold _credit_init_bits(sizif (orig <POOL_READY_BITS && new >=POOL_READY_BITS ) {crng_reseed ();/* Sets crng_init to CRNG_READY under base_crng.lock. */ -if (static_key_initialized) -execute_in_process_context (crng_set_ready, &set_ready); +if (static_key_initialized && system_unbound_wq) +queue_work (system_unbound_wq, &set_ready);wake_up_interruptible (&crng_init_wait);kill_fasync (&fasync,SIGIO ,POLL_IN );pr_notice ("crng init done\n" );
@@ -870,8 +870,8 @@ void __init random_init(void)/* * If we were initialized by the cpu or bootloader before jump labels -* are initialized, then we should enable the static branch here, where -* it's guaranteed that jump labels have been initialized. +* or workqueues are initialized, then we should enable the static +* branch here, where it's guaranteed that these have been initialized. */ if (!static_branch_likely (&crng_is_ready) && crng_init >=CRNG_READY )crng_set_ready (NULL );
Greg Kroah-Hartman
maintainerPATCH 9/141 net: usb: ax88179_178a: avoid writing the mac address before first reading
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jose Ignacio Tornos Martinez <[email protected]>
commit 56f78615bcb1c3ba58a5d9911bad3d9185cf141b upstream.
After the commit d2689b6a86b9 ("net: usb: ax88179_178a: avoid two consecutive device resets"), reset operation, in which the default mac address from the device is read, is not executed from bind operation and the random address, that is pregenerated just in case, is direclty written the first time in the device, so the default one from the device is not even read. This writing is not dangerous because is volatile and the default mac address is not missed.
In order to avoid this and keep the simplification to have only one reset and reduce the delays, restore the reset from bind operation and remove the reset that is commanded from open operation. The behavior is the same but everything is ready for usbnet_probe.
Tested with ASIX AX88179 USB Gigabit Ethernet devices. Restore the old behavior for the rest of possible devices because I don't have the hardware to test.
--- drivers/net/usb/ax88179_178a.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/usb/ax88179_178a.c +2 -2
@@ -1317,6 +1317,8 @@ static int ax88179_bind(struct usbnet *dnetif_set_tso_max_size (dev->net,16384 ); +ax88179_reset (dev); +return 0 ; }
@@ -1695,7 +1697,6 @@ static const struct driver_info ax88179_ .unbind = ax88179_unbind, .status = ax88179_status, .link_reset = ax88179_link_reset, - .reset = ax88179_reset, .stop = ax88179_stop, .flags = FLAG_ETHER | FLAG_FRAMING_AX, .rx_fixup = ax88179_rx_fixup,
@@ -1708,7 +1709,6 @@ static const struct driver_info ax88178a .unbind = ax88179_unbind, .status = ax88179_status, .link_reset = ax88179_link_reset, - .reset = ax88179_reset, .stop = ax88179_stop, .flags = FLAG_ETHER | FLAG_FRAMING_AX, .rx_fixup = ax88179_rx_fixup,
Greg Kroah-Hartman
maintainerPATCH 10/141 drm/i915/vma: Fix UAF on destroy against retire race
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Janusz Krzysztofik <[email protected]>
commit 0e45882ca829b26b915162e8e86dbb1095768e9e upstream.
Object debugging tools were sporadically reporting illegal attempts to free a still active i915 VMA object when parking a GT believed to be idle.
[161.359441] ODEBUG: free active (active state 0) object: ffff88811643b958 object type: i915_active hint: __i915_vma_active+0x0/0x50 [i915] [161.360082] WARNING: CPU: 5 PID: 276 at lib/debugobjects.c:514 debug_print_object+0x80/0xb0 ... [161.360304] CPU: 5 PID: 276 Comm: kworker/5:2 Not tainted 6.5.0-rc1-CI_DRM_13375-g003f860e5577+ #1 [161.360314] Hardware name: Intel Corporation Rocket Lake Client Platform/RocketLake S UDIMM 6L RVP, BIOS RKLSFWI1.R00.3173.A03.2204210138 04/21/2022 [161.360322] Workqueue: i915-unordered __intel_wakeref_put_work [i915] [161.360592] RIP: 0010:debug_print_object+0x80/0xb0 ... [161.361347] debug_object_free+0xeb/0x110 [161.361362] i915_active_fini+0x14/0x130 [i915] [161.361866] release_references+0xfe/0x1f0 [i915] [161.362543] i915_vma_parked+0x1db/0x380 [i915] [161.363129] __gt_park+0x121/0x230 [i915] [161.363515] ____intel_wakeref_put_last+0x1f/0x70 [i915]
That has been tracked down to be happening when another thread is deactivating the VMA inside __active_retire() helper, after the VMA's active counter has been already decremented to 0, but before deactivation of the VMA's object is reported to the object debugging tool.
We could prevent from that race by serializing i915_active_fini() with __active_retire() via ref->tree_lock, but that wouldn't stop the VMA from being used, e.g. from __i915_vma_retire() called at the end of __active_retire(), after that VMA has been already freed by a concurrent i915_vma_destroy() on return from the i915_active_fini(). Then, we should rather fix the issue at the VMA level, not in i915_active.
Since __i915_vma_parked() is called from __gt_park() on last put of the GT's wakeref, the issue could be addressed by holding the GT wakeref long enough for __active_retire() to complete before that wakeref is released and the GT parked.
I believe the issue was introduced by commit d93939730347 ("drm/i915:
Remove the vma refcount") which moved a call to i915_active_fini() from a dropped i915_vma_release(), called on last put of the removed VMA kref, to i915_vma_parked() processing path called on last put of a GT wakeref. However, its visibility to the object debugging tool was suppressed by a bug in i915_active that was fixed two weeks later with commit e92eb246feb9 ("drm/i915/active: Fix missing debug object activation").
A VMA associated with a request doesn't acquire a GT wakeref by itself. Instead, it depends on a wakeref held directly by the request's active intel_context for a GT associated with its VM, and indirectly on that intel_context's engine wakeref if the engine belongs to the same GT as the VMA's VM. Those wakerefs are released asynchronously to VMA deactivation.
Fix the issue by getting a wakeref for the VMA's GT when activating it, and putting that wakeref only after the VMA is deactivated. However, exclude global GTT from that processing path, otherwise the GPU never goes idle. Since __i915_vma_retire() may be called from atomic contexts, use async variant of wakeref put. Also, to avoid circular locking dependency, take care of acquiring the wakeref before VM mutex when both are needed.
v7: Add inline comments with justifications for:
- using untracked variants of intel_gt_pm_get/put() (Nirmoy),
- using async variant of _put(),
- not getting the wakeref in case of a global GTT,
- always getting the first wakeref outside vm->mutex.
v6: Since __i915_vma_active/retire() callbacks are not serialized, storing
a wakeref tracking handle inside struct i915_vma is not safe, and there is no other good place for that. Use untracked variants of intel_gt_pm_get/put_async().
v5: Replace "tile" with "GT" across commit description (Rodrigo),
- avoid mentioning multi-GT case in commit description (Rodrigo),
- explain why we need to take a temporary wakeref unconditionally inside
i915_vma_pin_ww() (Rodrigo).
v4: Refresh on top of commit 5e4e06e4087e ("drm/i915: Track gt pm
wakerefs") (Andi), - for more easy backporting, split out removal of former insufficient workarounds and move them to separate patches (Nirmoy).
- clean up commit message and description a bit.
v3: Identify root cause more precisely, and a commit to blame,
- identify and drop former workarounds,
- update commit message and description.
v2: Get the wakeref before VM mutex to avoid circular locking dependency,
- drop questionable Fixes: tag.
--- drivers/gpu/drm/i915/i915_vma.c | 42 +++++++++++++++++++++++++++++++++------- 1 file changed, 35 insertions(+), 7 deletions(-)
drivers/gpu/drm/i915/i915_vma.c +35 -7
@@ -32,6 +32,7 @@#include "gt/intel_engine.h" #include "gt/intel_engine_heartbeat.h" #include "gt/intel_gt.h" +#include "gt/intel_gt_pm.h" #include "gt/intel_gt_requests.h" #include "i915_drv.h"
@@ -98,12 +99,34 @@ static inline struct i915_vma *active_tostatic int __i915_vma_active (struct i915_active *ref) { -return i915_vma_tryget (active_to_vma (ref)) ?0 : -ENOENT ; +struct i915_vma *vma =active_to_vma (ref); + +if (!i915_vma_tryget (vma)) +return -ENOENT ; + +/* +* Exclude global GTT VMA from holding a GT wakeref +* while active, otherwise GPU never goes idle. +*/ +if (!i915_vma_is_ggtt (vma)) +intel_gt_pm_get (vma->vm->gt); + +return 0 ; }static void __i915_vma_retire (struct i915_active *ref) { -i915_vma_put (active_to_vma (ref)); +struct i915_vma *vma =active_to_vma (ref); + +if (!i915_vma_is_ggtt (vma)) { +/* +* Since we can be called from atomic contexts, +* use an async variant of intel_gt_pm_put(). +*/ +intel_gt_pm_put_async (vma->vm->gt); + } + +i915_vma_put (vma); } static struct i915_vma *
@@ -1365,7 +1388,7 @@ int i915_vma_pin_ww(struct i915_vma *vmastruct i915_vma_work *work =NULL ;struct dma_fence *moving =NULL ;struct i915_vma_resource *vma_res =NULL ; -intel_wakeref_t wakeref =0 ; +intel_wakeref_t wakeref;unsigned int bound;int err;
@@ -1385,8 +1408,14 @@ int i915_vma_pin_ww(struct i915_vma *vmaif (err)return err; -if (flags &PIN_GLOBAL ) - wakeref =intel_runtime_pm_get (&vma->vm->i915->runtime_pm); +/* +* In case of a global GTT, we must hold a runtime-pm wakeref +* while global PTEs are updated. In other cases, we hold +* the rpm reference while the VMA is active. Since runtime +* resume may require allocations, which are forbidden inside +* vm->mutex, get the first rpm wakeref outside of the mutex. +*/ + wakeref =intel_runtime_pm_get (&vma->vm->i915->runtime_pm);if (flags & vma->vm->bind_async_flags) {/* lock VM */
@@ -1522,8 +1551,7 @@ err_fence:if (work)dma_fence_work_commit_imm (&work->base); err_rpm: -if (wakeref) -intel_runtime_pm_put (&vma->vm->i915->runtime_pm, wakeref); +intel_runtime_pm_put (&vma->vm->i915->runtime_pm, wakeref);if (moving)dma_fence_put (moving);
Greg Kroah-Hartman
maintainerPATCH 11/141 x86/efi: Drop EFI stub .bss from .data section
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ard Biesheuvel <[email protected]>
[ Commit 5f51c5d0e905608ba7be126737f7c84a793ae1aa upstream ]
Now that the EFI stub always zero inits its BSS section upon entry, there is no longer a need to place the BSS symbols carried by the stub into the .data section.
--- arch/x86/boot/compressed/vmlinux.lds.S | 1 - drivers/firmware/efi/libstub/Makefile | 7 ------- 2 files changed, 8 deletions(-)
arch/x86/boot/compressed/vmlinux.lds.S +0 -1
@@ -46,7 +46,6 @@ SECTIONS _data = . ; *(.data) *(.data.*) - *(.bss.efistub) _edata = . ; } . = ALIGN(L1_CACHE_BYTES);
drivers/firmware/efi/libstub/Makefile +0 -7
@@ -102,13 +102,6 @@ lib-y := $(patsubst %.o,%.stub.o,$(li # https://bugs.llvm.org/show_bug.cgi?id=46480 STUBCOPY_FLAGS-y += --remove-section=.note.gnu.property -# -# For x86, bootloaders like systemd-boot or grub-efi do not zero-initialize the -# .bss section, so the .bss section of the EFI stub needs to be included in the -# .data section of the compressed kernel to ensure initialization. Rename the -# .bss section here so it's easy to pick out in the linker script. -# -STUBCOPY_FLAGS-$(CONFIG_X86) += --rename-section .bss=.bss.efistub,load,alloc STUBCOPY_RELOC-$(CONFIG_X86_32) := R_386_32 STUBCOPY_RELOC-$(CONFIG_X86_64) := R_X86_64_64
Greg Kroah-Hartman
maintainerPATCH 12/141 x86/efi: Disregard setup header of loaded image
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ard Biesheuvel <[email protected]>
[ Commit 7e50262229faad0c7b8c54477cd1c883f31cc4a7 upstream ]
The native EFI entrypoint does not take a struct boot_params from the loader, but instead, it constructs one from scratch, using the setup header data placed at the start of the image.
This setup header is placed in a way that permits legacy loaders to manipulate the contents (i.e., to pass the kernel command line or the address and size of an initial ramdisk), but EFI boot does not use it in that way - it only copies the contents that were placed there at build time, but EFI loaders will not (and should not) manipulate the setup header to configure the boot. (Commit 63bf28ceb3ebbe76 "efi: x86: Wipe setup_data on pure EFI boot" deals with some of the fallout of using setup_data in a way that breaks EFI boot.)
Given that none of the non-zero values that are copied from the setup header into the EFI stub's struct boot_params are relevant to the boot now that the EFI stub no longer enters via the legacy decompressor, the copy can be omitted altogether.
--- drivers/firmware/efi/libstub/x86-stub.c | 46 ++++---------------------------- 1 file changed, 6 insertions(+), 40 deletions(-)
drivers/firmware/efi/libstub/x86-stub.c +6 -40
@@ -426,9 +426,8 @@ void __noreturn efi_stub_entry(efi_handl efi_status_t __efiapi efi_pe_entry(efi_handle_t handle,efi_system_table_t *sys_table_arg) { -struct boot_params *boot_params; -struct setup_header *hdr; -void *image_base; + static struct boot_params boot_params __page_aligned_bss; +struct setup_header *hdr = &boot_params.hdr;efi_guid_t proto =LOADED_IMAGE_PROTOCOL_GUID ;int options_size =0 ;efi_status_t status;
@@ -449,30 +448,9 @@ efi_status_t __efiapi efi_pe_entry(efi_hefi_exit (handle, status); } - image_base =efi_table_attr (image, image_base); - - status =efi_allocate_pages (sizeof (struct boot_params ), - (unsigned long *)&boot_params,ULONG_MAX ); -if (status !=EFI_SUCCESS ) { -efi_err ("Failed to allocate lowmem for boot params\n" ); -efi_exit (handle, status); - } - -memset (boot_params,0x0 ,sizeof (struct boot_params )); - - hdr = &boot_params->hdr; - -/* Copy the setup header from the second sector to boot_params */ -memcpy (&hdr->jump, image_base +512 , -sizeof (struct setup_header ) - offsetof(struct setup_header , jump)); - -/* -* Fill out some of the header fields ourselves because the -* EFI firmware loader doesn't load the first sector. -*/ +/* Assign the setup_header fields that the kernel actually cares about */ hdr->root_flags =1 ; hdr->vid_mode =0xffff ; - hdr->boot_flag =0xAA55 ; hdr->type_of_loader =0x21 ;
@@ -481,25 +459,13 @@ efi_status_t __efiapi efi_pe_entry(efi_hif (!cmdline_ptr) goto fail; -efi_set_u64_split ((unsigned long )cmdline_ptr, - &hdr->cmd_line_ptr, &boot_params->ext_cmd_line_ptr); - - hdr->ramdisk_image =0 ; - hdr->ramdisk_size =0 ; +efi_set_u64_split ((unsigned long )cmdline_ptr, &hdr->cmd_line_ptr, + &boot_params.ext_cmd_line_ptr); -/* -* Disregard any setup data that was provided by the bootloader: -* setup_data could be pointing anywhere, and we have no way of -* authenticating or validating the payload. -*/ - hdr->setup_data =0 ; - -efi_stub_entry (handle, sys_table_arg, boot_params); +efi_stub_entry (handle, sys_table_arg, &boot_params);/* not reached */ fail: -efi_free (sizeof (struct boot_params ), (unsigned long )boot_params); -efi_exit (handle, status); }
Greg Kroah-Hartman
maintainerPATCH 13/141 x86/efistub: Reinstate soft limit for initrd loading
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ard Biesheuvel <[email protected]>
[ Commit decd347c2a75d32984beb8807d470b763a53b542 upstream ]
Commit
8117961d98fb2 ("x86/efi: Disregard setup header of loaded image")
dropped the memcopy of the image's setup header into the boot_params struct provided to the core kernel, on the basis that EFI boot does not need it and should rely only on a single protocol to interface with the boot chain. It is also a prerequisite for being able to increase the section alignment to 4k, which is needed to enable memory protections when running in the boot services.
So only the setup_header fields that matter to the core kernel are populated explicitly, and everything else is ignored. One thing was overlooked, though: the initrd_addr_max field in the setup_header is not used by the core kernel, but it is used by the EFI stub itself when it loads the initrd, where its default value of INT_MAX is used as the soft limit for memory allocation.
This means that, in the old situation, the initrd was virtually always loaded in the lower 2G of memory, but now, due to initrd_addr_max being 0x0, the initrd may end up anywhere in memory. This should not be an issue principle, as most systems can deal with this fine. However, it does appear to tickle some problems in older UEFI implementations, where the memory ends up being corrupted, resulting in errors when unpacking the initramfs.
So set the initrd_addr_max field to INT_MAX like it was before.
--- drivers/firmware/efi/libstub/x86-stub.c | 1 + 1 file changed, 1 insertion(+)
drivers/firmware/efi/libstub/x86-stub.c +1 -0
@@ -453,6 +453,7 @@ efi_status_t __efiapi efi_pe_entry(efi_h hdr->vid_mode =0xffff ; hdr->type_of_loader =0x21 ; + hdr->initrd_addr_max =INT_MAX ;/* Convert unicode cmdline to ascii */ cmdline_ptr =efi_convert_cmdline (image, &options_size);
Greg Kroah-Hartman
maintainerPATCH 14/141 x86/efi: Drop alignment flags from PE section headers
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ard Biesheuvel <[email protected]>
[ Commit bfab35f552ab3dd6d017165bf9de1d1d20f198cc upstream ]
The section header flags for alignment are documented in the PE/COFF spec as being applicable to PE object files only, not to PE executables such as the Linux bzImage, so let's drop them from the PE header.
--- arch/x86/boot/header.S | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-)
arch/x86/boot/header.S +4 -8
@@ -208,8 +208,7 @@ section_table: .word 0 # NumberOfLineNumbers .long IMAGE_SCN_CNT_CODE | \ IMAGE_SCN_MEM_READ | \ - IMAGE_SCN_MEM_EXECUTE | \ - IMAGE_SCN_ALIGN_16BYTES # Characteristics + IMAGE_SCN_MEM_EXECUTE # Characteristics # # The EFI application loader requires a relocation section
@@ -229,8 +228,7 @@ section_table: .word 0 # NumberOfLineNumbers .long IMAGE_SCN_CNT_INITIALIZED_DATA | \ IMAGE_SCN_MEM_READ | \ - IMAGE_SCN_MEM_DISCARDABLE | \ - IMAGE_SCN_ALIGN_1BYTES # Characteristics + IMAGE_SCN_MEM_DISCARDABLE # Characteristics #ifdef CONFIG_EFI_MIXED #
@@ -248,8 +246,7 @@ section_table: .word 0 # NumberOfLineNumbers .long IMAGE_SCN_CNT_INITIALIZED_DATA | \ IMAGE_SCN_MEM_READ | \ - IMAGE_SCN_MEM_DISCARDABLE | \ - IMAGE_SCN_ALIGN_1BYTES # Characteristics + IMAGE_SCN_MEM_DISCARDABLE # Characteristics #endif #
@@ -270,8 +267,7 @@ section_table: .word 0 # NumberOfLineNumbers .long IMAGE_SCN_CNT_CODE | \ IMAGE_SCN_MEM_READ | \ - IMAGE_SCN_MEM_EXECUTE | \ - IMAGE_SCN_ALIGN_16BYTES # Characteristics + IMAGE_SCN_MEM_EXECUTE # Characteristics .set section_count, (. - section_table) / 40 #endif /* CONFIG_EFI_STUB */
Greg Kroah-Hartman
maintainerPATCH 15/141 x86/boot: Remove the bugger off message
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ard Biesheuvel <[email protected]>
[ Commit 768171d7ebbce005210e1cf8456f043304805c15 upstream ]
Ancient (pre-2003) x86 kernels could boot from a floppy disk straight from the BIOS, using a small real mode boot stub at the start of the image where the BIOS would expect the boot record (or boot block) to appear.
Due to its limitations (kernel size < 1 MiB, no support for IDE, USB or El Torito floppy emulation), this support was dropped, and a Linux aware bootloader is now always required to boot the kernel from a legacy BIOS.
To smoothen this transition, the boot stub was not removed entirely, but replaced with one that just prints an error message telling the user to install a bootloader.
As it is unlikely that anyone doing direct floppy boot with such an ancient kernel is going to upgrade to v6.5+ and expect that this boot method still works, printing this message is kind of pointless, and so it should be possible to remove the logic that emits it.
Let's free up this space so it can be used to expand the PE header in a subsequent patch.
--- arch/x86/boot/header.S | 49 ------------------------------------------------- arch/x86/boot/setup.ld | 7 ++++--- 2 files changed, 4 insertions(+), 52 deletions(-)
arch/x86/boot/header.S +0 -49
@@ -38,63 +38,14 @@ SYSSEG = 0x1000 /* historical load add .code16 .section ".bstext", "ax" - - .global bootsect_start -bootsect_start: #ifdef CONFIG_EFI_STUB # "MZ", MS-DOS header .word MZ_MAGIC -#endif - - # Normalize the start address - ljmp $BOOTSEG, $start2 - -start2: - movw %cs, %ax - movw %ax, %ds - movw %ax, %es - movw %ax, %ss - xorw %sp, %sp - sti - cld - - movw $bugger_off_msg, %si - -msg_loop: - lodsb - andb %al, %al - jz bs_die - movb $0xe, %ah - movw $7, %bx - int $0x10 - jmp msg_loop - -bs_die: - # Allow the user to press a key, then reboot - xorw %ax, %ax - int $0x16 - int $0x19 - - # int 0x19 should never return. In case it does anyway, - # invoke the BIOS reset code... - ljmp $0xf000,$0xfff0 - -#ifdef CONFIG_EFI_STUB .org 0x3c # # Offset to the PE header. # .long pe_header -#endif /* CONFIG_EFI_STUB */ - - .section ".bsdata", "a" -bugger_off_msg: - .ascii "Use a boot loader.\r\n" - .ascii "\n" - .ascii "Remove disk and press any key to reboot...\r\n" - .byte 0 - -#ifdef CONFIG_EFI_STUB pe_header: .long PE_MAGIC
arch/x86/boot/setup.ld +4 -3
@@ -10,10 +10,11 @@ ENTRY(_start) SECTIONS { . = 0; - .bstext : { *(.bstext) } - .bsdata : { *(.bsdata) } + .bstext : { + *(.bstext) + . = 495; + } =0xffffffff - . = 495; .header : { *(.header) } .entrytext : { *(.entrytext) } .inittext : { *(.inittext) }
Greg Kroah-Hartman
maintainerPATCH 16/141 x86/boot: Omit compression buffer from PE/COFF image memory footprint
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ard Biesheuvel <[email protected]>
[ Commit 8eace5b3555606e684739bef5bcdfcfe68235257 upstream ]
Now that the EFI stub decompresses the kernel and hands over to the decompressed image directly, there is no longer a need to provide a decompression buffer as part of the .BSS allocation of the PE/COFF image. It also means the PE/COFF image can be loaded anywhere in memory, and setting the preferred image base is unnecessary. So drop the handling of this from the header and from the build tool.
--- arch/x86/boot/header.S | 6 +---- arch/x86/boot/tools/build.c | 50 +++++--------------------------------------- 2 files changed, 8 insertions(+), 48 deletions(-)
arch/x86/boot/header.S +2 -4
@@ -89,12 +89,10 @@ optional_header: #endif extra_header_fields: - # PE specification requires ImageBase to be 64k aligned - .set image_base, (LOAD_PHYSICAL_ADDR + 0xffff) & ~0xffff #ifdef CONFIG_X86_32 - .long image_base # ImageBase + .long 0 # ImageBase #else - .quad image_base # ImageBase + .quad 0 # ImageBase #endif .long 0x20 # SectionAlignment .long 0x20 # FileAlignment
arch/x86/boot/tools/build.c +6 -44
101 lines not on this page · raw message
Greg Kroah-Hartman
maintainerPATCH 17/141 x86/boot: Drop redundant code setting the root device
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ard Biesheuvel <[email protected]>
[ Commit 7448e8e5d15a3c4df649bf6d6d460f78396f7e1e upstream ]
The root device defaults to 0,0 and is no longer configurable at build time [0], so there is no need for the build tool to ever write to this field.
[0] 079f85e624189292 ("x86, build: Do not set the root_dev field in bzImage")
This change has no impact on the resulting bzImage binary.
--- arch/x86/boot/header.S | 2 +- arch/x86/boot/tools/build.c | 7 ------- 2 files changed, 1 insertion(+), 8 deletions(-)
arch/x86/boot/header.S +1 -1
@@ -235,7 +235,7 @@ root_flags: .word ROOT_RDONLY syssize: .long 0 /* Filled in by build.c */ ram_size: .word 0 /* Obsolete */ vid_mode: .word SVGA_MODE -root_dev: .word 0 /* Filled in by build.c */ +root_dev: .word 0 /* Default to major/minor 0/0 */ boot_flag: .word 0xAA55 # offset 512, entry point
arch/x86/boot/tools/build.c +0 -7
@@ -40,10 +40,6 @@ typedef unsigned char u8;typedef unsigned short u16 ;typedef unsigned int u32 ; -#define DEFAULT_MAJOR_ROOT 0 -#define DEFAULT_MINOR_ROOT 0 -#define DEFAULT_ROOT_DEV (DEFAULT_MAJOR_ROOT << 8 | DEFAULT_MINOR_ROOT) -/* Minimal number of setup sectors */ #define SETUP_SECT_MIN 5#define SETUP_SECT_MAX 64
@@ -399,9 +395,6 @@ int main(int argc, char ** argv)update_pecoff_setup_and_reloc (i); -/* Set the default root device */ -put_unaligned_le16 (DEFAULT_ROOT_DEV , &buf[508 ]); -/* Open and stat the kernel file */ fd =open (argv[2 ],O_RDONLY );if (fd <0 )
Greg Kroah-Hartman
maintainerPATCH 18/141 x86/boot: Drop references to startup_64
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ard Biesheuvel <[email protected]>
[ Commit b618d31f112bea3d2daea19190d63e567f32a4db upstream ]
The x86 boot image generation tool assign a default value to startup_64 and subsequently parses the actual value from zoffset.h but it never actually uses the value anywhere. So remove this code.
This change has no impact on the resulting bzImage binary.
--- arch/x86/boot/Makefile | 2 +- arch/x86/boot/tools/build.c | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-)
arch/x86/boot/Makefile +1 -1
@@ -91,7 +91,7 @@ $(obj)/vmlinux.bin: $(obj)/compressed/vm SETUP_OBJS = $(addprefix $(obj)/,$(setup-y)) -sed-zoffset := -e 's/^\([0-9a-fA-F]*\) [a-zA-Z] \(startup_32\|startup_64\|efi32_stub_entry\|efi64_stub_entry\|efi_pe_entry\|efi32_pe_entry\|input_data\|kernel_info\|_end\|_ehead\|_text\|z_.*\)$$/\#define ZO_\2 0x\1/p' +sed-zoffset := -e 's/^\([0-9a-fA-F]*\) [a-zA-Z] \(startup_32\|efi32_stub_entry\|efi64_stub_entry\|efi_pe_entry\|efi32_pe_entry\|input_data\|kernel_info\|_end\|_ehead\|_text\|z_.*\)$$/\#define ZO_\2 0x\1/p' quiet_cmd_zoffset = ZOFFSET $@ cmd_zoffset = $(NM) $< | sed -n $(sed-zoffset) > $@
arch/x86/boot/tools/build.c +0 -3
@@ -60,7 +60,6 @@ static unsigned long efi64_stub_entry;static unsigned long efi_pe_entry;static unsigned long efi32_pe_entry;static unsigned long kernel_info; -static unsigned long startup_64;static unsigned long _end;/*----------------------------------------------------------------------*/
@@ -264,7 +263,6 @@ static void efi_stub_defaults(void) efi_pe_entry =0x10 ;#else efi_pe_entry =0x210 ; - startup_64 =0x200 ;#endif }
@@ -340,7 +338,6 @@ static void parse_zoffset(char *fname)PARSE_ZOFS (p, efi_pe_entry);PARSE_ZOFS (p, efi32_pe_entry);PARSE_ZOFS (p, kernel_info); -PARSE_ZOFS (p, startup_64);PARSE_ZOFS (p, _end); p =strchr (p,'\n' );
Greg Kroah-Hartman
maintainerPATCH 19/141 x86/boot: Grab kernel_info offset from zoffset header directly
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ard Biesheuvel <[email protected]>
[ Commit 2e765c02dcbfc2a8a4527c621a84b9502f6b9bd2 upstream ]
Instead of parsing zoffset.h and poking the kernel_info offset value into the header from the build tool, just grab the value directly in the asm file that describes this header.
This change has no impact on the resulting bzImage binary.
--- arch/x86/boot/header.S | 2 +- arch/x86/boot/tools/build.c | 4 ---- 2 files changed, 1 insertion(+), 5 deletions(-)
arch/x86/boot/header.S +1 -1
@@ -525,7 +525,7 @@ pref_address: .quad LOAD_PHYSICAL_ADDR init_size: .long INIT_SIZE # kernel initialization size handover_offset: .long 0 # Filled in by build.c -kernel_info_offset: .long 0 # Filled in by build.c +kernel_info_offset: .long ZO_kernel_info # End of setup header #####################################################
arch/x86/boot/tools/build.c +0 -4
@@ -59,7 +59,6 @@ static unsigned long efi32_stub_entry;static unsigned long efi64_stub_entry;static unsigned long efi_pe_entry;static unsigned long efi32_pe_entry; -static unsigned long kernel_info;static unsigned long _end;/*----------------------------------------------------------------------*/
@@ -337,7 +336,6 @@ static void parse_zoffset(char *fname)PARSE_ZOFS (p, efi64_stub_entry);PARSE_ZOFS (p, efi_pe_entry);PARSE_ZOFS (p, efi32_pe_entry); -PARSE_ZOFS (p, kernel_info);PARSE_ZOFS (p, _end); p =strchr (p,'\n' );
@@ -419,8 +417,6 @@ int main(int argc, char ** argv)update_pecoff_text (setup_sectors *512 , i + (sys_size *16 ));efi_stub_entry_update (); -/* Update kernel_info offset. */ -put_unaligned_le32 (kernel_info, &buf[0x268 ]); crc =partial_crc32 (buf, i, crc);if (fwrite (buf,1 , i, dest) != i)
Greg Kroah-Hartman
maintainerPATCH 20/141 x86/boot: Set EFI handover offset directly in header asm
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ard Biesheuvel <[email protected]>
[ Commit eac956345f99dda3d68f4ae6cf7b494105e54780 upstream ]
The offsets of the EFI handover entrypoints are available to the assembler when constructing the header, so there is no need to set them from the build tool afterwards.
This change has no impact on the resulting bzImage binary.
--- arch/x86/boot/header.S | 18 +++++++++++++++++- arch/x86/boot/tools/build.c | 24 ------------------------ 2 files changed, 17 insertions(+), 25 deletions(-)
arch/x86/boot/header.S +17 -1
@@ -523,8 +523,24 @@ pref_address: .quad LOAD_PHYSICAL_ADDR # define INIT_SIZE VO_INIT_SIZE #endif + .macro __handover_offset +#ifndef CONFIG_EFI_HANDOVER_PROTOCOL + .long 0 +#elif !defined(CONFIG_X86_64) + .long ZO_efi32_stub_entry +#else + /* Yes, this is really how we defined it :( */ + .long ZO_efi64_stub_entry - 0x200 +#ifdef CONFIG_EFI_MIXED + .if ZO_efi32_stub_entry != ZO_efi64_stub_entry - 0x200 + .error "32-bit and 64-bit EFI entry points do not match" + .endif +#endif +#endif + .endm + init_size: .long INIT_SIZE # kernel initialization size -handover_offset: .long 0 # Filled in by build.c +handover_offset: __handover_offset kernel_info_offset: .long ZO_kernel_info # End of setup header #####################################################
arch/x86/boot/tools/build.c +0 -24
@@ -55,8 +55,6 @@ u8 buf[SETUP_SECT_MAX*512];#define PECOFF_COMPAT_RESERVE 0x0#endif -static unsigned long efi32_stub_entry; -static unsigned long efi64_stub_entry;static unsigned long efi_pe_entry;static unsigned long efi32_pe_entry;static unsigned long _end;
@@ -265,31 +263,12 @@ static void efi_stub_defaults(void)#endif } -static void efi_stub_entry_update (void ) -{ -unsigned long addr = efi32_stub_entry; - -#ifdef CONFIG_EFI_HANDOVER_PROTOCOL -#ifdef CONFIG_X86_64 -/* Yes, this is really how we defined it :( */ - addr = efi64_stub_entry -0x200 ; -#endif - -#ifdef CONFIG_EFI_MIXED -if (efi32_stub_entry != addr) -die ("32-bit and 64-bit EFI entry points do not match\n" ); -#endif -#endif -put_unaligned_le32 (addr, &buf[0x264 ]); -} -#else static inline void update_pecoff_setup_and_reloc (unsigned int size) {}static inline void update_pecoff_text (unsigned int text_start,unsigned int file_sz) {}static inline void efi_stub_defaults (void ) {} -static inline void efi_stub_entry_update (void ) {}static inline int reserve_pecoff_reloc_section (int c) {
@@ -332,8 +311,6 @@ static void parse_zoffset(char *fname) p = (char *)buf;while (p && *p) { -PARSE_ZOFS (p, efi32_stub_entry); -PARSE_ZOFS (p, efi64_stub_entry);PARSE_ZOFS (p, efi_pe_entry);PARSE_ZOFS (p, efi32_pe_entry);PARSE_ZOFS (p, _end);
@@ -416,7 +393,6 @@ int main(int argc, char ** argv)update_pecoff_text (setup_sectors *512 , i + (sys_size *16 )); -efi_stub_entry_update (); crc =partial_crc32 (buf, i, crc);if (fwrite (buf,1 , i, dest) != i)
Greg Kroah-Hartman
maintainerPATCH 21/141 x86/boot: Define setup size in linker script
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ard Biesheuvel <[email protected]>
[ Commit 093ab258e3fb1d1d3afdfd4a69403d44ce90e360 upstream ]
The setup block contains the real mode startup code that is used when booting from a legacy BIOS, along with the boot_params/setup_data that is used by legacy x86 bootloaders to pass the command line and initial ramdisk parameters, among other things.
The setup block also contains the PE/COFF header of the entire combined image, which includes the compressed kernel image, the decompressor and the EFI stub.
This PE header describes the layout of the executable image in memory, and currently, the fact that the setup block precedes it makes it rather fiddly to get the right values into the right place in the final image.
Let's make things a bit easier by defining the setup_size in the linker script so it can be referenced from the asm code directly, rather than having to rely on the build tool to calculate it. For the time being, add 64 bytes of fixed padding for the .reloc and .compat sections - this will be removed in a subsequent patch after the PE/COFF header has been reorganized.
This change has no impact on the resulting bzImage binary when configured with CONFIG_EFI_MIXED=y.
--- arch/x86/boot/header.S | 2 +- arch/x86/boot/setup.ld | 4 ++++ arch/x86/boot/tools/build.c | 6 ------ 3 files changed, 5 insertions(+), 7 deletions(-)
arch/x86/boot/header.S +1 -1
@@ -230,7 +230,7 @@ sentinel: .byte 0xff, 0xff /* Use .globl hdr hdr: -setup_sects: .byte 0 /* Filled in by build.c */ + .byte setup_sects - 1 root_flags: .word ROOT_RDONLY syssize: .long 0 /* Filled in by build.c */ ram_size: .word 0 /* Obsolete */
arch/x86/boot/setup.ld +4 -0
@@ -39,6 +39,10 @@ SECTIONS .signature : { setup_sig = .; LONG(0x5a5aaa55) + + /* Reserve some extra space for the reloc and compat sections */ + setup_size = ALIGN(ABSOLUTE(.) + 64, 512); + setup_sects = ABSOLUTE(setup_size / 512); }
arch/x86/boot/tools/build.c +0 -6
@@ -48,12 +48,7 @@ typedef unsigned int u32;u8 buf[SETUP_SECT_MAX *512 ];#define PECOFF_RELOC_RESERVE 0x20 - -#ifdef CONFIG_EFI_MIXED #define PECOFF_COMPAT_RESERVE 0x20 -#else -#define PECOFF_COMPAT_RESERVE 0x0 -#endif static unsigned long efi_pe_entry;static unsigned long efi32_pe_entry;
@@ -388,7 +383,6 @@ int main(int argc, char ** argv)#endif /* Patch the setup code with the appropriate size parameters */ - buf[0x1f1 ] = setup_sectors-1 ;put_unaligned_le32 (sys_size, &buf[0x1f4 ]);update_pecoff_text (setup_sectors *512 , i + (sys_size *16 ));
Greg Kroah-Hartman
maintainerPATCH 22/141 x86/boot: Derive file size from _edata symbol
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ard Biesheuvel <[email protected]>
[ Commit aeb92067f6ae994b541d7f9752fe54ed3d108bcc upstream ]
Tweak the linker script so that the value of _edata represents the decompressor binary's file size rounded up to the appropriate alignment. This removes the need to calculate it in the build tool, and will make it easier to refer to the file size from the header directly in subsequent changes to the PE header layout.
While adding _edata to the sed regex that parses the compressed vmlinux's symbol list, tweak the regex a bit for conciseness.
This change has no impact on the resulting bzImage binary when configured with CONFIG_EFI_STUB=y.
--- arch/x86/boot/Makefile | 2 +- arch/x86/boot/compressed/vmlinux.lds.S | 3 +++ arch/x86/boot/header.S | 2 +- arch/x86/boot/tools/build.c | 30 +++++++----------------------- 4 files changed, 12 insertions(+), 25 deletions(-)
arch/x86/boot/Makefile +1 -1
@@ -91,7 +91,7 @@ $(obj)/vmlinux.bin: $(obj)/compressed/vm SETUP_OBJS = $(addprefix $(obj)/,$(setup-y)) -sed-zoffset := -e 's/^\([0-9a-fA-F]*\) [a-zA-Z] \(startup_32\|efi32_stub_entry\|efi64_stub_entry\|efi_pe_entry\|efi32_pe_entry\|input_data\|kernel_info\|_end\|_ehead\|_text\|z_.*\)$$/\#define ZO_\2 0x\1/p' +sed-zoffset := -e 's/^\([0-9a-fA-F]*\) [a-zA-Z] \(startup_32\|efi.._stub_entry\|efi\(32\)\?_pe_entry\|input_data\|kernel_info\|_end\|_ehead\|_text\|_edata\|z_.*\)$$/\#define ZO_\2 0x\1/p' quiet_cmd_zoffset = ZOFFSET $@ cmd_zoffset = $(NM) $< | sed -n $(sed-zoffset) > $@
arch/x86/boot/compressed/vmlinux.lds.S +3 -0
@@ -46,6 +46,9 @@ SECTIONS _data = . ; *(.data) *(.data.*) + + /* Add 4 bytes of extra space for a CRC-32 checksum */ + . = ALIGN(. + 4, 0x20); _edata = . ; } . = ALIGN(L1_CACHE_BYTES);
arch/x86/boot/header.S +1 -1
@@ -232,7 +232,7 @@ sentinel: .byte 0xff, 0xff /* Use hdr: .byte setup_sects - 1 root_flags: .word ROOT_RDONLY -syssize: .long 0 /* Filled in by build.c */ +syssize: .long ZO__edata / 16 ram_size: .word 0 /* Obsolete */ vid_mode: .word SVGA_MODE root_dev: .word 0 /* Default to major/minor 0/0 */
arch/x86/boot/tools/build.c +7 -23
@@ -52,6 +52,7 @@ u8 buf[SETUP_SECT_MAX*512];static unsigned long efi_pe_entry;static unsigned long efi32_pe_entry; +static unsigned long _edata;static unsigned long _end;/*----------------------------------------------------------------------*/
@@ -308,6 +309,7 @@ static void parse_zoffset(char *fname)while (p && *p) {PARSE_ZOFS (p, efi_pe_entry);PARSE_ZOFS (p, efi32_pe_entry); +PARSE_ZOFS (p, _edata);PARSE_ZOFS (p, _end); p =strchr (p,'\n' );
@@ -320,7 +322,6 @@ int main(int argc, char ** argv) {unsigned int i, sz, setup_sectors;int c; -u32 sys_size;struct stat sb;FILE *file, *dest;int fd;
@@ -368,24 +369,14 @@ int main(int argc, char ** argv)die ("Unable to open `%s': %m" , argv[2 ]);if (fstat (fd, &sb))die ("Unable to stat `%s': %m" , argv[2 ]); - sz = sb.st_size; +if (_edata != sb.st_size) +die ("Unexpected file size `%s': %u != %u" , argv[2 ], _edata, + sb.st_size); + sz = _edata -4 ; kernel =mmap (NULL , sz,PROT_READ ,MAP_SHARED , fd,0 );if (kernel ==MAP_FAILED )die ("Unable to mmap '%s': %m" , argv[2 ]); -/* Number of 16-byte paragraphs, including space for a 4-byte CRC */ - sys_size = (sz +15 +4 ) /16 ; -#ifdef CONFIG_EFI_STUB -/* -* COFF requires minimum 32-byte alignment of sections, and -* adding a signature is problematic without that alignment. -*/ - sys_size = (sys_size +1 ) & ~1 ; -#endif - -/* Patch the setup code with the appropriate size parameters */ -put_unaligned_le32 (sys_size, &buf[0x1f4 ]); - -update_pecoff_text (setup_sectors *512 , i + (sys_size *16 )); +update_pecoff_text (setup_sectors *512 , i + _edata); crc =partial_crc32 (buf, i, crc);
@@ -397,13 +388,6 @@ int main(int argc, char ** argv)if (fwrite (kernel,1 , sz, dest) != sz)die ("Writing kernel failed" ); -/* Add padding leaving 4 bytes for the checksum */ -while (sz++ < (sys_size*16 ) -4 ) { - crc =partial_crc32_one ('\0' , crc); -if (fwrite ("\0" ,1 ,1 , dest) !=1 ) -die ("Writing padding failed" ); - } -/* Write the CRC */ put_unaligned_le32 (crc, buf);if (fwrite (buf,1 ,4 , dest) !=4 )
Greg Kroah-Hartman
maintainerPATCH 23/141 x86/boot: Construct PE/COFF .text section from assembler
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ard Biesheuvel <[email protected]>
[ Commit efa089e63b56bdc5eca754b995cb039dd7a5457e upstream ]
Now that the size of the setup block is visible to the assembler, it is possible to populate the PE/COFF header fields from the asm code directly, instead of poking the values into the binary using the build tool. This will make it easier to reorganize the section layout without having to tweak the build tool in lockstep.
This change has no impact on the resulting bzImage binary.
--- arch/x86/boot/header.S | 22 ++++++-------------- arch/x86/boot/tools/build.c | 47 -------------------------------------------- 2 files changed, 7 insertions(+), 62 deletions(-)
arch/x86/boot/header.S +7 -15
@@ -74,14 +74,12 @@ optional_header: .byte 0x02 # MajorLinkerVersion .byte 0x14 # MinorLinkerVersion - # Filled in by build.c - .long 0 # SizeOfCode + .long setup_size + ZO__end - 0x200 # SizeOfCode .long 0 # SizeOfInitializedData .long 0 # SizeOfUninitializedData - # Filled in by build.c - .long 0x0000 # AddressOfEntryPoint + .long setup_size + ZO_efi_pe_entry # AddressOfEntryPoint .long 0x0200 # BaseOfCode #ifdef CONFIG_X86_32
@@ -104,10 +102,7 @@ extra_header_fields: .word 0 # MinorSubsystemVersion .long 0 # Win32VersionValue - # - # The size of the bzImage is written in tools/build.c - # - .long 0 # SizeOfImage + .long setup_size + ZO__end # SizeOfImage .long 0x200 # SizeOfHeaders .long 0 # CheckSum
@@ -198,18 +193,15 @@ section_table: IMAGE_SCN_MEM_DISCARDABLE # Characteristics #endif - # - # The offset & size fields are filled in by build.c. - # .ascii ".text" .byte 0 .byte 0 .byte 0 - .long 0 - .long 0x0 # startup_{32,64} - .long 0 # Size of initialized data + .long ZO__end + .long setup_size + .long ZO__edata # Size of initialized data # on disk - .long 0x0 # startup_{32,64} + .long setup_size .long 0 # PointerToRelocations .long 0 # PointerToLineNumbers .word 0 # NumberOfRelocations
arch/x86/boot/tools/build.c +0 -47
90 lines not on this page · raw message
Greg Kroah-Hartman
maintainerPATCH 24/141 x86/boot: Drop PE/COFF .reloc section
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ard Biesheuvel <[email protected]>
[ Commit fa5750521e0a4efbc1af05223da9c4bbd6c21c83 upstream ]
Ancient buggy EFI loaders may have required a .reloc section to be present at some point in time, but this has not been true for a long time so the .reloc section can just be dropped.
--- arch/x86/boot/header.S | 20 -------------------- arch/x86/boot/setup.ld | 4 ++-- arch/x86/boot/tools/build.c | 34 +++++----------------------------- 3 files changed, 7 insertions(+), 51 deletions(-)
arch/x86/boot/header.S +0 -20
@@ -154,26 +154,6 @@ section_table: IMAGE_SCN_MEM_READ | \ IMAGE_SCN_MEM_EXECUTE # Characteristics - # - # The EFI application loader requires a relocation section - # because EFI applications must be relocatable. The .reloc - # offset & size fields are filled in by build.c. - # - .ascii ".reloc" - .byte 0 - .byte 0 - .long 0 - .long 0 - .long 0 # SizeOfRawData - .long 0 # PointerToRawData - .long 0 # PointerToRelocations - .long 0 # PointerToLineNumbers - .word 0 # NumberOfRelocations - .word 0 # NumberOfLineNumbers - .long IMAGE_SCN_CNT_INITIALIZED_DATA | \ - IMAGE_SCN_MEM_READ | \ - IMAGE_SCN_MEM_DISCARDABLE # Characteristics - #ifdef CONFIG_EFI_MIXED # # The offset & size fields are filled in by build.c.
arch/x86/boot/setup.ld +2 -2
@@ -40,8 +40,8 @@ SECTIONS setup_sig = .; LONG(0x5a5aaa55) - /* Reserve some extra space for the reloc and compat sections */ - setup_size = ALIGN(ABSOLUTE(.) + 64, 512); + /* Reserve some extra space for the compat section */ + setup_size = ALIGN(ABSOLUTE(.) + 32, 512); setup_sects = ABSOLUTE(setup_size / 512); }
arch/x86/boot/tools/build.c +5 -29
@@ -47,7 +47,6 @@ typedef unsigned int u32;/* This must be large enough to hold the entire setup */ u8 buf[SETUP_SECT_MAX *512 ]; -#define PECOFF_RELOC_RESERVE 0x20#define PECOFF_COMPAT_RESERVE 0x20static unsigned long efi32_pe_entry;
@@ -180,24 +179,13 @@ static void update_pecoff_section_headerupdate_pecoff_section_header_fields (section_name, offset, size, size, offset); } -static void update_pecoff_setup_and_reloc (unsigned int size) +static void update_pecoff_setup (unsigned int size) {u32 setup_offset =0x200 ; -u32 reloc_offset = size -PECOFF_RELOC_RESERVE -PECOFF_COMPAT_RESERVE ; -#ifdef CONFIG_EFI_MIXED -u32 compat_offset = reloc_offset +PECOFF_RELOC_RESERVE ; -#endif -u32 setup_size = reloc_offset - setup_offset; +u32 compat_offset = size -PECOFF_COMPAT_RESERVE ; +u32 setup_size = compat_offset - setup_offset;update_pecoff_section_header (".setup" , setup_offset, setup_size); -update_pecoff_section_header (".reloc" , reloc_offset,PECOFF_RELOC_RESERVE ); - -/* -* Modify .reloc section contents with a single entry. The -* relocation is applied to offset 10 of the relocation section. -*/ -put_unaligned_le32 (reloc_offset +10 , &buf[reloc_offset]); -put_unaligned_le32 (10 , &buf[reloc_offset +4 ]);#ifdef CONFIG_EFI_MIXED update_pecoff_section_header (".compat" , compat_offset,PECOFF_COMPAT_RESERVE );
@@ -214,21 +202,10 @@ static void update_pecoff_setup_and_relo #endif } -static int reserve_pecoff_reloc_section (int c) -{ -/* Reserve 0x20 bytes for .reloc section */ -memset (buf+c,0 ,PECOFF_RELOC_RESERVE ); -return PECOFF_RELOC_RESERVE ; -} -#else -static inline void update_pecoff_setup_and_reloc (unsigned int size) {} +static inline void update_pecoff_setup (unsigned int size) {} -static inline int reserve_pecoff_reloc_section (int c) -{ -return 0 ; -}#endif /* CONFIG_EFI_STUB */ static int reserve_pecoff_compat_section (int c)
@@ -307,7 +284,6 @@ int main(int argc, char ** argv)fclose (file); c +=reserve_pecoff_compat_section (c); - c +=reserve_pecoff_reloc_section (c);/* Pad unused space with zeros */ setup_sectors = (c +511 ) /512 ;
@@ -316,7 +292,7 @@ int main(int argc, char ** argv) i = setup_sectors*512 ;memset (buf+c,0 , i-c); -update_pecoff_setup_and_reloc (i); +update_pecoff_setup (i);/* Open and stat the kernel file */ fd =open (argv[2 ],O_RDONLY );
Greg Kroah-Hartman
maintainerPATCH 25/141 x86/boot: Split off PE/COFF .data section
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ard Biesheuvel <[email protected]>
[ Commit 34951f3c28bdf6481d949a20413b2ce7693687b2 upstream ]
Describe the code and data of the decompressor binary using separate .text and .data PE/COFF sections, so that we will be able to map them using restricted permissions once we increase the section and file alignment sufficiently. This avoids the need for memory mappings that are writable and executable at the same time, which is something that is best avoided for security reasons.
--- arch/x86/boot/Makefile | 2 +- arch/x86/boot/header.S | 19 +++++++++++++++---- 2 files changed, 16 insertions(+), 5 deletions(-)
arch/x86/boot/Makefile +1 -1
@@ -91,7 +91,7 @@ $(obj)/vmlinux.bin: $(obj)/compressed/vm SETUP_OBJS = $(addprefix $(obj)/,$(setup-y)) -sed-zoffset := -e 's/^\([0-9a-fA-F]*\) [a-zA-Z] \(startup_32\|efi.._stub_entry\|efi\(32\)\?_pe_entry\|input_data\|kernel_info\|_end\|_ehead\|_text\|_edata\|z_.*\)$$/\#define ZO_\2 0x\1/p' +sed-zoffset := -e 's/^\([0-9a-fA-F]*\) [a-zA-Z] \(startup_32\|efi.._stub_entry\|efi\(32\)\?_pe_entry\|input_data\|kernel_info\|_end\|_ehead\|_text\|_e\?data\|z_.*\)$$/\#define ZO_\2 0x\1/p' quiet_cmd_zoffset = ZOFFSET $@ cmd_zoffset = $(NM) $< | sed -n $(sed-zoffset) > $@
arch/x86/boot/header.S +15 -4
@@ -74,9 +74,9 @@ optional_header: .byte 0x02 # MajorLinkerVersion .byte 0x14 # MinorLinkerVersion - .long setup_size + ZO__end - 0x200 # SizeOfCode + .long ZO__data # SizeOfCode - .long 0 # SizeOfInitializedData + .long ZO__end - ZO__data # SizeOfInitializedData .long 0 # SizeOfUninitializedData .long setup_size + ZO_efi_pe_entry # AddressOfEntryPoint
@@ -177,9 +177,9 @@ section_table: .byte 0 .byte 0 .byte 0 - .long ZO__end + .long ZO__data .long setup_size - .long ZO__edata # Size of initialized data + .long ZO__data # Size of initialized data # on disk .long setup_size .long 0 # PointerToRelocations
@@ -190,6 +190,17 @@ section_table: IMAGE_SCN_MEM_READ | \ IMAGE_SCN_MEM_EXECUTE # Characteristics + .ascii ".data\0\0\0" + .long ZO__end - ZO__data # VirtualSize + .long setup_size + ZO__data # VirtualAddress + .long ZO__edata - ZO__data # SizeOfRawData + .long setup_size + ZO__data # PointerToRawData + + .long 0, 0, 0 + .long IMAGE_SCN_CNT_INITIALIZED_DATA | \ + IMAGE_SCN_MEM_READ | \ + IMAGE_SCN_MEM_WRITE # Characteristics + .set section_count, (. - section_table) / 40 #endif /* CONFIG_EFI_STUB */
Greg Kroah-Hartman
maintainerPATCH 26/141 x86/boot: Increase section and file alignment to 4k/512
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ard Biesheuvel <[email protected]>
[ Commit 3e3eabe26dc88692d34cf76ca0e0dd331481cc15 upstream ]
Align x86 with other EFI architectures, and increase the section alignment to the EFI page size (4k), so that firmware is able to honour the section permission attributes and map code read-only and data non-executable.
There are a number of requirements that have to be taken into account:
- the sign tools get cranky when there are gaps between sections in the file view of the image
- the virtual offset of each section must be aligned to the image's section alignment
- the file offset *and size* of each section must be aligned to the image's file alignment
- the image size must be aligned to the section alignment
- each section's virtual offset must be greater than or equal to the size of the headers.
In order to meet all these requirements, while avoiding the need for lots of padding to accommodate the .compat section, the latter is placed at an arbitrary offset towards the end of the image, but aligned to the minimum file alignment (512 bytes). The space before the .text section is therefore distributed between the PE header, the .setup section and the .compat section, leaving no gaps in the file coverage, making the signing tools happy.
--- arch/x86/boot/compressed/vmlinux.lds.S | 4 - arch/x86/boot/header.S | 75 +++++++++++++++------------ arch/x86/boot/setup.ld | 7 +- arch/x86/boot/tools/build.c | 90 --------------------------------- 4 files changed, 51 insertions(+), 125 deletions(-)
arch/x86/boot/compressed/vmlinux.lds.S +2 -2
@@ -42,13 +42,13 @@ SECTIONS *(.rodata.*) _erodata = . ; } - .data : { + .data : ALIGN(0x1000) { _data = . ; *(.data) *(.data.*) /* Add 4 bytes of extra space for a CRC-32 checksum */ - . = ALIGN(. + 4, 0x20); + . = ALIGN(. + 4, 0x200); _edata = . ; } . = ALIGN(L1_CACHE_BYTES);
arch/x86/boot/header.S +43 -32
117 lines not on this page · raw message
arch/x86/boot/setup.ld +4 -3
@@ -36,16 +36,17 @@ SECTIONS . = ALIGN(16); .data : { *(.data*) } + .pecompat : { *(.pecompat) } + PROVIDE(pecompat_fsize = setup_size - pecompat_fstart); + .signature : { setup_sig = .; LONG(0x5a5aaa55) - /* Reserve some extra space for the compat section */ - setup_size = ALIGN(ABSOLUTE(.) + 32, 512); + setup_size = ALIGN(ABSOLUTE(.), 4096); setup_sects = ABSOLUTE(setup_size / 512); } - . = ALIGN(16); .bss : {
arch/x86/boot/tools/build.c +2 -88
120 lines not on this page · raw message
Greg Kroah-Hartman
maintainerPATCH 27/141 x86/efistub: Use 1:1 file:memory mapping for PE/COFF .compat section
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ard Biesheuvel <[email protected]>
[ Commit 1ad55cecf22f05f1c884adf63cc09d3c3e609ebf upstream ]
The .compat section is a dummy PE section that contains the address of the 32-bit entrypoint of the 64-bit kernel image if it is bootable from 32-bit firmware (i.e., CONFIG_EFI_MIXED=y)
This section is only 8 bytes in size and is only referenced from the loader, and so it is placed at the end of the memory view of the image, to avoid the need for padding it to 4k, which is required for sections appearing in the middle of the image.
Unfortunately, this violates the PE/COFF spec, and even if most EFI loaders will work correctly (including the Tianocore reference implementation), PE loaders do exist that reject such images, on the basis that both the file and memory views of the file contents should be described by the section headers in a monotonically increasing manner without leaving any gaps.
So reorganize the sections to avoid this issue. This results in a slight padding overhead (< 4k) which can be avoided if desired by disabling CONFIG_EFI_MIXED (which is only needed in rare cases these days)
--- arch/x86/boot/header.S | 14 ++++++-------- arch/x86/boot/setup.ld | 6 +++--- 2 files changed, 9 insertions(+), 11 deletions(-)
arch/x86/boot/header.S +6 -8
@@ -105,8 +105,7 @@ extra_header_fields: .word 0 # MinorSubsystemVersion .long 0 # Win32VersionValue - .long setup_size + ZO__end + pecompat_vsize - # SizeOfImage + .long setup_size + ZO__end # SizeOfImage .long salign # SizeOfHeaders .long 0 # CheckSum
@@ -142,7 +141,7 @@ section_table: .ascii ".setup" .byte 0 .byte 0 - .long setup_size - salign # VirtualSize + .long pecompat_fstart - salign # VirtualSize .long salign # VirtualAddress .long pecompat_fstart - salign # SizeOfRawData .long salign # PointerToRawData
@@ -155,8 +154,8 @@ section_table: #ifdef CONFIG_EFI_MIXED .asciz ".compat" - .long 8 # VirtualSize - .long setup_size + ZO__end # VirtualAddress + .long pecompat_fsize # VirtualSize + .long pecompat_fstart # VirtualAddress .long pecompat_fsize # SizeOfRawData .long pecompat_fstart # PointerToRawData
@@ -171,17 +170,16 @@ section_table: * modes this image supports. */ .pushsection ".pecompat", "a", @progbits - .balign falign - .set pecompat_vsize, salign + .balign salign .globl pecompat_fstart pecompat_fstart: .byte 0x1 # Version .byte 8 # Size .word IMAGE_FILE_MACHINE_I386 # PE machine type .long setup_size + ZO_efi32_pe_entry # Entrypoint + .byte 0x0 # Sentinel .popsection #else - .set pecompat_vsize, 0 .set pecompat_fstart, setup_size #endif .ascii ".text"
arch/x86/boot/setup.ld +3 -3
@@ -24,6 +24,9 @@ SECTIONS .text : { *(.text .text.*) } .text32 : { *(.text32) } + .pecompat : { *(.pecompat) } + PROVIDE(pecompat_fsize = setup_size - pecompat_fstart); + . = ALIGN(16); .rodata : { *(.rodata*) }
@@ -36,9 +39,6 @@ SECTIONS . = ALIGN(16); .data : { *(.data*) } - .pecompat : { *(.pecompat) } - PROVIDE(pecompat_fsize = setup_size - pecompat_fstart); - .signature : { setup_sig = .; LONG(0x5a5aaa55)
Greg Kroah-Hartman
maintainerPATCH 28/141 x86/mm: Remove P*D_PAGE_MASK and P*D_PAGE_SIZE macros
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pasha Tatashin <[email protected]>
[ Commit 82328227db8f0b9b5f77bb5afcd47e59d0e4d08f upstream ]
Other architectures and the common mm/ use P*D_MASK, and P*D_SIZE. Remove the duplicated P*D_PAGE_MASK and P*D_PAGE_SIZE which are only used in x86/*.
--- arch/x86/include/asm/page_types.h | 12 +++--------- arch/x86/kernel/amd_gart_64.c | 2 +- arch/x86/kernel/head64.c | 2 +- arch/x86/mm/mem_encrypt_boot.S | 4 ++-- arch/x86/mm/mem_encrypt_identity.c | 18 +++++++++--------- arch/x86/mm/pat/set_memory.c | 6 +++--- arch/x86/mm/pti.c | 2 +- 7 files changed, 20 insertions(+), 26 deletions(-)
arch/x86/include/asm/page_types.h +3 -9
@@ -11,20 +11,14 @@#define PAGE_SIZE (_AC(1,UL) << PAGE_SHIFT)#define PAGE_MASK (~(PAGE_SIZE-1)) -#define PMD_PAGE_SIZE (_AC(1, UL) << PMD_SHIFT) -#define PMD_PAGE_MASK (~(PMD_PAGE_SIZE-1)) - -#define PUD_PAGE_SIZE (_AC(1, UL) << PUD_SHIFT) -#define PUD_PAGE_MASK (~(PUD_PAGE_SIZE-1)) -#define __VIRTUAL_MASK ((1UL << __VIRTUAL_MASK_SHIFT) - 1) -/* Cast *PAGE_MASK to a signed type so that it is sign-extended if +/* Cast P*D_MASK to a signed type so that it is sign-extended if virtual addresses are 32-bits but physical addresses are larger (ie, 32-bit PAE). */ #define PHYSICAL_PAGE_MASK (((signed long)PAGE_MASK) & __PHYSICAL_MASK) -#define PHYSICAL_PMD_PAGE_MASK (((signed long)PMD_PAGE_MASK) & __PHYSICAL_MASK) -#define PHYSICAL_PUD_PAGE_MASK (((signed long)PUD_PAGE_MASK) & __PHYSICAL_MASK) +#define PHYSICAL_PMD_PAGE_MASK (((signed long)PMD_MASK) & __PHYSICAL_MASK) +#define PHYSICAL_PUD_PAGE_MASK (((signed long)PUD_MASK) & __PHYSICAL_MASK)#define HPAGE_SHIFT PMD_SHIFT#define HPAGE_SIZE (_AC(1,UL) << HPAGE_SHIFT)
arch/x86/kernel/amd_gart_64.c +1 -1
@@ -504,7 +504,7 @@ static __init unsigned long check_iommu_ } a = aper + iommu_size; - iommu_size -=round_up (a,PMD_PAGE_SIZE ) - a; + iommu_size -=round_up (a,PMD_SIZE ) - a;if (iommu_size <64 *1024 *1024 ) { pr_warn("PCI-DMA: Warning: Small IOMMU %luMB."
arch/x86/kernel/head64.c +1 -1
@@ -203,7 +203,7 @@ unsigned long __head __startup_64(unsign load_delta = physaddr - (unsigned long )(_text - __START_KERNEL_map);/* Is the address not 2M aligned? */ -if (load_delta & ~PMD_PAGE_MASK ) +if (load_delta & ~PMD_MASK )for (;;);/* Include the SME encryption mask in the fixup value */
arch/x86/mm/mem_encrypt_boot.S +2 -2
@@ -26,7 +26,7 @@ SYM_FUNC_START(sme_encrypt_execute) * RCX - virtual address of the encryption workarea, including: * - stack page (PAGE_SIZE) * - encryption routine page (PAGE_SIZE) - * - intermediate copy buffer (PMD_PAGE_SIZE) + * - intermediate copy buffer (PMD_SIZE) * R8 - physical address of the pagetables to use for encryption */
@@ -123,7 +123,7 @@ SYM_FUNC_START(__enc_copy) wbinvd /* Invalidate any cache entries */ /* Copy/encrypt up to 2MB at a time */ - movq $PMD_PAGE_SIZE, %r12 + movq $PMD_SIZE, %r12 1: cmpq %r12, %r9 jnb 2f
arch/x86/mm/mem_encrypt_identity.c +9 -9
@@ -93,7 +93,7 @@ struct sme_populate_pgd_data {* section is 2MB aligned to allow for simple pagetable setup using only * PMD entries (see vmlinux.lds.S). */ -static char sme_workarea[2 * PMD_PAGE_SIZE] __section(".init.scratch"); +static char sme_workarea[2 * PMD_SIZE] __section(".init.scratch");static char sme_cmdline_arg[]__initdata ="mem_encrypt" ;static char sme_cmdline_on[]__initdata ="on" ;
@@ -197,8 +197,8 @@ static void __init __sme_map_range_pmd(swhile (ppd->vaddr < ppd->vaddr_end) {sme_populate_pgd_large (ppd); - ppd->vaddr +=PMD_PAGE_SIZE ; - ppd->paddr +=PMD_PAGE_SIZE ; + ppd->vaddr +=PMD_SIZE ; + ppd->paddr +=PMD_SIZE ; } }
@@ -224,11 +224,11 @@ static void __init __sme_map_range(struc vaddr_end = ppd->vaddr_end;/* If start is not 2MB aligned, create PTE entries */ - ppd->vaddr_end =ALIGN (ppd->vaddr,PMD_PAGE_SIZE ); + ppd->vaddr_end =ALIGN (ppd->vaddr,PMD_SIZE );__sme_map_range_pte (ppd);/* Create PMD entries */ - ppd->vaddr_end = vaddr_end &PMD_PAGE_MASK ; + ppd->vaddr_end = vaddr_end &PMD_MASK ;__sme_map_range_pmd (ppd);/* If end is not 2MB aligned, create PTE entries */
@@ -325,7 +325,7 @@ void __init sme_encrypt_kernel(struct bo/* Physical addresses gives us the identity mapped virtual addresses */ kernel_start =__pa_symbol (_text); - kernel_end =ALIGN (__pa_symbol (_end),PMD_PAGE_SIZE ); + kernel_end =ALIGN (__pa_symbol (_end),PMD_SIZE ); kernel_len = kernel_end - kernel_start; initrd_start =0 ;
@@ -355,12 +355,12 @@ void __init sme_encrypt_kernel(struct bo* executable encryption area size: * stack page (PAGE_SIZE) * encryption routine page (PAGE_SIZE) -* intermediate copy buffer (PMD_PAGE_SIZE) +* intermediate copy buffer (PMD_SIZE) * pagetable structures for the encryption of the kernel * pagetable structures for workarea (in case not currently mapped) */ execute_start = workarea_start; - execute_end = execute_start + (PAGE_SIZE *2 ) +PMD_PAGE_SIZE ; + execute_end = execute_start + (PAGE_SIZE *2 ) +PMD_SIZE ; execute_len = execute_end - execute_start;/*
@@ -383,7 +383,7 @@ void __init sme_encrypt_kernel(struct bo* before it is mapped. */ workarea_len = execute_len + pgtable_area_len; - workarea_end =ALIGN (workarea_start + workarea_len,PMD_PAGE_SIZE ); + workarea_end =ALIGN (workarea_start + workarea_len,PMD_SIZE );/* * Set the address to the start of where newly created pagetable
arch/x86/mm/pat/set_memory.c +3 -3
@@ -747,11 +747,11 @@ phys_addr_t slow_virt_to_phys(void *__viswitch (level) {case PG_LEVEL_1G : phys_addr = (phys_addr_t )pud_pfn (*(pud_t *)pte) <<PAGE_SHIFT ; - offset = virt_addr & ~PUD_PAGE_MASK ; + offset = virt_addr & ~PUD_MASK ;break ;case PG_LEVEL_2M : phys_addr = (phys_addr_t )pmd_pfn (*(pmd_t *)pte) <<PAGE_SHIFT ; - offset = virt_addr & ~PMD_PAGE_MASK ; + offset = virt_addr & ~PMD_MASK ;break ;default : phys_addr = (phys_addr_t )pte_pfn (*pte) <<PAGE_SHIFT ;
@@ -1041,7 +1041,7 @@ __split_large_page(struct cpa_data *cpa,case PG_LEVEL_1G : ref_prot =pud_pgprot (*(pud_t *)kpte); ref_pfn =pud_pfn (*(pud_t *)kpte); - pfninc =PMD_PAGE_SIZE >>PAGE_SHIFT ; + pfninc =PMD_SIZE >>PAGE_SHIFT ; lpaddr = address &PUD_MASK ; lpinc =PMD_SIZE ;/*
arch/x86/mm/pti.c +1 -1
@@ -592,7 +592,7 @@ static void pti_set_kernel_image_nonglob* of the image. */ unsigned long start =PFN_ALIGN (_text); -unsigned long end =ALIGN ((unsigned long )_end,PMD_PAGE_SIZE ); +unsigned long end =ALIGN ((unsigned long )_end,PMD_SIZE );/* * This clears _PAGE_GLOBAL from the entire kernel image.
Greg Kroah-Hartman
maintainerPATCH 29/141 x86/head/64: Add missing __head annotation to startup_64_load_idt()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hou Wenlong <[email protected]>
[ Commit 7f6874eddd81cb2ed784642a7a4321671e158ffe upstream ]
This function is currently only used in the head code and is only called from startup_64_setup_env(). Although it would be inlined by the compiler, it would be better to mark it as __head too in case it doesn't.
--- arch/x86/kernel/head64.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/x86/kernel/head64.c +1 -1
@@ -588,7 +588,7 @@ static void set_bringup_idt_handler(gate }/* This runs while still in the direct mapping */ -static void startup_64_load_idt (unsigned long physbase) +static void __head startup_64_load_idt(unsigned long physbase) {struct desc_ptr *desc =fixup_pointer (&bringup_idt_descr, physbase);gate_desc *idt =fixup_pointer (bringup_idt_table, physbase);
Greg Kroah-Hartman
maintainerPATCH 30/141 x86/head/64: Move the __head definition to <asm/init.h>
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hou Wenlong <[email protected]>
[ Commit d2a285d65bfde3218fd0c3b88794d0135ced680b upstream ]
Move the __head section definition to a header to widen its use.
An upcoming patch will mark the code as __head in mem_encrypt_identity.c too.
--- arch/x86/include/asm/init.h | 2 ++ arch/x86/kernel/head64.c | 3 +-- 2 files changed, 3 insertions(+), 2 deletions(-)
arch/x86/include/asm/init.h +2 -0
@@ -2,6 +2,8 @@ #ifndef _ASM_X86_INIT_H #define _ASM_X86_INIT_H +#define __head __section(".head.text") + struct x86_mapping_info { void *(*alloc_pgt_page)(void *); /* allocate buf for page table */ void *context; /* context for alloc_pgt_page */
arch/x86/kernel/head64.c +1 -2
@@ -41,6 +41,7 @@#include <asm/trapnr.h> #include <asm/sev.h> #include <asm/tdx.h> +#include <asm/init.h> /* * Manage page tables very early on.
@@ -84,8 +85,6 @@ static struct desc_ptr startup_gdt_descr .address = 0, }; -#define __head __section(".head.text") - static void __head *fixup_pointer(void *ptr, unsigned long physaddr) {return ptr - (void *)_text + (void *)physaddr;
Greg Kroah-Hartman
maintainerPATCH 31/141 x86/sme: Move early SME kernel encryption handling into .head.text
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ard Biesheuvel <[email protected]>
[ Commit 48204aba801f1b512b3abed10b8e1a63e03f3dd1 upstream ]
The .head.text section is the initial primary entrypoint of the core kernel, and is entered with the CPU executing from a 1:1 mapping of memory. Such code must never access global variables using absolute references, as these are based on the kernel virtual mapping which is not active yet at this point.
Given that the SME startup code is also called from this early execution context, move it into .head.text as well. This will allow more thorough build time checks in the future to ensure that early startup code only uses RIP-relative references to global variables.
Also replace some occurrences of __pa_symbol() [which relies on the compiler generating an absolute reference, which is not guaranteed] and an open coded RIP-relative access with RIP_REL_REF().
--- arch/x86/include/asm/mem_encrypt.h | 8 +++---- arch/x86/mm/mem_encrypt_identity.c | 42 ++++++++++++++----------------------- 2 files changed, 21 insertions(+), 29 deletions(-)
arch/x86/include/asm/mem_encrypt.h +4 -4
@@ -46,8 +46,8 @@ void __init sme_unmap_bootdata(char *reavoid __init sme_early_init (void );void __init sev_setup_arch (void ); -void __init sme_encrypt_kernel (struct boot_params *bp); -void __init sme_enable (struct boot_params *bp); +void sme_encrypt_kernel (struct boot_params *bp); +void sme_enable (struct boot_params *bp);int __init early_set_memory_decrypted (unsigned long vaddr,unsigned long size);int __init early_set_memory_encrypted (unsigned long vaddr,unsigned long size);
@@ -80,8 +80,8 @@ static inline void __init sme_unmap_bootstatic inline void __init sme_early_init (void ) { }static inline void __init sev_setup_arch (void ) { } -static inline void __init sme_encrypt_kernel (struct boot_params *bp) { } -static inline void __init sme_enable (struct boot_params *bp) { } +static inline void sme_encrypt_kernel (struct boot_params *bp) { } +static inline void sme_enable (struct boot_params *bp) { }static inline void sev_es_init_vc_handling (void ) { }
arch/x86/mm/mem_encrypt_identity.c +17 -25
138 lines not on this page · raw message
Greg Kroah-Hartman
maintainerPATCH 32/141 x86/sev: Move early startup code into .head.text section
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ard Biesheuvel <[email protected]>
[ Commit 428080c9b19bfda37c478cd626dbd3851db1aff9 upstream ]
In preparation for implementing rigorous build time checks to enforce that only code that can support it will be called from the early 1:1 mapping of memory, move SEV init code that is called in this manner to the .head.text section.
--- arch/x86/boot/compressed/sev.c | 3 +++ arch/x86/include/asm/sev.h | 10 +++++----- arch/x86/kernel/sev-shared.c | 23 ++++++++++------------- arch/x86/kernel/sev.c | 11 ++++++----- 4 files changed, 24 insertions(+), 23 deletions(-)
arch/x86/boot/compressed/sev.c +3 -0
@@ -118,6 +118,9 @@ static bool fault_in_kernel_space(unsign#define __init#define __pa (x) ((unsigned long)(x)) +#undef __head +#define __head +#define __BOOT_COMPRESSED/* Basic instruction decoding support needed */
arch/x86/include/asm/sev.h +5 -5
@@ -192,15 +192,15 @@ static inline int pvalidate(unsigned lonstruct snp_guest_request_ioctl ;void setup_ghcb (void ); -void __init early_snp_set_memory_private (unsigned long vaddr,unsigned long paddr, -unsigned long npages); -void __init early_snp_set_memory_shared (unsigned long vaddr,unsigned long paddr, -unsigned long npages); +void early_snp_set_memory_private (unsigned long vaddr,unsigned long paddr, +unsigned long npages); +void early_snp_set_memory_shared (unsigned long vaddr,unsigned long paddr, +unsigned long npages);void snp_set_memory_shared (unsigned long vaddr,unsigned long npages);void snp_set_memory_private (unsigned long vaddr,unsigned long npages);void snp_set_wakeup_secondary_cpu (void );bool snp_init (struct boot_params *bp); -void __init __noreturn snp_abort (void ); +void __noreturn snp_abort (void );void snp_dmi_setup (void );int snp_issue_guest_request (u64 exit_code,struct snp_req_data *input,struct snp_guest_request_ioctl *rio);u64 snp_get_unsupported_features (u64 status);
arch/x86/kernel/sev-shared.c +10 -13
@@ -86,7 +86,8 @@ static bool __init sev_es_check_cpu_featreturn true; } -static void __noreturn sev_es_terminate (unsigned int set,unsigned int reason) +static void __head __noreturn +sev_es_terminate (unsigned int set,unsigned int reason) {u64 val =GHCB_MSR_TERM_REQ ;
@@ -323,13 +324,7 @@ static int sev_cpuid_hv(struct ghcb *ghc*/ static const struct snp_cpuid_table *snp_cpuid_get_table (void ) { -void *ptr; - - asm ("lea cpuid_table_copy(%%rip), %0" - :"=r" (ptr) - :"p" (&cpuid_table_copy)); - -return ptr; +return &RIP_REL_REF (cpuid_table_copy); }/*
@@ -388,7 +383,7 @@ static u32 snp_cpuid_calc_xsave_size(u64return xsave_size; } -static bool +static bool __headsnp_cpuid_get_validated_func (struct cpuid_leaf *leaf) {const struct snp_cpuid_table *cpuid_table =snp_cpuid_get_table ();
@@ -525,7 +520,8 @@ static int snp_cpuid_postprocess(struct* Returns -EOPNOTSUPP if feature not enabled. Any other non-zero return value * should be treated as fatal by caller. */ -static int snp_cpuid (struct ghcb *ghcb,struct es_em_ctxt *ctxt,struct cpuid_leaf *leaf) +static int __head +snp_cpuid (struct ghcb *ghcb,struct es_em_ctxt *ctxt,struct cpuid_leaf *leaf) {const struct snp_cpuid_table *cpuid_table =snp_cpuid_get_table ();
@@ -567,7 +563,7 @@ static int snp_cpuid(struct ghcb *ghcb,* page yet, so it only supports the MSR based communication with the * hypervisor and only the CPUID exit-code. */ -void __init do_vc_no_ghcb (struct pt_regs *regs,unsigned long exit_code) +void __head do_vc_no_ghcb(struct pt_regs *regs, unsigned long exit_code) {unsigned int subfn =lower_bits (regs->cx,32 );unsigned int fn =lower_bits (regs->ax,32 );
@@ -1013,7 +1009,8 @@ struct cc_setup_data {* Search for a Confidential Computing blob passed in as a setup_data entry * via the Linux Boot Protocol. */ -static struct cc_blob_sev_info *find_cc_blob_setup_data (struct boot_params *bp) +static __head +struct cc_blob_sev_info *find_cc_blob_setup_data(struct boot_params *bp) {struct cc_setup_data *sd =NULL ;struct setup_data *hdr;
@@ -1040,7 +1037,7 @@ static struct cc_blob_sev_info *find_cc_* mapping needs to be updated in sync with all the changes to virtual memory * layout and related mapping facilities throughout the boot process. */ -static void __init setup_cpuid_table (const struct cc_blob_sev_info *cc_info) +static void __head setup_cpuid_table(const struct cc_blob_sev_info *cc_info) {const struct snp_cpuid_table *cpuid_table_fw, *cpuid_table;int i;
arch/x86/kernel/sev.c +6 -5
@@ -26,6 +26,7 @@#include <linux/dmi.h> #include <uapi/linux/sev-guest.h> +#include <asm/init.h> #include <asm/cpu_entry_area.h> #include <asm/stacktrace.h> #include <asm/sev.h>
@@ -690,7 +691,7 @@ static void pvalidate_pages(unsigned lon } } -static void __init early_set_pages_state (unsigned long paddr,unsigned long npages,enum psc_op op) +static void __head early_set_pages_state(unsigned long paddr, unsigned long npages, enum psc_op op) {unsigned long paddr_end;u64 val;
@@ -728,7 +729,7 @@ e_term:sev_es_terminate (SEV_TERM_SET_LINUX ,GHCB_TERM_PSC ); } -void __init early_snp_set_memory_private (unsigned long vaddr,unsigned long paddr, +void __head early_snp_set_memory_private(unsigned long vaddr, unsigned long paddr,unsigned long npages) {/*
@@ -2085,7 +2086,7 @@ fail:* * Scan for the blob in that order. */ -static __init struct cc_blob_sev_info *find_cc_blob (struct boot_params *bp) +static __head struct cc_blob_sev_info *find_cc_blob(struct boot_params *bp) {struct cc_blob_sev_info *cc_info;
@@ -2111,7 +2112,7 @@ found_cc_info:return cc_info; } -bool __init snp_init (struct boot_params *bp) +bool __head snp_init(struct boot_params *bp) {struct cc_blob_sev_info *cc_info;
@@ -2133,7 +2134,7 @@ bool __init snp_init(struct boot_paramsreturn true; } -void __init __noreturn snp_abort (void ) +void __head __noreturn snp_abort(void) {sev_es_terminate (SEV_TERM_SET_GEN ,GHCB_SNP_UNSUPPORTED ); }
Greg Kroah-Hartman
maintainerPATCH 33/141 x86/efistub: Remap kernel text read-only before dropping NX attribute
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ard Biesheuvel <[email protected]>
[ Commit 9c55461040a9264b7e44444c53d26480b438eda6 upstream ]
Currently, the EFI stub invokes the EFI memory attributes protocol to strip any NX restrictions from the entire loaded kernel, resulting in all code and data being mapped read-write-execute.
The point of the EFI memory attributes protocol is to remove the need for all memory allocations to be mapped with both write and execute permissions by default, and make it the OS loader's responsibility to transition data mappings to code mappings where appropriate.
Even though the UEFI specification does not appear to leave room for denying memory attribute changes based on security policy, let's be cautious and avoid relying on the ability to create read-write-execute mappings. This is trivially achievable, given that the amount of kernel code executing via the firmware's 1:1 mapping is rather small and limited to the .head.text region. So let's drop the NX restrictions only on that subregion, but not before remapping it as read-only first.
--- arch/x86/boot/compressed/Makefile | 2 +- arch/x86/boot/compressed/misc.c | 1 + arch/x86/include/asm/boot.h | 1 + drivers/firmware/efi/libstub/x86-stub.c | 11 ++++++++++- 4 files changed, 13 insertions(+), 2 deletions(-)
arch/x86/boot/compressed/Makefile +1 -1
@@ -84,7 +84,7 @@ LDFLAGS_vmlinux += -T hostprogs := mkpiggy HOST_EXTRACFLAGS += -I$(srctree)/tools/include -sed-voffset := -e 's/^\([0-9a-fA-F]*\) [ABCDGRSTVW] \(_text\|__bss_start\|_end\)$$/\#define VO_\2 _AC(0x\1,UL)/p' +sed-voffset := -e 's/^\([0-9a-fA-F]*\) [ABCDGRSTVW] \(_text\|__start_rodata\|__bss_start\|_end\)$$/\#define VO_\2 _AC(0x\1,UL)/p' quiet_cmd_voffset = VOFFSET $@ cmd_voffset = $(NM) $< | sed -n $(sed-voffset) > $@
arch/x86/boot/compressed/misc.c +1 -0
@@ -330,6 +330,7 @@ static size_t parse_elf(void *output)return ehdr.e_entry -LOAD_PHYSICAL_ADDR ; } +const unsigned long kernel_text_size = VO___start_rodata - VO__text;const unsigned long kernel_total_size = VO__end - VO__text;static u8 boot_heap[BOOT_HEAP_SIZE ]__aligned(4) ;
arch/x86/include/asm/boot.h +1 -0
@@ -81,6 +81,7 @@#ifndef __ASSEMBLY__extern unsigned int output_len; +extern const unsigned long kernel_text_size;extern const unsigned long kernel_total_size; unsigned long decompress_kernel(unsigned char *outbuf, unsigned long virt_addr,
drivers/firmware/efi/libstub/x86-stub.c +10 -1
@@ -227,6 +227,15 @@ efi_status_t efi_adjust_memory_range_pro rounded_end =roundup (start + size,EFI_PAGE_SIZE );if (memattr !=NULL ) { + status =efi_call_proto (memattr, set_memory_attributes, + rounded_start, + rounded_end - rounded_start, +EFI_MEMORY_RO ); +if (status !=EFI_SUCCESS ) { +efi_warn ("Failed to set EFI_MEMORY_RO attribute\n" ); +return status; + } + status = efi_call_proto(memattr, clear_memory_attributes, rounded_start, rounded_end - rounded_start,
@@ -778,7 +787,7 @@ static efi_status_t efi_decompress_kerne *kernel_entry = addr + entry; -return efi_adjust_memory_range_protection (addr, kernel_total_size); +return efi_adjust_memory_range_protection (addr, kernel_text_size); } static void __noreturn enter_kernel(unsigned long kernel_addr,
Greg Kroah-Hartman
maintainerPATCH 34/141 netfilter: nf_tables: Fix potential data-race in __nft_expr_type_get()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ziyang Xuan <[email protected]>
[ Upstream commit f969eb84ce482331a991079ab7a5c4dc3b7f89bf ]
nft_unregister_expr() can concurrent with __nft_expr_type_get(), and there is not any protection when iterate over nf_tables_expressions list in __nft_expr_type_get(). Therefore, there is potential data-race of nf_tables_expressions list entry.
Use list_for_each_entry_rcu() to iterate over nf_tables_expressions list in __nft_expr_type_get(), and use rcu_read_lock() in the caller nft_expr_type_get() to protect the entire type query process.
--- net/netfilter/nf_tables_api.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
net/netfilter/nf_tables_api.c +6 -2
@@ -2891,7 +2891,7 @@ static const struct nft_expr_type *__nft_expr_type_get(u8 family, {const struct nft_expr_type *type, *candidate =NULL ; -list_for_each_entry (type, &nf_tables_expressions, list) { +list_for_each_entry_rcu (type, &nf_tables_expressions, list) {if (!nla_strcmp (nla, type->name)) {if (!type->family && !candidate) candidate = type;
@@ -2923,9 +2923,13 @@ static const struct nft_expr_type *nft_expr_type_get(struct net *net,if (nla ==NULL )return ERR_PTR (-EINVAL ); +rcu_read_lock (); type =__nft_expr_type_get (family, nla); -if (type !=NULL &&try_module_get (type->owner)) +if (type !=NULL &&try_module_get (type->owner)) { +rcu_read_unlock ();return type; + } +rcu_read_unlock ();lockdep_nfnl_nft_mutex_not_held ();#ifdef CONFIG_MODULES
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 35/141 netfilter: nf_tables: Fix potential data-race in __nft_obj_type_get()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ziyang Xuan <[email protected]>
[ Upstream commit d78d867dcea69c328db30df665be5be7d0148484 ]
nft_unregister_obj() can concurrent with __nft_obj_type_get(), and there is not any protection when iterate over nf_tables_objects list in __nft_obj_type_get(). Therefore, there is potential data-race of nf_tables_objects list entry.
Use list_for_each_entry_rcu() to iterate over nf_tables_objects list in __nft_obj_type_get(), and use rcu_read_lock() in the caller nft_obj_type_get() to protect the entire type query process.
--- net/netfilter/nf_tables_api.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
net/netfilter/nf_tables_api.c +6 -2
@@ -7175,7 +7175,7 @@ static const struct nft_object_type *__nft_obj_type_get(u32 objtype, u8 family) {const struct nft_object_type *type; -list_for_each_entry (type, &nf_tables_objects, list) { +list_for_each_entry_rcu (type, &nf_tables_objects, list) {if (type->family !=NFPROTO_UNSPEC && type->family != family)continue ;
@@ -7191,9 +7191,13 @@ nft_obj_type_get(struct net *net, u32 objtype, u8 family) {const struct nft_object_type *type; +rcu_read_lock (); type =__nft_obj_type_get (objtype, family); -if (type !=NULL &&try_module_get (type->owner)) +if (type !=NULL &&try_module_get (type->owner)) { +rcu_read_unlock ();return type; + } +rcu_read_unlock ();lockdep_nfnl_nft_mutex_not_held ();#ifdef CONFIG_MODULES
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 36/141 netfilter: br_netfilter: skip conntrack input hook for promisc packets
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pablo Neira Ayuso <[email protected]>
[ Upstream commit 751de2012eafa4d46d8081056761fa0e9cc8a178 ]
For historical reasons, when bridge device is in promisc mode, packets that are directed to the taps follow bridge input hook path. This patch adds a workaround to reset conntrack for these packets.
Jianbo Liu reports warning splats in their test infrastructure where cloned packets reach the br_netfilter input hook to confirm the conntrack object.
Scratch one bit from BR_INPUT_SKB_CB to annotate that this packet has reached the input hook because it is passed up to the bridge device to reach the taps.
[ 57.571874] WARNING: CPU: 1 PID: 0 at net/bridge/br_netfilter_hooks.c:616 br_nf_local_in+0x157/0x180 [br_netfilter] [ 57.572749] Modules linked in: xt_MASQUERADE nf_conntrack_netlink nfnetlink iptable_nat xt_addrtype xt_conntrack nf_nat br_netfilter rpcsec_gss_krb5 auth_rpcgss oid_registry overlay rpcrdma rdma_ucm ib_iser libiscsi scsi_transport_isc si ib_umad rdma_cm ib_ipoib iw_cm ib_cm mlx5_ib ib_uverbs ib_core mlx5ctl mlx5_core [ 57.575158] CPU: 1 PID: 0 Comm: swapper/1 Not tainted 6.8.0+ #19 [ 57.575700] Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS rel-1.13.0-0-gf21b5a4aeb02-prebuilt.qemu.org 04/01/2014 [ 57.576662] RIP: 0010:br_nf_local_in+0x157/0x180 [br_netfilter] [ 57.577195] Code: fe ff ff 41 bd 04 00 00 00 be 04 00 00 00 e9 4a ff ff ff be 04 00 00 00 48 89 ef e8 f3 a9 3c e1 66 83 ad b4 00 00 00 04 eb 91 <0f> 0b e9 f1 fe ff ff 0f 0b e9 df fe ff ff 48 89 df e8 b3 53 47 e1 [ 57.578722] RSP: 0018:ffff88885f845a08 EFLAGS: 00010202 [ 57.579207] RAX: 0000000000000002 RBX: ffff88812dfe8000 RCX: 0000000000000000 [ 57.579830] RDX: ffff88885f845a60 RSI: ffff8881022dc300 RDI: 0000000000000000 [ 57.580454] RBP: ffff88885f845a60 R08: 0000000000000001 R09: 0000000000000003 [ 57.581076] R10: 00000000ffff1300 R11: 0000000000000002 R12: 0000000000000000 [ 57.581695] R13: ffff8881047ffe00 R14: ffff888108dbee00 R15: ffff88814519b800 [ 57.582313] FS: 0000000000000000(0000) GS:ffff88885f840000(0000) knlGS:0000000000000000 [ 57.583040] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 57.583564] CR2: 000000c4206aa000 CR3: 0000000103847001 CR4: 0000000000370eb0 [ 57.584194] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 [ 57.584820] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 [ 57.585440] Call Trace: [ 57.585721] <IRQ> [ 57.585976] ? __warn+0x7d/0x130 [ 57.586323] ? br_nf_local_in+0x157/0x180 [br_netfilter] [ 57.586811] ? report_bug+0xf1/0x1c0 [ 57.587177] ? handle_bug+0x3f/0x70 [ 57.587539] ? exc_invalid_op+0x13/0x60 [ 57.587929] ? asm_exc_invalid_op+0x16/0x20 [ 57.588336] ? br_nf_local_in+0x157/0x180 [br_netfilter] [ 57.588825] nf_hook_slow+0x3d/0xd0 [ 57.589188] ? br_handle_vlan+0x4b/0x110 [ 57.589579] br_pass_frame_up+0xfc/0x150 [ 57.589970] ? br_port_flags_change+0x40/0x40 [ 57.590396] br_handle_frame_finish+0x346/0x5e0 [ 57.590837] ? ipt_do_table+0x32e/0x430 [ 57.591221] ? br_handle_local_finish+0x20/0x20 [ 57.591656] br_nf_hook_thresh+0x4b/0xf0 [br_netfilter] [ 57.592286] ? br_handle_local_finish+0x20/0x20 [ 57.592802] br_nf_pre_routing_finish+0x178/0x480 [br_netfilter] [ 57.593348] ? br_handle_local_finish+0x20/0x20 [ 57.593782] ? nf_nat_ipv4_pre_routing+0x25/0x60 [nf_nat] [ 57.594279] br_nf_pre_routing+0x24c/0x550 [br_netfilter] [ 57.594780] ? br_nf_hook_thresh+0xf0/0xf0 [br_netfilter] [ 57.595280] br_handle_frame+0x1f3/0x3d0 [ 57.595676] ? br_handle_local_finish+0x20/0x20 [ 57.596118] ? br_handle_frame_finish+0x5e0/0x5e0 [ 57.596566] __netif_receive_skb_core+0x25b/0xfc0 [ 57.597017] ? __napi_build_skb+0x37/0x40 [ 57.597418] __netif_receive_skb_list_core+0xfb/0x220
--- net/bridge/br_input.c | 15 +++++++++++---- net/bridge/br_netfilter_hooks.c | 6 ++++++ net/bridge/br_private.h | 1 + net/bridge/netfilter/nf_conntrack_bridge.c | 14 ++++++++++---- 4 files changed, 28 insertions(+), 8 deletions(-)
net/bridge/br_input.c +11 -4
@@ -30,7 +30,7 @@ br_netif_receive_skb(struct net *net, struct sock *sk, struct sk_buff *skb)return netif_receive_skb (skb); } -static int br_pass_frame_up (struct sk_buff *skb) +static int br_pass_frame_up (struct sk_buff *skb,bool promisc) {struct net_device *indev, *brdev =BR_INPUT_SKB_CB (skb)->brdev;struct net_bridge *br =netdev_priv (brdev);
@@ -65,6 +65,8 @@ static int br_pass_frame_up(struct sk_buff *skb)br_multicast_count (br,NULL , skb,br_multicast_igmp_type (skb),BR_MCAST_DIR_TX ); +BR_INPUT_SKB_CB (skb)->promisc = promisc; +return NF_HOOK (NFPROTO_BRIDGE ,NF_BR_LOCAL_IN ,dev_net (indev),NULL , skb, indev,NULL , br_netif_receive_skb);
@@ -82,6 +84,7 @@ int br_handle_frame_finish(struct net *net, struct sock *sk, struct sk_buff *skbstruct net_bridge_mcast *brmctx;struct net_bridge_vlan *vlan;struct net_bridge *br; +bool promisc;u16 vid =0 ;u8 state;
@@ -120,7 +123,9 @@ int br_handle_frame_finish(struct net *net, struct sock *sk, struct sk_buff *skbif (p->flags &BR_LEARNING )br_fdb_update (br, p,eth_hdr (skb)->h_source, vid,0 ); - local_rcv = !!(br->dev->flags &IFF_PROMISC ); + promisc = !!(br->dev->flags &IFF_PROMISC ); + local_rcv = promisc; +if (is_multicast_ether_addr (eth_hdr (skb)->h_dest)) {/* by definition the broadcast is also a multicast address */ if (is_broadcast_ether_addr (eth_hdr (skb)->h_dest)) {
@@ -183,7 +188,7 @@ int br_handle_frame_finish(struct net *net, struct sock *sk, struct sk_buff *skbunsigned long now = jiffies;if (test_bit (BR_FDB_LOCAL , &dst->flags)) -return br_pass_frame_up (skb); +return br_pass_frame_up (skb, false);if (now != dst->used) dst->used = now;
@@ -196,7 +201,7 @@ int br_handle_frame_finish(struct net *net, struct sock *sk, struct sk_buff *skb }if (local_rcv) -return br_pass_frame_up (skb); +return br_pass_frame_up (skb, promisc); out:return 0 ;
@@ -368,6 +373,8 @@ static rx_handler_result_t br_handle_frame(struct sk_buff **pskb) goto forward; } +BR_INPUT_SKB_CB (skb)->promisc = false; +/* The else clause should be hit when nf_hook(): * - returns < 0 (drop/error) * - returns = 0 (stolen/nf_queue)
net/bridge/br_netfilter_hooks.c +6 -0
@@ -600,11 +600,17 @@ static unsigned int br_nf_local_in(void *priv,struct sk_buff *skb, const struct nf_hook_state *state) { + bool promisc = BR_INPUT_SKB_CB(skb)->promisc;struct nf_conntrack *nfct =skb_nfct (skb);const struct nf_ct_hook *ct_hook;struct nf_conn *ct;int ret; +if (promisc) { +nf_reset_ct (skb); +return NF_ACCEPT ; + } +if (!nfct || skb->pkt_type ==PACKET_HOST )return NF_ACCEPT ;
net/bridge/br_private.h +1 -0
@@ -559,6 +559,7 @@ struct br_input_skb_cb {#endif u8 proxyarp_replied:1; u8 src_port_isolated:1; + u8 promisc:1;#ifdef CONFIG_BRIDGE_VLAN_FILTERING u8 vlan_filtered:1;#endif
net/bridge/netfilter/nf_conntrack_bridge.c +10 -4
@@ -294,18 +294,24 @@ static unsigned int nf_ct_bridge_pre(void *priv, struct sk_buff *skb,static unsigned int nf_ct_bridge_in (void *priv,struct sk_buff *skb,const struct nf_hook_state *state) { -enum ip_conntrack_info ctinfo; +bool promisc =BR_INPUT_SKB_CB (skb)->promisc; +struct nf_conntrack *nfct =skb_nfct (skb);struct nf_conn *ct; -if (skb->pkt_type ==PACKET_HOST ) +if (promisc) { +nf_reset_ct (skb); +return NF_ACCEPT ; + } + +if (!nfct || skb->pkt_type ==PACKET_HOST )return NF_ACCEPT ;/* nf_conntrack_confirm() cannot handle concurrent clones, * this happens for broad/multicast frames with e.g. macvlan on top * of the bridge device. */ - ct =nf_ct_get (skb, &ctinfo); -if (!ct ||nf_ct_is_confirmed (ct) ||nf_ct_is_template (ct)) + ct = container_of(nfct, struct nf_conn, ct_general); +if (nf_ct_is_confirmed (ct) ||nf_ct_is_template (ct))return NF_ACCEPT ;/* let inet prerouting call conntrack again */
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 37/141 netfilter: nft_set_pipapo: do not free live element
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Florian Westphal <[email protected]>
[ Upstream commit 3cfc9ec039af60dbd8965ae085b2c2ccdcfbe1cc ]
Pablo reports a crash with large batches of elements with a back-to-back add/remove pattern. Quoting Pablo:
add_elem("00000000") timeout 100 ms
...
add_elem("0000000X") timeout 100 ms
del_elem("0000000X") <---------------- delete one that was just added
...
add_elem("00005000") timeout 100 ms
1) nft_pipapo_remove() removes element 0000000X
Then, KASAN shows a splat.
Looking at the remove function there is a chance that we will drop a rule that maps to a non-deactivated element.
Removal happens in two steps, first we do a lookup for key k and return the to-be-removed element and mark it as inactive in the next generation. Then, in a second step, the element gets removed from the set/map.
The _remove function does not work correctly if we have more than one element that share the same key.
This can happen if we insert an element into a set when the set already holds an element with same key, but the element mapping to the existing key has timed out or is not active in the next generation.
In such case its possible that removal will unmap the wrong element. If this happens, we will leak the non-deactivated element, it becomes unreachable.
The element that got deactivated (and will be freed later) will remain reachable in the set data structure, this can result in a crash when such an element is retrieved during lookup (stale pointer).
Add a check that the fully matching key does in fact map to the element that we have marked as inactive in the deactivation step.
If not, we need to continue searching.
Add a bug/warn trap at the end of the function as well, the remove function must not ever be called with an invisible/unreachable/non-existent element.
v2: avoid uneeded temporary variable (Stefano)
--- net/netfilter/nft_set_pipapo.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-)
net/netfilter/nft_set_pipapo.c +9 -5
@@ -1994,6 +1994,8 @@ static void nft_pipapo_remove(const struct net *net, const struct nft_set *set, rules_fx = rules_f0;nft_pipapo_for_each_field (f, i, m) { +bool last = i == m->field_count -1 ; +if (!pipapo_match_field (f, start, rules_fx, match_start, match_end))break ;
@@ -2006,16 +2008,18 @@ static void nft_pipapo_remove(const struct net *net, const struct nft_set *set, match_start +=NFT_PIPAPO_GROUPS_PADDED_SIZE (f); match_end +=NFT_PIPAPO_GROUPS_PADDED_SIZE (f); - } -if (i == m->field_count) { - priv->dirty = true; -pipapo_drop (m, rulemap); -return ; +if (last && f->mt[rulemap[i].to].e == e) { + priv->dirty = true; +pipapo_drop (m, rulemap); +return ; + } } first_rule += rules_f0; } + +WARN_ON_ONCE (1 );/* elem_priv not found */ }/**
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 38/141 netfilter: flowtable: validate pppoe header
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pablo Neira Ayuso <[email protected]>
[ Upstream commit 87b3593bed1868b2d9fe096c01bcdf0ea86cbebf ]
Ensure there is sufficient room to access the protocol field of the PPPoe header. Validate it once before the flowtable lookup, then use a helper function to access protocol field.
--- include/net/netfilter/nf_flow_table.h | 12 +++++++++++- net/netfilter/nf_flow_table_inet.c | 3 ++- net/netfilter/nf_flow_table_ip.c | 8 +++++--- 3 files changed, 18 insertions(+), 5 deletions(-)
include/net/netfilter/nf_flow_table.h +11 -1
@@ -335,7 +335,7 @@ int nf_flow_rule_route_ipv6(struct net *net, struct flow_offload *flow,int nf_flow_table_offload_init (void );void nf_flow_table_offload_exit (void ); -static inline __be16 nf_flow_pppoe_proto (const struct sk_buff *skb) +static inline __be16 __nf_flow_pppoe_proto (const struct sk_buff *skb) {__be16 proto;
@@ -351,6 +351,16 @@ static inline __be16 nf_flow_pppoe_proto(const struct sk_buff *skb)return 0 ; } +static inline bool nf_flow_pppoe_proto (struct sk_buff *skb,__be16 *inner_proto) +{ +if (!pskb_may_pull (skb,PPPOE_SES_HLEN )) +return false; + + *inner_proto =__nf_flow_pppoe_proto (skb); + +return true; +} +#define NF_FLOW_TABLE_STAT_INC (net, count) __this_cpu_inc((net)->ft.stat->count)#define NF_FLOW_TABLE_STAT_DEC (net, count) __this_cpu_dec((net)->ft.stat->count)#define NF_FLOW_TABLE_STAT_INC_ATOMIC (net, count) \
net/netfilter/nf_flow_table_inet.c +2 -1
@@ -21,7 +21,8 @@ nf_flow_offload_inet_hook(void *priv, struct sk_buff *skb, proto = veth->h_vlan_encapsulated_proto;break ;case htons (ETH_P_PPP_SES ): - proto =nf_flow_pppoe_proto (skb); +if (!nf_flow_pppoe_proto (skb, &proto)) +return NF_ACCEPT ;break ;default : proto = skb->protocol;
net/netfilter/nf_flow_table_ip.c +5 -3
@@ -267,10 +267,11 @@ static unsigned int nf_flow_xmit_xfrm(struct sk_buff *skb,return NF_STOLEN ; } -static bool nf_flow_skb_encap_protocol (const struct sk_buff *skb,__be16 proto, +static bool nf_flow_skb_encap_protocol (struct sk_buff *skb,__be16 proto,u32 *offset) {struct vlan_ethhdr *veth; +__be16 inner_proto;switch (skb->protocol) {case htons (ETH_P_8021Q ):
@@ -281,7 +282,8 @@ static bool nf_flow_skb_encap_protocol(const struct sk_buff *skb, __be16 proto, }break ;case htons (ETH_P_PPP_SES ): -if (nf_flow_pppoe_proto (skb) == proto) { +if (nf_flow_pppoe_proto (skb, &inner_proto) && + inner_proto == proto) { *offset +=PPPOE_SES_HLEN ;return true; }
@@ -310,7 +312,7 @@ static void nf_flow_encap_pop(struct sk_buff *skb,skb_reset_network_header (skb);break ;case htons (ETH_P_PPP_SES ): - skb->protocol =nf_flow_pppoe_proto (skb); + skb->protocol =__nf_flow_pppoe_proto (skb);skb_pull (skb,PPPOE_SES_HLEN );skb_reset_network_header (skb);break ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 39/141 netfilter: flowtable: incorrect pppoe tuple
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pablo Neira Ayuso <[email protected]>
[ Upstream commit 6db5dc7b351b9569940cd1cf445e237c42cd6d27 ]
pppoe traffic reaching ingress path does not match the flowtable entry because the pppoe header is expected to be at the network header offset. This bug causes a mismatch in the flow table lookup, so pppoe packets enter the classical forwarding path.
--- net/netfilter/nf_flow_table_ip.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/netfilter/nf_flow_table_ip.c +1 -1
@@ -156,7 +156,7 @@ static void nf_flow_tuple_encap(struct sk_buff *skb, tuple->encap[i].proto = skb->protocol;break ;case htons (ETH_P_PPP_SES ): - phdr = (struct pppoe_hdr *)skb_mac_header (skb); + phdr = (struct pppoe_hdr *)skb_network_header (skb); tuple->encap[i].id =ntohs (phdr->sid); tuple->encap[i].proto = skb->protocol;break ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 40/141 af_unix: Call manage_oob() for every skb in unix_stream_read_generic().
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kuniyuki Iwashima <[email protected]>
[ Upstream commit 283454c8a123072e5c386a5a2b5fc576aa455b6f ]
When we call recv() for AF_UNIX socket, we first peek one skb and calls manage_oob() to check if the skb is sent with MSG_OOB.
However, when we fetch the next (and the following) skb, manage_oob() is not called now, leading a wrong behaviour.
Let's say a socket send()s "hello" with MSG_OOB and the peer tries to recv() 5 bytes with MSG_PEEK. Here, we should get only "hell" without 'o', but actually not:
Quoted 3 lines
Quoted 3 lines
Quoted 3 lines
from socket import *
c1, c2 =socketpair(AF_UNIX, SOCK_STREAM)c1.send(b'hello', MSG_OOB)
5
Quoted 1 line
Quoted 1 line
Quoted 1 line
c2.recv(5, MSG_PEEK)
b'hello'
The first skb fills 4 bytes, and the next skb is peeked but not properly checked by manage_oob().
Let's move up the again label to call manage_oob() for evry skb.
With this patch:
Quoted 3 lines
Quoted 3 lines
Quoted 3 lines
from socket import *
c1, c2 =socketpair(AF_UNIX, SOCK_STREAM)c1.send(b'hello', MSG_OOB)
5
Quoted 1 line
Quoted 1 line
Quoted 1 line
c2.recv(5, MSG_PEEK)
b'hell'
--- net/unix/af_unix.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/unix/af_unix.c +1 -1
@@ -2753,6 +2753,7 @@ static int unix_stream_read_generic(struct unix_stream_read_state *state, last = skb =skb_peek (&sk->sk_receive_queue); last_len = last ? last->len :0 ; +again:#if IS_ENABLED (CONFIG_AF_UNIX_OOB )if (skb) { skb =manage_oob (skb, sk, flags, copied);
@@ -2764,7 +2765,6 @@ static int unix_stream_read_generic(struct unix_stream_read_state *state, } }#endif -again:if (skb ==NULL ) {if (copied >= target) goto unlock;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 41/141 af_unix: Dont peek OOB data without MSG_OOB.
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kuniyuki Iwashima <[email protected]>
[ Upstream commit 22dd70eb2c3d754862964377a75abafd3167346b ]
Currently, we can read OOB data without MSG_OOB by using MSG_PEEK when OOB data is sitting on the front row, which is apparently wrong.
Quoted 3 lines
Quoted 3 lines
Quoted 3 lines
from socket import *
c1, c2 =socketpair(AF_UNIX, SOCK_STREAM)c1.send(b'a', MSG_OOB)
1
Quoted 1 line
Quoted 1 line
Quoted 1 line
c2.recv(1, MSG_PEEK | MSG_DONTWAIT)
b'a'
If manage_oob() is called when no data has been copied, we only check if the socket enables SO_OOBINLINE or MSG_PEEK is not used. Otherwise, the skb is returned as is.
However, here we should return NULL if MSG_PEEK is set and no data has been copied.
Also, in such a case, we should not jump to the redo label because we will be caught in the loop and hog the CPU until normal data comes in.
Then, we need to handle skb == NULL case with the if-clause below the manage_oob() block.
With this patch:
Quoted 3 lines
Quoted 3 lines
Quoted 3 lines
from socket import *
c1, c2 =socketpair(AF_UNIX, SOCK_STREAM)c1.send(b'a', MSG_OOB)
1
Quoted 1 line
Quoted 1 line
Quoted 1 line
c2.recv(1, MSG_PEEK | MSG_DONTWAIT)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
BlockingIOError: [Errno 11] Resource temporarily unavailable
--- net/unix/af_unix.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
net/unix/af_unix.c +5 -5
@@ -2675,7 +2675,9 @@ static struct sk_buff *manage_oob(struct sk_buff *skb, struct sock *sk,WRITE_ONCE (u->oob_skb,NULL );consume_skb (skb); } - }else if (!(flags &MSG_PEEK )) { + }else if (flags &MSG_PEEK ) { + skb =NULL ; + }else {skb_unlink (skb, &sk->sk_receive_queue);WRITE_ONCE (u->oob_skb,NULL );if (!WARN_ON_ONCE (skb_unref (skb)))
@@ -2757,11 +2759,9 @@ static int unix_stream_read_generic(struct unix_stream_read_state *state,#if IS_ENABLED (CONFIG_AF_UNIX_OOB )if (skb) { skb =manage_oob (skb, sk, flags, copied); -if (!skb) { +if (!skb && copied) {unix_state_unlock (sk); -if (copied) -break ; - goto redo; +break ; } }#endif
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 42/141 net/mlx5: Lag, restore buckets number to default after hash LAG deactivation
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shay Drory <[email protected]>
[ Upstream commit 37cc10da3a50e6d0cb9808a90b7da9b4868794dd ]
The cited patch introduces the concept of buckets in LAG in hash mode. However, the patch doesn't clear the number of buckets in the LAG deactivation. This results in using the wrong number of buckets in case user create a hash mode LAG and afterwards create a non-hash mode LAG.
Hence, restore buckets number to default after hash mode LAG deactivation.
--- drivers/net/ethernet/mellanox/mlx5/core/lag/lag.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/net/ethernet/mellanox/mlx5/core/lag/lag.c +3 -1
@@ -679,8 +679,10 @@ static int mlx5_deactivate_lag(struct mlx5_lag *ldev)return err; } -if (test_bit (MLX5_LAG_MODE_FLAG_HASH_BASED , &flags)) +if (test_bit (MLX5_LAG_MODE_FLAG_HASH_BASED , &flags)) {mlx5_lag_port_sel_destroy (ldev); + ldev->buckets =1 ; + }if (mlx5_lag_has_drop_rule (ldev))mlx5_lag_drop_rule_cleanup (ldev);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 43/141 net/mlx5e: Prevent deadlock while disabling aRFS
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Carolina Jubran <[email protected]>
[ Upstream commit fef965764cf562f28afb997b626fc7c3cec99693 ]
When disabling aRFS under the priv->state_lock, any scheduled aRFS works are canceled using the cancel_work_sync function, which waits for the work to end if it has already started. However, while waiting for the work handler, the handler will try to acquire the state_lock which is already acquired.
The worker acquires the lock to delete the rules if the state is down, which is not the worker's responsibility since disabling aRFS deletes the rules.
Add an aRFS state variable, which indicates whether the aRFS is enabled and prevent adding rules when the aRFS is disabled.
Kernel log:
======================================================
WARNING: possible circular locking dependency detected
6.7.0-rc4_net_next_mlx5_5483eb2 #1 Tainted: G I
------------------------------------------------------
ethtool/386089 is trying to acquire lock:ffff88810f21ce68 ((work_completion)(&rule->arfs_work)){+.+.}-{0:0}, at: __flush_work+0x74/0x4e0
but task is already holding lock:ffff8884a1808cc0 (&priv->state_lock){+.+.}-{3:3}, at: mlx5e_ethtool_set_channels+0x53/0x200 [mlx5_core]
which lock already depends on the new lock.
the existing dependency chain (in reverse order) is:
-> #1 (&priv->state_lock){+.+.}-{3:3}:
__mutex_lock+0x80/0xc90
arfs_handle_work+0x4b/0x3b0 [mlx5_core]
process_one_work+0x1dc/0x4a0
worker_thread+0x1bf/0x3c0
kthread+0xd7/0x100
ret_from_fork+0x2d/0x50
ret_from_fork_asm+0x11/0x20-> #0 ((work_completion)(&rule->arfs_work)){+.+.}-{0:0}:
__lock_acquire+0x17b4/0x2c80
lock_acquire+0xd0/0x2b0
__flush_work+0x7a/0x4e0
__cancel_work_timer+0x131/0x1c0
arfs_del_rules+0x143/0x1e0 [mlx5_core]
mlx5e_arfs_disable+0x1b/0x30 [mlx5_core]
mlx5e_ethtool_set_channels+0xcb/0x200 [mlx5_core]
ethnl_set_channels+0x28f/0x3b0
ethnl_default_set_doit+0xec/0x240
genl_family_rcv_msg_doit+0xd0/0x120
genl_rcv_msg+0x188/0x2c0
netlink_rcv_skb+0x54/0x100
genl_rcv+0x24/0x40
netlink_unicast+0x1a1/0x270
netlink_sendmsg+0x214/0x460
__sock_sendmsg+0x38/0x60
__sys_sendto+0x113/0x170
__x64_sys_sendto+0x20/0x30
do_syscall_64+0x40/0xe0
entry_SYSCALL_64_after_hwframe+0x46/0x4eother info that might help us debug this:
Possible unsafe locking scenario:
CPU0 CPU1
---- ----
lock(&priv->state_lock);
lock((work_completion)(&rule->arfs_work));
lock(&priv->state_lock);lock((work_completion)(&rule->arfs_work));
*** DEADLOCK ***
3 locks held by ethtool/386089:
#0: ffffffff82ea7210 (cb_lock){++++}-{3:3}, at: genl_rcv+0x15/0x40
#1: ffffffff82e94c88 (rtnl_mutex){+.+.}-{3:3}, at: ethnl_default_set_doit+0xd3/0x240
#2: ffff8884a1808cc0 (&priv->state_lock){+.+.}-{3:3}, at: mlx5e_ethtool_set_channels+0x53/0x200 [mlx5_core]
stack backtrace: CPU: 15 PID: 386089 Comm: ethtool Tainted: G I 6.7.0-rc4_net_next_mlx5_5483eb2 #1 Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS rel-1.13.0-0-gf21b5a4aeb02-prebuilt.qemu.org 04/01/2014 Call Trace: <TASK> dump_stack_lvl+0x60/0xa0 check_noncircular+0x144/0x160 __lock_acquire+0x17b4/0x2c80 lock_acquire+0xd0/0x2b0 ? __flush_work+0x74/0x4e0 ? save_trace+0x3e/0x360 ? __flush_work+0x74/0x4e0 __flush_work+0x7a/0x4e0 ? __flush_work+0x74/0x4e0 ? __lock_acquire+0xa78/0x2c80 ? lock_acquire+0xd0/0x2b0 ? mark_held_locks+0x49/0x70 __cancel_work_timer+0x131/0x1c0 ? mark_held_locks+0x49/0x70 arfs_del_rules+0x143/0x1e0 [mlx5_core] mlx5e_arfs_disable+0x1b/0x30 [mlx5_core] mlx5e_ethtool_set_channels+0xcb/0x200 [mlx5_core] ethnl_set_channels+0x28f/0x3b0 ethnl_default_set_doit+0xec/0x240 genl_family_rcv_msg_doit+0xd0/0x120 genl_rcv_msg+0x188/0x2c0 ? ethnl_ops_begin+0xb0/0xb0 ? genl_family_rcv_msg_dumpit+0xf0/0xf0 netlink_rcv_skb+0x54/0x100 genl_rcv+0x24/0x40 netlink_unicast+0x1a1/0x270 netlink_sendmsg+0x214/0x460 __sock_sendmsg+0x38/0x60 __sys_sendto+0x113/0x170 ? do_user_addr_fault+0x53f/0x8f0 __x64_sys_sendto+0x20/0x30 do_syscall_64+0x40/0xe0 entry_SYSCALL_64_after_hwframe+0x46/0x4e </TASK>
--- .../net/ethernet/mellanox/mlx5/core/en_arfs.c | 27 +++++++++++-------- 1 file changed, 16 insertions(+), 11 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/en_arfs.c +16 -11
@@ -45,6 +45,10 @@ struct arfs_table {struct hlist_head rules_hash[ARFS_HASH_SIZE ]; }; +enum { +MLX5E_ARFS_STATE_ENABLED , +}; +enum arfs_type {ARFS_IPV4_TCP ,ARFS_IPV6_TCP ,
@@ -60,6 +64,7 @@ struct mlx5e_arfs_tables {struct list_head rules;int last_filter_id;struct workqueue_struct *wq; +unsigned long state; };struct arfs_tuple {
@@ -170,6 +175,8 @@ int mlx5e_arfs_enable(struct mlx5e_flow_steering *fs)return err; } } +set_bit (MLX5E_ARFS_STATE_ENABLED , &arfs->state); +return 0 ; }
@@ -454,6 +461,8 @@ static void arfs_del_rules(struct mlx5e_flow_steering *fs)int i;int j; +clear_bit (MLX5E_ARFS_STATE_ENABLED , &arfs->state); +spin_lock_bh (&arfs->arfs_lock);mlx5e_for_each_arfs_rule (rule, htmp, arfs->arfs_tables, i, j) {hlist_del_init (&rule->hlist);
@@ -621,17 +630,8 @@ static void arfs_handle_work(struct work_struct *work)struct mlx5_flow_handle *rule; arfs =mlx5e_fs_get_arfs (priv->fs); -mutex_lock (&priv->state_lock); -if (!test_bit (MLX5E_STATE_OPENED , &priv->state)) { -spin_lock_bh (&arfs->arfs_lock); -hlist_del (&arfs_rule->hlist); -spin_unlock_bh (&arfs->arfs_lock); - -mutex_unlock (&priv->state_lock); -kfree (arfs_rule); - goto out; - } -mutex_unlock (&priv->state_lock); +if (!test_bit (MLX5E_ARFS_STATE_ENABLED , &arfs->state)) +return ;if (!arfs_rule->rule) { rule =arfs_add_rule (priv, arfs_rule);
@@ -744,6 +744,11 @@ int mlx5e_rx_flow_steer(struct net_device *dev, const struct sk_buff *skb,return -EPROTONOSUPPORT ;spin_lock_bh (&arfs->arfs_lock); +if (!test_bit (MLX5E_ARFS_STATE_ENABLED , &arfs->state)) { +spin_unlock_bh (&arfs->arfs_lock); +return -EPERM ; + } + arfs_rule =arfs_find_rule (arfs_t, &fk);if (arfs_rule) {if (arfs_rule->rxq == rxq_index) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 44/141 ice: tc: allow zero flags in parsing tc flower
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michal Swiatkowski <[email protected]>
[ Upstream commit 73278715725a8347032acf233082ca4eb31e6a56 ]
The check for flags is done to not pass empty lookups to adding switch rule functions. Since metadata is always added to lookups there is no need to check against the flag.
It is also fixing the problem with such rule:
$ tc filter add dev gtp_dev ingress protocol ip prio 0 flower \ enc_dst_port 2123 action drop Switch block in case of GTP can't parse the destination port, because it should always be set to GTP specific value. The same with ethertype. The result is that there is no other matching criteria than GTP tunnel. In this case flags is 0, rule can't be added only because of defensive check against flags.
--- drivers/net/ethernet/intel/ice/ice_tc_lib.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/intel/ice/ice_tc_lib.c +1 -1
@@ -663,7 +663,7 @@ ice_eswitch_add_tc_fltr(struct ice_vsi *vsi, struct ice_tc_flower_fltr *fltr)int ret;int i; -if (!flags || (flags &ICE_TC_FLWR_FIELD_ENC_SRC_L4_PORT )) { +if (flags &ICE_TC_FLWR_FIELD_ENC_SRC_L4_PORT ) {NL_SET_ERR_MSG_MOD (fltr->extack,"Unsupported encap field(s)" );return -EOPNOTSUPP ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 45/141 tun: limit printing rate when illegal packet received by tun dev
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lei Chen <[email protected]>
[ Upstream commit f8bbc07ac535593139c875ffa19af924b1084540 ]
vhost_worker will call tun call backs to receive packets. If too many illegal packets arrives, tun_do_read will keep dumping packet contents. When console is enabled, it will costs much more cpu time to dump packet and soft lockup will be detected.
net_ratelimit mechanism can be used to limit the dumping rate.
PID: 33036 TASK: ffff949da6f20000 CPU: 23 COMMAND: "vhost-32980"
#0 [fffffe00003fce50] crash_nmi_callback at ffffffff89249253 #1 [fffffe00003fce58] nmi_handle at ffffffff89225fa3 #2 [fffffe00003fceb0] default_do_nmi at ffffffff8922642e #3 [fffffe00003fced0] do_nmi at ffffffff8922660d #4 [fffffe00003fcef0] end_repeat_nmi at ffffffff89c01663
[exception RIP: io_serial_in+20]
RIP: ffffffff89792594 RSP: ffffa655314979e8 RFLAGS: 00000002
RAX: ffffffff89792500 RBX: ffffffff8af428a0 RCX: 0000000000000000
RDX: 00000000000003fd RSI: 0000000000000005 RDI: ffffffff8af428a0
RBP: 0000000000002710 R8: 0000000000000004 R9: 000000000000000f
R10: 0000000000000000 R11: ffffffff8acbf64f R12: 0000000000000020
R13: ffffffff8acbf698 R14: 0000000000000058 R15: 0000000000000000
ORIG_RAX: ffffffffffffffff CS: 0010 SS: 0018 #5 [ffffa655314979e8] io_serial_in at ffffffff89792594
#6 [ffffa655314979e8] wait_for_xmitr at ffffffff89793470 #7 [ffffa65531497a08] serial8250_console_putchar at ffffffff897934f6 #8 [ffffa65531497a20] uart_console_write at ffffffff8978b605 #9 [ffffa65531497a48] serial8250_console_write at ffffffff89796558 #10 [ffffa65531497ac8] console_unlock at ffffffff89316124 #11 [ffffa65531497b10] vprintk_emit at ffffffff89317c07 #12 [ffffa65531497b68] printk at ffffffff89318306
#13 [ffffa65531497bc8] print_hex_dump at ffffffff89650765 #14 [ffffa65531497ca8] tun_do_read at ffffffffc0b06c27 [tun] #15 [ffffa65531497d38] tun_recvmsg at ffffffffc0b06e34 [tun] #16 [ffffa65531497d68] handle_rx at ffffffffc0c5d682 [vhost_net] #17 [ffffa65531497ed0] vhost_worker at ffffffffc0c644dc [vhost] #18 [ffffa65531497f10] kthread at ffffffff892d2e72
#19 [ffffa65531497f50] ret_from_fork at ffffffff89c0022f
--- drivers/net/tun.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-)
drivers/net/tun.c +10 -8
@@ -2121,14 +2121,16 @@ static ssize_t tun_put_user(struct tun_struct *tun, tun_is_little_endian(tun), true, vlan_hlen)) {struct skb_shared_info *sinfo =skb_shinfo (skb); -pr_err ("unexpected GSO type: " -"0x%x, gso_size %d, hdr_len %d\n" , - sinfo->gso_type,tun16_to_cpu (tun, gso.gso_size), -tun16_to_cpu (tun, gso.hdr_len)); -print_hex_dump (KERN_ERR ,"tun: " , -DUMP_PREFIX_NONE , -16 ,1 , skb->head, -min ((int )tun16_to_cpu (tun, gso.hdr_len),64 ), true); + +if (net_ratelimit ()) { +netdev_err (tun->dev,"unexpected GSO type: 0x%x, gso_size %d, hdr_len %d\n" , + sinfo->gso_type,tun16_to_cpu (tun, gso.gso_size), +tun16_to_cpu (tun, gso.hdr_len)); +print_hex_dump (KERN_ERR ,"tun: " , +DUMP_PREFIX_NONE , +16 ,1 , skb->head, +min ((int )tun16_to_cpu (tun, gso.hdr_len),64 ), true); + }WARN_ON_ONCE (1 );return -EINVAL ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 46/141 net: dsa: mt7530: fix mirroring frames received on local port
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arınç ÜNAL <[email protected]>
[ Upstream commit d59cf049c8378677053703e724808836f180888e ]
This switch intellectual property provides a bit on the ARL global control register which controls allowing mirroring frames which are received on the local port (monitor port). This bit is unset after reset.
This ability must be enabled to fully support the port mirroring feature on this switch intellectual property.
Therefore, this patch fixes the traffic not being reflected on a port, which would be configured like below:
tc qdisc add dev swp0 clsact
tc filter add dev swp0 ingress matchall skip_sw \
action mirred egress mirror dev swp0
As a side note, this configuration provides the hairpinning feature for a single port.
--- drivers/net/dsa/mt7530.c | 6 ++++++ drivers/net/dsa/mt7530.h | 4 ++++ 2 files changed, 10 insertions(+)
drivers/net/dsa/mt7530.c +6 -0
@@ -2461,6 +2461,9 @@ mt7530_setup(struct dsa_switch *ds) PVC_EG_TAG(MT7530_VLAN_EG_CONSISTENT)); } +/* Allow mirroring frames received on the local port (monitor port). */ +mt7530_set (priv,MT753X_AGC ,LOCAL_EN ); +/* Setup VLAN ID 0 for VLAN-unaware bridges */ ret =mt7530_setup_vlan0 (priv);if (ret)
@@ -2577,6 +2580,9 @@ mt7531_setup_common(struct dsa_switch *ds) PVC_EG_TAG(MT7530_VLAN_EG_CONSISTENT)); } +/* Allow mirroring frames received on the local port (monitor port). */ +mt7530_set (priv,MT753X_AGC ,LOCAL_EN ); +/* Flush the FDB table */ ret =mt7530_fdb_cmd (priv,MT7530_FDB_FLUSH ,NULL );if (ret <0 )
drivers/net/dsa/mt7530.h +4 -0
@@ -31,6 +31,10 @@ enum mt753x_id {#define SYSC_REG_RSTCTRL 0x34#define RESET_MCM BIT(2) +/* Register for ARL global control */ +#define MT753X_AGC 0xc +#define LOCAL_EN BIT(7) +/* Registers to mac forward control for unknown frames */ #define MT7530_MFC 0x10#define BC_FFP (x) (((x) & 0xff) << 24)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 47/141 net: ethernet: ti: am65-cpsw-nuss: cleanup DMA Channels before using them
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Siddharth Vadapalli <[email protected]>
[ Upstream commit c24cd679b075b0e953ea167b0aa2b2d59e4eba7f ]
The TX and RX DMA Channels used by the driver to exchange data with CPSW are not guaranteed to be in a clean state during driver initialization. The Bootloader could have used the same DMA Channels without cleaning them up in the event of failure. Thus, reset and disable the DMA Channels to ensure that they are in a clean state before using them.
--- drivers/net/ethernet/ti/am65-cpsw-nuss.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+)
drivers/net/ethernet/ti/am65-cpsw-nuss.c +18 -0
@@ -2549,6 +2549,8 @@ static void am65_cpsw_unregister_devlink(struct am65_cpsw_common *common)static int am65_cpsw_nuss_register_ndevs (struct am65_cpsw_common *common) { +struct am65_cpsw_rx_chn *rx_chan = &common->rx_chns; +struct am65_cpsw_tx_chn *tx_chan = common->tx_chns;struct device *dev = common->dev;struct devlink_port *dl_port;struct am65_cpsw_port *port;
@@ -2567,6 +2569,22 @@ static int am65_cpsw_nuss_register_ndevs(struct am65_cpsw_common *common)return ret; } +/* The DMA Channels are not guaranteed to be in a clean state. +* Reset and disable them to ensure that they are back to the +* clean state and ready to be used. +*/ +for (i =0 ; i < common->tx_ch_num; i++) { +k3_udma_glue_reset_tx_chn (tx_chan[i].tx_chn, &tx_chan[i], + am65_cpsw_nuss_tx_cleanup); +k3_udma_glue_disable_tx_chn (tx_chan[i].tx_chn); + } + +for (i =0 ; i <AM65_CPSW_MAX_RX_FLOWS ; i++) +k3_udma_glue_reset_rx_chn (rx_chan->rx_chn, i, rx_chan, + am65_cpsw_nuss_rx_cleanup, !!i); + +k3_udma_glue_disable_rx_chn (rx_chan->rx_chn); + ret =am65_cpsw_nuss_register_devlink (common);if (ret)return ret;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 48/141 RDMA/rxe: Fix the problem "mutex_destroy missing"
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yanjun.Zhu <[email protected]>
[ Upstream commit 481047d7e8391d3842ae59025806531cdad710d9 ]
When a mutex lock is not used any more, the function mutex_destroy should be called to mark the mutex lock uninitialized.
--- drivers/infiniband/sw/rxe/rxe.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/infiniband/sw/rxe/rxe.c +2 -0
@@ -33,6 +33,8 @@ void rxe_dealloc(struct ib_device *ib_dev)if (rxe->tfm)crypto_free_shash (rxe->tfm); + +mutex_destroy (&rxe->usdev_lock); }/* initialize rxe device parameters */
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 49/141 RDMA/cm: Print the old state when cm_destroy_id gets timeout
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mark Zhang <[email protected]>
[ Upstream commit b68e1acb5834ed1a2ad42d9d002815a8bae7c0b6 ]
The old state is helpful for debugging, as the current state is always IB_CM_IDLE when timeout happens.
--- drivers/infiniband/core/cm.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-)
drivers/infiniband/core/cm.c +7 -4
@@ -1026,23 +1026,26 @@ static void cm_reset_to_idle(struct cm_id_private *cm_id_priv) } } -static noinline void cm_destroy_id_wait_timeout(struct ib_cm_id *cm_id) +static noinline void cm_destroy_id_wait_timeout(struct ib_cm_id *cm_id, +enum ib_cm_state old_state) {struct cm_id_private *cm_id_priv; cm_id_priv = container_of(cm_id, struct cm_id_private, id); -pr_err ("%s: cm_id=%p timed out. state=%d refcnt=%d\n" , __func__, - cm_id, cm_id->state,refcount_read (&cm_id_priv->refcount)); +pr_err ("%s: cm_id=%p timed out. state %d -> %d, refcnt=%d\n" , __func__, + cm_id, old_state, cm_id->state,refcount_read (&cm_id_priv->refcount)); }static void cm_destroy_id (struct ib_cm_id *cm_id,int err) {struct cm_id_private *cm_id_priv; +enum ib_cm_state old_state;struct cm_work *work;int ret; cm_id_priv = container_of(cm_id, struct cm_id_private, id);spin_lock_irq (&cm_id_priv->lock); + old_state = cm_id->state; retest:switch (cm_id->state) {case IB_CM_LISTEN :
@@ -1151,7 +1154,7 @@ static void cm_destroy_id(struct ib_cm_id *cm_id, int err)msecs_to_jiffies ( CM_DESTROY_ID_WAIT_TIMEOUT));if (!ret)/* timeout happened */ -cm_destroy_id_wait_timeout (cm_id); +cm_destroy_id_wait_timeout (cm_id, old_state); }while (!ret);while ((work =cm_dequeue_work (cm_id_priv)) !=NULL )
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 50/141 RDMA/mlx5: Fix port number for counter query in multi-port configuration
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael Guralnik <[email protected]>
[ Upstream commit be121ffb384f53e966ee7299ffccc6eeb61bc73d ]
Set the correct port when querying PPCNT in multi-port configuration. Distinguish between cases where switchdev mode was enabled to multi-port configuration and don't overwrite the queried port to 1 in multi-port case.
--- drivers/infiniband/hw/mlx5/mad.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/infiniband/hw/mlx5/mad.c +2 -1
@@ -188,7 +188,8 @@ static int process_pma_cmd(struct mlx5_ib_dev *dev, u32 port_num, mdev = dev->mdev; mdev_port_num =1 ; } -if (MLX5_CAP_GEN (dev->mdev, num_ports) ==1 ) { +if (MLX5_CAP_GEN (dev->mdev, num_ports) ==1 && + !mlx5_core_mp_enabled (mdev)) {/* set local port to one for Function-Per-Port HCA. */ mdev = dev->mdev; mdev_port_num =1 ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 51/141 s390/qdio: handle deferred cc1
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peter Oberparleiter <[email protected]>
[ Upstream commit 607638faf2ff1cede37458111496e7cc6c977f6f ]
A deferred condition code 1 response indicates that I/O was not started and should be retried. The current QDIO implementation handles a cc1 response as I/O error, resulting in a failed QDIO setup. This can happen for example when a path verification request arrives at the same time as QDIO setup I/O is started.
Fix this by retrying the QDIO setup I/O when a cc1 response is received.
Note that since
commit 2297791c92d0 ("s390/cio: dont unregister subchannel from child-drivers") commit 5ef1dc40ffa6 ("s390/cio: fix invalid -EBUSY on ccw_device_start")
deferred cc1 responses are much more likely to occur. See the commit message of the latter for more background information.
--- drivers/s390/cio/qdio_main.c | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-)
drivers/s390/cio/qdio_main.c +23 -5
@@ -722,8 +722,8 @@ static void qdio_handle_activate_check(struct qdio_irq *irq_ptr,lgr_info_log (); } -static void qdio_establish_handle_irq (struct qdio_irq *irq_ptr,int cstat, -int dstat) +static int qdio_establish_handle_irq (struct qdio_irq *irq_ptr,int cstat, +int dstat,int dcc) {DBF_DEV_EVENT (DBF_INFO , irq_ptr,"qest irq" );
@@ -731,15 +731,18 @@ static void qdio_establish_handle_irq(struct qdio_irq *irq_ptr, int cstat, goto error;if (dstat & ~(DEV_STAT_DEV_END |DEV_STAT_CHN_END )) goto error; +if (dcc ==1 ) +return -EAGAIN ;if (!(dstat &DEV_STAT_DEV_END )) goto error;qdio_set_state (irq_ptr,QDIO_IRQ_STATE_ESTABLISHED ); -return ; +return 0 ; error:DBF_ERROR ("%4x EQ:error" , irq_ptr->schid.sch_no);DBF_ERROR ("ds: %2x cs:%2x" , dstat, cstat);qdio_set_state (irq_ptr,QDIO_IRQ_STATE_ERR ); +return -EIO ; }/* qdio interrupt handler */
@@ -748,7 +751,7 @@ void qdio_int_handler(struct ccw_device *cdev, unsigned long intparm, {struct qdio_irq *irq_ptr = cdev->private->qdio_data;struct subchannel_id schid; -int cstat, dstat; +int cstat, dstat, rc, dcc;if (!intparm || !irq_ptr) {ccw_device_get_schid (cdev, &schid);
@@ -768,10 +771,12 @@ void qdio_int_handler(struct ccw_device *cdev, unsigned long intparm,qdio_irq_check_sense (irq_ptr, irb); cstat = irb->scsw.cmd.cstat; dstat = irb->scsw.cmd.dstat; + dcc =scsw_cmd_is_valid_cc (&irb->scsw) ? irb->scsw.cmd.cc :0 ; + rc =0 ;switch (irq_ptr->state) {case QDIO_IRQ_STATE_INACTIVE : -qdio_establish_handle_irq (irq_ptr, cstat, dstat); + rc =qdio_establish_handle_irq (irq_ptr, cstat, dstat, dcc);break ;case QDIO_IRQ_STATE_CLEANUP :qdio_set_state (irq_ptr,QDIO_IRQ_STATE_INACTIVE );
@@ -785,12 +790,25 @@ void qdio_int_handler(struct ccw_device *cdev, unsigned long intparm,if (cstat || dstat)qdio_handle_activate_check (irq_ptr, intparm, cstat, dstat); +else if (dcc ==1 ) + rc = -EAGAIN ;break ;case QDIO_IRQ_STATE_STOPPED :break ;default :WARN_ON_ONCE (1 ); } + +if (rc == -EAGAIN ) { +DBF_DEV_EVENT (DBF_INFO , irq_ptr,"qint retry" ); + rc =ccw_device_start (cdev, irq_ptr->ccw, intparm,0 ,0 ); +if (!rc) +return ; +DBF_ERROR ("%4x RETRY ERR" , irq_ptr->schid.sch_no); +DBF_ERROR ("rc:%4x" , rc); +qdio_set_state (irq_ptr,QDIO_IRQ_STATE_ERR ); + } +wake_up (&cdev->private->wait_q); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 52/141 s390/cio: fix race condition during online processing
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peter Oberparleiter <[email protected]>
[ Upstream commit 2d8527f2f911fab84aec04df4788c0c23af3df48 ]
A race condition exists in ccw_device_set_online() that can cause the online process to fail, leaving the affected device in an inconsistent state. As a result, subsequent attempts to set that device online fail with return code ENODEV.
The problem occurs when a path verification request arrives after a wait for final device state completed, but before the result state is evaluated.
Fix this by ensuring that the CCW-device lock is held between determining final state and checking result state.
Note that since:
commit 2297791c92d0 ("s390/cio: dont unregister subchannel from child-drivers")
path verification requests are much more likely to occur during boot, resulting in an increased chance of this race condition occurring.
--- drivers/s390/cio/device.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-)
drivers/s390/cio/device.c +8 -5
@@ -360,10 +360,8 @@ int ccw_device_set_online(struct ccw_device *cdev)spin_lock_irq (cdev->ccwlock); ret =ccw_device_online (cdev); -spin_unlock_irq (cdev->ccwlock); -if (ret ==0 ) -wait_event (cdev->private->wait_q,dev_fsm_final_state (cdev)); -else { +if (ret) { +spin_unlock_irq (cdev->ccwlock); CIO_MSG_EVENT(0, "ccw_device_online returned %d, " "device 0.%x.%04x\n", ret, cdev->private->dev_id.ssid,
@@ -372,7 +370,12 @@ int ccw_device_set_online(struct ccw_device *cdev)put_device (&cdev->dev);return ret; } -spin_lock_irq (cdev->ccwlock); +/* Wait until a final state is reached */ +while (!dev_fsm_final_state (cdev)) { +spin_unlock_irq (cdev->ccwlock); +wait_event (cdev->private->wait_q,dev_fsm_final_state (cdev)); +spin_lock_irq (cdev->ccwlock); + }/* Check if online processing was successful */ if ((cdev->private->state !=DEV_STATE_ONLINE ) && (cdev->private->state !=DEV_STATE_W4SENSE )) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 53/141 drm: nv04: Fix out of bounds access
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mikhail Kobuk <[email protected]>
[ Upstream commit cf92bb778eda7830e79452c6917efa8474a30c1e ]
When Output Resource (dcb->or) value is assigned in fabricate_dcb_output(), there may be out of bounds access to dac_users array in case dcb->or is zero because ffs(dcb->or) is used as index there.
The 'or' argument of fabricate_dcb_output() must be interpreted as a number of bit to set, not value.
Utilize macros from 'enum nouveau_or' in calls instead of hardcoding.
Found by Linux Verification Center (linuxtesting.org) with SVACE.
--- drivers/gpu/drm/nouveau/nouveau_bios.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-)
drivers/gpu/drm/nouveau/nouveau_bios.c +7 -6
@@ -23,6 +23,7 @@*/ #include "nouveau_drv.h" +#include "nouveau_bios.h" #include "nouveau_reg.h" #include "dispnv04/hw.h" #include "nouveau_encoder.h"
@@ -1675,7 +1676,7 @@ apply_dcb_encoder_quirks(struct drm_device *dev, int idx, u32 *conn, u32 *conf)*/ if (nv_match_device (dev,0x0201 ,0x1462 ,0x8851 )) {if (*conn ==0xf2005014 && *conf ==0xffffffff ) { -fabricate_dcb_output (dcb,DCB_OUTPUT_TMDS ,1 ,1 ,1 ); +fabricate_dcb_output (dcb,DCB_OUTPUT_TMDS ,1 ,1 ,DCB_OUTPUT_B );return false; } }
@@ -1761,26 +1762,26 @@ fabricate_dcb_encoder_table(struct drm_device *dev, struct nvbios *bios)#ifdef __powerpc__/* Apple iMac G4 NV17 */ if (of_machine_is_compatible ("PowerMac4,5" )) { -fabricate_dcb_output (dcb,DCB_OUTPUT_TMDS ,0 , all_heads,1 ); -fabricate_dcb_output (dcb,DCB_OUTPUT_ANALOG ,1 , all_heads,2 ); +fabricate_dcb_output (dcb,DCB_OUTPUT_TMDS ,0 , all_heads,DCB_OUTPUT_B ); +fabricate_dcb_output (dcb,DCB_OUTPUT_ANALOG ,1 , all_heads,DCB_OUTPUT_C );return ; }#endif /* Make up some sane defaults */ fabricate_dcb_output (dcb,DCB_OUTPUT_ANALOG , - bios->legacy.i2c_indices.crt,1 ,1 ); + bios->legacy.i2c_indices.crt,1 ,DCB_OUTPUT_B );if (nv04_tv_identify (dev, bios->legacy.i2c_indices.tv) >=0 )fabricate_dcb_output (dcb,DCB_OUTPUT_TV , bios->legacy.i2c_indices.tv, - all_heads,0 ); + all_heads,DCB_OUTPUT_A );else if (bios->tmds.output0_script_ptr || bios->tmds.output1_script_ptr)fabricate_dcb_output (dcb,DCB_OUTPUT_TMDS , bios->legacy.i2c_indices.panel, - all_heads,1 ); + all_heads,DCB_OUTPUT_B ); } static int
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 54/141 drm/panel: visionox-rm69299: dont unregister DSI device
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Baryshkov <[email protected]>
[ Upstream commit 9e4d3f4f34455abbaa9930bf6b7575a5cd081496 ]
The DSI device for the panel was registered by the DSI host, so it is an error to unregister it from the panel driver. Drop the call to mipi_dsi_device_unregister().
--- drivers/gpu/drm/panel/panel-visionox-rm69299.c | 2 -- 1 file changed, 2 deletions(-)
drivers/gpu/drm/panel/panel-visionox-rm69299.c +0 -2
@@ -261,8 +261,6 @@ static void visionox_rm69299_remove(struct mipi_dsi_device *dsi)struct visionox_rm69299 *ctx =mipi_dsi_get_drvdata (dsi);mipi_dsi_detach (ctx->dsi); -mipi_dsi_device_unregister (ctx->dsi); -drm_panel_remove (&ctx->panel); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 55/141 ARM: omap2: n8x0: stop instantiating codec platform data
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Torokhov <[email protected]>
[ Upstream commit faf3b5cb59f84e4056bd84f115a958bc99c61e65 ]
As of 0426370b58b2 ("ARM: dts: omap2420-n810: Correct the audio codec (tlv320aic33) node") the DTS properly specifies reset GPIO, and the device name in auxdata lookup table does not even match the one in device tree anymore, so stop instantiating it.
--- arch/arm/mach-omap2/board-n8x0.c | 5 ----- arch/arm/mach-omap2/common-board-devices.h | 2 -- arch/arm/mach-omap2/pdata-quirks.c | 1 - 3 files changed, 8 deletions(-)
arch/arm/mach-omap2/board-n8x0.c +0 -5
@@ -22,7 +22,6 @@#include <linux/platform_data/spi-omap2-mcspi.h> #include <linux/platform_data/mmc-omap.h> #include <linux/mfd/menelaus.h> -#include <sound/tlv320aic3x.h> #include <asm/mach/arch.h> #include <asm/mach-types.h>
@@ -567,10 +566,6 @@ struct menelaus_platform_data n8x0_menelaus_platform_data = { .late_init = n8x0_menelaus_late_init, }; -struct aic3x_pdata n810_aic33_data = { - .gpio_reset =118 , -}; -static int __init n8x0_late_initcall (void ) {if (!board_caps)
arch/arm/mach-omap2/common-board-devices.h +0 -2
@@ -2,12 +2,10 @@#ifndef __OMAP_COMMON_BOARD_DEVICES__#define __OMAP_COMMON_BOARD_DEVICES__ -#include <sound/tlv320aic3x.h> #include <linux/mfd/menelaus.h> void *n8x0_legacy_init (void );extern struct menelaus_platform_data n8x0_menelaus_platform_data; -extern struct aic3x_pdata n810_aic33_data;#endif /* __OMAP_COMMON_BOARD_DEVICES__ */
arch/arm/mach-omap2/pdata-quirks.c +0 -1
@@ -440,7 +440,6 @@ static struct of_dev_auxdata omap_auxdata_lookup[] = {#ifdef CONFIG_MACH_NOKIA_N8X0 OF_DEV_AUXDATA("ti,omap2420-mmc", 0x4809c000, "mmci-omap.0", NULL), OF_DEV_AUXDATA("menelaus", 0x72, "1-0072", &n8x0_menelaus_platform_data), -OF_DEV_AUXDATA ("tlv320aic3x" ,0x18 ,"2-0018" , &n810_aic33_data),#endif #ifdef CONFIG_ARCH_OMAP3 OF_DEV_AUXDATA("ti,omap2-iommu", 0x5d000000, "5d000000.mmu",
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 56/141 ARM: OMAP2+: pdata-quirks: stop including wl12xx.h
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Torokhov <[email protected]>
[ Upstream commit e14e4c933e0047653f835e30d7d740ebb2a530cc ]
As of commit 2398c41d6432 ("omap: pdata-quirks: remove openpandora quirks for mmc3 and wl1251") the code no longer creates an instance of wl1251_platform_data, so there is no need for including this header.
--- arch/arm/mach-omap2/pdata-quirks.c | 1 - 1 file changed, 1 deletion(-)
arch/arm/mach-omap2/pdata-quirks.c +0 -1
@@ -10,7 +10,6 @@#include <linux/init.h> #include <linux/kernel.h> #include <linux/of_platform.h> -#include <linux/wl12xx.h> #include <linux/mmc/card.h> #include <linux/mmc/host.h> #include <linux/power/smartreflex.h>
Signature · 1 line
2.43.0
Re: [PATCH 6.1 056/141] ARM: OMAP2+: pdata-quirks: stop including wl12xx.h
Quoted 2 lines · Greg Kroah-Hartman
6.1-stable review patch. If anyone has any objections, please let me know.
But why?
Greg, if you ask for a stable review of a patch that has not been explicitly tagged for stable shouldn't it be on you to provide justification why you believe it is needed in stable? Does it fix a grave bug? A regression? Users need it to make their new hardware be recognized?
Quoted 35 lines
------------------
From: Dmitry Torokhov <[email protected]>
[ Upstream commit
e14e4c933e0047653f835e30d7d740ebb2a530cc]As of commit
2398c41d6432("omap: pdata-quirks: remove openpandora quirks for mmc3 and wl1251") the code no longer creates an instance ofwl1251_platform_data, so there is no need for including this header.Signed-off-by Dmitry Torokhov <[email protected]>Acked-by Tony Lindgren <[email protected]>Signed-off-by Kalle Valo <[email protected]>Signed-off-by Sasha Levin <[email protected]>--- arch/arm/mach-omap2/pdata-quirks.c | 1 - 1 file changed, 1 deletion(-)arch/arm/mach-omap2/pdata-quirks.c +0
-1@@ -10,7 +10,6 @@#include <linux/init.h> #include <linux/kernel.h> #include <linux/of_platform.h> -#include <linux/wl12xx.h> #include <linux/mmc/card.h> #include <linux/mmc/host.h> #include <linux/power/smartreflex.h> Signature · 1 line
2.43.0
Thanks.
Signature · 1 line
Dmitry
Greg Kroah-Hartman
maintainerRe: [PATCH 6.1 056/141] ARM: OMAP2+: pdata-quirks: stop including wl12xx.h
Quoted 11 lines · Dmitry Torokhov
Quoted 2 lines · Greg Kroah-Hartman
6.1-stable review patch. If anyone has any objections, please let me know.
But why?
Greg, if you ask for a stable review of a patch that has not been explicitly tagged for stable shouldn't it be on you to provide justification why you believe it is needed in stable? Does it fix a grave bug? A regression? Users need it to make their new hardware be recognized?
Nope, now dropped, thanks for noticing it.
greg k-h
Greg Kroah-Hartman
maintainerPATCH 57/141 PCI: Avoid FLR for SolidRun SNET DPU rev 1
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alvaro Karsz <[email protected]>
[ Upstream commit d089d69cc1f824936eeaa4fa172f8fa1a0949eaa ]
This patch fixes a FLR bug on the SNET DPU rev 1 by setting the PCI_DEV_FLAGS_NO_FLR_RESET flag.
As there is a quirk to avoid FLR (quirk_no_flr), I added a new quirk to check the rev ID before calling to quirk_no_flr.
Without this patch, a SNET DPU rev 1 may hang when FLR is applied.
Message-Id: <[email protected]>
--- drivers/pci/quirks.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/pci/quirks.c +8 -0
@@ -5403,6 +5403,14 @@ DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_AMD, 0x7901, quirk_no_flr);DECLARE_PCI_FIXUP_EARLY (PCI_VENDOR_ID_INTEL ,0x1502 , quirk_no_flr);DECLARE_PCI_FIXUP_EARLY (PCI_VENDOR_ID_INTEL ,0x1503 , quirk_no_flr); +/* FLR may cause the SolidRun SNET DPU (rev 0x1) to hang */ +static void quirk_no_flr_snet (struct pci_dev *dev) +{ +if (dev->revision ==0x1 ) +quirk_no_flr (dev); +} +DECLARE_PCI_FIXUP_EARLY (PCI_VENDOR_ID_SOLIDRUN ,0x1000 , quirk_no_flr_snet); +static void quirk_no_ext_tags (struct pci_dev *pdev) {struct pci_host_bridge *bridge =pci_find_host_bridge (pdev->bus);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 58/141 HID: kye: Sort kye devices
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Yang <[email protected]>
[ Upstream commit 8c7b79bc04abb67e7f5864e94286a800b42aa96c ]
Sort kye devices by their Produce IDs.
--- drivers/hid/hid-ids.h | 2 +- drivers/hid/hid-kye.c | 62 ++++++++++++++++++++-------------------- drivers/hid/hid-quirks.c | 6 ++-- 3 files changed, 35 insertions(+), 35 deletions(-)
drivers/hid/hid-ids.h +1 -1
@@ -717,10 +717,10 @@#define USB_DEVICE_ID_KYE_GPEN_560 0x5003#define USB_DEVICE_ID_KYE_EASYPEN_I405X 0x5010#define USB_DEVICE_ID_KYE_MOUSEPEN_I608X 0x5011 -#define USB_DEVICE_ID_KYE_MOUSEPEN_I608X_V2 0x501a#define USB_DEVICE_ID_KYE_EASYPEN_M610X 0x5013#define USB_DEVICE_ID_KYE_PENSKETCH_M912 0x5015#define USB_DEVICE_ID_KYE_EASYPEN_M406XE 0x5019 +#define USB_DEVICE_ID_KYE_MOUSEPEN_I608X_V2 0x501A#define USB_VENDOR_ID_LABTEC 0x1020#define USB_DEVICE_ID_LABTEC_WIRELESS_KEYBOARD 0x0006
drivers/hid/hid-kye.c +31 -31
104 lines not on this page · raw message
drivers/hid/hid-quirks.c +3 -3
@@ -107,12 +107,12 @@ static const struct hid_device_id hid_quirks[] = { { HID_USB_DEVICE(USB_VENDOR_ID_HP, USB_PRODUCT_ID_HP_PIXART_OEM_USB_OPTICAL_MOUSE_1f4a), HID_QUIRK_ALWAYS_POLL }, { HID_USB_DEVICE(USB_VENDOR_ID_IDEACOM, USB_DEVICE_ID_IDEACOM_IDC6680), HID_QUIRK_MULTI_INPUT }, { HID_USB_DEVICE(USB_VENDOR_ID_INNOMEDIA, USB_DEVICE_ID_INNEX_GENESIS_ATARI), HID_QUIRK_MULTI_INPUT }, - { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_M610X), HID_QUIRK_MULTI_INPUT }, + { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_PIXART_USB_OPTICAL_MOUSE_ID2), HID_QUIRK_ALWAYS_POLL }, { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_MOUSEPEN_I608X), HID_QUIRK_MULTI_INPUT }, - { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_MOUSEPEN_I608X_V2), HID_QUIRK_MULTI_INPUT }, + { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_M610X), HID_QUIRK_MULTI_INPUT }, { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_PENSKETCH_M912), HID_QUIRK_MULTI_INPUT }, { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_M406XE), HID_QUIRK_MULTI_INPUT }, - { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_PIXART_USB_OPTICAL_MOUSE_ID2), HID_QUIRK_ALWAYS_POLL }, + { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_MOUSEPEN_I608X_V2), HID_QUIRK_MULTI_INPUT }, { HID_USB_DEVICE(USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_OPTICAL_USB_MOUSE_600E), HID_QUIRK_ALWAYS_POLL }, { HID_USB_DEVICE(USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_PIXART_USB_MOUSE_608D), HID_QUIRK_ALWAYS_POLL }, { HID_USB_DEVICE(USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_PIXART_USB_MOUSE_6019), HID_QUIRK_ALWAYS_POLL },
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 59/141 usb: pci-quirks: Reduce the length of a spinlock section in usb_amd_find_chipset_info()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christophe JAILLET <[email protected]>
[ Upstream commit c03ff66dc0e0cbad9ed0c29500843e1da8533118 ]
'info' is local to the function. There is no need to zeroing it within a spin_lock section. Moreover, there is no need to explicitly initialize the .need_pll_quirk field.
Initialize the structure when defined and remove the now useless memset().
--- drivers/usb/host/pci-quirks.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
drivers/usb/host/pci-quirks.c +1 -3
@@ -207,8 +207,7 @@ EXPORT_SYMBOL_GPL(sb800_prefetch);static void usb_amd_find_chipset_info (void ) {unsigned long flags; -struct amd_chipset_info info; - info.need_pll_quirk = false; +struct amd_chipset_info info = { };spin_lock_irqsave (&amd_lock, flags);
@@ -218,7 +217,6 @@ static void usb_amd_find_chipset_info(void)spin_unlock_irqrestore (&amd_lock, flags);return ; } -memset (&info,0 ,sizeof (info));spin_unlock_irqrestore (&amd_lock, flags);if (!amd_chipset_sb_type_init (&info)) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 60/141 PCI: Delay after FLR of Solidigm P44 Pro NVMe
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mike Pastore <[email protected]>
[ Upstream commit 0ac448e0d29d6ba978684b3fa2e3ac7294ec2475 ]
Prevent KVM hang when a Solidgm P44 Pro NVMe is passed through to a guest via IOMMU and the guest is subsequently rebooted.
A similar issue was identified and patched by 51ba09452d11 ("PCI: Delay after FLR of Intel DC P3700 NVMe") and the same fix can be applied for this case. (Intel spun off their NAND and SSD business as Solidigm and sold it to SK Hynix in late 2021.)
--- drivers/pci/quirks.c | 10 ++++++---- include/linux/pci_ids.h | 2 ++ 2 files changed, 8 insertions(+), 4 deletions(-)
drivers/pci/quirks.c +6 -4
@@ -4011,10 +4011,11 @@ static int nvme_disable_and_flr(struct pci_dev *dev, bool probe) }/* -* Intel DC P3700 NVMe controller will timeout waiting for ready status -* to change after NVMe enable if the driver starts interacting with the -* device too soon after FLR. A 250ms delay after FLR has heuristically -* proven to produce reliably working results for device assignment cases. +* Some NVMe controllers such as Intel DC P3700 and Solidigm P44 Pro will +* timeout waiting for ready status to change after NVMe enable if the driver +* starts interacting with the device too soon after FLR. A 250ms delay after +* FLR has heuristically proven to produce reliably working results for device +* assignment cases. */ static int delay_250ms_after_flr (struct pci_dev *dev,bool probe) {
@@ -4101,6 +4102,7 @@ static const struct pci_dev_reset_methods pci_dev_reset_methods[] = { { PCI_VENDOR_ID_SAMSUNG, 0xa804, nvme_disable_and_flr }, { PCI_VENDOR_ID_INTEL, 0x0953, delay_250ms_after_flr }, { PCI_VENDOR_ID_INTEL, 0x0a54, delay_250ms_after_flr }, + { PCI_VENDOR_ID_SOLIDIGM, 0xf1ac, delay_250ms_after_flr }, { PCI_VENDOR_ID_CHELSIO, PCI_ANY_ID, reset_chelsio_generic_dev }, { PCI_VENDOR_ID_HUAWEI, PCI_DEVICE_ID_HINIC_VF,
include/linux/pci_ids.h +2 -0
@@ -158,6 +158,8 @@#define PCI_VENDOR_ID_LOONGSON 0x0014 +#define PCI_VENDOR_ID_SOLIDIGM 0x025e +#define PCI_VENDOR_ID_TTTECH 0x0357#define PCI_DEVICE_ID_TTTECH_MC322 0x000a
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 61/141 x86/quirks: Include linux/pnp.h for arch_pnpbios_disabled()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arnd Bergmann <[email protected]>
[ Upstream commit 056b44a4d10907ec8153863b2a0564e808ef1440 ]
arch_pnpbios_disabled() is defined in architecture code on x86, but this does not include the appropriate header, causing a warning:
arch/x86/kernel/platform-quirks.c:42:13: error: no previous prototype for 'arch_pnpbios_disabled' [-Werror=missing-prototypes]
--- arch/x86/kernel/platform-quirks.c | 1 + 1 file changed, 1 insertion(+)
arch/x86/kernel/platform-quirks.c +1 -0
@@ -1,6 +1,7 @@// SPDX-License-Identifier: GPL-2.0 #include <linux/kernel.h> #include <linux/init.h> +#include <linux/pnp.h> #include <asm/setup.h> #include <asm/bios_ebda.h>
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 62/141 thunderbolt: Log function name of the called quirk
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mika Westerberg <[email protected]>
[ Upstream commit f14d177e0be652ef7b265753f08f2a7d31935668 ]
This is useful when debugging whether a quirk has been matched or not.
--- drivers/thunderbolt/quirks.c | 1 + 1 file changed, 1 insertion(+)
drivers/thunderbolt/quirks.c +1 -0
@@ -130,6 +130,7 @@ void tb_check_quirks(struct tb_switch *sw)if (q->device && q->device != sw->device)continue ; +tb_sw_dbg (sw,"running %ps\n" , q->hook); q->hook (sw); } }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 63/141 thunderbolt: Add debug log for link controller power quirk
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mika Westerberg <[email protected]>
[ Upstream commit ccdb0900a0c3b0b56af5f547cceb64ee8d09483f ]
Add a debug log to this quirk as well so we can see what quirks have been applied when debugging.
--- drivers/thunderbolt/quirks.c | 1 + 1 file changed, 1 insertion(+)
drivers/thunderbolt/quirks.c +1 -0
@@ -10,6 +10,7 @@static void quirk_force_power_link (struct tb_switch *sw) { sw->quirks |=QUIRK_FORCE_POWER_LINK_CONTROLLER ; +tb_sw_dbg (sw,"forcing power to link controller\n" ); }static void quirk_dp_credit_allocation (struct tb_switch *sw)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 64/141 PCI: Execute quirk_enable_clear_retrain_link() earlier
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Maciej W. Rozycki <[email protected]>
[ Upstream commit 07a8d698de50c4740ac6f709c43e23a6da6e4dbc ]
Make quirk_enable_clear_retrain_link() an early quirk so that any later fixups can rely on dev->clear_retrain_link to have been already initialised.
[bhelgaas: reorder to just before it becomes possible to call pcie_retrain_link() earlier]
--- drivers/pci/quirks.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/pci/quirks.c +3 -3
@@ -2425,9 +2425,9 @@ static void quirk_enable_clear_retrain_link(struct pci_dev *dev) dev->clear_retrain_link =1 ;pci_info (dev,"Enable PCIe Retrain Link quirk\n" ); } -DECLARE_PCI_FIXUP_HEADER (PCI_VENDOR_ID_PERICOM ,0xe110 , quirk_enable_clear_retrain_link); -DECLARE_PCI_FIXUP_HEADER (PCI_VENDOR_ID_PERICOM ,0xe111 , quirk_enable_clear_retrain_link); -DECLARE_PCI_FIXUP_HEADER (PCI_VENDOR_ID_PERICOM ,0xe130 , quirk_enable_clear_retrain_link); +DECLARE_PCI_FIXUP_EARLY (PCI_VENDOR_ID_PERICOM ,0xe110 , quirk_enable_clear_retrain_link); +DECLARE_PCI_FIXUP_EARLY (PCI_VENDOR_ID_PERICOM ,0xe111 , quirk_enable_clear_retrain_link); +DECLARE_PCI_FIXUP_EARLY (PCI_VENDOR_ID_PERICOM ,0xe130 , quirk_enable_clear_retrain_link);static void fixup_rev1_53c810 (struct pci_dev *dev) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 65/141 PCI: Make quirk using inw() depend on HAS_IOPORT
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Niklas Schnelle <[email protected]>
[ Upstream commit f768c75d61582b011962f9dcb9ff8eafb8da0383 ]
In the future inw() and friends will not be compiled on architectures without I/O port support.
--- drivers/pci/quirks.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/pci/quirks.c +2 -0
@@ -268,6 +268,7 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_NEC, PCI_DEVICE_ID_NEC_CBUS_2, quirk_isa_dDECLARE_PCI_FIXUP_FINAL (PCI_VENDOR_ID_NEC ,PCI_DEVICE_ID_NEC_CBUS_3 , quirk_isa_dma_hangs);#endif +#ifdef CONFIG_HAS_IOPORT /* * Intel NM10 "TigerPoint" LPC PM1a_STS.BM_STS must be clear * for some HT machines to use C4 w/o hanging.
@@ -287,6 +288,7 @@ static void quirk_tigerpoint_bm_sts(struct pci_dev *dev) } }DECLARE_PCI_FIXUP_HEADER (PCI_VENDOR_ID_INTEL ,PCI_DEVICE_ID_INTEL_TGP_LPC , quirk_tigerpoint_bm_sts); +#endif /* Chipsets where PCI->PCI transfers vanish or hang */ static void quirk_nopcipci (struct pci_dev *dev)
Signature · 1 line
2.43.0
Re: [PATCH 6.1 065/141] PCI: Make quirk using inw() depend on HAS_IOPORT
Quoted 11 lines · Greg Kroah-Hartman
6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Niklas Schnelle <[email protected]>
[ Upstream commit
f768c75d61582b011962f9dcb9ff8eafb8da0383]In the future
inw()and friends will not be compiled on architectures without I/O port support.
This was only a preparation patch for a coming change, and it depends on commit fcbfe8121a45 ("Kconfig: introduce HAS_IOPORT option and select it as necessary"), which was not in 6.1.
I don't think we want to backport fcbfe8121a45 or any of the HAS_IOPORT changes after it.
Arnd
Greg Kroah-Hartman
maintainerRe: [PATCH 6.1 065/141] PCI: Make quirk using inw() depend on HAS_IOPORT
Quoted 13 lines · Arnd Bergmann
Quoted 11 lines · Greg Kroah-Hartman
6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Niklas Schnelle <[email protected]>
[ Upstream commit
f768c75d61582b011962f9dcb9ff8eafb8da0383]In the future
inw()and friends will not be compiled on architectures without I/O port support.
Quoted 6 lines
This was only a preparation patch for a coming change, and it depends on commit
fcbfe8121a45("Kconfig: introduceHAS_IOPORToption and select it as necessary"), which was not in 6.1.I don't think we want to backport
fcbfe8121a45or any of theHAS_IOPORTchanges after it.
Agreed, now dropped, thanks.
greg k-h
Greg Kroah-Hartman
maintainerPATCH 66/141 PCI: switchtec: Use normal comment style
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kelvin Cao <[email protected]>
[ Upstream commit 846691f5483d61259db2f4d6a3dce8b98d518794 ]
Use normal comment style '/* */' for device ID description.
Stable-dep-of: 0fb53e64705a ("PCI: switchtec: Add support for PCIe Gen5 devices")
--- drivers/pci/switch/switchtec.c | 114 ++++++++++++++++----------------- 1 file changed, 57 insertions(+), 57 deletions(-)
drivers/pci/switch/switchtec.c +57 -57
@@ -1740,63 +1740,63 @@ static void switchtec_pci_remove(struct pci_dev *pdev) }static const struct pci_device_id switchtec_pci_tbl[] = { -SWITCHTEC_PCI_DEVICE (0x8531 ,SWITCHTEC_GEN3 ),//PFX 24xG3 -SWITCHTEC_PCI_DEVICE (0x8532 ,SWITCHTEC_GEN3 ),//PFX 32xG3 -SWITCHTEC_PCI_DEVICE (0x8533 ,SWITCHTEC_GEN3 ),//PFX 48xG3 -SWITCHTEC_PCI_DEVICE (0x8534 ,SWITCHTEC_GEN3 ),//PFX 64xG3 -SWITCHTEC_PCI_DEVICE (0x8535 ,SWITCHTEC_GEN3 ),//PFX 80xG3 -SWITCHTEC_PCI_DEVICE (0x8536 ,SWITCHTEC_GEN3 ),//PFX 96xG3 -SWITCHTEC_PCI_DEVICE (0x8541 ,SWITCHTEC_GEN3 ),//PSX 24xG3 -SWITCHTEC_PCI_DEVICE (0x8542 ,SWITCHTEC_GEN3 ),//PSX 32xG3 -SWITCHTEC_PCI_DEVICE (0x8543 ,SWITCHTEC_GEN3 ),//PSX 48xG3 -SWITCHTEC_PCI_DEVICE (0x8544 ,SWITCHTEC_GEN3 ),//PSX 64xG3 -SWITCHTEC_PCI_DEVICE (0x8545 ,SWITCHTEC_GEN3 ),//PSX 80xG3 -SWITCHTEC_PCI_DEVICE (0x8546 ,SWITCHTEC_GEN3 ),//PSX 96xG3 -SWITCHTEC_PCI_DEVICE (0x8551 ,SWITCHTEC_GEN3 ),//PAX 24XG3 -SWITCHTEC_PCI_DEVICE (0x8552 ,SWITCHTEC_GEN3 ),//PAX 32XG3 -SWITCHTEC_PCI_DEVICE (0x8553 ,SWITCHTEC_GEN3 ),//PAX 48XG3 -SWITCHTEC_PCI_DEVICE (0x8554 ,SWITCHTEC_GEN3 ),//PAX 64XG3 -SWITCHTEC_PCI_DEVICE (0x8555 ,SWITCHTEC_GEN3 ),//PAX 80XG3 -SWITCHTEC_PCI_DEVICE (0x8556 ,SWITCHTEC_GEN3 ),//PAX 96XG3 -SWITCHTEC_PCI_DEVICE (0x8561 ,SWITCHTEC_GEN3 ),//PFXL 24XG3 -SWITCHTEC_PCI_DEVICE (0x8562 ,SWITCHTEC_GEN3 ),//PFXL 32XG3 -SWITCHTEC_PCI_DEVICE (0x8563 ,SWITCHTEC_GEN3 ),//PFXL 48XG3 -SWITCHTEC_PCI_DEVICE (0x8564 ,SWITCHTEC_GEN3 ),//PFXL 64XG3 -SWITCHTEC_PCI_DEVICE (0x8565 ,SWITCHTEC_GEN3 ),//PFXL 80XG3 -SWITCHTEC_PCI_DEVICE (0x8566 ,SWITCHTEC_GEN3 ),//PFXL 96XG3 -SWITCHTEC_PCI_DEVICE (0x8571 ,SWITCHTEC_GEN3 ),//PFXI 24XG3 -SWITCHTEC_PCI_DEVICE (0x8572 ,SWITCHTEC_GEN3 ),//PFXI 32XG3 -SWITCHTEC_PCI_DEVICE (0x8573 ,SWITCHTEC_GEN3 ),//PFXI 48XG3 -SWITCHTEC_PCI_DEVICE (0x8574 ,SWITCHTEC_GEN3 ),//PFXI 64XG3 -SWITCHTEC_PCI_DEVICE (0x8575 ,SWITCHTEC_GEN3 ),//PFXI 80XG3 -SWITCHTEC_PCI_DEVICE (0x8576 ,SWITCHTEC_GEN3 ),//PFXI 96XG3 -SWITCHTEC_PCI_DEVICE (0x4000 ,SWITCHTEC_GEN4 ),//PFX 100XG4 -SWITCHTEC_PCI_DEVICE (0x4084 ,SWITCHTEC_GEN4 ),//PFX 84XG4 -SWITCHTEC_PCI_DEVICE (0x4068 ,SWITCHTEC_GEN4 ),//PFX 68XG4 -SWITCHTEC_PCI_DEVICE (0x4052 ,SWITCHTEC_GEN4 ),//PFX 52XG4 -SWITCHTEC_PCI_DEVICE (0x4036 ,SWITCHTEC_GEN4 ),//PFX 36XG4 -SWITCHTEC_PCI_DEVICE (0x4028 ,SWITCHTEC_GEN4 ),//PFX 28XG4 -SWITCHTEC_PCI_DEVICE (0x4100 ,SWITCHTEC_GEN4 ),//PSX 100XG4 -SWITCHTEC_PCI_DEVICE (0x4184 ,SWITCHTEC_GEN4 ),//PSX 84XG4 -SWITCHTEC_PCI_DEVICE (0x4168 ,SWITCHTEC_GEN4 ),//PSX 68XG4 -SWITCHTEC_PCI_DEVICE (0x4152 ,SWITCHTEC_GEN4 ),//PSX 52XG4 -SWITCHTEC_PCI_DEVICE (0x4136 ,SWITCHTEC_GEN4 ),//PSX 36XG4 -SWITCHTEC_PCI_DEVICE (0x4128 ,SWITCHTEC_GEN4 ),//PSX 28XG4 -SWITCHTEC_PCI_DEVICE (0x4200 ,SWITCHTEC_GEN4 ),//PAX 100XG4 -SWITCHTEC_PCI_DEVICE (0x4284 ,SWITCHTEC_GEN4 ),//PAX 84XG4 -SWITCHTEC_PCI_DEVICE (0x4268 ,SWITCHTEC_GEN4 ),//PAX 68XG4 -SWITCHTEC_PCI_DEVICE (0x4252 ,SWITCHTEC_GEN4 ),//PAX 52XG4 -SWITCHTEC_PCI_DEVICE (0x4236 ,SWITCHTEC_GEN4 ),//PAX 36XG4 -SWITCHTEC_PCI_DEVICE (0x4228 ,SWITCHTEC_GEN4 ),//PAX 28XG4 -SWITCHTEC_PCI_DEVICE (0x4352 ,SWITCHTEC_GEN4 ),//PFXA 52XG4 -SWITCHTEC_PCI_DEVICE (0x4336 ,SWITCHTEC_GEN4 ),//PFXA 36XG4 -SWITCHTEC_PCI_DEVICE (0x4328 ,SWITCHTEC_GEN4 ),//PFXA 28XG4 -SWITCHTEC_PCI_DEVICE (0x4452 ,SWITCHTEC_GEN4 ),//PSXA 52XG4 -SWITCHTEC_PCI_DEVICE (0x4436 ,SWITCHTEC_GEN4 ),//PSXA 36XG4 -SWITCHTEC_PCI_DEVICE (0x4428 ,SWITCHTEC_GEN4 ),//PSXA 28XG4 -SWITCHTEC_PCI_DEVICE (0x4552 ,SWITCHTEC_GEN4 ),//PAXA 52XG4 -SWITCHTEC_PCI_DEVICE (0x4536 ,SWITCHTEC_GEN4 ),//PAXA 36XG4 -SWITCHTEC_PCI_DEVICE (0x4528 ,SWITCHTEC_GEN4 ),//PAXA 28XG4 +SWITCHTEC_PCI_DEVICE (0x8531 ,SWITCHTEC_GEN3 ),/* PFX 24xG3 */ +SWITCHTEC_PCI_DEVICE (0x8532 ,SWITCHTEC_GEN3 ),/* PFX 32xG3 */ +SWITCHTEC_PCI_DEVICE (0x8533 ,SWITCHTEC_GEN3 ),/* PFX 48xG3 */ +SWITCHTEC_PCI_DEVICE (0x8534 ,SWITCHTEC_GEN3 ),/* PFX 64xG3 */ +SWITCHTEC_PCI_DEVICE (0x8535 ,SWITCHTEC_GEN3 ),/* PFX 80xG3 */ +SWITCHTEC_PCI_DEVICE (0x8536 ,SWITCHTEC_GEN3 ),/* PFX 96xG3 */ +SWITCHTEC_PCI_DEVICE (0x8541 ,SWITCHTEC_GEN3 ),/* PSX 24xG3 */ +SWITCHTEC_PCI_DEVICE (0x8542 ,SWITCHTEC_GEN3 ),/* PSX 32xG3 */ +SWITCHTEC_PCI_DEVICE (0x8543 ,SWITCHTEC_GEN3 ),/* PSX 48xG3 */ +SWITCHTEC_PCI_DEVICE (0x8544 ,SWITCHTEC_GEN3 ),/* PSX 64xG3 */ +SWITCHTEC_PCI_DEVICE (0x8545 ,SWITCHTEC_GEN3 ),/* PSX 80xG3 */ +SWITCHTEC_PCI_DEVICE (0x8546 ,SWITCHTEC_GEN3 ),/* PSX 96xG3 */ +SWITCHTEC_PCI_DEVICE (0x8551 ,SWITCHTEC_GEN3 ),/* PAX 24XG3 */ +SWITCHTEC_PCI_DEVICE (0x8552 ,SWITCHTEC_GEN3 ),/* PAX 32XG3 */ +SWITCHTEC_PCI_DEVICE (0x8553 ,SWITCHTEC_GEN3 ),/* PAX 48XG3 */ +SWITCHTEC_PCI_DEVICE (0x8554 ,SWITCHTEC_GEN3 ),/* PAX 64XG3 */ +SWITCHTEC_PCI_DEVICE (0x8555 ,SWITCHTEC_GEN3 ),/* PAX 80XG3 */ +SWITCHTEC_PCI_DEVICE (0x8556 ,SWITCHTEC_GEN3 ),/* PAX 96XG3 */ +SWITCHTEC_PCI_DEVICE (0x8561 ,SWITCHTEC_GEN3 ),/* PFXL 24XG3 */ +SWITCHTEC_PCI_DEVICE (0x8562 ,SWITCHTEC_GEN3 ),/* PFXL 32XG3 */ +SWITCHTEC_PCI_DEVICE (0x8563 ,SWITCHTEC_GEN3 ),/* PFXL 48XG3 */ +SWITCHTEC_PCI_DEVICE (0x8564 ,SWITCHTEC_GEN3 ),/* PFXL 64XG3 */ +SWITCHTEC_PCI_DEVICE (0x8565 ,SWITCHTEC_GEN3 ),/* PFXL 80XG3 */ +SWITCHTEC_PCI_DEVICE (0x8566 ,SWITCHTEC_GEN3 ),/* PFXL 96XG3 */ +SWITCHTEC_PCI_DEVICE (0x8571 ,SWITCHTEC_GEN3 ),/* PFXI 24XG3 */ +SWITCHTEC_PCI_DEVICE (0x8572 ,SWITCHTEC_GEN3 ),/* PFXI 32XG3 */ +SWITCHTEC_PCI_DEVICE (0x8573 ,SWITCHTEC_GEN3 ),/* PFXI 48XG3 */ +SWITCHTEC_PCI_DEVICE (0x8574 ,SWITCHTEC_GEN3 ),/* PFXI 64XG3 */ +SWITCHTEC_PCI_DEVICE (0x8575 ,SWITCHTEC_GEN3 ),/* PFXI 80XG3 */ +SWITCHTEC_PCI_DEVICE (0x8576 ,SWITCHTEC_GEN3 ),/* PFXI 96XG3 */ +SWITCHTEC_PCI_DEVICE (0x4000 ,SWITCHTEC_GEN4 ),/* PFX 100XG4 */ +SWITCHTEC_PCI_DEVICE (0x4084 ,SWITCHTEC_GEN4 ),/* PFX 84XG4 */ +SWITCHTEC_PCI_DEVICE (0x4068 ,SWITCHTEC_GEN4 ),/* PFX 68XG4 */ +SWITCHTEC_PCI_DEVICE (0x4052 ,SWITCHTEC_GEN4 ),/* PFX 52XG4 */ +SWITCHTEC_PCI_DEVICE (0x4036 ,SWITCHTEC_GEN4 ),/* PFX 36XG4 */ +SWITCHTEC_PCI_DEVICE (0x4028 ,SWITCHTEC_GEN4 ),/* PFX 28XG4 */ +SWITCHTEC_PCI_DEVICE (0x4100 ,SWITCHTEC_GEN4 ),/* PSX 100XG4 */ +SWITCHTEC_PCI_DEVICE (0x4184 ,SWITCHTEC_GEN4 ),/* PSX 84XG4 */ +SWITCHTEC_PCI_DEVICE (0x4168 ,SWITCHTEC_GEN4 ),/* PSX 68XG4 */ +SWITCHTEC_PCI_DEVICE (0x4152 ,SWITCHTEC_GEN4 ),/* PSX 52XG4 */ +SWITCHTEC_PCI_DEVICE (0x4136 ,SWITCHTEC_GEN4 ),/* PSX 36XG4 */ +SWITCHTEC_PCI_DEVICE (0x4128 ,SWITCHTEC_GEN4 ),/* PSX 28XG4 */ +SWITCHTEC_PCI_DEVICE (0x4200 ,SWITCHTEC_GEN4 ),/* PAX 100XG4 */ +SWITCHTEC_PCI_DEVICE (0x4284 ,SWITCHTEC_GEN4 ),/* PAX 84XG4 */ +SWITCHTEC_PCI_DEVICE (0x4268 ,SWITCHTEC_GEN4 ),/* PAX 68XG4 */ +SWITCHTEC_PCI_DEVICE (0x4252 ,SWITCHTEC_GEN4 ),/* PAX 52XG4 */ +SWITCHTEC_PCI_DEVICE (0x4236 ,SWITCHTEC_GEN4 ),/* PAX 36XG4 */ +SWITCHTEC_PCI_DEVICE (0x4228 ,SWITCHTEC_GEN4 ),/* PAX 28XG4 */ +SWITCHTEC_PCI_DEVICE (0x4352 ,SWITCHTEC_GEN4 ),/* PFXA 52XG4 */ +SWITCHTEC_PCI_DEVICE (0x4336 ,SWITCHTEC_GEN4 ),/* PFXA 36XG4 */ +SWITCHTEC_PCI_DEVICE (0x4328 ,SWITCHTEC_GEN4 ),/* PFXA 28XG4 */ +SWITCHTEC_PCI_DEVICE (0x4452 ,SWITCHTEC_GEN4 ),/* PSXA 52XG4 */ +SWITCHTEC_PCI_DEVICE (0x4436 ,SWITCHTEC_GEN4 ),/* PSXA 36XG4 */ +SWITCHTEC_PCI_DEVICE (0x4428 ,SWITCHTEC_GEN4 ),/* PSXA 28XG4 */ +SWITCHTEC_PCI_DEVICE (0x4552 ,SWITCHTEC_GEN4 ),/* PAXA 52XG4 */ +SWITCHTEC_PCI_DEVICE (0x4536 ,SWITCHTEC_GEN4 ),/* PAXA 36XG4 */ +SWITCHTEC_PCI_DEVICE (0x4528 ,SWITCHTEC_GEN4 ),/* PAXA 28XG4 */ {0 } };MODULE_DEVICE_TABLE (pci, switchtec_pci_tbl);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 67/141 PCI: switchtec: Add support for PCIe Gen5 devices
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kelvin Cao <[email protected]>
[ Upstream commit 0fb53e64705ae0fabd9593102e0f0e6812968802 ]
Advertise support of Gen5 devices in the driver's device ID table and add the same IDs for the switchtec quirks. Also update driver code to accommodate them.
--- drivers/pci/quirks.c | 36 ++++++++++++++++++++++++++++ drivers/pci/switch/switchtec.c | 44 ++++++++++++++++++++++++++++++---- include/linux/switchtec.h | 1 + 3 files changed, 77 insertions(+), 4 deletions(-)
drivers/pci/quirks.c +36 -0
@@ -5820,6 +5820,42 @@ SWITCHTEC_QUIRK(0x4428); /* PSXA 28XG4 */SWITCHTEC_QUIRK (0x4552 );/* PAXA 52XG4 */ SWITCHTEC_QUIRK (0x4536 );/* PAXA 36XG4 */ SWITCHTEC_QUIRK (0x4528 );/* PAXA 28XG4 */ +SWITCHTEC_QUIRK (0x5000 );/* PFX 100XG5 */ +SWITCHTEC_QUIRK (0x5084 );/* PFX 84XG5 */ +SWITCHTEC_QUIRK (0x5068 );/* PFX 68XG5 */ +SWITCHTEC_QUIRK (0x5052 );/* PFX 52XG5 */ +SWITCHTEC_QUIRK (0x5036 );/* PFX 36XG5 */ +SWITCHTEC_QUIRK (0x5028 );/* PFX 28XG5 */ +SWITCHTEC_QUIRK (0x5100 );/* PSX 100XG5 */ +SWITCHTEC_QUIRK (0x5184 );/* PSX 84XG5 */ +SWITCHTEC_QUIRK (0x5168 );/* PSX 68XG5 */ +SWITCHTEC_QUIRK (0x5152 );/* PSX 52XG5 */ +SWITCHTEC_QUIRK (0x5136 );/* PSX 36XG5 */ +SWITCHTEC_QUIRK (0x5128 );/* PSX 28XG5 */ +SWITCHTEC_QUIRK (0x5200 );/* PAX 100XG5 */ +SWITCHTEC_QUIRK (0x5284 );/* PAX 84XG5 */ +SWITCHTEC_QUIRK (0x5268 );/* PAX 68XG5 */ +SWITCHTEC_QUIRK (0x5252 );/* PAX 52XG5 */ +SWITCHTEC_QUIRK (0x5236 );/* PAX 36XG5 */ +SWITCHTEC_QUIRK (0x5228 );/* PAX 28XG5 */ +SWITCHTEC_QUIRK (0x5300 );/* PFXA 100XG5 */ +SWITCHTEC_QUIRK (0x5384 );/* PFXA 84XG5 */ +SWITCHTEC_QUIRK (0x5368 );/* PFXA 68XG5 */ +SWITCHTEC_QUIRK (0x5352 );/* PFXA 52XG5 */ +SWITCHTEC_QUIRK (0x5336 );/* PFXA 36XG5 */ +SWITCHTEC_QUIRK (0x5328 );/* PFXA 28XG5 */ +SWITCHTEC_QUIRK (0x5400 );/* PSXA 100XG5 */ +SWITCHTEC_QUIRK (0x5484 );/* PSXA 84XG5 */ +SWITCHTEC_QUIRK (0x5468 );/* PSXA 68XG5 */ +SWITCHTEC_QUIRK (0x5452 );/* PSXA 52XG5 */ +SWITCHTEC_QUIRK (0x5436 );/* PSXA 36XG5 */ +SWITCHTEC_QUIRK (0x5428 );/* PSXA 28XG5 */ +SWITCHTEC_QUIRK (0x5500 );/* PAXA 100XG5 */ +SWITCHTEC_QUIRK (0x5584 );/* PAXA 84XG5 */ +SWITCHTEC_QUIRK (0x5568 );/* PAXA 68XG5 */ +SWITCHTEC_QUIRK (0x5552 );/* PAXA 52XG5 */ +SWITCHTEC_QUIRK (0x5536 );/* PAXA 36XG5 */ +SWITCHTEC_QUIRK (0x5528 );/* PAXA 28XG5 */ /* * The PLX NTB uses devfn proxy IDs to move TLPs between NT endpoints.
drivers/pci/switch/switchtec.c +40 -4
74 lines not on this page · raw message
include/linux/switchtec.h +1 -0
@@ -41,6 +41,7 @@ enum {enum switchtec_gen {SWITCHTEC_GEN3 ,SWITCHTEC_GEN4 , +SWITCHTEC_GEN5 , };struct mrpc_regs {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 68/141 ARM: davinci: Drop unused includes
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rob Herring <[email protected]>
[ Upstream commit 6e73bd23a1cdcf1416ebd57ff673b5f601963ed2 ]
of_platform.h include is not needed, so drop it. It implicitly includes of.h (for now) which is needed.
--- arch/arm/mach-davinci/pdata-quirks.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm/mach-davinci/pdata-quirks.c +1 -1
@@ -5,7 +5,7 @@* Copyright (C) 2016 BayLibre, Inc */ #include <linux/kernel.h> -#include <linux/of_platform.h> +#include <linux/of.h> #include <media/i2c/tvp514x.h> #include <media/i2c/adv7343.h>
Signature · 1 line
2.43.0
Re: [PATCH 6.1 068/141] ARM: davinci: Drop unused includes
Quoted 2 lines · Greg Kroah-Hartman
6.1-stable review patch. If anyone has any objections, please let me know.
This doesn't seem like something needed for stable. Are the hundreds of other commits like this going too?
Rob
Greg Kroah-Hartman
maintainerRe: [PATCH 6.1 068/141] ARM: davinci: Drop unused includes
Quoted 7 lines · Rob Herring
Quoted 2 lines · Greg Kroah-Hartman
6.1-stable review patch. If anyone has any objections, please let me know.
This doesn't seem like something needed for stable. Are the hundreds of other commits like this going too?
No, sorry, this isn't needed, now dropped.
greg k-h
Greg Kroah-Hartman
maintainerPATCH 69/141 ALSA: scarlett2: Move USB IDs out from device_info struct
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Geoffrey D. Bennett <[email protected]>
[ Upstream commit d98cc489029dba4d99714c2e8ec4f5ba249f6851 ]
By moving the USB IDs from the device_info struct into scarlett2_devices[], that will allow for devices with different USB IDs to share the same device_info.
Stable-dep-of: b9a98cdd3ac7 ("ALSA: scarlett2: Add support for Clarett 8Pre USB")
--- sound/usb/mixer_scarlett_gen2.c | 63 ++++++++++++--------------------- 1 file changed, 23 insertions(+), 40 deletions(-)
sound/usb/mixer_scarlett_gen2.c +23 -40
@@ -317,8 +317,6 @@ struct scarlett2_mux_entry { };struct scarlett2_device_info { -u32 usb_id;/* USB device identifier */ -/* Gen 3 devices have an internal MSD mode switch that needs * to be disabled in order to access the full functionality of * the device.
@@ -440,8 +438,6 @@ struct scarlett2_data {/*** Model-specific data ***/ static const struct scarlett2_device_info s6i6_gen2_info = { - .usb_id =USB_ID (0x1235 ,0x8203 ), - .config_set =SCARLETT2_CONFIG_SET_GEN_2 , .level_input_count =2 , .pad_input_count =2 ,
@@ -486,8 +482,6 @@ static const struct scarlett2_device_info s6i6_gen2_info = { };static const struct scarlett2_device_info s18i8_gen2_info = { - .usb_id =USB_ID (0x1235 ,0x8204 ), - .config_set =SCARLETT2_CONFIG_SET_GEN_2 , .level_input_count =2 , .pad_input_count =4 ,
@@ -535,8 +529,6 @@ static const struct scarlett2_device_info s18i8_gen2_info = { };static const struct scarlett2_device_info s18i20_gen2_info = { - .usb_id =USB_ID (0x1235 ,0x8201 ), - .config_set =SCARLETT2_CONFIG_SET_GEN_2 , .line_out_hw_vol =1 ,
@@ -589,8 +581,6 @@ static const struct scarlett2_device_info s18i20_gen2_info = { };static const struct scarlett2_device_info solo_gen3_info = { - .usb_id =USB_ID (0x1235 ,0x8211 ), - .has_msd_mode =1 , .config_set =SCARLETT2_CONFIG_SET_NO_MIXER , .level_input_count =1 ,
@@ -602,8 +592,6 @@ static const struct scarlett2_device_info solo_gen3_info = { };static const struct scarlett2_device_info s2i2_gen3_info = { - .usb_id =USB_ID (0x1235 ,0x8210 ), - .has_msd_mode =1 , .config_set =SCARLETT2_CONFIG_SET_NO_MIXER , .level_input_count =2 ,
@@ -614,8 +602,6 @@ static const struct scarlett2_device_info s2i2_gen3_info = { };static const struct scarlett2_device_info s4i4_gen3_info = { - .usb_id =USB_ID (0x1235 ,0x8212 ), - .has_msd_mode =1 , .config_set =SCARLETT2_CONFIG_SET_GEN_3 , .level_input_count =2 ,
@@ -660,8 +646,6 @@ static const struct scarlett2_device_info s4i4_gen3_info = { };static const struct scarlett2_device_info s8i6_gen3_info = { - .usb_id =USB_ID (0x1235 ,0x8213 ), - .has_msd_mode =1 , .config_set =SCARLETT2_CONFIG_SET_GEN_3 , .level_input_count =2 ,
@@ -713,8 +697,6 @@ static const struct scarlett2_device_info s8i6_gen3_info = { };static const struct scarlett2_device_info s18i8_gen3_info = { - .usb_id =USB_ID (0x1235 ,0x8214 ), - .has_msd_mode =1 , .config_set =SCARLETT2_CONFIG_SET_GEN_3 , .line_out_hw_vol =1 ,
@@ -783,8 +765,6 @@ static const struct scarlett2_device_info s18i8_gen3_info = { };static const struct scarlett2_device_info s18i20_gen3_info = { - .usb_id =USB_ID (0x1235 ,0x8215 ), - .has_msd_mode =1 , .config_set =SCARLETT2_CONFIG_SET_GEN_3 , .line_out_hw_vol =1 ,
@@ -848,8 +828,6 @@ static const struct scarlett2_device_info s18i20_gen3_info = { };static const struct scarlett2_device_info clarett_8pre_info = { - .usb_id =USB_ID (0x1235 ,0x820c ), - .config_set =SCARLETT2_CONFIG_SET_CLARETT , .line_out_hw_vol =1 , .level_input_count =2 ,
@@ -902,25 +880,30 @@ static const struct scarlett2_device_info clarett_8pre_info = { } }, }; -static const struct scarlett2_device_info *scarlett2_devices[] = { +struct scarlett2_device_entry { +const u32 usb_id;/* USB device identifier */ +const struct scarlett2_device_info *info; +}; + +static const struct scarlett2_device_entry scarlett2_devices[] = {/* Supported Gen 2 devices */ - &s6i6_gen2_info, - &s18i8_gen2_info, - &s18i20_gen2_info, + {USB_ID (0x1235 ,0x8203 ), &s6i6_gen2_info }, + {USB_ID (0x1235 ,0x8204 ), &s18i8_gen2_info }, + {USB_ID (0x1235 ,0x8201 ), &s18i20_gen2_info },/* Supported Gen 3 devices */ - &solo_gen3_info, - &s2i2_gen3_info, - &s4i4_gen3_info, - &s8i6_gen3_info, - &s18i8_gen3_info, - &s18i20_gen3_info, + {USB_ID (0x1235 ,0x8211 ), &solo_gen3_info }, + {USB_ID (0x1235 ,0x8210 ), &s2i2_gen3_info }, + {USB_ID (0x1235 ,0x8212 ), &s4i4_gen3_info }, + {USB_ID (0x1235 ,0x8213 ), &s8i6_gen3_info }, + {USB_ID (0x1235 ,0x8214 ), &s18i8_gen3_info }, + {USB_ID (0x1235 ,0x8215 ), &s18i20_gen3_info },/* Supported Clarett+ devices */ - &clarett_8pre_info, + {USB_ID (0x1235 ,0x820c ), &clarett_8pre_info },/* End of list */ -NULL + {0 ,NULL }, };/* get the starting port index number for a given port type/direction */
@@ -4149,17 +4132,17 @@ static int scarlett2_init_notify(struct usb_mixer_interface *mixer)static int snd_scarlett_gen2_controls_create (struct usb_mixer_interface *mixer) { -const struct scarlett2_device_info **info = scarlett2_devices; +const struct scarlett2_device_entry *entry = scarlett2_devices;int err; -/* Find device in scarlett2_devices */ -while (*info && (*info)->usb_id != mixer->chip->usb_id) - info++; -if (!*info) +/* Find entry in scarlett2_devices */ +while (entry->usb_id && entry->usb_id != mixer->chip->usb_id) + entry++; +if (!entry->usb_id)return -EINVAL ;/* Initialise private data */ - err =scarlett2_init_private (mixer, *info); + err =scarlett2_init_private (mixer, entry->info);if (err <0 )return err;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 70/141 ALSA: scarlett2: Add support for Clarett 8Pre USB
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Geoffrey D. Bennett <[email protected]>
[ Upstream commit b9a98cdd3ac7b80d8ea0f6acd81c88ad3d8bcb4a ]
The Clarett 8Pre USB works the same as the Clarett+ 8Pre, only the USB ID is different.
--- sound/usb/mixer_quirks.c | 1 + sound/usb/mixer_scarlett_gen2.c | 11 ++++++++--- 2 files changed, 9 insertions(+), 3 deletions(-)
sound/usb/mixer_quirks.c +1 -0
@@ -3447,6 +3447,7 @@ int snd_usb_mixer_apply_create_quirk(struct usb_mixer_interface *mixer)case USB_ID (0x1235 ,0x8213 ):/* Focusrite Scarlett 8i6 3rd Gen */ case USB_ID (0x1235 ,0x8214 ):/* Focusrite Scarlett 18i8 3rd Gen */ case USB_ID (0x1235 ,0x8215 ):/* Focusrite Scarlett 18i20 3rd Gen */ +case USB_ID (0x1235 ,0x8208 ):/* Focusrite Clarett 8Pre USB */ case USB_ID (0x1235 ,0x820c ):/* Focusrite Clarett+ 8Pre */ err =snd_scarlett_gen2_init (mixer);break ;
sound/usb/mixer_scarlett_gen2.c +8 -3
@@ -1,13 +1,14 @@// SPDX-License-Identifier: GPL-2.0 /* -* Focusrite Scarlett Gen 2/3 and Clarett+ Driver for ALSA +* Focusrite Scarlett Gen 2/3 and Clarett USB/Clarett+ Driver for ALSA * * Supported models: * - 6i6/18i8/18i20 Gen 2 * - Solo/2i2/4i4/8i6/18i8/18i20 Gen 3 +* - Clarett 8Pre USB * - Clarett+ 8Pre * -* Copyright (c) 2018-2022 by Geoffrey D. Bennett <g at b4.vu> +* Copyright (c) 2018-2023 by Geoffrey D. Bennett <g at b4.vu> * Copyright (c) 2020-2021 by Vladimir Sadovnikov <[email protected]> * Copyright (c) 2022 by Christian Colglazier <[email protected]> *
@@ -56,6 +57,9 @@* Support for Clarett+ 8Pre added in Aug 2022 by Christian * Colglazier. * +* Support for Clarett 8Pre USB added in Sep 2023 (thanks to Philippe +* Perrot for confirmation). +* * This ALSA mixer gives access to (model-dependent): * - input, output, mixer-matrix muxes * - mixer-matrix gain stages
@@ -899,7 +903,8 @@ static const struct scarlett2_device_entry scarlett2_devices[] = { { USB_ID(0x1235, 0x8214), &s18i8_gen3_info }, { USB_ID(0x1235, 0x8215), &s18i20_gen3_info }, -/* Supported Clarett+ devices */ +/* Supported Clarett USB/Clarett+ devices */ + { USB_ID(0x1235, 0x8208), &clarett_8pre_info }, { USB_ID(0x1235, 0x820c), &clarett_8pre_info },/* End of list */
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 71/141 ASoC: ti: Convert Pandora ASoC to GPIO descriptors
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Linus Walleij <[email protected]>
[ Upstream commit 319e6ac143b9e9048e527ab9dd2aabb8fdf3d60f ]
The Pandora uses GPIO descriptors pretty much exclusively, but not for ASoC, so let's fix it. Register the pins in a descriptor table in the machine since the ASoC device is not using device tree.
Use static locals for the GPIO descriptors because I'm not able to experient with better state storage on any real hardware. Others using the Pandora can come afterwards and improve this.
--- arch/arm/mach-omap2/pdata-quirks.c | 10 +++++ sound/soc/ti/omap3pandora.c | 63 +++++++++++------------------- 2 files changed, 33 insertions(+), 40 deletions(-)
arch/arm/mach-omap2/pdata-quirks.c +10 -0
@@ -256,9 +256,19 @@ static struct platform_device pandora_backlight = { .id = -1, }; +static struct gpiod_lookup_table pandora_soc_audio_gpios = { + .dev_id ="soc-audio" , + .table = { +GPIO_LOOKUP ("gpio-112-127" ,6 ,"dac" ,GPIO_ACTIVE_HIGH ), +GPIO_LOOKUP ("gpio-0-15" ,14 ,"amp" ,GPIO_ACTIVE_HIGH ), + { } + }, +}; +static void __init omap3_pandora_legacy_init (void ) {platform_device_register (&pandora_backlight); +gpiod_add_lookup_table (&pandora_soc_audio_gpios); }#endif /* CONFIG_ARCH_OMAP3 */
sound/soc/ti/omap3pandora.c +23 -40
119 lines not on this page · raw message
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 72/141 usb: pci-quirks: group AMD specific quirk code together
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Niklas Schnelle <[email protected]>
[ Upstream commit 7ca9f9ba8aa7380dee5dd8346b57bbaf198b075a ]
A follow on patch will introduce CONFIG_USB_PCI_AMD governing the AMD quirk and adding its compile time dependency on HAS_IOPORT. In order to minimize the number of #ifdefs in C files and make that patch easier to read first group the code together. This is pure code movement no functional change is intended.
--- drivers/usb/host/pci-quirks.c | 119 +++++++++++++++++----------------- drivers/usb/host/pci-quirks.h | 14 ++-- 2 files changed, 68 insertions(+), 65 deletions(-)
drivers/usb/host/pci-quirks.c +60 -59
@@ -60,6 +60,22 @@#define EHCI_USBLEGCTLSTS 4/* legacy control/status */ #define EHCI_USBLEGCTLSTS_SOOE (1 << 13)/* SMI on ownership change */ +/* ASMEDIA quirk use */ +#define ASMT_DATA_WRITE0_REG 0xF8 +#define ASMT_DATA_WRITE1_REG 0xFC +#define ASMT_CONTROL_REG 0xE0 +#define ASMT_CONTROL_WRITE_BIT 0x02 +#define ASMT_WRITEREG_CMD 0x10423 +#define ASMT_FLOWCTL_ADDR 0xFA30 +#define ASMT_FLOWCTL_DATA 0xBA +#define ASMT_PSEUDO_DATA 0 + +/* Intel quirk use */ +#define USB_INTEL_XUSB2PR 0xD0 +#define USB_INTEL_USB2PRM 0xD4 +#define USB_INTEL_USB3_PSSEN 0xD8 +#define USB_INTEL_USB3PRM 0xDC +/* AMD quirk use */ #define AB_REG_BAR_LOW 0xe0#define AB_REG_BAR_HIGH 0xe1
@@ -93,21 +109,6 @@#define NB_PIF0_PWRDOWN_0 0x01100012#define NB_PIF0_PWRDOWN_1 0x01100013 -#define USB_INTEL_XUSB2PR 0xD0 -#define USB_INTEL_USB2PRM 0xD4 -#define USB_INTEL_USB3_PSSEN 0xD8 -#define USB_INTEL_USB3PRM 0xDC - -/* ASMEDIA quirk use */ -#define ASMT_DATA_WRITE0_REG 0xF8 -#define ASMT_DATA_WRITE1_REG 0xFC -#define ASMT_CONTROL_REG 0xE0 -#define ASMT_CONTROL_WRITE_BIT 0x02 -#define ASMT_WRITEREG_CMD 0x10423 -#define ASMT_FLOWCTL_ADDR 0xFA30 -#define ASMT_FLOWCTL_DATA 0xBA -#define ASMT_PSEUDO_DATA 0 -/* * amd_chipset_gen values represent AMD different chipset generations */
@@ -458,50 +459,6 @@ void usb_amd_quirk_pll_disable(void) }EXPORT_SYMBOL_GPL (usb_amd_quirk_pll_disable); -static int usb_asmedia_wait_write (struct pci_dev *pdev) -{ -unsigned long retry_count; -unsigned char value; - -for (retry_count =1000 ; retry_count >0 ; --retry_count) { - -pci_read_config_byte (pdev,ASMT_CONTROL_REG , &value); - -if (value ==0xff ) { -dev_err (&pdev->dev,"%s: check_ready ERROR" , __func__); -return -EIO ; - } - -if ((value &ASMT_CONTROL_WRITE_BIT ) ==0 ) -return 0 ; - -udelay (50 ); - } - -dev_warn (&pdev->dev,"%s: check_write_ready timeout" , __func__); -return -ETIMEDOUT ; -} - -void usb_asmedia_modifyflowcontrol (struct pci_dev *pdev) -{ -if (usb_asmedia_wait_write (pdev) !=0 ) -return ; - -/* send command and address to device */ -pci_write_config_dword (pdev,ASMT_DATA_WRITE0_REG ,ASMT_WRITEREG_CMD ); -pci_write_config_dword (pdev,ASMT_DATA_WRITE1_REG ,ASMT_FLOWCTL_ADDR ); -pci_write_config_byte (pdev,ASMT_CONTROL_REG ,ASMT_CONTROL_WRITE_BIT ); - -if (usb_asmedia_wait_write (pdev) !=0 ) -return ; - -/* send data to device */ -pci_write_config_dword (pdev,ASMT_DATA_WRITE0_REG ,ASMT_FLOWCTL_DATA ); -pci_write_config_dword (pdev,ASMT_DATA_WRITE1_REG ,ASMT_PSEUDO_DATA ); -pci_write_config_byte (pdev,ASMT_CONTROL_REG ,ASMT_CONTROL_WRITE_BIT ); -} -EXPORT_SYMBOL_GPL (usb_asmedia_modifyflowcontrol); -void usb_amd_quirk_pll_enable (void ) {usb_amd_quirk_pll (0 );
@@ -631,6 +588,50 @@ bool usb_amd_pt_check_port(struct device *device, int port) }EXPORT_SYMBOL_GPL (usb_amd_pt_check_port); +static int usb_asmedia_wait_write (struct pci_dev *pdev) +{ +unsigned long retry_count; +unsigned char value; + +for (retry_count =1000 ; retry_count >0 ; --retry_count) { + +pci_read_config_byte (pdev,ASMT_CONTROL_REG , &value); + +if (value ==0xff ) { +dev_err (&pdev->dev,"%s: check_ready ERROR" , __func__); +return -EIO ; + } + +if ((value &ASMT_CONTROL_WRITE_BIT ) ==0 ) +return 0 ; + +udelay (50 ); + } + +dev_warn (&pdev->dev,"%s: check_write_ready timeout" , __func__); +return -ETIMEDOUT ; +} + +void usb_asmedia_modifyflowcontrol (struct pci_dev *pdev) +{ +if (usb_asmedia_wait_write (pdev) !=0 ) +return ; + +/* send command and address to device */ +pci_write_config_dword (pdev,ASMT_DATA_WRITE0_REG ,ASMT_WRITEREG_CMD ); +pci_write_config_dword (pdev,ASMT_DATA_WRITE1_REG ,ASMT_FLOWCTL_ADDR ); +pci_write_config_byte (pdev,ASMT_CONTROL_REG ,ASMT_CONTROL_WRITE_BIT ); + +if (usb_asmedia_wait_write (pdev) !=0 ) +return ; + +/* send data to device */ +pci_write_config_dword (pdev,ASMT_DATA_WRITE0_REG ,ASMT_FLOWCTL_DATA ); +pci_write_config_dword (pdev,ASMT_DATA_WRITE1_REG ,ASMT_PSEUDO_DATA ); +pci_write_config_byte (pdev,ASMT_CONTROL_REG ,ASMT_CONTROL_WRITE_BIT ); +} +EXPORT_SYMBOL_GPL (usb_asmedia_modifyflowcontrol); +/* * Make sure the controller is completely inactive, unable to * generate interrupts or do DMA.
drivers/usb/host/pci-quirks.h +8 -6
@@ -3,8 +3,6 @@#define __LINUX_USB_PCI_QUIRKS_H#ifdef CONFIG_USB_PCI -void uhci_reset_hc (struct pci_dev *pdev,unsigned long base); -int uhci_check_and_reset_hc (struct pci_dev *pdev,unsigned long base);int usb_hcd_amd_remote_wakeup_quirk (struct pci_dev *pdev);bool usb_amd_hang_symptom_quirk (void );bool usb_amd_prefetch_quirk (void );
@@ -12,23 +10,27 @@ void usb_amd_dev_put(void);bool usb_amd_quirk_pll_check (void );void usb_amd_quirk_pll_disable (void );void usb_amd_quirk_pll_enable (void ); +void sb800_prefetch (struct device *dev,int on); +bool usb_amd_pt_check_port (struct device *device,int port); + +void uhci_reset_hc (struct pci_dev *pdev,unsigned long base); +int uhci_check_and_reset_hc (struct pci_dev *pdev,unsigned long base);void usb_asmedia_modifyflowcontrol (struct pci_dev *pdev);void usb_enable_intel_xhci_ports (struct pci_dev *xhci_pdev);void usb_disable_xhci_ports (struct pci_dev *xhci_pdev); -void sb800_prefetch (struct device *dev,int on); -bool usb_amd_pt_check_port (struct device *device,int port);#else struct pci_dev ;static inline void usb_amd_quirk_pll_disable (void ) {}static inline void usb_amd_quirk_pll_enable (void ) {} -static inline void usb_asmedia_modifyflowcontrol (struct pci_dev *pdev) {}static inline void usb_amd_dev_put (void ) {} -static inline void usb_disable_xhci_ports (struct pci_dev *xhci_pdev) {}static inline void sb800_prefetch (struct device *dev,int on) {}static inline bool usb_amd_pt_check_port (struct device *device,int port) {return false; } + +static inline void usb_asmedia_modifyflowcontrol (struct pci_dev *pdev) {} +static inline void usb_disable_xhci_ports (struct pci_dev *xhci_pdev) {}#endif /* CONFIG_USB_PCI */ #endif /* __LINUX_USB_PCI_QUIRKS_H */
Signature · 1 line
2.43.0
Re: [PATCH 6.1 072/141] usb: pci-quirks: group AMD specific quirk code together
Quoted 14 lines · Greg Kroah-Hartman
6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Niklas Schnelle <[email protected]>
[ Upstream commit
7ca9f9ba8aa7380dee5dd8346b57bbaf198b075a]A follow on patch will introduce
CONFIG_USB_PCI_AMDgoverning the AMD quirk and adding its compile time dependency onHAS_IOPORT. In order to minimize the number of #ifdefs in C files and make that patch easier to read first group the code together. This is pure code movement no functional change is intended.
Quoted 6 lines
Co-developed-by Arnd Bergmann <[email protected]>Signed-off-by Arnd Bergmann <[email protected]>Signed-off-by Niklas Schnelle <[email protected]>Signed-off-by Greg Kroah-Hartman <[email protected]>Signed-off-by Sasha Levin <[email protected]>
I see now you had it for 6.6 and 6.1, so it has the same problem as the other one, with the dependency on fcbfe8121a45 ("Kconfig: introduce HAS_IOPORT option and select it as necessary")
Arnd
Greg Kroah-Hartman
maintainerRe: [PATCH 6.1 072/141] usb: pci-quirks: group AMD specific quirk code together
Quoted 22 lines · Arnd Bergmann
Quoted 14 lines · Greg Kroah-Hartman
6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Niklas Schnelle <[email protected]>
[ Upstream commit
7ca9f9ba8aa7380dee5dd8346b57bbaf198b075a]A follow on patch will introduce
CONFIG_USB_PCI_AMDgoverning the AMD quirk and adding its compile time dependency onHAS_IOPORT. In order to minimize the number of #ifdefs in C files and make that patch easier to read first group the code together. This is pure code movement no functional change is intended.Quoted 6 lines
Co-developed-by Arnd Bergmann <[email protected]>Signed-off-by Arnd Bergmann <[email protected]>Signed-off-by Niklas Schnelle <[email protected]>Signed-off-by Greg Kroah-Hartman <[email protected]>Signed-off-by Sasha Levin <[email protected]>
Quoted 4 lines
I see now you had it for 6.6 and 6.1, so it has the same problem as the other one, with the dependency on
fcbfe8121a45("Kconfig: introduceHAS_IOPORToption and select it as necessary")
Now dropped, thanks.
greg k-h
Greg Kroah-Hartman
maintainerPATCH 73/141 ALSA: scarlett2: Default mixer driver to enabled
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Geoffrey D. Bennett <[email protected]>
[ Upstream commit bc83058f598757a908b30f8f536338cb1478ab5b ]
Early versions of this mixer driver did not work on all hardware, so out of caution the driver was disabled by default and had to be explicitly enabled with device_setup=1.
Since commit 764fa6e686e0 ("ALSA: usb-audio: scarlett2: Fix device hang with ehci-pci") no more problems of this nature have been reported. Therefore, enable the driver by default but provide a new device_setup option to disable the driver in case that is needed.
- device_setup value of 0 now means "enable" rather than "disable".
- device_setup value of 1 is now ignored.
- device_setup value of 4 now means "disable".
Stable-dep-of: b61a3acada00 ("ALSA: scarlett2: Add Focusrite Clarett+ 2Pre and 4Pre support")
--- sound/usb/mixer_scarlett_gen2.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-)
sound/usb/mixer_scarlett_gen2.c +11 -10
@@ -145,12 +145,12 @@#include "mixer_scarlett_gen2.h" -/* device_setup value to enable */ -#define SCARLETT2_ENABLE 0x01 -/* device_setup value to allow turning MSD mode back on */ #define SCARLETT2_MSD_ENABLE 0x02 +/* device_setup value to disable this mixer driver */ +#define SCARLETT2_DISABLE 0x04 +/* some gui mixers can't handle negative ctl values */ #define SCARLETT2_VOLUME_BIAS 127
@@ -4237,19 +4237,20 @@ int snd_scarlett_gen2_init(struct usb_mixer_interface *mixer)if (!mixer->protocol)return 0 ; -if (!(chip->setup &SCARLETT2_ENABLE )) { +if (chip->setup &SCARLETT2_DISABLE ) {usb_audio_info (chip, -"Focusrite Scarlett Gen 2/3 Mixer Driver disabled; " -"use options snd_usb_audio vid=0x%04x pid=0x%04x " -"device_setup=1 to enable and report any issues " -"to [email protected]" , +"Focusrite Scarlett Gen 2/3 Mixer Driver disabled " +"by modprobe options (snd_usb_audio " +"vid=0x%04x pid=0x%04x device_setup=%d)\n" ,USB_ID_VENDOR (chip->usb_id), -USB_ID_PRODUCT (chip->usb_id)); +USB_ID_PRODUCT (chip->usb_id), +SCARLETT2_DISABLE );return 0 ; }usb_audio_info (chip, -"Focusrite Scarlett Gen 2/3 Mixer Driver enabled pid=0x%04x" , +"Focusrite Scarlett Gen 2/3 Mixer Driver enabled (pid=0x%04x); " +"report any issues to [email protected]" ,USB_ID_PRODUCT (chip->usb_id)); err =snd_scarlett_gen2_controls_create (mixer);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 74/141 ALSA: scarlett2: Add correct product series name to messages
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Geoffrey D. Bennett <[email protected]>
[ Upstream commit 6e743781d62e28f5fa095e5f31f878819622c143 ]
This driver was originally developed for the Focusrite Scarlett Gen 2 series, but now also supports the Scarlett Gen 3 series, the Clarett 8Pre USB, and the Clarett+ 8Pre. The messages output by the driver on initialisation and error include the identifying text "Scarlett Gen 2/3", but this is no longer accurate, and writing "Scarlett Gen 2/3/Clarett USB/Clarett+" would be unwieldy.
Add series_name field to the scarlett2_device_entry struct so that concise and accurate messages can be output.
Stable-dep-of: b61a3acada00 ("ALSA: scarlett2: Add Focusrite Clarett+ 2Pre and 4Pre support")
--- sound/usb/mixer_scarlett_gen2.c | 81 ++++++++++++++++++++++----------- 1 file changed, 54 insertions(+), 27 deletions(-)
sound/usb/mixer_scarlett_gen2.c +54 -27
@@ -391,6 +391,7 @@ struct scarlett2_data {struct mutex data_mutex;/* lock access to this data */ struct delayed_work work;const struct scarlett2_device_info *info; +const char *series_name;__u8 bInterfaceNumber;__u8 bEndpointAddress;__u16 wMaxPacketSize;
@@ -887,25 +888,26 @@ static const struct scarlett2_device_info clarett_8pre_info = {struct scarlett2_device_entry {const u32 usb_id;/* USB device identifier */ const struct scarlett2_device_info *info; +const char *series_name; };static const struct scarlett2_device_entry scarlett2_devices[] = {/* Supported Gen 2 devices */ - {USB_ID (0x1235 ,0x8203 ), &s6i6_gen2_info }, - {USB_ID (0x1235 ,0x8204 ), &s18i8_gen2_info }, - {USB_ID (0x1235 ,0x8201 ), &s18i20_gen2_info }, + {USB_ID (0x1235 ,0x8203 ), &s6i6_gen2_info,"Scarlett Gen 2" }, + {USB_ID (0x1235 ,0x8204 ), &s18i8_gen2_info,"Scarlett Gen 2" }, + {USB_ID (0x1235 ,0x8201 ), &s18i20_gen2_info,"Scarlett Gen 2" },/* Supported Gen 3 devices */ - {USB_ID (0x1235 ,0x8211 ), &solo_gen3_info }, - {USB_ID (0x1235 ,0x8210 ), &s2i2_gen3_info }, - {USB_ID (0x1235 ,0x8212 ), &s4i4_gen3_info }, - {USB_ID (0x1235 ,0x8213 ), &s8i6_gen3_info }, - {USB_ID (0x1235 ,0x8214 ), &s18i8_gen3_info }, - {USB_ID (0x1235 ,0x8215 ), &s18i20_gen3_info }, + {USB_ID (0x1235 ,0x8211 ), &solo_gen3_info,"Scarlett Gen 3" }, + {USB_ID (0x1235 ,0x8210 ), &s2i2_gen3_info,"Scarlett Gen 3" }, + {USB_ID (0x1235 ,0x8212 ), &s4i4_gen3_info,"Scarlett Gen 3" }, + {USB_ID (0x1235 ,0x8213 ), &s8i6_gen3_info,"Scarlett Gen 3" }, + {USB_ID (0x1235 ,0x8214 ), &s18i8_gen3_info,"Scarlett Gen 3" }, + {USB_ID (0x1235 ,0x8215 ), &s18i20_gen3_info,"Scarlett Gen 3" },/* Supported Clarett USB/Clarett+ devices */ - {USB_ID (0x1235 ,0x8208 ), &clarett_8pre_info }, - {USB_ID (0x1235 ,0x820c ), &clarett_8pre_info }, + {USB_ID (0x1235 ,0x8208 ), &clarett_8pre_info,"Clarett USB" }, + {USB_ID (0x1235 ,0x820c ), &clarett_8pre_info,"Clarett+" },/* End of list */ {0 ,NULL },
@@ -1205,8 +1207,8 @@ static int scarlett2_usb(if (err != req_buf_size) {usb_audio_err ( mixer->chip, -"Scarlett Gen 2/3 USB request result cmd %x was %d\n" , - cmd, err); +"%s USB request result cmd %x was %d\n" , + private->series_name, cmd, err); err = -EINVAL ; goto unlock; }
@@ -1222,9 +1224,8 @@ static int scarlett2_usb(if (err != resp_buf_size) {usb_audio_err ( mixer->chip, -"Scarlett Gen 2/3 USB response result cmd %x was %d " -"expected %zu\n" , - cmd, err, resp_buf_size); +"%s USB response result cmd %x was %d expected %zu\n" , + private->series_name, cmd, err, resp_buf_size); err = -EINVAL ; goto unlock; }
@@ -1240,9 +1241,10 @@ static int scarlett2_usb( resp->pad) { usb_audio_err( mixer->chip, - "Scarlett Gen 2/3 USB invalid response; " + "%s USB invalid response; " "cmd tx/rx %d/%d seq %d/%d size %d/%d " "error %d pad %d\n", + private->series_name, le32_to_cpu(req->cmd), le32_to_cpu(resp->cmd), le16_to_cpu(req->seq), le16_to_cpu(resp->seq), resp_size, le16_to_cpu(resp->size),
@@ -3798,7 +3800,7 @@ static int scarlett2_find_fc_interface(struct usb_device *dev,/* Initialise private data */ static int scarlett2_init_private (struct usb_mixer_interface *mixer, -const struct scarlett2_device_info *info) +const struct scarlett2_device_entry *entry) {struct scarlett2_data *private =kzalloc (sizeof (struct scarlett2_data ),GFP_KERNEL );
@@ -3814,7 +3816,8 @@ static int scarlett2_init_private(struct usb_mixer_interface *mixer, mixer->private_free = scarlett2_private_free; mixer->private_suspend = scarlett2_private_suspend; - private->info = info; + private->info = entry->info; + private->series_name = entry->series_name;scarlett2_count_mux_io (private); private->scarlett2_seq =0 ; private->mixer = mixer;
@@ -4135,19 +4138,28 @@ static int scarlett2_init_notify(struct usb_mixer_interface *mixer)return usb_submit_urb (mixer->urb,GFP_KERNEL ); } -static int snd_scarlett_gen2_controls_create (struct usb_mixer_interface *mixer) +static const struct scarlett2_device_entry *get_scarlett2_device_entry ( +struct usb_mixer_interface *mixer) {const struct scarlett2_device_entry *entry = scarlett2_devices; -int err;/* Find entry in scarlett2_devices */ while (entry->usb_id && entry->usb_id != mixer->chip->usb_id) entry++;if (!entry->usb_id) -return -EINVAL ; +return NULL ; + +return entry; +} + +static int snd_scarlett_gen2_controls_create ( +struct usb_mixer_interface *mixer, +const struct scarlett2_device_entry *entry) +{ +int err;/* Initialise private data */ - err =scarlett2_init_private (mixer, entry->info); + err =scarlett2_init_private (mixer, entry);if (err <0 )return err;
@@ -4231,17 +4243,30 @@ static int snd_scarlett_gen2_controls_create(struct usb_mixer_interface *mixer)int snd_scarlett_gen2_init (struct usb_mixer_interface *mixer) {struct snd_usb_audio *chip = mixer->chip; +const struct scarlett2_device_entry *entry;int err;/* only use UAC_VERSION_2 */ if (!mixer->protocol)return 0 ; +/* find entry in scarlett2_devices */ + entry =get_scarlett2_device_entry (mixer); +if (!entry) { +usb_audio_err (mixer->chip, +"%s: missing device entry for %04x:%04x\n" , + __func__, +USB_ID_VENDOR (chip->usb_id), +USB_ID_PRODUCT (chip->usb_id)); +return 0 ; + } +if (chip->setup &SCARLETT2_DISABLE ) {usb_audio_info (chip, -"Focusrite Scarlett Gen 2/3 Mixer Driver disabled " +"Focusrite %s Mixer Driver disabled " "by modprobe options (snd_usb_audio " "vid=0x%04x pid=0x%04x device_setup=%d)\n" , + entry->series_name,USB_ID_VENDOR (chip->usb_id),USB_ID_PRODUCT (chip->usb_id),SCARLETT2_DISABLE );
@@ -4249,14 +4274,16 @@ int snd_scarlett_gen2_init(struct usb_mixer_interface *mixer) }usb_audio_info (chip, -"Focusrite Scarlett Gen 2/3 Mixer Driver enabled (pid=0x%04x); " +"Focusrite %s Mixer Driver enabled (pid=0x%04x); " "report any issues to [email protected]" , + entry->series_name,USB_ID_PRODUCT (chip->usb_id)); - err =snd_scarlett_gen2_controls_create (mixer); + err =snd_scarlett_gen2_controls_create (mixer, entry);if (err <0 )usb_audio_err (mixer->chip, -"Error initialising Scarlett Mixer Driver: %d" , +"Error initialising %s Mixer Driver: %d" , + entry->series_name, err);return err;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 75/141 ALSA: scarlett2: Add Focusrite Clarett+ 2Pre and 4Pre support
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Geoffrey D. Bennett <[email protected]>
[ Upstream commit b61a3acada0031e7a4922d1340b4296ab95c260b ]
The Focusrite Clarett+ series uses the same protocol as the Scarlett Gen 2 and Gen 3 series. This patch adds support for the Clarett+ 2Pre and Clarett+ 4Pre similarly to the existing 8Pre support by adding appropriate entries to the scarlett2 driver.
The Clarett 2Pre USB and 4Pre USB presumably use the same protocol as well, so support for them can easily be added if someone can test.
--- sound/usb/mixer_quirks.c | 2 + sound/usb/mixer_scarlett_gen2.c | 97 ++++++++++++++++++++++++++++++++- 2 files changed, 98 insertions(+), 1 deletion(-)
sound/usb/mixer_quirks.c +2 -0
@@ -3448,6 +3448,8 @@ int snd_usb_mixer_apply_create_quirk(struct usb_mixer_interface *mixer)case USB_ID (0x1235 ,0x8214 ):/* Focusrite Scarlett 18i8 3rd Gen */ case USB_ID (0x1235 ,0x8215 ):/* Focusrite Scarlett 18i20 3rd Gen */ case USB_ID (0x1235 ,0x8208 ):/* Focusrite Clarett 8Pre USB */ +case USB_ID (0x1235 ,0x820a ):/* Focusrite Clarett+ 2Pre */ +case USB_ID (0x1235 ,0x820b ):/* Focusrite Clarett+ 4Pre */ case USB_ID (0x1235 ,0x820c ):/* Focusrite Clarett+ 8Pre */ err =snd_scarlett_gen2_init (mixer);break ;
sound/usb/mixer_scarlett_gen2.c +96 -1
121 lines not on this page · raw message
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 76/141 ALSA: scarlett2: Add Focusrite Clarett 2Pre and 4Pre USB support
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Geoffrey D. Bennett <[email protected]>
[ Upstream commit 2b17b489e47a956c8e93c8f1bcabb0343c851d90 ]
It has been confirmed that all devices in the Focusrite Clarett USB series work the same as the devices in the Clarett+ series. Add the missing PIDs to enable support for the Clarett 2Pre and 4Pre USB.
--- sound/usb/mixer_quirks.c | 2 ++ sound/usb/mixer_scarlett_gen2.c | 8 ++++++-- 2 files changed, 8 insertions(+), 2 deletions(-)
sound/usb/mixer_quirks.c +2 -0
@@ -3447,6 +3447,8 @@ int snd_usb_mixer_apply_create_quirk(struct usb_mixer_interface *mixer)case USB_ID (0x1235 ,0x8213 ):/* Focusrite Scarlett 8i6 3rd Gen */ case USB_ID (0x1235 ,0x8214 ):/* Focusrite Scarlett 18i8 3rd Gen */ case USB_ID (0x1235 ,0x8215 ):/* Focusrite Scarlett 18i20 3rd Gen */ +case USB_ID (0x1235 ,0x8206 ):/* Focusrite Clarett 2Pre USB */ +case USB_ID (0x1235 ,0x8207 ):/* Focusrite Clarett 4Pre USB */ case USB_ID (0x1235 ,0x8208 ):/* Focusrite Clarett 8Pre USB */ case USB_ID (0x1235 ,0x820a ):/* Focusrite Clarett+ 2Pre */ case USB_ID (0x1235 ,0x820b ):/* Focusrite Clarett+ 4Pre */
sound/usb/mixer_scarlett_gen2.c +6 -2
@@ -5,7 +5,7 @@* Supported models: * - 6i6/18i8/18i20 Gen 2 * - Solo/2i2/4i4/8i6/18i8/18i20 Gen 3 -* - Clarett 8Pre USB +* - Clarett 2Pre/4Pre/8Pre USB * - Clarett+ 2Pre/4Pre/8Pre * * Copyright (c) 2018-2023 by Geoffrey D. Bennett <g at b4.vu>
@@ -64,6 +64,8 @@* Gregory Rozzo for donating a 4Pre, and David Sherwood and Patrice * Peterson for usbmon output). * +* Support for Clarett 2Pre and 4Pre USB added in Oct 2023. +* * This ALSA mixer gives access to (model-dependent): * - input, output, mixer-matrix muxes * - mixer-matrix gain stages
@@ -999,6 +1001,8 @@ static const struct scarlett2_device_entry scarlett2_devices[] = { { USB_ID(0x1235, 0x8215), &s18i20_gen3_info, "Scarlett Gen 3" },/* Supported Clarett USB/Clarett+ devices */ + { USB_ID(0x1235, 0x8206), &clarett_2pre_info, "Clarett USB" }, + { USB_ID(0x1235, 0x8207), &clarett_4pre_info, "Clarett USB" }, { USB_ID(0x1235, 0x8208), &clarett_8pre_info, "Clarett USB" }, { USB_ID(0x1235, 0x820a), &clarett_2pre_info, "Clarett+" }, { USB_ID(0x1235, 0x820b), &clarett_4pre_info, "Clarett+" },
@@ -1197,7 +1201,7 @@ static const struct scarlett2_config [SCARLETT2_CONFIG_TALKBACK_MAP] = { .offset = 0xb0, .size = 16, .activate = 10 }, -/* Clarett+ 8Pre */ +/* Clarett USB and Clarett+ devices: 2Pre, 4Pre, 8Pre */ }, { [SCARLETT2_CONFIG_DIM_MUTE] = { .offset = 0x31, .size = 8, .activate = 2 },
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 77/141 PCI/DPC: Use FIELD_GET()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bjorn Helgaas <[email protected]>
[ Upstream commit 9a9eec4765737b9b2a8d6ae03de6480a5f12dd5c ]
Use FIELD_GET() to remove dependencies on the field position, i.e., the shift value. No functional change intended.
--- drivers/pci/pcie/dpc.c | 5 +++-- drivers/pci/quirks.c | 2 +- include/uapi/linux/pci_regs.h | 1 + 3 files changed, 5 insertions(+), 3 deletions(-)
drivers/pci/pcie/dpc.c +3 -2
@@ -9,6 +9,7 @@#define dev_fmt (fmt) "DPC: " fmt#include <linux/aer.h> +#include <linux/bitfield.h> #include <linux/delay.h> #include <linux/interrupt.h> #include <linux/init.h>
@@ -203,7 +204,7 @@ static void dpc_process_rp_pio_error(str/* Get First Error Pointer */ pci_read_config_word (pdev, cap +PCI_EXP_DPC_STATUS , &dpc_status); - first_error = (dpc_status &0x1f00 ) >>8 ; + first_error =FIELD_GET (PCI_EXP_DPC_RP_PIO_FEP , dpc_status);for (i =0 ; i <ARRAY_SIZE (rp_pio_error_string); i++) {if ((status & ~mask) & (1 << i))
@@ -339,7 +340,7 @@ void pci_dpc_init(struct pci_dev *pdev)/* Quirks may set dpc_rp_log_size if device or firmware is buggy */ if (!pdev->dpc_rp_log_size) { pdev->dpc_rp_log_size = - (cap &PCI_EXP_DPC_RP_PIO_LOG_SIZE ) >>8 ; +FIELD_GET (PCI_EXP_DPC_RP_PIO_LOG_SIZE , cap);if (pdev->dpc_rp_log_size <4 || pdev->dpc_rp_log_size >9 ) {pci_err (pdev,"RP PIO log size %u is invalid\n" , pdev->dpc_rp_log_size);
drivers/pci/quirks.c +1 -1
@@ -6105,7 +6105,7 @@ static void dpc_log_size(struct pci_devif (!(val &PCI_EXP_DPC_CAP_RP_EXT ))return ; -if (!((val &PCI_EXP_DPC_RP_PIO_LOG_SIZE ) >>8 )) { +if (FIELD_GET (PCI_EXP_DPC_RP_PIO_LOG_SIZE , val) ==0 ) {pci_info (dev,"Overriding RP PIO Log Size to 4\n" ); dev->dpc_rp_log_size =4 ; }
include/uapi/linux/pci_regs.h +1 -0
@@ -1043,6 +1043,7 @@#define PCI_EXP_DPC_STATUS_INTERRUPT 0x0008/* Interrupt Status */ #define PCI_EXP_DPC_RP_BUSY 0x0010/* Root Port Busy */ #define PCI_EXP_DPC_STATUS_TRIGGER_RSN_EXT 0x0060/* Trig Reason Extension */ +#define PCI_EXP_DPC_RP_PIO_FEP 0x1f00/* RP PIO First Err Ptr */ #define PCI_EXP_DPC_SOURCE_ID 0x0A/* DPC Source Identifier */
Greg Kroah-Hartman
maintainerPATCH 78/141 PCI: Simplify pcie_capability_clear_and_set_word() to ..._clear_word()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ilpo Järvinen <[email protected]>
[ Upstream commit 0fce6e5c87faec2c8bf28d2abc8cb595f4e244b6 ]
When using pcie_capability_clear_and_set_word() but not actually *setting* anything, use pcie_capability_clear_word() instead.
--- drivers/pci/pcie/aspm.c | 8 ++++---- drivers/pci/quirks.c | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-)
drivers/pci/pcie/aspm.c +4 -4
@@ -743,10 +743,10 @@ static void pcie_config_aspm_l1ss(struct pcie_link_state *link, u32 state)* in pcie_config_aspm_link(). */ if (enable_req & (ASPM_STATE_L1_1 |ASPM_STATE_L1_2 )) { -pcie_capability_clear_and_set_word (child,PCI_EXP_LNKCTL , -PCI_EXP_LNKCTL_ASPM_L1 ,0 ); -pcie_capability_clear_and_set_word (parent,PCI_EXP_LNKCTL , -PCI_EXP_LNKCTL_ASPM_L1 ,0 ); +pcie_capability_clear_word (child,PCI_EXP_LNKCTL , +PCI_EXP_LNKCTL_ASPM_L1 ); +pcie_capability_clear_word (parent,PCI_EXP_LNKCTL , +PCI_EXP_LNKCTL_ASPM_L1 ); } val =0 ;
drivers/pci/quirks.c +3 -3
@@ -4478,9 +4478,9 @@ static void quirk_disable_root_port_attributes(struct pci_dev *pdev)pci_info (root_port,"Disabling No Snoop/Relaxed Ordering Attributes to avoid PCIe Completion erratum in %s\n" ,dev_name (&pdev->dev)); -pcie_capability_clear_and_set_word (root_port,PCI_EXP_DEVCTL , -PCI_EXP_DEVCTL_RELAX_EN | -PCI_EXP_DEVCTL_NOSNOOP_EN ,0 ); +pcie_capability_clear_word (root_port,PCI_EXP_DEVCTL , +PCI_EXP_DEVCTL_RELAX_EN | +PCI_EXP_DEVCTL_NOSNOOP_EN ); }/*
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 79/141 ALSA: scarlett2: Rename scarlett_gen2 to scarlett2
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Geoffrey D. Bennett <[email protected]>
[ Upstream commit efc3d7d20361cc59325a9f0525e079333b4459c0 ]
This driver was originally developed for the Focusrite Scarlett Gen 2 series. Since then Focusrite have used a similar protocol for their Gen 3, Gen 4, Clarett USB, Clarett+, and Vocaster series.
Let's call this common protocol the "Scarlett 2 Protocol" and rename the driver to scarlett2 to not imply that it is restricted to Gen 2 series devices.
---
MAINTAINERS | 2 +-
sound/usb/Makefile | 2 +-
sound/usb/mixer_quirks.c | 4 ++--
.../usb/{mixer_scarlett_gen2.c => mixer_scarlett2.c} | 12 +++++++-----
sound/usb/mixer_scarlett2.h | 7 +++++++
sound/usb/mixer_scarlett_gen2.h | 7 -------
6 files changed, 18 insertions(+), 16 deletions(-)
rename sound/usb/{mixer_scarlett_gen2.c => mixer_scarlett2.c} (99%)
create mode 100644 sound/usb/mixer_scarlett2.h
delete mode 100644 sound/usb/mixer_scarlett_gen2.hMAINTAINERS +1 -1
@@ -8031,7 +8031,7 @@ M: Geoffrey D. Bennett <[email protected]> L: [email protected] (moderated for non-subscribers) S: Maintained T: git git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound.git -F: sound/usb/mixer_scarlett_gen2.c +F: sound/usb/mixer_scarlett2.c FORCEDETH GIGABIT ETHERNET DRIVER M: Rain River <[email protected]>
sound/usb/Makefile +1 -1
@@ -12,7 +12,7 @@ snd-usb-audio-objs := card.o \ mixer.o \ mixer_quirks.o \ mixer_scarlett.o \ - mixer_scarlett_gen2.o \ + mixer_scarlett2.o \ mixer_us16x08.o \ mixer_s1810c.o \ pcm.o \
sound/usb/mixer_quirks.c +2 -2
@@ -33,7 +33,7 @@#include "mixer.h" #include "mixer_quirks.h" #include "mixer_scarlett.h" -#include "mixer_scarlett_gen2.h" +#include "mixer_scarlett2.h" #include "mixer_us16x08.h" #include "mixer_s1810c.h" #include "helper.h"
@@ -3453,7 +3453,7 @@ int snd_usb_mixer_apply_create_quirk(struct usb_mixer_interface *mixer)case USB_ID (0x1235 ,0x820a ):/* Focusrite Clarett+ 2Pre */ case USB_ID (0x1235 ,0x820b ):/* Focusrite Clarett+ 4Pre */ case USB_ID (0x1235 ,0x820c ):/* Focusrite Clarett+ 8Pre */ - err =snd_scarlett_gen2_init (mixer); + err =snd_scarlett2_init (mixer);break ;case USB_ID (0x041e ,0x323b ):/* Creative Sound Blaster E1 */
sound/usb/mixer_scarlett2.c renamed from sound/usb/mixer_scarlett_gen2.c +7 -5
@@ -1,6 +1,8 @@// SPDX-License-Identifier: GPL-2.0 /* -* Focusrite Scarlett Gen 2/3 and Clarett USB/Clarett+ Driver for ALSA +* Focusrite Scarlett 2 Protocol Driver for ALSA +* (including Scarlett 2nd Gen, 3rd Gen, Clarett USB, and Clarett+ +* series products) * * Supported models: * - 6i6/18i8/18i20 Gen 2
@@ -149,7 +151,7 @@#include "mixer.h" #include "helper.h" -#include "mixer_scarlett_gen2.h" +#include "mixer_scarlett2.h" /* device_setup value to allow turning MSD mode back on */ #define SCARLETT2_MSD_ENABLE 0x02
@@ -4251,7 +4253,7 @@ static const struct scarlett2_device_entry *get_scarlett2_device_entry(return entry; } -static int snd_scarlett_gen2_controls_create ( +static int snd_scarlett2_controls_create (struct usb_mixer_interface *mixer,const struct scarlett2_device_entry *entry) {
@@ -4339,7 +4341,7 @@ static int snd_scarlett_gen2_controls_create(return 0 ; } -int snd_scarlett_gen2_init (struct usb_mixer_interface *mixer) +int snd_scarlett2_init (struct usb_mixer_interface *mixer) {struct snd_usb_audio *chip = mixer->chip;const struct scarlett2_device_entry *entry;
@@ -4378,7 +4380,7 @@ int snd_scarlett_gen2_init(struct usb_mixer_interface *mixer) entry->series_name, USB_ID_PRODUCT(chip->usb_id)); - err =snd_scarlett_gen2_controls_create (mixer, entry); + err =snd_scarlett2_controls_create (mixer, entry);if (err <0 ) usb_audio_err(mixer->chip, "Error initialising %s Mixer Driver: %d",
sound/usb/mixer_scarlett2.h new file +7 -0
@@ -0,0 +1,7 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef __USB_MIXER_SCARLETT2_H +#define __USB_MIXER_SCARLETT2_H + +int snd_scarlett2_init (struct usb_mixer_interface *mixer); + +#endif /* __USB_MIXER_SCARLETT2_H */
sound/usb/mixer_scarlett_gen2.h deleted +0 -7
@@ -1,7 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -#ifndef __USB_MIXER_SCARLETT_GEN2_H -#define __USB_MIXER_SCARLETT_GEN2_H - -int snd_scarlett_gen2_init (struct usb_mixer_interface *mixer); - -#endif /* __USB_MIXER_SCARLETT_GEN2_H */
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 80/141 drm: panel-orientation-quirks: Add quirk for Lenovo Legion Go
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Brenton Simpson <[email protected]>
[ Upstream commit 430143b0d3611f4a9c8434319e5e504244749e79 ]
The Legion Go has a 2560x1600 portrait screen, with the native "up" facing the right controller (90° CW from the rest of the device).
--- drivers/gpu/drm/drm_panel_orientation_quirks.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/gpu/drm/drm_panel_orientation_quirks.c +6 -0
@@ -348,6 +348,12 @@ static const struct dmi_system_id orientation_data[] = { DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "IdeaPad Duet 3 10IGL5"), }, .driver_data = (void *)&lcd1200x1920_rightside_up, + }, { /* Lenovo Legion Go 8APU1 */ + .matches = { +DMI_EXACT_MATCH (DMI_SYS_VENDOR ,"LENOVO" ), + DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "Legion Go 8APU1"), + }, + .driver_data = (void *)&lcd1600x2560_leftside_up, }, { /* Lenovo Yoga Book X90F / X90L */ .matches = { DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Intel Corporation"),
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 81/141 usb: xhci: Add timeout argument in address_device USB HCD callback
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hardik Gajjar <[email protected]>
[ Upstream commit a769154c7cac037914ba375ae88aae55b2c853e0 ]
- The HCD address_device callback now accepts a user-defined timeout value in milliseconds, providing better control over command execution times.
- The default timeout value for the address_device command has been set to 5000 ms, aligning with the USB 3.2 specification. However, this timeout can be adjusted as needed.
- The xhci_setup_device function has been updated to accept the timeout value, allowing it to specify the maximum wait time for the command operation to complete.
- The hub driver has also been updated to accommodate the newly added timeout parameter during the SET_ADDRESS request.
Stable-dep-of: 5a1ccf0c72cf ("usb: new quirk to reduce the SET_ADDRESS request timeout")
--- drivers/usb/core/hub.c | 2 +- drivers/usb/host/xhci-mem.c | 2 ++ drivers/usb/host/xhci-ring.c | 11 ++++++----- drivers/usb/host/xhci.c | 23 ++++++++++++++++------- drivers/usb/host/xhci.h | 9 +++++++-- include/linux/usb/hcd.h | 5 +++-- 6 files changed, 35 insertions(+), 17 deletions(-)
drivers/usb/core/hub.c +1 -1
@@ -4661,7 +4661,7 @@ static int hub_set_address(struct usb_device *udev, int devnum)if (udev->state !=USB_STATE_DEFAULT )return -EINVAL ;if (hcd->driver->address_device) - retval = hcd->driver->address_device (hcd, udev); + retval = hcd->driver->address_device (hcd, udev,USB_CTRL_SET_TIMEOUT );else retval = usb_control_msg(udev, usb_sndaddr0pipe(), USB_REQ_SET_ADDRESS, 0, devnum, 0,
drivers/usb/host/xhci-mem.c +2 -0
@@ -1752,6 +1752,8 @@ struct xhci_command *xhci_alloc_command(struct xhci_hcd *xhci, } command->status =0 ; +/* set default timeout to 5000 ms */ + command->timeout_ms =XHCI_CMD_DEFAULT_TIMEOUT ;INIT_LIST_HEAD (&command->cmd_list);return command; }
drivers/usb/host/xhci-ring.c +6 -5
@@ -332,9 +332,10 @@ void xhci_ring_cmd_db(struct xhci_hcd *xhci)readl (&xhci->dba->doorbell[0 ]); } -static bool xhci_mod_cmd_timer (struct xhci_hcd *xhci,unsigned long delay) +static bool xhci_mod_cmd_timer (struct xhci_hcd *xhci) { -return mod_delayed_work (system_wq, &xhci->cmd_timer, delay); +return mod_delayed_work (system_wq, &xhci->cmd_timer, +msecs_to_jiffies (xhci->current_cmd->timeout_ms)); }static struct xhci_command *xhci_next_queued_cmd (struct xhci_hcd *xhci)
@@ -378,7 +379,7 @@ static void xhci_handle_stopped_cmd_ring(struct xhci_hcd *xhci,if ((xhci->cmd_ring->dequeue != xhci->cmd_ring->enqueue) && !(xhci->xhc_state &XHCI_STATE_DYING )) { xhci->current_cmd = cur_cmd; -xhci_mod_cmd_timer (xhci,XHCI_CMD_DEFAULT_TIMEOUT ); +xhci_mod_cmd_timer (xhci);xhci_ring_cmd_db (xhci); } }
@@ -1762,7 +1763,7 @@ static void handle_cmd_completion(struct xhci_hcd *xhci,if (!list_is_singular (&xhci->cmd_list)) { xhci->current_cmd =list_first_entry (&cmd->cmd_list, struct xhci_command, cmd_list); -xhci_mod_cmd_timer (xhci,XHCI_CMD_DEFAULT_TIMEOUT ); +xhci_mod_cmd_timer (xhci); }else if (xhci->current_cmd == cmd) { xhci->current_cmd =NULL ; }
@@ -4339,7 +4340,7 @@ static int queue_command(struct xhci_hcd *xhci, struct xhci_command *cmd,/* if there are no other commands queued we start the timeout timer */ if (list_empty (&xhci->cmd_list)) { xhci->current_cmd = cmd; -xhci_mod_cmd_timer (xhci,XHCI_CMD_DEFAULT_TIMEOUT ); +xhci_mod_cmd_timer (xhci); }list_add_tail (&cmd->cmd_list, &xhci->cmd_list);
drivers/usb/host/xhci.c +16 -7
@@ -4170,12 +4170,18 @@ int xhci_alloc_dev(struct usb_hcd *hcd, struct usb_device *udev)return 0 ; } -/* -* Issue an Address Device command and optionally send a corresponding -* SetAddress request to the device. +/** +* xhci_setup_device - issues an Address Device command to assign a unique +* USB bus address. +* @hcd: USB host controller data structure. +* @udev: USB dev structure representing the connected device. +* @setup: Enum specifying setup mode: address only or with context. +* @timeout_ms: Max wait time (ms) for the command operation to complete. +* +* Return: 0 if successful; otherwise, negative error code. */ static int xhci_setup_device (struct usb_hcd *hcd,struct usb_device *udev, -enum xhci_setup_dev setup) +enum xhci_setup_dev setup,unsigned int timeout_ms) {const char *act = setup ==SETUP_CONTEXT_ONLY ?"context" :"address" ;unsigned long flags;
@@ -4232,6 +4238,7 @@ static int xhci_setup_device(struct usb_hcd *hcd, struct usb_device *udev, } command->in_ctx = virt_dev->in_ctx; + command->timeout_ms = timeout_ms; slot_ctx =xhci_get_slot_ctx (xhci, virt_dev->in_ctx); ctrl_ctx =xhci_get_input_control_ctx (virt_dev->in_ctx);
@@ -4358,14 +4365,16 @@ static int xhci_setup_device(struct usb_hcd *hcd, struct usb_device *udev,return ret; } -static int xhci_address_device (struct usb_hcd *hcd,struct usb_device *udev) +static int xhci_address_device (struct usb_hcd *hcd,struct usb_device *udev, +unsigned int timeout_ms) { -return xhci_setup_device (hcd, udev,SETUP_CONTEXT_ADDRESS ); +return xhci_setup_device (hcd, udev,SETUP_CONTEXT_ADDRESS , timeout_ms); }static int xhci_enable_device (struct usb_hcd *hcd,struct usb_device *udev) { -return xhci_setup_device (hcd, udev,SETUP_CONTEXT_ONLY ); +return xhci_setup_device (hcd, udev,SETUP_CONTEXT_ONLY , +XHCI_CMD_DEFAULT_TIMEOUT ); }/*
drivers/usb/host/xhci.h +7 -2
@@ -815,6 +815,8 @@ struct xhci_command {struct completion *completion;union xhci_trb *command_trb;struct list_head cmd_list; +/* xHCI command response timeout in milliseconds */ +unsigned int timeout_ms; };/* drop context bitmasks */
@@ -1574,8 +1576,11 @@ struct xhci_td {unsigned int num_trbs; }; -/* xHCI command default timeout value */ -#define XHCI_CMD_DEFAULT_TIMEOUT (5 * HZ) +/* +* xHCI command default timeout value in milliseconds. +* USB 3.2 spec, section 9.2.6.1 +*/ +#define XHCI_CMD_DEFAULT_TIMEOUT 5000/* command descriptor */ struct xhci_cd {
include/linux/usb/hcd.h +3 -2
@@ -371,8 +371,9 @@ struct hc_driver {* or bandwidth constraints. */ void (*reset_bandwidth)(struct usb_hcd *,struct usb_device *); -/* Returns the hardware-chosen device address */ -int (*address_device)(struct usb_hcd *,struct usb_device *udev); +/* Set the hardware-chosen device address */ +int (*address_device)(struct usb_hcd *,struct usb_device *udev, +unsigned int timeout_ms);/* prepares the hardware to send commands to the device */ int (*enable_device)(struct usb_hcd *,struct usb_device *udev);/* Notifies the HCD after a hub descriptor is fetched.
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 82/141 usb: new quirk to reduce the SET_ADDRESS request timeout
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hardik Gajjar <[email protected]>
[ Upstream commit 5a1ccf0c72cf917ff3ccc131d1bb8d19338ffe52 ]
This patch introduces a new USB quirk, USB_QUIRK_SHORT_SET_ADDRESS_REQ_TIMEOUT, which modifies the timeout value for the SET_ADDRESS request. The standard timeout for USB request/command is 5000 ms, as recommended in the USB 3.2 specification (section 9.2.6.1).
However, certain scenarios, such as connecting devices through an APTIV hub, can lead to timeout errors when the device enumerates as full speed initially and later switches to high speed during chirp negotiation.
In such cases, USB analyzer logs reveal that the bus suspends for 5 seconds due to incorrect chirp parsing and resumes only after two consecutive timeout errors trigger a hub driver reset.
Packet(54) Dir(?) Full Speed J(997.100 us) Idle( 2.850 us) _______| Time Stamp(28 . 105 910 682) _______|_____________________________________________________________Ch0 Packet(55) Dir(?) Full Speed J(997.118 us) Idle( 2.850 us) _______| Time Stamp(28 . 106 910 632) _______|_____________________________________________________________Ch0 Packet(56) Dir(?) Full Speed J(399.650 us) Idle(222.582 us) _______| Time Stamp(28 . 107 910 600) _______|_____________________________________________________________Ch0 Packet(57) Dir Chirp J( 23.955 ms) Idle(115.169 ms)
_______| Time Stamp(28 . 108 532 832) _______|_____________________________________________________________Ch0 Packet(58) Dir(?) Full Speed J (Suspend)( 5.347 sec) Idle( 5.366 us) _______| Time Stamp(28 . 247 657 600) _______|_____________________________________________________________Ch0
This 5-second delay in device enumeration is undesirable, particularly in automotive applications where quick enumeration is crucial (ideally within 3 seconds).
The newly introduced quirks provide the flexibility to align with a 3-second time limit, as required in specific contexts like automotive applications.
By reducing the SET_ADDRESS request timeout to 500 ms, the system can respond more swiftly to errors, initiate rapid recovery, and ensure efficient device enumeration. This change is vital for scenarios where rapid smartphone enumeration and screen projection are essential.
To use the quirk, please write "vendor_id:product_id:p" to /sys/bus/usb/drivers/hub/module/parameter/quirks
For example,
echo "0x2c48:0x0132:p" > /sys/bus/usb/drivers/hub/module/parameters/quirks"
--- Documentation/admin-guide/kernel-parameters.txt | 3 +++ drivers/usb/core/hub.c | 15 +++++++++++++-- drivers/usb/core/quirks.c | 7 +++++++ include/linux/usb/quirks.h | 3 +++ 4 files changed, 26 insertions(+), 2 deletions(-)
Documentation/admin-guide/kernel-parameters.txt +3 -0
@@ -6603,6 +6603,9 @@ pause after every control message); o = USB_QUIRK_HUB_SLOW_RESET (Hub needs extra delay after resetting its port); + p = USB_QUIRK_SHORT_SET_ADDRESS_REQ_TIMEOUT + (Reduce timeout of the SET_ADDRESS + request from 5000 ms to 500 ms); Example: quirks=0781:5580:bk,0a5c:5834:gij usbhid.mousepoll=
drivers/usb/core/hub.c +13 -2
@@ -60,6 +60,12 @@#define USB_PING_RESPONSE_TIME 400/* ns */ #define USB_REDUCE_FRAME_INTR_BINTERVAL 9 +/* +* The SET_ADDRESS request timeout will be 500 ms when +* USB_QUIRK_SHORT_SET_ADDRESS_REQ_TIMEOUT quirk flag is set. +*/ +#define USB_SHORT_SET_ADDRESS_REQ_TIMEOUT 500/* ms */ +/* Protect struct usb_device->state and ->children members * Note: Both are also protected by ->dev.sem, except that ->state can * change to USB_STATE_NOTATTACHED even when the semaphore isn't held. */
@@ -4648,7 +4654,12 @@ EXPORT_SYMBOL_GPL(usb_ep0_reinit);static int hub_set_address (struct usb_device *udev,int devnum) {int retval; +unsigned int timeout_ms =USB_CTRL_SET_TIMEOUT ;struct usb_hcd *hcd =bus_to_hcd (udev->bus); +struct usb_hub *hub =usb_hub_to_struct_hub (udev->parent); + +if (hub->hdev->quirks &USB_QUIRK_SHORT_SET_ADDRESS_REQ_TIMEOUT ) + timeout_ms =USB_SHORT_SET_ADDRESS_REQ_TIMEOUT ;/* * The host controller will choose the device address,
@@ -4661,11 +4672,11 @@ static int hub_set_address(struct usb_device *udev, int devnum)if (udev->state !=USB_STATE_DEFAULT )return -EINVAL ;if (hcd->driver->address_device) - retval = hcd->driver->address_device (hcd, udev,USB_CTRL_SET_TIMEOUT ); + retval = hcd->driver->address_device (hcd, udev, timeout_ms);else retval =usb_control_msg (udev,usb_sndaddr0pipe (),USB_REQ_SET_ADDRESS ,0 , devnum,0 , -NULL ,0 ,USB_CTRL_SET_TIMEOUT ); +NULL ,0 , timeout_ms);if (retval ==0 ) {update_devnum (udev, devnum);/* Device now using proper address. */
drivers/usb/core/quirks.c +7 -0
@@ -138,6 +138,9 @@ static int quirks_param_set(const char *value, const struct kernel_param *kp)case 'o' : flags |=USB_QUIRK_HUB_SLOW_RESET ;break ; +case 'p' : + flags |=USB_QUIRK_SHORT_SET_ADDRESS_REQ_TIMEOUT ; +break ;/* Ignore unrecognized flag characters */ } }
@@ -527,6 +530,10 @@ static const struct usb_device_id usb_quirk_list[] = { { USB_DEVICE(0x2386, 0x350e), .driver_info = USB_QUIRK_NO_LPM }, + /* APTIV AUTOMOTIVE HUB */ + { USB_DEVICE(0x2c48, 0x0132), .driver_info = + USB_QUIRK_SHORT_SET_ADDRESS_REQ_TIMEOUT }, + /* DJI CineSSD */ { USB_DEVICE(0x2ca3, 0x0031), .driver_info = USB_QUIRK_NO_LPM },
include/linux/usb/quirks.h +3 -0
@@ -72,4 +72,7 @@/* device has endpoints that should be ignored */ #define USB_QUIRK_ENDPOINT_IGNORE BIT(15) +/* short SET_ADDRESS request timeout */ +#define USB_QUIRK_SHORT_SET_ADDRESS_REQ_TIMEOUT BIT(16) +#endif /* __LINUX_USB_QUIRKS_H */
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 83/141 clk: Remove prepare_lock hold assertion in __clk_release()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stephen Boyd <[email protected]>
[ Upstream commit 8358a76cfb47c9a5af627a0c4e7168aa14fa25f6 ]
Removing this assertion lets us move the kref_put() call outside the prepare_lock section. We don't need to hold the prepare_lock here to free memory and destroy the clk_core structure. We've already unlinked the clk from the clk tree and by the time the release function runs nothing holds a reference to the clk_core anymore so anything with the pointer can't access the memory that's being freed anyway. Way back in commit 496eadf821c2 ("clk: Use lockdep asserts to find missing hold of prepare_lock") we didn't need to have this assertion either.
--- drivers/clk/clk.c | 2 -- 1 file changed, 2 deletions(-)
drivers/clk/clk.c +0 -2
@@ -4230,8 +4230,6 @@ static void __clk_release(struct kref *ref) { struct clk_core *core = container_of(ref, struct clk_core, ref); -lockdep_assert_held (&prepare_lock); -clk_core_free_parent_map (core);kfree_const (core->name);kfree (core);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 84/141 clk: Print an info line before disabling unused clocks
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Konrad Dybcio <[email protected]>
[ Upstream commit 12ca59b91d04df32e41be5a52f0cabba912c11de ]
Currently, the regulator framework informs us before calling into their unused cleanup paths, which eases at least some debugging. The same could be beneficial for clocks, so that random shutdowns shortly after most initcalls are done can be less of a guess.
Add a pr_info before disabling unused clocks to do so.
Stable-dep-of: e581cf5d2162 ("clk: Get runtime PM before walking tree during disable_unused")
--- drivers/clk/clk.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/clk/clk.c +2 -0
@@ -1388,6 +1388,8 @@ static int __init clk_disable_unused(void)return 0 ; } +pr_info ("clk: Disabling unused clocks\n" ); +clk_prepare_lock ();hlist_for_each_entry (core, &clk_root_list, child_node)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 85/141 clk: Initialize struct clk_core kref earlier
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stephen Boyd <[email protected]>
[ Upstream commit 9d05ae531c2cff20d5d527f04e28d28e04379929 ]
Initialize this kref once we allocate memory for the struct clk_core so that we can reuse the release function to free any memory associated with the structure. This mostly consolidates code, but also clarifies that the kref lifetime exists once the container structure (struct clk_core) is allocated instead of leaving it in a half-baked state for most of __clk_core_init().
Stable-dep-of: e581cf5d2162 ("clk: Get runtime PM before walking tree during disable_unused")
--- drivers/clk/clk.c | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-)
drivers/clk/clk.c +13 -15
@@ -3838,8 +3838,6 @@ static int __clk_core_init(struct clk_core *core) }clk_core_reparent_orphans_nolock (); - -kref_init (&core->ref); out:clk_pm_runtime_put (core); unlock:
@@ -4068,6 +4066,16 @@ static void clk_core_free_parent_map(struct clk_core *core)kfree (core->parents); } +/* Free memory allocated for a struct clk_core */ +static void __clk_release (struct kref *ref) +{ + struct clk_core *core = container_of(ref, struct clk_core, ref); + +clk_core_free_parent_map (core); +kfree_const (core->name); +kfree (core); +} +static struct clk *__clk_register (struct device *dev,struct device_node *np,struct clk_hw *hw) {
@@ -4088,6 +4096,8 @@ __clk_register(struct device *dev, struct device_node *np, struct clk_hw *hw) goto fail_out; } +kref_init (&core->ref); + core->name =kstrdup_const (init->name,GFP_KERNEL );if (!core->name) { ret = -ENOMEM ;
@@ -4142,12 +4152,10 @@ __clk_register(struct device *dev, struct device_node *np, struct clk_hw *hw) hw->clk =NULL ; fail_create_clk: -clk_core_free_parent_map (core); fail_parents: fail_ops: -kfree_const (core->name); fail_name: -kfree (core); +kref_put (&core->ref, __clk_release); fail_out:return ERR_PTR (ret); }
@@ -4227,16 +4235,6 @@ int of_clk_hw_register(struct device_node *node, struct clk_hw *hw) }EXPORT_SYMBOL_GPL (of_clk_hw_register); -/* Free memory allocated for a clock. */ -static void __clk_release (struct kref *ref) -{ - struct clk_core *core = container_of(ref, struct clk_core, ref); - -clk_core_free_parent_map (core); -kfree_const (core->name); -kfree (core); -} -/* * Empty clk_ops for unregistered clocks. These are used temporarily * after clk_unregister() was called on a clock and until last clock
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 86/141 clk: Get runtime PM before walking tree during disable_unused
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stephen Boyd <[email protected]>
[ Upstream commit e581cf5d216289ef292d1a4036d53ce90e122469 ]
Doug reported [1] the following hung task:
INFO: task swapper/0:1 blocked for more than 122 seconds.
Not tainted 5.15.149-21875-gf795ebc40eb8 #1
"echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
task:swapper/0 state:D stack: 0 pid: 1 ppid: 0 flags:0x00000008
Call trace:
__switch_to+0xf4/0x1f4
__schedule+0x418/0xb80
schedule+0x5c/0x10c
rpm_resume+0xe0/0x52c
rpm_resume+0x178/0x52c
__pm_runtime_resume+0x58/0x98
clk_pm_runtime_get+0x30/0xb0
clk_disable_unused_subtree+0x58/0x208
clk_disable_unused_subtree+0x38/0x208
clk_disable_unused_subtree+0x38/0x208
clk_disable_unused_subtree+0x38/0x208
clk_disable_unused_subtree+0x38/0x208
clk_disable_unused+0x4c/0xe4
do_one_initcall+0xcc/0x2d8
do_initcall_level+0xa4/0x148
do_initcalls+0x5c/0x9c
do_basic_setup+0x24/0x30
kernel_init_freeable+0xec/0x164
kernel_init+0x28/0x120
ret_from_fork+0x10/0x20
INFO: task kworker/u16:0:9 blocked for more than 122 seconds.
Not tainted 5.15.149-21875-gf795ebc40eb8 #1
"echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
task:kworker/u16:0 state:D stack: 0 pid: 9 ppid: 2 flags:0x00000008
Workqueue: events_unbound deferred_probe_work_func
Call trace:
__switch_to+0xf4/0x1f4
__schedule+0x418/0xb80
schedule+0x5c/0x10c
schedule_preempt_disabled+0x2c/0x48
__mutex_lock+0x238/0x488
__mutex_lock_slowpath+0x1c/0x28
mutex_lock+0x50/0x74
clk_prepare_lock+0x7c/0x9c
clk_core_prepare_lock+0x20/0x44
clk_prepare+0x24/0x30
clk_bulk_prepare+0x40/0xb0
mdss_runtime_resume+0x54/0x1c8
pm_generic_runtime_resume+0x30/0x44
__genpd_runtime_resume+0x68/0x7c
genpd_runtime_resume+0x108/0x1f4
__rpm_callback+0x84/0x144
rpm_callback+0x30/0x88
rpm_resume+0x1f4/0x52c
rpm_resume+0x178/0x52c
__pm_runtime_resume+0x58/0x98
__device_attach+0xe0/0x170
device_initial_probe+0x1c/0x28
bus_probe_device+0x3c/0x9c
device_add+0x644/0x814
mipi_dsi_device_register_full+0xe4/0x170
devm_mipi_dsi_device_register_full+0x28/0x70
ti_sn_bridge_probe+0x1dc/0x2c0
auxiliary_bus_probe+0x4c/0x94
really_probe+0xcc/0x2c8
__driver_probe_device+0xa8/0x130
driver_probe_device+0x48/0x110
__device_attach_driver+0xa4/0xcc
bus_for_each_drv+0x8c/0xd8
__device_attach+0xf8/0x170
device_initial_probe+0x1c/0x28
bus_probe_device+0x3c/0x9c
deferred_probe_work_func+0x9c/0xd8
process_one_work+0x148/0x518
worker_thread+0x138/0x350
kthread+0x138/0x1e0
ret_from_fork+0x10/0x20The first thread is walking the clk tree and calling clk_pm_runtime_get() to power on devices required to read the clk hardware via struct clk_ops::is_enabled(). This thread holds the clk prepare_lock, and is trying to runtime PM resume a device, when it finds that the device is in the process of resuming so the thread schedule()s away waiting for the device to finish resuming before continuing. The second thread is runtime PM resuming the same device, but the runtime resume callback is calling clk_prepare(), trying to grab the prepare_lock waiting on the first thread.
This is a classic ABBA deadlock. To properly fix the deadlock, we must never runtime PM resume or suspend a device with the clk prepare_lock held. Actually doing that is near impossible today because the global prepare_lock would have to be dropped in the middle of the tree, the device runtime PM resumed/suspended, and then the prepare_lock grabbed again to ensure consistency of the clk tree topology. If anything changes with the clk tree in the meantime, we've lost and will need to start the operation all over again.
Luckily, most of the time we're simply incrementing or decrementing the runtime PM count on an active device, so we don't have the chance to schedule away with the prepare_lock held. Let's fix this immediate problem that can be triggered more easily by simply booting on Qualcomm sc7180.
Introduce a list of clk_core structures that have been registered, or are in the process of being registered, that require runtime PM to operate. Iterate this list and call clk_pm_runtime_get() on each of them without holding the prepare_lock during clk_disable_unused(). This way we can be certain that the runtime PM state of the devices will be active and resumed so we can't schedule away while walking the clk tree with the prepare_lock held. Similarly, call clk_pm_runtime_put() without the prepare_lock held to properly drop the runtime PM reference. We remove the calls to clk_pm_runtime_{get,put}() in this path because they're superfluous now that we know the devices are runtime resumed.
--- drivers/clk/clk.c | 117 +++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 105 insertions(+), 12 deletions(-)
drivers/clk/clk.c +105 -12
@@ -37,6 +37,10 @@ static HLIST_HEAD(clk_root_list);static HLIST_HEAD (clk_orphan_list);static LIST_HEAD (clk_notifier_list); +/* List of registered clks that use runtime PM */ +static HLIST_HEAD (clk_rpm_list); +static DEFINE_MUTEX (clk_rpm_list_lock); +static const struct hlist_head *all_lists[] = { &clk_root_list, &clk_orphan_list,
@@ -59,6 +63,7 @@ struct clk_core {struct clk_hw *hw;struct module *owner;struct device *dev; +struct hlist_node rpm_node;struct device_node *of_node;struct clk_core *parent;struct clk_parent_map *parents;
@@ -122,6 +127,89 @@ static void clk_pm_runtime_put(struct clk_core *core)pm_runtime_put_sync (core->dev); } +/** +* clk_pm_runtime_get_all() - Runtime "get" all clk provider devices +* +* Call clk_pm_runtime_get() on all runtime PM enabled clks in the clk tree so +* that disabling unused clks avoids a deadlock where a device is runtime PM +* resuming/suspending and the runtime PM callback is trying to grab the +* prepare_lock for something like clk_prepare_enable() while +* clk_disable_unused_subtree() holds the prepare_lock and is trying to runtime +* PM resume/suspend the device as well. +* +* Context: Acquires the 'clk_rpm_list_lock' and returns with the lock held on +* success. Otherwise the lock is released on failure. +* +* Return: 0 on success, negative errno otherwise. +*/ +static int clk_pm_runtime_get_all (void ) +{ +int ret; +struct clk_core *core, *failed; + +/* +* Grab the list lock to prevent any new clks from being registered +* or unregistered until clk_pm_runtime_put_all(). +*/ +mutex_lock (&clk_rpm_list_lock); + +/* +* Runtime PM "get" all the devices that are needed for the clks +* currently registered. Do this without holding the prepare_lock, to +* avoid the deadlock. +*/ +hlist_for_each_entry (core, &clk_rpm_list, rpm_node) { + ret =clk_pm_runtime_get (core); +if (ret) { + failed = core; +pr_err ("clk: Failed to runtime PM get '%s' for clk '%s'\n" , +dev_name (failed->dev), failed->name); + goto err; + } + } + +return 0 ; + +err: +hlist_for_each_entry (core, &clk_rpm_list, rpm_node) { +if (core == failed) +break ; + +clk_pm_runtime_put (core); + } +mutex_unlock (&clk_rpm_list_lock); + +return ret; +} + +/** +* clk_pm_runtime_put_all() - Runtime "put" all clk provider devices +* +* Put the runtime PM references taken in clk_pm_runtime_get_all() and release +* the 'clk_rpm_list_lock'. +*/ +static void clk_pm_runtime_put_all (void ) +{ +struct clk_core *core; + +hlist_for_each_entry (core, &clk_rpm_list, rpm_node) +clk_pm_runtime_put (core); +mutex_unlock (&clk_rpm_list_lock); +} + +static void clk_pm_runtime_init (struct clk_core *core) +{ +struct device *dev = core->dev; + +if (dev &&pm_runtime_enabled (dev)) { + core->rpm_enabled = true; + +mutex_lock (&clk_rpm_list_lock); +hlist_add_head (&core->rpm_node, &clk_rpm_list); +mutex_unlock (&clk_rpm_list_lock); + } +} +/*** locking ***/ static void clk_prepare_lock (void ) {
@@ -1310,9 +1398,6 @@ static void __init clk_unprepare_unused_subtree(struct clk_core *core)if (core->flags &CLK_IGNORE_UNUSED )return ; -if (clk_pm_runtime_get (core)) -return ; -if (clk_core_is_prepared (core)) {trace_clk_unprepare (core);if (core->ops->unprepare_unused)
@@ -1321,8 +1406,6 @@ static void __init clk_unprepare_unused_subtree(struct clk_core *core) core->ops->unprepare (core->hw);trace_clk_unprepare_complete (core); } - -clk_pm_runtime_put (core); }static void __init clk_disable_unused_subtree (struct clk_core *core)
@@ -1338,9 +1421,6 @@ static void __init clk_disable_unused_subtree(struct clk_core *core)if (core->flags &CLK_OPS_PARENT_ENABLE )clk_core_prepare_enable (core->parent); -if (clk_pm_runtime_get (core)) - goto unprepare_out; - flags =clk_enable_lock ();if (core->enable_count)
@@ -1365,8 +1445,6 @@ static void __init clk_disable_unused_subtree(struct clk_core *core) unlock_out:clk_enable_unlock (flags); -clk_pm_runtime_put (core); -unprepare_out:if (core->flags &CLK_OPS_PARENT_ENABLE )clk_core_disable_unprepare (core->parent); }
@@ -1382,6 +1460,7 @@ __setup("clk_ignore_unused", clk_ignore_unused_setup);static int __init clk_disable_unused (void ) {struct clk_core *core; +int ret;if (clk_ignore_unused) {pr_warn ("clk: Not disabling unused clocks\n" );
@@ -1390,6 +1469,13 @@ static int __init clk_disable_unused(void)pr_info ("clk: Disabling unused clocks\n" ); + ret =clk_pm_runtime_get_all (); +if (ret) +return ret; +/* +* Grab the prepare lock to keep the clk topology stable while iterating +* over clks. +*/ clk_prepare_lock ();hlist_for_each_entry (core, &clk_root_list, child_node)
@@ -1406,6 +1492,8 @@ static int __init clk_disable_unused(void)clk_prepare_unlock (); +clk_pm_runtime_put_all (); +return 0 ; }late_initcall_sync (clk_disable_unused);
@@ -4071,6 +4159,12 @@ static void __clk_release(struct kref *ref) { struct clk_core *core = container_of(ref, struct clk_core, ref); +if (core->rpm_enabled) { +mutex_lock (&clk_rpm_list_lock); +hlist_del (&core->rpm_node); +mutex_unlock (&clk_rpm_list_lock); + } +clk_core_free_parent_map (core);kfree_const (core->name);kfree (core);
@@ -4110,9 +4204,8 @@ __clk_register(struct device *dev, struct device_node *np, struct clk_hw *hw) } core->ops = init->ops; -if (dev &&pm_runtime_enabled (dev)) - core->rpm_enabled = true; core->dev = dev; +clk_pm_runtime_init (core); core->of_node = np;if (dev && dev->driver) core->owner = dev->driver->owner;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 87/141 clk: remove unnecessary (void*) conversions
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yu Zhe <[email protected]>
[ Upstream commit 5b1a1c1ab1f981b15bce778db863344f59bd1501 ]
Pointer variables of void * type do not require type cast.
Stable-dep-of: 9d1e795f754d ("clk: Get runtime PM before walking tree for clk_summary")
--- drivers/clk/clk.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/clk/clk.c +2 -2
@@ -3245,7 +3245,7 @@ static void clk_summary_show_subtree(struct seq_file *s, struct clk_core *c,static int clk_summary_show (struct seq_file *s,void *data) {struct clk_core *c; -struct hlist_head **lists = (struct hlist_head **)s->private; +struct hlist_head **lists = s->private;seq_puts (s," enable prepare protect duty hardware\n" );seq_puts (s," clock count count count rate accuracy phase cycle enable\n" );
@@ -3304,7 +3304,7 @@ static int clk_dump_show(struct seq_file *s, void *data) {struct clk_core *c;bool first_node = true; -struct hlist_head **lists = (struct hlist_head **)s->private; +struct hlist_head **lists = s->private;seq_putc (s,'{' );clk_prepare_lock ();
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 88/141 clk: Show active consumers of clocks in debugfs
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vishal Badole <[email protected]>
[ Upstream commit dcce5cc7826e9c6b3a2443e5e6b7f8d02a103c35 ]
This feature lists the clock consumer's name and respective connection id. Using this feature user can easily check that which user has acquired and enabled a particular clock.
Usage:
Quoted 1 line
Quoted 1 line
cat
/sys/kernel/debug/clk/clk_summary
enable prepare protect
duty hardware Connection
clock count count count rate accuracy phase cycle enable consumer Id
------------------------------------------------------------------------------------------------------------------------------
clk_mcasp0_fixed 0 0 0 24576000 0 0 50000 Y deviceless of_clk_get_from_provider
deviceless no_connection_id
clk_mcasp0 0 0 0 24576000 0 0 50000 N simple-audio-card,cpu no_connection_id
deviceless no_connection_id
Stable-dep-of: 9d1e795f754d ("clk: Get runtime PM before walking tree for clk_summary")
--- drivers/clk/clk.c | 34 ++++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 10 deletions(-)
drivers/clk/clk.c +24 -10
@@ -3205,28 +3205,41 @@ static void clk_summary_show_one(struct seq_file *s, struct clk_core *c, int level) {int phase; +struct clk *clk_user; +int multi_node =0 ; -seq_printf (s,"%*s%-*s %7d %8d %8d %11lu %10lu " , +seq_printf (s,"%*s%-*s %-7d %-8d %-8d %-11lu %-10lu " , level *3 +1 ,"" , -30 - level *3 , c->name, +35 - level *3 , c->name, c->enable_count, c->prepare_count, c->protect_count,clk_core_get_rate_recalc (c),clk_core_get_accuracy_recalc (c)); phase =clk_core_get_phase (c);if (phase >=0 ) -seq_printf (s,"%5d" , phase); +seq_printf (s,"%-5d" , phase);else seq_puts (s,"-----" ); -seq_printf (s," %6d" ,clk_core_get_scaled_duty_cycle (c,100000 )); +seq_printf (s," %-6d" ,clk_core_get_scaled_duty_cycle (c,100000 ));if (c->ops->is_enabled) -seq_printf (s," %9c\n" ,clk_core_is_enabled (c) ?'Y' :'N' ); +seq_printf (s," %5c " ,clk_core_is_enabled (c) ?'Y' :'N' );else if (!c->ops->enable) -seq_printf (s," %9c\n" ,'Y' ); +seq_printf (s," %5c " ,'Y' );else -seq_printf (s," %9c\n" ,'?' ); +seq_printf (s," %5c " ,'?' ); + +hlist_for_each_entry (clk_user, &c->clks, clks_node) { +seq_printf (s,"%*s%-*s %-25s\n" , + level *3 +2 +105 * multi_node,"" , +30 , + clk_user->dev_id ? clk_user->dev_id :"deviceless" , + clk_user->con_id ? clk_user->con_id :"no_connection_id" ); + + multi_node =1 ; + } + } static void clk_summary_show_subtree(struct seq_file *s, struct clk_core *c,
@@ -3247,9 +3260,10 @@ static int clk_summary_show(struct seq_file *s, void *data)struct clk_core *c;struct hlist_head **lists = s->private; -seq_puts (s," enable prepare protect duty hardware\n" ); -seq_puts (s," clock count count count rate accuracy phase cycle enable\n" ); -seq_puts (s,"-------------------------------------------------------------------------------------------------------\n" ); +seq_puts (s," enable prepare protect duty hardware connection\n" ); +seq_puts (s," clock count count count rate accuracy phase cycle enable consumer id\n" ); +seq_puts (s,"---------------------------------------------------------------------------------------------------------------------------------------------\n" ); +clk_prepare_lock ();
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 89/141 clk: Get runtime PM before walking tree for clk_summary
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stephen Boyd <[email protected]>
[ Upstream commit 9d1e795f754db1ac3344528b7af0b17b8146f321 ]
Similar to the previous commit, we should make sure that all devices are runtime resumed before printing the clk_summary through debugfs. Failure to do so would result in a deadlock if the thread is resuming a device to print clk state and that device is also runtime resuming in another thread, e.g the screen is turning on and the display driver is starting up. We remove the calls to clk_pm_runtime_{get,put}() in this path because they're superfluous now that we know the devices are runtime resumed. This also squashes a bug where the return value of clk_pm_runtime_get() wasn't checked, leading to an RPM count underflow on error paths.
--- drivers/clk/clk.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-)
drivers/clk/clk.c +12 -2
@@ -3247,9 +3247,7 @@ static void clk_summary_show_subtree(struct seq_file *s, struct clk_core *c, {struct clk_core *child; -clk_pm_runtime_get (c);clk_summary_show_one (s, c, level); -clk_pm_runtime_put (c);hlist_for_each_entry (child, &c->children, child_node)clk_summary_show_subtree (s, child, level +1 );
@@ -3259,11 +3257,15 @@ static int clk_summary_show(struct seq_file *s, void *data) {struct clk_core *c;struct hlist_head **lists = s->private; +int ret;seq_puts (s," enable prepare protect duty hardware connection\n" );seq_puts (s," clock count count count rate accuracy phase cycle enable consumer id\n" );seq_puts (s,"---------------------------------------------------------------------------------------------------------------------------------------------\n" ); + ret =clk_pm_runtime_get_all (); +if (ret) +return ret;clk_prepare_lock ();
@@ -3272,6 +3274,7 @@ static int clk_summary_show(struct seq_file *s, void *data)clk_summary_show_subtree (s, c,0 );clk_prepare_unlock (); +clk_pm_runtime_put_all ();return 0 ; }
@@ -3319,8 +3322,14 @@ static int clk_dump_show(struct seq_file *s, void *data)struct clk_core *c;bool first_node = true;struct hlist_head **lists = s->private; +int ret; + + ret =clk_pm_runtime_get_all (); +if (ret) +return ret;seq_putc (s,'{' ); +clk_prepare_lock ();for (; *lists; lists++) {
@@ -3333,6 +3342,7 @@ static int clk_dump_show(struct seq_file *s, void *data) }clk_prepare_unlock (); +clk_pm_runtime_put_all ();seq_puts (s,"}\n" );return 0 ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 90/141 clk: mediatek: mt8192: Correctly unregister and free clocks on failure
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: AngeloGioacchino Del Regno <[email protected]>
[ Upstream commit 0cbe12694990501be92f997d987925132002dbe5 ]
If anything fails during probe of the clock controller(s), unregister (and kfree!) whatever we have previously registered to leave with a clean state and prevent leaks.
Stable-dep-of: 2f7b1d8b5505 ("clk: mediatek: Do a runtime PM get on controllers during probe")
--- drivers/clk/mediatek/clk-mt8192.c | 77 ++++++++++++++++++++++++------- 1 file changed, 60 insertions(+), 17 deletions(-)
drivers/clk/mediatek/clk-mt8192.c +60 -17
@@ -1100,27 +1100,64 @@ static int clk_mt8192_top_probe(struct platform_device *pdev)if (IS_ERR (base))return PTR_ERR (base); -mtk_clk_register_fixed_clks (top_fixed_clks,ARRAY_SIZE (top_fixed_clks), top_clk_data); -mtk_clk_register_factors (top_early_divs,ARRAY_SIZE (top_early_divs), top_clk_data); -mtk_clk_register_factors (top_divs,ARRAY_SIZE (top_divs), top_clk_data); -mtk_clk_register_muxes (top_mtk_muxes,ARRAY_SIZE (top_mtk_muxes), node, &mt8192_clk_lock, - top_clk_data); -mtk_clk_register_composites (top_muxes,ARRAY_SIZE (top_muxes), base, &mt8192_clk_lock, - top_clk_data); -mtk_clk_register_composites (top_adj_divs,ARRAY_SIZE (top_adj_divs), base, &mt8192_clk_lock, - top_clk_data); - r =mtk_clk_register_gates (node, top_clks,ARRAY_SIZE (top_clks), top_clk_data); + r =mtk_clk_register_fixed_clks (top_fixed_clks,ARRAY_SIZE (top_fixed_clks), top_clk_data);if (r)return r; + r =mtk_clk_register_factors (top_early_divs,ARRAY_SIZE (top_early_divs), top_clk_data); +if (r) + goto unregister_fixed_clks; + + r =mtk_clk_register_factors (top_divs,ARRAY_SIZE (top_divs), top_clk_data); +if (r) + goto unregister_early_factors; + + r =mtk_clk_register_muxes (top_mtk_muxes,ARRAY_SIZE (top_mtk_muxes), node, + &mt8192_clk_lock, top_clk_data); +if (r) + goto unregister_factors; + + r =mtk_clk_register_composites (top_muxes,ARRAY_SIZE (top_muxes), base, + &mt8192_clk_lock, top_clk_data); +if (r) + goto unregister_muxes; + + r =mtk_clk_register_composites (top_adj_divs,ARRAY_SIZE (top_adj_divs), base, + &mt8192_clk_lock, top_clk_data); +if (r) + goto unregister_top_composites; + + r =mtk_clk_register_gates (node, top_clks,ARRAY_SIZE (top_clks), top_clk_data); +if (r) + goto unregister_adj_divs_composites; + r =clk_mt8192_reg_mfg_mux_notifier (&pdev->dev, top_clk_data->hws[CLK_TOP_MFG_PLL_SEL ]->clk);if (r) -return r; - + goto unregister_gates; -return of_clk_add_hw_provider (node, of_clk_hw_onecell_get, + r =of_clk_add_hw_provider (node, of_clk_hw_onecell_get, top_clk_data); +if (r) + goto unregister_gates; + +return 0 ; + +unregister_gates: +mtk_clk_unregister_gates (top_clks,ARRAY_SIZE (top_clks), top_clk_data); +unregister_adj_divs_composites: +mtk_clk_unregister_composites (top_adj_divs,ARRAY_SIZE (top_adj_divs), top_clk_data); +unregister_top_composites: +mtk_clk_unregister_composites (top_muxes,ARRAY_SIZE (top_muxes), top_clk_data); +unregister_muxes: +mtk_clk_unregister_muxes (top_mtk_muxes,ARRAY_SIZE (top_mtk_muxes), top_clk_data); +unregister_factors: +mtk_clk_unregister_factors (top_divs,ARRAY_SIZE (top_divs), top_clk_data); +unregister_early_factors: +mtk_clk_unregister_factors (top_early_divs,ARRAY_SIZE (top_early_divs), top_clk_data); +unregister_fixed_clks: +mtk_clk_unregister_fixed_clks (top_fixed_clks,ARRAY_SIZE (top_fixed_clks), top_clk_data); +return r; }static int clk_mt8192_infra_probe (struct platform_device *pdev)
@@ -1139,14 +1176,16 @@ static int clk_mt8192_infra_probe(struct platform_device *pdev) r =mtk_register_reset_controller_with_dev (&pdev->dev, &clk_rst_desc);if (r) - goto free_clk_data; + goto unregister_gates; r =of_clk_add_hw_provider (node, of_clk_hw_onecell_get, clk_data);if (r) - goto free_clk_data; + goto unregister_gates;return r; +unregister_gates: +mtk_clk_unregister_gates (infra_clks,ARRAY_SIZE (infra_clks), clk_data); free_clk_data:mtk_free_clk_data (clk_data);return r;
@@ -1168,10 +1207,12 @@ static int clk_mt8192_peri_probe(struct platform_device *pdev) r =of_clk_add_hw_provider (node, of_clk_hw_onecell_get, clk_data);if (r) - goto free_clk_data; + goto unregister_gates;return r; +unregister_gates: +mtk_clk_unregister_gates (peri_clks,ARRAY_SIZE (peri_clks), clk_data); free_clk_data:mtk_free_clk_data (clk_data);return r;
@@ -1194,10 +1235,12 @@ static int clk_mt8192_apmixed_probe(struct platform_device *pdev) r =of_clk_add_hw_provider (node, of_clk_hw_onecell_get, clk_data);if (r) - goto free_clk_data; + goto unregister_gates;return r; +unregister_gates: +mtk_clk_unregister_gates (apmixed_clks,ARRAY_SIZE (apmixed_clks), clk_data); free_clk_data:mtk_free_clk_data (clk_data);return r;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 91/141 clk: mediatek: mt8192: Propagate struct device for gate clocks
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: AngeloGioacchino Del Regno <[email protected]>
[ Upstream commit fdc325c8f79cb4155009db8394db19793c4d07cd ]
Convert instances of mtk_clk_register_gates() to use the newer mtk_clk_register_gates_with_dev() to propagate struct device to the clk framework.
Stable-dep-of: 2f7b1d8b5505 ("clk: mediatek: Do a runtime PM get on controllers during probe")
--- drivers/clk/mediatek/clk-mt8192.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-)
drivers/clk/mediatek/clk-mt8192.c +9 -4
@@ -1127,7 +1127,8 @@ static int clk_mt8192_top_probe(struct platform_device *pdev)if (r) goto unregister_top_composites; - r =mtk_clk_register_gates (node, top_clks,ARRAY_SIZE (top_clks), top_clk_data); + r =mtk_clk_register_gates_with_dev (node, top_clks,ARRAY_SIZE (top_clks), + top_clk_data, &pdev->dev);if (r) goto unregister_adj_divs_composites;
@@ -1170,7 +1171,8 @@ static int clk_mt8192_infra_probe(struct platform_device *pdev)if (!clk_data)return -ENOMEM ; - r =mtk_clk_register_gates (node, infra_clks,ARRAY_SIZE (infra_clks), clk_data); + r =mtk_clk_register_gates_with_dev (node, infra_clks,ARRAY_SIZE (infra_clks), + clk_data, &pdev->dev);if (r) goto free_clk_data;
@@ -1201,7 +1203,8 @@ static int clk_mt8192_peri_probe(struct platform_device *pdev)if (!clk_data)return -ENOMEM ; - r =mtk_clk_register_gates (node, peri_clks,ARRAY_SIZE (peri_clks), clk_data); + r =mtk_clk_register_gates_with_dev (node, peri_clks,ARRAY_SIZE (peri_clks), + clk_data, &pdev->dev);if (r) goto free_clk_data;
@@ -1229,7 +1232,9 @@ static int clk_mt8192_apmixed_probe(struct platform_device *pdev)return -ENOMEM ;mtk_clk_register_plls (node, plls,ARRAY_SIZE (plls), clk_data); - r =mtk_clk_register_gates (node, apmixed_clks,ARRAY_SIZE (apmixed_clks), clk_data); + r =mtk_clk_register_gates_with_dev (node, apmixed_clks, +ARRAY_SIZE (apmixed_clks), clk_data, + &pdev->dev);if (r) goto free_clk_data;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 92/141 clk: mediatek: clk-gate: Propagate struct device with mtk_clk_register_gates()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: AngeloGioacchino Del Regno <[email protected]>
[ Upstream commit 20498d52c9c1a68b1d92c42bce1dc893d3e74f30 ]
Commit e4c23e19aa2a ("clk: mediatek: Register clock gate with device") introduces a helper function for the sole purpose of propagating a struct device pointer to the clk API when registering the mtk-gate clocks to take advantage of Runtime PM when/where needed and where a power domain is defined in devicetree.
Function mtk_clk_register_gates() then becomes a wrapper around the new mtk_clk_register_gates_with_dev() function that will simply pass NULL as struct device: this is essential when registering drivers with CLK_OF_DECLARE instead of as a platform device, as there will be no struct device to pass... but we can as well simply have only one function that always takes such pointer as a param and pass NULL when unavoidable.
This commit removes the mtk_clk_register_gates() wrapper and renames mtk_clk_register_gates_with_dev() to the former and all of the calls to either of the two functions were fixed in all drivers in order to reflect this change; also, to improve consistency with other kernel functions, the pointer to struct device was moved as the first param.
Since a lot of MediaTek clock drivers are actually registering as a platform device, but were still registering the mtk-gate clocks without passing any struct device to the clock framework, they've been changed to pass a valid one now, as to make all those platforms able to use runtime power management where available.
While at it, some much needed indentation changes were also done.
Stable-dep-of: 2f7b1d8b5505 ("clk: mediatek: Do a runtime PM get on controllers during probe")
--- drivers/clk/mediatek/clk-gate.c | 23 ++++++------------- drivers/clk/mediatek/clk-gate.h | 7 +----- drivers/clk/mediatek/clk-mt2701-aud.c | 4 ++-- drivers/clk/mediatek/clk-mt2701-eth.c | 4 ++-- drivers/clk/mediatek/clk-mt2701-g3d.c | 2 +- drivers/clk/mediatek/clk-mt2701-hif.c | 4 ++-- drivers/clk/mediatek/clk-mt2701-mm.c | 4 ++-- drivers/clk/mediatek/clk-mt2701.c | 12 +++++----- drivers/clk/mediatek/clk-mt2712-mm.c | 4 ++-- drivers/clk/mediatek/clk-mt2712.c | 12 +++++----- drivers/clk/mediatek/clk-mt6765.c | 10 ++++---- drivers/clk/mediatek/clk-mt6779-mm.c | 4 ++-- drivers/clk/mediatek/clk-mt6779.c | 6 ++--- drivers/clk/mediatek/clk-mt6795-infracfg.c | 3 ++- drivers/clk/mediatek/clk-mt6795-mm.c | 3 ++- drivers/clk/mediatek/clk-mt6795-pericfg.c | 3 ++- drivers/clk/mediatek/clk-mt6797-mm.c | 4 ++-- drivers/clk/mediatek/clk-mt6797.c | 4 ++-- drivers/clk/mediatek/clk-mt7622-aud.c | 4 ++-- drivers/clk/mediatek/clk-mt7622-eth.c | 8 +++---- drivers/clk/mediatek/clk-mt7622-hif.c | 8 +++---- drivers/clk/mediatek/clk-mt7622.c | 14 ++++++------ drivers/clk/mediatek/clk-mt7629-eth.c | 7 +++--- drivers/clk/mediatek/clk-mt7629-hif.c | 8 +++---- drivers/clk/mediatek/clk-mt7629.c | 10 ++++---- drivers/clk/mediatek/clk-mt7986-eth.c | 10 ++++---- drivers/clk/mediatek/clk-mt7986-infracfg.c | 4 ++-- drivers/clk/mediatek/clk-mt8135.c | 8 +++---- drivers/clk/mediatek/clk-mt8167-aud.c | 2 +- drivers/clk/mediatek/clk-mt8167-img.c | 2 +- drivers/clk/mediatek/clk-mt8167-mfgcfg.c | 2 +- drivers/clk/mediatek/clk-mt8167-mm.c | 4 ++-- drivers/clk/mediatek/clk-mt8167-vdec.c | 3 ++- drivers/clk/mediatek/clk-mt8167.c | 2 +- drivers/clk/mediatek/clk-mt8173-mm.c | 4 ++-- drivers/clk/mediatek/clk-mt8173.c | 24 ++++++++++---------- drivers/clk/mediatek/clk-mt8183-audio.c | 4 ++-- drivers/clk/mediatek/clk-mt8183-mm.c | 4 ++-- drivers/clk/mediatek/clk-mt8183.c | 16 ++++++------- drivers/clk/mediatek/clk-mt8186-mm.c | 3 ++- drivers/clk/mediatek/clk-mt8192-aud.c | 3 ++- drivers/clk/mediatek/clk-mt8192-mm.c | 3 ++- drivers/clk/mediatek/clk-mt8192.c | 17 +++++++------- drivers/clk/mediatek/clk-mt8195-apmixedsys.c | 3 ++- drivers/clk/mediatek/clk-mt8195-topckgen.c | 3 ++- drivers/clk/mediatek/clk-mt8195-vdo0.c | 3 ++- drivers/clk/mediatek/clk-mt8195-vdo1.c | 3 ++- drivers/clk/mediatek/clk-mt8365-mm.c | 5 ++-- drivers/clk/mediatek/clk-mt8365.c | 4 ++-- drivers/clk/mediatek/clk-mt8516-aud.c | 2 +- drivers/clk/mediatek/clk-mt8516.c | 2 +- drivers/clk/mediatek/clk-mtk.c | 4 ++-- 52 files changed, 156 insertions(+), 160 deletions(-)
drivers/clk/mediatek/clk-gate.c +7 -16
@@ -152,12 +152,12 @@ const struct clk_ops mtk_clk_gate_ops_no_setclr_inv = { };EXPORT_SYMBOL_GPL (mtk_clk_gate_ops_no_setclr_inv); -static struct clk_hw *mtk_clk_register_gate (const char *name, +static struct clk_hw *mtk_clk_register_gate (struct device *dev,const char *name,const char *parent_name,struct regmap *regmap,int set_ofs,int clr_ofs,int sta_ofs,u8 bit,const struct clk_ops *ops, -unsigned long flags,struct device *dev) +unsigned long flags) {struct mtk_clk_gate *cg;int ret;
@@ -202,10 +202,9 @@ static void mtk_clk_unregister_gate(struct clk_hw *hw)kfree (cg); } -int mtk_clk_register_gates_with_dev (struct device_node *node, -const struct mtk_gate *clks,int num, -struct clk_hw_onecell_data *clk_data, -struct device *dev) +int mtk_clk_register_gates (struct device *dev,struct device_node *node, +const struct mtk_gate *clks,int num, +struct clk_hw_onecell_data *clk_data) {int i;struct clk_hw *hw;
@@ -229,13 +228,13 @@ int mtk_clk_register_gates_with_dev(struct device_node *node,continue ; } - hw =mtk_clk_register_gate (gate->name, gate->parent_name, + hw =mtk_clk_register_gate (dev, gate->name, gate->parent_name, regmap, gate->regs->set_ofs, gate->regs->clr_ofs, gate->regs->sta_ofs, gate->shift, gate->ops, - gate->flags, dev); + gate->flags);if (IS_ERR (hw)) { pr_err("Failed to register clk %s: %pe\n", gate->name,
@@ -261,14 +260,6 @@ int mtk_clk_register_gates_with_dev(struct device_node *node,return PTR_ERR (hw); } -EXPORT_SYMBOL_GPL (mtk_clk_register_gates_with_dev); - -int mtk_clk_register_gates (struct device_node *node, -const struct mtk_gate *clks,int num, -struct clk_hw_onecell_data *clk_data) -{ -return mtk_clk_register_gates_with_dev (node, clks, num, clk_data,NULL ); -}EXPORT_SYMBOL_GPL (mtk_clk_register_gates); void mtk_clk_unregister_gates(const struct mtk_gate *clks, int num,
drivers/clk/mediatek/clk-gate.h +1 -6
@@ -50,15 +50,10 @@ struct mtk_gate {#define GATE_MTK (_id, _name, _parent, _regs, _shift, _ops) \ GATE_MTK_FLAGS(_id, _name, _parent, _regs, _shift, _ops, 0) -int mtk_clk_register_gates (struct device_node *node, +int mtk_clk_register_gates (struct device *dev,struct device_node *node,const struct mtk_gate *clks,int num,struct clk_hw_onecell_data *clk_data); -int mtk_clk_register_gates_with_dev (struct device_node *node, -const struct mtk_gate *clks,int num, -struct clk_hw_onecell_data *clk_data, -struct device *dev); -void mtk_clk_unregister_gates (const struct mtk_gate *clks,int num,struct clk_hw_onecell_data *clk_data);
drivers/clk/mediatek/clk-mt2701-aud.c +2 -2
@@ -127,8 +127,8 @@ static int clk_mt2701_aud_probe(struct platform_device *pdev) clk_data =mtk_alloc_clk_data (CLK_AUD_NR ); -mtk_clk_register_gates (node, audio_clks,ARRAY_SIZE (audio_clks), - clk_data); +mtk_clk_register_gates (&pdev->dev, node, audio_clks, +ARRAY_SIZE (audio_clks), clk_data); r =of_clk_add_hw_provider (node, of_clk_hw_onecell_get, clk_data);if (r) {
drivers/clk/mediatek/clk-mt2701-eth.c +2 -2
@@ -51,8 +51,8 @@ static int clk_mt2701_eth_probe(struct platform_device *pdev) clk_data =mtk_alloc_clk_data (CLK_ETHSYS_NR ); -mtk_clk_register_gates (node, eth_clks,ARRAY_SIZE (eth_clks), - clk_data); +mtk_clk_register_gates (&pdev->dev, node, eth_clks, +ARRAY_SIZE (eth_clks), clk_data); r =of_clk_add_hw_provider (node, of_clk_hw_onecell_get, clk_data);if (r)
drivers/clk/mediatek/clk-mt2701-g3d.c +1 -1
@@ -45,7 +45,7 @@ static int clk_mt2701_g3dsys_init(struct platform_device *pdev) clk_data =mtk_alloc_clk_data (CLK_G3DSYS_NR ); -mtk_clk_register_gates (node, g3d_clks,ARRAY_SIZE (g3d_clks), +mtk_clk_register_gates (&pdev->dev, node, g3d_clks,ARRAY_SIZE (g3d_clks), clk_data); r =of_clk_add_hw_provider (node, of_clk_hw_onecell_get, clk_data);
drivers/clk/mediatek/clk-mt2701-hif.c +2 -2
@@ -48,8 +48,8 @@ static int clk_mt2701_hif_probe(struct platform_device *pdev) clk_data =mtk_alloc_clk_data (CLK_HIFSYS_NR ); -mtk_clk_register_gates (node, hif_clks,ARRAY_SIZE (hif_clks), - clk_data); +mtk_clk_register_gates (&pdev->dev, node, hif_clks, +ARRAY_SIZE (hif_clks), clk_data); r =of_clk_add_hw_provider (node, of_clk_hw_onecell_get, clk_data);if (r) {
drivers/clk/mediatek/clk-mt2701-mm.c +2 -2
@@ -76,8 +76,8 @@ static int clk_mt2701_mm_probe(struct platform_device *pdev) clk_data =mtk_alloc_clk_data (CLK_MM_NR ); -mtk_clk_register_gates (node, mm_clks,ARRAY_SIZE (mm_clks), - clk_data); +mtk_clk_register_gates (&pdev->dev, node, mm_clks, +ARRAY_SIZE (mm_clks), clk_data); r =of_clk_add_hw_provider (node, of_clk_hw_onecell_get, clk_data);if (r)
drivers/clk/mediatek/clk-mt2701.c +6 -6
@@ -685,8 +685,8 @@ static int mtk_topckgen_init(struct platform_device *pdev)mtk_clk_register_dividers (top_adj_divs,ARRAY_SIZE (top_adj_divs), base, &mt2701_clk_lock, clk_data); -mtk_clk_register_gates (node, top_clks,ARRAY_SIZE (top_clks), - clk_data); +mtk_clk_register_gates (&pdev->dev, node, top_clks, +ARRAY_SIZE (top_clks), clk_data);return of_clk_add_hw_provider (node, of_clk_hw_onecell_get, clk_data); }
@@ -789,8 +789,8 @@ static int mtk_infrasys_init(struct platform_device *pdev) } } -mtk_clk_register_gates (node, infra_clks,ARRAY_SIZE (infra_clks), - infra_clk_data); +mtk_clk_register_gates (&pdev->dev, node, infra_clks, +ARRAY_SIZE (infra_clks), infra_clk_data);mtk_clk_register_factors (infra_fixed_divs,ARRAY_SIZE (infra_fixed_divs), infra_clk_data);
@@ -902,8 +902,8 @@ static int mtk_pericfg_init(struct platform_device *pdev)if (!clk_data)return -ENOMEM ; -mtk_clk_register_gates (node, peri_clks,ARRAY_SIZE (peri_clks), - clk_data); +mtk_clk_register_gates (&pdev->dev, node, peri_clks, +ARRAY_SIZE (peri_clks), clk_data);mtk_clk_register_composites (peri_muxs,ARRAY_SIZE (peri_muxs), base, &mt2701_clk_lock, clk_data);
drivers/clk/mediatek/clk-mt2712-mm.c +2 -2
@@ -117,8 +117,8 @@ static int clk_mt2712_mm_probe(struct platform_device *pdev) clk_data =mtk_alloc_clk_data (CLK_MM_NR_CLK ); -mtk_clk_register_gates (node, mm_clks,ARRAY_SIZE (mm_clks), - clk_data); +mtk_clk_register_gates (&pdev->dev, node, mm_clks, +ARRAY_SIZE (mm_clks), clk_data); r =of_clk_add_hw_provider (node, of_clk_hw_onecell_get, clk_data);
drivers/clk/mediatek/clk-mt2712.c +6 -6
@@ -1324,8 +1324,8 @@ static int clk_mt2712_top_probe(struct platform_device *pdev) &mt2712_clk_lock, top_clk_data);mtk_clk_register_dividers (top_adj_divs,ARRAY_SIZE (top_adj_divs), base, &mt2712_clk_lock, top_clk_data); -mtk_clk_register_gates (node, top_clks,ARRAY_SIZE (top_clks), - top_clk_data); +mtk_clk_register_gates (&pdev->dev, node, top_clks, +ARRAY_SIZE (top_clks), top_clk_data); r =of_clk_add_hw_provider (node, of_clk_hw_onecell_get, top_clk_data);
@@ -1344,8 +1344,8 @@ static int clk_mt2712_infra_probe(struct platform_device *pdev) clk_data =mtk_alloc_clk_data (CLK_INFRA_NR_CLK ); -mtk_clk_register_gates (node, infra_clks,ARRAY_SIZE (infra_clks), - clk_data); +mtk_clk_register_gates (&pdev->dev, node, infra_clks, +ARRAY_SIZE (infra_clks), clk_data); r =of_clk_add_hw_provider (node, of_clk_hw_onecell_get, clk_data);
@@ -1366,8 +1366,8 @@ static int clk_mt2712_peri_probe(struct platform_device *pdev) clk_data =mtk_alloc_clk_data (CLK_PERI_NR_CLK ); -mtk_clk_register_gates (node, peri_clks,ARRAY_SIZE (peri_clks), - clk_data); +mtk_clk_register_gates (&pdev->dev, node, peri_clks, +ARRAY_SIZE (peri_clks), clk_data); r =of_clk_add_hw_provider (node, of_clk_hw_onecell_get, clk_data);
drivers/clk/mediatek/clk-mt6765.c +5 -5
@@ -743,7 +743,7 @@ static int clk_mt6765_apmixed_probe(struct platform_device *pdev)mtk_clk_register_plls (node, plls,ARRAY_SIZE (plls), clk_data); -mtk_clk_register_gates (node, apmixed_clks, +mtk_clk_register_gates (&pdev->dev, node, apmixed_clks,ARRAY_SIZE (apmixed_clks), clk_data); r =of_clk_add_hw_provider (node, of_clk_hw_onecell_get, clk_data);
@@ -784,8 +784,8 @@ static int clk_mt6765_top_probe(struct platform_device *pdev) clk_data);mtk_clk_register_muxes (top_muxes,ARRAY_SIZE (top_muxes), node, &mt6765_clk_lock, clk_data); -mtk_clk_register_gates (node, top_clks,ARRAY_SIZE (top_clks), - clk_data); +mtk_clk_register_gates (&pdev->dev, node, top_clks, +ARRAY_SIZE (top_clks), clk_data); r =of_clk_add_hw_provider (node, of_clk_hw_onecell_get, clk_data);
@@ -820,8 +820,8 @@ static int clk_mt6765_ifr_probe(struct platform_device *pdev)if (!clk_data)return -ENOMEM ; -mtk_clk_register_gates (node, ifr_clks,ARRAY_SIZE (ifr_clks), - clk_data); +mtk_clk_register_gates (&pdev->dev, node, ifr_clks, +ARRAY_SIZE (ifr_clks), clk_data); r =of_clk_add_hw_provider (node, of_clk_hw_onecell_get, clk_data);if (r)
drivers/clk/mediatek/clk-mt6779-mm.c +2 -2
@@ -93,8 +93,8 @@ static int clk_mt6779_mm_probe(struct platform_device *pdev) clk_data =mtk_alloc_clk_data (CLK_MM_NR_CLK ); -mtk_clk_register_gates (node, mm_clks,ARRAY_SIZE (mm_clks), - clk_data); +mtk_clk_register_gates (&pdev->dev, node, mm_clks, +ARRAY_SIZE (mm_clks), clk_data);return of_clk_add_hw_provider (node, of_clk_hw_onecell_get, clk_data); }
drivers/clk/mediatek/clk-mt6779.c +3 -3
@@ -1223,7 +1223,7 @@ static int clk_mt6779_apmixed_probe(struct platform_device *pdev)mtk_clk_register_plls (node, plls,ARRAY_SIZE (plls), clk_data); -mtk_clk_register_gates (node, apmixed_clks, +mtk_clk_register_gates (&pdev->dev, node, apmixed_clks,ARRAY_SIZE (apmixed_clks), clk_data);return of_clk_add_hw_provider (node, of_clk_hw_onecell_get, clk_data);
@@ -1267,8 +1267,8 @@ static int clk_mt6779_infra_probe(struct platform_device *pdev) clk_data =mtk_alloc_clk_data (CLK_INFRA_NR_CLK ); -mtk_clk_register_gates (node, infra_clks,ARRAY_SIZE (infra_clks), - clk_data); +mtk_clk_register_gates (&pdev->dev, node, infra_clks, +ARRAY_SIZE (infra_clks), clk_data);return of_clk_add_hw_provider (node, of_clk_hw_onecell_get, clk_data); }
drivers/clk/mediatek/clk-mt6795-infracfg.c +2 -1
@@ -101,7 +101,8 @@ static int clk_mt6795_infracfg_probe(struct platform_device *pdev)if (ret) goto free_clk_data; - ret =mtk_clk_register_gates (node, infra_gates,ARRAY_SIZE (infra_gates), clk_data); + ret =mtk_clk_register_gates (&pdev->dev, node, infra_gates, +ARRAY_SIZE (infra_gates), clk_data);if (ret) goto free_clk_data;
drivers/clk/mediatek/clk-mt6795-mm.c +2 -1
@@ -87,7 +87,8 @@ static int clk_mt6795_mm_probe(struct platform_device *pdev)if (!clk_data)return -ENOMEM ; - ret =mtk_clk_register_gates (node, mm_gates,ARRAY_SIZE (mm_gates), clk_data); + ret =mtk_clk_register_gates (&pdev->dev, node, mm_gates, +ARRAY_SIZE (mm_gates), clk_data);if (ret) goto free_clk_data;
drivers/clk/mediatek/clk-mt6795-pericfg.c +2 -1
@@ -109,7 +109,8 @@ static int clk_mt6795_pericfg_probe(struct platform_device *pdev)if (ret) goto free_clk_data; - ret =mtk_clk_register_gates (node, peri_gates,ARRAY_SIZE (peri_gates), clk_data); + ret =mtk_clk_register_gates (&pdev->dev, node, peri_gates, +ARRAY_SIZE (peri_gates), clk_data);if (ret) goto free_clk_data;
drivers/clk/mediatek/clk-mt6797-mm.c +2 -2
@@ -89,8 +89,8 @@ static int clk_mt6797_mm_probe(struct platform_device *pdev) clk_data =mtk_alloc_clk_data (CLK_MM_NR ); -mtk_clk_register_gates (node, mm_clks,ARRAY_SIZE (mm_clks), - clk_data); +mtk_clk_register_gates (&pdev->dev, node, mm_clks, +ARRAY_SIZE (mm_clks), clk_data); r =of_clk_add_hw_provider (node, of_clk_hw_onecell_get, clk_data);if (r)
drivers/clk/mediatek/clk-mt6797.c +2 -2
@@ -584,8 +584,8 @@ static int mtk_infrasys_init(struct platform_device *pdev) } } -mtk_clk_register_gates (node, infra_clks,ARRAY_SIZE (infra_clks), - infra_clk_data); +mtk_clk_register_gates (&pdev->dev, node, infra_clks, +ARRAY_SIZE (infra_clks), infra_clk_data);mtk_clk_register_factors (infra_fixed_divs,ARRAY_SIZE (infra_fixed_divs), infra_clk_data);
drivers/clk/mediatek/clk-mt7622-aud.c +2 -2
@@ -114,8 +114,8 @@ static int clk_mt7622_audiosys_init(struct platform_device *pdev) clk_data =mtk_alloc_clk_data (CLK_AUDIO_NR_CLK ); -mtk_clk_register_gates (node, audio_clks,ARRAY_SIZE (audio_clks), - clk_data); +mtk_clk_register_gates (&pdev->dev, node, audio_clks, +ARRAY_SIZE (audio_clks), clk_data); r =of_clk_add_hw_provider (node, of_clk_hw_onecell_get, clk_data);if (r) {
drivers/clk/mediatek/clk-mt7622-eth.c +4 -4
@@ -69,8 +69,8 @@ static int clk_mt7622_ethsys_init(struct platform_device *pdev) clk_data =mtk_alloc_clk_data (CLK_ETH_NR_CLK ); -mtk_clk_register_gates (node, eth_clks,ARRAY_SIZE (eth_clks), - clk_data); +mtk_clk_register_gates (&pdev->dev, node, eth_clks, +ARRAY_SIZE (eth_clks), clk_data); r =of_clk_add_hw_provider (node, of_clk_hw_onecell_get, clk_data);if (r)
@@ -91,8 +91,8 @@ static int clk_mt7622_sgmiisys_init(struct platform_device *pdev) clk_data =mtk_alloc_clk_data (CLK_SGMII_NR_CLK ); -mtk_clk_register_gates (node, sgmii_clks,ARRAY_SIZE (sgmii_clks), - clk_data); +mtk_clk_register_gates (&pdev->dev, node, sgmii_clks, +ARRAY_SIZE (sgmii_clks), clk_data); r =of_clk_add_hw_provider (node, of_clk_hw_onecell_get, clk_data);if (r)
drivers/clk/mediatek/clk-mt7622-hif.c +4 -4
@@ -80,8 +80,8 @@ static int clk_mt7622_ssusbsys_init(struct platform_device *pdev) clk_data =mtk_alloc_clk_data (CLK_SSUSB_NR_CLK ); -mtk_clk_register_gates (node, ssusb_clks,ARRAY_SIZE (ssusb_clks), - clk_data); +mtk_clk_register_gates (&pdev->dev, node, ssusb_clks, +ARRAY_SIZE (ssusb_clks), clk_data); r =of_clk_add_hw_provider (node, of_clk_hw_onecell_get, clk_data);if (r)
@@ -102,8 +102,8 @@ static int clk_mt7622_pciesys_init(struct platform_device *pdev) clk_data =mtk_alloc_clk_data (CLK_PCIE_NR_CLK ); -mtk_clk_register_gates (node, pcie_clks,ARRAY_SIZE (pcie_clks), - clk_data); +mtk_clk_register_gates (&pdev->dev, node, pcie_clks, +ARRAY_SIZE (pcie_clks), clk_data); r =of_clk_add_hw_provider (node, of_clk_hw_onecell_get, clk_data);if (r)
drivers/clk/mediatek/clk-mt7622.c +7 -7
@@ -621,8 +621,8 @@ static int mtk_topckgen_init(struct platform_device *pdev)mtk_clk_register_dividers (top_adj_divs,ARRAY_SIZE (top_adj_divs), base, &mt7622_clk_lock, clk_data); -mtk_clk_register_gates (node, top_clks,ARRAY_SIZE (top_clks), - clk_data); +mtk_clk_register_gates (&pdev->dev, node, top_clks, +ARRAY_SIZE (top_clks), clk_data);return of_clk_add_hw_provider (node, of_clk_hw_onecell_get, clk_data); }
@@ -635,8 +635,8 @@ static int mtk_infrasys_init(struct platform_device *pdev) clk_data =mtk_alloc_clk_data (CLK_INFRA_NR_CLK ); -mtk_clk_register_gates (node, infra_clks,ARRAY_SIZE (infra_clks), - clk_data); +mtk_clk_register_gates (&pdev->dev, node, infra_clks, +ARRAY_SIZE (infra_clks), clk_data);mtk_clk_register_cpumuxes (node, infra_muxes,ARRAY_SIZE (infra_muxes), clk_data);
@@ -663,7 +663,7 @@ static int mtk_apmixedsys_init(struct platform_device *pdev)mtk_clk_register_plls (node, plls,ARRAY_SIZE (plls), clk_data); -mtk_clk_register_gates (node, apmixed_clks, +mtk_clk_register_gates (&pdev->dev, node, apmixed_clks,ARRAY_SIZE (apmixed_clks), clk_data);return of_clk_add_hw_provider (node, of_clk_hw_onecell_get, clk_data);
@@ -682,8 +682,8 @@ static int mtk_pericfg_init(struct platform_device *pdev) clk_data =mtk_alloc_clk_data (CLK_PERI_NR_CLK ); -mtk_clk_register_gates (node, peri_clks,ARRAY_SIZE (peri_clks), - clk_data); +mtk_clk_register_gates (&pdev->dev, node, peri_clks, +ARRAY_SIZE (peri_clks), clk_data);mtk_clk_register_composites (peri_muxes,ARRAY_SIZE (peri_muxes), base, &mt7622_clk_lock, clk_data);
drivers/clk/mediatek/clk-mt7629-eth.c +4 -3
@@ -82,7 +82,8 @@ static int clk_mt7629_ethsys_init(struct platform_device *pdev)if (!clk_data)return -ENOMEM ; -mtk_clk_register_gates (node, eth_clks,CLK_ETH_NR_CLK , clk_data); +mtk_clk_register_gates (&pdev->dev, node, eth_clks, +CLK_ETH_NR_CLK , clk_data); r =of_clk_add_hw_provider (node, of_clk_hw_onecell_get, clk_data);if (r)
@@ -106,8 +107,8 @@ static int clk_mt7629_sgmiisys_init(struct platform_device *pdev)if (!clk_data)return -ENOMEM ; -mtk_clk_register_gates (node, sgmii_clks[id++],CLK_SGMII_NR_CLK , - clk_data); +mtk_clk_register_gates (&pdev->dev, node, sgmii_clks[id++], +CLK_SGMII_NR_CLK , clk_data); r =of_clk_add_hw_provider (node, of_clk_hw_onecell_get, clk_data);if (r)
drivers/clk/mediatek/clk-mt7629-hif.c +4 -4
@@ -75,8 +75,8 @@ static int clk_mt7629_ssusbsys_init(struct platform_device *pdev) clk_data =mtk_alloc_clk_data (CLK_SSUSB_NR_CLK ); -mtk_clk_register_gates (node, ssusb_clks,ARRAY_SIZE (ssusb_clks), - clk_data); +mtk_clk_register_gates (&pdev->dev, node, ssusb_clks, +ARRAY_SIZE (ssusb_clks), clk_data); r =of_clk_add_hw_provider (node, of_clk_hw_onecell_get, clk_data);if (r)
@@ -97,8 +97,8 @@ static int clk_mt7629_pciesys_init(struct platform_device *pdev) clk_data =mtk_alloc_clk_data (CLK_PCIE_NR_CLK ); -mtk_clk_register_gates (node, pcie_clks,ARRAY_SIZE (pcie_clks), - clk_data); +mtk_clk_register_gates (&pdev->dev, node, pcie_clks, +ARRAY_SIZE (pcie_clks), clk_data); r =of_clk_add_hw_provider (node, of_clk_hw_onecell_get, clk_data);if (r)
drivers/clk/mediatek/clk-mt7629.c +5 -5
@@ -585,8 +585,8 @@ static int mtk_infrasys_init(struct platform_device *pdev)if (!clk_data)return -ENOMEM ; -mtk_clk_register_gates (node, infra_clks,ARRAY_SIZE (infra_clks), - clk_data); +mtk_clk_register_gates (&pdev->dev, node, infra_clks, +ARRAY_SIZE (infra_clks), clk_data);mtk_clk_register_cpumuxes (node, infra_muxes,ARRAY_SIZE (infra_muxes), clk_data);
@@ -610,8 +610,8 @@ static int mtk_pericfg_init(struct platform_device *pdev)if (!clk_data)return -ENOMEM ; -mtk_clk_register_gates (node, peri_clks,ARRAY_SIZE (peri_clks), - clk_data); +mtk_clk_register_gates (&pdev->dev, node, peri_clks, +ARRAY_SIZE (peri_clks), clk_data);mtk_clk_register_composites (peri_muxes,ARRAY_SIZE (peri_muxes), base, &mt7629_clk_lock, clk_data);
@@ -637,7 +637,7 @@ static int mtk_apmixedsys_init(struct platform_device *pdev)mtk_clk_register_plls (node, plls,ARRAY_SIZE (plls), clk_data); -mtk_clk_register_gates (node, apmixed_clks, +mtk_clk_register_gates (&pdev->dev, node, apmixed_clks,ARRAY_SIZE (apmixed_clks), clk_data);clk_prepare_enable (clk_data->hws[CLK_APMIXED_ARMPLL ]->clk);
drivers/clk/mediatek/clk-mt7986-eth.c +5 -5
@@ -72,8 +72,8 @@ static void __init mtk_sgmiisys_0_init(struct device_node *node) clk_data =mtk_alloc_clk_data (ARRAY_SIZE (sgmii0_clks)); -mtk_clk_register_gates (node, sgmii0_clks,ARRAY_SIZE (sgmii0_clks), - clk_data); +mtk_clk_register_gates (NULL , node, sgmii0_clks, +ARRAY_SIZE (sgmii0_clks), clk_data); r =of_clk_add_hw_provider (node, of_clk_hw_onecell_get, clk_data);if (r)
@@ -90,8 +90,8 @@ static void __init mtk_sgmiisys_1_init(struct device_node *node) clk_data =mtk_alloc_clk_data (ARRAY_SIZE (sgmii1_clks)); -mtk_clk_register_gates (node, sgmii1_clks,ARRAY_SIZE (sgmii1_clks), - clk_data); +mtk_clk_register_gates (NULL , node, sgmii1_clks, +ARRAY_SIZE (sgmii1_clks), clk_data); r =of_clk_add_hw_provider (node, of_clk_hw_onecell_get, clk_data);
@@ -109,7 +109,7 @@ static void __init mtk_ethsys_init(struct device_node *node) clk_data =mtk_alloc_clk_data (ARRAY_SIZE (eth_clks)); -mtk_clk_register_gates (node, eth_clks,ARRAY_SIZE (eth_clks), clk_data); +mtk_clk_register_gates (NULL , node, eth_clks,ARRAY_SIZE (eth_clks), clk_data); r =of_clk_add_hw_provider (node, of_clk_hw_onecell_get, clk_data);
drivers/clk/mediatek/clk-mt7986-infracfg.c +2 -2
@@ -180,8 +180,8 @@ static int clk_mt7986_infracfg_probe(struct platform_device *pdev)mtk_clk_register_factors (infra_divs,ARRAY_SIZE (infra_divs), clk_data);mtk_clk_register_muxes (infra_muxes,ARRAY_SIZE (infra_muxes), node, &mt7986_clk_lock, clk_data); -mtk_clk_register_gates (node, infra_clks,ARRAY_SIZE (infra_clks), - clk_data); +mtk_clk_register_gates (&pdev->dev, node, infra_clks, +ARRAY_SIZE (infra_clks), clk_data); r =of_clk_add_hw_provider (node, of_clk_hw_onecell_get, clk_data);if (r) {
drivers/clk/mediatek/clk-mt8135.c +4 -4
@@ -553,8 +553,8 @@ static void __init mtk_infrasys_init(struct device_node *node) clk_data =mtk_alloc_clk_data (CLK_INFRA_NR_CLK ); -mtk_clk_register_gates (node, infra_clks,ARRAY_SIZE (infra_clks), - clk_data); +mtk_clk_register_gates (NULL , node, infra_clks, +ARRAY_SIZE (infra_clks), clk_data); r =of_clk_add_hw_provider (node, of_clk_hw_onecell_get, clk_data);if (r)
@@ -579,8 +579,8 @@ static void __init mtk_pericfg_init(struct device_node *node) clk_data =mtk_alloc_clk_data (CLK_PERI_NR_CLK ); -mtk_clk_register_gates (node, peri_gates,ARRAY_SIZE (peri_gates), - clk_data); +mtk_clk_register_gates (NULL , node, peri_gates, +ARRAY_SIZE (peri_gates), clk_data);mtk_clk_register_composites (peri_clks,ARRAY_SIZE (peri_clks), base, &mt8135_clk_lock, clk_data);
drivers/clk/mediatek/clk-mt8167-aud.c +1 -1
@@ -50,7 +50,7 @@ static void __init mtk_audsys_init(struct device_node *node) clk_data =mtk_alloc_clk_data (CLK_AUD_NR_CLK ); -mtk_clk_register_gates (node, aud_clks,ARRAY_SIZE (aud_clks), clk_data); +mtk_clk_register_gates (NULL , node, aud_clks,ARRAY_SIZE (aud_clks), clk_data); r =of_clk_add_hw_provider (node, of_clk_hw_onecell_get, clk_data);if (r)
drivers/clk/mediatek/clk-mt8167-img.c +1 -1
@@ -42,7 +42,7 @@ static void __init mtk_imgsys_init(struct device_node *node) clk_data =mtk_alloc_clk_data (CLK_IMG_NR_CLK ); -mtk_clk_register_gates (node, img_clks,ARRAY_SIZE (img_clks), clk_data); +mtk_clk_register_gates (NULL , node, img_clks,ARRAY_SIZE (img_clks), clk_data); r =of_clk_add_hw_provider (node, of_clk_hw_onecell_get, clk_data);
drivers/clk/mediatek/clk-mt8167-mfgcfg.c +1 -1
@@ -40,7 +40,7 @@ static void __init mtk_mfgcfg_init(struct device_node *node) clk_data =mtk_alloc_clk_data (CLK_MFG_NR_CLK ); -mtk_clk_register_gates (node, mfg_clks,ARRAY_SIZE (mfg_clks), clk_data); +mtk_clk_register_gates (NULL , node, mfg_clks,ARRAY_SIZE (mfg_clks), clk_data); r =of_clk_add_hw_provider (node, of_clk_hw_onecell_get, clk_data);
drivers/clk/mediatek/clk-mt8167-mm.c +2 -2
@@ -98,8 +98,8 @@ static int clk_mt8167_mm_probe(struct platform_device *pdev) data = &mt8167_mmsys_driver_data; - ret =mtk_clk_register_gates (node, data->gates_clk, data->gates_num, - clk_data); + ret =mtk_clk_register_gates (&pdev->dev, node, data->gates_clk, + data->gates_num, clk_data);if (ret)return ret;
drivers/clk/mediatek/clk-mt8167-vdec.c +2 -1
@@ -49,7 +49,8 @@ static void __init mtk_vdecsys_init(struct device_node *node) clk_data =mtk_alloc_clk_data (CLK_VDEC_NR_CLK ); -mtk_clk_register_gates (node, vdec_clks,ARRAY_SIZE (vdec_clks), clk_data); +mtk_clk_register_gates (NULL , node, vdec_clks,ARRAY_SIZE (vdec_clks), + clk_data); r =of_clk_add_hw_provider (node, of_clk_hw_onecell_get, clk_data);
drivers/clk/mediatek/clk-mt8167.c +1 -1
@@ -937,7 +937,7 @@ static void __init mtk_topckgen_init(struct device_node *node)mtk_clk_register_fixed_clks (fixed_clks,ARRAY_SIZE (fixed_clks), clk_data); -mtk_clk_register_gates (node, top_clks,ARRAY_SIZE (top_clks), clk_data); +mtk_clk_register_gates (NULL , node, top_clks,ARRAY_SIZE (top_clks), clk_data);mtk_clk_register_factors (top_divs,ARRAY_SIZE (top_divs), clk_data); mtk_clk_register_composites(top_muxes, ARRAY_SIZE(top_muxes), base,
drivers/clk/mediatek/clk-mt8173-mm.c +2 -2
@@ -112,8 +112,8 @@ static int clk_mt8173_mm_probe(struct platform_device *pdev) data = &mt8173_mmsys_driver_data; - ret =mtk_clk_register_gates (node, data->gates_clk, data->gates_num, - clk_data); + ret =mtk_clk_register_gates (&pdev->dev, node, data->gates_clk, + data->gates_num, clk_data);if (ret)return ret;
drivers/clk/mediatek/clk-mt8173.c +12 -12
@@ -888,8 +888,8 @@ static void __init mtk_infrasys_init(struct device_node *node) clk_data =mtk_alloc_clk_data (CLK_INFRA_NR_CLK ); -mtk_clk_register_gates (node, infra_clks,ARRAY_SIZE (infra_clks), - clk_data); +mtk_clk_register_gates (NULL , node, infra_clks, +ARRAY_SIZE (infra_clks), clk_data);mtk_clk_register_factors (infra_divs,ARRAY_SIZE (infra_divs), clk_data); mtk_clk_register_cpumuxes(node, cpu_muxes, ARRAY_SIZE(cpu_muxes),
@@ -918,8 +918,8 @@ static void __init mtk_pericfg_init(struct device_node *node) clk_data =mtk_alloc_clk_data (CLK_PERI_NR_CLK ); -mtk_clk_register_gates (node, peri_gates,ARRAY_SIZE (peri_gates), - clk_data); +mtk_clk_register_gates (NULL , node, peri_gates, +ARRAY_SIZE (peri_gates), clk_data);mtk_clk_register_composites (peri_clks,ARRAY_SIZE (peri_clks), base, &mt8173_clk_lock, clk_data);
@@ -1062,8 +1062,8 @@ static void __init mtk_imgsys_init(struct device_node *node) clk_data =mtk_alloc_clk_data (CLK_IMG_NR_CLK ); -mtk_clk_register_gates (node, img_clks,ARRAY_SIZE (img_clks), - clk_data); +mtk_clk_register_gates (NULL , node, img_clks, +ARRAY_SIZE (img_clks), clk_data); r =of_clk_add_hw_provider (node, of_clk_hw_onecell_get, clk_data);
@@ -1080,8 +1080,8 @@ static void __init mtk_vdecsys_init(struct device_node *node) clk_data =mtk_alloc_clk_data (CLK_VDEC_NR_CLK ); -mtk_clk_register_gates (node, vdec_clks,ARRAY_SIZE (vdec_clks), - clk_data); +mtk_clk_register_gates (NULL , node, vdec_clks, +ARRAY_SIZE (vdec_clks), clk_data); r =of_clk_add_hw_provider (node, of_clk_hw_onecell_get, clk_data);if (r)
@@ -1097,8 +1097,8 @@ static void __init mtk_vencsys_init(struct device_node *node) clk_data =mtk_alloc_clk_data (CLK_VENC_NR_CLK ); -mtk_clk_register_gates (node, venc_clks,ARRAY_SIZE (venc_clks), - clk_data); +mtk_clk_register_gates (NULL , node, venc_clks, +ARRAY_SIZE (venc_clks), clk_data); r =of_clk_add_hw_provider (node, of_clk_hw_onecell_get, clk_data);if (r)
@@ -1114,8 +1114,8 @@ static void __init mtk_vencltsys_init(struct device_node *node) clk_data =mtk_alloc_clk_data (CLK_VENCLT_NR_CLK ); -mtk_clk_register_gates (node, venclt_clks,ARRAY_SIZE (venclt_clks), - clk_data); +mtk_clk_register_gates (NULL , node, venclt_clks, +ARRAY_SIZE (venclt_clks), clk_data); r =of_clk_add_hw_provider (node, of_clk_hw_onecell_get, clk_data);if (r)
drivers/clk/mediatek/clk-mt8183-audio.c +2 -2
@@ -75,8 +75,8 @@ static int clk_mt8183_audio_probe(struct platform_device *pdev) clk_data =mtk_alloc_clk_data (CLK_AUDIO_NR_CLK ); -mtk_clk_register_gates (node, audio_clks,ARRAY_SIZE (audio_clks), - clk_data); +mtk_clk_register_gates (&pdev->dev, node, audio_clks, +ARRAY_SIZE (audio_clks), clk_data); r =of_clk_add_hw_provider (node, of_clk_hw_onecell_get, clk_data);if (r)
drivers/clk/mediatek/clk-mt8183-mm.c +2 -2
@@ -90,8 +90,8 @@ static int clk_mt8183_mm_probe(struct platform_device *pdev) clk_data =mtk_alloc_clk_data (CLK_MM_NR_CLK ); -mtk_clk_register_gates (node, mm_clks,ARRAY_SIZE (mm_clks), - clk_data); +mtk_clk_register_gates (&pdev->dev, node, mm_clks, +ARRAY_SIZE (mm_clks), clk_data);return of_clk_add_hw_provider (node, of_clk_hw_onecell_get, clk_data); }
drivers/clk/mediatek/clk-mt8183.c +8 -8
@@ -1172,8 +1172,8 @@ static int clk_mt8183_apmixed_probe(struct platform_device *pdev)mtk_clk_register_plls (node, plls,ARRAY_SIZE (plls), clk_data); -mtk_clk_register_gates (node, apmixed_clks,ARRAY_SIZE (apmixed_clks), - clk_data); +mtk_clk_register_gates (&pdev->dev, node, apmixed_clks, +ARRAY_SIZE (apmixed_clks), clk_data);return of_clk_add_hw_provider (node, of_clk_hw_onecell_get, clk_data); }
@@ -1247,8 +1247,8 @@ static int clk_mt8183_top_probe(struct platform_device *pdev)mtk_clk_register_composites (top_aud_divs,ARRAY_SIZE (top_aud_divs), base, &mt8183_clk_lock, top_clk_data); -mtk_clk_register_gates (node, top_clks,ARRAY_SIZE (top_clks), - top_clk_data); +mtk_clk_register_gates (&pdev->dev, node, top_clks, +ARRAY_SIZE (top_clks), top_clk_data); ret =clk_mt8183_reg_mfg_mux_notifier (&pdev->dev, top_clk_data->hws[CLK_TOP_MUX_MFG ]->clk);
@@ -1267,8 +1267,8 @@ static int clk_mt8183_infra_probe(struct platform_device *pdev) clk_data =mtk_alloc_clk_data (CLK_INFRA_NR_CLK ); -mtk_clk_register_gates (node, infra_clks,ARRAY_SIZE (infra_clks), - clk_data); +mtk_clk_register_gates (&pdev->dev, node, infra_clks, +ARRAY_SIZE (infra_clks), clk_data); r =of_clk_add_hw_provider (node, of_clk_hw_onecell_get, clk_data);if (r) {
@@ -1290,8 +1290,8 @@ static int clk_mt8183_peri_probe(struct platform_device *pdev) clk_data =mtk_alloc_clk_data (CLK_PERI_NR_CLK ); -mtk_clk_register_gates (node, peri_clks,ARRAY_SIZE (peri_clks), - clk_data); +mtk_clk_register_gates (&pdev->dev, node, peri_clks, +ARRAY_SIZE (peri_clks), clk_data);return of_clk_add_hw_provider (node, of_clk_hw_onecell_get, clk_data); }
drivers/clk/mediatek/clk-mt8186-mm.c +2 -1
@@ -69,7 +69,8 @@ static int clk_mt8186_mm_probe(struct platform_device *pdev)if (!clk_data)return -ENOMEM ; - r =mtk_clk_register_gates (node, mm_clks,ARRAY_SIZE (mm_clks), clk_data); + r =mtk_clk_register_gates (&pdev->dev, node, mm_clks, +ARRAY_SIZE (mm_clks), clk_data);if (r) goto free_mm_data;
drivers/clk/mediatek/clk-mt8192-aud.c +2 -1
@@ -87,7 +87,8 @@ static int clk_mt8192_aud_probe(struct platform_device *pdev)if (!clk_data)return -ENOMEM ; - r =mtk_clk_register_gates (node, aud_clks,ARRAY_SIZE (aud_clks), clk_data); + r =mtk_clk_register_gates (&pdev->dev, node, aud_clks, +ARRAY_SIZE (aud_clks), clk_data);if (r)return r;
drivers/clk/mediatek/clk-mt8192-mm.c +2 -1
@@ -91,7 +91,8 @@ static int clk_mt8192_mm_probe(struct platform_device *pdev)if (!clk_data)return -ENOMEM ; - r =mtk_clk_register_gates (node, mm_clks,ARRAY_SIZE (mm_clks), clk_data); + r =mtk_clk_register_gates (&pdev->dev, node, mm_clks, +ARRAY_SIZE (mm_clks), clk_data);if (r)return r;
drivers/clk/mediatek/clk-mt8192.c +8 -9
@@ -1127,8 +1127,8 @@ static int clk_mt8192_top_probe(struct platform_device *pdev)if (r) goto unregister_top_composites; - r =mtk_clk_register_gates_with_dev (node, top_clks,ARRAY_SIZE (top_clks), - top_clk_data, &pdev->dev); + r =mtk_clk_register_gates (&pdev->dev, node, top_clks, +ARRAY_SIZE (top_clks), top_clk_data);if (r) goto unregister_adj_divs_composites;
@@ -1171,8 +1171,8 @@ static int clk_mt8192_infra_probe(struct platform_device *pdev)if (!clk_data)return -ENOMEM ; - r =mtk_clk_register_gates_with_dev (node, infra_clks,ARRAY_SIZE (infra_clks), - clk_data, &pdev->dev); + r =mtk_clk_register_gates (&pdev->dev, node, infra_clks, +ARRAY_SIZE (infra_clks), clk_data);if (r) goto free_clk_data;
@@ -1203,8 +1203,8 @@ static int clk_mt8192_peri_probe(struct platform_device *pdev)if (!clk_data)return -ENOMEM ; - r =mtk_clk_register_gates_with_dev (node, peri_clks,ARRAY_SIZE (peri_clks), - clk_data, &pdev->dev); + r =mtk_clk_register_gates (&pdev->dev, node, peri_clks, +ARRAY_SIZE (peri_clks), clk_data);if (r) goto free_clk_data;
@@ -1232,9 +1232,8 @@ static int clk_mt8192_apmixed_probe(struct platform_device *pdev)return -ENOMEM ;mtk_clk_register_plls (node, plls,ARRAY_SIZE (plls), clk_data); - r =mtk_clk_register_gates_with_dev (node, apmixed_clks, -ARRAY_SIZE (apmixed_clks), clk_data, - &pdev->dev); + r =mtk_clk_register_gates (&pdev->dev, node, apmixed_clks, +ARRAY_SIZE (apmixed_clks), clk_data);if (r) goto free_clk_data;
drivers/clk/mediatek/clk-mt8195-apmixedsys.c +2 -1
@@ -124,7 +124,8 @@ static int clk_mt8195_apmixed_probe(struct platform_device *pdev)if (r) goto free_apmixed_data; - r =mtk_clk_register_gates (node, apmixed_clks,ARRAY_SIZE (apmixed_clks), clk_data); + r =mtk_clk_register_gates (&pdev->dev, node, apmixed_clks, +ARRAY_SIZE (apmixed_clks), clk_data);if (r) goto unregister_plls;
drivers/clk/mediatek/clk-mt8195-topckgen.c +2 -1
@@ -1286,7 +1286,8 @@ static int clk_mt8195_topck_probe(struct platform_device *pdev)if (r) goto unregister_muxes; - r =mtk_clk_register_gates (node, top_clks,ARRAY_SIZE (top_clks), top_clk_data); + r =mtk_clk_register_gates (&pdev->dev, node, top_clks, +ARRAY_SIZE (top_clks), top_clk_data);if (r) goto unregister_composite_divs;
drivers/clk/mediatek/clk-mt8195-vdo0.c +2 -1
@@ -104,7 +104,8 @@ static int clk_mt8195_vdo0_probe(struct platform_device *pdev)if (!clk_data)return -ENOMEM ; - r =mtk_clk_register_gates (node, vdo0_clks,ARRAY_SIZE (vdo0_clks), clk_data); + r =mtk_clk_register_gates (&pdev->dev, node, vdo0_clks, +ARRAY_SIZE (vdo0_clks), clk_data);if (r) goto free_vdo0_data;
drivers/clk/mediatek/clk-mt8195-vdo1.c +2 -1
@@ -131,7 +131,8 @@ static int clk_mt8195_vdo1_probe(struct platform_device *pdev)if (!clk_data)return -ENOMEM ; - r =mtk_clk_register_gates (node, vdo1_clks,ARRAY_SIZE (vdo1_clks), clk_data); + r =mtk_clk_register_gates (&pdev->dev, node, vdo1_clks, +ARRAY_SIZE (vdo1_clks), clk_data);if (r) goto free_vdo1_data;
drivers/clk/mediatek/clk-mt8365-mm.c +2 -3
@@ -81,9 +81,8 @@ static int clk_mt8365_mm_probe(struct platform_device *pdev) clk_data =mtk_alloc_clk_data (CLK_MM_NR_CLK ); - ret =mtk_clk_register_gates_with_dev (node, mm_clks, -ARRAY_SIZE (mm_clks), clk_data, - dev); + ret =mtk_clk_register_gates (dev, node, mm_clks, +ARRAY_SIZE (mm_clks), clk_data);if (ret) goto err_free_clk_data;
drivers/clk/mediatek/clk-mt8365.c +2 -2
@@ -1019,8 +1019,8 @@ static int clk_mt8365_infra_probe(struct platform_device *pdev)if (!clk_data)return -ENOMEM ; - ret =mtk_clk_register_gates (node, ifr_clks,ARRAY_SIZE (ifr_clks), - clk_data); + ret =mtk_clk_register_gates (&pdev->dev, node, ifr_clks, +ARRAY_SIZE (ifr_clks), clk_data);if (ret) goto free_clk_data;
drivers/clk/mediatek/clk-mt8516-aud.c +1 -1
@@ -48,7 +48,7 @@ static void __init mtk_audsys_init(struct device_node *node) clk_data =mtk_alloc_clk_data (CLK_AUD_NR_CLK ); -mtk_clk_register_gates (node, aud_clks,ARRAY_SIZE (aud_clks), clk_data); +mtk_clk_register_gates (NULL , node, aud_clks,ARRAY_SIZE (aud_clks), clk_data); r =of_clk_add_hw_provider (node, of_clk_hw_onecell_get, clk_data);if (r)
drivers/clk/mediatek/clk-mt8516.c +1 -1
@@ -655,7 +655,7 @@ static void __init mtk_topckgen_init(struct device_node *node)mtk_clk_register_fixed_clks (fixed_clks,ARRAY_SIZE (fixed_clks), clk_data); -mtk_clk_register_gates (node, top_clks,ARRAY_SIZE (top_clks), clk_data); +mtk_clk_register_gates (NULL , node, top_clks,ARRAY_SIZE (top_clks), clk_data);mtk_clk_register_factors (top_divs,ARRAY_SIZE (top_divs), clk_data); mtk_clk_register_composites(top_muxes, ARRAY_SIZE(top_muxes), base,
drivers/clk/mediatek/clk-mtk.c +2 -2
@@ -459,8 +459,8 @@ int mtk_clk_simple_probe(struct platform_device *pdev)if (!clk_data)return -ENOMEM ; - r =mtk_clk_register_gates_with_dev (node, mcd->clks, mcd->num_clks, - clk_data, &pdev->dev); + r =mtk_clk_register_gates (&pdev->dev, node, mcd->clks, mcd->num_clks, + clk_data);if (r) goto free_data;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 93/141 clk: mediatek: clk-mtk: Propagate struct device for composites
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: AngeloGioacchino Del Regno <[email protected]>
[ Upstream commit 01a6c1ab57c3a474c8d23c7d82c3fcce85f62612 ]
Like done for cpumux clocks, propagate struct device for composite clocks registered through clk-mtk helpers to be able to get runtime pm support for MTK clocks.
Stable-dep-of: 2f7b1d8b5505 ("clk: mediatek: Do a runtime PM get on controllers during probe")
--- drivers/clk/mediatek/clk-mt2701.c | 10 ++++++---- drivers/clk/mediatek/clk-mt2712.c | 12 ++++++++---- drivers/clk/mediatek/clk-mt6779.c | 10 ++++++---- drivers/clk/mediatek/clk-mt6795-pericfg.c | 3 ++- drivers/clk/mediatek/clk-mt6795-topckgen.c | 3 ++- drivers/clk/mediatek/clk-mt6797.c | 3 ++- drivers/clk/mediatek/clk-mt7622.c | 8 +++++--- drivers/clk/mediatek/clk-mt7629.c | 8 +++++--- drivers/clk/mediatek/clk-mt8135.c | 10 ++++++---- drivers/clk/mediatek/clk-mt8167.c | 10 ++++++---- drivers/clk/mediatek/clk-mt8173.c | 10 ++++++---- drivers/clk/mediatek/clk-mt8183.c | 15 +++++++++------ drivers/clk/mediatek/clk-mt8186-mcu.c | 3 ++- drivers/clk/mediatek/clk-mt8186-topckgen.c | 6 ++++-- drivers/clk/mediatek/clk-mt8192.c | 6 ++++-- drivers/clk/mediatek/clk-mt8195-topckgen.c | 3 ++- drivers/clk/mediatek/clk-mt8365.c | 7 ++++--- drivers/clk/mediatek/clk-mt8516.c | 10 ++++++---- drivers/clk/mediatek/clk-mtk.c | 11 ++++++----- drivers/clk/mediatek/clk-mtk.h | 3 ++- 20 files changed, 93 insertions(+), 58 deletions(-)
drivers/clk/mediatek/clk-mt2701.c +6 -4
@@ -679,8 +679,9 @@ static int mtk_topckgen_init(struct platform_device *pdev)mtk_clk_register_factors (top_fixed_divs,ARRAY_SIZE (top_fixed_divs), clk_data); -mtk_clk_register_composites (top_muxes,ARRAY_SIZE (top_muxes), - base, &mt2701_clk_lock, clk_data); +mtk_clk_register_composites (&pdev->dev, top_muxes, +ARRAY_SIZE (top_muxes), base, + &mt2701_clk_lock, clk_data);mtk_clk_register_dividers (top_adj_divs,ARRAY_SIZE (top_adj_divs), base, &mt2701_clk_lock, clk_data);
@@ -905,8 +906,9 @@ static int mtk_pericfg_init(struct platform_device *pdev)mtk_clk_register_gates (&pdev->dev, node, peri_clks,ARRAY_SIZE (peri_clks), clk_data); -mtk_clk_register_composites (peri_muxs,ARRAY_SIZE (peri_muxs), base, - &mt2701_clk_lock, clk_data); +mtk_clk_register_composites (&pdev->dev, peri_muxs, +ARRAY_SIZE (peri_muxs), base, + &mt2701_clk_lock, clk_data); r =of_clk_add_hw_provider (node, of_clk_hw_onecell_get, clk_data);if (r)
drivers/clk/mediatek/clk-mt2712.c +8 -4
@@ -1320,8 +1320,9 @@ static int clk_mt2712_top_probe(struct platform_device *pdev)mtk_clk_register_factors (top_early_divs,ARRAY_SIZE (top_early_divs), top_clk_data);mtk_clk_register_factors (top_divs,ARRAY_SIZE (top_divs), top_clk_data); -mtk_clk_register_composites (top_muxes,ARRAY_SIZE (top_muxes), base, - &mt2712_clk_lock, top_clk_data); +mtk_clk_register_composites (&pdev->dev, top_muxes, +ARRAY_SIZE (top_muxes), base, + &mt2712_clk_lock, top_clk_data);mtk_clk_register_dividers (top_adj_divs,ARRAY_SIZE (top_adj_divs), base, &mt2712_clk_lock, top_clk_data); mtk_clk_register_gates(&pdev->dev, node, top_clks,
@@ -1395,8 +1396,11 @@ static int clk_mt2712_mcu_probe(struct platform_device *pdev) clk_data =mtk_alloc_clk_data (CLK_MCU_NR_CLK ); -mtk_clk_register_composites (mcu_muxes,ARRAY_SIZE (mcu_muxes), base, - &mt2712_clk_lock, clk_data); + r =mtk_clk_register_composites (&pdev->dev, mcu_muxes, +ARRAY_SIZE (mcu_muxes), base, + &mt2712_clk_lock, clk_data); +if (r) +dev_err (&pdev->dev,"Could not register composites: %d\n" , r); r =of_clk_add_hw_provider (node, of_clk_hw_onecell_get, clk_data);
drivers/clk/mediatek/clk-mt6779.c +6 -4
@@ -1251,11 +1251,13 @@ static int clk_mt6779_top_probe(struct platform_device *pdev)mtk_clk_register_muxes (top_muxes,ARRAY_SIZE (top_muxes), node, &mt6779_clk_lock, clk_data); -mtk_clk_register_composites (top_aud_muxes,ARRAY_SIZE (top_aud_muxes), - base, &mt6779_clk_lock, clk_data); +mtk_clk_register_composites (&pdev->dev, top_aud_muxes, +ARRAY_SIZE (top_aud_muxes), base, + &mt6779_clk_lock, clk_data); -mtk_clk_register_composites (top_aud_divs,ARRAY_SIZE (top_aud_divs), - base, &mt6779_clk_lock, clk_data); +mtk_clk_register_composites (&pdev->dev, top_aud_divs, +ARRAY_SIZE (top_aud_divs), base, + &mt6779_clk_lock, clk_data);return of_clk_add_hw_provider (node, of_clk_hw_onecell_get, clk_data); }
drivers/clk/mediatek/clk-mt6795-pericfg.c +2 -1
@@ -114,7 +114,8 @@ static int clk_mt6795_pericfg_probe(struct platform_device *pdev)if (ret) goto free_clk_data; - ret =mtk_clk_register_composites (peri_clks,ARRAY_SIZE (peri_clks), base, + ret =mtk_clk_register_composites (&pdev->dev, peri_clks, +ARRAY_SIZE (peri_clks), base, &mt6795_peri_clk_lock, clk_data);if (ret) goto unregister_gates;
drivers/clk/mediatek/clk-mt6795-topckgen.c +2 -1
@@ -557,7 +557,8 @@ static int clk_mt6795_topckgen_probe(struct platform_device *pdev)if (ret) goto unregister_factors; - ret =mtk_clk_register_composites (top_aud_divs,ARRAY_SIZE (top_aud_divs), base, + ret =mtk_clk_register_composites (&pdev->dev, top_aud_divs, +ARRAY_SIZE (top_aud_divs), base, &mt6795_top_clk_lock, clk_data);if (ret) goto unregister_muxes;
drivers/clk/mediatek/clk-mt6797.c +2 -1
@@ -398,7 +398,8 @@ static int mtk_topckgen_init(struct platform_device *pdev)mtk_clk_register_factors (top_fixed_divs,ARRAY_SIZE (top_fixed_divs), clk_data); -mtk_clk_register_composites (top_muxes,ARRAY_SIZE (top_muxes), base, +mtk_clk_register_composites (&pdev->dev, top_muxes, +ARRAY_SIZE (top_muxes), base, &mt6797_clk_lock, clk_data);return of_clk_add_hw_provider (node, of_clk_hw_onecell_get, clk_data);
drivers/clk/mediatek/clk-mt7622.c +5 -3
@@ -615,8 +615,9 @@ static int mtk_topckgen_init(struct platform_device *pdev)mtk_clk_register_factors (top_divs,ARRAY_SIZE (top_divs), clk_data); -mtk_clk_register_composites (top_muxes,ARRAY_SIZE (top_muxes), - base, &mt7622_clk_lock, clk_data); +mtk_clk_register_composites (&pdev->dev, top_muxes, +ARRAY_SIZE (top_muxes), base, + &mt7622_clk_lock, clk_data);mtk_clk_register_dividers (top_adj_divs,ARRAY_SIZE (top_adj_divs), base, &mt7622_clk_lock, clk_data);
@@ -685,7 +686,8 @@ static int mtk_pericfg_init(struct platform_device *pdev)mtk_clk_register_gates (&pdev->dev, node, peri_clks,ARRAY_SIZE (peri_clks), clk_data); -mtk_clk_register_composites (peri_muxes,ARRAY_SIZE (peri_muxes), base, +mtk_clk_register_composites (&pdev->dev, peri_muxes, +ARRAY_SIZE (peri_muxes), base, &mt7622_clk_lock, clk_data); r =of_clk_add_hw_provider (node, of_clk_hw_onecell_get, clk_data);
drivers/clk/mediatek/clk-mt7629.c +5 -3
@@ -566,8 +566,9 @@ static int mtk_topckgen_init(struct platform_device *pdev)mtk_clk_register_factors (top_divs,ARRAY_SIZE (top_divs), clk_data); -mtk_clk_register_composites (top_muxes,ARRAY_SIZE (top_muxes), - base, &mt7629_clk_lock, clk_data); +mtk_clk_register_composites (&pdev->dev, top_muxes, +ARRAY_SIZE (top_muxes), base, + &mt7629_clk_lock, clk_data);clk_prepare_enable (clk_data->hws[CLK_TOP_AXI_SEL ]->clk);clk_prepare_enable (clk_data->hws[CLK_TOP_MEM_SEL ]->clk);
@@ -613,7 +614,8 @@ static int mtk_pericfg_init(struct platform_device *pdev)mtk_clk_register_gates (&pdev->dev, node, peri_clks,ARRAY_SIZE (peri_clks), clk_data); -mtk_clk_register_composites (peri_muxes,ARRAY_SIZE (peri_muxes), base, +mtk_clk_register_composites (&pdev->dev, peri_muxes, +ARRAY_SIZE (peri_muxes), base, &mt7629_clk_lock, clk_data); r =of_clk_add_hw_provider (node, of_clk_hw_onecell_get, clk_data);
drivers/clk/mediatek/clk-mt8135.c +6 -4
@@ -536,8 +536,9 @@ static void __init mtk_topckgen_init(struct device_node *node)mtk_clk_register_factors (root_clk_alias,ARRAY_SIZE (root_clk_alias), clk_data);mtk_clk_register_factors (top_divs,ARRAY_SIZE (top_divs), clk_data); -mtk_clk_register_composites (top_muxes,ARRAY_SIZE (top_muxes), base, - &mt8135_clk_lock, clk_data); +mtk_clk_register_composites (NULL , top_muxes, +ARRAY_SIZE (top_muxes), base, + &mt8135_clk_lock, clk_data); r =of_clk_add_hw_provider (node, of_clk_hw_onecell_get, clk_data);if (r)
@@ -581,8 +582,9 @@ static void __init mtk_pericfg_init(struct device_node *node)mtk_clk_register_gates (NULL , node, peri_gates,ARRAY_SIZE (peri_gates), clk_data); -mtk_clk_register_composites (peri_clks,ARRAY_SIZE (peri_clks), base, - &mt8135_clk_lock, clk_data); +mtk_clk_register_composites (NULL , peri_clks, +ARRAY_SIZE (peri_clks), base, + &mt8135_clk_lock, clk_data); r =of_clk_add_hw_provider (node, of_clk_hw_onecell_get, clk_data);if (r)
drivers/clk/mediatek/clk-mt8167.c +6 -4
@@ -940,8 +940,9 @@ static void __init mtk_topckgen_init(struct device_node *node)mtk_clk_register_gates (NULL , node, top_clks,ARRAY_SIZE (top_clks), clk_data);mtk_clk_register_factors (top_divs,ARRAY_SIZE (top_divs), clk_data); -mtk_clk_register_composites (top_muxes,ARRAY_SIZE (top_muxes), base, - &mt8167_clk_lock, clk_data); +mtk_clk_register_composites (NULL , top_muxes, +ARRAY_SIZE (top_muxes), base, + &mt8167_clk_lock, clk_data);mtk_clk_register_dividers (top_adj_divs,ARRAY_SIZE (top_adj_divs), base, &mt8167_clk_lock, clk_data);
@@ -966,8 +967,9 @@ static void __init mtk_infracfg_init(struct device_node *node) clk_data =mtk_alloc_clk_data (CLK_IFR_NR_CLK ); -mtk_clk_register_composites (ifr_muxes,ARRAY_SIZE (ifr_muxes), base, - &mt8167_clk_lock, clk_data); +mtk_clk_register_composites (NULL , ifr_muxes, +ARRAY_SIZE (ifr_muxes), base, + &mt8167_clk_lock, clk_data); r =of_clk_add_hw_provider (node, of_clk_hw_onecell_get, clk_data);if (r)
drivers/clk/mediatek/clk-mt8173.c +6 -4
@@ -869,8 +869,9 @@ static void __init mtk_topckgen_init(struct device_node *node)mtk_clk_register_fixed_clks (fixed_clks,ARRAY_SIZE (fixed_clks), clk_data);mtk_clk_register_factors (top_divs,ARRAY_SIZE (top_divs), clk_data); -mtk_clk_register_composites (top_muxes,ARRAY_SIZE (top_muxes), base, - &mt8173_clk_lock, clk_data); +mtk_clk_register_composites (NULL , top_muxes, +ARRAY_SIZE (top_muxes), base, + &mt8173_clk_lock, clk_data); r =of_clk_add_hw_provider (node, of_clk_hw_onecell_get, clk_data);if (r)
@@ -920,8 +921,9 @@ static void __init mtk_pericfg_init(struct device_node *node)mtk_clk_register_gates (NULL , node, peri_gates,ARRAY_SIZE (peri_gates), clk_data); -mtk_clk_register_composites (peri_clks,ARRAY_SIZE (peri_clks), base, - &mt8173_clk_lock, clk_data); +mtk_clk_register_composites (NULL , peri_clks, +ARRAY_SIZE (peri_clks), base, + &mt8173_clk_lock, clk_data); r =of_clk_add_hw_provider (node, of_clk_hw_onecell_get, clk_data);if (r)
drivers/clk/mediatek/clk-mt8183.c +9 -6
@@ -1241,11 +1241,13 @@ static int clk_mt8183_top_probe(struct platform_device *pdev)mtk_clk_register_muxes (top_muxes,ARRAY_SIZE (top_muxes), node, &mt8183_clk_lock, top_clk_data); -mtk_clk_register_composites (top_aud_muxes,ARRAY_SIZE (top_aud_muxes), - base, &mt8183_clk_lock, top_clk_data); +mtk_clk_register_composites (&pdev->dev, top_aud_muxes, +ARRAY_SIZE (top_aud_muxes), base, + &mt8183_clk_lock, top_clk_data); -mtk_clk_register_composites (top_aud_divs,ARRAY_SIZE (top_aud_divs), - base, &mt8183_clk_lock, top_clk_data); +mtk_clk_register_composites (&pdev->dev, top_aud_divs, +ARRAY_SIZE (top_aud_divs), base, + &mt8183_clk_lock, top_clk_data);mtk_clk_register_gates (&pdev->dev, node, top_clks,ARRAY_SIZE (top_clks), top_clk_data);
@@ -1308,8 +1310,9 @@ static int clk_mt8183_mcu_probe(struct platform_device *pdev) clk_data =mtk_alloc_clk_data (CLK_MCU_NR_CLK ); -mtk_clk_register_composites (mcu_muxes,ARRAY_SIZE (mcu_muxes), base, - &mt8183_clk_lock, clk_data); +mtk_clk_register_composites (&pdev->dev, mcu_muxes, +ARRAY_SIZE (mcu_muxes), base, + &mt8183_clk_lock, clk_data);return of_clk_add_hw_provider (node, of_clk_hw_onecell_get, clk_data); }
drivers/clk/mediatek/clk-mt8186-mcu.c +2 -1
@@ -65,7 +65,8 @@ static int clk_mt8186_mcu_probe(struct platform_device *pdev) goto free_mcu_data; } - r =mtk_clk_register_composites (mcu_muxes,ARRAY_SIZE (mcu_muxes), base, + r =mtk_clk_register_composites (&pdev->dev, mcu_muxes, +ARRAY_SIZE (mcu_muxes), base,NULL , clk_data);if (r) goto free_mcu_data;
drivers/clk/mediatek/clk-mt8186-topckgen.c +4 -2
@@ -720,12 +720,14 @@ static int clk_mt8186_topck_probe(struct platform_device *pdev)if (r) goto unregister_factors; - r =mtk_clk_register_composites (top_muxes,ARRAY_SIZE (top_muxes), base, + r =mtk_clk_register_composites (&pdev->dev, top_muxes, +ARRAY_SIZE (top_muxes), base, &mt8186_clk_lock, clk_data);if (r) goto unregister_muxes; - r =mtk_clk_register_composites (top_adj_divs,ARRAY_SIZE (top_adj_divs), base, + r =mtk_clk_register_composites (&pdev->dev, top_adj_divs, +ARRAY_SIZE (top_adj_divs), base, &mt8186_clk_lock, clk_data);if (r) goto unregister_composite_muxes;
drivers/clk/mediatek/clk-mt8192.c +4 -2
@@ -1117,12 +1117,14 @@ static int clk_mt8192_top_probe(struct platform_device *pdev)if (r) goto unregister_factors; - r =mtk_clk_register_composites (top_muxes,ARRAY_SIZE (top_muxes), base, + r =mtk_clk_register_composites (&pdev->dev, top_muxes, +ARRAY_SIZE (top_muxes), base, &mt8192_clk_lock, top_clk_data);if (r) goto unregister_muxes; - r =mtk_clk_register_composites (top_adj_divs,ARRAY_SIZE (top_adj_divs), base, + r =mtk_clk_register_composites (&pdev->dev, top_adj_divs, +ARRAY_SIZE (top_adj_divs), base, &mt8192_clk_lock, top_clk_data);if (r) goto unregister_top_composites;
drivers/clk/mediatek/clk-mt8195-topckgen.c +2 -1
@@ -1281,7 +1281,8 @@ static int clk_mt8195_topck_probe(struct platform_device *pdev)if (r) goto unregister_muxes; - r =mtk_clk_register_composites (top_adj_divs,ARRAY_SIZE (top_adj_divs), base, + r =mtk_clk_register_composites (&pdev->dev, top_adj_divs, +ARRAY_SIZE (top_adj_divs), base, &mt8195_clk_lock, top_clk_data);if (r) goto unregister_muxes;
drivers/clk/mediatek/clk-mt8365.c +4 -3
@@ -952,7 +952,7 @@ static int clk_mt8365_top_probe(struct platform_device *pdev)if (ret) goto unregister_factors; - ret =mtk_clk_register_composites (top_misc_mux_gates, + ret =mtk_clk_register_composites (&pdev->dev, top_misc_mux_gates,ARRAY_SIZE (top_misc_mux_gates), base, &mt8365_clk_lock, clk_data);if (ret)
@@ -1080,8 +1080,9 @@ static int clk_mt8365_mcu_probe(struct platform_device *pdev)if (!clk_data)return -ENOMEM ; - ret =mtk_clk_register_composites (mcu_muxes,ARRAY_SIZE (mcu_muxes), - base, &mt8365_clk_lock, clk_data); + ret =mtk_clk_register_composites (&pdev->dev, mcu_muxes, +ARRAY_SIZE (mcu_muxes), base, + &mt8365_clk_lock, clk_data);if (ret) goto free_clk_data;
drivers/clk/mediatek/clk-mt8516.c +6 -4
@@ -658,8 +658,9 @@ static void __init mtk_topckgen_init(struct device_node *node)mtk_clk_register_gates (NULL , node, top_clks,ARRAY_SIZE (top_clks), clk_data);mtk_clk_register_factors (top_divs,ARRAY_SIZE (top_divs), clk_data); -mtk_clk_register_composites (top_muxes,ARRAY_SIZE (top_muxes), base, - &mt8516_clk_lock, clk_data); +mtk_clk_register_composites (NULL , top_muxes, +ARRAY_SIZE (top_muxes), base, + &mt8516_clk_lock, clk_data);mtk_clk_register_dividers (top_adj_divs,ARRAY_SIZE (top_adj_divs), base, &mt8516_clk_lock, clk_data);
@@ -684,8 +685,9 @@ static void __init mtk_infracfg_init(struct device_node *node) clk_data =mtk_alloc_clk_data (CLK_IFR_NR_CLK ); -mtk_clk_register_composites (ifr_muxes,ARRAY_SIZE (ifr_muxes), base, - &mt8516_clk_lock, clk_data); +mtk_clk_register_composites (NULL , ifr_muxes, +ARRAY_SIZE (ifr_muxes), base, + &mt8516_clk_lock, clk_data); r =of_clk_add_hw_provider (node, of_clk_hw_onecell_get, clk_data);if (r)
drivers/clk/mediatek/clk-mtk.c +6 -5
@@ -197,8 +197,8 @@ void mtk_clk_unregister_factors(const struct mtk_fixed_factor *clks, int num, }EXPORT_SYMBOL_GPL (mtk_clk_unregister_factors); -static struct clk_hw *mtk_clk_register_composite (const struct mtk_composite *mc, -void __iomem *base,spinlock_t *lock) +static struct clk_hw *mtk_clk_register_composite (struct device *dev, +const struct mtk_composite *mc,void __iomem *base,spinlock_t *lock) {struct clk_hw *hw;struct clk_mux *mux =NULL ;
@@ -264,7 +264,7 @@ static struct clk_hw *mtk_clk_register_composite(const struct mtk_composite *mc, div_ops = &clk_divider_ops; } - hw = clk_hw_register_composite(NULL, mc->name, parent_names, num_parents, + hw = clk_hw_register_composite(dev, mc->name, parent_names, num_parents, mux_hw, mux_ops, div_hw, div_ops, gate_hw, gate_ops,
@@ -308,7 +308,8 @@ static void mtk_clk_unregister_composite(struct clk_hw *hw)kfree (mux); } -int mtk_clk_register_composites (const struct mtk_composite *mcs,int num, +int mtk_clk_register_composites (struct device *dev, +const struct mtk_composite *mcs,int num,void __iomem *base,spinlock_t *lock,struct clk_hw_onecell_data *clk_data) {
@@ -327,7 +328,7 @@ int mtk_clk_register_composites(const struct mtk_composite *mcs, int num,continue ; } - hw =mtk_clk_register_composite (mc, base, lock); + hw =mtk_clk_register_composite (dev, mc, base, lock);if (IS_ERR (hw)) { pr_err("Failed to register clk %s: %pe\n", mc->name,
drivers/clk/mediatek/clk-mtk.h +2 -1
@@ -149,7 +149,8 @@ struct mtk_composite { .flags = 0, \ } -int mtk_clk_register_composites (const struct mtk_composite *mcs,int num, +int mtk_clk_register_composites (struct device *dev, +const struct mtk_composite *mcs,int num,void __iomem *base,spinlock_t *lock,struct clk_hw_onecell_data *clk_data); void mtk_clk_unregister_composites(const struct mtk_composite *mcs, int num,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 94/141 clk: mediatek: clk-mux: Propagate struct device for mtk-mux
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: AngeloGioacchino Del Regno <[email protected]>
[ Upstream commit d3d6bd5e25cdc460df33ae1db4f051c4bdd3aa60 ]
Like done for other clocks, propagate struct device for mtk mux clocks registered through clk-mux helpers to enable runtime pm support.
Stable-dep-of: 2f7b1d8b5505 ("clk: mediatek: Do a runtime PM get on controllers during probe")
--- drivers/clk/mediatek/clk-mt6765.c | 3 ++- drivers/clk/mediatek/clk-mt6779.c | 5 +++-- drivers/clk/mediatek/clk-mt6795-topckgen.c | 3 ++- drivers/clk/mediatek/clk-mt7986-infracfg.c | 3 ++- drivers/clk/mediatek/clk-mt7986-topckgen.c | 3 ++- drivers/clk/mediatek/clk-mt8183.c | 5 +++-- drivers/clk/mediatek/clk-mt8186-topckgen.c | 3 ++- drivers/clk/mediatek/clk-mt8192.c | 3 ++- drivers/clk/mediatek/clk-mt8195-topckgen.c | 3 ++- drivers/clk/mediatek/clk-mt8365.c | 3 ++- drivers/clk/mediatek/clk-mux.c | 14 ++++++++------ drivers/clk/mediatek/clk-mux.h | 3 ++- 12 files changed, 32 insertions(+), 19 deletions(-)
drivers/clk/mediatek/clk-mt6765.c +2 -1
@@ -782,7 +782,8 @@ static int clk_mt6765_top_probe(struct platform_device *pdev) clk_data);mtk_clk_register_factors (top_divs,ARRAY_SIZE (top_divs), clk_data); -mtk_clk_register_muxes (top_muxes,ARRAY_SIZE (top_muxes), node, +mtk_clk_register_muxes (&pdev->dev, top_muxes, +ARRAY_SIZE (top_muxes), node, &mt6765_clk_lock, clk_data);mtk_clk_register_gates (&pdev->dev, node, top_clks,ARRAY_SIZE (top_clks), clk_data);
drivers/clk/mediatek/clk-mt6779.c +3 -2
@@ -1248,8 +1248,9 @@ static int clk_mt6779_top_probe(struct platform_device *pdev)mtk_clk_register_factors (top_divs,ARRAY_SIZE (top_divs), clk_data); -mtk_clk_register_muxes (top_muxes,ARRAY_SIZE (top_muxes), - node, &mt6779_clk_lock, clk_data); +mtk_clk_register_muxes (&pdev->dev, top_muxes, +ARRAY_SIZE (top_muxes), node, + &mt6779_clk_lock, clk_data); mtk_clk_register_composites(&pdev->dev, top_aud_muxes, ARRAY_SIZE(top_aud_muxes), base,
drivers/clk/mediatek/clk-mt6795-topckgen.c +2 -1
@@ -552,7 +552,8 @@ static int clk_mt6795_topckgen_probe(struct platform_device *pdev)if (ret) goto unregister_fixed_clks; - ret =mtk_clk_register_muxes (top_muxes,ARRAY_SIZE (top_muxes), node, + ret =mtk_clk_register_muxes (&pdev->dev, top_muxes, +ARRAY_SIZE (top_muxes), node, &mt6795_top_clk_lock, clk_data);if (ret) goto unregister_factors;
drivers/clk/mediatek/clk-mt7986-infracfg.c +2 -1
@@ -178,7 +178,8 @@ static int clk_mt7986_infracfg_probe(struct platform_device *pdev)return -ENOMEM ;mtk_clk_register_factors (infra_divs,ARRAY_SIZE (infra_divs), clk_data); -mtk_clk_register_muxes (infra_muxes,ARRAY_SIZE (infra_muxes), node, +mtk_clk_register_muxes (&pdev->dev, infra_muxes, +ARRAY_SIZE (infra_muxes), node, &mt7986_clk_lock, clk_data);mtk_clk_register_gates (&pdev->dev, node, infra_clks,ARRAY_SIZE (infra_clks), clk_data);
drivers/clk/mediatek/clk-mt7986-topckgen.c +2 -1
@@ -303,7 +303,8 @@ static int clk_mt7986_topckgen_probe(struct platform_device *pdev)mtk_clk_register_fixed_clks (top_fixed_clks,ARRAY_SIZE (top_fixed_clks), clk_data);mtk_clk_register_factors (top_divs,ARRAY_SIZE (top_divs), clk_data); -mtk_clk_register_muxes (top_muxes,ARRAY_SIZE (top_muxes), node, +mtk_clk_register_muxes (&pdev->dev, top_muxes, +ARRAY_SIZE (top_muxes), node, &mt7986_clk_lock, clk_data);clk_prepare_enable (clk_data->hws[CLK_TOP_SYSAXI_SEL ]->clk);
drivers/clk/mediatek/clk-mt8183.c +3 -2
@@ -1238,8 +1238,9 @@ static int clk_mt8183_top_probe(struct platform_device *pdev)mtk_clk_register_factors (top_divs,ARRAY_SIZE (top_divs), top_clk_data); -mtk_clk_register_muxes (top_muxes,ARRAY_SIZE (top_muxes), - node, &mt8183_clk_lock, top_clk_data); +mtk_clk_register_muxes (&pdev->dev, top_muxes, +ARRAY_SIZE (top_muxes), node, + &mt8183_clk_lock, top_clk_data); mtk_clk_register_composites(&pdev->dev, top_aud_muxes, ARRAY_SIZE(top_aud_muxes), base,
drivers/clk/mediatek/clk-mt8186-topckgen.c +2 -1
@@ -715,7 +715,8 @@ static int clk_mt8186_topck_probe(struct platform_device *pdev)if (r) goto unregister_fixed_clks; - r =mtk_clk_register_muxes (top_mtk_muxes,ARRAY_SIZE (top_mtk_muxes), node, + r =mtk_clk_register_muxes (&pdev->dev, top_mtk_muxes, +ARRAY_SIZE (top_mtk_muxes), node, &mt8186_clk_lock, clk_data);if (r) goto unregister_factors;
drivers/clk/mediatek/clk-mt8192.c +2 -1
@@ -1112,7 +1112,8 @@ static int clk_mt8192_top_probe(struct platform_device *pdev)if (r) goto unregister_early_factors; - r =mtk_clk_register_muxes (top_mtk_muxes,ARRAY_SIZE (top_mtk_muxes), node, + r =mtk_clk_register_muxes (&pdev->dev, top_mtk_muxes, +ARRAY_SIZE (top_mtk_muxes), node, &mt8192_clk_lock, top_clk_data);if (r) goto unregister_factors;
drivers/clk/mediatek/clk-mt8195-topckgen.c +2 -1
@@ -1262,7 +1262,8 @@ static int clk_mt8195_topck_probe(struct platform_device *pdev)if (r) goto unregister_fixed_clks; - r =mtk_clk_register_muxes (top_mtk_muxes,ARRAY_SIZE (top_mtk_muxes), node, + r =mtk_clk_register_muxes (&pdev->dev, top_mtk_muxes, +ARRAY_SIZE (top_mtk_muxes), node, &mt8195_clk_lock, top_clk_data);if (r) goto unregister_factors;
drivers/clk/mediatek/clk-mt8365.c +2 -1
@@ -947,7 +947,8 @@ static int clk_mt8365_top_probe(struct platform_device *pdev)if (ret) goto unregister_fixed_clks; - ret =mtk_clk_register_muxes (top_muxes,ARRAY_SIZE (top_muxes), node, + ret =mtk_clk_register_muxes (&pdev->dev, top_muxes, +ARRAY_SIZE (top_muxes), node, &mt8365_clk_lock, clk_data);if (ret) goto unregister_factors;
drivers/clk/mediatek/clk-mux.c +8 -6
@@ -154,9 +154,10 @@ const struct clk_ops mtk_mux_gate_clr_set_upd_ops = { };EXPORT_SYMBOL_GPL (mtk_mux_gate_clr_set_upd_ops); -static struct clk_hw *mtk_clk_register_mux (const struct mtk_mux *mux, -struct regmap *regmap, -spinlock_t *lock) +static struct clk_hw *mtk_clk_register_mux (struct device *dev, +const struct mtk_mux *mux, +struct regmap *regmap, +spinlock_t *lock) {struct mtk_clk_mux *clk_mux;struct clk_init_data init = {};
@@ -177,7 +178,7 @@ static struct clk_hw *mtk_clk_register_mux(const struct mtk_mux *mux, clk_mux->lock = lock; clk_mux->hw.init = &init; - ret =clk_hw_register (NULL , &clk_mux->hw); + ret =clk_hw_register (dev, &clk_mux->hw);if (ret) {kfree (clk_mux);return ERR_PTR (ret);
@@ -198,7 +199,8 @@ static void mtk_clk_unregister_mux(struct clk_hw *hw)kfree (mux); } -int mtk_clk_register_muxes (const struct mtk_mux *muxes, +int mtk_clk_register_muxes (struct device *dev, +const struct mtk_mux *muxes,int num,struct device_node *node,spinlock_t *lock,struct clk_hw_onecell_data *clk_data)
@@ -222,7 +224,7 @@ int mtk_clk_register_muxes(const struct mtk_mux *muxes,continue ; } - hw =mtk_clk_register_mux (mux, regmap, lock); + hw =mtk_clk_register_mux (dev, mux, regmap, lock);if (IS_ERR (hw)) { pr_err("Failed to register clk %s: %pe\n", mux->name,
drivers/clk/mediatek/clk-mux.h +2 -1
@@ -83,7 +83,8 @@ extern const struct clk_ops mtk_mux_gate_clr_set_upd_ops; 0, _upd_ofs, _upd, CLK_SET_RATE_PARENT, \ mtk_mux_clr_set_upd_ops) -int mtk_clk_register_muxes (const struct mtk_mux *muxes, +int mtk_clk_register_muxes (struct device *dev, +const struct mtk_mux *muxes,int num,struct device_node *node,spinlock_t *lock,struct clk_hw_onecell_data *clk_data);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 95/141 clk: mediatek: clk-mtk: Extend mtk_clk_simple_probe()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: AngeloGioacchino Del Regno <[email protected]>
[ Upstream commit 7b6183108c8ccf0dc295f39cdf78bd8078455636 ]
As a preparation to increase probe functions commonization across various MediaTek SoC clock controller drivers, extend function mtk_clk_simple_probe() to be able to register not only gates, but also fixed clocks, factors, muxes and composites.
Stable-dep-of: 2f7b1d8b5505 ("clk: mediatek: Do a runtime PM get on controllers during probe")
--- drivers/clk/mediatek/clk-mtk.c | 101 ++++++++++++++++++++++++++++++--- drivers/clk/mediatek/clk-mtk.h | 10 ++++ 2 files changed, 103 insertions(+), 8 deletions(-)
drivers/clk/mediatek/clk-mtk.c +93 -8
@@ -11,12 +11,14 @@#include <linux/mfd/syscon.h> #include <linux/module.h> #include <linux/of.h> +#include <linux/of_address.h> #include <linux/of_device.h> #include <linux/platform_device.h> #include <linux/slab.h> #include "clk-mtk.h" #include "clk-gate.h" +#include "clk-mux.h" static void mtk_init_clk_data (struct clk_hw_onecell_data *clk_data,unsigned int clk_num)
@@ -450,20 +452,71 @@ int mtk_clk_simple_probe(struct platform_device *pdev)const struct mtk_clk_desc *mcd;struct clk_hw_onecell_data *clk_data;struct device_node *node = pdev->dev.of_node; -int r; +void __iomem *base; +int num_clks, r; mcd =of_device_get_match_data (&pdev->dev);if (!mcd)return -EINVAL ; - clk_data =mtk_alloc_clk_data (mcd->num_clks); +/* Composite clocks needs us to pass iomem pointer */ +if (mcd->composite_clks) { +if (!mcd->shared_io) + base =devm_platform_ioremap_resource (pdev,0 ); +else + base =of_iomap (node,0 ); + +if (IS_ERR_OR_NULL (base)) +return IS_ERR (base) ?PTR_ERR (base) : -ENOMEM ; + } + +/* Calculate how many clk_hw_onecell_data entries to allocate */ + num_clks = mcd->num_clks + mcd->num_composite_clks; + num_clks += mcd->num_fixed_clks + mcd->num_factor_clks; + num_clks += mcd->num_mux_clks; + + clk_data =mtk_alloc_clk_data (num_clks);if (!clk_data)return -ENOMEM ; - r =mtk_clk_register_gates (&pdev->dev, node, mcd->clks, mcd->num_clks, - clk_data); -if (r) - goto free_data; +if (mcd->fixed_clks) { + r =mtk_clk_register_fixed_clks (mcd->fixed_clks, + mcd->num_fixed_clks, clk_data); +if (r) + goto free_data; + } + +if (mcd->factor_clks) { + r =mtk_clk_register_factors (mcd->factor_clks, + mcd->num_factor_clks, clk_data); +if (r) + goto unregister_fixed_clks; + } + +if (mcd->mux_clks) { + r =mtk_clk_register_muxes (&pdev->dev, mcd->mux_clks, + mcd->num_mux_clks, node, + mcd->clk_lock, clk_data); +if (r) + goto unregister_factors; + }; + +if (mcd->composite_clks) { +/* We don't check composite_lock because it's optional */ + r =mtk_clk_register_composites (&pdev->dev, + mcd->composite_clks, + mcd->num_composite_clks, + base, mcd->clk_lock, clk_data); +if (r) + goto unregister_muxes; + } + +if (mcd->clks) { + r =mtk_clk_register_gates (&pdev->dev, node, mcd->clks, + mcd->num_clks, clk_data); +if (r) + goto unregister_composites; + } r =of_clk_add_hw_provider (node, of_clk_hw_onecell_get, clk_data);if (r)
@@ -481,9 +534,28 @@ int mtk_clk_simple_probe(struct platform_device *pdev)return r; unregister_clks: -mtk_clk_unregister_gates (mcd->clks, mcd->num_clks, clk_data); +if (mcd->clks) +mtk_clk_unregister_gates (mcd->clks, mcd->num_clks, clk_data); +unregister_composites: +if (mcd->composite_clks) +mtk_clk_unregister_composites (mcd->composite_clks, + mcd->num_composite_clks, clk_data); +unregister_muxes: +if (mcd->mux_clks) +mtk_clk_unregister_muxes (mcd->mux_clks, + mcd->num_mux_clks, clk_data); +unregister_factors: +if (mcd->factor_clks) +mtk_clk_unregister_factors (mcd->factor_clks, + mcd->num_factor_clks, clk_data); +unregister_fixed_clks: +if (mcd->fixed_clks) +mtk_clk_unregister_fixed_clks (mcd->fixed_clks, + mcd->num_fixed_clks, clk_data); free_data:mtk_free_clk_data (clk_data); +if (mcd->shared_io && base) +iounmap (base);return r; }EXPORT_SYMBOL_GPL (mtk_clk_simple_probe);
@@ -495,7 +567,20 @@ int mtk_clk_simple_remove(struct platform_device *pdev)struct device_node *node = pdev->dev.of_node;of_clk_del_provider (node); -mtk_clk_unregister_gates (mcd->clks, mcd->num_clks, clk_data); +if (mcd->clks) +mtk_clk_unregister_gates (mcd->clks, mcd->num_clks, clk_data); +if (mcd->composite_clks) +mtk_clk_unregister_composites (mcd->composite_clks, + mcd->num_composite_clks, clk_data); +if (mcd->mux_clks) +mtk_clk_unregister_muxes (mcd->mux_clks, + mcd->num_mux_clks, clk_data); +if (mcd->factor_clks) +mtk_clk_unregister_factors (mcd->factor_clks, + mcd->num_factor_clks, clk_data); +if (mcd->fixed_clks) +mtk_clk_unregister_fixed_clks (mcd->fixed_clks, + mcd->num_fixed_clks, clk_data);mtk_free_clk_data (clk_data);return 0 ;
drivers/clk/mediatek/clk-mtk.h +10 -0
@@ -196,7 +196,17 @@ void mtk_clk_unregister_ref2usb_tx(struct clk_hw *hw);struct mtk_clk_desc {const struct mtk_gate *clks;size_t num_clks; +const struct mtk_composite *composite_clks; +size_t num_composite_clks; +const struct mtk_fixed_clk *fixed_clks; +size_t num_fixed_clks; +const struct mtk_fixed_factor *factor_clks; +size_t num_factor_clks; +const struct mtk_mux *mux_clks; +size_t num_mux_clks;const struct mtk_clk_rst_desc *rst_desc; +spinlock_t *clk_lock; +bool shared_io; };int mtk_clk_simple_probe (struct platform_device *pdev);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 96/141 clk: mediatek: Do a runtime PM get on controllers during probe
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pin-yen Lin <[email protected]>
[ Upstream commit 2f7b1d8b5505efb0057cd1ab85fca206063ea4c3 ]
mt8183-mfgcfg has a mutual dependency with genpd during the probing stage, which leads to a deadlock in the following call stack:
CPU0: genpd_lock --> clk_prepare_lockgenpd_power_off_work_fn()
genpd_lock()
generic_pm_domain::power_off()
clk_unprepare()
clk_prepare_lock()
CPU1: clk_prepare_lock --> genpd_lockclk_register()
__clk_core_init()
clk_prepare_lock()
clk_pm_runtime_get()
genpd_lock()
Do a runtime PM get at the probe function to make sure clk_register() won't acquire the genpd lock. Instead of only modifying mt8183-mfgcfg, do this on all mediatek clock controller probings because we don't believe this would cause any regression.
Verified on MT8183 and MT8192 Chromebooks.
--- drivers/clk/mediatek/clk-mtk.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+)
drivers/clk/mediatek/clk-mtk.c +15 -0
@@ -14,6 +14,7 @@#include <linux/of_address.h> #include <linux/of_device.h> #include <linux/platform_device.h> +#include <linux/pm_runtime.h> #include <linux/slab.h> #include "clk-mtk.h"
@@ -470,6 +471,16 @@ int mtk_clk_simple_probe(struct platform_device *pdev)return IS_ERR (base) ?PTR_ERR (base) : -ENOMEM ; } + +devm_pm_runtime_enable (&pdev->dev); +/* +* Do a pm_runtime_resume_and_get() to workaround a possible +* deadlock between clk_register() and the genpd framework. +*/ + r =pm_runtime_resume_and_get (&pdev->dev); +if (r) +return r; +/* Calculate how many clk_hw_onecell_data entries to allocate */ num_clks = mcd->num_clks + mcd->num_composite_clks; num_clks += mcd->num_fixed_clks + mcd->num_factor_clks;
@@ -531,6 +542,8 @@ int mtk_clk_simple_probe(struct platform_device *pdev) goto unregister_clks; } +pm_runtime_put (&pdev->dev); +return r; unregister_clks:
@@ -556,6 +569,8 @@ int mtk_clk_simple_probe(struct platform_device *pdev)mtk_free_clk_data (clk_data);if (mcd->shared_io && base)iounmap (base); + +pm_runtime_put (&pdev->dev);return r; }EXPORT_SYMBOL_GPL (mtk_clk_simple_probe);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 97/141 x86/bugs: Fix BHI retpoline check
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Josh Poimboeuf <[email protected]>
[ Upstream commit 69129794d94c544810e68b2b4eaa7e44063f9bf2 ]
Confusingly, X86_FEATURE_RETPOLINE doesn't mean retpolines are enabled, as it also includes the original "AMD retpoline" which isn't a retpoline at all.
Also replace cpu_feature_enabled() with boot_cpu_has() because this is before alternatives are patched and cpu_feature_enabled()'s fallback path is slower than plain old boot_cpu_has().
--- arch/x86/kernel/cpu/bugs.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-)
arch/x86/kernel/cpu/bugs.c +7 -4
@@ -1629,7 +1629,8 @@ static void __init bhi_select_mitigation(void)return ;/* Retpoline mitigates against BHI unless the CPU has RRSBA behavior */ -if (cpu_feature_enabled (X86_FEATURE_RETPOLINE )) { +if (boot_cpu_has (X86_FEATURE_RETPOLINE ) && + !boot_cpu_has (X86_FEATURE_RETPOLINE_LFENCE )) {spec_ctrl_disable_kernel_rrsba ();if (rrsba_disabled)return ;
@@ -2783,11 +2784,13 @@ static const char *spectre_bhi_state(void) {if (!boot_cpu_has_bug (X86_BUG_BHI ))return "; BHI: Not affected" ; -else if (boot_cpu_has (X86_FEATURE_CLEAR_BHB_HW )) +else if (boot_cpu_has (X86_FEATURE_CLEAR_BHB_HW ))return "; BHI: BHI_DIS_S" ; -else if (boot_cpu_has (X86_FEATURE_CLEAR_BHB_LOOP )) +else if (boot_cpu_has (X86_FEATURE_CLEAR_BHB_LOOP ))return "; BHI: SW loop, KVM: SW loop" ; -else if (boot_cpu_has (X86_FEATURE_RETPOLINE ) && rrsba_disabled) +else if (boot_cpu_has (X86_FEATURE_RETPOLINE ) && + !boot_cpu_has (X86_FEATURE_RETPOLINE_LFENCE ) && + rrsba_disabled)return "; BHI: Retpoline" ;else if (boot_cpu_has (X86_FEATURE_CLEAR_BHB_LOOP_ON_VMEXIT ))return "; BHI: Vulnerable, KVM: SW loop" ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 98/141 x86/cpufeatures: Fix dependencies for GFNI, VAES, and VPCLMULQDQ
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Biggers <[email protected]>
[ Upstream commit 9543f6e26634537997b6e909c20911b7bf4876de ]
Fix cpuid_deps[] to list the correct dependencies for GFNI, VAES, and VPCLMULQDQ. These features don't depend on AVX512, and there exist CPUs that support these features but not AVX512. GFNI actually doesn't even depend on AVX.
This prevents GFNI from being unnecessarily disabled if AVX is disabled to mitigate the GDS vulnerability.
This also prevents all three features from being unnecessarily disabled if AVX512VL (or its dependency AVX512F) were to be disabled, but it looks like there isn't any case where this happens anyway.
--- arch/x86/kernel/cpu/cpuid-deps.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
arch/x86/kernel/cpu/cpuid-deps.c +3 -3
@@ -44,7 +44,10 @@ static const struct cpuid_dep cpuid_deps[] = { { X86_FEATURE_F16C, X86_FEATURE_XMM2, }, { X86_FEATURE_AES, X86_FEATURE_XMM2 }, { X86_FEATURE_SHA_NI, X86_FEATURE_XMM2 }, + { X86_FEATURE_GFNI, X86_FEATURE_XMM2 }, { X86_FEATURE_FMA, X86_FEATURE_AVX }, + { X86_FEATURE_VAES, X86_FEATURE_AVX }, + { X86_FEATURE_VPCLMULQDQ, X86_FEATURE_AVX }, { X86_FEATURE_AVX2, X86_FEATURE_AVX, }, { X86_FEATURE_AVX512F, X86_FEATURE_AVX, }, { X86_FEATURE_AVX512IFMA, X86_FEATURE_AVX512F },
@@ -56,9 +59,6 @@ static const struct cpuid_dep cpuid_deps[] = { { X86_FEATURE_AVX512VL, X86_FEATURE_AVX512F }, { X86_FEATURE_AVX512VBMI, X86_FEATURE_AVX512F }, { X86_FEATURE_AVX512_VBMI2, X86_FEATURE_AVX512VL }, - { X86_FEATURE_GFNI, X86_FEATURE_AVX512VL }, - { X86_FEATURE_VAES, X86_FEATURE_AVX512VL }, - { X86_FEATURE_VPCLMULQDQ, X86_FEATURE_AVX512VL }, { X86_FEATURE_AVX512_VNNI, X86_FEATURE_AVX512VL }, { X86_FEATURE_AVX512_BITALG, X86_FEATURE_AVX512VL }, { X86_FEATURE_AVX512_4VNNIW, X86_FEATURE_AVX512F },
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 99/141 ALSA: hda/realtek - Enable audio jacks of Haier Boyue G42 with ALC269VC
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ai Chao <[email protected]>
commit 7ee5faad0f8c3ad86c8cfc2f6aac91d2ba29790f upstream.
The Haier Boyue G42 with ALC269VC cannot detect the MIC of headset, the line out and internal speaker until ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS quirk applied.
Message-ID: <[email protected]>
--- sound/pci/hda/patch_realtek.c | 1 + 1 file changed, 1 insertion(+)
sound/pci/hda/patch_realtek.c +1 -0
@@ -10122,6 +10122,7 @@ static const struct snd_pci_quirk alc269SND_PCI_QUIRK (0x1d05 ,0x115c ,"TongFang GMxTGxx" ,ALC269_FIXUP_NO_SHUTUP ),SND_PCI_QUIRK (0x1d05 ,0x121b ,"TongFang GMxAGxx" ,ALC269_FIXUP_NO_SHUTUP ),SND_PCI_QUIRK (0x1d05 ,0x1387 ,"TongFang GMxIXxx" ,ALC2XX_FIXUP_HEADSET_MIC ), +SND_PCI_QUIRK (0x1d17 ,0x3288 ,"Haier Boyue G42" ,ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS ),SND_PCI_QUIRK (0x1d72 ,0x1602 ,"RedmiBook" ,ALC255_FIXUP_XIAOMI_HEADSET_MIC ),SND_PCI_QUIRK (0x1d72 ,0x1701 ,"XiaomiNotebook Pro" ,ALC298_FIXUP_DELL1_MIC_NO_PRESENCE ), SND_PCI_QUIRK(0x1d72, 0x1901, "RedmiBook 14", ALC256_FIXUP_ASUS_HEADSET_MIC),
Greg Kroah-Hartman
maintainerPATCH 100/141 binder: check offset alignment in binder_get_object()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Carlos Llamas <[email protected]>
commit aaef73821a3b0194a01bd23ca77774f704a04d40 upstream.
Commit 6d98eb95b450 ("binder: avoid potential data leakage when copying txn") introduced changes to how binder objects are copied. In doing so, it unintentionally removed an offset alignment check done through calls to binder_alloc_copy_from_buffer() -> check_buffer().
These calls were replaced in binder_get_object() with copy_from_user(), so now an explicit offset alignment check is needed here. This avoids later complications when unwinding the objects gets harder.
It is worth noting this check existed prior to commit 7a67a39320df ("binder: add function to copy binder object from buffer"), likely removed due to redundancy at the time.
--- drivers/android/binder.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/android/binder.c +3 -1
@@ -1707,8 +1707,10 @@ static size_t binder_get_object(struct bsize_t object_size =0 ; read_size =min_t (size_t,sizeof (*object), buffer->data_size - offset); -if (offset > buffer->data_size || read_size <sizeof (*hdr)) +if (offset > buffer->data_size || read_size <sizeof (*hdr) || + !IS_ALIGNED (offset,sizeof (u32)))return 0 ; +if (u) {if (copy_from_user (object, u + offset, read_size))return 0 ;
Greg Kroah-Hartman
maintainerPATCH 101/141 thunderbolt: Avoid notify PM core about runtime PM resume
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gil Fine <[email protected]>
commit dcd12acaf384c30437fa5a9a1f71df06fc9835fd upstream.
Currently we notify PM core about occurred wakes after any resume. This is not actually needed after resume from runtime suspend. Hence, notify PM core about occurred wakes only after resume from system sleep. Also, if the wake occurred in USB4 router upstream port, we don't notify the PM core about it since it is not actually needed and can cause unexpected autowake (e.g. if /sys/power/wakeup_count is used).
While there add the missing kernel-doc for tb_switch_resume().
--- drivers/thunderbolt/switch.c | 27 +++++++++++++++++++++++++-- drivers/thunderbolt/tb.c | 4 ++-- drivers/thunderbolt/tb.h | 3 ++- drivers/thunderbolt/usb4.c | 13 +++++++------ 4 files changed, 36 insertions(+), 11 deletions(-)
drivers/thunderbolt/switch.c +25 -2
@@ -3135,7 +3135,26 @@ static int tb_switch_set_wake(struct tb_return tb_lc_set_wake (sw, flags); } -int tb_switch_resume (struct tb_switch *sw) +static void tb_switch_check_wakes (struct tb_switch *sw) +{ +if (device_may_wakeup (&sw->dev)) { +if (tb_switch_is_usb4 (sw)) +usb4_switch_check_wakes (sw); + } +} + +/** +* tb_switch_resume() - Resume a switch after sleep +* @sw: Switch to resume +* @runtime: Is this resume from runtime suspend or system sleep +* +* Resumes and re-enumerates router (and all its children), if still plugged +* after suspend. Don't enumerate device router whose UID was changed during +* suspend. If this is resume from system sleep, notifies PM core about the +* wakes occurred during suspend. Disables all wakes, except USB4 wake of +* upstream port for USB4 routers that shall be always enabled. +*/ +int tb_switch_resume (struct tb_switch *sw,bool runtime) {struct tb_port *port;int err;
@@ -3184,6 +3203,9 @@ int tb_switch_resume(struct tb_switch *sif (err)return err; +if (!runtime) +tb_switch_check_wakes (sw); +/* Disable wakes */ tb_switch_set_wake (sw,0 );
@@ -3213,7 +3235,8 @@ int tb_switch_resume(struct tb_switch *s*/ if (tb_port_unlock (port))tb_port_warn (port,"failed to unlock port\n" ); -if (port->remote &&tb_switch_resume (port->remote->sw)) { +if (port->remote && +tb_switch_resume (port->remote->sw, runtime)) {tb_port_warn (port,"lost during suspend, disconnecting\n" );tb_sw_set_unplugged (port->remote->sw);
drivers/thunderbolt/tb.c +2 -2
@@ -1628,7 +1628,7 @@ static int tb_resume_noirq(struct tb *tb/* remove any pci devices the firmware might have setup */ tb_switch_reset (tb->root_switch); -tb_switch_resume (tb->root_switch); +tb_switch_resume (tb->root_switch, false);tb_free_invalid_tunnels (tb);tb_free_unplugged_children (tb->root_switch);tb_restore_children (tb->root_switch);
@@ -1754,7 +1754,7 @@ static int tb_runtime_resume(struct tb *struct tb_tunnel *tunnel, *n;mutex_lock (&tb->lock); -tb_switch_resume (tb->root_switch); +tb_switch_resume (tb->root_switch, true);tb_free_invalid_tunnels (tb);tb_restore_children (tb->root_switch);list_for_each_entry_safe (tunnel, n, &tcm->tunnel_list, list)
drivers/thunderbolt/tb.h +2 -1
@@ -787,7 +787,7 @@ int tb_switch_configure(struct tb_switchint tb_switch_add (struct tb_switch *sw);void tb_switch_remove (struct tb_switch *sw);void tb_switch_suspend (struct tb_switch *sw,bool runtime); -int tb_switch_resume (struct tb_switch *sw); +int tb_switch_resume (struct tb_switch *sw,bool runtime);int tb_switch_reset (struct tb_switch *sw);int tb_switch_wait_for_bit (struct tb_switch *sw,u32 offset,u32 bit,u32 value,int timeout_msec);
@@ -1182,6 +1182,7 @@ static inline struct tb_retimer *tb_to_rreturn NULL ; } +void usb4_switch_check_wakes (struct tb_switch *sw);int usb4_switch_setup (struct tb_switch *sw);int usb4_switch_read_uid (struct tb_switch *sw,u64 *uid); int usb4_switch_drom_read(struct tb_switch *sw, unsigned int address, void *buf,
drivers/thunderbolt/usb4.c +7 -6
@@ -153,15 +153,18 @@ static inline int usb4_switch_op_data(st tx_dwords, rx_data, rx_dwords); } -static void usb4_switch_check_wakes (struct tb_switch *sw) +/** +* usb4_switch_check_wakes() - Check for wakes and notify PM core about them +* @sw: Router whose wakes to check +* +* Checks wakes occurred during suspend and notify the PM core about them. +*/ +void usb4_switch_check_wakes (struct tb_switch *sw) {struct tb_port *port;bool wakeup = false;u32 val; -if (!device_may_wakeup (&sw->dev)) -return ; -if (tb_route (sw)) {if (tb_sw_read (sw, &val,TB_CFG_SWITCH ,ROUTER_CS_6 ,1 ))return ;
@@ -226,8 +229,6 @@ int usb4_switch_setup(struct tb_switch *u32 val =0 ;int ret; -usb4_switch_check_wakes (sw); -if (!tb_route (sw))return 0 ;
Greg Kroah-Hartman
maintainerPATCH 102/141 thunderbolt: Fix wake configurations after device unplug
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gil Fine <[email protected]>
commit c38fa07dc69f0b9e6f43ecab96dc7861a70c827c upstream.
Currently we don't configure correctly the wake events after unplug of device router. What can happen is that the downstream ports of host router will be configured to wake on: USB4-wake and wake-on-disconnect, but not on wake-on-connect. This may cause the later plugged device not to wake the domain and fail in enumeration. Fix this by clearing downstream port's "USB4 Port is Configured" bit, after unplug of a device router.
--- drivers/thunderbolt/switch.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-)
drivers/thunderbolt/switch.c +14 -7
@@ -2880,22 +2880,29 @@ void tb_switch_unconfigure_link(struct t {struct tb_port *up, *down; -if (sw->is_unplugged) -return ;if (!tb_route (sw) ||tb_switch_is_icm (sw))return ; +/* +* Unconfigure downstream port so that wake-on-connect can be +* configured after router unplug. No need to unconfigure upstream port +* since its router is unplugged. +*/ up =tb_upstream_port (sw); -if (tb_switch_is_usb4 (up->sw)) -usb4_port_unconfigure (up); -else -tb_lc_unconfigure_port (up); - down = up->remote;if (tb_switch_is_usb4 (down->sw))usb4_port_unconfigure (down);else tb_lc_unconfigure_port (down); + +if (sw->is_unplugged) +return ; + + up =tb_upstream_port (sw); +if (tb_switch_is_usb4 (up->sw)) +usb4_port_unconfigure (up); +else +tb_lc_unconfigure_port (up); }static void tb_switch_credits_init (struct tb_switch *sw)
Greg Kroah-Hartman
maintainerPATCH 103/141 comedi: vmk80xx: fix incomplete endpoint checking
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nikita Zhandarovich <[email protected]>
commit d1718530e3f640b7d5f0050e725216eab57a85d8 upstream.
While vmk80xx does have endpoint checking implemented, some things can fall through the cracks. Depending on the hardware model, URBs can have either bulk or interrupt type, and current version of vmk80xx_find_usb_endpoints() function does not take that fully into account. While this warning does not seem to be too harmful, at the very least it will crash systems with 'panic_on_warn' set on them.
Fix the issue found by Syzkaller [1] by somewhat simplifying the endpoint checking process with usb_find_common_endpoints() and ensuring that only expected endpoint types are present.
This patch has not been tested on real hardware.
[1] Syzkaller report:
usb 1-1: BOGUS urb xfer, pipe 1 != type 3
WARNING: CPU: 0 PID: 781 at drivers/usb/core/urb.c:504 usb_submit_urb+0xc4e/0x18c0 drivers/usb/core/urb.c:503 ... Call Trace: <TASK> usb_start_wait_urb+0x113/0x520 drivers/usb/core/message.c:59 vmk80xx_reset_device drivers/comedi/drivers/vmk80xx.c:227 [inline] vmk80xx_auto_attach+0xa1c/0x1a40 drivers/comedi/drivers/vmk80xx.c:818 comedi_auto_config+0x238/0x380 drivers/comedi/drivers.c:1067 usb_probe_interface+0x5cd/0xb00 drivers/usb/core/driver.c:399
...
Similar issue also found by Syzkaller:
--- drivers/comedi/drivers/vmk80xx.c | 35 ++++++++++++----------------------- 1 file changed, 12 insertions(+), 23 deletions(-)
drivers/comedi/drivers/vmk80xx.c +12 -23
@@ -641,33 +641,22 @@ static int vmk80xx_find_usb_endpoints(ststruct vmk80xx_private *devpriv = dev->private;struct usb_interface *intf =comedi_to_usb_interface (dev);struct usb_host_interface *iface_desc = intf->cur_altsetting; -struct usb_endpoint_descriptor *ep_desc; -int i; +struct usb_endpoint_descriptor *ep_rx_desc, *ep_tx_desc; +int ret; -if (iface_desc->desc.bNumEndpoints !=2 ) -return -ENODEV ; - -for (i =0 ; i < iface_desc->desc.bNumEndpoints; i++) { - ep_desc = &iface_desc->endpoint[i].desc; - -if (usb_endpoint_is_int_in (ep_desc) || -usb_endpoint_is_bulk_in (ep_desc)) { -if (!devpriv->ep_rx) - devpriv->ep_rx = ep_desc; -continue ; - } +if (devpriv->model ==VMK8061_MODEL ) + ret =usb_find_common_endpoints (iface_desc, &ep_rx_desc, + &ep_tx_desc,NULL ,NULL ); +else + ret =usb_find_common_endpoints (iface_desc,NULL ,NULL , + &ep_rx_desc, &ep_tx_desc); -if (usb_endpoint_is_int_out (ep_desc) || -usb_endpoint_is_bulk_out (ep_desc)) { -if (!devpriv->ep_tx) - devpriv->ep_tx = ep_desc; -continue ; - } - } - -if (!devpriv->ep_rx || !devpriv->ep_tx) +if (ret)return -ENODEV ; + devpriv->ep_rx = ep_rx_desc; + devpriv->ep_tx = ep_tx_desc; +if (!usb_endpoint_maxp (devpriv->ep_rx) || !usb_endpoint_maxp (devpriv->ep_tx))return -EINVAL ;
Greg Kroah-Hartman
maintainerPATCH 104/141 serial: mxs-auart: add spinlock around changing cts state
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Emil Kronborg <[email protected]>
commit 54c4ec5f8c471b7c1137a1f769648549c423c026 upstream.
The uart_handle_cts_change() function in serial_core expects the caller to hold uport->lock. For example, I have seen the below kernel splat, when the Bluetooth driver is loaded on an i.MX28 board.
[ 85.119255] ------------[ cut here ]------------
[ 85.124413] WARNING: CPU: 0 PID: 27 at /drivers/tty/serial/serial_core.c:3453 uart_handle_cts_change+0xb4/0xec
[ 85.134694] Modules linked in: hci_uart bluetooth ecdh_generic ecc wlcore_sdio configfs
[ 85.143314] CPU: 0 PID: 27 Comm: kworker/u3:0 Not tainted 6.6.3-00021-gd62a2f068f92 #1
[ 85.151396] Hardware name: Freescale MXS (Device Tree)
[ 85.156679] Workqueue: hci0 hci_power_on [bluetooth]
(...)
[ 85.191765] uart_handle_cts_change from mxs_auart_irq_handle+0x380/0x3f4
[ 85.198787] mxs_auart_irq_handle from __handle_irq_event_percpu+0x88/0x210
(...)--- drivers/tty/serial/mxs-auart.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
drivers/tty/serial/mxs-auart.c +6 -2
@@ -1094,11 +1094,13 @@ static void mxs_auart_set_ldisc(struct ustatic irqreturn_t mxs_auart_irq_handle (int irq,void *context) { -u32 istat; +u32 istat, stat;struct mxs_auart_port *s = context;u32 mctrl_temp = s->mctrl_prev; -u32 stat =mxs_read (s,REG_STAT ); +uart_port_lock (&s->port); + + stat =mxs_read (s,REG_STAT ); istat =mxs_read (s,REG_INTR );/* ack irq */
@@ -1134,6 +1136,8 @@ static irqreturn_t mxs_auart_irq_handle( istat &= ~AUART_INTR_TXIS ; } +uart_port_unlock (&s->port); +return IRQ_HANDLED ; }
Greg Kroah-Hartman
maintainerPATCH 105/141 serial/pmac_zilog: Remove flawed mitigation for rx irq flood
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Finn Thain <[email protected]>
commit 1be3226445362bfbf461c92a5bcdb1723f2e4907 upstream.
The mitigation was intended to stop the irq completely. That may be better than a hard lock-up but it turns out that you get a crash anyway if you're using pmac_zilog as a serial console:
ttyPZ0: pmz: rx irq flood !
BUG: spinlock recursion on CPU#0, swapper/0
That's because the pr_err() call in pmz_receive_chars() results in pmz_console_write() attempting to lock a spinlock already locked in pmz_interrupt(). With CONFIG_DEBUG_SPINLOCK=y, this produces a fatal BUG splat. The spinlock in question is the one in struct uart_port.
Even when it's not fatal, the serial port rx function ceases to work. Also, the iteration limit doesn't play nicely with QEMU, as can be seen in the bug report linked below.
A web search for other reports of the error message "pmz: rx irq flood" didn't produce anything. So I don't think this code is needed any more. Remove it.
--- drivers/tty/serial/pmac_zilog.c | 14 -------------- 1 file changed, 14 deletions(-)
drivers/tty/serial/pmac_zilog.c +0 -14
@@ -210,7 +210,6 @@ static bool pmz_receive_chars(struct uar {struct tty_port *port;unsigned char ch, r1, drop, flag; -int loops =0 ;/* Sanity check, make sure the old bug is no longer happening */ if (uap->port.state ==NULL ) {
@@ -291,25 +290,12 @@ static bool pmz_receive_chars(struct uarif (r1 & Rx_OVR)tty_insert_flip_char (port,0 ,TTY_OVERRUN ); next_char: -/* We can get stuck in an infinite loop getting char 0 when the -* line is in a wrong HW state, we break that here. -* When that happens, I disable the receive side of the driver. -* Note that what I've been experiencing is a real irq loop where -* I'm getting flooded regardless of the actual port speed. -* Something strange is going on with the HW -*/ -if ((++loops) >1000 ) - goto flood; ch =read_zsreg (uap,R0 );if (!(ch & Rx_CH_AV))break ; }return true; - flood: -pmz_interrupt_control (uap,0 ); -pmz_error ("pmz: rx irq flood !\n" ); -return true; }static void pmz_status_handle (struct uart_pmac_port *uap)
Greg Kroah-Hartman
maintainerPATCH 106/141 serial: stm32: Return IRQ_NONE in the ISR if no handling happend
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Uwe Kleine-König <[email protected]>
commit 13c785323b36b845300b256d0e5963c3727667d7 upstream.
If there is a stuck irq that the handler doesn't address, returning IRQ_HANDLED unconditionally makes it impossible for the irq core to detect the problem and disable the irq. So only return IRQ_HANDLED if an event was handled.
A stuck irq is still problematic, but with this change at least it only makes the UART nonfunctional instead of occupying the (usually only) CPU by 100% and so stall the whole machine.
--- drivers/tty/serial/stm32-usart.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-)
drivers/tty/serial/stm32-usart.c +10 -2
@@ -755,6 +755,7 @@ static irqreturn_t stm32_usart_interruptconst struct stm32_usart_offsets *ofs = &stm32_port->info->ofs;u32 sr;unsigned int size; +irqreturn_t ret =IRQ_NONE ; sr =readl_relaxed (port->membase + ofs->isr);
@@ -763,11 +764,14 @@ static irqreturn_t stm32_usart_interrupt (sr & USART_SR_TC)) {stm32_usart_tc_interrupt_disable (port);stm32_usart_rs485_rts_disable (port); + ret =IRQ_HANDLED ; } -if ((sr &USART_SR_RTOF ) && ofs->icr !=UNDEF_REG ) +if ((sr &USART_SR_RTOF ) && ofs->icr !=UNDEF_REG ) {writel_relaxed (USART_ICR_RTOCF , port->membase + ofs->icr); + ret =IRQ_HANDLED ; + }if ((sr &USART_SR_WUF ) && ofs->icr !=UNDEF_REG ) {/* Clear wake up flag and disable wake up interrupt */
@@ -776,6 +780,7 @@ static irqreturn_t stm32_usart_interruptstm32_usart_clr_bits (port, ofs->cr3,USART_CR3_WUFIE );if (irqd_is_wakeup_set (irq_get_irq_data (port->irq)))pm_wakeup_event (tport->tty->dev,0 ); + ret =IRQ_HANDLED ; }/*
@@ -790,6 +795,7 @@ static irqreturn_t stm32_usart_interruptuart_unlock_and_check_sysrq (port);if (size)tty_flip_buffer_push (tport); + ret =IRQ_HANDLED ; } }
@@ -797,6 +803,7 @@ static irqreturn_t stm32_usart_interruptspin_lock (&port->lock);stm32_usart_transmit_chars (port);spin_unlock (&port->lock); + ret =IRQ_HANDLED ; }/* Receiver timeout irq for DMA RX */
@@ -806,9 +813,10 @@ static irqreturn_t stm32_usart_interruptuart_unlock_and_check_sysrq (port);if (size)tty_flip_buffer_push (tport); + ret =IRQ_HANDLED ; } -return IRQ_HANDLED ; +return ret; }static void stm32_usart_set_mctrl (struct uart_port *port,unsigned int mctrl)
Greg Kroah-Hartman
maintainerPATCH 107/141 serial: stm32: Reset .throttled state in .startup()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Uwe Kleine-König <[email protected]>
commit ea2624b5b829b8f93c0dce25721d835969b34faf upstream.
When an UART is opened that still has .throttled set from a previous open, the RX interrupt is enabled but the irq handler doesn't consider it. This easily results in a stuck irq with the effect to occupy the CPU in a tight loop.
So reset the throttle state in .startup() to ensure that RX irqs are handled.
--- drivers/tty/serial/stm32-usart.c | 1 + 1 file changed, 1 insertion(+)
drivers/tty/serial/stm32-usart.c +1 -0
@@ -1021,6 +1021,7 @@ static int stm32_usart_startup(struct ua val |=USART_CR2_SWAP ;writel_relaxed (val, port->membase + ofs->cr2); } + stm32_port->throttled = false;/* RX FIFO Flush */ if (ofs->rqr !=UNDEF_REG )
Greg Kroah-Hartman
maintainerPATCH 108/141 USB: serial: option: add Fibocom FM135-GL variants
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: bolan wang <[email protected]>
commit 356952b13af5b2c338df1e06889fd1b5e12cbbf4 upstream.
Update the USB serial option driver support for the Fibocom FM135-GL LTE modules.
- VID:PID 2cb7:0115, FM135-GL for laptop debug M.2 cards(with MBIM interface for /Linux/Chrome OS)
0x0115: mbim, diag, at, pipe
Here are the outputs of usb-devices:
T: Bus=01 Lev=01 Prnt=01 Port=02 Cnt=01 Dev#= 16 Spd=480 MxCh= 0 D: Ver= 2.01 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs= 1 P: Vendor=2cb7 ProdID=0115 Rev=05.15 S: Manufacturer=Fibocom Wireless Inc. S: Product=Fibocom Module S: SerialNumber=12345678 C: #Ifs= 6 Cfg#= 1 Atr=a0 MxPwr=500mA I: If#= 0 Alt= 0 #EPs= 1 Cls=02(commc) Sub=0e Prot=00 Driver=cdc_mbim E: Ad=82(I) Atr=03(Int.) MxPS= 64 Ivl=32ms I: If#= 1 Alt= 1 #EPs= 2 Cls=0a(data ) Sub=00 Prot=02 Driver=cdc_mbim E: Ad=01(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms E: Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms I: If#= 2 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=30 Driver=option E: Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms E: Ad=83(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms I: If#= 3 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=40 Driver=option E: Ad=03(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms E: Ad=84(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms E: Ad=85(I) Atr=03(Int.) MxPS= 10 Ivl=32ms I: If#= 4 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=00 Prot=00 Driver=option E: Ad=04(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms E: Ad=86(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms I: If#= 5 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=42 Prot=01 Driver=usbfs E: Ad=05(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms E: Ad=87(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
--- drivers/usb/serial/option.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/usb/serial/option.c +2 -0
@@ -2272,6 +2272,8 @@ static const struct usb_device_id option { USB_DEVICE_AND_INTERFACE_INFO(0x2cb7, 0x010b, 0xff, 0xff, 0x30) }, /* Fibocom FG150 Diag */ { USB_DEVICE_AND_INTERFACE_INFO(0x2cb7, 0x010b, 0xff, 0, 0) }, /* Fibocom FG150 AT */ { USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x0111, 0xff) }, /* Fibocom FM160 (MBIM mode) */ + { USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x0115, 0xff), /* Fibocom FM135 (laptop MBIM) */ + .driver_info = RSVD(5) }, { USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x01a0, 0xff) }, /* Fibocom NL668-AM/NL652-EU (laptop MBIM) */ { USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x01a2, 0xff) }, /* Fibocom FM101-GL (laptop MBIM) */ { USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x01a3, 0xff) }, /* Fibocom FM101-GL (laptop MBIM) */
Greg Kroah-Hartman
maintainerPATCH 109/141 USB: serial: option: add support for Fibocom FM650/FG650
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chuanhong Guo <[email protected]>
commit fb1f4584b1215e8c209f6b3a4028ed8351a0e961 upstream.
Fibocom FM650/FG650 are 5G modems with ECM/NCM/RNDIS/MBIM modes. This patch adds support to all 4 modes.
In all 4 modes, the first serial port is the AT console while the other 3 appear to be diagnostic interfaces for dumping modem logs.
usb-devices output for all modes:
ECM:
T: Bus=04 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 5 Spd=5000 MxCh= 0 D: Ver= 3.10 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 9 #Cfgs= 1 P: Vendor=2cb7 ProdID=0a04 Rev=04.04 S: Manufacturer=Fibocom Wireless Inc. S: Product=FG650 Module S: SerialNumber=0123456789ABCDEF C: #Ifs= 5 Cfg#= 1 Atr=c0 MxPwr=504mA I: If#= 0 Alt= 0 #EPs= 1 Cls=02(commc) Sub=06 Prot=00 Driver=cdc_ether E: Ad=82(I) Atr=03(Int.) MxPS= 16 Ivl=32ms I: If#= 1 Alt= 1 #EPs= 2 Cls=0a(data ) Sub=00 Prot=00 Driver=cdc_ether E: Ad=01(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms E: Ad=81(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms I: If#= 2 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=00 Prot=00 Driver=option E: Ad=02(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms E: Ad=83(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms I: If#= 3 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=00 Prot=00 Driver=option E: Ad=03(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms E: Ad=84(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms I: If#= 4 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=00 Prot=00 Driver=option E: Ad=04(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms E: Ad=85(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms
NCM:
T: Bus=04 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 6 Spd=5000 MxCh= 0 D: Ver= 3.10 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 9 #Cfgs= 1 P: Vendor=2cb7 ProdID=0a05 Rev=04.04 S: Manufacturer=Fibocom Wireless Inc. S: Product=FG650 Module S: SerialNumber=0123456789ABCDEF C: #Ifs= 6 Cfg#= 1 Atr=c0 MxPwr=504mA I: If#= 0 Alt= 0 #EPs= 1 Cls=02(commc) Sub=0d Prot=00 Driver=cdc_ncm E: Ad=82(I) Atr=03(Int.) MxPS= 16 Ivl=32ms I: If#= 1 Alt= 1 #EPs= 2 Cls=0a(data ) Sub=00 Prot=01 Driver=cdc_ncm E: Ad=01(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms E: Ad=81(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms I: If#= 2 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=00 Prot=00 Driver=option E: Ad=02(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms E: Ad=83(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms I: If#= 3 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=00 Prot=00 Driver=option E: Ad=03(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms E: Ad=84(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms I: If#= 4 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=00 Prot=00 Driver=option E: Ad=04(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms E: Ad=85(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms I: If#= 5 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=00 Prot=00 Driver=option E: Ad=05(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms E: Ad=86(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms
RNDIS:
T: Bus=04 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 4 Spd=5000 MxCh= 0 D: Ver= 3.10 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 9 #Cfgs= 1 P: Vendor=2cb7 ProdID=0a06 Rev=04.04 S: Manufacturer=Fibocom Wireless Inc. S: Product=FG650 Module S: SerialNumber=0123456789ABCDEF C: #Ifs= 6 Cfg#= 1 Atr=c0 MxPwr=504mA I: If#= 0 Alt= 0 #EPs= 1 Cls=e0(wlcon) Sub=01 Prot=03 Driver=rndis_host E: Ad=82(I) Atr=03(Int.) MxPS= 8 Ivl=32ms I: If#= 1 Alt= 0 #EPs= 2 Cls=0a(data ) Sub=00 Prot=00 Driver=rndis_host E: Ad=01(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms E: Ad=81(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms I: If#= 2 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=00 Prot=00 Driver=option E: Ad=02(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms E: Ad=83(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms I: If#= 3 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=00 Prot=00 Driver=option E: Ad=03(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms E: Ad=84(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms I: If#= 4 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=00 Prot=00 Driver=option E: Ad=04(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms E: Ad=85(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms I: If#= 5 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=00 Prot=00 Driver=option E: Ad=05(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms E: Ad=86(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms
MBIM:
T: Bus=04 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 7 Spd=5000 MxCh= 0 D: Ver= 3.10 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 9 #Cfgs= 1 P: Vendor=2cb7 ProdID=0a07 Rev=04.04 S: Manufacturer=Fibocom Wireless Inc. S: Product=FG650 Module S: SerialNumber=0123456789ABCDEF C: #Ifs= 6 Cfg#= 1 Atr=c0 MxPwr=504mA I: If#= 0 Alt= 0 #EPs= 1 Cls=02(commc) Sub=0e Prot=00 Driver=cdc_mbim E: Ad=82(I) Atr=03(Int.) MxPS= 64 Ivl=32ms I: If#= 1 Alt= 1 #EPs= 2 Cls=0a(data ) Sub=00 Prot=02 Driver=cdc_mbim E: Ad=01(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms E: Ad=81(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms I: If#= 2 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=00 Prot=00 Driver=option E: Ad=02(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms E: Ad=83(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms I: If#= 3 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=00 Prot=00 Driver=option E: Ad=03(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms E: Ad=84(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms I: If#= 4 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=00 Prot=00 Driver=option E: Ad=04(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms E: Ad=85(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms I: If#= 5 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=00 Prot=00 Driver=option E: Ad=05(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms E: Ad=86(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms
--- drivers/usb/serial/option.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/usb/serial/option.c +4 -0
@@ -2279,6 +2279,10 @@ static const struct usb_device_id option { USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x01a3, 0xff) }, /* Fibocom FM101-GL (laptop MBIM) */ { USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x01a4, 0xff), /* Fibocom FM101-GL (laptop MBIM) */ .driver_info = RSVD(4) }, + { USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x0a04, 0xff) }, /* Fibocom FM650-CN (ECM mode) */ + { USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x0a05, 0xff) }, /* Fibocom FM650-CN (NCM mode) */ + { USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x0a06, 0xff) }, /* Fibocom FM650-CN (RNDIS mode) */ + { USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x0a07, 0xff) }, /* Fibocom FM650-CN (MBIM mode) */ { USB_DEVICE_INTERFACE_CLASS(0x2df3, 0x9d03, 0xff) }, /* LongSung M5710 */ { USB_DEVICE_INTERFACE_CLASS(0x305a, 0x1404, 0xff) }, /* GosunCn GM500 RNDIS */ { USB_DEVICE_INTERFACE_CLASS(0x305a, 0x1405, 0xff) }, /* GosunCn GM500 MBIM */