Compare commits
4 Commits
06a5da3214
...
5205e81720
Author | SHA1 | Date | |
---|---|---|---|
5205e81720 | |||
8083f6cf32 | |||
b65c570ac2 | |||
3d597650a9 |
debian
bin
changelogconfig
copyrightlib/python/debian_linux
linux-perf.lintian-overrides.amd64linux-perf.postrmpatches
bugfix
all
disable-some-marvell-phys.patchdrm-amdkfd-Fix-user-queue-validation-on-Gfx7-8.patchfs-add-module_softdep-declarations-for-hard-coded-cr.patchkbuild-bpf-fix-btf-reproducibility.patchkbuild-fix-recordmcount-dependency.patchmodule-disable-matching-missing-version-crc.patchnfsd-fix-legacy-client-tracking-initialization.patchperf-docs-Fix-perf-check-manual-page-built-with-asci.patchperf-tools-pass-extra_cflags-through-to-libbpf-build-again.patchradeon-amdgpu-firmware-is-required-for-drm-and-kms-on-r600-onward.patchtools-perf-fix-missing-ldflags-for-some-programs.patch
x86
debian
add-sysctl-to-disallow-unprivileged-CLONE_NEWUSER-by-default.patchbtrfs-warn-about-raid5-6-being-experimental-at-mount.patchdccp-disable-auto-loading-as-mitigation-against-local-exploits.patch
dfsg
export-symbols-needed-by-android-drivers.patchfanotify-taint-on-use-of-fanotify_access_permissions.patchfs-enable-link-security-restrictions-by-default.patchkbuild-abort-build-if-subdirs-used.patchkbuild-look-for-module.lds-under-arch-directory-too.patchkernelvariables.patchlinux-perf-remove-remaining-source-filenames-from-executable.patchmakefile-make-compiler-version-comparison-optional.patchtools-perf-install-python-bindings.patchtools-perf-perf-read-vdso-in-libexec.patchyama-disable-by-default.patchfeatures
all
lockdown
arm64-add-kernel-config-option-to-lock-down-when.patchefi-add-an-efi_secure_boot-flag-to-indicate-secure-b.patchefi-lock-down-the-kernel-if-booted-in-secure-boot-mo.patchmtd-disable-slram-and-phram-when-locked-down.patch
security-perf-allow-further-restriction-of-perf_event_open.patchx86
krd
0001-Revert-objtool-dont-fail-the-kernel-build-on-fatal-errors.patch0003-local-ports.patch0004-bridge-group_fwd_mask.patch
misc-bbr3
misc-ntsync7
0001-ntsync-Return-the-fd-from-NTSYNC_IOC_CREATE_SEM.patch0002-ntsync-Rename-NTSYNC_IOC_SEM_POST-to-NTSYNC_IOC_SEM_.patch0003-ntsync-Introduce-NTSYNC_IOC_WAIT_ANY.patch0004-ntsync-Introduce-NTSYNC_IOC_WAIT_ALL.patch0005-ntsync-Introduce-NTSYNC_IOC_CREATE_MUTEX.patch0006-ntsync-Introduce-NTSYNC_IOC_MUTEX_UNLOCK.patch0007-ntsync-Introduce-NTSYNC_IOC_MUTEX_KILL.patch0008-ntsync-Introduce-NTSYNC_IOC_CREATE_EVENT.patch0009-ntsync-Introduce-NTSYNC_IOC_EVENT_SET.patch0010-ntsync-Introduce-NTSYNC_IOC_EVENT_RESET.patch0011-ntsync-Introduce-NTSYNC_IOC_EVENT_PULSE.patch0012-ntsync-Introduce-NTSYNC_IOC_SEM_READ.patch0013-ntsync-Introduce-NTSYNC_IOC_MUTEX_READ.patch0014-ntsync-Introduce-NTSYNC_IOC_EVENT_READ.patch0015-ntsync-Introduce-alertable-waits.patch0016-maintainers-Add-an-entry-for-ntsync.patch0017-docs-ntsync-Add-documentation-for-the-ntsync-uAPI.patch0018-ntsync-No-longer-depend-on-BROKEN.patch0019-ntsync-Set-the-permissions-to-be-0666.patch
misc-openwrt
mixed-arch
0001-ZEN-Add-graysky-s-more-ISA-levels-and-uarches.patch0002-ZEN-Restore-CONFIG_OPTIMIZE_FOR_PERFORMANCE_O3.patch0003-krd-adjust-CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE_O3.patch0004-XANMOD-x86-build-Prevent-generating-avx2-and-avx512-.patch0006-XANMOD-kbuild-Add-GCC-SMS-based-modulo-scheduling-fl.patch0007-PF-kbuild-6.12-adopt-proposed-upstream-change-for-gener.patch
patchset-pf/amd-pstate
0001-cpufreq-amd-pstate-Modify-the-min_perf-calculation-i.patch0002-cpufreq-amd-pstate-Remove-the-redundant-des_perf-cla.patch0003-cpufreq-amd-pstate-Pass-min-max_limit_perf-as-min-ma.patch0004-cpufreq-amd-pstate-Convert-all-perf-values-to-u8.patch0005-cpufreq-amd-pstate-Modularize-perf-freq-conversion.patch0006-cpufreq-amd-pstate-Remove-the-unnecessary-cpufreq_up.patch0007-cpufreq-amd-pstate-Add-missing-NULL-ptr-check-in-amd.patch0008-cpufreq-amd-pstate-Use-scope-based-cleanup-for-cpufr.patch0009-cpufreq-amd-pstate-Remove-the-unncecessary-driver_lo.patch0010-cpufreq-amd-pstate-Fix-the-clamping-of-perf-values.patch0011-cpufreq-amd-pstate-Invalidate-cppc_req_cached-during.patch0012-cpufreq-amd-pstate-Show-a-warning-when-a-CPU-fails-t.patch0013-cpufreq-amd-pstate-Drop-min-and-max-cached-frequenci.patch0014-cpufreq-amd-pstate-Move-perf-values-into-a-union.patch0015-cpufreq-amd-pstate-Overhaul-locking.patch0016-cpufreq-amd-pstate-Drop-cppc_cap1_cached.patch0017-cpufreq-amd-pstate-ut-Use-_free-macro-to-free-put-po.patch0018-cpufreq-amd-pstate-ut-Allow-lowest-nonlinear-and-low.patch
2
debian/bin/gencontrol.py
vendored
2
debian/bin/gencontrol.py
vendored
@ -349,7 +349,7 @@ class Gencontrol(Base):
|
||||
makeflags['KCONFIG_OPTIONS'] = ''
|
||||
# Add "salt" to fix #872263
|
||||
makeflags['KCONFIG_OPTIONS'] += \
|
||||
' -o "BUILD_SALT=\\"%(source_basename)s%(abiname)s%(localversion)s\\""' % vars
|
||||
' -o "BUILD_SALT=\\"krd-%(source_basename)s-%(abiname)s%(localversion)s\\""' % vars
|
||||
|
||||
merged_config = ('debian/build/config.%s_%s_%s' %
|
||||
(config.name_debianarch, config.name_featureset, config.name_flavour))
|
||||
|
2
debian/bin/genpatch-pfkernel
vendored
2
debian/bin/genpatch-pfkernel
vendored
@ -7,7 +7,7 @@ w=$(git rev-parse --path-format=absolute --show-toplevel) ; : "${w:?}" ; cd "$w"
|
||||
|
||||
dst='debian/patches/pf-tmp'
|
||||
src='../linux-extras'
|
||||
branches='btrfs cpuidle crypto fixes kbuild pksm xfs zstd'
|
||||
branches='amd-pstate cpuidle crypto fixes kbuild zstd'
|
||||
|
||||
if [ -d "${dst}" ] ; then rm -rf "${dst}" ; fi
|
||||
mkdir -p "${dst}"
|
||||
|
1
debian/bin/refine-configs
vendored
1
debian/bin/refine-configs
vendored
@ -52,6 +52,7 @@ done
|
||||
find debian/build/ -name 'config.*' -type f -exec \
|
||||
sed -i -E \
|
||||
-e '/CONFIG_BUILD_SALT/d' \
|
||||
-e '/CONFIG_MODULE_SIG_KEY( |=)/d' \
|
||||
-e '/CONFIG_(AS|CC|PAHOLE)_((CAN|HAS)_)/d' \
|
||||
-e '/CONFIG_(AS|BINDGEN|CC|CLANG|GCC|LD|LLD|PAHOLE|RUSTC)_VERSION/d' \
|
||||
-e '/CONFIG_RUSTC_LLVM_VERSION/d' \
|
||||
|
201
debian/changelog
vendored
201
debian/changelog
vendored
@ -1,198 +1,9 @@
|
||||
linux (6.12.20-1) sid; urgency=medium
|
||||
|
||||
* New upstream stable update:
|
||||
https://www.kernel.org/pub/linux/kernel/v6.x/ChangeLog-6.12.20
|
||||
|
||||
-- Konstantin Demin <rockdrilla@gmail.com> Sun, 23 Mar 2025 03:14:29 +0300
|
||||
|
||||
linux (6.12.19-1) sid; urgency=medium
|
||||
|
||||
* New upstream stable update:
|
||||
https://www.kernel.org/pub/linux/kernel/v6.x/ChangeLog-6.12.19
|
||||
|
||||
-- Konstantin Demin <rockdrilla@gmail.com> Thu, 13 Mar 2025 20:47:49 +0300
|
||||
|
||||
linux (6.12.18-1) sid; urgency=medium
|
||||
|
||||
* New upstream stable update:
|
||||
https://www.kernel.org/pub/linux/kernel/v6.x/ChangeLog-6.12.18
|
||||
|
||||
-- Konstantin Demin <rockdrilla@gmail.com> Sat, 08 Mar 2025 06:44:24 +0300
|
||||
|
||||
linux (6.12.17-1) sid; urgency=medium
|
||||
|
||||
* New upstream stable update:
|
||||
https://www.kernel.org/pub/linux/kernel/v6.x/ChangeLog-6.12.17
|
||||
|
||||
-- Konstantin Demin <rockdrilla@gmail.com> Thu, 27 Feb 2025 16:35:33 +0300
|
||||
|
||||
linux (6.12.16-1) sid; urgency=medium
|
||||
|
||||
* New upstream stable update:
|
||||
https://www.kernel.org/pub/linux/kernel/v6.x/ChangeLog-6.12.15
|
||||
https://www.kernel.org/pub/linux/kernel/v6.x/ChangeLog-6.12.16
|
||||
|
||||
-- Konstantin Demin <rockdrilla@gmail.com> Fri, 21 Feb 2025 17:46:41 +0300
|
||||
|
||||
linux (6.12.14-1) sid; urgency=medium
|
||||
|
||||
* New upstream stable update:
|
||||
https://www.kernel.org/pub/linux/kernel/v6.x/ChangeLog-6.12.14
|
||||
|
||||
-- Konstantin Demin <rockdrilla@gmail.com> Mon, 17 Feb 2025 17:43:08 +0300
|
||||
|
||||
linux (6.12.13-1) sid; urgency=medium
|
||||
|
||||
* New upstream stable update:
|
||||
https://www.kernel.org/pub/linux/kernel/v6.x/ChangeLog-6.12.13
|
||||
|
||||
-- Konstantin Demin <rockdrilla@gmail.com> Sun, 09 Feb 2025 19:34:35 +0300
|
||||
|
||||
linux (6.12.12-1) sid; urgency=medium
|
||||
|
||||
* New upstream stable update:
|
||||
https://www.kernel.org/pub/linux/kernel/v6.x/ChangeLog-6.12.12
|
||||
|
||||
-- Konstantin Demin <rockdrilla@gmail.com> Sun, 02 Feb 2025 13:07:44 +0300
|
||||
|
||||
linux (6.12.11-1) sid; urgency=medium
|
||||
|
||||
* New upstream stable update:
|
||||
https://www.kernel.org/pub/linux/kernel/v6.x/ChangeLog-6.12.11
|
||||
* Compress vmlinux with xz for all flavours.
|
||||
|
||||
-- Konstantin Demin <rockdrilla@gmail.com> Tue, 28 Jan 2025 09:10:17 +0300
|
||||
|
||||
linux (6.12.10-1) sid; urgency=medium
|
||||
|
||||
* New upstream stable update:
|
||||
https://www.kernel.org/pub/linux/kernel/v6.x/ChangeLog-6.12.10
|
||||
|
||||
-- Konstantin Demin <rockdrilla@gmail.com> Sat, 18 Jan 2025 01:39:50 +0300
|
||||
|
||||
linux (6.12.9-1) sid; urgency=medium
|
||||
|
||||
* New upstream stable update:
|
||||
https://www.kernel.org/pub/linux/kernel/v6.x/ChangeLog-6.12.9
|
||||
* Drop "pf/amd-pstate" and "pf/amd-rapl" patchsets.
|
||||
|
||||
-- Konstantin Demin <rockdrilla@gmail.com> Thu, 09 Jan 2025 23:12:22 +0300
|
||||
|
||||
linux (6.12.8-1) sid; urgency=medium
|
||||
|
||||
* New upstream stable update:
|
||||
https://www.kernel.org/pub/linux/kernel/v6.x/ChangeLog-6.12.8
|
||||
|
||||
-- Konstantin Demin <rockdrilla@gmail.com> Thu, 02 Jan 2025 19:34:34 +0300
|
||||
|
||||
linux (6.12.7-1) sid; urgency=medium
|
||||
|
||||
* New upstream stable update:
|
||||
https://www.kernel.org/pub/linux/kernel/v6.x/ChangeLog-6.12.7
|
||||
|
||||
-- Konstantin Demin <rockdrilla@gmail.com> Fri, 27 Dec 2024 16:28:43 +0300
|
||||
|
||||
linux (6.12.6-2) sid; urgency=medium
|
||||
|
||||
* Cherry-pick some patches.
|
||||
* Refine/adjust configs.
|
||||
|
||||
-- Konstantin Demin <rockdrilla@gmail.com> Fri, 27 Dec 2024 00:47:14 +0300
|
||||
|
||||
linux (6.12.6-1) sid; urgency=medium
|
||||
|
||||
* New upstream stable update:
|
||||
https://www.kernel.org/pub/linux/kernel/v6.x/ChangeLog-6.12.6
|
||||
|
||||
-- Konstantin Demin <rockdrilla@gmail.com> Thu, 19 Dec 2024 21:00:52 +0300
|
||||
|
||||
linux (6.12.5-1) sid; urgency=medium
|
||||
|
||||
* New upstream stable update:
|
||||
https://www.kernel.org/pub/linux/kernel/v6.x/ChangeLog-6.12.5
|
||||
|
||||
-- Konstantin Demin <rockdrilla@gmail.com> Mon, 16 Dec 2024 06:43:43 +0300
|
||||
|
||||
linux (6.12.4-1) sid; urgency=medium
|
||||
linux (6.14-1) sid; urgency=medium
|
||||
|
||||
* Sync with Debian.
|
||||
* New upstream release: https://kernelnewbies.org/Linux_6.12
|
||||
* New upstream stable update:
|
||||
https://www.kernel.org/pub/linux/kernel/v6.x/ChangeLog-6.12.1
|
||||
https://www.kernel.org/pub/linux/kernel/v6.x/ChangeLog-6.12.2
|
||||
https://www.kernel.org/pub/linux/kernel/v6.x/ChangeLog-6.12.3
|
||||
https://www.kernel.org/pub/linux/kernel/v6.x/ChangeLog-6.12.4
|
||||
* Refresh patches.
|
||||
* Refine configs.
|
||||
* New upstream release: https://kernelnewbies.org/Linux_6.13
|
||||
* New upstream release: https://kernelnewbies.org/Linux_6.14
|
||||
|
||||
-- Konstantin Demin <rockdrilla@gmail.com> Mon, 09 Dec 2024 22:08:34 +0300
|
||||
|
||||
linux (6.11.11-1) sid; urgency=medium
|
||||
|
||||
* New upstream stable update:
|
||||
https://www.kernel.org/pub/linux/kernel/v6.x/ChangeLog-6.11.11
|
||||
|
||||
-- Konstantin Demin <rockdrilla@gmail.com> Thu, 05 Dec 2024 18:41:08 +0300
|
||||
|
||||
linux (6.11.10-1) sid; urgency=medium
|
||||
|
||||
* New upstream stable update:
|
||||
https://www.kernel.org/pub/linux/kernel/v6.x/ChangeLog-6.11.10
|
||||
|
||||
-- Konstantin Demin <rockdrilla@gmail.com> Fri, 22 Nov 2024 19:59:35 +0300
|
||||
|
||||
linux (6.11.9-1) sid; urgency=medium
|
||||
|
||||
* New upstream stable update:
|
||||
https://www.kernel.org/pub/linux/kernel/v6.x/ChangeLog-6.11.9
|
||||
|
||||
-- Konstantin Demin <rockdrilla@gmail.com> Mon, 18 Nov 2024 00:21:44 +0300
|
||||
|
||||
linux (6.11.8-1) sid; urgency=medium
|
||||
|
||||
* New upstream stable update:
|
||||
https://www.kernel.org/pub/linux/kernel/v6.x/ChangeLog-6.11.8
|
||||
|
||||
-- Konstantin Demin <rockdrilla@gmail.com> Fri, 15 Nov 2024 10:17:08 +0300
|
||||
|
||||
linux (6.11.7-1) sid; urgency=medium
|
||||
|
||||
* New upstream stable update:
|
||||
https://www.kernel.org/pub/linux/kernel/v6.x/ChangeLog-6.11.7
|
||||
|
||||
-- Konstantin Demin <rockdrilla@gmail.com> Fri, 08 Nov 2024 22:31:17 +0300
|
||||
|
||||
linux (6.11.6-1) sid; urgency=medium
|
||||
|
||||
* New upstream stable update:
|
||||
https://www.kernel.org/pub/linux/kernel/v6.x/ChangeLog-6.11.6
|
||||
|
||||
-- Konstantin Demin <rockdrilla@gmail.com> Fri, 01 Nov 2024 10:54:09 +0300
|
||||
|
||||
linux (6.11.5-1) sid; urgency=medium
|
||||
|
||||
* New upstream stable update:
|
||||
https://www.kernel.org/pub/linux/kernel/v6.x/ChangeLog-6.11.5
|
||||
|
||||
[ Aurelien Jarno ]
|
||||
* Revert upstream commit causing data corrution (Closes: #1085425)
|
||||
- Revert "mmc: dw_mmc: Fix IDMAC operation with pages bigger than 4K"
|
||||
|
||||
[ Salvatore Bonaccorso ]
|
||||
* netfilter: xtables: fix typo causing some targets not to load on IPv6
|
||||
(Closes: #1085953)
|
||||
|
||||
[ Konstantin Demin ]
|
||||
* Initial package release.
|
||||
|
||||
-- Konstantin Demin <rockdrilla@gmail.com> Tue, 29 Oct 2024 05:14:58 +0300
|
||||
|
||||
linux (6.11.4-1) unstable; urgency=medium
|
||||
|
||||
* New upstream stable update:
|
||||
https://www.kernel.org/pub/linux/kernel/v6.x/ChangeLog-6.11.3
|
||||
https://www.kernel.org/pub/linux/kernel/v6.x/ChangeLog-6.11.4
|
||||
|
||||
[ Salvatore Bonaccorso ]
|
||||
* d/config: Update with the help of kconfigeditor2
|
||||
- mm: Enable Z3FOLD_DEPRECATED instead of Z3FOLD
|
||||
|
||||
-- Salvatore Bonaccorso <carnil@debian.org> Sun, 20 Oct 2024 20:51:13 +0200
|
||||
-- Konstantin Demin <rockdrilla@gmail.com> Thu, 27 Mar 2025 01:51:03 +0300
|
||||
|
56
debian/config/amd64/config.cloud
vendored
56
debian/config/amd64/config.cloud
vendored
@ -110,7 +110,6 @@ CONFIG_XEN_PV_MSR_SAFE=y
|
||||
## file: crypto/Kconfig
|
||||
##
|
||||
CONFIG_CRYPTO_ECDH=m
|
||||
CONFIG_CRYPTO_ECDSA=m
|
||||
CONFIG_CRYPTO_CTS=m
|
||||
CONFIG_CRYPTO_XTS=m
|
||||
CONFIG_CRYPTO_DEFLATE=m
|
||||
@ -353,6 +352,7 @@ CONFIG_CXL_BUS=y
|
||||
##
|
||||
## file: drivers/dma/amd/Kconfig
|
||||
##
|
||||
# CONFIG_AMD_PTDMA is not set
|
||||
# CONFIG_AMD_QDMA is not set
|
||||
|
||||
##
|
||||
@ -371,11 +371,6 @@ CONFIG_CXL_BUS=y
|
||||
##
|
||||
# CONFIG_INTEL_LDMA is not set
|
||||
|
||||
##
|
||||
## file: drivers/dma/ptdma/Kconfig
|
||||
##
|
||||
# CONFIG_AMD_PTDMA is not set
|
||||
|
||||
##
|
||||
## file: drivers/dma/qcom/Kconfig
|
||||
##
|
||||
@ -784,6 +779,7 @@ CONFIG_FUSION_FC=m
|
||||
##
|
||||
## file: drivers/mfd/Kconfig
|
||||
##
|
||||
# CONFIG_MFD_CGBC is not set
|
||||
# CONFIG_MFD_MADERA is not set
|
||||
# CONFIG_MFD_INTEL_LPSS_ACPI is not set
|
||||
# CONFIG_MFD_INTEL_LPSS_PCI is not set
|
||||
@ -796,6 +792,8 @@ CONFIG_FUSION_FC=m
|
||||
# CONFIG_MFD_TQMX86 is not set
|
||||
# CONFIG_MFD_VX855 is not set
|
||||
# CONFIG_RAVE_SP_CORE is not set
|
||||
# CONFIG_MFD_QNAP_MCU is not set
|
||||
# CONFIG_MFD_UPBOARD_FPGA is not set
|
||||
# CONFIG_MFD_STEAMDECK is not set
|
||||
|
||||
##
|
||||
@ -838,11 +836,6 @@ CONFIG_VMWARE_BALLOON=m
|
||||
##
|
||||
# CONFIG_EEPROM_93CX6 is not set
|
||||
|
||||
##
|
||||
## file: drivers/misc/keba/Kconfig
|
||||
##
|
||||
# CONFIG_KEBA_CP500 is not set
|
||||
|
||||
##
|
||||
## file: drivers/misc/mei/Kconfig
|
||||
##
|
||||
@ -1010,6 +1003,11 @@ CONFIG_BE2NET_SKYHAWK=y
|
||||
##
|
||||
# CONFIG_NET_VENDOR_FUNGIBLE is not set
|
||||
|
||||
##
|
||||
## file: drivers/net/ethernet/hisilicon/Kconfig
|
||||
##
|
||||
# CONFIG_NET_VENDOR_HISILICON is not set
|
||||
|
||||
##
|
||||
## file: drivers/net/ethernet/huawei/Kconfig
|
||||
##
|
||||
@ -1292,7 +1290,6 @@ CONFIG_HYPERV_NET=m
|
||||
# CONFIG_MARVELL_88Q2XXX_PHY is not set
|
||||
# CONFIG_MARVELL_88X2222_PHY is not set
|
||||
# CONFIG_MAXLINEAR_GPHY is not set
|
||||
# CONFIG_MEDIATEK_GE_PHY is not set
|
||||
# CONFIG_MICREL_PHY is not set
|
||||
# CONFIG_MICROCHIP_T1S_PHY is not set
|
||||
# CONFIG_MICROCHIP_PHY is not set
|
||||
@ -1305,7 +1302,6 @@ CONFIG_HYPERV_NET=m
|
||||
# CONFIG_NXP_TJA11XX_PHY is not set
|
||||
# CONFIG_NCN26000_PHY is not set
|
||||
# CONFIG_QSEMI_PHY is not set
|
||||
# CONFIG_REALTEK_PHY is not set
|
||||
# CONFIG_RENESAS_PHY is not set
|
||||
# CONFIG_ROCKCHIP_PHY is not set
|
||||
# CONFIG_SMSC_PHY is not set
|
||||
@ -1326,12 +1322,22 @@ CONFIG_HYPERV_NET=m
|
||||
##
|
||||
# CONFIG_AQUANTIA_PHY is not set
|
||||
|
||||
##
|
||||
## file: drivers/net/phy/mediatek/Kconfig
|
||||
##
|
||||
# CONFIG_MEDIATEK_GE_PHY is not set
|
||||
|
||||
##
|
||||
## file: drivers/net/phy/qcom/Kconfig
|
||||
##
|
||||
# CONFIG_QCA83XX_PHY is not set
|
||||
# CONFIG_QCA808X_PHY is not set
|
||||
|
||||
##
|
||||
## file: drivers/net/phy/realtek/Kconfig
|
||||
##
|
||||
# CONFIG_REALTEK_PHY is not set
|
||||
|
||||
##
|
||||
## file: drivers/net/ppp/Kconfig
|
||||
##
|
||||
@ -1396,7 +1402,7 @@ CONFIG_NVME_TARGET_FC=m
|
||||
## file: drivers/pci/Kconfig
|
||||
##
|
||||
CONFIG_XEN_PCIDEV_FRONTEND=m
|
||||
# CONFIG_PCI_P2PDMA is not set
|
||||
# CONFIG_PCIE_TPH is not set
|
||||
CONFIG_PCI_HYPERV=m
|
||||
|
||||
##
|
||||
@ -1416,6 +1422,7 @@ CONFIG_PCI_HYPERV_INTERFACE=m
|
||||
##
|
||||
# CONFIG_HOTPLUG_PCI_ACPI_IBM is not set
|
||||
# CONFIG_HOTPLUG_PCI_CPCI is not set
|
||||
# CONFIG_HOTPLUG_PCI_OCTEONEP is not set
|
||||
# CONFIG_HOTPLUG_PCI_SHPC is not set
|
||||
|
||||
##
|
||||
@ -1636,11 +1643,6 @@ CONFIG_SCSI_MPI3MR=m
|
||||
##
|
||||
# CONFIG_SOC_TI is not set
|
||||
|
||||
##
|
||||
## file: drivers/soundwire/Kconfig
|
||||
##
|
||||
# CONFIG_SOUNDWIRE is not set
|
||||
|
||||
##
|
||||
## file: drivers/spi/Kconfig
|
||||
##
|
||||
@ -1678,6 +1680,7 @@ CONFIG_SCSI_MPI3MR=m
|
||||
# CONFIG_THERMAL_DEBUGFS is not set
|
||||
# CONFIG_THERMAL_CORE_TESTING is not set
|
||||
# CONFIG_THERMAL_GOV_BANG_BANG is not set
|
||||
# CONFIG_PCIE_THERMAL is not set
|
||||
|
||||
##
|
||||
## file: drivers/thunderbolt/Kconfig
|
||||
@ -1830,7 +1833,6 @@ CONFIG_SOFT_WATCHDOG_PRETIMEOUT=y
|
||||
# CONFIG_PC87413_WDT is not set
|
||||
# CONFIG_NV_TCO is not set
|
||||
# CONFIG_60XX_WDT is not set
|
||||
# CONFIG_CPU5_WDT is not set
|
||||
# CONFIG_SMSC_SCH311X_WDT is not set
|
||||
# CONFIG_SMSC37B787_WDT is not set
|
||||
# CONFIG_TQMX86_WDT is not set
|
||||
@ -2057,11 +2059,6 @@ CONFIG_PROC_VMCORE=y
|
||||
##
|
||||
# CONFIG_QNX6FS_FS is not set
|
||||
|
||||
##
|
||||
## file: fs/reiserfs/Kconfig
|
||||
##
|
||||
# CONFIG_REISERFS_FS is not set
|
||||
|
||||
##
|
||||
## file: fs/romfs/Kconfig
|
||||
##
|
||||
@ -2114,7 +2111,7 @@ CONFIG_CRASH_MAX_MEMORY_RANGES=8192
|
||||
##
|
||||
## choice: Preemption Model
|
||||
CONFIG_PREEMPT_NONE=y
|
||||
# CONFIG_PREEMPT_VOLUNTARY is not set
|
||||
# CONFIG_PREEMPT_LAZY is not set
|
||||
## end choice
|
||||
# CONFIG_SCHED_CORE is not set
|
||||
|
||||
@ -2178,7 +2175,6 @@ CONFIG_PANIC_TIMEOUT=5
|
||||
## file: mm/Kconfig
|
||||
##
|
||||
# CONFIG_ZSWAP is not set
|
||||
CONFIG_MEMORY_HOTPLUG_DEFAULT_ONLINE=y
|
||||
# CONFIG_HWPOISON_INJECT is not set
|
||||
# CONFIG_NUMA_EMU is not set
|
||||
|
||||
@ -2462,7 +2458,6 @@ CONFIG_ARCH_HAS_GENERIC_CRASHKERNEL_RESERVATION=y
|
||||
CONFIG_ARCH_SELECTS_KEXEC_FILE=y
|
||||
CONFIG_BLK_DEV_RNBD=y
|
||||
CONFIG_CRASH_RESERVE=y
|
||||
CONFIG_CRYPTO_ECC=m
|
||||
CONFIG_CRYPTO_LIB_AESCFB=m
|
||||
CONFIG_CXL_PORT=y
|
||||
CONFIG_FB_IOMEM_HELPERS_DEFERRED=y
|
||||
@ -2472,6 +2467,11 @@ CONFIG_INFINIBAND_ADDR_TRANS_CONFIGFS=y
|
||||
CONFIG_INFINIBAND_RTRS=m
|
||||
CONFIG_INFINIBAND_USER_MEM=y
|
||||
CONFIG_INFINIBAND_VIRT_DMA=y
|
||||
CONFIG_INLINE_READ_UNLOCK=y
|
||||
CONFIG_INLINE_READ_UNLOCK_IRQ=y
|
||||
CONFIG_INLINE_SPIN_UNLOCK_IRQ=y
|
||||
CONFIG_INLINE_WRITE_UNLOCK=y
|
||||
CONFIG_INLINE_WRITE_UNLOCK_IRQ=y
|
||||
CONFIG_IP_VS_PROTO_AH_ESP=y
|
||||
CONFIG_KEXEC_CORE=y
|
||||
CONFIG_LZ4HC_COMPRESS=m
|
||||
|
276
debian/config/amd64/config.mobile
vendored
276
debian/config/amd64/config.mobile
vendored
@ -88,6 +88,7 @@ CONFIG_ULTRIX_PARTITION=y
|
||||
CONFIG_SUN_PARTITION=y
|
||||
CONFIG_KARMA_PARTITION=y
|
||||
CONFIG_SYSV68_PARTITION=y
|
||||
CONFIG_OF_PARTITION=y
|
||||
|
||||
##
|
||||
## file: certs/Kconfig
|
||||
@ -103,7 +104,6 @@ CONFIG_SYSTEM_BLACKLIST_AUTH_UPDATE=y
|
||||
## file: crypto/Kconfig
|
||||
##
|
||||
CONFIG_CRYPTO_ECDH=y
|
||||
CONFIG_CRYPTO_ECDSA=y
|
||||
CONFIG_CRYPTO_CTS=y
|
||||
CONFIG_CRYPTO_XTS=y
|
||||
CONFIG_CRYPTO_DEFLATE=y
|
||||
@ -117,6 +117,11 @@ CONFIG_CRYPTO_ZSTD=y
|
||||
##
|
||||
CONFIG_DRM_ACCEL=y
|
||||
|
||||
##
|
||||
## file: drivers/accel/amdxdna/Kconfig
|
||||
##
|
||||
CONFIG_DRM_ACCEL_AMDXDNA=m
|
||||
|
||||
##
|
||||
## file: drivers/accel/habanalabs/Kconfig
|
||||
##
|
||||
@ -126,6 +131,7 @@ CONFIG_DRM_ACCEL_HABANALABS=m
|
||||
## file: drivers/accel/ivpu/Kconfig
|
||||
##
|
||||
CONFIG_DRM_ACCEL_IVPU=m
|
||||
# CONFIG_DRM_ACCEL_IVPU_DEBUG is not set
|
||||
|
||||
##
|
||||
## file: drivers/accel/qaic/Kconfig
|
||||
@ -324,6 +330,7 @@ CONFIG_BLK_DEV_PCIESSD_MTIP32XX=m
|
||||
CONFIG_BT_HCIBTUSB=m
|
||||
CONFIG_BT_HCIBTUSB_AUTOSUSPEND=y
|
||||
CONFIG_BT_HCIBTUSB_POLL_SYNC=y
|
||||
CONFIG_BT_HCIBTUSB_AUTO_ISOC_ALT=y
|
||||
CONFIG_BT_HCIBTUSB_BCM=y
|
||||
CONFIG_BT_HCIBTUSB_MTK=y
|
||||
CONFIG_BT_HCIBTUSB_RTL=y
|
||||
@ -581,6 +588,8 @@ CONFIG_XILINX_ZYNQMP_DPDMA=m
|
||||
##
|
||||
## file: drivers/dma/amd/Kconfig
|
||||
##
|
||||
CONFIG_AMD_AE4DMA=m
|
||||
CONFIG_AMD_PTDMA=m
|
||||
CONFIG_AMD_QDMA=m
|
||||
|
||||
##
|
||||
@ -600,11 +609,6 @@ CONFIG_DW_EDMA_PCIE=m
|
||||
##
|
||||
CONFIG_INTEL_LDMA=y
|
||||
|
||||
##
|
||||
## file: drivers/dma/ptdma/Kconfig
|
||||
##
|
||||
CONFIG_AMD_PTDMA=m
|
||||
|
||||
##
|
||||
## file: drivers/dma/qcom/Kconfig
|
||||
##
|
||||
@ -747,6 +751,7 @@ CONFIG_GPIO_HLWD=m
|
||||
CONFIG_GPIO_ICH=m
|
||||
CONFIG_GPIO_LOGICVC=m
|
||||
CONFIG_GPIO_MB86S7X=m
|
||||
CONFIG_GPIO_POLARFIRE_SOC=y
|
||||
CONFIG_GPIO_SIFIVE=y
|
||||
CONFIG_GPIO_SYSCON=m
|
||||
CONFIG_GPIO_WCD934X=m
|
||||
@ -776,6 +781,7 @@ CONFIG_GPIO_ARIZONA=m
|
||||
CONFIG_GPIO_BD71815=m
|
||||
CONFIG_GPIO_BD71828=m
|
||||
CONFIG_GPIO_BD9571MWV=m
|
||||
CONFIG_GPIO_CGBC=m
|
||||
CONFIG_GPIO_CRYSTAL_COVE=m
|
||||
CONFIG_GPIO_DA9052=m
|
||||
CONFIG_GPIO_DA9055=m
|
||||
@ -823,6 +829,7 @@ CONFIG_GPIO_PISOSR=m
|
||||
CONFIG_GPIO_XRA1403=m
|
||||
CONFIG_GPIO_MOXTET=m
|
||||
CONFIG_GPIO_VIPERBOARD=m
|
||||
CONFIG_GPIO_MPSSE=m
|
||||
CONFIG_GPIO_AGGREGATOR=m
|
||||
CONFIG_GPIO_LATCH=m
|
||||
CONFIG_GPIO_MOCKUP=m
|
||||
@ -839,9 +846,6 @@ CONFIG_DRM=y
|
||||
# CONFIG_DRM_PANIC is not set
|
||||
# CONFIG_DRM_DEBUG_DP_MST_TOPOLOGY_REFS is not set
|
||||
# CONFIG_DRM_DEBUG_MODESET_LOCK is not set
|
||||
CONFIG_DRM_FBDEV_EMULATION=y
|
||||
CONFIG_DRM_FBDEV_OVERALLOC=100
|
||||
# CONFIG_DRM_FBDEV_LEAK_PHYS_SMEM is not set
|
||||
CONFIG_DRM_LOAD_EDID_FIRMWARE=y
|
||||
CONFIG_DRM_VGEM=m
|
||||
# CONFIG_DRM_WERROR is not set
|
||||
@ -890,6 +894,7 @@ CONFIG_DRM_AST=m
|
||||
CONFIG_DRM_CHIPONE_ICN6211=m
|
||||
CONFIG_DRM_CHRONTEL_CH7033=m
|
||||
CONFIG_DRM_DISPLAY_CONNECTOR=m
|
||||
CONFIG_DRM_ITE_IT6263=m
|
||||
CONFIG_DRM_ITE_IT6505=m
|
||||
CONFIG_DRM_LONTIUM_LT8912B=m
|
||||
CONFIG_DRM_LONTIUM_LT9211=m
|
||||
@ -914,6 +919,7 @@ CONFIG_DRM_TOSHIBA_TC358767=m
|
||||
CONFIG_DRM_TOSHIBA_TC358768=m
|
||||
# CONFIG_DRM_TOSHIBA_TC358775 is not set
|
||||
CONFIG_DRM_TI_DLPC3433=m
|
||||
CONFIG_DRM_TI_TDP158=m
|
||||
CONFIG_DRM_TI_TFP410=m
|
||||
CONFIG_DRM_TI_SN65DSI83=m
|
||||
# CONFIG_DRM_TI_SN65DSI86 is not set
|
||||
@ -940,6 +946,17 @@ CONFIG_DRM_CDNS_DSI=m
|
||||
CONFIG_DRM_CDNS_DSI_J721E=y
|
||||
CONFIG_DRM_CDNS_MHDP8546=m
|
||||
|
||||
##
|
||||
## file: drivers/gpu/drm/clients/Kconfig
|
||||
##
|
||||
CONFIG_DRM_FBDEV_EMULATION=y
|
||||
CONFIG_DRM_FBDEV_OVERALLOC=100
|
||||
# CONFIG_DRM_FBDEV_LEAK_PHYS_SMEM is not set
|
||||
# CONFIG_DRM_CLIENT_LOG is not set
|
||||
## choice: Default DRM Client
|
||||
CONFIG_DRM_CLIENT_DEFAULT_FBDEV=y
|
||||
## end choice
|
||||
|
||||
##
|
||||
## file: drivers/gpu/drm/display/Kconfig
|
||||
##
|
||||
@ -961,6 +978,11 @@ CONFIG_DRM_GMA500=m
|
||||
##
|
||||
CONFIG_DRM_GUD=m
|
||||
|
||||
##
|
||||
## file: drivers/gpu/drm/hisilicon/hibmc/Kconfig
|
||||
##
|
||||
CONFIG_DRM_HISI_HIBMC=m
|
||||
|
||||
##
|
||||
## file: drivers/gpu/drm/i2c/Kconfig
|
||||
##
|
||||
@ -1096,6 +1118,9 @@ CONFIG_DRM_PANEL_RAYDIUM_RM68200=m
|
||||
CONFIG_DRM_PANEL_RAYDIUM_RM692E5=m
|
||||
CONFIG_DRM_PANEL_RAYDIUM_RM69380=m
|
||||
CONFIG_DRM_PANEL_RONBO_RB070D30=m
|
||||
CONFIG_DRM_PANEL_SAMSUNG_AMS581VF01=m
|
||||
CONFIG_DRM_PANEL_SAMSUNG_AMS639RQ08=m
|
||||
CONFIG_DRM_PANEL_SAMSUNG_S6E88A0_AMS427AP24=m
|
||||
CONFIG_DRM_PANEL_SAMSUNG_S6E88A0_AMS452EF01=m
|
||||
CONFIG_DRM_PANEL_SAMSUNG_ATNA33XC20=m
|
||||
CONFIG_DRM_PANEL_SAMSUNG_DB7430=m
|
||||
@ -1105,6 +1130,7 @@ CONFIG_DRM_PANEL_SAMSUNG_S6D16D0=m
|
||||
CONFIG_DRM_PANEL_SAMSUNG_S6D27A1=m
|
||||
CONFIG_DRM_PANEL_SAMSUNG_S6D7AA0=m
|
||||
CONFIG_DRM_PANEL_SAMSUNG_S6E3HA2=m
|
||||
CONFIG_DRM_PANEL_SAMSUNG_S6E3HA8=m
|
||||
CONFIG_DRM_PANEL_SAMSUNG_S6E63J0X03=m
|
||||
CONFIG_DRM_PANEL_SAMSUNG_S6E63M0=m
|
||||
CONFIG_DRM_PANEL_SAMSUNG_S6E63M0_SPI=m
|
||||
@ -1171,6 +1197,7 @@ CONFIG_TINYDRM_ILI9341=m
|
||||
CONFIG_TINYDRM_ILI9486=m
|
||||
CONFIG_TINYDRM_MI0283QT=m
|
||||
CONFIG_TINYDRM_REPAPER=m
|
||||
CONFIG_TINYDRM_SHARP_MEMORY=m
|
||||
CONFIG_TINYDRM_ST7586=m
|
||||
CONFIG_TINYDRM_ST7735R=m
|
||||
|
||||
@ -1208,6 +1235,7 @@ CONFIG_DRM_XE_FORCE_PROBE=""
|
||||
# CONFIG_DRM_XE_WERROR is not set
|
||||
# CONFIG_DRM_XE_DEBUG is not set
|
||||
# CONFIG_DRM_XE_DEBUG_VM is not set
|
||||
# CONFIG_DRM_XE_DEBUG_MEMIRQ is not set
|
||||
# CONFIG_DRM_XE_DEBUG_SRIOV is not set
|
||||
# CONFIG_DRM_XE_DEBUG_MEM is not set
|
||||
# CONFIG_DRM_XE_LARGE_GUC_BUFFER is not set
|
||||
@ -1287,6 +1315,7 @@ CONFIG_HID_VIVALDI=m
|
||||
CONFIG_HID_GT683R=m
|
||||
CONFIG_HID_KEYTOUCH=m
|
||||
CONFIG_HID_KYE=m
|
||||
CONFIG_HID_KYSONA=m
|
||||
CONFIG_HID_UCLOGIC=m
|
||||
CONFIG_HID_WALTOP=m
|
||||
CONFIG_HID_VIEWSONIC=m
|
||||
@ -1403,6 +1432,13 @@ CONFIG_I2C_HID_OF_GOODIX=m
|
||||
CONFIG_INTEL_ISH_HID=m
|
||||
CONFIG_INTEL_ISH_FIRMWARE_DOWNLOADER=m
|
||||
|
||||
##
|
||||
## file: drivers/hid/intel-thc-hid/Kconfig
|
||||
##
|
||||
CONFIG_INTEL_THC_HID=m
|
||||
CONFIG_INTEL_QUICKSPI=m
|
||||
CONFIG_INTEL_QUICKI2C=m
|
||||
|
||||
##
|
||||
## file: drivers/hid/usbhid/Kconfig
|
||||
##
|
||||
@ -1491,6 +1527,7 @@ CONFIG_SENSORS_IBMAEM=m
|
||||
CONFIG_SENSORS_IBMPEX=m
|
||||
CONFIG_SENSORS_I5500=m
|
||||
CONFIG_SENSORS_CORETEMP=m
|
||||
CONFIG_SENSORS_ISL28022=m
|
||||
CONFIG_SENSORS_IT87=m
|
||||
CONFIG_SENSORS_JC42=m
|
||||
CONFIG_SENSORS_POWERZ=m
|
||||
@ -1555,6 +1592,7 @@ CONFIG_SENSORS_PC87427=m
|
||||
CONFIG_SENSORS_NCT6683=m
|
||||
CONFIG_SENSORS_NCT6775=m
|
||||
CONFIG_SENSORS_NCT6775_I2C=m
|
||||
CONFIG_SENSORS_NCT7363=m
|
||||
CONFIG_SENSORS_NCT7802=m
|
||||
CONFIG_SENSORS_NCT7904=m
|
||||
CONFIG_SENSORS_NPCM7XX=m
|
||||
@ -1565,6 +1603,7 @@ CONFIG_SENSORS_OXP=m
|
||||
CONFIG_SENSORS_PCF8591=m
|
||||
CONFIG_SENSORS_PT5161L=m
|
||||
CONFIG_SENSORS_PWM_FAN=m
|
||||
CONFIG_SENSORS_QNAP_MCU_HWMON=m
|
||||
CONFIG_SENSORS_SBTSI=m
|
||||
CONFIG_SENSORS_SBRMI=m
|
||||
CONFIG_SENSORS_SHT15=m
|
||||
@ -1651,6 +1690,7 @@ CONFIG_SENSORS_ADM1275=m
|
||||
CONFIG_SENSORS_ADP1050=m
|
||||
CONFIG_SENSORS_BEL_PFE=m
|
||||
CONFIG_SENSORS_BPA_RS600=m
|
||||
CONFIG_SENSORS_CRPS=m
|
||||
CONFIG_SENSORS_DELTA_AHE50DC_FAN=m
|
||||
CONFIG_SENSORS_FSP_3Y=m
|
||||
CONFIG_SENSORS_IBM_CFFPS=m
|
||||
@ -1699,6 +1739,8 @@ CONFIG_SENSORS_Q54SJ108A2=m
|
||||
CONFIG_SENSORS_STPDDC60=m
|
||||
CONFIG_SENSORS_TDA38640=m
|
||||
CONFIG_SENSORS_TDA38640_REGULATOR=y
|
||||
CONFIG_SENSORS_TPS25990=m
|
||||
CONFIG_SENSORS_TPS25990_REGULATOR=y
|
||||
CONFIG_SENSORS_TPS40422=m
|
||||
CONFIG_SENSORS_TPS53679=m
|
||||
CONFIG_SENSORS_TPS546D24=m
|
||||
@ -1754,16 +1796,15 @@ CONFIG_I2C_ALI1535=m
|
||||
CONFIG_I2C_ALI1563=m
|
||||
CONFIG_I2C_ALI15X3=m
|
||||
CONFIG_I2C_AMD756=m
|
||||
CONFIG_I2C_AMD756_S4882=m
|
||||
CONFIG_I2C_AMD8111=m
|
||||
CONFIG_I2C_AMD_MP2=m
|
||||
CONFIG_I2C_AMD_ASF=m
|
||||
CONFIG_I2C_I801=m
|
||||
CONFIG_I2C_ISCH=m
|
||||
CONFIG_I2C_ISMT=m
|
||||
CONFIG_I2C_PIIX4=m
|
||||
CONFIG_I2C_CHT_WC=m
|
||||
CONFIG_I2C_NFORCE2=m
|
||||
CONFIG_I2C_NFORCE2_S4985=m
|
||||
CONFIG_I2C_NVIDIA_GPU=m
|
||||
CONFIG_I2C_SIS5595=m
|
||||
CONFIG_I2C_SIS630=m
|
||||
@ -1773,6 +1814,7 @@ CONFIG_I2C_VIAPRO=m
|
||||
CONFIG_I2C_ZHAOXIN=m
|
||||
CONFIG_I2C_SCMI=m
|
||||
CONFIG_I2C_CBUS_GPIO=m
|
||||
CONFIG_I2C_CGBC=m
|
||||
CONFIG_I2C_DESIGNWARE_CORE=y
|
||||
CONFIG_I2C_DESIGNWARE_SLAVE=y
|
||||
CONFIG_I2C_DESIGNWARE_PLATFORM=y
|
||||
@ -2010,6 +2052,7 @@ CONFIG_INPUT_SOC_BUTTON_ARRAY=m
|
||||
CONFIG_INPUT_DRV260X_HAPTICS=m
|
||||
CONFIG_INPUT_DRV2665_HAPTICS=m
|
||||
CONFIG_INPUT_DRV2667_HAPTICS=m
|
||||
CONFIG_INPUT_QNAP_MCU=m
|
||||
CONFIG_INPUT_RAVE_SP_PWRBUTTON=m
|
||||
CONFIG_INPUT_RT5120_PWRKEY=m
|
||||
CONFIG_INPUT_STPMIC1_ONKEY=m
|
||||
@ -2208,6 +2251,7 @@ CONFIG_IOMMUFD=m
|
||||
## file: drivers/irqchip/Kconfig
|
||||
##
|
||||
# CONFIG_AL_FIC is not set
|
||||
CONFIG_LAN966X_OIC=m
|
||||
# CONFIG_XILINX_INTC is not set
|
||||
|
||||
##
|
||||
@ -2273,10 +2317,12 @@ CONFIG_LEDS_LP5569=m
|
||||
CONFIG_LEDS_LP8501=m
|
||||
CONFIG_LEDS_LP8788=m
|
||||
CONFIG_LEDS_LP8860=m
|
||||
CONFIG_LEDS_LP8864=m
|
||||
CONFIG_LEDS_PCA955X=m
|
||||
CONFIG_LEDS_PCA955X_GPIO=y
|
||||
CONFIG_LEDS_PCA963X=m
|
||||
CONFIG_LEDS_PCA995X=m
|
||||
CONFIG_LEDS_QNAP_MCU=m
|
||||
CONFIG_LEDS_WM831X_STATUS=m
|
||||
CONFIG_LEDS_WM8350=m
|
||||
CONFIG_LEDS_DA903X=m
|
||||
@ -2299,6 +2345,7 @@ CONFIG_LEDS_LM355x=m
|
||||
CONFIG_LEDS_MENF21BMC=m
|
||||
CONFIG_LEDS_IS31FL319X=m
|
||||
CONFIG_LEDS_IS31FL32XX=m
|
||||
CONFIG_LEDS_UPBOARD=m
|
||||
CONFIG_LEDS_BLINKM=m
|
||||
CONFIG_LEDS_BLINKM_MULTICOLOR=y
|
||||
CONFIG_LEDS_MLXCPLD=m
|
||||
@ -2309,6 +2356,7 @@ CONFIG_LEDS_SPI_BYTE=m
|
||||
CONFIG_LEDS_TI_LMU_COMMON=m
|
||||
CONFIG_LEDS_LM3697=m
|
||||
CONFIG_LEDS_LM36274=m
|
||||
CONFIG_LEDS_ST1202=m
|
||||
CONFIG_LEDS_TPS6105X=m
|
||||
CONFIG_LEDS_STEAMDECK=m
|
||||
|
||||
@ -2426,6 +2474,7 @@ CONFIG_MEDIA_CONTROLLER=y
|
||||
##
|
||||
## file: drivers/media/cec/Kconfig
|
||||
##
|
||||
# CONFIG_CEC_PIN_ERROR_INJ is not set
|
||||
CONFIG_MEDIA_CEC_SUPPORT=y
|
||||
|
||||
##
|
||||
@ -2436,6 +2485,7 @@ CONFIG_CEC_CH7322=m
|
||||
##
|
||||
## file: drivers/media/cec/platform/Kconfig
|
||||
##
|
||||
CONFIG_CEC_GPIO=m
|
||||
CONFIG_CEC_SECO=m
|
||||
|
||||
##
|
||||
@ -2606,6 +2656,11 @@ CONFIG_VIDEO_MUX=m
|
||||
##
|
||||
# CONFIG_VIDEO_CAFE_CCIC is not set
|
||||
|
||||
##
|
||||
## file: drivers/media/platform/raspberrypi/rp1-cfe/Kconfig
|
||||
##
|
||||
CONFIG_VIDEO_RP1_CFE=m
|
||||
|
||||
##
|
||||
## file: drivers/media/platform/xilinx/Kconfig
|
||||
##
|
||||
@ -2765,6 +2820,7 @@ CONFIG_MFD_ATMEL_HLCDC=m
|
||||
CONFIG_MFD_BCM590XX=m
|
||||
CONFIG_MFD_BD9571MWV=m
|
||||
CONFIG_MFD_AXP20X_I2C=m
|
||||
CONFIG_MFD_CGBC=m
|
||||
CONFIG_MFD_CS42L43_I2C=m
|
||||
CONFIG_MFD_CS42L43_SDW=m
|
||||
CONFIG_MFD_MADERA=m
|
||||
@ -2903,8 +2959,10 @@ CONFIG_MFD_CS40L50_I2C=m
|
||||
CONFIG_MFD_CS40L50_SPI=m
|
||||
CONFIG_RAVE_SP_CORE=m
|
||||
CONFIG_MFD_INTEL_M10_BMC_SPI=m
|
||||
CONFIG_MFD_QNAP_MCU=m
|
||||
CONFIG_MFD_RSMU_I2C=m
|
||||
CONFIG_MFD_RSMU_SPI=m
|
||||
CONFIG_MFD_UPBOARD_FPGA=m
|
||||
CONFIG_MFD_STEAMDECK=m
|
||||
|
||||
##
|
||||
@ -2942,6 +3000,7 @@ CONFIG_NTSYNC=m
|
||||
# CONFIG_VCPU_STALL_DETECTOR is not set
|
||||
CONFIG_TPS6594_ESM=m
|
||||
CONFIG_TPS6594_PFSM=m
|
||||
CONFIG_MCHP_LAN966X_PCI=m
|
||||
|
||||
##
|
||||
## file: drivers/misc/altera-stapl/Kconfig
|
||||
@ -2979,7 +3038,7 @@ CONFIG_CB710_CORE=m
|
||||
CONFIG_EEPROM_AT24=m
|
||||
CONFIG_EEPROM_AT25=m
|
||||
CONFIG_EEPROM_MAX6875=m
|
||||
CONFIG_EEPROM_93CX6=m
|
||||
CONFIG_EEPROM_93CX6=y
|
||||
CONFIG_EEPROM_93XX46=m
|
||||
CONFIG_EEPROM_IDT_89HPESX=m
|
||||
CONFIG_EEPROM_EE1004=m
|
||||
@ -2988,6 +3047,7 @@ CONFIG_EEPROM_EE1004=m
|
||||
## file: drivers/misc/keba/Kconfig
|
||||
##
|
||||
CONFIG_KEBA_CP500=m
|
||||
CONFIG_KEBA_LAN9252=m
|
||||
|
||||
##
|
||||
## file: drivers/misc/lis3lv02d/Kconfig
|
||||
@ -3024,11 +3084,6 @@ CONFIG_INTEL_MEI_HDCP=m
|
||||
##
|
||||
CONFIG_INTEL_MEI_PXP=m
|
||||
|
||||
##
|
||||
## file: drivers/misc/ti-st/Kconfig
|
||||
##
|
||||
CONFIG_TI_ST=m
|
||||
|
||||
##
|
||||
## file: drivers/mmc/Kconfig
|
||||
##
|
||||
@ -3051,6 +3106,7 @@ CONFIG_MMC_CRYPTO=y
|
||||
##
|
||||
# CONFIG_MMC_DEBUG is not set
|
||||
CONFIG_MMC_SDHCI=m
|
||||
CONFIG_MMC_SDHCI_UHS2=m
|
||||
CONFIG_MMC_SDHCI_PCI=m
|
||||
CONFIG_MMC_RICOH_MMC=y
|
||||
CONFIG_MMC_SDHCI_ACPI=m
|
||||
@ -3573,8 +3629,6 @@ CONFIG_ULI526X=m
|
||||
##
|
||||
CONFIG_NET_VENDOR_DLINK=y
|
||||
CONFIG_DL2K=m
|
||||
CONFIG_SUNDANCE=m
|
||||
# CONFIG_SUNDANCE_MMIO is not set
|
||||
|
||||
##
|
||||
## file: drivers/net/ethernet/emulex/benet/Kconfig
|
||||
@ -3604,6 +3658,12 @@ CONFIG_NET_VENDOR_FUNGIBLE=y
|
||||
##
|
||||
CONFIG_FUN_ETH=m
|
||||
|
||||
##
|
||||
## file: drivers/net/ethernet/hisilicon/Kconfig
|
||||
##
|
||||
CONFIG_NET_VENDOR_HISILICON=y
|
||||
CONFIG_HIBMCGE=m
|
||||
|
||||
##
|
||||
## file: drivers/net/ethernet/huawei/Kconfig
|
||||
##
|
||||
@ -4095,7 +4155,6 @@ CONFIG_MARVELL_10G_PHY=m
|
||||
CONFIG_MARVELL_88Q2XXX_PHY=m
|
||||
CONFIG_MARVELL_88X2222_PHY=m
|
||||
CONFIG_MAXLINEAR_GPHY=m
|
||||
CONFIG_MEDIATEK_GE_PHY=m
|
||||
CONFIG_MICREL_PHY=m
|
||||
CONFIG_MICROCHIP_T1S_PHY=m
|
||||
CONFIG_MICROCHIP_PHY=m
|
||||
@ -4108,7 +4167,6 @@ CONFIG_NXP_C45_TJA11XX_PHY=m
|
||||
CONFIG_NXP_TJA11XX_PHY=m
|
||||
CONFIG_NCN26000_PHY=m
|
||||
CONFIG_QSEMI_PHY=m
|
||||
CONFIG_REALTEK_PHY=m
|
||||
CONFIG_RENESAS_PHY=m
|
||||
CONFIG_ROCKCHIP_PHY=m
|
||||
CONFIG_SMSC_PHY=m
|
||||
@ -4130,6 +4188,11 @@ CONFIG_XILINX_GMII2RGMII=m
|
||||
##
|
||||
CONFIG_AQUANTIA_PHY=m
|
||||
|
||||
##
|
||||
## file: drivers/net/phy/mediatek/Kconfig
|
||||
##
|
||||
CONFIG_MEDIATEK_GE_PHY=m
|
||||
|
||||
##
|
||||
## file: drivers/net/phy/qcom/Kconfig
|
||||
##
|
||||
@ -4138,6 +4201,11 @@ CONFIG_QCA83XX_PHY=m
|
||||
CONFIG_QCA808X_PHY=m
|
||||
CONFIG_QCA807X_PHY=m
|
||||
|
||||
##
|
||||
## file: drivers/net/phy/realtek/Kconfig
|
||||
##
|
||||
CONFIG_REALTEK_PHY=m
|
||||
|
||||
##
|
||||
## file: drivers/net/plip/Kconfig
|
||||
##
|
||||
@ -4308,6 +4376,7 @@ CONFIG_ATH11K_DEBUG=y
|
||||
CONFIG_ATH12K=m
|
||||
CONFIG_ATH12K_DEBUG=y
|
||||
# CONFIG_ATH12K_TRACING is not set
|
||||
# CONFIG_ATH12K_COREDUMP is not set
|
||||
|
||||
##
|
||||
## file: drivers/net/wireless/ath/ath5k/Kconfig
|
||||
@ -4667,6 +4736,8 @@ CONFIG_RTW88_8723DU=m
|
||||
CONFIG_RTW88_8821CE=m
|
||||
CONFIG_RTW88_8821CS=m
|
||||
CONFIG_RTW88_8821CU=m
|
||||
CONFIG_RTW88_8821AU=m
|
||||
CONFIG_RTW88_8812AU=m
|
||||
CONFIG_RTW88_DEBUG=y
|
||||
CONFIG_RTW88_DEBUGFS=y
|
||||
|
||||
@ -4928,7 +4999,7 @@ CONFIG_PARPORT_1284=y
|
||||
##
|
||||
## file: drivers/pci/Kconfig
|
||||
##
|
||||
CONFIG_PCI_P2PDMA=y
|
||||
CONFIG_PCIE_TPH=y
|
||||
# CONFIG_PCI_DYNAMIC_OF_NODES is not set
|
||||
|
||||
##
|
||||
@ -4963,6 +5034,7 @@ CONFIG_HOTPLUG_PCI_ACPI_IBM=m
|
||||
CONFIG_HOTPLUG_PCI_CPCI=y
|
||||
CONFIG_HOTPLUG_PCI_CPCI_ZT5550=m
|
||||
CONFIG_HOTPLUG_PCI_CPCI_GENERIC=m
|
||||
CONFIG_HOTPLUG_PCI_OCTEONEP=y
|
||||
CONFIG_HOTPLUG_PCI_SHPC=y
|
||||
|
||||
##
|
||||
@ -4997,6 +5069,7 @@ CONFIG_CXL_PMU=m
|
||||
CONFIG_GENERIC_PHY=y
|
||||
CONFIG_USB_LGM_PHY=m
|
||||
CONFIG_PHY_CAN_TRANSCEIVER=m
|
||||
CONFIG_PHY_NXP_PTN3222=m
|
||||
|
||||
##
|
||||
## file: drivers/phy/broadcom/Kconfig
|
||||
@ -5195,10 +5268,15 @@ CONFIG_SEL3350_PLATFORM=m
|
||||
##
|
||||
## file: drivers/platform/x86/amd/Kconfig
|
||||
##
|
||||
CONFIG_AMD_HSMP=m
|
||||
CONFIG_AMD_3D_VCACHE=m
|
||||
CONFIG_AMD_WBRF=y
|
||||
|
||||
##
|
||||
## file: drivers/platform/x86/amd/hsmp/Kconfig
|
||||
##
|
||||
CONFIG_AMD_HSMP_ACPI=m
|
||||
CONFIG_AMD_HSMP_PLAT=m
|
||||
|
||||
##
|
||||
## file: drivers/platform/x86/amd/pmc/Kconfig
|
||||
##
|
||||
@ -5428,6 +5506,7 @@ CONFIG_CHARGER_RT5033=m
|
||||
CONFIG_CHARGER_RT9455=m
|
||||
CONFIG_CHARGER_RT9467=m
|
||||
CONFIG_CHARGER_RT9471=m
|
||||
CONFIG_FUEL_GAUGE_STC3117=m
|
||||
CONFIG_CHARGER_UCS1002=m
|
||||
CONFIG_CHARGER_BD99954=m
|
||||
CONFIG_BATTERY_UG3105=m
|
||||
@ -5695,6 +5774,7 @@ CONFIG_REGULATOR_QCOM_LABIBB=m
|
||||
CONFIG_RESET_CONTROLLER=y
|
||||
CONFIG_RESET_GPIO=m
|
||||
CONFIG_RESET_INTEL_GW=y
|
||||
CONFIG_RESET_MCHP_SPARX5=m
|
||||
CONFIG_RESET_SIMPLE=y
|
||||
CONFIG_RESET_TI_SYSCON=m
|
||||
CONFIG_RESET_TI_TPS380X=m
|
||||
@ -5710,6 +5790,7 @@ CONFIG_RPMSG_QCOM_GLINK_RPM=m
|
||||
CONFIG_RTC_DRV_TEST=m
|
||||
CONFIG_RTC_DRV_88PM860X=m
|
||||
CONFIG_RTC_DRV_88PM80X=m
|
||||
CONFIG_RTC_DRV_88PM886=m
|
||||
CONFIG_RTC_DRV_ABB5ZES3=m
|
||||
CONFIG_RTC_DRV_ABEOZ9=m
|
||||
CONFIG_RTC_DRV_ABX80X=m
|
||||
@ -5878,7 +5959,7 @@ CONFIG_SOC_TI=y
|
||||
##
|
||||
## file: drivers/soundwire/Kconfig
|
||||
##
|
||||
CONFIG_SOUNDWIRE=y
|
||||
CONFIG_SOUNDWIRE=m
|
||||
CONFIG_SOUNDWIRE_AMD=m
|
||||
CONFIG_SOUNDWIRE_INTEL=m
|
||||
CONFIG_SOUNDWIRE_QCOM=m
|
||||
@ -5908,6 +5989,7 @@ CONFIG_SPI_FSI=m
|
||||
CONFIG_SPI_GPIO=m
|
||||
# CONFIG_SPI_INTEL_PCI is not set
|
||||
# CONFIG_SPI_INTEL_PLATFORM is not set
|
||||
CONFIG_SPI_KSPI2=m
|
||||
# CONFIG_SPI_LM70_LLP is not set
|
||||
CONFIG_SPI_FSL_SPI=m
|
||||
CONFIG_SPI_LJCA=m
|
||||
@ -5959,21 +6041,20 @@ CONFIG_STAGING=y
|
||||
CONFIG_XIL_AXIS_FIFO=m
|
||||
|
||||
##
|
||||
## file: drivers/staging/fieldbus/Kconfig
|
||||
## file: drivers/staging/gpib/Kconfig
|
||||
##
|
||||
CONFIG_FIELDBUS_DEV=m
|
||||
|
||||
##
|
||||
## file: drivers/staging/fieldbus/anybuss/Kconfig
|
||||
##
|
||||
CONFIG_HMS_ANYBUSS_BUS=m
|
||||
CONFIG_ARCX_ANYBUS_CONTROLLER=m
|
||||
CONFIG_HMS_PROFINET=m
|
||||
|
||||
##
|
||||
## file: drivers/staging/gdm724x/Kconfig
|
||||
##
|
||||
CONFIG_LTE_GDM724X=m
|
||||
CONFIG_GPIB=m
|
||||
CONFIG_GPIB_COMMON=m
|
||||
CONFIG_GPIB_AGILENT_82350B=m
|
||||
CONFIG_GPIB_AGILENT_82357A=m
|
||||
CONFIG_GPIB_CEC_PCI=m
|
||||
CONFIG_GPIB_NI_PCI_ISA=m
|
||||
CONFIG_GPIB_CB7210=m
|
||||
CONFIG_GPIB_NI_USB=m
|
||||
CONFIG_GPIB_FLUKE=m
|
||||
CONFIG_GPIB_FMH=m
|
||||
CONFIG_GPIB_INES=m
|
||||
CONFIG_GPIB_LPVO=m
|
||||
|
||||
##
|
||||
## file: drivers/staging/greybus/Kconfig
|
||||
@ -6028,34 +6109,11 @@ CONFIG_MOST_NET=m
|
||||
##
|
||||
CONFIG_MOST_VIDEO=m
|
||||
|
||||
##
|
||||
## file: drivers/staging/rtl8192e/Kconfig
|
||||
##
|
||||
CONFIG_RTLLIB=m
|
||||
CONFIG_RTLLIB_CRYPTO_CCMP=m
|
||||
CONFIG_RTLLIB_CRYPTO_TKIP=m
|
||||
CONFIG_RTLLIB_CRYPTO_WEP=m
|
||||
|
||||
##
|
||||
## file: drivers/staging/rtl8192e/rtl8192e/Kconfig
|
||||
##
|
||||
CONFIG_RTL8192E=m
|
||||
|
||||
##
|
||||
## file: drivers/staging/rtl8712/Kconfig
|
||||
##
|
||||
CONFIG_R8712U=m
|
||||
|
||||
##
|
||||
## file: drivers/staging/rtl8723bs/Kconfig
|
||||
##
|
||||
CONFIG_RTL8723BS=m
|
||||
|
||||
##
|
||||
## file: drivers/staging/rts5208/Kconfig
|
||||
##
|
||||
CONFIG_RTS5208=m
|
||||
|
||||
##
|
||||
## file: drivers/staging/sm750fb/Kconfig
|
||||
##
|
||||
@ -6069,16 +6127,6 @@ CONFIG_VME_TSI148=m
|
||||
CONFIG_VME_FAKE=m
|
||||
CONFIG_VME_USER=m
|
||||
|
||||
##
|
||||
## file: drivers/staging/vt6655/Kconfig
|
||||
##
|
||||
CONFIG_VT6655=m
|
||||
|
||||
##
|
||||
## file: drivers/staging/vt6656/Kconfig
|
||||
##
|
||||
CONFIG_VT6656=m
|
||||
|
||||
##
|
||||
## file: drivers/target/iscsi/Kconfig
|
||||
##
|
||||
@ -6114,6 +6162,7 @@ CONFIG_CPU_THERMAL=y
|
||||
CONFIG_CPU_FREQ_THERMAL=y
|
||||
CONFIG_CPU_IDLE_THERMAL=y
|
||||
CONFIG_DEVFREQ_THERMAL=y
|
||||
CONFIG_PCIE_THERMAL=y
|
||||
CONFIG_THERMAL_MMIO=m
|
||||
CONFIG_MAX77620_THERMAL=m
|
||||
CONFIG_DA9062_THERMAL=m
|
||||
@ -6619,6 +6668,7 @@ CONFIG_TYPEC_WUSB3801=m
|
||||
##
|
||||
CONFIG_TYPEC_DP_ALTMODE=m
|
||||
CONFIG_TYPEC_NVIDIA_ALTMODE=m
|
||||
CONFIG_TYPEC_TBT_ALTMODE=m
|
||||
|
||||
##
|
||||
## file: drivers/usb/typec/mux/Kconfig
|
||||
@ -6630,6 +6680,7 @@ CONFIG_TYPEC_MUX_INTEL_PMC=m
|
||||
CONFIG_TYPEC_MUX_IT5205=m
|
||||
CONFIG_TYPEC_MUX_NB7VPQ904M=m
|
||||
CONFIG_TYPEC_MUX_PTN36502=m
|
||||
CONFIG_TYPEC_MUX_TUSB1046=m
|
||||
CONFIG_TYPEC_MUX_WCD939X_USBSS=m
|
||||
|
||||
##
|
||||
@ -6858,6 +6909,7 @@ CONFIG_ADVANTECH_WDT=m
|
||||
CONFIG_ADVANTECH_EC_WDT=m
|
||||
CONFIG_ALIM1535_WDT=m
|
||||
CONFIG_ALIM7101_WDT=m
|
||||
CONFIG_CGBC_WDT=m
|
||||
CONFIG_EBC_C384_WDT=m
|
||||
CONFIG_EXAR_WDT=m
|
||||
CONFIG_F71808E_WDT=m
|
||||
@ -6877,7 +6929,6 @@ CONFIG_SC1200_WDT=m
|
||||
CONFIG_PC87413_WDT=m
|
||||
CONFIG_NV_TCO=m
|
||||
CONFIG_60XX_WDT=m
|
||||
CONFIG_CPU5_WDT=m
|
||||
CONFIG_SMSC_SCH311X_WDT=m
|
||||
CONFIG_SMSC37B787_WDT=m
|
||||
CONFIG_TQMX86_WDT=m
|
||||
@ -6938,6 +6989,7 @@ CONFIG_BTRFS_FS_POSIX_ACL=y
|
||||
# CONFIG_BTRFS_FS_RUN_SANITY_TESTS is not set
|
||||
# CONFIG_BTRFS_DEBUG is not set
|
||||
# CONFIG_BTRFS_ASSERT is not set
|
||||
# CONFIG_BTRFS_EXPERIMENTAL is not set
|
||||
# CONFIG_BTRFS_FS_REF_VERIFY is not set
|
||||
|
||||
##
|
||||
@ -7150,16 +7202,6 @@ CONFIG_QNX4FS_FS=m
|
||||
CONFIG_QNX6FS_FS=m
|
||||
# CONFIG_QNX6FS_DEBUG is not set
|
||||
|
||||
##
|
||||
## file: fs/reiserfs/Kconfig
|
||||
##
|
||||
CONFIG_REISERFS_FS=m
|
||||
# CONFIG_REISERFS_CHECK is not set
|
||||
# CONFIG_REISERFS_PROC_INFO is not set
|
||||
CONFIG_REISERFS_FS_XATTR=y
|
||||
CONFIG_REISERFS_FS_POSIX_ACL=y
|
||||
CONFIG_REISERFS_FS_SECURITY=y
|
||||
|
||||
##
|
||||
## file: fs/romfs/Kconfig
|
||||
##
|
||||
@ -7244,7 +7286,7 @@ CONFIG_UCLAMP_TASK_GROUP=y
|
||||
##
|
||||
## choice: Preemption Model
|
||||
# CONFIG_PREEMPT_NONE is not set
|
||||
CONFIG_PREEMPT_VOLUNTARY=y
|
||||
CONFIG_PREEMPT_LAZY=y
|
||||
## end choice
|
||||
CONFIG_SCHED_CORE=y
|
||||
|
||||
@ -7280,6 +7322,7 @@ CONFIG_NO_HZ=y
|
||||
##
|
||||
CONFIG_BOOTTIME_TRACING=y
|
||||
CONFIG_FUNCTION_GRAPH_RETVAL=y
|
||||
# CONFIG_PREEMPT_TRACER is not set
|
||||
CONFIG_SCHED_TRACER=y
|
||||
CONFIG_HWLAT_TRACER=y
|
||||
CONFIG_OSNOISE_TRACER=y
|
||||
@ -7308,6 +7351,7 @@ CONFIG_DEBUG_MEMORY_INIT=y
|
||||
CONFIG_MEMORY_NOTIFIER_ERROR_INJECT=m
|
||||
CONFIG_PANIC_TIMEOUT=120
|
||||
CONFIG_WQ_CPU_INTENSIVE_REPORT=y
|
||||
# CONFIG_DEBUG_PREEMPT is not set
|
||||
CONFIG_NMI_CHECK_CPU=y
|
||||
CONFIG_DEBUG_IRQFLAGS=y
|
||||
CONFIG_DEBUG_LIST=y
|
||||
@ -7354,6 +7398,7 @@ CONFIG_TEST_FIRMWARE=m
|
||||
CONFIG_TEST_STATIC_KEYS=m
|
||||
# CONFIG_TEST_DYNAMIC_DEBUG is not set
|
||||
# CONFIG_TEST_KMOD is not set
|
||||
# CONFIG_TEST_KALLSYMS is not set
|
||||
# CONFIG_TEST_MEMCAT_P is not set
|
||||
# CONFIG_TEST_OBJAGG is not set
|
||||
# CONFIG_TEST_MEMINIT is not set
|
||||
@ -7395,7 +7440,6 @@ CONFIG_ZSWAP_ZPOOL_DEFAULT_ZBUD=y
|
||||
## end choice
|
||||
CONFIG_ZBUD=y
|
||||
CONFIG_Z3FOLD_DEPRECATED=m
|
||||
# CONFIG_MEMORY_HOTPLUG_DEFAULT_ONLINE is not set
|
||||
CONFIG_HWPOISON_INJECT=m
|
||||
CONFIG_NUMA_EMU=y
|
||||
|
||||
@ -7412,7 +7456,6 @@ CONFIG_DAMON=y
|
||||
CONFIG_DAMON_VADDR=y
|
||||
CONFIG_DAMON_PADDR=y
|
||||
CONFIG_DAMON_SYSFS=y
|
||||
# CONFIG_DAMON_DBGFS_DEPRECATED is not set
|
||||
CONFIG_DAMON_RECLAIM=y
|
||||
CONFIG_DAMON_LRU_SORT=y
|
||||
|
||||
@ -7450,7 +7493,7 @@ CONFIG_6LOWPAN_GHC_EXT_HDR_ROUTE=m
|
||||
CONFIG_NET_9P=m
|
||||
CONFIG_NET_9P_FD=m
|
||||
CONFIG_NET_9P_VIRTIO=m
|
||||
CONFIG_NET_9P_USBG=y
|
||||
CONFIG_NET_9P_USBG=m
|
||||
# CONFIG_NET_9P_DEBUG is not set
|
||||
|
||||
##
|
||||
@ -7771,7 +7814,6 @@ CONFIG_CFG80211_DEFAULT_PS=y
|
||||
# CONFIG_CFG80211_DEBUGFS is not set
|
||||
CONFIG_CFG80211_CRDA_SUPPORT=y
|
||||
CONFIG_CFG80211_WEXT=y
|
||||
# CONFIG_LIB80211_DEBUG is not set
|
||||
|
||||
##
|
||||
## file: net/x25/Kconfig
|
||||
@ -7970,6 +8012,7 @@ CONFIG_SND_HDA_SCODEC_CS35L41_SPI=m
|
||||
CONFIG_SND_HDA_SCODEC_CS35L56_I2C=m
|
||||
CONFIG_SND_HDA_SCODEC_CS35L56_SPI=m
|
||||
CONFIG_SND_HDA_SCODEC_TAS2781_I2C=m
|
||||
CONFIG_SND_HDA_SCODEC_TAS2781_SPI=m
|
||||
CONFIG_SND_HDA_CODEC_REALTEK=m
|
||||
CONFIG_SND_HDA_CODEC_ANALOG=m
|
||||
CONFIG_SND_HDA_CODEC_SIGMATEL=m
|
||||
@ -8034,6 +8077,7 @@ CONFIG_SND_AMD_ASOC_ACP70=m
|
||||
CONFIG_SND_SOC_AMD_LEGACY_MACH=m
|
||||
CONFIG_SND_SOC_AMD_SOF_MACH=m
|
||||
CONFIG_SND_SOC_AMD_SOF_SDW_MACH=m
|
||||
CONFIG_SND_SOC_AMD_LEGACY_SDW_MACH=m
|
||||
|
||||
##
|
||||
## file: sound/soc/atmel/Kconfig
|
||||
@ -8052,6 +8096,7 @@ CONFIG_SND_BCM63XX_I2S_WHISTLER=m
|
||||
CONFIG_SND_SOC_AC97_CODEC=m
|
||||
CONFIG_SND_SOC_ADAU1372_I2C=m
|
||||
CONFIG_SND_SOC_ADAU1372_SPI=m
|
||||
CONFIG_SND_SOC_ADAU1373=m
|
||||
CONFIG_SND_SOC_ADAU1701=m
|
||||
CONFIG_SND_SOC_ADAU1761_I2C=m
|
||||
CONFIG_SND_SOC_ADAU1761_SPI=m
|
||||
@ -8072,6 +8117,7 @@ CONFIG_SND_SOC_ALC5623=m
|
||||
CONFIG_SND_SOC_AW8738=m
|
||||
CONFIG_SND_SOC_AW88395=m
|
||||
CONFIG_SND_SOC_AW88261=m
|
||||
CONFIG_SND_SOC_AW88081=m
|
||||
CONFIG_SND_SOC_AW87390=m
|
||||
CONFIG_SND_SOC_AW88399=m
|
||||
CONFIG_SND_SOC_BD28623=m
|
||||
@ -8100,6 +8146,7 @@ CONFIG_SND_SOC_CS42L52=m
|
||||
CONFIG_SND_SOC_CS42L56=m
|
||||
CONFIG_SND_SOC_CS42L73=m
|
||||
CONFIG_SND_SOC_CS42L83=m
|
||||
CONFIG_SND_SOC_CS42L84=m
|
||||
CONFIG_SND_SOC_CS4234=m
|
||||
CONFIG_SND_SOC_CS4265=m
|
||||
CONFIG_SND_SOC_CS4270=m
|
||||
@ -8118,6 +8165,7 @@ CONFIG_SND_SOC_ES7134=m
|
||||
CONFIG_SND_SOC_ES7241=m
|
||||
CONFIG_SND_SOC_ES8311=m
|
||||
CONFIG_SND_SOC_ES8316=m
|
||||
CONFIG_SND_SOC_ES8323=m
|
||||
CONFIG_SND_SOC_ES8326=m
|
||||
CONFIG_SND_SOC_ES8328_I2C=m
|
||||
CONFIG_SND_SOC_ES8328_SPI=m
|
||||
@ -8174,6 +8222,7 @@ CONFIG_SND_SOC_RT711_SDW=m
|
||||
CONFIG_SND_SOC_RT711_SDCA_SDW=m
|
||||
CONFIG_SND_SOC_RT712_SDCA_SDW=m
|
||||
CONFIG_SND_SOC_RT712_SDCA_DMIC_SDW=m
|
||||
CONFIG_SND_SOC_RT721_SDCA_SDW=m
|
||||
CONFIG_SND_SOC_RT722_SDCA_SDW=m
|
||||
CONFIG_SND_SOC_RT715_SDW=m
|
||||
CONFIG_SND_SOC_RT715_SDCA_SDW=m
|
||||
@ -8184,6 +8233,7 @@ CONFIG_SND_SOC_SGTL5000=m
|
||||
CONFIG_SND_SOC_SIMPLE_AMPLIFIER=m
|
||||
CONFIG_SND_SOC_SIMPLE_MUX=m
|
||||
CONFIG_SND_SOC_SMA1303=m
|
||||
CONFIG_SND_SOC_SMA1307=m
|
||||
CONFIG_SND_SOC_SPDIF=m
|
||||
CONFIG_SND_SOC_SRC4XXX_I2C=m
|
||||
CONFIG_SND_SOC_SSM2305=m
|
||||
@ -8222,6 +8272,7 @@ CONFIG_SND_SOC_TS3A227E=m
|
||||
CONFIG_SND_SOC_TSCS42XX=m
|
||||
CONFIG_SND_SOC_TSCS454=m
|
||||
CONFIG_SND_SOC_UDA1334=m
|
||||
CONFIG_SND_SOC_UDA1342=m
|
||||
CONFIG_SND_SOC_WCD9335=m
|
||||
CONFIG_SND_SOC_WCD934X=m
|
||||
CONFIG_SND_SOC_WCD937X_SDW=m
|
||||
@ -8268,6 +8319,8 @@ CONFIG_SND_SOC_NAU8810=m
|
||||
CONFIG_SND_SOC_NAU8821=m
|
||||
CONFIG_SND_SOC_NAU8822=m
|
||||
CONFIG_SND_SOC_NAU8824=m
|
||||
CONFIG_SND_SOC_NTP8918=m
|
||||
CONFIG_SND_SOC_NTP8835=m
|
||||
CONFIG_SND_SOC_TPA6130A2=m
|
||||
CONFIG_SND_SOC_LPASS_WSA_MACRO=m
|
||||
CONFIG_SND_SOC_LPASS_VA_MACRO=m
|
||||
@ -8504,6 +8557,7 @@ CONFIG_ACPI_ADXL=y
|
||||
CONFIG_ACPI_NHLT=y
|
||||
CONFIG_ACPI_PLATFORM_PROFILE=m
|
||||
CONFIG_AMD_ATL_PRM=y
|
||||
CONFIG_AMD_HSMP=m
|
||||
CONFIG_ASN1_ENCODER=m
|
||||
CONFIG_ASYNC_MEMCPY=m
|
||||
CONFIG_ASYNC_PQ=m
|
||||
@ -8554,7 +8608,7 @@ CONFIG_CARL9170_WPC=y
|
||||
CONFIG_CB710_DEBUG_ASSUMPTIONS=y
|
||||
CONFIG_CEC_CORE=m
|
||||
CONFIG_CEC_NOTIFIER=y
|
||||
CONFIG_CFG80211_WEXT_EXPORT=y
|
||||
CONFIG_CEC_PIN=y
|
||||
CONFIG_CHECK_SIGNATURE=y
|
||||
CONFIG_CHELSIO_LIB=m
|
||||
CONFIG_CLOSURES=y
|
||||
@ -8562,7 +8616,6 @@ CONFIG_COMPAT_NETLINK_MESSAGES=y
|
||||
CONFIG_CRYPTO_DEV_ATMEL_I2C=m
|
||||
CONFIG_CRYPTO_DEV_NITROX=m
|
||||
CONFIG_CRYPTO_DEV_QAT=m
|
||||
CONFIG_CRYPTO_ECC=y
|
||||
CONFIG_CRYPTO_LIB_AESCFB=y
|
||||
CONFIG_CRYPTO_LIB_ARC4=m
|
||||
CONFIG_CXL_PORT=m
|
||||
@ -8578,24 +8631,32 @@ CONFIG_DRM_ANALOGIX_DP=m
|
||||
CONFIG_DRM_AUX_BRIDGE=m
|
||||
CONFIG_DRM_AUX_HPD_BRIDGE=m
|
||||
CONFIG_DRM_BRIDGE=y
|
||||
CONFIG_DRM_BRIDGE_CONNECTOR=y
|
||||
CONFIG_DRM_BUDDY=m
|
||||
CONFIG_DRM_CLIENT_SELECTION=y
|
||||
CONFIG_DRM_CLIENT=y
|
||||
CONFIG_DRM_CLIENT_DEFAULT="fbdev"
|
||||
CONFIG_DRM_CLIENT_LIB=m
|
||||
CONFIG_DRM_CLIENT_SELECTION=m
|
||||
CONFIG_DRM_CLIENT_SETUP=y
|
||||
CONFIG_DRM_DISPLAY_DP_AUX_BUS=m
|
||||
CONFIG_DRM_DISPLAY_DP_HELPER=y
|
||||
CONFIG_DRM_DISPLAY_DP_TUNNEL=y
|
||||
CONFIG_DRM_DISPLAY_DSC_HELPER=y
|
||||
CONFIG_DRM_DISPLAY_HDCP_HELPER=y
|
||||
CONFIG_DRM_DISPLAY_HDMI_AUDIO_HELPER=y
|
||||
CONFIG_DRM_DISPLAY_HDMI_HELPER=y
|
||||
CONFIG_DRM_DISPLAY_HDMI_STATE_HELPER=y
|
||||
CONFIG_DRM_DISPLAY_HELPER=m
|
||||
CONFIG_DRM_EXEC=m
|
||||
CONFIG_DRM_GEM_DMA_HELPER=m
|
||||
CONFIG_DRM_GEM_SHMEM_HELPER=m
|
||||
CONFIG_DRM_GPUVM=m
|
||||
CONFIG_DRM_I915_GVT=y
|
||||
CONFIG_DRM_KMS_HELPER=y
|
||||
CONFIG_DRM_KMS_HELPER=m
|
||||
CONFIG_DRM_MIPI_DBI=m
|
||||
CONFIG_DRM_MIPI_DSI=y
|
||||
CONFIG_DRM_PANEL=y
|
||||
CONFIG_DRM_PANEL_BACKLIGHT_QUIRKS=m
|
||||
CONFIG_DRM_PANEL_BRIDGE=y
|
||||
CONFIG_DRM_PRIVACY_SCREEN=y
|
||||
CONFIG_DRM_SCHED=m
|
||||
@ -8604,7 +8665,7 @@ CONFIG_DRM_TTM=m
|
||||
CONFIG_DRM_TTM_HELPER=m
|
||||
CONFIG_DRM_VRAM_HELPER=m
|
||||
CONFIG_DTC=y
|
||||
CONFIG_FB_BACKLIGHT=m
|
||||
CONFIG_FB_BACKLIGHT=y
|
||||
CONFIG_FB_DMAMEM_HELPERS=y
|
||||
CONFIG_FB_DMAMEM_HELPERS_DEFERRED=y
|
||||
CONFIG_FUN_CORE=m
|
||||
@ -8617,6 +8678,8 @@ CONFIG_GENERIC_PINCONF=y
|
||||
CONFIG_GENERIC_PINCTRL_GROUPS=y
|
||||
CONFIG_GENERIC_PINMUX_FUNCTIONS=y
|
||||
CONFIG_GNSS_SERIAL=m
|
||||
CONFIG_GPIB_NEC7210=m
|
||||
CONFIG_GPIB_TMS9914=m
|
||||
CONFIG_GPIOLIB_IRQCHIP=y
|
||||
CONFIG_GPIO_ACPI=y
|
||||
CONFIG_GPIO_GENERIC=y
|
||||
@ -8650,6 +8713,7 @@ CONFIG_INTEL_UNCORE_FREQ_CONTROL_TPMI=m
|
||||
CONFIG_INTEL_WMI=y
|
||||
CONFIG_INTERVAL_TREE_SPAN_ITER=y
|
||||
CONFIG_IOMMUFD_DRIVER=y
|
||||
CONFIG_IOMMUFD_DRIVER_CORE=y
|
||||
CONFIG_IOMMU_HELPER=y
|
||||
CONFIG_IPMI_DMI_DECODE=y
|
||||
CONFIG_IPMI_PLAT_DATA=y
|
||||
@ -8663,10 +8727,6 @@ CONFIG_IWLWIFI_LEDS=y
|
||||
CONFIG_IWLWIFI_OPMODE_MODULAR=y
|
||||
CONFIG_KVM_EXTERNAL_WRITE_TRACKING=y
|
||||
CONFIG_LEDS_EXPRESSWIRE=y
|
||||
CONFIG_LIB80211=m
|
||||
CONFIG_LIB80211_CRYPT_CCMP=m
|
||||
CONFIG_LIB80211_CRYPT_TKIP=m
|
||||
CONFIG_LIB80211_CRYPT_WEP=m
|
||||
CONFIG_LIBETH=m
|
||||
CONFIG_LIBFDT=y
|
||||
CONFIG_LIBIPW=m
|
||||
@ -8701,6 +8761,7 @@ CONFIG_MFD_TPS65912=m
|
||||
CONFIG_MFD_TPS6594=m
|
||||
CONFIG_MFD_WM831X=y
|
||||
CONFIG_MFD_WM8350=y
|
||||
CONFIG_MICROCHIP_PHY_RDS_PTP=m
|
||||
CONFIG_MII=m
|
||||
CONFIG_MISC_RTSX=m
|
||||
CONFIG_MISDN_IPAC=m
|
||||
@ -8733,6 +8794,7 @@ CONFIG_MTD_NAND_CORE=m
|
||||
CONFIG_MTD_NAND_DENALI=m
|
||||
CONFIG_MTD_NAND_ECC=y
|
||||
CONFIG_MTD_SM_COMMON=m
|
||||
CONFIG_MTK_NET_PHYLIB=m
|
||||
CONFIG_MULTIPLEXER=m
|
||||
CONFIG_ND_BTT=y
|
||||
CONFIG_ND_PFN=y
|
||||
@ -8751,7 +8813,6 @@ CONFIG_OF_ADDRESS=y
|
||||
CONFIG_OF_EARLY_FLATTREE=y
|
||||
CONFIG_OF_FLATTREE=y
|
||||
CONFIG_OF_GPIO=y
|
||||
CONFIG_OF_GPIO_MM_GPIOCHIP=y
|
||||
CONFIG_OF_IOMMU=y
|
||||
CONFIG_OF_IRQ=y
|
||||
CONFIG_OF_KOBJ=y
|
||||
@ -8793,7 +8854,10 @@ CONFIG_PM_OPP=y
|
||||
CONFIG_PM_SLEEP_DEBUG=y
|
||||
CONFIG_POLYNOMIAL=m
|
||||
CONFIG_PPPOE_HASH_BITS=4
|
||||
CONFIG_PREEMPT_VOLUNTARY_BUILD=y
|
||||
CONFIG_PREEMPTION=y
|
||||
CONFIG_PREEMPT_BUILD=y
|
||||
CONFIG_PREEMPT_COUNT=y
|
||||
CONFIG_PREEMPT_RCU=y
|
||||
CONFIG_PWM_DWC_CORE=m
|
||||
CONFIG_PWM_LPSS=m
|
||||
CONFIG_QCA7000=m
|
||||
@ -8805,10 +8869,12 @@ CONFIG_QTNFMAC=m
|
||||
CONFIG_R8169_LEDS=y
|
||||
CONFIG_RAID6_PQ=m
|
||||
CONFIG_RATIONAL=y
|
||||
CONFIG_REALTEK_PHY_HWMON=y
|
||||
CONFIG_REBOOT_MODE=m
|
||||
CONFIG_REED_SOLOMON_DEC16=y
|
||||
CONFIG_REGMAP=y
|
||||
CONFIG_REGMAP_I2C=y
|
||||
CONFIG_REGMAP_I3C=m
|
||||
CONFIG_REGMAP_IRQ=y
|
||||
CONFIG_REGMAP_MMIO=y
|
||||
CONFIG_REGMAP_SLIMBUS=m
|
||||
@ -8847,10 +8913,14 @@ CONFIG_RTLWIFI_USB=m
|
||||
CONFIG_RTW88_8703B=m
|
||||
CONFIG_RTW88_8723D=m
|
||||
CONFIG_RTW88_8723X=m
|
||||
CONFIG_RTW88_8812A=m
|
||||
CONFIG_RTW88_8821A=m
|
||||
CONFIG_RTW88_8821C=m
|
||||
CONFIG_RTW88_8822B=m
|
||||
CONFIG_RTW88_8822C=m
|
||||
CONFIG_RTW88_88XXA=m
|
||||
CONFIG_RTW88_CORE=m
|
||||
CONFIG_RTW88_LEDS=y
|
||||
CONFIG_RTW88_PCI=m
|
||||
CONFIG_RTW88_SDIO=m
|
||||
CONFIG_RTW88_USB=m
|
||||
@ -8880,6 +8950,7 @@ CONFIG_SLHC=m
|
||||
CONFIG_SMBFS=m
|
||||
CONFIG_SND_AC97_CODEC=m
|
||||
CONFIG_SND_AMD_SOUNDWIRE_ACPI=m
|
||||
CONFIG_SND_COMPRESS_ACCEL=y
|
||||
CONFIG_SND_COMPRESS_OFFLOAD=m
|
||||
CONFIG_SND_CTL_LED=m
|
||||
CONFIG_SND_DMAENGINE_PCM=m
|
||||
@ -8924,6 +8995,7 @@ CONFIG_SND_SOC_AC97_BUS=y
|
||||
CONFIG_SND_SOC_ACPI=m
|
||||
CONFIG_SND_SOC_ACPI_AMD_MATCH=m
|
||||
CONFIG_SND_SOC_ACPI_INTEL_MATCH=m
|
||||
CONFIG_SND_SOC_ACPI_INTEL_SDCA_QUIRKS=m
|
||||
CONFIG_SND_SOC_ADAU1372=m
|
||||
CONFIG_SND_SOC_ADAU1761=m
|
||||
CONFIG_SND_SOC_ADAU17X1=m
|
||||
@ -8934,6 +9006,7 @@ CONFIG_SND_SOC_AMD_ACP_LEGACY_COMMON=m
|
||||
CONFIG_SND_SOC_AMD_ACP_PCM=m
|
||||
CONFIG_SND_SOC_AMD_ACP_PDM=m
|
||||
CONFIG_SND_SOC_AMD_MACH_COMMON=m
|
||||
CONFIG_SND_SOC_AMD_SDW_MACH_COMMON=m
|
||||
CONFIG_SND_SOC_AMD_SOUNDWIRE_LINK_BASELINE=m
|
||||
CONFIG_SND_SOC_ARIZONA=m
|
||||
CONFIG_SND_SOC_AW88395_LIB=m
|
||||
@ -8966,6 +9039,7 @@ CONFIG_SND_SOC_INTEL_SOF_REALTEK_COMMON=m
|
||||
CONFIG_SND_SOC_LPASS_MACRO_COMMON=m
|
||||
CONFIG_SND_SOC_MAX98373=m
|
||||
CONFIG_SND_SOC_NAU8825=m
|
||||
CONFIG_SND_SOC_NTPFW=m
|
||||
CONFIG_SND_SOC_PCM1789=m
|
||||
CONFIG_SND_SOC_PCM179X=m
|
||||
CONFIG_SND_SOC_PCM186X=m
|
||||
@ -8996,6 +9070,9 @@ CONFIG_SND_SOC_RT5682_I2C=m
|
||||
CONFIG_SND_SOC_RT700=m
|
||||
CONFIG_SND_SOC_RT711=m
|
||||
CONFIG_SND_SOC_RT715=m
|
||||
CONFIG_SND_SOC_RT_SDW_COMMON=m
|
||||
CONFIG_SND_SOC_SDCA=m
|
||||
CONFIG_SND_SOC_SDCA_OPTIONAL=m
|
||||
CONFIG_SND_SOC_SDW_UTILS=m
|
||||
CONFIG_SND_SOC_SIGMADSP=m
|
||||
CONFIG_SND_SOC_SIGMADSP_I2C=m
|
||||
@ -9070,10 +9147,12 @@ CONFIG_SSB_PCIHOST_POSSIBLE=y
|
||||
CONFIG_SSB_SDIOHOST_POSSIBLE=y
|
||||
CONFIG_SSB_SPROM=y
|
||||
CONFIG_SUNGEM_PHY=m
|
||||
CONFIG_TASKS_RCU=y
|
||||
CONFIG_TCG_TIS_CORE=y
|
||||
CONFIG_TCG_TIS_ST33ZP24=m
|
||||
CONFIG_TRACER_MAX_TRACE=y
|
||||
CONFIG_TRACING_MAP=y
|
||||
CONFIG_UNINLINE_SPIN_UNLOCK=y
|
||||
CONFIG_USB_ARCH_HAS_HCD=y
|
||||
CONFIG_USB_CDNS_HOST=y
|
||||
CONFIG_USB_COMMON=m
|
||||
@ -9134,7 +9213,6 @@ CONFIG_VMAP_PFN=y
|
||||
CONFIG_WEXT_CORE=y
|
||||
CONFIG_WEXT_PRIV=y
|
||||
CONFIG_WEXT_PROC=y
|
||||
CONFIG_WEXT_SPY=y
|
||||
CONFIG_WILC1000=m
|
||||
CONFIG_WIRELESS_EXT=y
|
||||
CONFIG_X86_ESPFIX64=y
|
||||
|
126
debian/config/amd64/config.vm
vendored
126
debian/config/amd64/config.vm
vendored
@ -115,7 +115,6 @@ CONFIG_XEN_PV_MSR_SAFE=y
|
||||
## file: crypto/Kconfig
|
||||
##
|
||||
CONFIG_CRYPTO_ECDH=m
|
||||
CONFIG_CRYPTO_ECDSA=m
|
||||
CONFIG_CRYPTO_CTS=m
|
||||
CONFIG_CRYPTO_XTS=m
|
||||
CONFIG_CRYPTO_DEFLATE=m
|
||||
@ -410,6 +409,7 @@ CONFIG_PM_DEVFREQ_EVENT=y
|
||||
##
|
||||
## file: drivers/dma/amd/Kconfig
|
||||
##
|
||||
# CONFIG_AMD_PTDMA is not set
|
||||
# CONFIG_AMD_QDMA is not set
|
||||
|
||||
##
|
||||
@ -428,11 +428,6 @@ CONFIG_PM_DEVFREQ_EVENT=y
|
||||
##
|
||||
# CONFIG_INTEL_LDMA is not set
|
||||
|
||||
##
|
||||
## file: drivers/dma/ptdma/Kconfig
|
||||
##
|
||||
# CONFIG_AMD_PTDMA is not set
|
||||
|
||||
##
|
||||
## file: drivers/dma/qcom/Kconfig
|
||||
##
|
||||
@ -530,12 +525,15 @@ CONFIG_GPIOLIB_FASTPATH_LIMIT=512
|
||||
CONFIG_GPIO_SYSFS=y
|
||||
CONFIG_GPIO_CDEV=y
|
||||
CONFIG_GPIO_CDEV_V1=y
|
||||
# CONFIG_GPIO_ALTERA is not set
|
||||
# CONFIG_GPIO_AMDPT is not set
|
||||
# CONFIG_GPIO_DWAPB is not set
|
||||
CONFIG_GPIO_GENERIC_PLATFORM=m
|
||||
# CONFIG_GPIO_GRANITERAPIDS is not set
|
||||
CONFIG_GPIO_ICH=m
|
||||
# CONFIG_GPIO_MB86S7X is not set
|
||||
# CONFIG_GPIO_POLARFIRE_SOC is not set
|
||||
# CONFIG_GPIO_XILINX is not set
|
||||
# CONFIG_GPIO_AMD_FCH is not set
|
||||
# CONFIG_GPIO_VX855 is not set
|
||||
# CONFIG_GPIO_F7188X is not set
|
||||
@ -559,6 +557,7 @@ CONFIG_GPIO_SCH=m
|
||||
# CONFIG_GPIO_PCI_IDIO_16 is not set
|
||||
# CONFIG_GPIO_PCIE_IDIO_24 is not set
|
||||
# CONFIG_GPIO_RDC321X is not set
|
||||
# CONFIG_GPIO_MPSSE is not set
|
||||
CONFIG_GPIO_AGGREGATOR=m
|
||||
# CONFIG_GPIO_LATCH is not set
|
||||
CONFIG_GPIO_MOCKUP=m
|
||||
@ -575,9 +574,6 @@ CONFIG_DRM=y
|
||||
# CONFIG_DRM_PANIC is not set
|
||||
# CONFIG_DRM_DEBUG_DP_MST_TOPOLOGY_REFS is not set
|
||||
# CONFIG_DRM_DEBUG_MODESET_LOCK is not set
|
||||
CONFIG_DRM_FBDEV_EMULATION=y
|
||||
CONFIG_DRM_FBDEV_OVERALLOC=100
|
||||
# CONFIG_DRM_FBDEV_LEAK_PHYS_SMEM is not set
|
||||
CONFIG_DRM_LOAD_EDID_FIRMWARE=y
|
||||
CONFIG_DRM_VGEM=m
|
||||
CONFIG_DRM_HYPERV=m
|
||||
@ -598,6 +594,17 @@ CONFIG_DRM_HYPERV=m
|
||||
##
|
||||
# CONFIG_DRM_ANALOGIX_ANX78XX is not set
|
||||
|
||||
##
|
||||
## file: drivers/gpu/drm/clients/Kconfig
|
||||
##
|
||||
CONFIG_DRM_FBDEV_EMULATION=y
|
||||
CONFIG_DRM_FBDEV_OVERALLOC=100
|
||||
# CONFIG_DRM_FBDEV_LEAK_PHYS_SMEM is not set
|
||||
# CONFIG_DRM_CLIENT_LOG is not set
|
||||
## choice: Default DRM Client
|
||||
CONFIG_DRM_CLIENT_DEFAULT_FBDEV=y
|
||||
## end choice
|
||||
|
||||
##
|
||||
## file: drivers/gpu/drm/etnaviv/Kconfig
|
||||
##
|
||||
@ -613,6 +620,11 @@ CONFIG_DRM_HYPERV=m
|
||||
##
|
||||
# CONFIG_DRM_GUD is not set
|
||||
|
||||
##
|
||||
## file: drivers/gpu/drm/hisilicon/hibmc/Kconfig
|
||||
##
|
||||
# CONFIG_DRM_HISI_HIBMC is not set
|
||||
|
||||
##
|
||||
## file: drivers/gpu/drm/i2c/Kconfig
|
||||
##
|
||||
@ -743,6 +755,7 @@ CONFIG_HID_GENERIC=m
|
||||
# CONFIG_HID_VIVALDI is not set
|
||||
# CONFIG_HID_KEYTOUCH is not set
|
||||
# CONFIG_HID_KYE is not set
|
||||
# CONFIG_HID_KYSONA is not set
|
||||
# CONFIG_HID_UCLOGIC is not set
|
||||
# CONFIG_HID_WALTOP is not set
|
||||
# CONFIG_HID_VIEWSONIC is not set
|
||||
@ -827,6 +840,11 @@ CONFIG_I2C_HID_OF=m
|
||||
##
|
||||
# CONFIG_INTEL_ISH_HID is not set
|
||||
|
||||
##
|
||||
## file: drivers/hid/intel-thc-hid/Kconfig
|
||||
##
|
||||
# CONFIG_INTEL_THC_HID is not set
|
||||
|
||||
##
|
||||
## file: drivers/hid/usbhid/Kconfig
|
||||
##
|
||||
@ -912,6 +930,7 @@ CONFIG_HWMON=y
|
||||
# CONFIG_SENSORS_HS3001 is not set
|
||||
# CONFIG_SENSORS_I5500 is not set
|
||||
# CONFIG_SENSORS_CORETEMP is not set
|
||||
# CONFIG_SENSORS_ISL28022 is not set
|
||||
# CONFIG_SENSORS_IT87 is not set
|
||||
# CONFIG_SENSORS_JC42 is not set
|
||||
# CONFIG_SENSORS_POWERZ is not set
|
||||
@ -969,6 +988,7 @@ CONFIG_HWMON=y
|
||||
# CONFIG_SENSORS_NCT6683 is not set
|
||||
# CONFIG_SENSORS_NCT6775 is not set
|
||||
# CONFIG_SENSORS_NCT6775_I2C is not set
|
||||
# CONFIG_SENSORS_NCT7363 is not set
|
||||
# CONFIG_SENSORS_NCT7802 is not set
|
||||
# CONFIG_SENSORS_NCT7904 is not set
|
||||
# CONFIG_SENSORS_NPCM7XX is not set
|
||||
@ -1049,6 +1069,7 @@ CONFIG_SENSORS_PMBUS=m
|
||||
# CONFIG_SENSORS_ADP1050 is not set
|
||||
# CONFIG_SENSORS_BEL_PFE is not set
|
||||
# CONFIG_SENSORS_BPA_RS600 is not set
|
||||
# CONFIG_SENSORS_CRPS is not set
|
||||
# CONFIG_SENSORS_DELTA_AHE50DC_FAN is not set
|
||||
# CONFIG_SENSORS_FSP_3Y is not set
|
||||
# CONFIG_SENSORS_DPS920AB is not set
|
||||
@ -1089,6 +1110,7 @@ CONFIG_SENSORS_PMBUS=m
|
||||
# CONFIG_SENSORS_Q54SJ108A2 is not set
|
||||
# CONFIG_SENSORS_STPDDC60 is not set
|
||||
# CONFIG_SENSORS_TDA38640 is not set
|
||||
# CONFIG_SENSORS_TPS25990 is not set
|
||||
# CONFIG_SENSORS_TPS40422 is not set
|
||||
# CONFIG_SENSORS_TPS53679 is not set
|
||||
# CONFIG_SENSORS_TPS546D24 is not set
|
||||
@ -1137,6 +1159,7 @@ CONFIG_I2C_ALGOPCA=m
|
||||
# CONFIG_I2C_AMD756 is not set
|
||||
# CONFIG_I2C_AMD8111 is not set
|
||||
# CONFIG_I2C_AMD_MP2 is not set
|
||||
# CONFIG_I2C_AMD_ASF is not set
|
||||
CONFIG_I2C_I801=m
|
||||
CONFIG_I2C_ISCH=m
|
||||
CONFIG_I2C_ISMT=m
|
||||
@ -1623,6 +1646,7 @@ CONFIG_FUSION_FC=m
|
||||
# CONFIG_MFD_BCM590XX is not set
|
||||
# CONFIG_MFD_BD9571MWV is not set
|
||||
# CONFIG_MFD_AXP20X_I2C is not set
|
||||
# CONFIG_MFD_CGBC is not set
|
||||
# CONFIG_MFD_CS42L43_I2C is not set
|
||||
# CONFIG_MFD_MADERA is not set
|
||||
# CONFIG_PMIC_DA903X is not set
|
||||
@ -1698,6 +1722,8 @@ CONFIG_MFD_INTEL_PMC_BXT=m
|
||||
# CONFIG_MFD_ATC260X_I2C is not set
|
||||
# CONFIG_MFD_CS40L50_I2C is not set
|
||||
# CONFIG_RAVE_SP_CORE is not set
|
||||
# CONFIG_MFD_QNAP_MCU is not set
|
||||
# CONFIG_MFD_UPBOARD_FPGA is not set
|
||||
# CONFIG_MFD_STEAMDECK is not set
|
||||
|
||||
##
|
||||
@ -1780,11 +1806,6 @@ CONFIG_EEPROM_AT24=m
|
||||
##
|
||||
# CONFIG_INTEL_MEI is not set
|
||||
|
||||
##
|
||||
## file: drivers/misc/ti-st/Kconfig
|
||||
##
|
||||
# CONFIG_TI_ST is not set
|
||||
|
||||
##
|
||||
## file: drivers/mmc/Kconfig
|
||||
##
|
||||
@ -1947,6 +1968,11 @@ CONFIG_BE2NET_SKYHAWK=y
|
||||
##
|
||||
# CONFIG_NET_VENDOR_FUNGIBLE is not set
|
||||
|
||||
##
|
||||
## file: drivers/net/ethernet/hisilicon/Kconfig
|
||||
##
|
||||
# CONFIG_NET_VENDOR_HISILICON is not set
|
||||
|
||||
##
|
||||
## file: drivers/net/ethernet/huawei/Kconfig
|
||||
##
|
||||
@ -2237,7 +2263,6 @@ CONFIG_MCTP_TRANSPORT_I2C=m
|
||||
# CONFIG_MARVELL_88Q2XXX_PHY is not set
|
||||
# CONFIG_MARVELL_88X2222_PHY is not set
|
||||
# CONFIG_MAXLINEAR_GPHY is not set
|
||||
# CONFIG_MEDIATEK_GE_PHY is not set
|
||||
# CONFIG_MICREL_PHY is not set
|
||||
# CONFIG_MICROCHIP_T1S_PHY is not set
|
||||
# CONFIG_MICROCHIP_PHY is not set
|
||||
@ -2250,7 +2275,6 @@ CONFIG_MCTP_TRANSPORT_I2C=m
|
||||
# CONFIG_NXP_TJA11XX_PHY is not set
|
||||
# CONFIG_NCN26000_PHY is not set
|
||||
# CONFIG_QSEMI_PHY is not set
|
||||
# CONFIG_REALTEK_PHY is not set
|
||||
# CONFIG_RENESAS_PHY is not set
|
||||
# CONFIG_ROCKCHIP_PHY is not set
|
||||
# CONFIG_SMSC_PHY is not set
|
||||
@ -2271,12 +2295,22 @@ CONFIG_MCTP_TRANSPORT_I2C=m
|
||||
##
|
||||
# CONFIG_AQUANTIA_PHY is not set
|
||||
|
||||
##
|
||||
## file: drivers/net/phy/mediatek/Kconfig
|
||||
##
|
||||
# CONFIG_MEDIATEK_GE_PHY is not set
|
||||
|
||||
##
|
||||
## file: drivers/net/phy/qcom/Kconfig
|
||||
##
|
||||
# CONFIG_QCA83XX_PHY is not set
|
||||
# CONFIG_QCA808X_PHY is not set
|
||||
|
||||
##
|
||||
## file: drivers/net/phy/realtek/Kconfig
|
||||
##
|
||||
# CONFIG_REALTEK_PHY is not set
|
||||
|
||||
##
|
||||
## file: drivers/net/ppp/Kconfig
|
||||
##
|
||||
@ -2367,7 +2401,7 @@ CONFIG_NVME_TARGET_FC=m
|
||||
## file: drivers/pci/Kconfig
|
||||
##
|
||||
CONFIG_XEN_PCIDEV_FRONTEND=m
|
||||
# CONFIG_PCI_P2PDMA is not set
|
||||
CONFIG_PCIE_TPH=y
|
||||
CONFIG_PCI_HYPERV=m
|
||||
|
||||
##
|
||||
@ -2387,6 +2421,7 @@ CONFIG_PCI_HYPERV_INTERFACE=m
|
||||
##
|
||||
# CONFIG_HOTPLUG_PCI_ACPI_IBM is not set
|
||||
# CONFIG_HOTPLUG_PCI_CPCI is not set
|
||||
# CONFIG_HOTPLUG_PCI_OCTEONEP is not set
|
||||
# CONFIG_HOTPLUG_PCI_SHPC is not set
|
||||
|
||||
##
|
||||
@ -2492,10 +2527,15 @@ CONFIG_SERIAL_MULTI_INSTANTIATE=m
|
||||
##
|
||||
## file: drivers/platform/x86/amd/Kconfig
|
||||
##
|
||||
# CONFIG_AMD_HSMP is not set
|
||||
# CONFIG_AMD_3D_VCACHE is not set
|
||||
# CONFIG_AMD_WBRF is not set
|
||||
|
||||
##
|
||||
## file: drivers/platform/x86/amd/hsmp/Kconfig
|
||||
##
|
||||
# CONFIG_AMD_HSMP_ACPI is not set
|
||||
# CONFIG_AMD_HSMP_PLAT is not set
|
||||
|
||||
##
|
||||
## file: drivers/platform/x86/amd/pmc/Kconfig
|
||||
##
|
||||
@ -2611,6 +2651,7 @@ CONFIG_CHARGER_GPIO=m
|
||||
CONFIG_BATTERY_GOLDFISH=m
|
||||
# CONFIG_BATTERY_RT5033 is not set
|
||||
# CONFIG_CHARGER_RT9455 is not set
|
||||
# CONFIG_FUEL_GAUGE_STC3117 is not set
|
||||
# CONFIG_CHARGER_BD99954 is not set
|
||||
# CONFIG_BATTERY_UG3105 is not set
|
||||
# CONFIG_FUEL_GAUGE_MM8013 is not set
|
||||
@ -2783,11 +2824,6 @@ CONFIG_SCSI_MPI3MR=m
|
||||
##
|
||||
# CONFIG_SOC_TI is not set
|
||||
|
||||
##
|
||||
## file: drivers/soundwire/Kconfig
|
||||
##
|
||||
# CONFIG_SOUNDWIRE is not set
|
||||
|
||||
##
|
||||
## file: drivers/spi/Kconfig
|
||||
##
|
||||
@ -2809,25 +2845,15 @@ CONFIG_SCSI_MPI3MR=m
|
||||
CONFIG_STAGING=y
|
||||
|
||||
##
|
||||
## file: drivers/staging/fieldbus/Kconfig
|
||||
## file: drivers/staging/gpib/Kconfig
|
||||
##
|
||||
# CONFIG_FIELDBUS_DEV is not set
|
||||
|
||||
##
|
||||
## file: drivers/staging/gdm724x/Kconfig
|
||||
##
|
||||
# CONFIG_LTE_GDM724X is not set
|
||||
# CONFIG_GPIB is not set
|
||||
|
||||
##
|
||||
## file: drivers/staging/media/Kconfig
|
||||
##
|
||||
# CONFIG_STAGING_MEDIA is not set
|
||||
|
||||
##
|
||||
## file: drivers/staging/rts5208/Kconfig
|
||||
##
|
||||
# CONFIG_RTS5208 is not set
|
||||
|
||||
##
|
||||
## file: drivers/staging/sm750fb/Kconfig
|
||||
##
|
||||
@ -2857,6 +2883,7 @@ CONFIG_THERMAL_DEBUGFS=y
|
||||
# CONFIG_THERMAL_HWMON is not set
|
||||
# CONFIG_THERMAL_GOV_BANG_BANG is not set
|
||||
CONFIG_DEVFREQ_THERMAL=y
|
||||
CONFIG_PCIE_THERMAL=y
|
||||
|
||||
##
|
||||
## file: drivers/thunderbolt/Kconfig
|
||||
@ -3177,7 +3204,6 @@ CONFIG_FB_UVESA=m
|
||||
CONFIG_FB_GOLDFISH=m
|
||||
CONFIG_XEN_FBDEV_FRONTEND=y
|
||||
CONFIG_FB_HYPERV=m
|
||||
# CONFIG_FB_SSD1307 is not set
|
||||
|
||||
##
|
||||
## file: drivers/video/fbdev/core/Kconfig
|
||||
@ -3244,7 +3270,6 @@ CONFIG_SOFT_WATCHDOG_PRETIMEOUT=y
|
||||
# CONFIG_PC87413_WDT is not set
|
||||
# CONFIG_NV_TCO is not set
|
||||
# CONFIG_60XX_WDT is not set
|
||||
# CONFIG_CPU5_WDT is not set
|
||||
# CONFIG_SMSC_SCH311X_WDT is not set
|
||||
# CONFIG_SMSC37B787_WDT is not set
|
||||
# CONFIG_TQMX86_WDT is not set
|
||||
@ -3328,6 +3353,7 @@ CONFIG_BTRFS_FS_POSIX_ACL=y
|
||||
# CONFIG_BTRFS_FS_RUN_SANITY_TESTS is not set
|
||||
# CONFIG_BTRFS_DEBUG is not set
|
||||
# CONFIG_BTRFS_ASSERT is not set
|
||||
# CONFIG_BTRFS_EXPERIMENTAL is not set
|
||||
# CONFIG_BTRFS_FS_REF_VERIFY is not set
|
||||
|
||||
##
|
||||
@ -3502,11 +3528,6 @@ CONFIG_OCFS2_DEBUG_MASKLOG=y
|
||||
##
|
||||
# CONFIG_QNX6FS_FS is not set
|
||||
|
||||
##
|
||||
## file: fs/reiserfs/Kconfig
|
||||
##
|
||||
# CONFIG_REISERFS_FS is not set
|
||||
|
||||
##
|
||||
## file: fs/romfs/Kconfig
|
||||
##
|
||||
@ -3570,7 +3591,7 @@ CONFIG_LOG_CPU_MAX_BUF_SHIFT=12
|
||||
##
|
||||
## choice: Preemption Model
|
||||
# CONFIG_PREEMPT_NONE is not set
|
||||
CONFIG_PREEMPT_VOLUNTARY=y
|
||||
CONFIG_PREEMPT_LAZY=y
|
||||
## end choice
|
||||
# CONFIG_SCHED_CORE is not set
|
||||
|
||||
@ -3604,6 +3625,7 @@ CONFIG_PM_ADVANCED_DEBUG=y
|
||||
##
|
||||
CONFIG_BOOTTIME_TRACING=y
|
||||
CONFIG_FUNCTION_GRAPH_RETVAL=y
|
||||
# CONFIG_PREEMPT_TRACER is not set
|
||||
CONFIG_SCHED_TRACER=y
|
||||
CONFIG_HWLAT_TRACER=y
|
||||
CONFIG_OSNOISE_TRACER=y
|
||||
@ -3630,6 +3652,7 @@ CONFIG_RAID6_PQ_BENCHMARK=y
|
||||
# CONFIG_MEMORY_NOTIFIER_ERROR_INJECT is not set
|
||||
CONFIG_PANIC_TIMEOUT=30
|
||||
CONFIG_WQ_CPU_INTENSIVE_REPORT=y
|
||||
# CONFIG_DEBUG_PREEMPT is not set
|
||||
CONFIG_NMI_CHECK_CPU=y
|
||||
# CONFIG_DEBUG_IRQFLAGS is not set
|
||||
# CONFIG_DEBUG_LIST is not set
|
||||
@ -3672,7 +3695,6 @@ CONFIG_ZSWAP_ZPOOL_DEFAULT_ZBUD=y
|
||||
## end choice
|
||||
CONFIG_ZBUD=y
|
||||
CONFIG_Z3FOLD_DEPRECATED=m
|
||||
CONFIG_MEMORY_HOTPLUG_DEFAULT_ONLINE=y
|
||||
# CONFIG_HWPOISON_INJECT is not set
|
||||
CONFIG_NUMA_EMU=y
|
||||
|
||||
@ -4011,13 +4033,18 @@ CONFIG_ASYNC_RAID6_RECOV=m
|
||||
CONFIG_BLK_CGROUP_PUNT_BIO=y
|
||||
CONFIG_BLK_DEV_RNBD=y
|
||||
CONFIG_CHECK_SIGNATURE=y
|
||||
CONFIG_CRYPTO_ECC=m
|
||||
CONFIG_CRYPTO_LIB_AESCFB=m
|
||||
CONFIG_CRYPTO_LIB_ARC4=m
|
||||
CONFIG_CXL_PORT=y
|
||||
CONFIG_DRM_BRIDGE=y
|
||||
CONFIG_DRM_CLIENT=y
|
||||
CONFIG_DRM_CLIENT_DEFAULT="fbdev"
|
||||
CONFIG_DRM_CLIENT_LIB=m
|
||||
CONFIG_DRM_CLIENT_SELECTION=m
|
||||
CONFIG_DRM_CLIENT_SETUP=y
|
||||
CONFIG_DRM_EXEC=m
|
||||
CONFIG_DRM_GEM_SHMEM_HELPER=m
|
||||
CONFIG_DRM_KMS_HELPER=y
|
||||
CONFIG_DRM_KMS_HELPER=m
|
||||
CONFIG_DRM_PANEL=y
|
||||
CONFIG_DRM_PANEL_BRIDGE=y
|
||||
CONFIG_DRM_TTM=m
|
||||
@ -4064,7 +4091,10 @@ CONFIG_PM_CLK=y
|
||||
CONFIG_PM_OPP=y
|
||||
CONFIG_PM_SLEEP_DEBUG=y
|
||||
CONFIG_PPPOE_HASH_BITS=4
|
||||
CONFIG_PREEMPT_VOLUNTARY_BUILD=y
|
||||
CONFIG_PREEMPTION=y
|
||||
CONFIG_PREEMPT_BUILD=y
|
||||
CONFIG_PREEMPT_COUNT=y
|
||||
CONFIG_PREEMPT_RCU=y
|
||||
CONFIG_RAID6_PQ=m
|
||||
CONFIG_RATIONAL=y
|
||||
CONFIG_REGMAP=y
|
||||
@ -4080,9 +4110,11 @@ CONFIG_SLHC=m
|
||||
CONFIG_SMBFS=m
|
||||
CONFIG_SWIOTLB_XEN=y
|
||||
CONFIG_SYS_HYPERVISOR=y
|
||||
CONFIG_TASKS_RCU=y
|
||||
CONFIG_TCG_TIS_CORE=m
|
||||
CONFIG_TRACER_MAX_TRACE=y
|
||||
CONFIG_TRACING_MAP=y
|
||||
CONFIG_UNINLINE_SPIN_UNLOCK=y
|
||||
CONFIG_USB_ARCH_HAS_HCD=y
|
||||
CONFIG_USB_COMMON=m
|
||||
CONFIG_USB_EHCI_PCI=m
|
||||
|
98
debian/config/config
vendored
98
debian/config/config
vendored
@ -87,6 +87,7 @@ CONFIG_LEGACY_VSYSCALL_NONE=y
|
||||
## end choice
|
||||
# CONFIG_CMDLINE_BOOL is not set
|
||||
# CONFIG_STRICT_SIGALTSTACK_SIZE is not set
|
||||
CONFIG_X86_BUS_LOCK_DETECT=y
|
||||
CONFIG_CPU_MITIGATIONS=y
|
||||
CONFIG_MITIGATION_PAGE_TABLE_ISOLATION=y
|
||||
# CONFIG_MITIGATION_RETPOLINE is not set
|
||||
@ -146,7 +147,8 @@ CONFIG_IA32_EMULATION=y
|
||||
# CONFIG_MSKYLAKE is not set
|
||||
# CONFIG_MSKYLAKEX is not set
|
||||
# CONFIG_MCANNONLAKE is not set
|
||||
# CONFIG_MICELAKE is not set
|
||||
# CONFIG_MICELAKE_CLIENT is not set
|
||||
# CONFIG_MICELAKE_SERVER is not set
|
||||
# CONFIG_MCASCADELAKE is not set
|
||||
# CONFIG_MCOOPERLAKE is not set
|
||||
# CONFIG_MTIGERLAKE is not set
|
||||
@ -227,9 +229,6 @@ CONFIG_CRYPTO_SHA256_SSSE3=m
|
||||
CONFIG_CRYPTO_SHA512_SSSE3=m
|
||||
CONFIG_CRYPTO_SM3_AVX_X86_64=m
|
||||
CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL=m
|
||||
CONFIG_CRYPTO_CRC32C_INTEL=m
|
||||
CONFIG_CRYPTO_CRC32_PCLMUL=m
|
||||
CONFIG_CRYPTO_CRCT10DIF_PCLMUL=m
|
||||
|
||||
##
|
||||
## file: arch/x86/events/Kconfig
|
||||
@ -295,9 +294,9 @@ CONFIG_CMDLINE_PARTITION=y
|
||||
##
|
||||
## file: certs/Kconfig
|
||||
##
|
||||
CONFIG_MODULE_SIG_KEY="certs/signing_key.pem"
|
||||
## choice: Type of module signing key to be generated
|
||||
CONFIG_MODULE_SIG_KEY_TYPE_RSA=y
|
||||
# CONFIG_MODULE_SIG_KEY_TYPE_RSA is not set
|
||||
CONFIG_MODULE_SIG_KEY_TYPE_ECDSA=y
|
||||
## end choice
|
||||
CONFIG_SYSTEM_TRUSTED_KEYRING=y
|
||||
CONFIG_SYSTEM_TRUSTED_KEYS=""
|
||||
@ -318,6 +317,7 @@ CONFIG_CRYPTO_TEST=m
|
||||
CONFIG_CRYPTO_RSA=y
|
||||
CONFIG_CRYPTO_DH=y
|
||||
CONFIG_CRYPTO_DH_RFC7919_GROUPS=y
|
||||
CONFIG_CRYPTO_ECDSA=y
|
||||
CONFIG_CRYPTO_ECRDSA=m
|
||||
CONFIG_CRYPTO_CURVE25519=m
|
||||
CONFIG_CRYPTO_AES=y
|
||||
@ -338,7 +338,6 @@ CONFIG_CRYPTO_CBC=y
|
||||
CONFIG_CRYPTO_CTR=y
|
||||
CONFIG_CRYPTO_ECB=y
|
||||
CONFIG_CRYPTO_HCTR2=m
|
||||
CONFIG_CRYPTO_KEYWRAP=m
|
||||
CONFIG_CRYPTO_LRW=m
|
||||
CONFIG_CRYPTO_PCBC=m
|
||||
CONFIG_CRYPTO_AEGIS128=m
|
||||
@ -363,7 +362,6 @@ CONFIG_CRYPTO_SHA512=y
|
||||
CONFIG_CRYPTO_SHA3=y
|
||||
CONFIG_CRYPTO_SM3_GENERIC=m
|
||||
CONFIG_CRYPTO_STREEBOG=m
|
||||
CONFIG_CRYPTO_VMAC=m
|
||||
CONFIG_CRYPTO_WP512=m
|
||||
CONFIG_CRYPTO_XCBC=m
|
||||
CONFIG_CRYPTO_XXHASH=m
|
||||
@ -404,6 +402,7 @@ CONFIG_ACPI=y
|
||||
CONFIG_ACPI_SPCR_TABLE=y
|
||||
CONFIG_ACPI_FPDT=y
|
||||
CONFIG_ACPI_REV_OVERRIDE_POSSIBLE=y
|
||||
CONFIG_ACPI_EC=y
|
||||
CONFIG_ACPI_BUTTON=y
|
||||
CONFIG_ACPI_FAN=m
|
||||
CONFIG_ACPI_TAD=m
|
||||
@ -795,7 +794,6 @@ CONFIG_INPUT=y
|
||||
CONFIG_INPUT_SPARSEKMAP=m
|
||||
CONFIG_INPUT_MATRIXKMAP=m
|
||||
CONFIG_INPUT_EVDEV=m
|
||||
# CONFIG_INPUT_EVBUG is not set
|
||||
|
||||
##
|
||||
## file: drivers/input/keyboard/Kconfig
|
||||
@ -1134,6 +1132,7 @@ CONFIG_PCI_PF_STUB=m
|
||||
CONFIG_PCI_IOV=y
|
||||
CONFIG_PCI_PRI=y
|
||||
CONFIG_PCI_PASID=y
|
||||
CONFIG_PCI_P2PDMA=y
|
||||
## choice: PCI Express hierarchy optimization setting
|
||||
# CONFIG_PCIE_BUS_TUNE_OFF is not set
|
||||
CONFIG_PCIE_BUS_DEFAULT=y
|
||||
@ -1221,10 +1220,17 @@ CONFIG_PPS_CLIENT_KTIMER=m
|
||||
CONFIG_PPS_CLIENT_LDISC=m
|
||||
CONFIG_PPS_CLIENT_GPIO=m
|
||||
|
||||
##
|
||||
## file: drivers/pps/generators/Kconfig
|
||||
##
|
||||
CONFIG_PPS_GENERATOR=m
|
||||
CONFIG_PPS_GENERATOR_DUMMY=m
|
||||
|
||||
##
|
||||
## file: drivers/ptp/Kconfig
|
||||
##
|
||||
CONFIG_PTP_1588_CLOCK=m
|
||||
CONFIG_PTP_1588_CLOCK_VMCLOCK=m
|
||||
CONFIG_PTP_1588_CLOCK_MOCK=m
|
||||
|
||||
##
|
||||
@ -1532,6 +1538,7 @@ CONFIG_VFIO_PCI=m
|
||||
## file: drivers/vfio/pci/virtio/Kconfig
|
||||
##
|
||||
CONFIG_VIRTIO_VFIO_PCI=m
|
||||
CONFIG_VIRTIO_VFIO_PCI_ADMIN_LEGACY=y
|
||||
|
||||
##
|
||||
## file: drivers/vhost/Kconfig
|
||||
@ -1794,6 +1801,7 @@ CONFIG_FAT_DEFAULT_UTF8=y
|
||||
CONFIG_CUSE=m
|
||||
CONFIG_FUSE_DAX=y
|
||||
CONFIG_FUSE_PASSTHROUGH=y
|
||||
CONFIG_FUSE_IO_URING=y
|
||||
|
||||
##
|
||||
## file: fs/isofs/Kconfig
|
||||
@ -2043,6 +2051,7 @@ CONFIG_FAIR_GROUP_SCHED=y
|
||||
CONFIG_CFS_BANDWIDTH=y
|
||||
CONFIG_CGROUP_PIDS=y
|
||||
CONFIG_CGROUP_RDMA=y
|
||||
CONFIG_CGROUP_DMEM=y
|
||||
CONFIG_CGROUP_FREEZER=y
|
||||
CONFIG_CGROUP_HUGETLB=y
|
||||
CONFIG_CPUSETS=y
|
||||
@ -2124,9 +2133,10 @@ CONFIG_HZ_100=y
|
||||
## file: kernel/Kconfig.preempt
|
||||
##
|
||||
## choice: Preemption Model
|
||||
# CONFIG_PREEMPT_VOLUNTARY is not set
|
||||
# CONFIG_PREEMPT is not set
|
||||
# CONFIG_PREEMPT_RT is not set
|
||||
## end choice
|
||||
# CONFIG_PREEMPT_RT is not set
|
||||
# CONFIG_PREEMPT_DYNAMIC is not set
|
||||
CONFIG_SCHED_CLASS_EXT=y
|
||||
|
||||
@ -2171,17 +2181,23 @@ CONFIG_MODULE_UNLOAD=y
|
||||
CONFIG_MODULE_FORCE_UNLOAD=y
|
||||
# CONFIG_MODULE_UNLOAD_TAINT_TRACKING is not set
|
||||
CONFIG_MODVERSIONS=y
|
||||
## choice: Module versioning implementation
|
||||
CONFIG_GENKSYMS=y
|
||||
# CONFIG_GENDWARFKSYMS is not set
|
||||
## end choice
|
||||
# CONFIG_EXTENDED_MODVERSIONS is not set
|
||||
CONFIG_BASIC_MODVERSIONS=y
|
||||
# CONFIG_MODULE_SRCVERSION_ALL is not set
|
||||
CONFIG_MODULE_SIG=y
|
||||
# CONFIG_MODULE_SIG_FORCE is not set
|
||||
CONFIG_MODULE_SIG_ALL=y
|
||||
## choice: Hash algorithm to sign modules
|
||||
# CONFIG_MODULE_SIG_SHA1 is not set
|
||||
CONFIG_MODULE_SIG_SHA256=y
|
||||
# CONFIG_MODULE_SIG_SHA256 is not set
|
||||
# CONFIG_MODULE_SIG_SHA384 is not set
|
||||
# CONFIG_MODULE_SIG_SHA512 is not set
|
||||
# CONFIG_MODULE_SIG_SHA3_256 is not set
|
||||
# CONFIG_MODULE_SIG_SHA3_384 is not set
|
||||
CONFIG_MODULE_SIG_SHA3_384=y
|
||||
# CONFIG_MODULE_SIG_SHA3_512 is not set
|
||||
## end choice
|
||||
CONFIG_MODULE_COMPRESS=y
|
||||
@ -2252,6 +2268,7 @@ CONFIG_CLOCKSOURCE_WATCHDOG_MAX_SKEW_US=125
|
||||
CONFIG_FTRACE=y
|
||||
CONFIG_FUNCTION_TRACER=y
|
||||
CONFIG_FUNCTION_GRAPH_TRACER=y
|
||||
# CONFIG_FUNCTION_GRAPH_RETADDR is not set
|
||||
CONFIG_DYNAMIC_FTRACE=y
|
||||
CONFIG_FPROBE=y
|
||||
# CONFIG_FUNCTION_PROFILER is not set
|
||||
@ -2297,18 +2314,12 @@ CONFIG_CRC_T10DIF=y
|
||||
CONFIG_CRC64_ROCKSOFT=y
|
||||
CONFIG_CRC_ITU_T=m
|
||||
CONFIG_CRC32=y
|
||||
# CONFIG_CRC32_SELFTEST is not set
|
||||
## choice: CRC32 implementation
|
||||
CONFIG_CRC32_SLICEBY8=y
|
||||
# CONFIG_CRC32_SLICEBY4 is not set
|
||||
# CONFIG_CRC32_SARWATE is not set
|
||||
# CONFIG_CRC32_BIT is not set
|
||||
## end choice
|
||||
CONFIG_CRC64=y
|
||||
CONFIG_CRC4=m
|
||||
CONFIG_CRC7=m
|
||||
CONFIG_LIBCRC32C=y
|
||||
CONFIG_CRC8=m
|
||||
CONFIG_CRC_OPTIMIZATIONS=y
|
||||
# CONFIG_RANDOM32_SELFTEST is not set
|
||||
# CONFIG_GLOB_SELFTEST is not set
|
||||
CONFIG_IRQ_POLL=y
|
||||
@ -2512,6 +2523,12 @@ CONFIG_SHUFFLE_PAGE_ALLOCATOR=y
|
||||
# CONFIG_COMPAT_BRK is not set
|
||||
CONFIG_SPARSEMEM_VMEMMAP=y
|
||||
CONFIG_MEMORY_HOTPLUG=y
|
||||
## choice: Memory Hotplug Default Online Type
|
||||
CONFIG_MHP_DEFAULT_ONLINE_TYPE_OFFLINE=y
|
||||
# CONFIG_MHP_DEFAULT_ONLINE_TYPE_ONLINE_AUTO is not set
|
||||
# CONFIG_MHP_DEFAULT_ONLINE_TYPE_ONLINE_KERNEL is not set
|
||||
# CONFIG_MHP_DEFAULT_ONLINE_TYPE_ONLINE_MOVABLE is not set
|
||||
## end choice
|
||||
CONFIG_MEMORY_HOTREMOVE=y
|
||||
CONFIG_BALLOON_COMPACTION=y
|
||||
CONFIG_COMPACTION=y
|
||||
@ -2548,6 +2565,7 @@ CONFIG_PTE_MARKER_UFFD_WP=y
|
||||
CONFIG_LRU_GEN=y
|
||||
CONFIG_LRU_GEN_ENABLED=y
|
||||
# CONFIG_LRU_GEN_STATS is not set
|
||||
CONFIG_PT_RECLAIM=y
|
||||
|
||||
##
|
||||
## file: mm/Kconfig.debug
|
||||
@ -2593,6 +2611,7 @@ CONFIG_ETHTOOL_NETLINK=y
|
||||
# CONFIG_NET_DEV_REFCNT_TRACKER is not set
|
||||
# CONFIG_NET_NS_REFCNT_TRACKER is not set
|
||||
# CONFIG_DEBUG_NET is not set
|
||||
# CONFIG_DEBUG_NET_SMALL_RTNL is not set
|
||||
|
||||
##
|
||||
## file: net/8021q/Kconfig
|
||||
@ -2627,6 +2646,7 @@ CONFIG_NF_TABLES_BRIDGE=m
|
||||
CONFIG_NFT_BRIDGE_META=m
|
||||
CONFIG_NFT_BRIDGE_REJECT=m
|
||||
CONFIG_NF_CONNTRACK_BRIDGE=m
|
||||
# CONFIG_BRIDGE_NF_EBTABLES_LEGACY is not set
|
||||
# CONFIG_BRIDGE_NF_EBTABLES is not set
|
||||
|
||||
##
|
||||
@ -2731,6 +2751,7 @@ CONFIG_TCP_MD5SIG=y
|
||||
##
|
||||
## file: net/ipv4/netfilter/Kconfig
|
||||
##
|
||||
CONFIG_IP_NF_IPTABLES_LEGACY=m
|
||||
CONFIG_NF_SOCKET_IPV4=m
|
||||
CONFIG_NF_TPROXY_IPV4=m
|
||||
CONFIG_NF_TABLES_IPV4=y
|
||||
@ -2759,6 +2780,7 @@ CONFIG_IP_NF_TARGET_ECN=m
|
||||
# CONFIG_IP_NF_TARGET_TTL is not set
|
||||
CONFIG_IP_NF_RAW=m
|
||||
CONFIG_IP_NF_SECURITY=m
|
||||
CONFIG_IP_NF_ARPTABLES=m
|
||||
CONFIG_IP_NF_ARPFILTER=m
|
||||
CONFIG_IP_NF_ARP_MANGLE=m
|
||||
|
||||
@ -2793,6 +2815,7 @@ CONFIG_IPV6_SEG6_HMAC=y
|
||||
##
|
||||
## file: net/ipv6/netfilter/Kconfig
|
||||
##
|
||||
CONFIG_IP6_NF_IPTABLES_LEGACY=m
|
||||
CONFIG_NF_SOCKET_IPV6=m
|
||||
CONFIG_NF_TPROXY_IPV6=m
|
||||
CONFIG_NF_TABLES_IPV6=y
|
||||
@ -3126,6 +3149,7 @@ CONFIG_TLS_DEVICE=y
|
||||
## file: net/unix/Kconfig
|
||||
##
|
||||
CONFIG_UNIX=y
|
||||
CONFIG_AF_UNIX_OOB=y
|
||||
CONFIG_UNIX_DIAG=y
|
||||
|
||||
##
|
||||
@ -3154,6 +3178,7 @@ CONFIG_XFRM_MIGRATE=y
|
||||
CONFIG_XFRM_STATISTICS=y
|
||||
CONFIG_NET_KEY=m
|
||||
CONFIG_NET_KEY_MIGRATE=y
|
||||
CONFIG_XFRM_IPTFS=m
|
||||
|
||||
##
|
||||
## file: samples/Kconfig
|
||||
@ -3324,8 +3349,8 @@ CONFIG_ACPI_THERMAL_LIB=y
|
||||
CONFIG_ACPI_THERMAL_REL=m
|
||||
CONFIG_ACPI_VIOT=y
|
||||
CONFIG_ACPI_WATCHDOG=y
|
||||
CONFIG_AF_UNIX_OOB=y
|
||||
CONFIG_AMD_NB=y
|
||||
CONFIG_AMD_NODE=y
|
||||
CONFIG_APERTURE_HELPERS=y
|
||||
CONFIG_ARCH_CLOCKSOURCE_INIT=y
|
||||
CONFIG_ARCH_CONFIGURES_CPU_MITIGATIONS=y
|
||||
@ -3346,6 +3371,8 @@ CONFIG_ARCH_HAS_CPU_CACHE_INVALIDATE_MEMREGION=y
|
||||
CONFIG_ARCH_HAS_CPU_FINALIZE_INIT=y
|
||||
CONFIG_ARCH_HAS_CPU_PASID=y
|
||||
CONFIG_ARCH_HAS_CPU_RELAX=y
|
||||
CONFIG_ARCH_HAS_CRC32=y
|
||||
CONFIG_ARCH_HAS_CRC_T10DIF=y
|
||||
CONFIG_ARCH_HAS_CURRENT_STACK_POINTER=y
|
||||
CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y
|
||||
CONFIG_ARCH_HAS_DEBUG_VM_PGTABLE=y
|
||||
@ -3370,6 +3397,7 @@ CONFIG_ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE=y
|
||||
CONFIG_ARCH_HAS_PARANOID_L1D_FLUSH=y
|
||||
CONFIG_ARCH_HAS_PKEYS=y
|
||||
CONFIG_ARCH_HAS_PMEM_API=y
|
||||
CONFIG_ARCH_HAS_PREEMPT_LAZY=y
|
||||
CONFIG_ARCH_HAS_PTE_DEVMAP=y
|
||||
CONFIG_ARCH_HAS_PTE_SPECIAL=y
|
||||
CONFIG_ARCH_HAS_SET_DIRECT_MAP=y
|
||||
@ -3401,6 +3429,7 @@ CONFIG_ARCH_SPARSEMEM_ENABLE=y
|
||||
CONFIG_ARCH_STACKWALK=y
|
||||
CONFIG_ARCH_SUPPORTS_ACPI=y
|
||||
CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y
|
||||
CONFIG_ARCH_SUPPORTS_AUTOFDO_CLANG=y
|
||||
CONFIG_ARCH_SUPPORTS_CFI_CLANG=y
|
||||
CONFIG_ARCH_SUPPORTS_CRASH_DUMP=y
|
||||
CONFIG_ARCH_SUPPORTS_CRASH_HOTPLUG=y
|
||||
@ -3422,6 +3451,8 @@ CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y
|
||||
CONFIG_ARCH_SUPPORTS_PAGE_TABLE_CHECK=y
|
||||
CONFIG_ARCH_SUPPORTS_PER_VMA_LOCK=y
|
||||
CONFIG_ARCH_SUPPORTS_PMD_PFNMAP=y
|
||||
CONFIG_ARCH_SUPPORTS_PROPELLER_CLANG=y
|
||||
CONFIG_ARCH_SUPPORTS_PT_RECLAIM=y
|
||||
CONFIG_ARCH_SUPPORTS_PUD_PFNMAP=y
|
||||
CONFIG_ARCH_SUPPORTS_RT=y
|
||||
CONFIG_ARCH_SUPPORTS_UPROBES=y
|
||||
@ -3474,6 +3505,7 @@ CONFIG_BOOT_VESA_SUPPORT=y
|
||||
CONFIG_BPF=y
|
||||
CONFIG_BPF_EVENTS=y
|
||||
CONFIG_BPF_JIT_DEFAULT_ON=y
|
||||
CONFIG_BROADCAST_TLB_FLUSH=y
|
||||
CONFIG_BUFFER_HEAD=y
|
||||
CONFIG_BUILDTIME_MCOUNT_SORT=y
|
||||
CONFIG_BUILDTIME_TABLE_SORT=y
|
||||
@ -3498,6 +3530,8 @@ CONFIG_CONTIG_ALLOC=y
|
||||
CONFIG_CPU_FREQ_GOV_ATTR_SET=y
|
||||
CONFIG_CPU_FREQ_GOV_COMMON=y
|
||||
CONFIG_CPU_RMAP=y
|
||||
CONFIG_CRC32_ARCH=y
|
||||
CONFIG_CRC_T10DIF_ARCH=y
|
||||
CONFIG_CRYPTO_ACOMP2=y
|
||||
CONFIG_CRYPTO_AEAD=m
|
||||
CONFIG_CRYPTO_AEAD2=y
|
||||
@ -3513,6 +3547,7 @@ CONFIG_CRYPTO_BLOWFISH_COMMON=m
|
||||
CONFIG_CRYPTO_CAST_COMMON=m
|
||||
CONFIG_CRYPTO_DRBG=y
|
||||
CONFIG_CRYPTO_DRBG_HMAC=y
|
||||
CONFIG_CRYPTO_ECC=y
|
||||
CONFIG_CRYPTO_ENGINE=m
|
||||
CONFIG_CRYPTO_GENIV=m
|
||||
CONFIG_CRYPTO_HASH=y
|
||||
@ -3524,11 +3559,12 @@ CONFIG_CRYPTO_KDF800108_CTR=y
|
||||
CONFIG_CRYPTO_KPP=y
|
||||
CONFIG_CRYPTO_KPP2=y
|
||||
CONFIG_CRYPTO_LIB_AES=y
|
||||
CONFIG_CRYPTO_LIB_AESGCM=y
|
||||
CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y
|
||||
CONFIG_CRYPTO_LIB_CHACHA_GENERIC=m
|
||||
CONFIG_CRYPTO_LIB_CURVE25519_GENERIC=m
|
||||
CONFIG_CRYPTO_LIB_DES=m
|
||||
CONFIG_CRYPTO_LIB_GF128MUL=m
|
||||
CONFIG_CRYPTO_LIB_GF128MUL=y
|
||||
CONFIG_CRYPTO_LIB_POLY1305_GENERIC=m
|
||||
CONFIG_CRYPTO_LIB_POLY1305_RSIZE=11
|
||||
CONFIG_CRYPTO_LIB_SHA1=y
|
||||
@ -3693,6 +3729,7 @@ CONFIG_HAS_DMA=y
|
||||
CONFIG_HAS_IOMEM=y
|
||||
CONFIG_HAS_IOPORT=y
|
||||
CONFIG_HAS_IOPORT_MAP=y
|
||||
CONFIG_HAS_SECURITY_AUDIT=y
|
||||
CONFIG_HAVE_ACPI_APEI=y
|
||||
CONFIG_HAVE_ACPI_APEI_NMI=y
|
||||
CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y
|
||||
@ -3745,10 +3782,12 @@ CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y
|
||||
CONFIG_HAVE_EISA=y
|
||||
CONFIG_HAVE_EXIT_THREAD=y
|
||||
CONFIG_HAVE_FENTRY=y
|
||||
CONFIG_HAVE_FTRACE_GRAPH_FUNC=y
|
||||
CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
|
||||
CONFIG_HAVE_FTRACE_REGS_HAVING_PT_REGS=y
|
||||
CONFIG_HAVE_FUNCTION_ARG_ACCESS_API=y
|
||||
CONFIG_HAVE_FUNCTION_ERROR_INJECTION=y
|
||||
CONFIG_HAVE_FUNCTION_GRAPH_RETVAL=y
|
||||
CONFIG_HAVE_FUNCTION_GRAPH_FREGS=y
|
||||
CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
|
||||
CONFIG_HAVE_FUNCTION_TRACER=y
|
||||
CONFIG_HAVE_GCC_PLUGINS=y
|
||||
@ -3858,11 +3897,6 @@ CONFIG_INET_TCP_DIAG=y
|
||||
CONFIG_INET_TUNNEL=m
|
||||
CONFIG_INET_XFRM_TUNNEL=m
|
||||
CONFIG_INIT_ENV_ARG_LIMIT=32
|
||||
CONFIG_INLINE_READ_UNLOCK=y
|
||||
CONFIG_INLINE_READ_UNLOCK_IRQ=y
|
||||
CONFIG_INLINE_SPIN_UNLOCK_IRQ=y
|
||||
CONFIG_INLINE_WRITE_UNLOCK=y
|
||||
CONFIG_INLINE_WRITE_UNLOCK_IRQ=y
|
||||
CONFIG_INPUT_VIVALDIFMAP=y
|
||||
CONFIG_INSTRUCTION_DECODER=y
|
||||
CONFIG_INTEL_IOMMU_FLOPPY_WA=y
|
||||
@ -3878,7 +3912,6 @@ CONFIG_IOMMU_IO_PGTABLE=y
|
||||
CONFIG_IOMMU_MM_DATA=y
|
||||
CONFIG_IOMMU_SVA=y
|
||||
CONFIG_IO_WQ=y
|
||||
CONFIG_IP6_NF_IPTABLES_LEGACY=m
|
||||
CONFIG_IPV6_FOU=m
|
||||
CONFIG_IPV6_FOU_TUNNEL=m
|
||||
CONFIG_IPV6_NDISC_NODETYPE=y
|
||||
@ -3886,8 +3919,6 @@ CONFIG_IPV6_SEG6_BPF=y
|
||||
CONFIG_IPVLAN_L3S=y
|
||||
CONFIG_IP_DCCP_TFRC_LIB=y
|
||||
CONFIG_IP_MROUTE_COMMON=y
|
||||
CONFIG_IP_NF_ARPTABLES=m
|
||||
CONFIG_IP_NF_IPTABLES_LEGACY=m
|
||||
CONFIG_IP_ROUTE_CLASSID=y
|
||||
CONFIG_IRQ_BYPASS_MANAGER=y
|
||||
CONFIG_IRQ_DOMAIN=y
|
||||
@ -3904,6 +3935,7 @@ CONFIG_KRETPROBE_ON_RETHOOK=y
|
||||
CONFIG_KVM_ASYNC_PF=y
|
||||
CONFIG_KVM_COMMON=y
|
||||
CONFIG_KVM_COMPAT=y
|
||||
CONFIG_KVM_ELIDE_TLB_FLUSH_IF_YOUNG=y
|
||||
CONFIG_KVM_GENERIC_DIRTYLOG_READ_PROTECT=y
|
||||
CONFIG_KVM_GENERIC_HARDWARE_ENABLING=y
|
||||
CONFIG_KVM_GENERIC_MEMORY_ATTRIBUTES=y
|
||||
@ -3939,6 +3971,7 @@ CONFIG_MEMORY_ISOLATION=y
|
||||
CONFIG_MEMREGION=y
|
||||
CONFIG_MHP_MEMMAP_ON_MEMORY=y
|
||||
CONFIG_MICROCODE=y
|
||||
CONFIG_MIN_HEAP=y
|
||||
CONFIG_MLX4_CORE=m
|
||||
CONFIG_MMCONF_FAM10H=y
|
||||
CONFIG_MMU=y
|
||||
@ -3950,7 +3983,7 @@ CONFIG_MMU_NOTIFIER=y
|
||||
CONFIG_MODULES_TREE_LOOKUP=y
|
||||
CONFIG_MODULES_USE_ELF_RELA=y
|
||||
CONFIG_MODULE_SIG_FORMAT=y
|
||||
CONFIG_MODULE_SIG_HASH="sha256"
|
||||
CONFIG_MODULE_SIG_HASH="sha3-384"
|
||||
CONFIG_MPILIB=y
|
||||
CONFIG_MUTEX_SPIN_ON_OWNER=y
|
||||
CONFIG_ND_CLAIM=y
|
||||
@ -3981,6 +4014,7 @@ CONFIG_NET_RX_BUSY_POLL=y
|
||||
CONFIG_NET_SCH_FIFO=y
|
||||
CONFIG_NET_SCH_MQPRIO_LIB=m
|
||||
CONFIG_NET_SELFTESTS=m
|
||||
CONFIG_NET_SHAPER=y
|
||||
CONFIG_NET_SOCK_MSG=y
|
||||
CONFIG_NET_UDP_TUNNEL=m
|
||||
CONFIG_NET_XGRESS=y
|
||||
@ -4155,6 +4189,7 @@ CONFIG_UCS2_STRING=y
|
||||
CONFIG_UEFI_CPER=y
|
||||
CONFIG_UEFI_CPER_X86=y
|
||||
CONFIG_UNACCEPTED_MEMORY=y
|
||||
CONFIG_UNION_FIND=y
|
||||
CONFIG_UPROBES=y
|
||||
CONFIG_USB_OHCI_LITTLE_ENDIAN=y
|
||||
CONFIG_USER_RETURN_NOTIFIER=y
|
||||
@ -4186,7 +4221,6 @@ CONFIG_WATCHDOG_PRETIMEOUT_GOV_SEL=m
|
||||
CONFIG_X86=y
|
||||
CONFIG_X86_64=y
|
||||
CONFIG_X86_64_SMP=y
|
||||
CONFIG_X86_BROADCAST_TLB_FLUSH=y
|
||||
CONFIG_X86_CMOV=y
|
||||
CONFIG_X86_CMPXCHG64=y
|
||||
CONFIG_X86_DEBUGCTLMSR=y
|
||||
|
109
debian/copyright
vendored
109
debian/copyright
vendored
@ -25,43 +25,43 @@ Copyright: 1996-2006 Manoj Srivastava
|
||||
License: GPL-2
|
||||
|
||||
Files:
|
||||
arch/arm/boot/dts/armada-370.dtsi
|
||||
arch/arm/boot/dts/armada-370-d*.dts*
|
||||
arch/arm/boot/dts/armada-370-mirabox.dts
|
||||
arch/arm/boot/dts/armada-370-netgear*.dts*
|
||||
arch/arm/boot/dts/armada-370-rd.dts
|
||||
arch/arm/boot/dts/armada-370-synology-ds213j.dts
|
||||
arch/arm/boot/dts/armada-375*.dts*
|
||||
arch/arm/boot/dts/armada-38*.dts*
|
||||
arch/arm/boot/dts/armada-39*.dts*
|
||||
arch/arm/boot/dts/armada-xp*.dts*
|
||||
arch/arm/boot/dts/artpec6.dtsi
|
||||
arch/arm/boot/dts/at91sam9260ek.dts
|
||||
arch/arm/boot/dts/at91sam9xe.dtsi
|
||||
arch/arm/boot/dts/axp*.dts*
|
||||
arch/arm/boot/dts/berlin2*.dts*
|
||||
arch/arm/boot/dts/allwinner/axp*.dts*
|
||||
arch/arm/boot/dts/allwinner/sun*.dts*
|
||||
arch/arm/boot/dts/amlogic/meson*.dts*
|
||||
arch/arm/boot/dts/arm/mps2*.dts*
|
||||
arch/arm/boot/dts/axis/artpec6.dtsi
|
||||
arch/arm/boot/dts/cnxt/cx92755*.dts*
|
||||
arch/arm/boot/dts/cros-ec-sbs.dtsi
|
||||
arch/arm/boot/dts/cx92755*.dts*
|
||||
arch/arm/boot/dts/imx7*.dts*
|
||||
arch/arm/boot/dts/kirkwood-linkstation*.dts*
|
||||
arch/arm/boot/dts/ls*.dts*
|
||||
arch/arm/boot/dts/meson*.dts*
|
||||
arch/arm/boot/dts/mps2*.dts*
|
||||
arch/arm/boot/dts/mvebu-linkstation-*.dts*
|
||||
arch/arm/boot/dts/orion5x-kuroboxpro.dts
|
||||
arch/arm/boot/dts/orion5x-linkstation*.dts*
|
||||
arch/arm/boot/dts/orion5x-ls*.dts*
|
||||
arch/arm/boot/dts/qcom-mdm9615*.dts*
|
||||
arch/arm/boot/dts/rk*.dts
|
||||
arch/arm/boot/dts/sama5d2.dtsi
|
||||
arch/arm/boot/dts/sama5d4.dtsi
|
||||
arch/arm/boot/dts/socfpga_cyclone5_vining_fpga.dts
|
||||
arch/arm/boot/dts/stm*.dts*
|
||||
arch/arm/boot/dts/sun*.dts*
|
||||
arch/arm/boot/dts/tegra124-apalis*.dts*
|
||||
arch/arm/boot/dts/uniphier-*.dts*
|
||||
arch/arm/boot/dts/vf610-colibri*.dts*
|
||||
arch/arm/boot/dts/vf610m*.dts*
|
||||
arch/arm/boot/dts/intel/socfpga/socfpga_cyclone5_vining_fpga.dts
|
||||
arch/arm/boot/dts/marvell/armada-370-d*.dts*
|
||||
arch/arm/boot/dts/marvell/armada-370-mirabox.dts
|
||||
arch/arm/boot/dts/marvell/armada-370-netgear*.dts*
|
||||
arch/arm/boot/dts/marvell/armada-370-rd.dts
|
||||
arch/arm/boot/dts/marvell/armada-370-synology-ds213j.dts
|
||||
arch/arm/boot/dts/marvell/armada-370.dtsi
|
||||
arch/arm/boot/dts/marvell/armada-375*.dts*
|
||||
arch/arm/boot/dts/marvell/armada-38*.dts*
|
||||
arch/arm/boot/dts/marvell/armada-39*.dts*
|
||||
arch/arm/boot/dts/marvell/armada-xp*.dts*
|
||||
arch/arm/boot/dts/marvell/kirkwood-linkstation*.dts*
|
||||
arch/arm/boot/dts/marvell/mvebu-linkstation-*.dts*
|
||||
arch/arm/boot/dts/marvell/orion5x-kuroboxpro.dts
|
||||
arch/arm/boot/dts/marvell/orion5x-linkstation*.dts*
|
||||
arch/arm/boot/dts/marvell/orion5x-ls*.dts*
|
||||
arch/arm/boot/dts/microchip/at91sam9260ek.dts
|
||||
arch/arm/boot/dts/microchip/at91sam9xe.dtsi
|
||||
arch/arm/boot/dts/microchip/sama5d2.dtsi
|
||||
arch/arm/boot/dts/microchip/sama5d4.dtsi
|
||||
arch/arm/boot/dts/nvidia/tegra124-apalis*.dts*
|
||||
arch/arm/boot/dts/nxp/imx/imx7*.dts*
|
||||
arch/arm/boot/dts/nxp/ls/ls*.dts*
|
||||
arch/arm/boot/dts/nxp/vf/vf610-colibri*.dts*
|
||||
arch/arm/boot/dts/nxp/vf/vf610m*.dts*
|
||||
arch/arm/boot/dts/qcom/qcom-mdm9615*.dts*
|
||||
arch/arm/boot/dts/rockchip/rk*.dts
|
||||
arch/arm/boot/dts/socionext/uniphier-*.dts*
|
||||
arch/arm/boot/dts/st/stm*.dts*
|
||||
arch/arm/boot/dts/synaptics/berlin2*.dts*
|
||||
arch/arm64/boot/dts/allwinner/*.dts*
|
||||
arch/arm64/boot/dts/amlogic/*.dts*
|
||||
arch/arm64/boot/dts/cavium/thunder-*.dts*
|
||||
@ -78,43 +78,6 @@ Files:
|
||||
Copyright: 2012-2018 Linus Torvalds and many others
|
||||
License: GPL-2+-or-X11
|
||||
|
||||
Files: drivers/crypto/vmx/*.pl
|
||||
Copyright: 2006,2014 Andy Polyakov <appro@openssl.org>
|
||||
License: CRYPTOGAMS
|
||||
All rights reserved.
|
||||
.
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
.
|
||||
* Redistributions of source code must retain copyright notices, this
|
||||
list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the
|
||||
distribution.
|
||||
* Neither the name of the CRYPTOGAMS nor the names of its copyright
|
||||
holder and contributors may be used to endorse or promote products
|
||||
derived from this software without specific prior written
|
||||
permission.
|
||||
.
|
||||
ALTERNATIVELY, provided that this notice is retained in full, this
|
||||
product may be distributed under the terms of the GNU General Public
|
||||
License (GPL), in which case the provisions of the GPL apply INSTEAD
|
||||
OF those given above.
|
||||
.
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
Files: fs/nls/mac-*
|
||||
Copyright: 1991-2012 Unicode, Inc.
|
||||
License: Unicode-data
|
||||
|
10
debian/lib/python/debian_linux/config_v2.py
vendored
10
debian/lib/python/debian_linux/config_v2.py
vendored
@ -11,7 +11,6 @@ from pathlib import Path
|
||||
from typing import (
|
||||
Optional,
|
||||
Self,
|
||||
TypeVar,
|
||||
)
|
||||
|
||||
import dacite
|
||||
@ -157,9 +156,6 @@ class ConfigBase:
|
||||
return config
|
||||
|
||||
|
||||
ConfigT = TypeVar('ConfigT', bound=ConfigBase)
|
||||
|
||||
|
||||
@dataclasses.dataclass
|
||||
class Config(ConfigBase):
|
||||
# Disable basic fields
|
||||
@ -227,9 +223,9 @@ class Config(ConfigBase):
|
||||
return config
|
||||
|
||||
@classmethod
|
||||
def _read_hierarchy(
|
||||
cls, bases: Iterable[Path], orig: Iterable[ConfigT],
|
||||
) -> Iterable[ConfigT]:
|
||||
def _read_hierarchy[T: ConfigBase](
|
||||
cls, bases: Iterable[Path], orig: Iterable[T],
|
||||
) -> Iterable[T]:
|
||||
for i in orig:
|
||||
try:
|
||||
assert i.path is not None
|
||||
|
@ -5,22 +5,16 @@ import re
|
||||
from typing import (
|
||||
Any,
|
||||
Callable,
|
||||
Generic,
|
||||
IO,
|
||||
Iterable,
|
||||
Optional,
|
||||
overload,
|
||||
TypeVar,
|
||||
TYPE_CHECKING,
|
||||
)
|
||||
|
||||
_T = TypeVar('_T')
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from dataclasses import _DataclassT
|
||||
else:
|
||||
# We can only get to _DataclassT during type checking, use a generic type during runtime
|
||||
_DataclassT = _T
|
||||
from _typeshed import DataclassInstance as _DataclassInstance
|
||||
|
||||
|
||||
__all__ = [
|
||||
'field_deb822',
|
||||
@ -30,61 +24,61 @@ __all__ = [
|
||||
]
|
||||
|
||||
|
||||
class Deb822Field(Generic[_T]):
|
||||
class Deb822Field[T]:
|
||||
key: str
|
||||
load: Optional[Callable[[str], _T]]
|
||||
dump: Optional[Callable[[_T], str]]
|
||||
load: Optional[Callable[[str], T]]
|
||||
dump: Optional[Callable[[T], str]]
|
||||
|
||||
def __init__(
|
||||
self, *,
|
||||
key: str,
|
||||
load: Optional[Callable[[str], _T]],
|
||||
dump: Optional[Callable[[_T], str]],
|
||||
load: Optional[Callable[[str], T]],
|
||||
dump: Optional[Callable[[T], str]],
|
||||
) -> None:
|
||||
self.key = key
|
||||
self.load = load
|
||||
self.dump = dump
|
||||
|
||||
|
||||
# The return type _T is technically wrong, but it allows checking if during
|
||||
# The return type T is technically wrong, but it allows checking if during
|
||||
# runtime we get the correct type.
|
||||
@overload
|
||||
def field_deb822(
|
||||
def field_deb822[T](
|
||||
deb822_key: str,
|
||||
/, *,
|
||||
deb822_load: Optional[Callable[[str], _T]] = None,
|
||||
deb822_dump: Optional[Callable[[_T], str]] = str,
|
||||
default: _T,
|
||||
) -> _T:
|
||||
deb822_load: Optional[Callable[[str], T]] = None,
|
||||
deb822_dump: Optional[Callable[[T], str]] = str,
|
||||
default: T,
|
||||
) -> T:
|
||||
...
|
||||
|
||||
|
||||
@overload
|
||||
def field_deb822(
|
||||
def field_deb822[T](
|
||||
deb822_key: str,
|
||||
/, *,
|
||||
deb822_load: Optional[Callable[[str], _T]] = None,
|
||||
deb822_dump: Optional[Callable[[_T], str]] = str,
|
||||
default_factory: Callable[[], _T],
|
||||
) -> _T:
|
||||
deb822_load: Optional[Callable[[str], T]] = None,
|
||||
deb822_dump: Optional[Callable[[T], str]] = str,
|
||||
default_factory: Callable[[], T],
|
||||
) -> T:
|
||||
...
|
||||
|
||||
|
||||
@overload
|
||||
def field_deb822(
|
||||
def field_deb822[T](
|
||||
deb822_key: str,
|
||||
/, *,
|
||||
deb822_load: Optional[Callable[[str], _T]] = None,
|
||||
deb822_dump: Optional[Callable[[_T], str]] = str,
|
||||
) -> _T:
|
||||
deb822_load: Optional[Callable[[str], T]] = None,
|
||||
deb822_dump: Optional[Callable[[T], str]] = str,
|
||||
) -> T:
|
||||
...
|
||||
|
||||
|
||||
def field_deb822(
|
||||
def field_deb822[T](
|
||||
deb822_key: str,
|
||||
/, *,
|
||||
deb822_load: Optional[Callable[[str], _T]] = None,
|
||||
deb822_dump: Optional[Callable[[_T], str]] = str,
|
||||
deb822_load: Optional[Callable[[str], T]] = None,
|
||||
deb822_dump: Optional[Callable[[T], str]] = str,
|
||||
default: Any = dataclasses.MISSING,
|
||||
default_factory: Any = dataclasses.MISSING,
|
||||
) -> Any:
|
||||
@ -112,8 +106,8 @@ class Deb822DecodeError(ValueError):
|
||||
pass
|
||||
|
||||
|
||||
class Deb822DecodeState(Generic[_DataclassT]):
|
||||
cls: type[_DataclassT]
|
||||
class Deb822DecodeState[T: _DataclassInstance]:
|
||||
cls: type[T]
|
||||
fields: dict[str, dataclasses.Field]
|
||||
ignore_unknown: bool
|
||||
|
||||
@ -132,7 +126,7 @@ class Deb822DecodeState(Generic[_DataclassT]):
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
cls: type[_DataclassT],
|
||||
cls: type[T],
|
||||
ignore_unknown: bool,
|
||||
) -> None:
|
||||
self.reset()
|
||||
@ -167,7 +161,7 @@ class Deb822DecodeState(Generic[_DataclassT]):
|
||||
else:
|
||||
raise NotImplementedError
|
||||
|
||||
def generate(self) -> _DataclassT | None:
|
||||
def generate(self) -> T | None:
|
||||
if not self.data:
|
||||
return None
|
||||
|
||||
@ -192,12 +186,12 @@ class Deb822DecodeState(Generic[_DataclassT]):
|
||||
return self.cls(**r)
|
||||
|
||||
|
||||
def read_deb822(
|
||||
cls: type[_DataclassT],
|
||||
def read_deb822[T: _DataclassInstance](
|
||||
cls: type[T],
|
||||
file: IO[str],
|
||||
/,
|
||||
ignore_unknown: bool = False,
|
||||
) -> Iterable[_DataclassT]:
|
||||
) -> Iterable[T]:
|
||||
state = Deb822DecodeState(cls, ignore_unknown)
|
||||
|
||||
for linenr, line in enumerate(file):
|
||||
@ -217,8 +211,8 @@ def read_deb822(
|
||||
yield obj
|
||||
|
||||
|
||||
def write_deb822(
|
||||
objs: Iterable[_DataclassT],
|
||||
def write_deb822[T: _DataclassInstance](
|
||||
objs: Iterable[T],
|
||||
file: IO[str],
|
||||
/,
|
||||
) -> None:
|
||||
|
@ -7,7 +7,6 @@ from dataclasses import (
|
||||
)
|
||||
from typing import (
|
||||
Protocol,
|
||||
TypeVar,
|
||||
TYPE_CHECKING,
|
||||
)
|
||||
|
||||
@ -17,14 +16,11 @@ if TYPE_CHECKING:
|
||||
class _HasName(Protocol, _DataclassInstance):
|
||||
name: str
|
||||
|
||||
_DataclassT = TypeVar('_DataclassT', bound=_DataclassInstance)
|
||||
_HasNameT = TypeVar('_HasNameT', bound=_HasName)
|
||||
|
||||
|
||||
def default(
|
||||
cls: type[_DataclassT],
|
||||
def default[T: _DataclassInstance](
|
||||
cls: type[T],
|
||||
/,
|
||||
) -> _DataclassT:
|
||||
) -> T:
|
||||
f = {}
|
||||
|
||||
for field in fields(cls):
|
||||
@ -34,10 +30,10 @@ def default(
|
||||
return cls(**f)
|
||||
|
||||
|
||||
def merge(
|
||||
self: _DataclassT,
|
||||
other: _DataclassT | None, /,
|
||||
) -> _DataclassT:
|
||||
def merge[T: _DataclassInstance](
|
||||
self: T,
|
||||
other: T | None, /,
|
||||
) -> T:
|
||||
if other is None:
|
||||
return self
|
||||
|
||||
@ -75,22 +71,22 @@ def merge(
|
||||
return replace(self, **f)
|
||||
|
||||
|
||||
def merge_default(
|
||||
cls: type[_DataclassT],
|
||||
def merge_default[T: _DataclassInstance](
|
||||
cls: type[T],
|
||||
/,
|
||||
*others: _DataclassT,
|
||||
) -> _DataclassT:
|
||||
ret: _DataclassT = default(cls)
|
||||
*others: T,
|
||||
) -> T:
|
||||
ret: T = default(cls)
|
||||
for o in others:
|
||||
ret = merge(ret, o)
|
||||
return ret
|
||||
|
||||
|
||||
def _merge_assoclist(
|
||||
self_list: list[_HasNameT],
|
||||
other_list: list[_HasNameT],
|
||||
def _merge_assoclist[T: _HasName](
|
||||
self_list: list[T],
|
||||
other_list: list[T],
|
||||
/,
|
||||
) -> list[_HasNameT]:
|
||||
) -> list[T]:
|
||||
'''
|
||||
Merge lists where each item got a "name" attribute
|
||||
'''
|
||||
@ -99,7 +95,7 @@ def _merge_assoclist(
|
||||
if not other_list:
|
||||
return self_list
|
||||
|
||||
ret: list[_HasNameT] = []
|
||||
ret: list[T] = []
|
||||
other_dict = {
|
||||
i.name: i
|
||||
for i in other_list
|
||||
|
25
debian/lib/python/debian_linux/debian.py
vendored
25
debian/lib/python/debian_linux/debian.py
vendored
@ -370,9 +370,8 @@ class PackageRelationEntry:
|
||||
ret.append(f'({self.operator} {self.version})')
|
||||
if self.arches:
|
||||
ret.append(f'[{self.arches}]')
|
||||
if self.restrictions:
|
||||
ret.append(str(self.restrictions))
|
||||
return ' '.join(ret)
|
||||
ret.append(str(self.restrictions))
|
||||
return ' '.join(i for i in ret if i)
|
||||
|
||||
|
||||
class PackageRelationGroup(list[PackageRelationEntry]):
|
||||
@ -443,8 +442,6 @@ class PackageBuildprofileEntry:
|
||||
pos: set[str] = dataclasses.field(default_factory=set)
|
||||
neg: set[str] = dataclasses.field(default_factory=set)
|
||||
|
||||
__re = re.compile(r'^<(?P<profiles>[a-z0-9. !-]+)>$')
|
||||
|
||||
def copy(self) -> Self:
|
||||
return self.__class__(
|
||||
pos=set(self.pos),
|
||||
@ -453,12 +450,8 @@ class PackageBuildprofileEntry:
|
||||
|
||||
@classmethod
|
||||
def parse(cls, v: str, /) -> Self:
|
||||
match = cls.__re.match(v)
|
||||
if not match:
|
||||
raise RuntimeError('Unable to parse build profile "%s"' % v)
|
||||
|
||||
ret = cls()
|
||||
for i in re.split(r' ', match.group('profiles')):
|
||||
for i in re.split(r' ', v):
|
||||
if i:
|
||||
if i[0] == '!':
|
||||
ret.neg.add(i[1:])
|
||||
@ -506,16 +499,18 @@ class PackageBuildprofileEntry:
|
||||
self.neg &= other.neg - diff
|
||||
__ior__ = update
|
||||
|
||||
def __len__(self) -> int:
|
||||
return len(self.pos) + len(self.neg)
|
||||
|
||||
def __str__(self) -> str:
|
||||
s = ' '.join(itertools.chain(
|
||||
return ' '.join(itertools.chain(
|
||||
sorted(self.pos),
|
||||
(f'!{i}' for i in sorted(self.neg)),
|
||||
))
|
||||
return f'<{s}>'
|
||||
|
||||
|
||||
class PackageBuildprofile(list[PackageBuildprofileEntry]):
|
||||
__re = re.compile(r' *(<[^>]+>)(?: +|$)')
|
||||
__re = re.compile(r' *<(?P<entry>[a-z0-9. !-]+)>(?: +|$)')
|
||||
|
||||
def copy(self) -> Self:
|
||||
return self.__class__(i.copy() for i in self)
|
||||
@ -524,7 +519,7 @@ class PackageBuildprofile(list[PackageBuildprofileEntry]):
|
||||
def parse(cls, v: str, /) -> Self:
|
||||
ret = cls()
|
||||
for match in cls.__re.finditer(v):
|
||||
ret.append(PackageBuildprofileEntry.parse(match.group(1)))
|
||||
ret.append(PackageBuildprofileEntry.parse(match.group('entry')))
|
||||
return ret
|
||||
|
||||
def update(self, v: Self, /) -> None:
|
||||
@ -538,7 +533,7 @@ class PackageBuildprofile(list[PackageBuildprofileEntry]):
|
||||
__ior__ = update
|
||||
|
||||
def __str__(self) -> str:
|
||||
return ' '.join(str(i) for i in self)
|
||||
return ' '.join(f'<{str(i)}>' for i in self if i)
|
||||
|
||||
|
||||
@dataclasses.dataclass
|
||||
|
7
debian/lib/python/debian_linux/gencontrol.py
vendored
7
debian/lib/python/debian_linux/gencontrol.py
vendored
@ -189,6 +189,7 @@ class PackagesBundle:
|
||||
package.meta_rules_check_packages = check_packages
|
||||
|
||||
for name in (
|
||||
'NEWS',
|
||||
'lintian-overrides',
|
||||
'maintscript',
|
||||
'postinst',
|
||||
@ -202,7 +203,11 @@ class PackagesBundle:
|
||||
except KeyError:
|
||||
pass
|
||||
else:
|
||||
with self.open(f'{package_name}.{name}') as f:
|
||||
if arch:
|
||||
out = f'{package_name}.{name}.{arch}'
|
||||
else:
|
||||
out = f'{package_name}.{name}'
|
||||
with self.open(out) as f:
|
||||
f.write(template)
|
||||
|
||||
return ret
|
||||
|
424
debian/lib/python/debian_linux/test_debian.py
vendored
424
debian/lib/python/debian_linux/test_debian.py
vendored
@ -1,424 +0,0 @@
|
||||
import pytest
|
||||
|
||||
from .debian import (
|
||||
Version,
|
||||
VersionLinux,
|
||||
PackageArchitecture,
|
||||
PackageDescription,
|
||||
PackageRelationEntry,
|
||||
PackageRelationGroup,
|
||||
PackageRelation,
|
||||
PackageBuildprofileEntry,
|
||||
PackageBuildprofile,
|
||||
)
|
||||
|
||||
|
||||
class TestVersion:
|
||||
def test_native(self) -> None:
|
||||
v = Version('1.2+c~4')
|
||||
assert v.epoch is None
|
||||
assert v.upstream == '1.2+c~4'
|
||||
assert v.revision is None
|
||||
assert v.complete == '1.2+c~4'
|
||||
assert v.complete_noepoch == '1.2+c~4'
|
||||
|
||||
def test_nonnative(self) -> None:
|
||||
v = Version('1-2+d~3')
|
||||
assert v.epoch is None
|
||||
assert v.upstream == '1'
|
||||
assert v.revision == '2+d~3'
|
||||
assert v.complete == '1-2+d~3'
|
||||
assert v.complete_noepoch == '1-2+d~3'
|
||||
|
||||
def test_native_epoch(self) -> None:
|
||||
v = Version('5:1.2.3')
|
||||
assert v.epoch == 5
|
||||
assert v.upstream == '1.2.3'
|
||||
assert v.revision is None
|
||||
assert v.complete == '5:1.2.3'
|
||||
assert v.complete_noepoch == '1.2.3'
|
||||
|
||||
def test_nonnative_epoch(self) -> None:
|
||||
v = Version('5:1.2.3-4')
|
||||
assert v.epoch == 5
|
||||
assert v.upstream == '1.2.3'
|
||||
assert v.revision == '4'
|
||||
assert v.complete == '5:1.2.3-4'
|
||||
assert v.complete_noepoch == '1.2.3-4'
|
||||
|
||||
def test_multi_hyphen(self) -> None:
|
||||
v = Version('1-2-3')
|
||||
assert v.epoch is None
|
||||
assert v.upstream == '1-2'
|
||||
assert v.revision == '3'
|
||||
assert v.complete == '1-2-3'
|
||||
|
||||
def test_multi_colon(self) -> None:
|
||||
v = Version('1:2:3')
|
||||
assert v.epoch == 1
|
||||
assert v.upstream == '2:3'
|
||||
assert v.revision is None
|
||||
|
||||
def test_invalid_epoch(self) -> None:
|
||||
with pytest.raises(RuntimeError):
|
||||
Version('a:1')
|
||||
with pytest.raises(RuntimeError):
|
||||
Version('-1:1')
|
||||
with pytest.raises(RuntimeError):
|
||||
Version('1a:1')
|
||||
|
||||
def test_invalid_upstream(self) -> None:
|
||||
with pytest.raises(RuntimeError):
|
||||
Version('1_2')
|
||||
with pytest.raises(RuntimeError):
|
||||
Version('1/2')
|
||||
with pytest.raises(RuntimeError):
|
||||
Version('a1')
|
||||
with pytest.raises(RuntimeError):
|
||||
Version('1 2')
|
||||
|
||||
def test_invalid_revision(self) -> None:
|
||||
with pytest.raises(RuntimeError):
|
||||
Version('1-2_3')
|
||||
with pytest.raises(RuntimeError):
|
||||
Version('1-2/3')
|
||||
with pytest.raises(RuntimeError):
|
||||
Version('1-2:3')
|
||||
|
||||
|
||||
class TestVersionLinux:
|
||||
def test_stable(self) -> None:
|
||||
v = VersionLinux('1.2.3-4')
|
||||
assert v.linux_version == '1.2'
|
||||
assert v.linux_upstream == '1.2'
|
||||
assert v.linux_upstream_full == '1.2.3'
|
||||
assert v.linux_modifier is None
|
||||
assert v.linux_dfsg is None
|
||||
assert not v.linux_revision_experimental
|
||||
assert not v.linux_revision_security
|
||||
assert not v.linux_revision_backports
|
||||
assert not v.linux_revision_other
|
||||
|
||||
def test_rc(self) -> None:
|
||||
v = VersionLinux('1.2~rc3-4')
|
||||
assert v.linux_version == '1.2'
|
||||
assert v.linux_upstream == '1.2-rc3'
|
||||
assert v.linux_upstream_full == '1.2-rc3'
|
||||
assert v.linux_modifier == 'rc3'
|
||||
assert v.linux_dfsg is None
|
||||
assert not v.linux_revision_experimental
|
||||
assert not v.linux_revision_security
|
||||
assert not v.linux_revision_backports
|
||||
assert not v.linux_revision_other
|
||||
|
||||
def test_dfsg(self) -> None:
|
||||
v = VersionLinux('1.2~rc3.dfsg.1-4')
|
||||
assert v.linux_version == '1.2'
|
||||
assert v.linux_upstream == '1.2-rc3'
|
||||
assert v.linux_upstream_full == '1.2-rc3'
|
||||
assert v.linux_modifier == 'rc3'
|
||||
assert v.linux_dfsg == '1'
|
||||
assert not v.linux_revision_experimental
|
||||
assert not v.linux_revision_security
|
||||
assert not v.linux_revision_backports
|
||||
assert not v.linux_revision_other
|
||||
|
||||
def test_experimental(self) -> None:
|
||||
v = VersionLinux('1.2~rc3-4~exp5')
|
||||
assert v.linux_upstream_full == '1.2-rc3'
|
||||
assert v.linux_revision_experimental
|
||||
assert not v.linux_revision_security
|
||||
assert not v.linux_revision_backports
|
||||
assert not v.linux_revision_other
|
||||
|
||||
def test_security(self) -> None:
|
||||
v = VersionLinux('1.2.3-4+deb10u1')
|
||||
assert v.linux_upstream_full == '1.2.3'
|
||||
assert not v.linux_revision_experimental
|
||||
assert v.linux_revision_security
|
||||
assert not v.linux_revision_backports
|
||||
assert not v.linux_revision_other
|
||||
|
||||
def test_backports(self) -> None:
|
||||
v = VersionLinux('1.2.3-4~bpo9+10')
|
||||
assert v.linux_upstream_full == '1.2.3'
|
||||
assert not v.linux_revision_experimental
|
||||
assert not v.linux_revision_security
|
||||
assert v.linux_revision_backports
|
||||
assert not v.linux_revision_other
|
||||
|
||||
def test_security_backports(self) -> None:
|
||||
v = VersionLinux('1.2.3-4+deb10u1~bpo9+10')
|
||||
assert v.linux_upstream_full == '1.2.3'
|
||||
assert not v.linux_revision_experimental
|
||||
assert v.linux_revision_security
|
||||
assert v.linux_revision_backports
|
||||
assert not v.linux_revision_other
|
||||
|
||||
def test_lts_backports(self) -> None:
|
||||
# Backport during LTS, as an extra package in the -security
|
||||
# suite. Since this is not part of a -backports suite it
|
||||
# shouldn't get the linux_revision_backports flag.
|
||||
v = VersionLinux('1.2.3-4~deb9u10')
|
||||
assert v.linux_upstream_full == '1.2.3'
|
||||
assert not v.linux_revision_experimental
|
||||
assert v.linux_revision_security
|
||||
assert not v.linux_revision_backports
|
||||
assert not v.linux_revision_other
|
||||
|
||||
def test_lts_backports_2(self) -> None:
|
||||
# Same but with two security extensions in the revision.
|
||||
v = VersionLinux('1.2.3-4+deb10u1~deb9u10')
|
||||
assert v.linux_upstream_full == '1.2.3'
|
||||
assert not v.linux_revision_experimental
|
||||
assert v.linux_revision_security
|
||||
assert not v.linux_revision_backports
|
||||
assert not v.linux_revision_other
|
||||
|
||||
def test_binnmu(self) -> None:
|
||||
v = VersionLinux('1.2.3-4+b1')
|
||||
assert not v.linux_revision_experimental
|
||||
assert not v.linux_revision_security
|
||||
assert not v.linux_revision_backports
|
||||
assert not v.linux_revision_other
|
||||
|
||||
def test_other_revision(self) -> None:
|
||||
v = VersionLinux('4.16.5-1+revert+crng+ready') # from #898087
|
||||
assert not v.linux_revision_experimental
|
||||
assert not v.linux_revision_security
|
||||
assert not v.linux_revision_backports
|
||||
assert v.linux_revision_other
|
||||
|
||||
def test_other_revision_binnmu(self) -> None:
|
||||
v = VersionLinux('4.16.5-1+revert+crng+ready+b1')
|
||||
assert not v.linux_revision_experimental
|
||||
assert not v.linux_revision_security
|
||||
assert not v.linux_revision_backports
|
||||
assert v.linux_revision_other
|
||||
|
||||
|
||||
class TestPackageArchitecture:
|
||||
def test_init(self) -> None:
|
||||
a = PackageArchitecture()
|
||||
assert a == set()
|
||||
|
||||
def test_init_str(self) -> None:
|
||||
a = PackageArchitecture(' foo bar\tbaz ')
|
||||
assert a == {'foo', 'bar', 'baz'}
|
||||
|
||||
def test_init_iter(self) -> None:
|
||||
a = PackageArchitecture(('foo', 'bar'))
|
||||
assert a == {'foo', 'bar'}
|
||||
|
||||
def test_init_self(self) -> None:
|
||||
a = PackageArchitecture(PackageArchitecture(('foo', 'bar')))
|
||||
assert a == {'foo', 'bar'}
|
||||
|
||||
def test_str(self) -> None:
|
||||
a = PackageArchitecture(('foo', 'bar'))
|
||||
assert str(a) == 'bar foo'
|
||||
|
||||
|
||||
class TestPackageDescription:
|
||||
def test_init(self) -> None:
|
||||
a = PackageDescription()
|
||||
assert a.short == []
|
||||
assert a.long == []
|
||||
|
||||
def test_init_str(self) -> None:
|
||||
a = PackageDescription('Short\nLong1\n.\nLong2')
|
||||
assert a.short == ['Short']
|
||||
assert a.long == ['Long1', 'Long2']
|
||||
|
||||
def test_init_self(self) -> None:
|
||||
a = PackageDescription(PackageDescription('Short\nLong1\n.\nLong2'))
|
||||
assert a.short == ['Short']
|
||||
assert a.long == ['Long1', 'Long2']
|
||||
|
||||
def test_str(self) -> None:
|
||||
a = PackageDescription('Short\nLong1\n.\nLong2')
|
||||
assert str(a) == 'Short\nLong1\n.\nLong2'
|
||||
|
||||
|
||||
class TestPackageRelationEntry:
|
||||
def test_init_str(self) -> None:
|
||||
a = PackageRelationEntry('package (>=version) [arch2 arch1] <profile1 >')
|
||||
assert a.name == 'package'
|
||||
assert a.version == 'version'
|
||||
assert a.arches == {'arch1', 'arch2'}
|
||||
# TODO: assert a.profiles
|
||||
assert str(a) == 'package (>= version) [arch1 arch2] <profile1>'
|
||||
|
||||
def test_init_self(self) -> None:
|
||||
a = PackageRelationEntry(PackageRelationEntry('package [arch2 arch1]'))
|
||||
assert a.name == 'package'
|
||||
assert a.arches == {'arch1', 'arch2'}
|
||||
assert str(a) == 'package [arch1 arch2]'
|
||||
|
||||
|
||||
class TestPackageRelationGroup:
|
||||
def test_init(self) -> None:
|
||||
a = PackageRelationGroup()
|
||||
assert a == []
|
||||
|
||||
def test_init_str(self) -> None:
|
||||
a = PackageRelationGroup('foo | bar')
|
||||
assert len(a) == 2
|
||||
assert a[0].name == 'foo'
|
||||
assert a[1].name == 'bar'
|
||||
|
||||
def test_init_iter_entry(self) -> None:
|
||||
a = PackageRelationGroup((PackageRelationEntry('foo'), PackageRelationEntry('bar')))
|
||||
assert len(a) == 2
|
||||
assert a[0].name == 'foo'
|
||||
assert a[1].name == 'bar'
|
||||
|
||||
def test_init_iter_str(self) -> None:
|
||||
a = PackageRelationGroup(('foo', 'bar'))
|
||||
assert len(a) == 2
|
||||
assert a[0].name == 'foo'
|
||||
assert a[1].name == 'bar'
|
||||
|
||||
def test_init_self(self) -> None:
|
||||
a = PackageRelationGroup(PackageRelationGroup(['foo', 'bar']))
|
||||
assert len(a) == 2
|
||||
assert a[0].name == 'foo'
|
||||
assert a[1].name == 'bar'
|
||||
|
||||
def test_str(self) -> None:
|
||||
a = PackageRelationGroup('foo| bar')
|
||||
assert str(a) == 'foo | bar'
|
||||
|
||||
|
||||
class TestPackageRelation:
|
||||
def test_init(self) -> None:
|
||||
a = PackageRelation()
|
||||
assert a == []
|
||||
|
||||
def test_init_str(self) -> None:
|
||||
a = PackageRelation('foo1 | foo2, bar')
|
||||
assert len(a) == 2
|
||||
assert len(a[0]) == 2
|
||||
assert a[0][0].name == 'foo1'
|
||||
assert a[0][1].name == 'foo2'
|
||||
assert len(a[1]) == 1
|
||||
assert a[1][0].name == 'bar'
|
||||
|
||||
def test_init_iter_entry(self) -> None:
|
||||
a = PackageRelation([[PackageRelationEntry('foo')], [PackageRelationEntry('bar')]])
|
||||
assert len(a) == 2
|
||||
assert len(a[0]) == 1
|
||||
assert a[0][0].name == 'foo'
|
||||
assert len(a[1]) == 1
|
||||
assert a[1][0].name == 'bar'
|
||||
|
||||
def test_init_iter_str(self) -> None:
|
||||
a = PackageRelation(('foo', 'bar'))
|
||||
assert len(a) == 2
|
||||
assert len(a[0]) == 1
|
||||
assert a[0][0].name == 'foo'
|
||||
assert len(a[1]) == 1
|
||||
assert a[1][0].name == 'bar'
|
||||
|
||||
def test_init_self(self) -> None:
|
||||
a = PackageRelation(PackageRelation(('foo', 'bar')))
|
||||
assert len(a) == 2
|
||||
assert len(a[0]) == 1
|
||||
assert a[0][0].name == 'foo'
|
||||
assert len(a[1]) == 1
|
||||
assert a[1][0].name == 'bar'
|
||||
|
||||
def test_str(self) -> None:
|
||||
a = PackageRelation('foo ,bar')
|
||||
assert str(a) == 'foo, bar'
|
||||
|
||||
|
||||
class TestPackageBuildprofileEntry:
|
||||
def test_parse(self) -> None:
|
||||
a = PackageBuildprofileEntry.parse('<profile1 !profile2 profile3 !profile4>')
|
||||
assert a.pos == {'profile1', 'profile3'}
|
||||
assert a.neg == {'profile2', 'profile4'}
|
||||
assert str(a) == '<profile1 profile3 !profile2 !profile4>'
|
||||
|
||||
def test_eq(self) -> None:
|
||||
a = PackageBuildprofileEntry.parse('<profile1 !profile2>')
|
||||
b = PackageBuildprofileEntry(pos={'profile1'}, neg={'profile2'})
|
||||
assert a == b
|
||||
|
||||
def test_isdisjoint(self) -> None:
|
||||
a = PackageBuildprofileEntry.parse('<profile1 profile2>')
|
||||
b = PackageBuildprofileEntry.parse('<profile1 profile3>')
|
||||
assert a.isdisjoint(b)
|
||||
|
||||
def test_issubset_empty(self) -> None:
|
||||
a = PackageBuildprofileEntry.parse('<profile1 profile2>')
|
||||
b = PackageBuildprofileEntry()
|
||||
assert a.issubset(b)
|
||||
|
||||
def test_issubset_pos(self) -> None:
|
||||
a = PackageBuildprofileEntry.parse('<profile1 profile2>')
|
||||
b = PackageBuildprofileEntry.parse('<profile1>')
|
||||
assert a.issubset(b)
|
||||
|
||||
def test_issubset_neg(self) -> None:
|
||||
a = PackageBuildprofileEntry.parse('<!profile1>')
|
||||
b = PackageBuildprofileEntry.parse('<!profile1 !profile2>')
|
||||
assert a.issubset(b)
|
||||
|
||||
def test_issubset_both(self) -> None:
|
||||
a = PackageBuildprofileEntry.parse('<!profile1 !profile2 profile3>')
|
||||
b = PackageBuildprofileEntry.parse('<!profile1 !profile2 !profile3>')
|
||||
assert a.issubset(b)
|
||||
|
||||
def test_issuperset_empty(self) -> None:
|
||||
a = PackageBuildprofileEntry.parse('<profile1 profile2>')
|
||||
b = PackageBuildprofileEntry()
|
||||
assert b.issuperset(a)
|
||||
|
||||
def test_issuperset_pos(self) -> None:
|
||||
a = PackageBuildprofileEntry.parse('<profile1 profile2>')
|
||||
b = PackageBuildprofileEntry.parse('<profile1>')
|
||||
assert b.issuperset(a)
|
||||
|
||||
def test_issuperset_neg(self) -> None:
|
||||
a = PackageBuildprofileEntry.parse('<!profile1>')
|
||||
b = PackageBuildprofileEntry.parse('<!profile1 !profile2>')
|
||||
assert b.issuperset(a)
|
||||
|
||||
def test_issuperset_both(self) -> None:
|
||||
a = PackageBuildprofileEntry.parse('<!profile1 !profile2 profile3>')
|
||||
b = PackageBuildprofileEntry.parse('<!profile1 !profile2 !profile3>')
|
||||
assert b.issuperset(a)
|
||||
|
||||
def test_update_pos(self) -> None:
|
||||
a = PackageBuildprofileEntry.parse('<profile1 profile2>')
|
||||
b = PackageBuildprofileEntry.parse('<profile1>')
|
||||
a.update(b)
|
||||
assert a.pos == {'profile1'}
|
||||
assert a.neg == set()
|
||||
|
||||
def test_update_neg(self) -> None:
|
||||
a = PackageBuildprofileEntry.parse('<!profile1 !profile2>')
|
||||
b = PackageBuildprofileEntry.parse('<!profile1>')
|
||||
a.update(b)
|
||||
assert a.pos == set()
|
||||
assert a.neg == {'profile1'}
|
||||
|
||||
def test_update_both(self) -> None:
|
||||
a = PackageBuildprofileEntry.parse('<profile1 !profile2 profile3>')
|
||||
b = PackageBuildprofileEntry.parse('<profile1 !profile2 !profile3>')
|
||||
a.update(b)
|
||||
assert a.pos == {'profile1'}
|
||||
assert a.neg == {'profile2'}
|
||||
|
||||
|
||||
class TestPackageBuildprofile:
|
||||
def test_parse(self) -> None:
|
||||
a = PackageBuildprofile.parse('<profile1> <!profile2> <profile3> <!profile4>')
|
||||
assert str(a) == '<profile1> <!profile2> <profile3> <!profile4>'
|
||||
|
||||
def test_update(self) -> None:
|
||||
a = PackageBuildprofile.parse('<profile1 profile2> <profile2>')
|
||||
b = PackageBuildprofile.parse('<profile1> <profile2 !profile3> <profile3>')
|
||||
a.update(b)
|
||||
assert str(a) == '<profile1> <profile2> <profile3>'
|
1
debian/linux-perf.lintian-overrides.amd64
vendored
1
debian/linux-perf.lintian-overrides.amd64
vendored
@ -1,4 +1,5 @@
|
||||
# These executables are needed to handle processes running in compat mode
|
||||
linux-perf: binary-from-other-architecture *usr/lib/perf-core/perf-read-vdso32*
|
||||
linux-perf: binary-from-other-architecture *usr/lib/perf-core/perf-read-vdsox32*
|
||||
|
||||
# Some of these plugins only need symbols from libtraceevent, which
|
||||
|
6
debian/linux-perf.postrm
vendored
6
debian/linux-perf.postrm
vendored
@ -9,8 +9,7 @@ if [ -n "${old_version_suffix}" ] ; then
|
||||
fi
|
||||
unset old_version_suffix
|
||||
|
||||
case "$1" in
|
||||
remove )
|
||||
if [ "$1" = remove ] ; then
|
||||
for wrapper in \
|
||||
/usr/bin/perf \
|
||||
/usr/share/bash-completion/completions/perf \
|
||||
@ -19,7 +18,6 @@ remove )
|
||||
diversion="${wrapper%/perf*}/perf.wrapper${wrapper#*/perf}"
|
||||
dpkg-divert --package linux-perf --divert "${diversion}" --rename --remove "${wrapper}"
|
||||
done ; unset wrapper diversion
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
|
||||
#DEBHELPER#
|
||||
|
@ -16,7 +16,7 @@ correctness.
|
||||
|
||||
--- a/drivers/net/phy/marvell.c
|
||||
+++ b/drivers/net/phy/marvell.c
|
||||
@@ -1366,6 +1366,7 @@ static int m88e1118_config_init(struct p
|
||||
@@ -1409,6 +1409,7 @@ static int m88e1118_config_init(struct p
|
||||
return genphy_soft_reset(phydev);
|
||||
}
|
||||
|
||||
@ -24,7 +24,7 @@ correctness.
|
||||
static int m88e1149_config_init(struct phy_device *phydev)
|
||||
{
|
||||
int err;
|
||||
@@ -1391,7 +1392,9 @@ static int m88e1149_config_init(struct p
|
||||
@@ -1434,7 +1435,9 @@ static int m88e1149_config_init(struct p
|
||||
|
||||
return genphy_soft_reset(phydev);
|
||||
}
|
||||
@ -34,7 +34,7 @@ correctness.
|
||||
static int m88e1145_config_init_rgmii(struct phy_device *phydev)
|
||||
{
|
||||
int err;
|
||||
@@ -1469,6 +1472,7 @@ static int m88e1145_config_init(struct p
|
||||
@@ -1512,6 +1515,7 @@ static int m88e1145_config_init(struct p
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -42,7 +42,7 @@ correctness.
|
||||
|
||||
static int m88e1540_get_fld(struct phy_device *phydev, u8 *msecs)
|
||||
{
|
||||
@@ -3792,6 +3796,7 @@ static struct phy_driver marvell_drivers
|
||||
@@ -3848,6 +3852,7 @@ static struct phy_driver marvell_drivers
|
||||
.led_hw_control_set = m88e1318_led_hw_control_set,
|
||||
.led_hw_control_get = m88e1318_led_hw_control_get,
|
||||
},
|
||||
@ -50,7 +50,7 @@ correctness.
|
||||
{
|
||||
.phy_id = MARVELL_PHY_ID_88E1145,
|
||||
.phy_id_mask = MARVELL_PHY_ID_MASK,
|
||||
@@ -3815,6 +3820,8 @@ static struct phy_driver marvell_drivers
|
||||
@@ -3871,6 +3876,8 @@ static struct phy_driver marvell_drivers
|
||||
.cable_test_start = m88e1111_vct_cable_test_start,
|
||||
.cable_test_get_status = m88e1111_vct_cable_test_get_status,
|
||||
},
|
||||
@ -59,7 +59,7 @@ correctness.
|
||||
{
|
||||
.phy_id = MARVELL_PHY_ID_88E1149R,
|
||||
.phy_id_mask = MARVELL_PHY_ID_MASK,
|
||||
@@ -3833,6 +3840,8 @@ static struct phy_driver marvell_drivers
|
||||
@@ -3889,6 +3896,8 @@ static struct phy_driver marvell_drivers
|
||||
.get_strings = marvell_get_strings,
|
||||
.get_stats = marvell_get_stats,
|
||||
},
|
||||
@ -68,7 +68,7 @@ correctness.
|
||||
{
|
||||
.phy_id = MARVELL_PHY_ID_88E1240,
|
||||
.phy_id_mask = MARVELL_PHY_ID_MASK,
|
||||
@@ -3853,6 +3862,7 @@ static struct phy_driver marvell_drivers
|
||||
@@ -3909,6 +3918,7 @@ static struct phy_driver marvell_drivers
|
||||
.get_tunable = m88e1011_get_tunable,
|
||||
.set_tunable = m88e1011_set_tunable,
|
||||
},
|
||||
@ -76,7 +76,7 @@ correctness.
|
||||
{
|
||||
.phy_id = MARVELL_PHY_ID_88E1116R,
|
||||
.phy_id_mask = MARVELL_PHY_ID_MASK,
|
||||
@@ -4141,9 +4151,9 @@ static struct mdio_device_id __maybe_unu
|
||||
@@ -4197,9 +4207,9 @@ static const struct mdio_device_id __may
|
||||
{ MARVELL_PHY_ID_88E1111_FINISAR, MARVELL_PHY_ID_MASK },
|
||||
{ MARVELL_PHY_ID_88E1118, MARVELL_PHY_ID_MASK },
|
||||
{ MARVELL_PHY_ID_88E1121R, MARVELL_PHY_ID_MASK },
|
||||
|
@ -1,61 +0,0 @@
|
||||
From: Philip Yang <Philip.Yang@amd.com>
|
||||
Date: Wed, 29 Jan 2025 12:37:30 -0500
|
||||
Subject: drm/amdkfd: Fix user queue validation on Gfx7/8
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
Origin: https://gitlab.freedesktop.org/drm/kernel/-/commit/e7a477735f1771b9a9346a5fbd09d7ff0641723a
|
||||
Bug-Debian: https://bugs.debian.org/1093124
|
||||
|
||||
To workaround queue full h/w issue on Gfx7/8, when application create
|
||||
AQL queue, the ring buffer bo allocate size is queue_size/2 and
|
||||
map queue_size ring buffer to GPU in 2 pieces using 2 attachments, each
|
||||
attachment map size is queue_size/2, with same ring_bo backing memory.
|
||||
|
||||
For Gfx7/8, user queue buffer validation should use queue_size/2 to
|
||||
verify ring_bo allocation and mapping size.
|
||||
|
||||
Fixes: 68e599db7a54 ("drm/amdkfd: Validate user queue buffers")
|
||||
Suggested-by: Tomáš Trnka <trnka@scm.com>
|
||||
Signed-off-by: Philip Yang <Philip.Yang@amd.com>
|
||||
Acked-by: Alex Deucher <alexander.deucher@amd.com>
|
||||
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
|
||||
---
|
||||
drivers/gpu/drm/amd/amdkfd/kfd_queue.c | 12 +++++++++++-
|
||||
1 file changed, 11 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/gpu/drm/amd/amdkfd/kfd_queue.c
|
||||
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_queue.c
|
||||
@@ -233,6 +233,7 @@ void kfd_queue_buffer_put(struct amdgpu_
|
||||
int kfd_queue_acquire_buffers(struct kfd_process_device *pdd, struct queue_properties *properties)
|
||||
{
|
||||
struct kfd_topology_device *topo_dev;
|
||||
+ u64 expected_queue_size;
|
||||
struct amdgpu_vm *vm;
|
||||
u32 total_cwsr_size;
|
||||
int err;
|
||||
@@ -241,6 +242,15 @@ int kfd_queue_acquire_buffers(struct kfd
|
||||
if (!topo_dev)
|
||||
return -EINVAL;
|
||||
|
||||
+ /* AQL queues on GFX7 and GFX8 appear twice their actual size */
|
||||
+ if (properties->type == KFD_QUEUE_TYPE_COMPUTE &&
|
||||
+ properties->format == KFD_QUEUE_FORMAT_AQL &&
|
||||
+ topo_dev->node_props.gfx_target_version >= 70000 &&
|
||||
+ topo_dev->node_props.gfx_target_version < 90000)
|
||||
+ expected_queue_size = properties->queue_size / 2;
|
||||
+ else
|
||||
+ expected_queue_size = properties->queue_size;
|
||||
+
|
||||
vm = drm_priv_to_vm(pdd->drm_priv);
|
||||
err = amdgpu_bo_reserve(vm->root.bo, false);
|
||||
if (err)
|
||||
@@ -255,7 +265,7 @@ int kfd_queue_acquire_buffers(struct kfd
|
||||
goto out_err_unreserve;
|
||||
|
||||
err = kfd_queue_buffer_get(vm, (void *)properties->queue_address,
|
||||
- &properties->ring_bo, properties->queue_size);
|
||||
+ &properties->ring_bo, expected_queue_size);
|
||||
if (err)
|
||||
goto out_err_unreserve;
|
||||
|
@ -18,7 +18,7 @@ Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
|
||||
|
||||
--- a/fs/btrfs/super.c
|
||||
+++ b/fs/btrfs/super.c
|
||||
@@ -2618,7 +2618,7 @@ module_exit(exit_btrfs_fs)
|
||||
@@ -2627,7 +2627,7 @@ module_exit(exit_btrfs_fs)
|
||||
|
||||
MODULE_DESCRIPTION("B-Tree File System (BTRFS)");
|
||||
MODULE_LICENSE("GPL");
|
||||
@ -27,19 +27,9 @@ Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
|
||||
MODULE_SOFTDEP("pre: xxhash64");
|
||||
MODULE_SOFTDEP("pre: sha256");
|
||||
MODULE_SOFTDEP("pre: blake2b-256");
|
||||
--- a/fs/ext4/super.c
|
||||
+++ b/fs/ext4/super.c
|
||||
@@ -7447,6 +7447,6 @@ static void __exit ext4_exit_fs(void)
|
||||
MODULE_AUTHOR("Remy Card, Stephen Tweedie, Andrew Morton, Andreas Dilger, Theodore Ts'o and others");
|
||||
MODULE_DESCRIPTION("Fourth Extended Filesystem");
|
||||
MODULE_LICENSE("GPL");
|
||||
-MODULE_SOFTDEP("pre: crc32c");
|
||||
+MODULE_SOFTDEP("pre: crypto-crc32c");
|
||||
module_init(ext4_init_fs)
|
||||
module_exit(ext4_exit_fs)
|
||||
--- a/fs/jbd2/journal.c
|
||||
+++ b/fs/jbd2/journal.c
|
||||
@@ -3181,6 +3181,7 @@ static void __exit journal_exit(void)
|
||||
@@ -3152,6 +3152,7 @@ static void __exit journal_exit(void)
|
||||
|
||||
MODULE_DESCRIPTION("Generic filesystem journal-writing module");
|
||||
MODULE_LICENSE("GPL");
|
||||
@ -49,7 +39,7 @@ Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
|
||||
|
||||
--- a/fs/nfsd/nfsctl.c
|
||||
+++ b/fs/nfsd/nfsctl.c
|
||||
@@ -2384,5 +2384,8 @@ static void __exit exit_nfsd(void)
|
||||
@@ -2344,5 +2344,8 @@ static void __exit exit_nfsd(void)
|
||||
MODULE_AUTHOR("Olaf Kirch <okir@monad.swb.de>");
|
||||
MODULE_DESCRIPTION("In-kernel NFS server");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
@ -15,16 +15,16 @@ Signed-off-by: Ben Hutchings <benh@debian.org>
|
||||
---
|
||||
--- a/scripts/Makefile.btf
|
||||
+++ b/scripts/Makefile.btf
|
||||
@@ -12,8 +12,6 @@ endif
|
||||
@@ -14,8 +14,6 @@ endif
|
||||
|
||||
pahole-flags-$(call test-ge, $(pahole-ver), 121) += --btf_gen_floats
|
||||
|
||||
-pahole-flags-$(call test-ge, $(pahole-ver), 122) += -j
|
||||
-pahole-flags-$(call test-ge, $(pahole-ver), 122) += -j$(JOBS)
|
||||
-
|
||||
pahole-flags-$(call test-ge, $(pahole-ver), 125) += --skip_encoding_btf_inconsistent_proto --btf_gen_optimized
|
||||
|
||||
else
|
||||
@@ -27,6 +25,18 @@ endif
|
||||
@@ -29,6 +27,18 @@ endif
|
||||
|
||||
endif
|
||||
|
||||
@ -35,9 +35,9 @@ Signed-off-by: Ben Hutchings <benh@debian.org>
|
||||
+# Assume that if KBUILD_BUILD_TIMESTAMP is set then a reproducible
|
||||
+# build is required and we must not use -j alone.
|
||||
+ifeq ($(KBUILD_BUILD_TIMESTAMP),)
|
||||
+pahole-flags-$(call test-ge, $(pahole-ver), 122) += -j
|
||||
+pahole-flags-$(call test-ge, $(pahole-ver), 122) += -j$(JOBS)
|
||||
+else
|
||||
+pahole-flags-$(call test-ge, $(pahole-ver), 127) += -j --btf_features=+reproducible_build
|
||||
+pahole-flags-$(call test-ge, $(pahole-ver), 127) += -j$(JOBS) --btf_features=+reproducible_build
|
||||
+endif
|
||||
+
|
||||
pahole-flags-$(CONFIG_PAHOLE_HAS_LANG_EXCLUDE) += --lang_exclude=rust
|
||||
|
@ -9,7 +9,7 @@ sources.
|
||||
|
||||
--- a/scripts/Makefile.build
|
||||
+++ b/scripts/Makefile.build
|
||||
@@ -195,6 +195,11 @@ cmd_record_mcount = $(if $(findstring $(
|
||||
@@ -188,6 +188,11 @@ cmd_record_mcount = $(if $(findstring $(
|
||||
$(sub_cmd_record_mcount))
|
||||
endif # CONFIG_FTRACE_MCOUNT_USE_RECORDMCOUNT
|
||||
|
||||
|
@ -9,7 +9,7 @@ alternative may allow subverting module signing.
|
||||
---
|
||||
--- a/kernel/module/version.c
|
||||
+++ b/kernel/module/version.c
|
||||
@@ -46,9 +46,8 @@ int check_version(const struct load_info
|
||||
@@ -63,9 +63,8 @@ int check_version(const struct load_info
|
||||
goto bad_version;
|
||||
}
|
||||
|
||||
|
@ -1,33 +0,0 @@
|
||||
From: Scott Mayhew <smayhew@redhat.com>
|
||||
Date: Tue, 10 Dec 2024 07:25:54 -0500
|
||||
Subject: nfsd: fix legacy client tracking initialization
|
||||
Origin: https://git.kernel.org/pub/scm/linux/kernel/git/cel/linux.git/commit/?h=nfsd-next&id=45cd8c0c13fe5c9f1b926bd307df431f8f1b8a16
|
||||
Bug: https://bugzilla.kernel.org/show_bug.cgi?id=219580
|
||||
Bug-Debian: https://bugs.debian.org/1087900
|
||||
|
||||
Get rid of the nfsd4_legacy_tracking_ops->init() call in
|
||||
check_for_legacy_methods(). That will be handled in the caller
|
||||
(nfsd4_client_tracking_init()). Otherwise, we'll wind up calling
|
||||
nfsd4_legacy_tracking_ops->init() twice, and the second time we'll
|
||||
trigger the BUG_ON() in nfsd4_init_recdir().
|
||||
|
||||
Fixes: 74fd48739d04 ("nfsd: new Kconfig option for legacy client tracking")
|
||||
Reported-by: Jur van der Burg <jur@avtware.com>
|
||||
Link: https://bugzilla.kernel.org/show_bug.cgi?id=219580
|
||||
Signed-off-by: Scott Mayhew <smayhew@redhat.com>
|
||||
Reviewed-by: Jeff Layton <jlayton@kernel.org>
|
||||
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
|
||||
---
|
||||
fs/nfsd/nfs4recover.c | 1 -
|
||||
1 file changed, 1 deletion(-)
|
||||
|
||||
--- a/fs/nfsd/nfs4recover.c
|
||||
+++ b/fs/nfsd/nfs4recover.c
|
||||
@@ -2052,7 +2052,6 @@ static inline int check_for_legacy_metho
|
||||
path_put(&path);
|
||||
if (status)
|
||||
return -ENOTDIR;
|
||||
- status = nn->client_tracking_ops->init(net);
|
||||
}
|
||||
return status;
|
||||
}
|
31
debian/patches/bugfix/all/perf-docs-Fix-perf-check-manual-page-built-with-asci.patch
vendored
Normal file
31
debian/patches/bugfix/all/perf-docs-Fix-perf-check-manual-page-built-with-asci.patch
vendored
Normal file
@ -0,0 +1,31 @@
|
||||
From: Ben Hutchings <benh@debian.org>
|
||||
Date: Sun, 23 Mar 2025 21:04:02 +0100
|
||||
Subject: [PATCH] perf docs: Fix perf-check manual page built with asciidoctor
|
||||
Forwarded: https://lore.kernel.org/linux-perf-users/Z-BxCE8WrcRmR_5f@decadent.org.uk/
|
||||
|
||||
asciidoctor is more picky than asciidoc about the length of heading
|
||||
underlines, and currently mis-parses perf-check.txt:
|
||||
|
||||
ASCIIDOC perf-check.1
|
||||
asciidoctor: ERROR: perf-check.txt: line 1: non-conforming manpage title
|
||||
asciidoctor: ERROR: perf-check.txt: line 1: name section expected
|
||||
asciidoctor: WARNING: perf-check.txt: line 2: unterminated example block
|
||||
asciidoctor: WARNING: perf-check.txt: line 5: unterminated listing block
|
||||
|
||||
Fix the length of the title underline so it works properly.
|
||||
|
||||
Fixes: 98ad0b77323c ("perf check: Introduce 'check' subcommand")
|
||||
Signed-off-by: Ben Hutchings <benh@debian.org>
|
||||
---
|
||||
tools/perf/Documentation/perf-check.txt | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/tools/perf/Documentation/perf-check.txt
|
||||
+++ b/tools/perf/Documentation/perf-check.txt
|
||||
@@ -1,5 +1,5 @@
|
||||
perf-check(1)
|
||||
-===============
|
||||
+=============
|
||||
|
||||
NAME
|
||||
----
|
2
debian/patches/bugfix/all/perf-tools-pass-extra_cflags-through-to-libbpf-build-again.patch
vendored
2
debian/patches/bugfix/all/perf-tools-pass-extra_cflags-through-to-libbpf-build-again.patch
vendored
@ -16,7 +16,7 @@ Signed-off-by: Ben Hutchings <benh@debian.org>
|
||||
---
|
||||
--- a/tools/perf/Makefile.perf
|
||||
+++ b/tools/perf/Makefile.perf
|
||||
@@ -953,7 +953,7 @@ $(LIBAPI)-clean:
|
||||
@@ -945,7 +945,7 @@ $(LIBAPI)-clean:
|
||||
$(LIBBPF): FORCE | $(LIBBPF_OUTPUT)
|
||||
$(Q)$(MAKE) -C $(LIBBPF_DIR) FEATURES_DUMP=$(FEATURE_DUMP_EXPORT) \
|
||||
O= OUTPUT=$(LIBBPF_OUTPUT)/ DESTDIR=$(LIBBPF_DESTDIR) prefix= subdir= \
|
||||
|
6
debian/patches/bugfix/all/radeon-amdgpu-firmware-is-required-for-drm-and-kms-on-r600-onward.patch
vendored
6
debian/patches/bugfix/all/radeon-amdgpu-firmware-is-required-for-drm-and-kms-on-r600-onward.patch
vendored
@ -36,7 +36,7 @@ of the patch
|
||||
--- a/drivers/gpu/drm/radeon/radeon_drv.c
|
||||
+++ b/drivers/gpu/drm/radeon/radeon_drv.c
|
||||
@@ -32,6 +32,8 @@
|
||||
|
||||
#include <linux/aperture.h>
|
||||
#include <linux/compat.h>
|
||||
#include <linux/module.h>
|
||||
+#include <linux/namei.h>
|
||||
@ -73,7 +73,7 @@ of the patch
|
||||
static int radeon_pci_probe(struct pci_dev *pdev,
|
||||
const struct pci_device_id *ent)
|
||||
{
|
||||
@@ -296,6 +320,12 @@ static int radeon_pci_probe(struct pci_d
|
||||
@@ -297,6 +321,12 @@ static int radeon_pci_probe(struct pci_d
|
||||
if (vga_switcheroo_client_probe_defer(pdev))
|
||||
return -EPROBE_DEFER;
|
||||
|
||||
@ -84,5 +84,5 @@ of the patch
|
||||
+ }
|
||||
+
|
||||
/* Get rid of things like offb */
|
||||
ret = drm_aperture_remove_conflicting_pci_framebuffers(pdev, &kms_driver);
|
||||
ret = aperture_remove_conflicting_pci_devices(pdev, kms_driver.name);
|
||||
if (ret)
|
||||
|
@ -6,7 +6,7 @@ Signed-off-by: Ben Hutchings <benh@debian.org>
|
||||
---
|
||||
--- a/tools/perf/Makefile.perf
|
||||
+++ b/tools/perf/Makefile.perf
|
||||
@@ -927,7 +927,7 @@ $(OUTPUT)dlfilters/%.o: dlfilters/%.c in
|
||||
@@ -919,7 +919,7 @@ $(OUTPUT)dlfilters/%.o: dlfilters/%.c in
|
||||
.SECONDARY: $(DLFILTERS:.so=.o)
|
||||
|
||||
$(OUTPUT)dlfilters/%.so: $(OUTPUT)dlfilters/%.o
|
||||
|
@ -1,22 +0,0 @@
|
||||
From: Ben Hutchings <ben@decadent.org.uk>
|
||||
Date: Fri, 25 Sep 2015 22:50:50 +0100
|
||||
Subject: Revert "perf build: Fix libunwind feature detection on 32-bit x86"
|
||||
Forwarded: no
|
||||
|
||||
This reverts commit 05b41775e2edd69a83f592e3534930c934d4038e.
|
||||
It broke feature detection that was working just fine for us.
|
||||
---
|
||||
tools/perf/Makefile.config | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/tools/perf/Makefile.config
|
||||
+++ b/tools/perf/Makefile.config
|
||||
@@ -56,7 +56,7 @@ ifeq ($(SRCARCH),x86)
|
||||
LIBUNWIND_LIBS = -lunwind-x86_64 -lunwind -llzma
|
||||
$(call detected,CONFIG_X86_64)
|
||||
else
|
||||
- LIBUNWIND_LIBS = -lunwind-x86 -llzma -lunwind
|
||||
+ LIBUNWIND_LIBS = -lunwind -lunwind-x86
|
||||
endif
|
||||
endif
|
||||
|
@ -21,7 +21,7 @@ Signed-off-by: Serge Hallyn <serge.hallyn@ubuntu.com>
|
||||
|
||||
--- a/kernel/fork.c
|
||||
+++ b/kernel/fork.c
|
||||
@@ -120,6 +120,12 @@
|
||||
@@ -119,6 +119,12 @@
|
||||
|
||||
#include <kunit/visibility.h>
|
||||
|
||||
@ -34,7 +34,7 @@ Signed-off-by: Serge Hallyn <serge.hallyn@ubuntu.com>
|
||||
/*
|
||||
* Minimum number of threads to boot the kernel
|
||||
*/
|
||||
@@ -2157,6 +2163,10 @@ __latent_entropy struct task_struct *cop
|
||||
@@ -2167,6 +2173,10 @@ __latent_entropy struct task_struct *cop
|
||||
if ((clone_flags & (CLONE_NEWUSER|CLONE_FS)) == (CLONE_NEWUSER|CLONE_FS))
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
@ -45,7 +45,7 @@ Signed-off-by: Serge Hallyn <serge.hallyn@ubuntu.com>
|
||||
/*
|
||||
* Thread groups must share signals as well, and detached threads
|
||||
* can only be started up within the thread group.
|
||||
@@ -3310,6 +3320,12 @@ int ksys_unshare(unsigned long unshare_f
|
||||
@@ -3320,6 +3330,12 @@ int ksys_unshare(unsigned long unshare_f
|
||||
if (unshare_flags & CLONE_NEWNS)
|
||||
unshare_flags |= CLONE_FS;
|
||||
|
||||
@ -71,7 +71,7 @@ Signed-off-by: Serge Hallyn <serge.hallyn@ubuntu.com>
|
||||
#endif /* CONFIG_SYSCTL */
|
||||
|
||||
/*
|
||||
@@ -1618,6 +1622,15 @@ static struct ctl_table kern_table[] = {
|
||||
@@ -1617,6 +1621,15 @@ static const struct ctl_table kern_table
|
||||
.mode = 0644,
|
||||
.proc_handler = proc_dointvec,
|
||||
},
|
||||
|
@ -22,7 +22,7 @@ implementation went from disk-io.c to super.c; forwarded the issue]
|
||||
|
||||
--- a/fs/btrfs/super.c
|
||||
+++ b/fs/btrfs/super.c
|
||||
@@ -766,6 +766,18 @@ static void set_device_specific_options(
|
||||
@@ -765,6 +765,18 @@ static void set_device_specific_options(
|
||||
btrfs_set_opt(fs_info->mount_opt, SSD);
|
||||
|
||||
/*
|
||||
|
2
debian/patches/debian/dccp-disable-auto-loading-as-mitigation-against-local-exploits.patch
vendored
2
debian/patches/debian/dccp-disable-auto-loading-as-mitigation-against-local-exploits.patch
vendored
@ -15,7 +15,7 @@ Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
|
||||
---
|
||||
--- a/net/dccp/ipv4.c
|
||||
+++ b/net/dccp/ipv4.c
|
||||
@@ -1098,8 +1098,8 @@ module_exit(dccp_v4_exit);
|
||||
@@ -1099,8 +1099,8 @@ module_exit(dccp_v4_exit);
|
||||
* values directly, Also cover the case where the protocol is not specified,
|
||||
* i.e. net-pf-PF_INET-proto-0-type-SOCK_DCCP
|
||||
*/
|
||||
|
@ -15,14 +15,13 @@ probably discontinued 10 years ago.
|
||||
---
|
||||
--- a/drivers/video/fbdev/Kconfig
|
||||
+++ b/drivers/video/fbdev/Kconfig
|
||||
@@ -657,100 +657,6 @@ config FB_ATMEL
|
||||
@@ -658,102 +658,6 @@ config FB_ATMEL
|
||||
help
|
||||
This enables support for the AT91 LCD Controller.
|
||||
|
||||
-config FB_NVIDIA
|
||||
- tristate "nVidia Framebuffer Support"
|
||||
- depends on FB && PCI
|
||||
- select FB_BACKLIGHT if FB_NVIDIA_BACKLIGHT
|
||||
- select FB_CFB_FILLRECT
|
||||
- select FB_CFB_COPYAREA
|
||||
- select FB_CFB_IMAGEBLIT
|
||||
@ -62,6 +61,8 @@ probably discontinued 10 years ago.
|
||||
-config FB_NVIDIA_BACKLIGHT
|
||||
- bool "Support for backlight control"
|
||||
- depends on FB_NVIDIA
|
||||
- depends on BACKLIGHT_CLASS_DEVICE=y || BACKLIGHT_CLASS_DEVICE=FB_NVIDIA
|
||||
- select FB_BACKLIGHT
|
||||
- default y
|
||||
- help
|
||||
- Say Y here if you want to control the backlight of your display.
|
||||
@ -69,7 +70,6 @@ probably discontinued 10 years ago.
|
||||
-config FB_RIVA
|
||||
- tristate "nVidia Riva support"
|
||||
- depends on FB && PCI
|
||||
- select FB_BACKLIGHT if FB_RIVA_BACKLIGHT
|
||||
- select FB_CFB_FILLRECT
|
||||
- select FB_CFB_COPYAREA
|
||||
- select FB_CFB_IMAGEBLIT
|
||||
@ -109,6 +109,8 @@ probably discontinued 10 years ago.
|
||||
-config FB_RIVA_BACKLIGHT
|
||||
- bool "Support for backlight control"
|
||||
- depends on FB_RIVA
|
||||
- depends on BACKLIGHT_CLASS_DEVICE=y || BACKLIGHT_CLASS_DEVICE=FB_RIVA
|
||||
- select FB_BACKLIGHT
|
||||
- default y
|
||||
- help
|
||||
- Say Y here if you want to control the backlight of your display.
|
||||
|
@ -22,7 +22,7 @@ Export the currently un-exported symbols it depends on.
|
||||
|
||||
--- a/fs/file.c
|
||||
+++ b/fs/file.c
|
||||
@@ -793,6 +793,7 @@ struct file *file_close_fd(unsigned int
|
||||
@@ -837,6 +837,7 @@ struct file *file_close_fd(unsigned int
|
||||
|
||||
return file;
|
||||
}
|
||||
@ -72,7 +72,7 @@ Export the currently un-exported symbols it depends on.
|
||||
* Note: we use "set_current_state()" _after_ the wait-queue add,
|
||||
--- a/kernel/task_work.c
|
||||
+++ b/kernel/task_work.c
|
||||
@@ -108,6 +108,7 @@ int task_work_add(struct task_struct *ta
|
||||
@@ -96,6 +96,7 @@ int task_work_add(struct task_struct *ta
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -82,7 +82,7 @@ Export the currently un-exported symbols it depends on.
|
||||
* task_work_cancel_match - cancel a pending work added by task_work_add()
|
||||
--- a/mm/memory.c
|
||||
+++ b/mm/memory.c
|
||||
@@ -1937,6 +1937,7 @@ void zap_page_range_single(struct vm_are
|
||||
@@ -2030,6 +2030,7 @@ void zap_page_range_single(struct vm_are
|
||||
tlb_finish_mmu(&tlb);
|
||||
hugetlb_zap_end(vma, details);
|
||||
}
|
||||
@ -92,7 +92,7 @@ Export the currently un-exported symbols it depends on.
|
||||
* zap_vma_ptes - remove ptes mapping the vma
|
||||
--- a/security/security.c
|
||||
+++ b/security/security.c
|
||||
@@ -997,6 +997,7 @@ int security_binder_set_context_mgr(cons
|
||||
@@ -996,6 +996,7 @@ int security_binder_set_context_mgr(cons
|
||||
{
|
||||
return call_int_hook(binder_set_context_mgr, mgr);
|
||||
}
|
||||
@ -100,7 +100,7 @@ Export the currently un-exported symbols it depends on.
|
||||
|
||||
/**
|
||||
* security_binder_transaction() - Check if a binder transaction is allowed
|
||||
@@ -1012,6 +1013,7 @@ int security_binder_transaction(const st
|
||||
@@ -1011,6 +1012,7 @@ int security_binder_transaction(const st
|
||||
{
|
||||
return call_int_hook(binder_transaction, from, to);
|
||||
}
|
||||
@ -108,7 +108,7 @@ Export the currently un-exported symbols it depends on.
|
||||
|
||||
/**
|
||||
* security_binder_transfer_binder() - Check if a binder transfer is allowed
|
||||
@@ -1027,6 +1029,7 @@ int security_binder_transfer_binder(cons
|
||||
@@ -1026,6 +1028,7 @@ int security_binder_transfer_binder(cons
|
||||
{
|
||||
return call_int_hook(binder_transfer_binder, from, to);
|
||||
}
|
||||
@ -116,7 +116,7 @@ Export the currently un-exported symbols it depends on.
|
||||
|
||||
/**
|
||||
* security_binder_transfer_file() - Check if a binder file xfer is allowed
|
||||
@@ -1043,6 +1046,7 @@ int security_binder_transfer_file(const
|
||||
@@ -1042,6 +1045,7 @@ int security_binder_transfer_file(const
|
||||
{
|
||||
return call_int_hook(binder_transfer_file, from, to, file);
|
||||
}
|
||||
|
@ -12,7 +12,7 @@ actually used.
|
||||
---
|
||||
--- a/fs/notify/fanotify/fanotify_user.c
|
||||
+++ b/fs/notify/fanotify/fanotify_user.c
|
||||
@@ -1763,6 +1763,14 @@ static int do_fanotify_mark(int fanotify
|
||||
@@ -1838,6 +1838,14 @@ static int do_fanotify_mark(int fanotify
|
||||
umask = FANOTIFY_EVENT_FLAGS;
|
||||
}
|
||||
|
||||
@ -24,6 +24,6 @@ actually used.
|
||||
+ }
|
||||
+#endif
|
||||
+
|
||||
f = fdget(fanotify_fd);
|
||||
if (unlikely(!fd_file(f)))
|
||||
CLASS(fd, f)(fanotify_fd);
|
||||
if (fd_empty(f))
|
||||
return -EBADF;
|
||||
|
@ -9,7 +9,7 @@ This reverts commit 561ec64ae67ef25cac8d72bb9c4bfc955edfd415
|
||||
|
||||
--- a/fs/namei.c
|
||||
+++ b/fs/namei.c
|
||||
@@ -1034,8 +1034,8 @@ static inline void put_link(struct namei
|
||||
@@ -1094,8 +1094,8 @@ static inline void put_link(struct namei
|
||||
path_put(&last->link);
|
||||
}
|
||||
|
||||
|
@ -16,8 +16,8 @@ The error message is based on that used in commit 0126be38d988
|
||||
---
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -134,6 +134,18 @@ ifeq ("$(origin M)", "command line")
|
||||
KBUILD_EXTMOD := $(M)
|
||||
@@ -138,6 +138,18 @@ ifeq ("$(origin MO)", "command line")
|
||||
KBUILD_EXTMOD_OUTPUT := $(MO)
|
||||
endif
|
||||
|
||||
+# Old syntax make ... SUBDIRS=$PWD should be rejected to avoid mishaps
|
||||
|
@ -27,27 +27,27 @@ rules.real and change Makefile.modfinal to look for it in both places.
|
||||
|
||||
--- a/scripts/Makefile.modfinal
|
||||
+++ b/scripts/Makefile.modfinal
|
||||
@@ -33,11 +33,13 @@ quiet_cmd_cc_o_c = CC [M] $@
|
||||
$(extmod_prefix).module-common.o: $(srctree)/scripts/module-common.c FORCE
|
||||
$(call if_changed_dep,cc_o_c)
|
||||
@@ -28,11 +28,13 @@ ccflags-remove-y := $(CC_FLAGS_CFI)
|
||||
.module-common.o: $(srctree)/scripts/module-common.c FORCE
|
||||
$(call if_changed_rule,cc_o_c)
|
||||
|
||||
+ARCH_MODULE_LDS := $(word 1,$(wildcard scripts/module.lds arch/$(SRCARCH)/module.lds))
|
||||
+ARCH_MODULE_LDS := $(word 1,$(wildcard $(objtree)/scripts/module.lds $(objtree)/arch/$(SRCARCH)/module.lds))
|
||||
+
|
||||
quiet_cmd_ld_ko_o = LD [M] $@
|
||||
cmd_ld_ko_o = \
|
||||
$(LD) -r $(KBUILD_LDFLAGS) \
|
||||
$(KBUILD_LDFLAGS_MODULE) $(LDFLAGS_MODULE) \
|
||||
- -T scripts/module.lds -o $@ $(filter %.o, $^)
|
||||
- -T $(objtree)/scripts/module.lds -o $@ $(filter %.o, $^)
|
||||
+ -T $(ARCH_MODULE_LDS) -o $@ $(filter %.o, $^)
|
||||
|
||||
quiet_cmd_btf_ko = BTF [M] $@
|
||||
cmd_btf_ko = \
|
||||
@@ -57,7 +59,7 @@ if_changed_except = $(if $(call newer_pr
|
||||
@@ -52,7 +54,7 @@ if_changed_except = $(if $(call newer_pr
|
||||
printf '%s\n' 'savedcmd_$@ := $(make-cmd)' > $(dot-target).cmd, @:)
|
||||
|
||||
# Re-generate module BTFs if either module's .ko or vmlinux changed
|
||||
-%.ko: %.o %.mod.o $(extmod_prefix).module-common.o scripts/module.lds $(and $(CONFIG_DEBUG_INFO_BTF_MODULES),$(KBUILD_BUILTIN),vmlinux) FORCE
|
||||
+%.ko: %.o %.mod.o $(extmod_prefix).module-common.o $(ARCH_MODULE_LDS) $(and $(CONFIG_DEBUG_INFO_BTF_MODULES),$(KBUILD_BUILTIN),vmlinux) FORCE
|
||||
+$(call if_changed_except,ld_ko_o,vmlinux)
|
||||
-%.ko: %.o %.mod.o .module-common.o $(objtree)/scripts/module.lds $(and $(CONFIG_DEBUG_INFO_BTF_MODULES),$(KBUILD_BUILTIN),$(objtree)/vmlinux) FORCE
|
||||
+%.ko: %.o %.mod.o .module-common.o $(ARCH_MODULE_LDS) $(and $(CONFIG_DEBUG_INFO_BTF_MODULES),$(KBUILD_BUILTIN),$(objtree)/vmlinux) FORCE
|
||||
+$(call if_changed_except,ld_ko_o,$(objtree)/vmlinux)
|
||||
ifdef CONFIG_DEBUG_INFO_BTF_MODULES
|
||||
+$(if $(newer-prereqs),$(call cmd,btf_ko))
|
||||
|
8
debian/patches/debian/kernelvariables.patch
vendored
8
debian/patches/debian/kernelvariables.patch
vendored
@ -14,10 +14,12 @@ use of $(ARCH) needs to be moved after this.
|
||||
|
||||
[bwh: Updated for 5.3: include .kernelvariables from current directory
|
||||
rather than using undefined $(obj).]
|
||||
|
||||
[carnil: Update for 6.13: Include .kernelvariables from $(objtree).]
|
||||
---
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -380,36 +380,6 @@ include $(srctree)/scripts/subarch.inclu
|
||||
@@ -405,36 +405,6 @@ include $(srctree)/scripts/subarch.inclu
|
||||
# Note: Some architectures assign CROSS_COMPILE in their arch/*/Makefile
|
||||
ARCH ?= $(SUBARCH)
|
||||
|
||||
@ -54,11 +56,11 @@ use of $(ARCH) needs to be moved after this.
|
||||
KCONFIG_CONFIG ?= .config
|
||||
export KCONFIG_CONFIG
|
||||
|
||||
@@ -529,6 +499,35 @@ RUSTFLAGS_KERNEL =
|
||||
@@ -555,6 +525,35 @@ RUSTFLAGS_KERNEL =
|
||||
AFLAGS_KERNEL =
|
||||
LDFLAGS_vmlinux =
|
||||
|
||||
+-include .kernelvariables
|
||||
+-include $(objtree)/.kernelvariables
|
||||
+
|
||||
+# Architecture as present in compile.h
|
||||
+UTS_MACHINE := $(ARCH)
|
||||
|
@ -15,7 +15,7 @@ to the installed location.
|
||||
---
|
||||
--- a/tools/perf/builtin-report.c
|
||||
+++ b/tools/perf/builtin-report.c
|
||||
@@ -662,10 +662,12 @@ static int report__browse_hists(struct r
|
||||
@@ -660,10 +660,12 @@ static int report__browse_hists(struct r
|
||||
|
||||
path = system_path(TIPDIR);
|
||||
if (perf_tip(&help, path) || help == NULL) {
|
||||
@ -30,10 +30,10 @@ to the installed location.
|
||||
free(path);
|
||||
--- a/tools/perf/tests/Build
|
||||
+++ b/tools/perf/tests/Build
|
||||
@@ -73,7 +73,7 @@ perf-test-$(CONFIG_DWARF_UNWIND) += dwar
|
||||
@@ -73,7 +73,7 @@ ifeq ($(SRCARCH),$(filter $(SRCARCH),x86
|
||||
perf-test-$(CONFIG_DWARF_UNWIND) += dwarf-unwind.o
|
||||
endif
|
||||
|
||||
CFLAGS_attr.o += -DBINDIR="BUILD_STR($(bindir_SQ))" -DPYTHON="BUILD_STR($(PYTHON_WORD))"
|
||||
-CFLAGS_python-use.o += -DPYTHONPATH="BUILD_STR($(OUTPUT)python)" -DPYTHON="BUILD_STR($(PYTHON_WORD))"
|
||||
+CFLAGS_python-use.o += -DPYTHONPATH="BUILD_STR($(perfexec_instdir_SQ)/scripts/python)" -DPYTHON="BUILD_STR($(PYTHON_WORD))"
|
||||
CFLAGS_dwarf-unwind.o += -fno-optimize-sibling-calls
|
||||
|
@ -20,7 +20,7 @@ is non-empty.
|
||||
---
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -1825,7 +1825,7 @@ PHONY += prepare
|
||||
@@ -1873,7 +1873,7 @@ PHONY += prepare
|
||||
# now expand this into a simple variable to reduce the cost of shell evaluations
|
||||
prepare: CC_VERSION_TEXT := $(CC_VERSION_TEXT)
|
||||
prepare:
|
||||
|
@ -10,7 +10,7 @@ Forwarded: not-needed
|
||||
|
||||
--- a/tools/perf/Makefile.perf
|
||||
+++ b/tools/perf/Makefile.perf
|
||||
@@ -1153,7 +1153,7 @@ install-bin: install-tools install-tests
|
||||
@@ -1139,7 +1139,7 @@ install-bin: install-tools install-tests
|
||||
install: install-bin try-install-man
|
||||
|
||||
install-python_ext:
|
||||
|
@ -4,7 +4,7 @@ Subject: linux-tools: Install perf-read-vdso{,x}32 in directory under /usr/lib
|
||||
|
||||
--- a/tools/perf/Makefile.perf
|
||||
+++ b/tools/perf/Makefile.perf
|
||||
@@ -1075,21 +1075,21 @@ install-tools: all install-gtk
|
||||
@@ -1067,21 +1067,21 @@ install-tools: all install-gtk
|
||||
$(LN) '$(DESTDIR_SQ)$(bindir_SQ)/perf' '$(DESTDIR_SQ)$(bindir_SQ)/trace'; \
|
||||
$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(includedir_SQ)/perf'; \
|
||||
$(INSTALL) -m 644 include/perf/perf_dlfilter.h -t '$(DESTDIR_SQ)$(includedir_SQ)/perf'
|
||||
|
@ -19,7 +19,7 @@ Forwarded: not-needed
|
||||
|
||||
/* describe a ptrace relationship for potential exception */
|
||||
struct ptrace_relation {
|
||||
@@ -476,7 +476,7 @@ static inline void yama_init_sysctl(void
|
||||
@@ -474,7 +474,7 @@ static inline void yama_init_sysctl(void
|
||||
|
||||
static int __init yama_init(void)
|
||||
{
|
||||
|
153
debian/patches/features/all/lockdown/arm64-add-kernel-config-option-to-lock-down-when.patch
vendored
153
debian/patches/features/all/lockdown/arm64-add-kernel-config-option-to-lock-down-when.patch
vendored
@ -1,153 +0,0 @@
|
||||
From: Linn Crosetto <linn@hpe.com>
|
||||
Date: Tue, 30 Aug 2016 11:54:38 -0600
|
||||
Subject: arm64: add kernel config option to lock down when in Secure Boot mode
|
||||
Bug-Debian: https://bugs.debian.org/831827
|
||||
Forwarded: no
|
||||
|
||||
Add a kernel configuration option to lock down the kernel, to restrict
|
||||
userspace's ability to modify the running kernel when UEFI Secure Boot is
|
||||
enabled. Based on the x86 patch by Matthew Garrett.
|
||||
|
||||
Determine the state of Secure Boot in the EFI stub and pass this to the
|
||||
kernel using the FDT.
|
||||
|
||||
Signed-off-by: Linn Crosetto <linn@hpe.com>
|
||||
[bwh: Forward-ported to 4.10: adjust context]
|
||||
[Lukas Wunner: Forward-ported to 4.11: drop parts applied upstream]
|
||||
[bwh: Forward-ported to 4.15 and lockdown patch set:
|
||||
- Pass result of efi_get_secureboot() in stub through to
|
||||
efi_set_secure_boot() in main kernel
|
||||
- Use lockdown API and naming]
|
||||
[bwh: Forward-ported to 4.19.3: adjust context in update_fdt()]
|
||||
[dannf: Moved init_lockdown() call after uefi_init(), fixing SB detection]
|
||||
[bwh: Drop call to init_lockdown(), as efi_set_secure_boot() now calls this]
|
||||
[bwh: Forward-ported to 5.6: efi_get_secureboot() no longer takes a
|
||||
sys_table parameter]
|
||||
[bwh: Forward-ported to 5.7: EFI initialisation from FDT was rewritten, so:
|
||||
- Add Secure Boot mode to the parameter enumeration in fdtparams.c
|
||||
- Add a parameter to efi_get_fdt_params() to return the Secure Boot mode
|
||||
- Since Xen does not have a property name defined for Secure Boot mode,
|
||||
change efi_get_fdt_prop() to handle a missing property name by clearing
|
||||
the output variable]
|
||||
[Salvatore Bonaccorso: Forward-ported to 5.10: f30f242fb131 ("efi: Rename
|
||||
arm-init to efi-init common for all arch") renamed arm-init.c to efi-init.c]
|
||||
---
|
||||
drivers/firmware/efi/efi-init.c | 5 ++++-
|
||||
drivers/firmware/efi/fdtparams.c | 12 +++++++++++-
|
||||
drivers/firmware/efi/libstub/fdt.c | 6 ++++++
|
||||
include/linux/efi.h | 3 ++-
|
||||
4 files changed, 23 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/drivers/firmware/efi/efi-init.c
|
||||
+++ b/drivers/firmware/efi/efi-init.c
|
||||
@@ -213,9 +213,10 @@ void __init efi_init(void)
|
||||
{
|
||||
struct efi_memory_map_data data;
|
||||
u64 efi_system_table;
|
||||
+ u32 secure_boot;
|
||||
|
||||
/* Grab UEFI information placed in FDT by stub */
|
||||
- efi_system_table = efi_get_fdt_params(&data);
|
||||
+ efi_system_table = efi_get_fdt_params(&data, &secure_boot);
|
||||
if (!efi_system_table)
|
||||
return;
|
||||
|
||||
@@ -237,6 +238,8 @@ void __init efi_init(void)
|
||||
return;
|
||||
}
|
||||
|
||||
+ efi_set_secure_boot(secure_boot);
|
||||
+
|
||||
reserve_regions();
|
||||
/*
|
||||
* For memblock manipulation, the cap should come after the memblock_add().
|
||||
--- a/drivers/firmware/efi/fdtparams.c
|
||||
+++ b/drivers/firmware/efi/fdtparams.c
|
||||
@@ -16,6 +16,7 @@ enum {
|
||||
MMSIZE,
|
||||
DCSIZE,
|
||||
DCVERS,
|
||||
+ SBMODE,
|
||||
|
||||
PARAMCOUNT
|
||||
};
|
||||
@@ -26,6 +27,7 @@ static __initconst const char name[][22]
|
||||
[MMSIZE] = "MemMap Size ",
|
||||
[DCSIZE] = "MemMap Desc. Size ",
|
||||
[DCVERS] = "MemMap Desc. Version ",
|
||||
+ [SBMODE] = "Secure Boot Enabled ",
|
||||
};
|
||||
|
||||
static __initconst const struct {
|
||||
@@ -43,6 +45,7 @@ static __initconst const struct {
|
||||
[MMSIZE] = "xen,uefi-mmap-size",
|
||||
[DCSIZE] = "xen,uefi-mmap-desc-size",
|
||||
[DCVERS] = "xen,uefi-mmap-desc-ver",
|
||||
+ [SBMODE] = "",
|
||||
}
|
||||
}, {
|
||||
#endif
|
||||
@@ -53,6 +56,7 @@ static __initconst const struct {
|
||||
[MMSIZE] = "linux,uefi-mmap-size",
|
||||
[DCSIZE] = "linux,uefi-mmap-desc-size",
|
||||
[DCVERS] = "linux,uefi-mmap-desc-ver",
|
||||
+ [SBMODE] = "linux,uefi-secure-boot",
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -64,6 +68,11 @@ static int __init efi_get_fdt_prop(const
|
||||
int len;
|
||||
u64 val;
|
||||
|
||||
+ if (!pname[0]) {
|
||||
+ memset(var, 0, size);
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
prop = fdt_getprop(fdt, node, pname, &len);
|
||||
if (!prop)
|
||||
return 1;
|
||||
@@ -81,7 +90,7 @@ static int __init efi_get_fdt_prop(const
|
||||
return 0;
|
||||
}
|
||||
|
||||
-u64 __init efi_get_fdt_params(struct efi_memory_map_data *mm)
|
||||
+u64 __init efi_get_fdt_params(struct efi_memory_map_data *mm, u32 *secure_boot)
|
||||
{
|
||||
const void *fdt = initial_boot_params;
|
||||
unsigned long systab;
|
||||
@@ -95,6 +104,7 @@ u64 __init efi_get_fdt_params(struct efi
|
||||
[MMSIZE] = { &mm->size, sizeof(mm->size) },
|
||||
[DCSIZE] = { &mm->desc_size, sizeof(mm->desc_size) },
|
||||
[DCVERS] = { &mm->desc_version, sizeof(mm->desc_version) },
|
||||
+ [SBMODE] = { secure_boot, sizeof(*secure_boot) },
|
||||
};
|
||||
|
||||
BUILD_BUG_ON(ARRAY_SIZE(target) != ARRAY_SIZE(name));
|
||||
--- a/drivers/firmware/efi/libstub/fdt.c
|
||||
+++ b/drivers/firmware/efi/libstub/fdt.c
|
||||
@@ -132,6 +132,12 @@ static efi_status_t update_fdt(void *ori
|
||||
}
|
||||
}
|
||||
|
||||
+ fdt_val32 = cpu_to_fdt32(efi_get_secureboot());
|
||||
+ status = fdt_setprop(fdt, node, "linux,uefi-secure-boot",
|
||||
+ &fdt_val32, sizeof(fdt_val32));
|
||||
+ if (status)
|
||||
+ goto fdt_set_fail;
|
||||
+
|
||||
/* Shrink the FDT back to its minimum size: */
|
||||
fdt_pack(fdt);
|
||||
|
||||
--- a/include/linux/efi.h
|
||||
+++ b/include/linux/efi.h
|
||||
@@ -765,7 +765,8 @@ extern int efi_mem_desc_lookup(u64 phys_
|
||||
extern int __efi_mem_desc_lookup(u64 phys_addr, efi_memory_desc_t *out_md);
|
||||
extern void efi_mem_reserve(phys_addr_t addr, u64 size);
|
||||
extern int efi_mem_reserve_persistent(phys_addr_t addr, u64 size);
|
||||
-extern u64 efi_get_fdt_params(struct efi_memory_map_data *data);
|
||||
+extern u64 efi_get_fdt_params(struct efi_memory_map_data *data,
|
||||
+ u32 *secure_boot);
|
||||
extern struct kobject *efi_kobj;
|
||||
|
||||
extern int efi_reboot_quirk_mode;
|
153
debian/patches/features/all/lockdown/efi-add-an-efi_secure_boot-flag-to-indicate-secure-b.patch
vendored
153
debian/patches/features/all/lockdown/efi-add-an-efi_secure_boot-flag-to-indicate-secure-b.patch
vendored
@ -1,153 +0,0 @@
|
||||
From: David Howells <dhowells@redhat.com>
|
||||
Date: Mon, 18 Feb 2019 12:45:03 +0000
|
||||
Subject: [28/30] efi: Add an EFI_SECURE_BOOT flag to indicate secure boot mode
|
||||
Origin: https://git.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-fs.git/commit?id=a5d70c55c603233c192b375f72116a395909da28
|
||||
|
||||
UEFI machines can be booted in Secure Boot mode. Add an EFI_SECURE_BOOT
|
||||
flag that can be passed to efi_enabled() to find out whether secure boot is
|
||||
enabled.
|
||||
|
||||
Move the switch-statement in x86's setup_arch() that inteprets the
|
||||
secure_boot boot parameter to generic code and set the bit there.
|
||||
|
||||
Suggested-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
|
||||
Signed-off-by: David Howells <dhowells@redhat.com>
|
||||
Reviewed-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
|
||||
cc: linux-efi@vger.kernel.org
|
||||
[rperier: Forward-ported to 5.5:
|
||||
- Use pr_warn()
|
||||
- Adjust context]
|
||||
[bwh: Forward-ported to 5.6: adjust context]
|
||||
[bwh: Forward-ported to 5.7:
|
||||
- Use the next available bit in efi.flags
|
||||
- Adjust context]
|
||||
---
|
||||
arch/x86/kernel/setup.c | 14 +----------
|
||||
drivers/firmware/efi/Makefile | 1 +
|
||||
drivers/firmware/efi/secureboot.c | 39 +++++++++++++++++++++++++++++++
|
||||
include/linux/efi.h | 16 ++++++++-----
|
||||
4 files changed, 51 insertions(+), 19 deletions(-)
|
||||
create mode 100644 drivers/firmware/efi/secureboot.c
|
||||
|
||||
--- a/arch/x86/kernel/setup.c
|
||||
+++ b/arch/x86/kernel/setup.c
|
||||
@@ -1070,19 +1070,7 @@ void __init setup_arch(char **cmdline_p)
|
||||
/* Allocate bigger log buffer */
|
||||
setup_log_buf(1);
|
||||
|
||||
- if (efi_enabled(EFI_BOOT)) {
|
||||
- switch (boot_params.secure_boot) {
|
||||
- case efi_secureboot_mode_disabled:
|
||||
- pr_info("Secure boot disabled\n");
|
||||
- break;
|
||||
- case efi_secureboot_mode_enabled:
|
||||
- pr_info("Secure boot enabled\n");
|
||||
- break;
|
||||
- default:
|
||||
- pr_info("Secure boot could not be determined\n");
|
||||
- break;
|
||||
- }
|
||||
- }
|
||||
+ efi_set_secure_boot(boot_params.secure_boot);
|
||||
|
||||
reserve_initrd();
|
||||
|
||||
--- a/drivers/firmware/efi/Makefile
|
||||
+++ b/drivers/firmware/efi/Makefile
|
||||
@@ -25,6 +25,7 @@ subdir-$(CONFIG_EFI_STUB) += libstub
|
||||
obj-$(CONFIG_EFI_BOOTLOADER_CONTROL) += efibc.o
|
||||
obj-$(CONFIG_EFI_TEST) += test/
|
||||
obj-$(CONFIG_EFI_DEV_PATH_PARSER) += dev-path-parser.o
|
||||
+obj-$(CONFIG_EFI) += secureboot.o
|
||||
obj-$(CONFIG_APPLE_PROPERTIES) += apple-properties.o
|
||||
obj-$(CONFIG_EFI_RCI2_TABLE) += rci2-table.o
|
||||
obj-$(CONFIG_EFI_EMBEDDED_FIRMWARE) += embedded-firmware.o
|
||||
--- /dev/null
|
||||
+++ b/drivers/firmware/efi/secureboot.c
|
||||
@@ -0,0 +1,39 @@
|
||||
+
|
||||
+/* Core kernel secure boot support.
|
||||
+ *
|
||||
+ * Copyright (C) 2017 Red Hat, Inc. All Rights Reserved.
|
||||
+ * Written by David Howells (dhowells@redhat.com)
|
||||
+ *
|
||||
+ * This program is free software; you can redistribute it and/or
|
||||
+ * modify it under the terms of the GNU General Public Licence
|
||||
+ * as published by the Free Software Foundation; either version
|
||||
+ * 2 of the Licence, or (at your option) any later version.
|
||||
+ */
|
||||
+
|
||||
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||
+
|
||||
+#include <linux/efi.h>
|
||||
+#include <linux/kernel.h>
|
||||
+#include <linux/printk.h>
|
||||
+
|
||||
+/*
|
||||
+ * Decide what to do when UEFI secure boot mode is enabled.
|
||||
+ */
|
||||
+void __init efi_set_secure_boot(enum efi_secureboot_mode mode)
|
||||
+{
|
||||
+ if (efi_enabled(EFI_BOOT)) {
|
||||
+ switch (mode) {
|
||||
+ case efi_secureboot_mode_disabled:
|
||||
+ pr_info("Secure boot disabled\n");
|
||||
+ break;
|
||||
+ case efi_secureboot_mode_enabled:
|
||||
+ set_bit(EFI_SECURE_BOOT, &efi.flags);
|
||||
+ pr_info("Secure boot enabled\n");
|
||||
+ break;
|
||||
+ default:
|
||||
+ pr_warn("Secure boot could not be determined (mode %u)\n",
|
||||
+ mode);
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+}
|
||||
--- a/include/linux/efi.h
|
||||
+++ b/include/linux/efi.h
|
||||
@@ -876,6 +876,14 @@ static inline int efi_range_is_wc(unsign
|
||||
#define EFI_MEM_ATTR 10 /* Did firmware publish an EFI_MEMORY_ATTRIBUTES table? */
|
||||
#define EFI_MEM_NO_SOFT_RESERVE 11 /* Is the kernel configured to ignore soft reservations? */
|
||||
#define EFI_PRESERVE_BS_REGIONS 12 /* Are EFI boot-services memory segments available? */
|
||||
+#define EFI_SECURE_BOOT 13 /* Are we in Secure Boot mode? */
|
||||
+
|
||||
+enum efi_secureboot_mode {
|
||||
+ efi_secureboot_mode_unset,
|
||||
+ efi_secureboot_mode_unknown,
|
||||
+ efi_secureboot_mode_disabled,
|
||||
+ efi_secureboot_mode_enabled,
|
||||
+};
|
||||
|
||||
#ifdef CONFIG_EFI
|
||||
/*
|
||||
@@ -900,6 +908,7 @@ static inline bool efi_rt_services_suppo
|
||||
return (efi.runtime_supported_mask & mask) == mask;
|
||||
}
|
||||
extern void efi_find_mirror(void);
|
||||
+extern void __init efi_set_secure_boot(enum efi_secureboot_mode mode);
|
||||
#else
|
||||
static inline bool efi_enabled(int feature)
|
||||
{
|
||||
@@ -919,6 +928,7 @@ static inline bool efi_rt_services_suppo
|
||||
}
|
||||
|
||||
static inline void efi_find_mirror(void) {}
|
||||
+static inline void efi_set_secure_boot(enum efi_secureboot_mode mode) {}
|
||||
#endif
|
||||
|
||||
extern int efi_status_to_err(efi_status_t status);
|
||||
@@ -1137,13 +1147,6 @@ static inline bool efi_runtime_disabled(
|
||||
extern void efi_call_virt_check_flags(unsigned long flags, const void *caller);
|
||||
extern unsigned long efi_call_virt_save_flags(void);
|
||||
|
||||
-enum efi_secureboot_mode {
|
||||
- efi_secureboot_mode_unset,
|
||||
- efi_secureboot_mode_unknown,
|
||||
- efi_secureboot_mode_disabled,
|
||||
- efi_secureboot_mode_enabled,
|
||||
-};
|
||||
-
|
||||
static inline
|
||||
enum efi_secureboot_mode efi_get_secureboot_mode(efi_get_variable_t *get_var)
|
||||
{
|
121
debian/patches/features/all/lockdown/efi-lock-down-the-kernel-if-booted-in-secure-boot-mo.patch
vendored
121
debian/patches/features/all/lockdown/efi-lock-down-the-kernel-if-booted-in-secure-boot-mo.patch
vendored
@ -1,121 +0,0 @@
|
||||
From: Ben Hutchings <ben@decadent.org.uk>
|
||||
Date: Tue, 10 Sep 2019 11:54:28 +0100
|
||||
Subject: efi: Lock down the kernel if booted in secure boot mode
|
||||
|
||||
Based on an earlier patch by David Howells, who wrote the following
|
||||
description:
|
||||
|
||||
> UEFI Secure Boot provides a mechanism for ensuring that the firmware will
|
||||
> only load signed bootloaders and kernels. Certain use cases may also
|
||||
> require that all kernel modules also be signed. Add a configuration option
|
||||
> that to lock down the kernel - which includes requiring validly signed
|
||||
> modules - if the kernel is secure-booted.
|
||||
|
||||
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
|
||||
[Salvatore Bonaccorso: After fixing https://bugs.debian.org/956197 the
|
||||
help text for LOCK_DOWN_IN_EFI_SECURE_BOOT was adjusted to mention that
|
||||
lockdown is triggered in integrity mode (https://bugs.debian.org/1025417)]
|
||||
Signed-off-by: Salvatore Bonaccorso <carnil@debian.org>
|
||||
---
|
||||
arch/x86/kernel/setup.c | 4 ++--
|
||||
drivers/firmware/efi/secureboot.c | 3 +++
|
||||
include/linux/security.h | 6 ++++++
|
||||
security/lockdown/Kconfig | 15 +++++++++++++++
|
||||
security/lockdown/lockdown.c | 2 +-
|
||||
5 files changed, 27 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/arch/x86/kernel/setup.c
|
||||
+++ b/arch/x86/kernel/setup.c
|
||||
@@ -904,6 +904,8 @@ void __init setup_arch(char **cmdline_p)
|
||||
if (efi_enabled(EFI_BOOT))
|
||||
efi_init();
|
||||
|
||||
+ efi_set_secure_boot(boot_params.secure_boot);
|
||||
+
|
||||
reserve_ibft_region();
|
||||
x86_init.resources.dmi_setup();
|
||||
|
||||
@@ -1070,8 +1072,6 @@ void __init setup_arch(char **cmdline_p)
|
||||
/* Allocate bigger log buffer */
|
||||
setup_log_buf(1);
|
||||
|
||||
- efi_set_secure_boot(boot_params.secure_boot);
|
||||
-
|
||||
reserve_initrd();
|
||||
|
||||
acpi_table_upgrade();
|
||||
--- a/drivers/firmware/efi/secureboot.c
|
||||
+++ b/drivers/firmware/efi/secureboot.c
|
||||
@@ -15,6 +15,7 @@
|
||||
#include <linux/efi.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/printk.h>
|
||||
+#include <linux/security.h>
|
||||
|
||||
/*
|
||||
* Decide what to do when UEFI secure boot mode is enabled.
|
||||
@@ -28,6 +29,10 @@ void __init efi_set_secure_boot(enum efi
|
||||
break;
|
||||
case efi_secureboot_mode_enabled:
|
||||
set_bit(EFI_SECURE_BOOT, &efi.flags);
|
||||
+#ifdef CONFIG_LOCK_DOWN_IN_EFI_SECURE_BOOT
|
||||
+ lock_kernel_down("EFI Secure Boot",
|
||||
+ LOCKDOWN_INTEGRITY_MAX);
|
||||
+#endif
|
||||
pr_info("Secure boot enabled\n");
|
||||
break;
|
||||
default:
|
||||
--- a/include/linux/security.h
|
||||
+++ b/include/linux/security.h
|
||||
@@ -522,6 +522,7 @@ int security_inode_notifysecctx(struct i
|
||||
int security_inode_setsecctx(struct dentry *dentry, void *ctx, u32 ctxlen);
|
||||
int security_inode_getsecctx(struct inode *inode, void **ctx, u32 *ctxlen);
|
||||
int security_locked_down(enum lockdown_reason what);
|
||||
+int lock_kernel_down(const char *where, enum lockdown_reason level);
|
||||
int lsm_fill_user_ctx(struct lsm_ctx __user *uctx, u32 *uctx_len,
|
||||
void *val, size_t val_len, u64 id, u64 flags);
|
||||
int security_bdev_alloc(struct block_device *bdev);
|
||||
@@ -1504,6 +1505,11 @@ static inline int security_locked_down(e
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
+static inline int
|
||||
+lock_kernel_down(const char *where, enum lockdown_reason level)
|
||||
+{
|
||||
+ return -EOPNOTSUPP;
|
||||
+}
|
||||
static inline int lsm_fill_user_ctx(struct lsm_ctx __user *uctx,
|
||||
u32 *uctx_len, void *val, size_t val_len,
|
||||
u64 id, u64 flags)
|
||||
--- a/security/lockdown/Kconfig
|
||||
+++ b/security/lockdown/Kconfig
|
||||
@@ -45,3 +45,18 @@ config LOCK_DOWN_KERNEL_FORCE_CONFIDENTI
|
||||
disabled.
|
||||
|
||||
endchoice
|
||||
+
|
||||
+config LOCK_DOWN_IN_EFI_SECURE_BOOT
|
||||
+ bool "Lock down the kernel in EFI Secure Boot mode"
|
||||
+ default n
|
||||
+ depends on SECURITY_LOCKDOWN_LSM
|
||||
+ depends on EFI
|
||||
+ select SECURITY_LOCKDOWN_LSM_EARLY
|
||||
+ help
|
||||
+ UEFI Secure Boot provides a mechanism for ensuring that the firmware
|
||||
+ will only load signed bootloaders and kernels. Secure boot mode may
|
||||
+ be determined from EFI variables provided by the system firmware if
|
||||
+ not indicated by the boot parameters.
|
||||
+
|
||||
+ Enabling this option results in kernel lockdown being
|
||||
+ triggered in integrity mode if EFI Secure Boot is set.
|
||||
--- a/security/lockdown/lockdown.c
|
||||
+++ b/security/lockdown/lockdown.c
|
||||
@@ -24,7 +24,7 @@ static const enum lockdown_reason lockdo
|
||||
/*
|
||||
* Put the kernel into lock-down mode.
|
||||
*/
|
||||
-static int lock_kernel_down(const char *where, enum lockdown_reason level)
|
||||
+int lock_kernel_down(const char *where, enum lockdown_reason level)
|
||||
{
|
||||
if (kernel_locked_down >= level)
|
||||
return -EPERM;
|
@ -1,75 +0,0 @@
|
||||
From: Ben Hutchings <ben@decadent.org.uk>
|
||||
Date: Fri, 30 Aug 2019 15:54:24 +0100
|
||||
Subject: mtd: phram,slram: Disable when the kernel is locked down
|
||||
Forwarded: https://lore.kernel.org/linux-security-module/20190830154720.eekfjt6c4jzvlbfz@decadent.org.uk/
|
||||
|
||||
These drivers allow mapping arbitrary memory ranges as MTD devices.
|
||||
This should be disabled to preserve the kernel's integrity when it is
|
||||
locked down.
|
||||
|
||||
* Add the HWPARAM flag to the module parameters
|
||||
* When slram is built-in, it uses __setup() to read kernel parameters,
|
||||
so add an explicit check security_locked_down() check
|
||||
|
||||
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
|
||||
Cc: Matthew Garrett <mjg59@google.com>
|
||||
Cc: David Howells <dhowells@redhat.com>
|
||||
Cc: Joern Engel <joern@lazybastard.org>
|
||||
Cc: linux-mtd@lists.infradead.org
|
||||
---
|
||||
drivers/mtd/devices/phram.c | 6 +++++-
|
||||
drivers/mtd/devices/slram.c | 9 ++++++++-
|
||||
2 files changed, 13 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/mtd/devices/phram.c
|
||||
+++ b/drivers/mtd/devices/phram.c
|
||||
@@ -364,7 +364,11 @@ static int phram_param_call(const char *
|
||||
#endif
|
||||
}
|
||||
|
||||
-module_param_call(phram, phram_param_call, NULL, NULL, 0200);
|
||||
+static const struct kernel_param_ops phram_param_ops = {
|
||||
+ .set = phram_param_call
|
||||
+};
|
||||
+__module_param_call(MODULE_PARAM_PREFIX, phram, &phram_param_ops, NULL,
|
||||
+ 0200, -1, KERNEL_PARAM_FL_HWPARAM | hwparam_iomem);
|
||||
MODULE_PARM_DESC(phram, "Memory region to map. \"phram=<name>,<start>,<length>[,<erasesize>]\"");
|
||||
|
||||
#ifdef CONFIG_OF
|
||||
--- a/drivers/mtd/devices/slram.c
|
||||
+++ b/drivers/mtd/devices/slram.c
|
||||
@@ -43,6 +43,7 @@
|
||||
#include <linux/ioctl.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/io.h>
|
||||
+#include <linux/security.h>
|
||||
|
||||
#include <linux/mtd/mtd.h>
|
||||
|
||||
@@ -65,7 +66,7 @@ typedef struct slram_mtd_list {
|
||||
#ifdef MODULE
|
||||
static char *map[SLRAM_MAX_DEVICES_PARAMS];
|
||||
|
||||
-module_param_array(map, charp, NULL, 0);
|
||||
+module_param_hw_array(map, charp, iomem, NULL, 0);
|
||||
MODULE_PARM_DESC(map, "List of memory regions to map. \"map=<name>, <start>, <length / end>\"");
|
||||
#else
|
||||
static char *map;
|
||||
@@ -281,11 +282,17 @@ static int __init init_slram(void)
|
||||
#ifndef MODULE
|
||||
char *devstart;
|
||||
char *devlength;
|
||||
+ int ret;
|
||||
|
||||
if (!map) {
|
||||
E("slram: not enough parameters.\n");
|
||||
return(-EINVAL);
|
||||
}
|
||||
+
|
||||
+ ret = security_locked_down(LOCKDOWN_MODULE_PARAMETERS);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
while (map) {
|
||||
devname = devstart = devlength = NULL;
|
||||
|
4
debian/patches/features/all/security-perf-allow-further-restriction-of-perf_event_open.patch
vendored
4
debian/patches/features/all/security-perf-allow-further-restriction-of-perf_event_open.patch
vendored
@ -22,7 +22,7 @@ Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
|
||||
|
||||
--- a/include/linux/perf_event.h
|
||||
+++ b/include/linux/perf_event.h
|
||||
@@ -1623,6 +1623,11 @@ int perf_cpu_time_max_percent_handler(co
|
||||
@@ -1659,6 +1659,11 @@ int perf_cpu_time_max_percent_handler(co
|
||||
int perf_event_max_stack_handler(const struct ctl_table *table, int write,
|
||||
void *buffer, size_t *lenp, loff_t *ppos);
|
||||
|
||||
@ -50,7 +50,7 @@ Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
|
||||
|
||||
/* Minimum for 512 kiB + 1 user control page */
|
||||
int sysctl_perf_event_mlock __read_mostly = 512 + (PAGE_SIZE / 1024); /* 'free' kiB per user */
|
||||
@@ -12691,6 +12696,9 @@ SYSCALL_DEFINE5(perf_event_open,
|
||||
@@ -12821,6 +12826,9 @@ SYSCALL_DEFINE5(perf_event_open,
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
|
4
debian/patches/features/x86/intel-iommu-add-kconfig-option-to-exclude-igpu-by-default.patch
vendored
4
debian/patches/features/x86/intel-iommu-add-kconfig-option-to-exclude-igpu-by-default.patch
vendored
@ -48,7 +48,7 @@ Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
|
||||
def_bool y
|
||||
--- a/drivers/iommu/intel/iommu.c
|
||||
+++ b/drivers/iommu/intel/iommu.c
|
||||
@@ -205,13 +205,13 @@ static LIST_HEAD(dmar_satc_units);
|
||||
@@ -204,13 +204,13 @@ static LIST_HEAD(dmar_satc_units);
|
||||
|
||||
static void intel_iommu_domain_free(struct iommu_domain *domain);
|
||||
|
||||
@ -64,7 +64,7 @@ Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
|
||||
static int intel_iommu_superpage = 1;
|
||||
static int iommu_identity_mapping;
|
||||
static int iommu_skip_te_disable;
|
||||
@@ -250,6 +250,7 @@ static int __init intel_iommu_setup(char
|
||||
@@ -249,6 +249,7 @@ static int __init intel_iommu_setup(char
|
||||
while (*str) {
|
||||
if (!strncmp(str, "on", 2)) {
|
||||
dmar_disabled = 0;
|
||||
|
@ -22,7 +22,7 @@ Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
|
||||
|
||||
--- a/Documentation/admin-guide/kernel-parameters.txt
|
||||
+++ b/Documentation/admin-guide/kernel-parameters.txt
|
||||
@@ -2218,6 +2218,8 @@
|
||||
@@ -2247,6 +2247,8 @@
|
||||
bypassed by not enabling DMAR with this option. In
|
||||
this case, gfx device will use physical address for
|
||||
DMA.
|
||||
@ -33,7 +33,7 @@ Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
|
||||
sp_off [Default Off]
|
||||
--- a/drivers/iommu/intel/iommu.c
|
||||
+++ b/drivers/iommu/intel/iommu.c
|
||||
@@ -36,6 +36,9 @@
|
||||
@@ -35,6 +35,9 @@
|
||||
#define CONTEXT_SIZE VTD_PAGE_SIZE
|
||||
|
||||
#define IS_GFX_DEVICE(pdev) ((pdev->class >> 16) == PCI_BASE_CLASS_DISPLAY)
|
||||
@ -43,7 +43,7 @@ Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
|
||||
#define IS_USB_DEVICE(pdev) ((pdev->class >> 8) == PCI_CLASS_SERIAL_USB)
|
||||
#define IS_ISA_DEVICE(pdev) ((pdev->class >> 8) == PCI_CLASS_BRIDGE_ISA)
|
||||
#define IS_AZALIA(pdev) ((pdev)->vendor == 0x8086 && (pdev)->device == 0x3a3e)
|
||||
@@ -208,12 +211,14 @@ int intel_iommu_sm = IS_ENABLED(CONFIG_I
|
||||
@@ -207,12 +210,14 @@ int intel_iommu_sm = IS_ENABLED(CONFIG_I
|
||||
int intel_iommu_enabled = 0;
|
||||
EXPORT_SYMBOL_GPL(intel_iommu_enabled);
|
||||
|
||||
@ -58,7 +58,7 @@ Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
|
||||
|
||||
const struct iommu_ops intel_iommu_ops;
|
||||
static const struct iommu_dirty_ops intel_dirty_ops;
|
||||
@@ -253,6 +258,9 @@ static int __init intel_iommu_setup(char
|
||||
@@ -252,6 +257,9 @@ static int __init intel_iommu_setup(char
|
||||
} else if (!strncmp(str, "igfx_off", 8)) {
|
||||
disable_igfx_iommu = 1;
|
||||
pr_info("Disable GFX device mapping\n");
|
||||
@ -68,7 +68,7 @@ Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
|
||||
} else if (!strncmp(str, "forcedac", 8)) {
|
||||
pr_warn("intel_iommu=forcedac deprecated; use iommu.forcedac instead\n");
|
||||
iommu_dma_forcedac = true;
|
||||
@@ -2046,6 +2054,9 @@ static int device_def_domain_type(struct
|
||||
@@ -1902,6 +1910,9 @@ static int device_def_domain_type(struct
|
||||
|
||||
if ((iommu_identity_mapping & IDENTMAP_AZALIA) && IS_AZALIA(pdev))
|
||||
return IOMMU_DOMAIN_IDENTITY;
|
||||
@ -78,7 +78,7 @@ Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -2344,6 +2355,9 @@ static int __init init_dmars(void)
|
||||
@@ -2196,6 +2207,9 @@ static int __init init_dmars(void)
|
||||
iommu_set_root_entry(iommu);
|
||||
}
|
||||
|
||||
|
@ -29,7 +29,7 @@ Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
|
||||
|
||||
--- a/Documentation/admin-guide/kernel-parameters.txt
|
||||
+++ b/Documentation/admin-guide/kernel-parameters.txt
|
||||
@@ -6641,6 +6641,10 @@
|
||||
@@ -6982,6 +6982,10 @@
|
||||
later by a loaded module cannot be set this way.
|
||||
Example: sysctl.vm.swappiness=40
|
||||
|
||||
@ -42,7 +42,7 @@ Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
|
||||
Ignore sysrq setting - this boot parameter will
|
||||
--- a/arch/x86/Kconfig
|
||||
+++ b/arch/x86/Kconfig
|
||||
@@ -3165,6 +3165,14 @@ config COMPAT_32
|
||||
@@ -3186,6 +3186,14 @@ config COMPAT_32
|
||||
select HAVE_UID16
|
||||
select OLD_SIGSUSPEND3
|
||||
|
||||
|
@ -30,7 +30,7 @@ this reverts following commit:
|
||||
|
||||
--- a/tools/objtool/check.c
|
||||
+++ b/tools/objtool/check.c
|
||||
@@ -4897,10 +4897,14 @@ int check(struct objtool_file *file)
|
||||
@@ -4771,10 +4771,14 @@ int check(struct objtool_file *file)
|
||||
}
|
||||
|
||||
out:
|
||||
|
2
debian/patches/krd/0003-local-ports.patch
vendored
2
debian/patches/krd/0003-local-ports.patch
vendored
@ -1,6 +1,6 @@
|
||||
--- a/net/ipv4/af_inet.c
|
||||
+++ b/net/ipv4/af_inet.c
|
||||
@@ -1800,7 +1800,7 @@ static __net_init int inet_init_net(stru
|
||||
@@ -1790,7 +1790,7 @@ static __net_init int inet_init_net(stru
|
||||
/*
|
||||
* Set defaults for local port range
|
||||
*/
|
||||
|
@ -1,9 +1,9 @@
|
||||
--- a/net/bridge/br_input.c
|
||||
+++ b/net/bridge/br_input.c
|
||||
@@ -374,7 +374,11 @@ static rx_handler_result_t br_handle_fra
|
||||
return RX_HANDLER_PASS;
|
||||
@@ -383,7 +383,11 @@ static rx_handler_result_t br_handle_fra
|
||||
|
||||
case 0x01: /* IEEE MAC (Pause) */
|
||||
reason = SKB_DROP_REASON_MAC_IEEE_MAC_CONTROL;
|
||||
- goto drop;
|
||||
+ fwd_mask |= p->br->group_fwd_mask;
|
||||
+ if (fwd_mask & (1u << dest[5]))
|
||||
|
42
debian/patches/misc-bbr3/0019-x86-cfi-bpf-Add-tso_segs-and-skb_marked_lost-to-bpf_.patch
vendored
42
debian/patches/misc-bbr3/0019-x86-cfi-bpf-Add-tso_segs-and-skb_marked_lost-to-bpf_.patch
vendored
@ -1,42 +0,0 @@
|
||||
From d53b209e5fcee3b3c53c30a4cc4fcc8e392a8fce Mon Sep 17 00:00:00 2001
|
||||
From: Alexandre Frade <kernel@xanmod.org>
|
||||
Date: Mon, 11 Mar 2024 12:01:13 -0300
|
||||
Subject: [PATCH 19/19] x86/cfi,bpf: Add tso_segs and skb_marked_lost to
|
||||
bpf_struct_ops CFI
|
||||
|
||||
Rebased-by: Oleksandr Natalenko <oleksandr@natalenko.name>
|
||||
[ https://github.com/sirlucjan/kernel-patches/blob/master/6.8/bbr3-patches/0001-tcp-bbr3-initial-import.patch ]
|
||||
Signed-off-by: Alexandre Frade <kernel@xanmod.org>
|
||||
---
|
||||
net/ipv4/bpf_tcp_ca.c | 9 +++++++--
|
||||
1 file changed, 7 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/net/ipv4/bpf_tcp_ca.c
|
||||
+++ b/net/ipv4/bpf_tcp_ca.c
|
||||
@@ -280,11 +280,15 @@ static void bpf_tcp_ca_pkts_acked(struct
|
||||
{
|
||||
}
|
||||
|
||||
-static u32 bpf_tcp_ca_min_tso_segs(struct sock *sk)
|
||||
+static u32 bpf_tcp_ca_tso_segs(struct sock *sk, unsigned int mss_now)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static void bpf_tcp_ca_skb_marked_lost(struct sock *sk, const struct sk_buff *skb)
|
||||
+{
|
||||
+}
|
||||
+
|
||||
static void bpf_tcp_ca_cong_control(struct sock *sk, u32 ack, int flag,
|
||||
const struct rate_sample *rs)
|
||||
{
|
||||
@@ -315,7 +319,8 @@ static struct tcp_congestion_ops __bpf_o
|
||||
.cwnd_event = bpf_tcp_ca_cwnd_event,
|
||||
.in_ack_event = bpf_tcp_ca_in_ack_event,
|
||||
.pkts_acked = bpf_tcp_ca_pkts_acked,
|
||||
- .min_tso_segs = bpf_tcp_ca_min_tso_segs,
|
||||
+ .tso_segs = bpf_tcp_ca_tso_segs,
|
||||
+ .skb_marked_lost = bpf_tcp_ca_skb_marked_lost,
|
||||
.cong_control = bpf_tcp_ca_cong_control,
|
||||
.undo_cwnd = bpf_tcp_ca_undo_cwnd,
|
||||
.sndbuf_expand = bpf_tcp_ca_sndbuf_expand,
|
@ -1,55 +0,0 @@
|
||||
From e50ffd43b88d64b8063a9fce59f1d03b56f6144c Mon Sep 17 00:00:00 2001
|
||||
From: Elizabeth Figura <zfigura@codeweavers.com>
|
||||
Date: Fri, 13 Dec 2024 13:34:42 -0600
|
||||
Subject: ntsync: Return the fd from NTSYNC_IOC_CREATE_SEM.
|
||||
|
||||
Simplify the user API a bit by returning the fd as return value from the ioctl
|
||||
instead of through the argument pointer.
|
||||
|
||||
Signed-off-by: Elizabeth Figura <zfigura@codeweavers.com>
|
||||
---
|
||||
drivers/misc/ntsync.c | 7 ++-----
|
||||
include/uapi/linux/ntsync.h | 3 +--
|
||||
2 files changed, 3 insertions(+), 7 deletions(-)
|
||||
|
||||
--- a/drivers/misc/ntsync.c
|
||||
+++ b/drivers/misc/ntsync.c
|
||||
@@ -165,7 +165,6 @@ static int ntsync_obj_get_fd(struct ntsy
|
||||
|
||||
static int ntsync_create_sem(struct ntsync_device *dev, void __user *argp)
|
||||
{
|
||||
- struct ntsync_sem_args __user *user_args = argp;
|
||||
struct ntsync_sem_args args;
|
||||
struct ntsync_obj *sem;
|
||||
int fd;
|
||||
@@ -182,12 +181,10 @@ static int ntsync_create_sem(struct ntsy
|
||||
sem->u.sem.count = args.count;
|
||||
sem->u.sem.max = args.max;
|
||||
fd = ntsync_obj_get_fd(sem);
|
||||
- if (fd < 0) {
|
||||
+ if (fd < 0)
|
||||
kfree(sem);
|
||||
- return fd;
|
||||
- }
|
||||
|
||||
- return put_user(fd, &user_args->sem);
|
||||
+ return fd;
|
||||
}
|
||||
|
||||
static int ntsync_char_open(struct inode *inode, struct file *file)
|
||||
--- a/include/uapi/linux/ntsync.h
|
||||
+++ b/include/uapi/linux/ntsync.h
|
||||
@@ -11,12 +11,11 @@
|
||||
#include <linux/types.h>
|
||||
|
||||
struct ntsync_sem_args {
|
||||
- __u32 sem;
|
||||
__u32 count;
|
||||
__u32 max;
|
||||
};
|
||||
|
||||
-#define NTSYNC_IOC_CREATE_SEM _IOWR('N', 0x80, struct ntsync_sem_args)
|
||||
+#define NTSYNC_IOC_CREATE_SEM _IOW ('N', 0x80, struct ntsync_sem_args)
|
||||
|
||||
#define NTSYNC_IOC_SEM_POST _IOWR('N', 0x81, __u32)
|
||||
|
64
debian/patches/misc-ntsync7/0002-ntsync-Rename-NTSYNC_IOC_SEM_POST-to-NTSYNC_IOC_SEM_.patch
vendored
64
debian/patches/misc-ntsync7/0002-ntsync-Rename-NTSYNC_IOC_SEM_POST-to-NTSYNC_IOC_SEM_.patch
vendored
@ -1,64 +0,0 @@
|
||||
From 160e9bf7826da868ae4de261753a03cce2208ff6 Mon Sep 17 00:00:00 2001
|
||||
From: Elizabeth Figura <zfigura@codeweavers.com>
|
||||
Date: Fri, 13 Dec 2024 13:34:43 -0600
|
||||
Subject: ntsync: Rename NTSYNC_IOC_SEM_POST to NTSYNC_IOC_SEM_RELEASE.
|
||||
|
||||
Use the more common "release" terminology, which is also the term used by NT,
|
||||
instead of "post" (which is used by POSIX).
|
||||
|
||||
Signed-off-by: Elizabeth Figura <zfigura@codeweavers.com>
|
||||
---
|
||||
drivers/misc/ntsync.c | 10 +++++-----
|
||||
include/uapi/linux/ntsync.h | 2 +-
|
||||
2 files changed, 6 insertions(+), 6 deletions(-)
|
||||
|
||||
--- a/drivers/misc/ntsync.c
|
||||
+++ b/drivers/misc/ntsync.c
|
||||
@@ -57,7 +57,7 @@ struct ntsync_device {
|
||||
* Actually change the semaphore state, returning -EOVERFLOW if it is made
|
||||
* invalid.
|
||||
*/
|
||||
-static int post_sem_state(struct ntsync_obj *sem, __u32 count)
|
||||
+static int release_sem_state(struct ntsync_obj *sem, __u32 count)
|
||||
{
|
||||
__u32 sum;
|
||||
|
||||
@@ -71,7 +71,7 @@ static int post_sem_state(struct ntsync_
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static int ntsync_sem_post(struct ntsync_obj *sem, void __user *argp)
|
||||
+static int ntsync_sem_release(struct ntsync_obj *sem, void __user *argp)
|
||||
{
|
||||
__u32 __user *user_args = argp;
|
||||
__u32 prev_count;
|
||||
@@ -87,7 +87,7 @@ static int ntsync_sem_post(struct ntsync
|
||||
spin_lock(&sem->lock);
|
||||
|
||||
prev_count = sem->u.sem.count;
|
||||
- ret = post_sem_state(sem, args);
|
||||
+ ret = release_sem_state(sem, args);
|
||||
|
||||
spin_unlock(&sem->lock);
|
||||
|
||||
@@ -114,8 +114,8 @@ static long ntsync_obj_ioctl(struct file
|
||||
void __user *argp = (void __user *)parm;
|
||||
|
||||
switch (cmd) {
|
||||
- case NTSYNC_IOC_SEM_POST:
|
||||
- return ntsync_sem_post(obj, argp);
|
||||
+ case NTSYNC_IOC_SEM_RELEASE:
|
||||
+ return ntsync_sem_release(obj, argp);
|
||||
default:
|
||||
return -ENOIOCTLCMD;
|
||||
}
|
||||
--- a/include/uapi/linux/ntsync.h
|
||||
+++ b/include/uapi/linux/ntsync.h
|
||||
@@ -17,6 +17,6 @@ struct ntsync_sem_args {
|
||||
|
||||
#define NTSYNC_IOC_CREATE_SEM _IOW ('N', 0x80, struct ntsync_sem_args)
|
||||
|
||||
-#define NTSYNC_IOC_SEM_POST _IOWR('N', 0x81, __u32)
|
||||
+#define NTSYNC_IOC_SEM_RELEASE _IOWR('N', 0x81, __u32)
|
||||
|
||||
#endif
|
@ -1,377 +0,0 @@
|
||||
From e855a17ec837cdee9047e6e23e47ed7b4312a265 Mon Sep 17 00:00:00 2001
|
||||
From: Elizabeth Figura <zfigura@codeweavers.com>
|
||||
Date: Fri, 13 Dec 2024 13:34:44 -0600
|
||||
Subject: ntsync: Introduce NTSYNC_IOC_WAIT_ANY.
|
||||
|
||||
This corresponds to part of the functionality of the NT syscall
|
||||
NtWaitForMultipleObjects(). Specifically, it implements the behaviour where
|
||||
the third argument (wait_any) is TRUE, and it does not handle alertable waits.
|
||||
Those features have been split out into separate patches to ease review.
|
||||
|
||||
This patch therefore implements the wait/wake infrastructure which comprises the
|
||||
core of ntsync's functionality.
|
||||
|
||||
NTSYNC_IOC_WAIT_ANY is a vectored wait function similar to poll(). Unlike
|
||||
poll(), it "consumes" objects when they are signaled. For semaphores, this means
|
||||
decreasing one from the internal counter. At most one object can be consumed by
|
||||
this function.
|
||||
|
||||
This wait/wake model is fundamentally different from that used anywhere else in
|
||||
the kernel, and for that reason ntsync does not use any existing infrastructure,
|
||||
such as futexes, kernel mutexes or semaphores, or wait_event().
|
||||
|
||||
Up to 64 objects can be waited on at once. As soon as one is signaled, the
|
||||
object with the lowest index is consumed, and that index is returned via the
|
||||
"index" field.
|
||||
|
||||
A timeout is supported. The timeout is passed as a u64 nanosecond value, which
|
||||
represents absolute time measured against either the MONOTONIC or REALTIME clock
|
||||
(controlled by the flags argument). If U64_MAX is passed, the ioctl waits
|
||||
indefinitely.
|
||||
|
||||
This ioctl validates that all objects belong to the relevant device. This is not
|
||||
necessary for any technical reason related to NTSYNC_IOC_WAIT_ANY, but will be
|
||||
necessary for NTSYNC_IOC_WAIT_ALL introduced in the following patch.
|
||||
|
||||
Some padding fields are added for alignment and for fields which will be added
|
||||
in future patches (split out to ease review).
|
||||
|
||||
Signed-off-by: Elizabeth Figura <zfigura@codeweavers.com>
|
||||
---
|
||||
drivers/misc/ntsync.c | 247 +++++++++++++++++++++++++++++++++++-
|
||||
include/uapi/linux/ntsync.h | 14 ++
|
||||
2 files changed, 260 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/misc/ntsync.c
|
||||
+++ b/drivers/misc/ntsync.c
|
||||
@@ -6,11 +6,16 @@
|
||||
*/
|
||||
|
||||
#include <linux/anon_inodes.h>
|
||||
+#include <linux/atomic.h>
|
||||
#include <linux/file.h>
|
||||
#include <linux/fs.h>
|
||||
+#include <linux/hrtimer.h>
|
||||
+#include <linux/ktime.h>
|
||||
#include <linux/miscdevice.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/overflow.h>
|
||||
+#include <linux/sched.h>
|
||||
+#include <linux/sched/signal.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <uapi/linux/ntsync.h>
|
||||
@@ -30,6 +35,8 @@ enum ntsync_type {
|
||||
*
|
||||
* Both rely on struct file for reference counting. Individual
|
||||
* ntsync_obj objects take a reference to the device when created.
|
||||
+ * Wait operations take a reference to each object being waited on for
|
||||
+ * the duration of the wait.
|
||||
*/
|
||||
|
||||
struct ntsync_obj {
|
||||
@@ -47,12 +54,55 @@ struct ntsync_obj {
|
||||
__u32 max;
|
||||
} sem;
|
||||
} u;
|
||||
+
|
||||
+ struct list_head any_waiters;
|
||||
+};
|
||||
+
|
||||
+struct ntsync_q_entry {
|
||||
+ struct list_head node;
|
||||
+ struct ntsync_q *q;
|
||||
+ struct ntsync_obj *obj;
|
||||
+ __u32 index;
|
||||
+};
|
||||
+
|
||||
+struct ntsync_q {
|
||||
+ struct task_struct *task;
|
||||
+
|
||||
+ /*
|
||||
+ * Protected via atomic_try_cmpxchg(). Only the thread that wins the
|
||||
+ * compare-and-swap may actually change object states and wake this
|
||||
+ * task.
|
||||
+ */
|
||||
+ atomic_t signaled;
|
||||
+
|
||||
+ __u32 count;
|
||||
+ struct ntsync_q_entry entries[];
|
||||
};
|
||||
|
||||
struct ntsync_device {
|
||||
struct file *file;
|
||||
};
|
||||
|
||||
+static void try_wake_any_sem(struct ntsync_obj *sem)
|
||||
+{
|
||||
+ struct ntsync_q_entry *entry;
|
||||
+
|
||||
+ lockdep_assert_held(&sem->lock);
|
||||
+
|
||||
+ list_for_each_entry(entry, &sem->any_waiters, node) {
|
||||
+ struct ntsync_q *q = entry->q;
|
||||
+ int signaled = -1;
|
||||
+
|
||||
+ if (!sem->u.sem.count)
|
||||
+ break;
|
||||
+
|
||||
+ if (atomic_try_cmpxchg(&q->signaled, &signaled, entry->index)) {
|
||||
+ sem->u.sem.count--;
|
||||
+ wake_up_process(q->task);
|
||||
+ }
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
/*
|
||||
* Actually change the semaphore state, returning -EOVERFLOW if it is made
|
||||
* invalid.
|
||||
@@ -87,7 +137,9 @@ static int ntsync_sem_release(struct nts
|
||||
spin_lock(&sem->lock);
|
||||
|
||||
prev_count = sem->u.sem.count;
|
||||
- ret = release_sem_state(sem, args);
|
||||
+ ret = post_sem_state(sem, args);
|
||||
+ if (!ret)
|
||||
+ try_wake_any_sem(sem);
|
||||
|
||||
spin_unlock(&sem->lock);
|
||||
|
||||
@@ -140,6 +192,7 @@ static struct ntsync_obj *ntsync_alloc_o
|
||||
obj->dev = dev;
|
||||
get_file(dev->file);
|
||||
spin_lock_init(&obj->lock);
|
||||
+ INIT_LIST_HEAD(&obj->any_waiters);
|
||||
|
||||
return obj;
|
||||
}
|
||||
@@ -187,6 +240,196 @@ static int ntsync_create_sem(struct ntsy
|
||||
return fd;
|
||||
}
|
||||
|
||||
+static struct ntsync_obj *get_obj(struct ntsync_device *dev, int fd)
|
||||
+{
|
||||
+ struct file *file = fget(fd);
|
||||
+ struct ntsync_obj *obj;
|
||||
+
|
||||
+ if (!file)
|
||||
+ return NULL;
|
||||
+
|
||||
+ if (file->f_op != &ntsync_obj_fops) {
|
||||
+ fput(file);
|
||||
+ return NULL;
|
||||
+ }
|
||||
+
|
||||
+ obj = file->private_data;
|
||||
+ if (obj->dev != dev) {
|
||||
+ fput(file);
|
||||
+ return NULL;
|
||||
+ }
|
||||
+
|
||||
+ return obj;
|
||||
+}
|
||||
+
|
||||
+static void put_obj(struct ntsync_obj *obj)
|
||||
+{
|
||||
+ fput(obj->file);
|
||||
+}
|
||||
+
|
||||
+static int ntsync_schedule(const struct ntsync_q *q, const struct ntsync_wait_args *args)
|
||||
+{
|
||||
+ ktime_t timeout = ns_to_ktime(args->timeout);
|
||||
+ clockid_t clock = CLOCK_MONOTONIC;
|
||||
+ ktime_t *timeout_ptr;
|
||||
+ int ret = 0;
|
||||
+
|
||||
+ timeout_ptr = (args->timeout == U64_MAX ? NULL : &timeout);
|
||||
+
|
||||
+ if (args->flags & NTSYNC_WAIT_REALTIME)
|
||||
+ clock = CLOCK_REALTIME;
|
||||
+
|
||||
+ do {
|
||||
+ if (signal_pending(current)) {
|
||||
+ ret = -ERESTARTSYS;
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ set_current_state(TASK_INTERRUPTIBLE);
|
||||
+ if (atomic_read(&q->signaled) != -1) {
|
||||
+ ret = 0;
|
||||
+ break;
|
||||
+ }
|
||||
+ ret = schedule_hrtimeout_range_clock(timeout_ptr, 0, HRTIMER_MODE_ABS, clock);
|
||||
+ } while (ret < 0);
|
||||
+ __set_current_state(TASK_RUNNING);
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
+ * Allocate and initialize the ntsync_q structure, but do not queue us yet.
|
||||
+ */
|
||||
+static int setup_wait(struct ntsync_device *dev,
|
||||
+ const struct ntsync_wait_args *args,
|
||||
+ struct ntsync_q **ret_q)
|
||||
+{
|
||||
+ const __u32 count = args->count;
|
||||
+ int fds[NTSYNC_MAX_WAIT_COUNT];
|
||||
+ struct ntsync_q *q;
|
||||
+ __u32 i, j;
|
||||
+
|
||||
+ if (args->pad[0] || args->pad[1] || args->pad[2] || (args->flags & ~NTSYNC_WAIT_REALTIME))
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ if (args->count > NTSYNC_MAX_WAIT_COUNT)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ if (copy_from_user(fds, u64_to_user_ptr(args->objs),
|
||||
+ array_size(count, sizeof(*fds))))
|
||||
+ return -EFAULT;
|
||||
+
|
||||
+ q = kmalloc(struct_size(q, entries, count), GFP_KERNEL);
|
||||
+ if (!q)
|
||||
+ return -ENOMEM;
|
||||
+ q->task = current;
|
||||
+ atomic_set(&q->signaled, -1);
|
||||
+ q->count = count;
|
||||
+
|
||||
+ for (i = 0; i < count; i++) {
|
||||
+ struct ntsync_q_entry *entry = &q->entries[i];
|
||||
+ struct ntsync_obj *obj = get_obj(dev, fds[i]);
|
||||
+
|
||||
+ if (!obj)
|
||||
+ goto err;
|
||||
+
|
||||
+ entry->obj = obj;
|
||||
+ entry->q = q;
|
||||
+ entry->index = i;
|
||||
+ }
|
||||
+
|
||||
+ *ret_q = q;
|
||||
+ return 0;
|
||||
+
|
||||
+err:
|
||||
+ for (j = 0; j < i; j++)
|
||||
+ put_obj(q->entries[j].obj);
|
||||
+ kfree(q);
|
||||
+ return -EINVAL;
|
||||
+}
|
||||
+
|
||||
+static void try_wake_any_obj(struct ntsync_obj *obj)
|
||||
+{
|
||||
+ switch (obj->type) {
|
||||
+ case NTSYNC_TYPE_SEM:
|
||||
+ try_wake_any_sem(obj);
|
||||
+ break;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static int ntsync_wait_any(struct ntsync_device *dev, void __user *argp)
|
||||
+{
|
||||
+ struct ntsync_wait_args args;
|
||||
+ struct ntsync_q *q;
|
||||
+ int signaled;
|
||||
+ __u32 i;
|
||||
+ int ret;
|
||||
+
|
||||
+ if (copy_from_user(&args, argp, sizeof(args)))
|
||||
+ return -EFAULT;
|
||||
+
|
||||
+ ret = setup_wait(dev, &args, &q);
|
||||
+ if (ret < 0)
|
||||
+ return ret;
|
||||
+
|
||||
+ /* queue ourselves */
|
||||
+
|
||||
+ for (i = 0; i < args.count; i++) {
|
||||
+ struct ntsync_q_entry *entry = &q->entries[i];
|
||||
+ struct ntsync_obj *obj = entry->obj;
|
||||
+
|
||||
+ spin_lock(&obj->lock);
|
||||
+ list_add_tail(&entry->node, &obj->any_waiters);
|
||||
+ spin_unlock(&obj->lock);
|
||||
+ }
|
||||
+
|
||||
+ /* check if we are already signaled */
|
||||
+
|
||||
+ for (i = 0; i < args.count; i++) {
|
||||
+ struct ntsync_obj *obj = q->entries[i].obj;
|
||||
+
|
||||
+ if (atomic_read(&q->signaled) != -1)
|
||||
+ break;
|
||||
+
|
||||
+ spin_lock(&obj->lock);
|
||||
+ try_wake_any_obj(obj);
|
||||
+ spin_unlock(&obj->lock);
|
||||
+ }
|
||||
+
|
||||
+ /* sleep */
|
||||
+
|
||||
+ ret = ntsync_schedule(q, &args);
|
||||
+
|
||||
+ /* and finally, unqueue */
|
||||
+
|
||||
+ for (i = 0; i < args.count; i++) {
|
||||
+ struct ntsync_q_entry *entry = &q->entries[i];
|
||||
+ struct ntsync_obj *obj = entry->obj;
|
||||
+
|
||||
+ spin_lock(&obj->lock);
|
||||
+ list_del(&entry->node);
|
||||
+ spin_unlock(&obj->lock);
|
||||
+
|
||||
+ put_obj(obj);
|
||||
+ }
|
||||
+
|
||||
+ signaled = atomic_read(&q->signaled);
|
||||
+ if (signaled != -1) {
|
||||
+ struct ntsync_wait_args __user *user_args = argp;
|
||||
+
|
||||
+ /* even if we caught a signal, we need to communicate success */
|
||||
+ ret = 0;
|
||||
+
|
||||
+ if (put_user(signaled, &user_args->index))
|
||||
+ ret = -EFAULT;
|
||||
+ } else if (!ret) {
|
||||
+ ret = -ETIMEDOUT;
|
||||
+ }
|
||||
+
|
||||
+ kfree(q);
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
static int ntsync_char_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
struct ntsync_device *dev;
|
||||
@@ -218,6 +461,8 @@ static long ntsync_char_ioctl(struct fil
|
||||
switch (cmd) {
|
||||
case NTSYNC_IOC_CREATE_SEM:
|
||||
return ntsync_create_sem(dev, argp);
|
||||
+ case NTSYNC_IOC_WAIT_ANY:
|
||||
+ return ntsync_wait_any(dev, argp);
|
||||
default:
|
||||
return -ENOIOCTLCMD;
|
||||
}
|
||||
--- a/include/uapi/linux/ntsync.h
|
||||
+++ b/include/uapi/linux/ntsync.h
|
||||
@@ -15,7 +15,21 @@ struct ntsync_sem_args {
|
||||
__u32 max;
|
||||
};
|
||||
|
||||
+#define NTSYNC_WAIT_REALTIME 0x1
|
||||
+
|
||||
+struct ntsync_wait_args {
|
||||
+ __u64 timeout;
|
||||
+ __u64 objs;
|
||||
+ __u32 count;
|
||||
+ __u32 index;
|
||||
+ __u32 flags;
|
||||
+ __u32 pad[3];
|
||||
+};
|
||||
+
|
||||
+#define NTSYNC_MAX_WAIT_COUNT 64
|
||||
+
|
||||
#define NTSYNC_IOC_CREATE_SEM _IOW ('N', 0x80, struct ntsync_sem_args)
|
||||
+#define NTSYNC_IOC_WAIT_ANY _IOWR('N', 0x82, struct ntsync_wait_args)
|
||||
|
||||
#define NTSYNC_IOC_SEM_RELEASE _IOWR('N', 0x81, __u32)
|
||||
|
@ -1,533 +0,0 @@
|
||||
From 6c1dac87ff835a48a067fe75bd0a6965921dac78 Mon Sep 17 00:00:00 2001
|
||||
From: Elizabeth Figura <zfigura@codeweavers.com>
|
||||
Date: Fri, 13 Dec 2024 13:34:45 -0600
|
||||
Subject: ntsync: Introduce NTSYNC_IOC_WAIT_ALL.
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
This is similar to NTSYNC_IOC_WAIT_ANY, but waits until all of the objects are
|
||||
simultaneously signaled, and then acquires all of them as a single atomic
|
||||
operation.
|
||||
|
||||
Because acquisition of multiple objects is atomic, some complex locking is
|
||||
required. We cannot simply spin-lock multiple objects simultaneously, as that
|
||||
may disable preëmption for a problematically long time.
|
||||
|
||||
Instead, modifying any object which may be involved in a wait-all operation takes
|
||||
a device-wide sleeping mutex, "wait_all_lock", instead of the normal object
|
||||
spinlock.
|
||||
|
||||
Because wait-for-all is a rare operation, in order to optimize wait-for-any,
|
||||
this lock is only taken when necessary. "all_hint" is used to mark objects which
|
||||
are involved in a wait-for-all operation, and if an object is not, only its
|
||||
spinlock is taken.
|
||||
|
||||
The locking scheme used here was written by Peter Zijlstra.
|
||||
|
||||
Signed-off-by: Elizabeth Figura <zfigura@codeweavers.com>
|
||||
---
|
||||
drivers/misc/ntsync.c | 336 ++++++++++++++++++++++++++++++++++--
|
||||
include/uapi/linux/ntsync.h | 1 +
|
||||
2 files changed, 323 insertions(+), 14 deletions(-)
|
||||
|
||||
--- a/drivers/misc/ntsync.c
|
||||
+++ b/drivers/misc/ntsync.c
|
||||
@@ -13,6 +13,7 @@
|
||||
#include <linux/ktime.h>
|
||||
#include <linux/miscdevice.h>
|
||||
#include <linux/module.h>
|
||||
+#include <linux/mutex.h>
|
||||
#include <linux/overflow.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/sched/signal.h>
|
||||
@@ -41,6 +42,7 @@ enum ntsync_type {
|
||||
|
||||
struct ntsync_obj {
|
||||
spinlock_t lock;
|
||||
+ int dev_locked;
|
||||
|
||||
enum ntsync_type type;
|
||||
|
||||
@@ -55,7 +57,30 @@ struct ntsync_obj {
|
||||
} sem;
|
||||
} u;
|
||||
|
||||
+ /*
|
||||
+ * any_waiters is protected by the object lock, but all_waiters is
|
||||
+ * protected by the device wait_all_lock.
|
||||
+ */
|
||||
struct list_head any_waiters;
|
||||
+ struct list_head all_waiters;
|
||||
+
|
||||
+ /*
|
||||
+ * Hint describing how many tasks are queued on this object in a
|
||||
+ * wait-all operation.
|
||||
+ *
|
||||
+ * Any time we do a wake, we may need to wake "all" waiters as well as
|
||||
+ * "any" waiters. In order to atomically wake "all" waiters, we must
|
||||
+ * lock all of the objects, and that means grabbing the wait_all_lock
|
||||
+ * below (and, due to lock ordering rules, before locking this object).
|
||||
+ * However, wait-all is a rare operation, and grabbing the wait-all
|
||||
+ * lock for every wake would create unnecessary contention.
|
||||
+ * Therefore we first check whether all_hint is zero, and, if it is,
|
||||
+ * we skip trying to wake "all" waiters.
|
||||
+ *
|
||||
+ * Since wait requests must originate from user-space threads, we're
|
||||
+ * limited here by PID_MAX_LIMIT, so there's no risk of overflow.
|
||||
+ */
|
||||
+ atomic_t all_hint;
|
||||
};
|
||||
|
||||
struct ntsync_q_entry {
|
||||
@@ -75,19 +100,198 @@ struct ntsync_q {
|
||||
*/
|
||||
atomic_t signaled;
|
||||
|
||||
+ bool all;
|
||||
__u32 count;
|
||||
struct ntsync_q_entry entries[];
|
||||
};
|
||||
|
||||
struct ntsync_device {
|
||||
+ /*
|
||||
+ * Wait-all operations must atomically grab all objects, and be totally
|
||||
+ * ordered with respect to each other and wait-any operations.
|
||||
+ * If one thread is trying to acquire several objects, another thread
|
||||
+ * cannot touch the object at the same time.
|
||||
+ *
|
||||
+ * This device-wide lock is used to serialize wait-for-all
|
||||
+ * operations, and operations on an object that is involved in a
|
||||
+ * wait-for-all.
|
||||
+ */
|
||||
+ struct mutex wait_all_lock;
|
||||
+
|
||||
struct file *file;
|
||||
};
|
||||
|
||||
+/*
|
||||
+ * Single objects are locked using obj->lock.
|
||||
+ *
|
||||
+ * Multiple objects are 'locked' while holding dev->wait_all_lock.
|
||||
+ * In this case however, individual objects are not locked by holding
|
||||
+ * obj->lock, but by setting obj->dev_locked.
|
||||
+ *
|
||||
+ * This means that in order to lock a single object, the sequence is slightly
|
||||
+ * more complicated than usual. Specifically it needs to check obj->dev_locked
|
||||
+ * after acquiring obj->lock, if set, it needs to drop the lock and acquire
|
||||
+ * dev->wait_all_lock in order to serialize against the multi-object operation.
|
||||
+ */
|
||||
+
|
||||
+static void dev_lock_obj(struct ntsync_device *dev, struct ntsync_obj *obj)
|
||||
+{
|
||||
+ lockdep_assert_held(&dev->wait_all_lock);
|
||||
+ lockdep_assert(obj->dev == dev);
|
||||
+ spin_lock(&obj->lock);
|
||||
+ /*
|
||||
+ * By setting obj->dev_locked inside obj->lock, it is ensured that
|
||||
+ * anyone holding obj->lock must see the value.
|
||||
+ */
|
||||
+ obj->dev_locked = 1;
|
||||
+ spin_unlock(&obj->lock);
|
||||
+}
|
||||
+
|
||||
+static void dev_unlock_obj(struct ntsync_device *dev, struct ntsync_obj *obj)
|
||||
+{
|
||||
+ lockdep_assert_held(&dev->wait_all_lock);
|
||||
+ lockdep_assert(obj->dev == dev);
|
||||
+ spin_lock(&obj->lock);
|
||||
+ obj->dev_locked = 0;
|
||||
+ spin_unlock(&obj->lock);
|
||||
+}
|
||||
+
|
||||
+static void obj_lock(struct ntsync_obj *obj)
|
||||
+{
|
||||
+ struct ntsync_device *dev = obj->dev;
|
||||
+
|
||||
+ for (;;) {
|
||||
+ spin_lock(&obj->lock);
|
||||
+ if (likely(!obj->dev_locked))
|
||||
+ break;
|
||||
+
|
||||
+ spin_unlock(&obj->lock);
|
||||
+ mutex_lock(&dev->wait_all_lock);
|
||||
+ spin_lock(&obj->lock);
|
||||
+ /*
|
||||
+ * obj->dev_locked should be set and released under the same
|
||||
+ * wait_all_lock section, since we now own this lock, it should
|
||||
+ * be clear.
|
||||
+ */
|
||||
+ lockdep_assert(!obj->dev_locked);
|
||||
+ spin_unlock(&obj->lock);
|
||||
+ mutex_unlock(&dev->wait_all_lock);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static void obj_unlock(struct ntsync_obj *obj)
|
||||
+{
|
||||
+ spin_unlock(&obj->lock);
|
||||
+}
|
||||
+
|
||||
+static bool ntsync_lock_obj(struct ntsync_device *dev, struct ntsync_obj *obj)
|
||||
+{
|
||||
+ bool all;
|
||||
+
|
||||
+ obj_lock(obj);
|
||||
+ all = atomic_read(&obj->all_hint);
|
||||
+ if (unlikely(all)) {
|
||||
+ obj_unlock(obj);
|
||||
+ mutex_lock(&dev->wait_all_lock);
|
||||
+ dev_lock_obj(dev, obj);
|
||||
+ }
|
||||
+
|
||||
+ return all;
|
||||
+}
|
||||
+
|
||||
+static void ntsync_unlock_obj(struct ntsync_device *dev, struct ntsync_obj *obj, bool all)
|
||||
+{
|
||||
+ if (all) {
|
||||
+ dev_unlock_obj(dev, obj);
|
||||
+ mutex_unlock(&dev->wait_all_lock);
|
||||
+ } else {
|
||||
+ obj_unlock(obj);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+#define ntsync_assert_held(obj) \
|
||||
+ lockdep_assert((lockdep_is_held(&(obj)->lock) != LOCK_STATE_NOT_HELD) || \
|
||||
+ ((lockdep_is_held(&(obj)->dev->wait_all_lock) != LOCK_STATE_NOT_HELD) && \
|
||||
+ (obj)->dev_locked))
|
||||
+
|
||||
+static bool is_signaled(struct ntsync_obj *obj)
|
||||
+{
|
||||
+ ntsync_assert_held(obj);
|
||||
+
|
||||
+ switch (obj->type) {
|
||||
+ case NTSYNC_TYPE_SEM:
|
||||
+ return !!obj->u.sem.count;
|
||||
+ }
|
||||
+
|
||||
+ WARN(1, "bad object type %#x\n", obj->type);
|
||||
+ return false;
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
+ * "locked_obj" is an optional pointer to an object which is already locked and
|
||||
+ * should not be locked again. This is necessary so that changing an object's
|
||||
+ * state and waking it can be a single atomic operation.
|
||||
+ */
|
||||
+static void try_wake_all(struct ntsync_device *dev, struct ntsync_q *q,
|
||||
+ struct ntsync_obj *locked_obj)
|
||||
+{
|
||||
+ __u32 count = q->count;
|
||||
+ bool can_wake = true;
|
||||
+ int signaled = -1;
|
||||
+ __u32 i;
|
||||
+
|
||||
+ lockdep_assert_held(&dev->wait_all_lock);
|
||||
+ if (locked_obj)
|
||||
+ lockdep_assert(locked_obj->dev_locked);
|
||||
+
|
||||
+ for (i = 0; i < count; i++) {
|
||||
+ if (q->entries[i].obj != locked_obj)
|
||||
+ dev_lock_obj(dev, q->entries[i].obj);
|
||||
+ }
|
||||
+
|
||||
+ for (i = 0; i < count; i++) {
|
||||
+ if (!is_signaled(q->entries[i].obj)) {
|
||||
+ can_wake = false;
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ if (can_wake && atomic_try_cmpxchg(&q->signaled, &signaled, 0)) {
|
||||
+ for (i = 0; i < count; i++) {
|
||||
+ struct ntsync_obj *obj = q->entries[i].obj;
|
||||
+
|
||||
+ switch (obj->type) {
|
||||
+ case NTSYNC_TYPE_SEM:
|
||||
+ obj->u.sem.count--;
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+ wake_up_process(q->task);
|
||||
+ }
|
||||
+
|
||||
+ for (i = 0; i < count; i++) {
|
||||
+ if (q->entries[i].obj != locked_obj)
|
||||
+ dev_unlock_obj(dev, q->entries[i].obj);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static void try_wake_all_obj(struct ntsync_device *dev, struct ntsync_obj *obj)
|
||||
+{
|
||||
+ struct ntsync_q_entry *entry;
|
||||
+
|
||||
+ lockdep_assert_held(&dev->wait_all_lock);
|
||||
+ lockdep_assert(obj->dev_locked);
|
||||
+
|
||||
+ list_for_each_entry(entry, &obj->all_waiters, node)
|
||||
+ try_wake_all(dev, entry->q, obj);
|
||||
+}
|
||||
+
|
||||
static void try_wake_any_sem(struct ntsync_obj *sem)
|
||||
{
|
||||
struct ntsync_q_entry *entry;
|
||||
|
||||
- lockdep_assert_held(&sem->lock);
|
||||
+ ntsync_assert_held(sem);
|
||||
+ lockdep_assert(sem->type == NTSYNC_TYPE_SEM);
|
||||
|
||||
list_for_each_entry(entry, &sem->any_waiters, node) {
|
||||
struct ntsync_q *q = entry->q;
|
||||
@@ -111,7 +315,7 @@ static int release_sem_state(struct ntsy
|
||||
{
|
||||
__u32 sum;
|
||||
|
||||
- lockdep_assert_held(&sem->lock);
|
||||
+ ntsync_assert_held(sem);
|
||||
|
||||
if (check_add_overflow(sem->u.sem.count, count, &sum) ||
|
||||
sum > sem->u.sem.max)
|
||||
@@ -123,9 +327,11 @@ static int release_sem_state(struct ntsy
|
||||
|
||||
static int ntsync_sem_release(struct ntsync_obj *sem, void __user *argp)
|
||||
{
|
||||
+ struct ntsync_device *dev = sem->dev;
|
||||
__u32 __user *user_args = argp;
|
||||
__u32 prev_count;
|
||||
__u32 args;
|
||||
+ bool all;
|
||||
int ret;
|
||||
|
||||
if (copy_from_user(&args, argp, sizeof(args)))
|
||||
@@ -134,14 +340,17 @@ static int ntsync_sem_release(struct nts
|
||||
if (sem->type != NTSYNC_TYPE_SEM)
|
||||
return -EINVAL;
|
||||
|
||||
- spin_lock(&sem->lock);
|
||||
+ all = ntsync_lock_obj(dev, sem);
|
||||
|
||||
prev_count = sem->u.sem.count;
|
||||
- ret = post_sem_state(sem, args);
|
||||
- if (!ret)
|
||||
+ ret = release_sem_state(sem, args);
|
||||
+ if (!ret) {
|
||||
+ if (all)
|
||||
+ try_wake_all_obj(dev, sem);
|
||||
try_wake_any_sem(sem);
|
||||
+ }
|
||||
|
||||
- spin_unlock(&sem->lock);
|
||||
+ ntsync_unlock_obj(dev, sem, all);
|
||||
|
||||
if (!ret && put_user(prev_count, user_args))
|
||||
ret = -EFAULT;
|
||||
@@ -193,6 +402,8 @@ static struct ntsync_obj *ntsync_alloc_o
|
||||
get_file(dev->file);
|
||||
spin_lock_init(&obj->lock);
|
||||
INIT_LIST_HEAD(&obj->any_waiters);
|
||||
+ INIT_LIST_HEAD(&obj->all_waiters);
|
||||
+ atomic_set(&obj->all_hint, 0);
|
||||
|
||||
return obj;
|
||||
}
|
||||
@@ -301,7 +512,7 @@ static int ntsync_schedule(const struct
|
||||
* Allocate and initialize the ntsync_q structure, but do not queue us yet.
|
||||
*/
|
||||
static int setup_wait(struct ntsync_device *dev,
|
||||
- const struct ntsync_wait_args *args,
|
||||
+ const struct ntsync_wait_args *args, bool all,
|
||||
struct ntsync_q **ret_q)
|
||||
{
|
||||
const __u32 count = args->count;
|
||||
@@ -324,6 +535,7 @@ static int setup_wait(struct ntsync_devi
|
||||
return -ENOMEM;
|
||||
q->task = current;
|
||||
atomic_set(&q->signaled, -1);
|
||||
+ q->all = all;
|
||||
q->count = count;
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
@@ -333,6 +545,16 @@ static int setup_wait(struct ntsync_devi
|
||||
if (!obj)
|
||||
goto err;
|
||||
|
||||
+ if (all) {
|
||||
+ /* Check that the objects are all distinct. */
|
||||
+ for (j = 0; j < i; j++) {
|
||||
+ if (obj == q->entries[j].obj) {
|
||||
+ put_obj(obj);
|
||||
+ goto err;
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
entry->obj = obj;
|
||||
entry->q = q;
|
||||
entry->index = i;
|
||||
@@ -362,13 +584,14 @@ static int ntsync_wait_any(struct ntsync
|
||||
struct ntsync_wait_args args;
|
||||
struct ntsync_q *q;
|
||||
int signaled;
|
||||
+ bool all;
|
||||
__u32 i;
|
||||
int ret;
|
||||
|
||||
if (copy_from_user(&args, argp, sizeof(args)))
|
||||
return -EFAULT;
|
||||
|
||||
- ret = setup_wait(dev, &args, &q);
|
||||
+ ret = setup_wait(dev, &args, false, &q);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
@@ -378,9 +601,9 @@ static int ntsync_wait_any(struct ntsync
|
||||
struct ntsync_q_entry *entry = &q->entries[i];
|
||||
struct ntsync_obj *obj = entry->obj;
|
||||
|
||||
- spin_lock(&obj->lock);
|
||||
+ all = ntsync_lock_obj(dev, obj);
|
||||
list_add_tail(&entry->node, &obj->any_waiters);
|
||||
- spin_unlock(&obj->lock);
|
||||
+ ntsync_unlock_obj(dev, obj, all);
|
||||
}
|
||||
|
||||
/* check if we are already signaled */
|
||||
@@ -391,9 +614,9 @@ static int ntsync_wait_any(struct ntsync
|
||||
if (atomic_read(&q->signaled) != -1)
|
||||
break;
|
||||
|
||||
- spin_lock(&obj->lock);
|
||||
+ all = ntsync_lock_obj(dev, obj);
|
||||
try_wake_any_obj(obj);
|
||||
- spin_unlock(&obj->lock);
|
||||
+ ntsync_unlock_obj(dev, obj, all);
|
||||
}
|
||||
|
||||
/* sleep */
|
||||
@@ -406,13 +629,94 @@ static int ntsync_wait_any(struct ntsync
|
||||
struct ntsync_q_entry *entry = &q->entries[i];
|
||||
struct ntsync_obj *obj = entry->obj;
|
||||
|
||||
- spin_lock(&obj->lock);
|
||||
+ all = ntsync_lock_obj(dev, obj);
|
||||
list_del(&entry->node);
|
||||
- spin_unlock(&obj->lock);
|
||||
+ ntsync_unlock_obj(dev, obj, all);
|
||||
+
|
||||
+ put_obj(obj);
|
||||
+ }
|
||||
+
|
||||
+ signaled = atomic_read(&q->signaled);
|
||||
+ if (signaled != -1) {
|
||||
+ struct ntsync_wait_args __user *user_args = argp;
|
||||
+
|
||||
+ /* even if we caught a signal, we need to communicate success */
|
||||
+ ret = 0;
|
||||
+
|
||||
+ if (put_user(signaled, &user_args->index))
|
||||
+ ret = -EFAULT;
|
||||
+ } else if (!ret) {
|
||||
+ ret = -ETIMEDOUT;
|
||||
+ }
|
||||
+
|
||||
+ kfree(q);
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static int ntsync_wait_all(struct ntsync_device *dev, void __user *argp)
|
||||
+{
|
||||
+ struct ntsync_wait_args args;
|
||||
+ struct ntsync_q *q;
|
||||
+ int signaled;
|
||||
+ __u32 i;
|
||||
+ int ret;
|
||||
+
|
||||
+ if (copy_from_user(&args, argp, sizeof(args)))
|
||||
+ return -EFAULT;
|
||||
+
|
||||
+ ret = setup_wait(dev, &args, true, &q);
|
||||
+ if (ret < 0)
|
||||
+ return ret;
|
||||
+
|
||||
+ /* queue ourselves */
|
||||
+
|
||||
+ mutex_lock(&dev->wait_all_lock);
|
||||
+
|
||||
+ for (i = 0; i < args.count; i++) {
|
||||
+ struct ntsync_q_entry *entry = &q->entries[i];
|
||||
+ struct ntsync_obj *obj = entry->obj;
|
||||
+
|
||||
+ atomic_inc(&obj->all_hint);
|
||||
+
|
||||
+ /*
|
||||
+ * obj->all_waiters is protected by dev->wait_all_lock rather
|
||||
+ * than obj->lock, so there is no need to acquire obj->lock
|
||||
+ * here.
|
||||
+ */
|
||||
+ list_add_tail(&entry->node, &obj->all_waiters);
|
||||
+ }
|
||||
+
|
||||
+ /* check if we are already signaled */
|
||||
+
|
||||
+ try_wake_all(dev, q, NULL);
|
||||
+
|
||||
+ mutex_unlock(&dev->wait_all_lock);
|
||||
+
|
||||
+ /* sleep */
|
||||
+
|
||||
+ ret = ntsync_schedule(q, &args);
|
||||
+
|
||||
+ /* and finally, unqueue */
|
||||
+
|
||||
+ mutex_lock(&dev->wait_all_lock);
|
||||
+
|
||||
+ for (i = 0; i < args.count; i++) {
|
||||
+ struct ntsync_q_entry *entry = &q->entries[i];
|
||||
+ struct ntsync_obj *obj = entry->obj;
|
||||
+
|
||||
+ /*
|
||||
+ * obj->all_waiters is protected by dev->wait_all_lock rather
|
||||
+ * than obj->lock, so there is no need to acquire it here.
|
||||
+ */
|
||||
+ list_del(&entry->node);
|
||||
+
|
||||
+ atomic_dec(&obj->all_hint);
|
||||
|
||||
put_obj(obj);
|
||||
}
|
||||
|
||||
+ mutex_unlock(&dev->wait_all_lock);
|
||||
+
|
||||
signaled = atomic_read(&q->signaled);
|
||||
if (signaled != -1) {
|
||||
struct ntsync_wait_args __user *user_args = argp;
|
||||
@@ -438,6 +742,8 @@ static int ntsync_char_open(struct inode
|
||||
if (!dev)
|
||||
return -ENOMEM;
|
||||
|
||||
+ mutex_init(&dev->wait_all_lock);
|
||||
+
|
||||
file->private_data = dev;
|
||||
dev->file = file;
|
||||
return nonseekable_open(inode, file);
|
||||
@@ -461,6 +767,8 @@ static long ntsync_char_ioctl(struct fil
|
||||
switch (cmd) {
|
||||
case NTSYNC_IOC_CREATE_SEM:
|
||||
return ntsync_create_sem(dev, argp);
|
||||
+ case NTSYNC_IOC_WAIT_ALL:
|
||||
+ return ntsync_wait_all(dev, argp);
|
||||
case NTSYNC_IOC_WAIT_ANY:
|
||||
return ntsync_wait_any(dev, argp);
|
||||
default:
|
||||
--- a/include/uapi/linux/ntsync.h
|
||||
+++ b/include/uapi/linux/ntsync.h
|
||||
@@ -30,6 +30,7 @@ struct ntsync_wait_args {
|
||||
|
||||
#define NTSYNC_IOC_CREATE_SEM _IOW ('N', 0x80, struct ntsync_sem_args)
|
||||
#define NTSYNC_IOC_WAIT_ANY _IOWR('N', 0x82, struct ntsync_wait_args)
|
||||
+#define NTSYNC_IOC_WAIT_ALL _IOWR('N', 0x83, struct ntsync_wait_args)
|
||||
|
||||
#define NTSYNC_IOC_SEM_RELEASE _IOWR('N', 0x81, __u32)
|
||||
|
@ -1,222 +0,0 @@
|
||||
From bcdeaefdc4b60e7845232c201427717df3a83277 Mon Sep 17 00:00:00 2001
|
||||
From: Elizabeth Figura <zfigura@codeweavers.com>
|
||||
Date: Fri, 13 Dec 2024 13:34:46 -0600
|
||||
Subject: ntsync: Introduce NTSYNC_IOC_CREATE_MUTEX.
|
||||
|
||||
This corresponds to the NT syscall NtCreateMutant().
|
||||
|
||||
An NT mutex is recursive, with a 32-bit recursion counter. When acquired via
|
||||
NtWaitForMultipleObjects(), the recursion counter is incremented by one. The OS
|
||||
records the thread which acquired it.
|
||||
|
||||
The OS records the thread which acquired it. However, in order to keep this
|
||||
driver self-contained, the owning thread ID is managed by user-space, and passed
|
||||
as a parameter to all relevant ioctls.
|
||||
|
||||
The initial owner and recursion count, if any, are specified when the mutex is
|
||||
created.
|
||||
|
||||
Signed-off-by: Elizabeth Figura <zfigura@codeweavers.com>
|
||||
---
|
||||
drivers/misc/ntsync.c | 74 +++++++++++++++++++++++++++++++++++--
|
||||
include/uapi/linux/ntsync.h | 9 ++++-
|
||||
2 files changed, 79 insertions(+), 4 deletions(-)
|
||||
|
||||
--- a/drivers/misc/ntsync.c
|
||||
+++ b/drivers/misc/ntsync.c
|
||||
@@ -25,6 +25,7 @@
|
||||
|
||||
enum ntsync_type {
|
||||
NTSYNC_TYPE_SEM,
|
||||
+ NTSYNC_TYPE_MUTEX,
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -55,6 +56,10 @@ struct ntsync_obj {
|
||||
__u32 count;
|
||||
__u32 max;
|
||||
} sem;
|
||||
+ struct {
|
||||
+ __u32 count;
|
||||
+ pid_t owner;
|
||||
+ } mutex;
|
||||
} u;
|
||||
|
||||
/*
|
||||
@@ -92,6 +97,7 @@ struct ntsync_q_entry {
|
||||
|
||||
struct ntsync_q {
|
||||
struct task_struct *task;
|
||||
+ __u32 owner;
|
||||
|
||||
/*
|
||||
* Protected via atomic_try_cmpxchg(). Only the thread that wins the
|
||||
@@ -214,13 +220,17 @@ static void ntsync_unlock_obj(struct nts
|
||||
((lockdep_is_held(&(obj)->dev->wait_all_lock) != LOCK_STATE_NOT_HELD) && \
|
||||
(obj)->dev_locked))
|
||||
|
||||
-static bool is_signaled(struct ntsync_obj *obj)
|
||||
+static bool is_signaled(struct ntsync_obj *obj, __u32 owner)
|
||||
{
|
||||
ntsync_assert_held(obj);
|
||||
|
||||
switch (obj->type) {
|
||||
case NTSYNC_TYPE_SEM:
|
||||
return !!obj->u.sem.count;
|
||||
+ case NTSYNC_TYPE_MUTEX:
|
||||
+ if (obj->u.mutex.owner && obj->u.mutex.owner != owner)
|
||||
+ return false;
|
||||
+ return obj->u.mutex.count < UINT_MAX;
|
||||
}
|
||||
|
||||
WARN(1, "bad object type %#x\n", obj->type);
|
||||
@@ -250,7 +260,7 @@ static void try_wake_all(struct ntsync_d
|
||||
}
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
- if (!is_signaled(q->entries[i].obj)) {
|
||||
+ if (!is_signaled(q->entries[i].obj, q->owner)) {
|
||||
can_wake = false;
|
||||
break;
|
||||
}
|
||||
@@ -264,6 +274,10 @@ static void try_wake_all(struct ntsync_d
|
||||
case NTSYNC_TYPE_SEM:
|
||||
obj->u.sem.count--;
|
||||
break;
|
||||
+ case NTSYNC_TYPE_MUTEX:
|
||||
+ obj->u.mutex.count++;
|
||||
+ obj->u.mutex.owner = q->owner;
|
||||
+ break;
|
||||
}
|
||||
}
|
||||
wake_up_process(q->task);
|
||||
@@ -307,6 +321,30 @@ static void try_wake_any_sem(struct ntsy
|
||||
}
|
||||
}
|
||||
|
||||
+static void try_wake_any_mutex(struct ntsync_obj *mutex)
|
||||
+{
|
||||
+ struct ntsync_q_entry *entry;
|
||||
+
|
||||
+ ntsync_assert_held(mutex);
|
||||
+ lockdep_assert(mutex->type == NTSYNC_TYPE_MUTEX);
|
||||
+
|
||||
+ list_for_each_entry(entry, &mutex->any_waiters, node) {
|
||||
+ struct ntsync_q *q = entry->q;
|
||||
+ int signaled = -1;
|
||||
+
|
||||
+ if (mutex->u.mutex.count == UINT_MAX)
|
||||
+ break;
|
||||
+ if (mutex->u.mutex.owner && mutex->u.mutex.owner != q->owner)
|
||||
+ continue;
|
||||
+
|
||||
+ if (atomic_try_cmpxchg(&q->signaled, &signaled, entry->index)) {
|
||||
+ mutex->u.mutex.count++;
|
||||
+ mutex->u.mutex.owner = q->owner;
|
||||
+ wake_up_process(q->task);
|
||||
+ }
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
/*
|
||||
* Actually change the semaphore state, returning -EOVERFLOW if it is made
|
||||
* invalid.
|
||||
@@ -451,6 +489,30 @@ static int ntsync_create_sem(struct ntsy
|
||||
return fd;
|
||||
}
|
||||
|
||||
+static int ntsync_create_mutex(struct ntsync_device *dev, void __user *argp)
|
||||
+{
|
||||
+ struct ntsync_mutex_args args;
|
||||
+ struct ntsync_obj *mutex;
|
||||
+ int fd;
|
||||
+
|
||||
+ if (copy_from_user(&args, argp, sizeof(args)))
|
||||
+ return -EFAULT;
|
||||
+
|
||||
+ if (!args.owner != !args.count)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ mutex = ntsync_alloc_obj(dev, NTSYNC_TYPE_MUTEX);
|
||||
+ if (!mutex)
|
||||
+ return -ENOMEM;
|
||||
+ mutex->u.mutex.count = args.count;
|
||||
+ mutex->u.mutex.owner = args.owner;
|
||||
+ fd = ntsync_obj_get_fd(mutex);
|
||||
+ if (fd < 0)
|
||||
+ kfree(mutex);
|
||||
+
|
||||
+ return fd;
|
||||
+}
|
||||
+
|
||||
static struct ntsync_obj *get_obj(struct ntsync_device *dev, int fd)
|
||||
{
|
||||
struct file *file = fget(fd);
|
||||
@@ -520,7 +582,7 @@ static int setup_wait(struct ntsync_devi
|
||||
struct ntsync_q *q;
|
||||
__u32 i, j;
|
||||
|
||||
- if (args->pad[0] || args->pad[1] || args->pad[2] || (args->flags & ~NTSYNC_WAIT_REALTIME))
|
||||
+ if (args->pad[0] || args->pad[1] || (args->flags & ~NTSYNC_WAIT_REALTIME))
|
||||
return -EINVAL;
|
||||
|
||||
if (args->count > NTSYNC_MAX_WAIT_COUNT)
|
||||
@@ -534,6 +596,7 @@ static int setup_wait(struct ntsync_devi
|
||||
if (!q)
|
||||
return -ENOMEM;
|
||||
q->task = current;
|
||||
+ q->owner = args->owner;
|
||||
atomic_set(&q->signaled, -1);
|
||||
q->all = all;
|
||||
q->count = count;
|
||||
@@ -576,6 +639,9 @@ static void try_wake_any_obj(struct ntsy
|
||||
case NTSYNC_TYPE_SEM:
|
||||
try_wake_any_sem(obj);
|
||||
break;
|
||||
+ case NTSYNC_TYPE_MUTEX:
|
||||
+ try_wake_any_mutex(obj);
|
||||
+ break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -765,6 +831,8 @@ static long ntsync_char_ioctl(struct fil
|
||||
void __user *argp = (void __user *)parm;
|
||||
|
||||
switch (cmd) {
|
||||
+ case NTSYNC_IOC_CREATE_MUTEX:
|
||||
+ return ntsync_create_mutex(dev, argp);
|
||||
case NTSYNC_IOC_CREATE_SEM:
|
||||
return ntsync_create_sem(dev, argp);
|
||||
case NTSYNC_IOC_WAIT_ALL:
|
||||
--- a/include/uapi/linux/ntsync.h
|
||||
+++ b/include/uapi/linux/ntsync.h
|
||||
@@ -15,6 +15,11 @@ struct ntsync_sem_args {
|
||||
__u32 max;
|
||||
};
|
||||
|
||||
+struct ntsync_mutex_args {
|
||||
+ __u32 owner;
|
||||
+ __u32 count;
|
||||
+};
|
||||
+
|
||||
#define NTSYNC_WAIT_REALTIME 0x1
|
||||
|
||||
struct ntsync_wait_args {
|
||||
@@ -23,7 +28,8 @@ struct ntsync_wait_args {
|
||||
__u32 count;
|
||||
__u32 index;
|
||||
__u32 flags;
|
||||
- __u32 pad[3];
|
||||
+ __u32 owner;
|
||||
+ __u32 pad[2];
|
||||
};
|
||||
|
||||
#define NTSYNC_MAX_WAIT_COUNT 64
|
||||
@@ -31,6 +37,7 @@ struct ntsync_wait_args {
|
||||
#define NTSYNC_IOC_CREATE_SEM _IOW ('N', 0x80, struct ntsync_sem_args)
|
||||
#define NTSYNC_IOC_WAIT_ANY _IOWR('N', 0x82, struct ntsync_wait_args)
|
||||
#define NTSYNC_IOC_WAIT_ALL _IOWR('N', 0x83, struct ntsync_wait_args)
|
||||
+#define NTSYNC_IOC_CREATE_MUTEX _IOW ('N', 0x84, struct ntsync_mutex_args)
|
||||
|
||||
#define NTSYNC_IOC_SEM_RELEASE _IOWR('N', 0x81, __u32)
|
||||
|
@ -1,95 +0,0 @@
|
||||
From e349279c9dc7fc2136a764a16074a90ef3039f38 Mon Sep 17 00:00:00 2001
|
||||
From: Elizabeth Figura <zfigura@codeweavers.com>
|
||||
Date: Fri, 13 Dec 2024 13:34:47 -0600
|
||||
Subject: ntsync: Introduce NTSYNC_IOC_MUTEX_UNLOCK.
|
||||
|
||||
This corresponds to the NT syscall NtReleaseMutant().
|
||||
|
||||
This syscall decrements the mutex's recursion count by one, and returns the
|
||||
previous value. If the mutex is not owned by the current task, the function
|
||||
instead fails and returns -EPERM.
|
||||
|
||||
Signed-off-by: Elizabeth Figura <zfigura@codeweavers.com>
|
||||
---
|
||||
drivers/misc/ntsync.c | 53 +++++++++++++++++++++++++++++++++++++
|
||||
include/uapi/linux/ntsync.h | 1 +
|
||||
2 files changed, 54 insertions(+)
|
||||
|
||||
--- a/drivers/misc/ntsync.c
|
||||
+++ b/drivers/misc/ntsync.c
|
||||
@@ -396,6 +396,57 @@ static int ntsync_sem_release(struct nts
|
||||
return ret;
|
||||
}
|
||||
|
||||
+/*
|
||||
+ * Actually change the mutex state, returning -EPERM if not the owner.
|
||||
+ */
|
||||
+static int unlock_mutex_state(struct ntsync_obj *mutex,
|
||||
+ const struct ntsync_mutex_args *args)
|
||||
+{
|
||||
+ ntsync_assert_held(mutex);
|
||||
+
|
||||
+ if (mutex->u.mutex.owner != args->owner)
|
||||
+ return -EPERM;
|
||||
+
|
||||
+ if (!--mutex->u.mutex.count)
|
||||
+ mutex->u.mutex.owner = 0;
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int ntsync_mutex_unlock(struct ntsync_obj *mutex, void __user *argp)
|
||||
+{
|
||||
+ struct ntsync_mutex_args __user *user_args = argp;
|
||||
+ struct ntsync_device *dev = mutex->dev;
|
||||
+ struct ntsync_mutex_args args;
|
||||
+ __u32 prev_count;
|
||||
+ bool all;
|
||||
+ int ret;
|
||||
+
|
||||
+ if (copy_from_user(&args, argp, sizeof(args)))
|
||||
+ return -EFAULT;
|
||||
+ if (!args.owner)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ if (mutex->type != NTSYNC_TYPE_MUTEX)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ all = ntsync_lock_obj(dev, mutex);
|
||||
+
|
||||
+ prev_count = mutex->u.mutex.count;
|
||||
+ ret = unlock_mutex_state(mutex, &args);
|
||||
+ if (!ret) {
|
||||
+ if (all)
|
||||
+ try_wake_all_obj(dev, mutex);
|
||||
+ try_wake_any_mutex(mutex);
|
||||
+ }
|
||||
+
|
||||
+ ntsync_unlock_obj(dev, mutex, all);
|
||||
+
|
||||
+ if (!ret && put_user(prev_count, &user_args->count))
|
||||
+ ret = -EFAULT;
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
static int ntsync_obj_release(struct inode *inode, struct file *file)
|
||||
{
|
||||
struct ntsync_obj *obj = file->private_data;
|
||||
@@ -415,6 +466,8 @@ static long ntsync_obj_ioctl(struct file
|
||||
switch (cmd) {
|
||||
case NTSYNC_IOC_SEM_RELEASE:
|
||||
return ntsync_sem_release(obj, argp);
|
||||
+ case NTSYNC_IOC_MUTEX_UNLOCK:
|
||||
+ return ntsync_mutex_unlock(obj, argp);
|
||||
default:
|
||||
return -ENOIOCTLCMD;
|
||||
}
|
||||
--- a/include/uapi/linux/ntsync.h
|
||||
+++ b/include/uapi/linux/ntsync.h
|
||||
@@ -40,5 +40,6 @@ struct ntsync_wait_args {
|
||||
#define NTSYNC_IOC_CREATE_MUTEX _IOW ('N', 0x84, struct ntsync_mutex_args)
|
||||
|
||||
#define NTSYNC_IOC_SEM_RELEASE _IOWR('N', 0x81, __u32)
|
||||
+#define NTSYNC_IOC_MUTEX_UNLOCK _IOWR('N', 0x85, struct ntsync_mutex_args)
|
||||
|
||||
#endif
|
@ -1,156 +0,0 @@
|
||||
From ebb60a10ac3c6b28ba7a46aa67b279d41ad9356d Mon Sep 17 00:00:00 2001
|
||||
From: Elizabeth Figura <zfigura@codeweavers.com>
|
||||
Date: Fri, 13 Dec 2024 13:34:48 -0600
|
||||
Subject: ntsync: Introduce NTSYNC_IOC_MUTEX_KILL.
|
||||
|
||||
This does not correspond to any NT syscall. Rather, when a thread dies, it
|
||||
should be called by the NT emulator for each mutex, with the TID of the dying
|
||||
thread.
|
||||
|
||||
NT mutexes are robust (in the pthread sense). When an NT thread dies, any
|
||||
mutexes it owned are immediately released. Acquisition of those mutexes by other
|
||||
threads will return a special value indicating that the mutex was abandoned,
|
||||
like EOWNERDEAD returned from pthread_mutex_lock(), and EOWNERDEAD is indeed
|
||||
used here for that purpose.
|
||||
|
||||
Signed-off-by: Elizabeth Figura <zfigura@codeweavers.com>
|
||||
---
|
||||
drivers/misc/ntsync.c | 61 +++++++++++++++++++++++++++++++++++--
|
||||
include/uapi/linux/ntsync.h | 1 +
|
||||
2 files changed, 60 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/misc/ntsync.c
|
||||
+++ b/drivers/misc/ntsync.c
|
||||
@@ -59,6 +59,7 @@ struct ntsync_obj {
|
||||
struct {
|
||||
__u32 count;
|
||||
pid_t owner;
|
||||
+ bool ownerdead;
|
||||
} mutex;
|
||||
} u;
|
||||
|
||||
@@ -107,6 +108,7 @@ struct ntsync_q {
|
||||
atomic_t signaled;
|
||||
|
||||
bool all;
|
||||
+ bool ownerdead;
|
||||
__u32 count;
|
||||
struct ntsync_q_entry entries[];
|
||||
};
|
||||
@@ -275,6 +277,9 @@ static void try_wake_all(struct ntsync_d
|
||||
obj->u.sem.count--;
|
||||
break;
|
||||
case NTSYNC_TYPE_MUTEX:
|
||||
+ if (obj->u.mutex.ownerdead)
|
||||
+ q->ownerdead = true;
|
||||
+ obj->u.mutex.ownerdead = false;
|
||||
obj->u.mutex.count++;
|
||||
obj->u.mutex.owner = q->owner;
|
||||
break;
|
||||
@@ -338,6 +343,9 @@ static void try_wake_any_mutex(struct nt
|
||||
continue;
|
||||
|
||||
if (atomic_try_cmpxchg(&q->signaled, &signaled, entry->index)) {
|
||||
+ if (mutex->u.mutex.ownerdead)
|
||||
+ q->ownerdead = true;
|
||||
+ mutex->u.mutex.ownerdead = false;
|
||||
mutex->u.mutex.count++;
|
||||
mutex->u.mutex.owner = q->owner;
|
||||
wake_up_process(q->task);
|
||||
@@ -447,6 +455,52 @@ static int ntsync_mutex_unlock(struct nt
|
||||
return ret;
|
||||
}
|
||||
|
||||
+/*
|
||||
+ * Actually change the mutex state to mark its owner as dead,
|
||||
+ * returning -EPERM if not the owner.
|
||||
+ */
|
||||
+static int kill_mutex_state(struct ntsync_obj *mutex, __u32 owner)
|
||||
+{
|
||||
+ ntsync_assert_held(mutex);
|
||||
+
|
||||
+ if (mutex->u.mutex.owner != owner)
|
||||
+ return -EPERM;
|
||||
+
|
||||
+ mutex->u.mutex.ownerdead = true;
|
||||
+ mutex->u.mutex.owner = 0;
|
||||
+ mutex->u.mutex.count = 0;
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int ntsync_mutex_kill(struct ntsync_obj *mutex, void __user *argp)
|
||||
+{
|
||||
+ struct ntsync_device *dev = mutex->dev;
|
||||
+ __u32 owner;
|
||||
+ bool all;
|
||||
+ int ret;
|
||||
+
|
||||
+ if (get_user(owner, (__u32 __user *)argp))
|
||||
+ return -EFAULT;
|
||||
+ if (!owner)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ if (mutex->type != NTSYNC_TYPE_MUTEX)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ all = ntsync_lock_obj(dev, mutex);
|
||||
+
|
||||
+ ret = kill_mutex_state(mutex, owner);
|
||||
+ if (!ret) {
|
||||
+ if (all)
|
||||
+ try_wake_all_obj(dev, mutex);
|
||||
+ try_wake_any_mutex(mutex);
|
||||
+ }
|
||||
+
|
||||
+ ntsync_unlock_obj(dev, mutex, all);
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
static int ntsync_obj_release(struct inode *inode, struct file *file)
|
||||
{
|
||||
struct ntsync_obj *obj = file->private_data;
|
||||
@@ -468,6 +522,8 @@ static long ntsync_obj_ioctl(struct file
|
||||
return ntsync_sem_release(obj, argp);
|
||||
case NTSYNC_IOC_MUTEX_UNLOCK:
|
||||
return ntsync_mutex_unlock(obj, argp);
|
||||
+ case NTSYNC_IOC_MUTEX_KILL:
|
||||
+ return ntsync_mutex_kill(obj, argp);
|
||||
default:
|
||||
return -ENOIOCTLCMD;
|
||||
}
|
||||
@@ -652,6 +708,7 @@ static int setup_wait(struct ntsync_devi
|
||||
q->owner = args->owner;
|
||||
atomic_set(&q->signaled, -1);
|
||||
q->all = all;
|
||||
+ q->ownerdead = false;
|
||||
q->count = count;
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
@@ -760,7 +817,7 @@ static int ntsync_wait_any(struct ntsync
|
||||
struct ntsync_wait_args __user *user_args = argp;
|
||||
|
||||
/* even if we caught a signal, we need to communicate success */
|
||||
- ret = 0;
|
||||
+ ret = q->ownerdead ? -EOWNERDEAD : 0;
|
||||
|
||||
if (put_user(signaled, &user_args->index))
|
||||
ret = -EFAULT;
|
||||
@@ -841,7 +898,7 @@ static int ntsync_wait_all(struct ntsync
|
||||
struct ntsync_wait_args __user *user_args = argp;
|
||||
|
||||
/* even if we caught a signal, we need to communicate success */
|
||||
- ret = 0;
|
||||
+ ret = q->ownerdead ? -EOWNERDEAD : 0;
|
||||
|
||||
if (put_user(signaled, &user_args->index))
|
||||
ret = -EFAULT;
|
||||
--- a/include/uapi/linux/ntsync.h
|
||||
+++ b/include/uapi/linux/ntsync.h
|
||||
@@ -41,5 +41,6 @@ struct ntsync_wait_args {
|
||||
|
||||
#define NTSYNC_IOC_SEM_RELEASE _IOWR('N', 0x81, __u32)
|
||||
#define NTSYNC_IOC_MUTEX_UNLOCK _IOWR('N', 0x85, struct ntsync_mutex_args)
|
||||
+#define NTSYNC_IOC_MUTEX_KILL _IOW ('N', 0x86, __u32)
|
||||
|
||||
#endif
|
@ -1,162 +0,0 @@
|
||||
From f74c8259d49ea4c0e679902da9c7c95ec06ae65c Mon Sep 17 00:00:00 2001
|
||||
From: Elizabeth Figura <zfigura@codeweavers.com>
|
||||
Date: Fri, 13 Dec 2024 13:34:49 -0600
|
||||
Subject: ntsync: Introduce NTSYNC_IOC_CREATE_EVENT.
|
||||
|
||||
This correspond to the NT syscall NtCreateEvent().
|
||||
|
||||
An NT event holds a single bit of state denoting whether it is signaled or
|
||||
unsignaled.
|
||||
|
||||
There are two types of events: manual-reset and automatic-reset. When an
|
||||
automatic-reset event is acquired via a wait function, its state is reset to
|
||||
unsignaled. Manual-reset events are not affected by wait functions.
|
||||
|
||||
Whether the event is manual-reset, and its initial state, are specified at
|
||||
creation time.
|
||||
|
||||
Signed-off-by: Elizabeth Figura <zfigura@codeweavers.com>
|
||||
---
|
||||
drivers/misc/ntsync.c | 59 +++++++++++++++++++++++++++++++++++++
|
||||
include/uapi/linux/ntsync.h | 6 ++++
|
||||
2 files changed, 65 insertions(+)
|
||||
|
||||
--- a/drivers/misc/ntsync.c
|
||||
+++ b/drivers/misc/ntsync.c
|
||||
@@ -26,6 +26,7 @@
|
||||
enum ntsync_type {
|
||||
NTSYNC_TYPE_SEM,
|
||||
NTSYNC_TYPE_MUTEX,
|
||||
+ NTSYNC_TYPE_EVENT,
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -61,6 +62,10 @@ struct ntsync_obj {
|
||||
pid_t owner;
|
||||
bool ownerdead;
|
||||
} mutex;
|
||||
+ struct {
|
||||
+ bool manual;
|
||||
+ bool signaled;
|
||||
+ } event;
|
||||
} u;
|
||||
|
||||
/*
|
||||
@@ -233,6 +238,8 @@ static bool is_signaled(struct ntsync_ob
|
||||
if (obj->u.mutex.owner && obj->u.mutex.owner != owner)
|
||||
return false;
|
||||
return obj->u.mutex.count < UINT_MAX;
|
||||
+ case NTSYNC_TYPE_EVENT:
|
||||
+ return obj->u.event.signaled;
|
||||
}
|
||||
|
||||
WARN(1, "bad object type %#x\n", obj->type);
|
||||
@@ -283,6 +290,10 @@ static void try_wake_all(struct ntsync_d
|
||||
obj->u.mutex.count++;
|
||||
obj->u.mutex.owner = q->owner;
|
||||
break;
|
||||
+ case NTSYNC_TYPE_EVENT:
|
||||
+ if (!obj->u.event.manual)
|
||||
+ obj->u.event.signaled = false;
|
||||
+ break;
|
||||
}
|
||||
}
|
||||
wake_up_process(q->task);
|
||||
@@ -353,6 +364,28 @@ static void try_wake_any_mutex(struct nt
|
||||
}
|
||||
}
|
||||
|
||||
+static void try_wake_any_event(struct ntsync_obj *event)
|
||||
+{
|
||||
+ struct ntsync_q_entry *entry;
|
||||
+
|
||||
+ ntsync_assert_held(event);
|
||||
+ lockdep_assert(event->type == NTSYNC_TYPE_EVENT);
|
||||
+
|
||||
+ list_for_each_entry(entry, &event->any_waiters, node) {
|
||||
+ struct ntsync_q *q = entry->q;
|
||||
+ int signaled = -1;
|
||||
+
|
||||
+ if (!event->u.event.signaled)
|
||||
+ break;
|
||||
+
|
||||
+ if (atomic_try_cmpxchg(&q->signaled, &signaled, entry->index)) {
|
||||
+ if (!event->u.event.manual)
|
||||
+ event->u.event.signaled = false;
|
||||
+ wake_up_process(q->task);
|
||||
+ }
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
/*
|
||||
* Actually change the semaphore state, returning -EOVERFLOW if it is made
|
||||
* invalid.
|
||||
@@ -622,6 +655,27 @@ static int ntsync_create_mutex(struct nt
|
||||
return fd;
|
||||
}
|
||||
|
||||
+static int ntsync_create_event(struct ntsync_device *dev, void __user *argp)
|
||||
+{
|
||||
+ struct ntsync_event_args args;
|
||||
+ struct ntsync_obj *event;
|
||||
+ int fd;
|
||||
+
|
||||
+ if (copy_from_user(&args, argp, sizeof(args)))
|
||||
+ return -EFAULT;
|
||||
+
|
||||
+ event = ntsync_alloc_obj(dev, NTSYNC_TYPE_EVENT);
|
||||
+ if (!event)
|
||||
+ return -ENOMEM;
|
||||
+ event->u.event.manual = args.manual;
|
||||
+ event->u.event.signaled = args.signaled;
|
||||
+ fd = ntsync_obj_get_fd(event);
|
||||
+ if (fd < 0)
|
||||
+ kfree(event);
|
||||
+
|
||||
+ return fd;
|
||||
+}
|
||||
+
|
||||
static struct ntsync_obj *get_obj(struct ntsync_device *dev, int fd)
|
||||
{
|
||||
struct file *file = fget(fd);
|
||||
@@ -752,6 +806,9 @@ static void try_wake_any_obj(struct ntsy
|
||||
case NTSYNC_TYPE_MUTEX:
|
||||
try_wake_any_mutex(obj);
|
||||
break;
|
||||
+ case NTSYNC_TYPE_EVENT:
|
||||
+ try_wake_any_event(obj);
|
||||
+ break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -941,6 +998,8 @@ static long ntsync_char_ioctl(struct fil
|
||||
void __user *argp = (void __user *)parm;
|
||||
|
||||
switch (cmd) {
|
||||
+ case NTSYNC_IOC_CREATE_EVENT:
|
||||
+ return ntsync_create_event(dev, argp);
|
||||
case NTSYNC_IOC_CREATE_MUTEX:
|
||||
return ntsync_create_mutex(dev, argp);
|
||||
case NTSYNC_IOC_CREATE_SEM:
|
||||
--- a/include/uapi/linux/ntsync.h
|
||||
+++ b/include/uapi/linux/ntsync.h
|
||||
@@ -20,6 +20,11 @@ struct ntsync_mutex_args {
|
||||
__u32 count;
|
||||
};
|
||||
|
||||
+struct ntsync_event_args {
|
||||
+ __u32 manual;
|
||||
+ __u32 signaled;
|
||||
+};
|
||||
+
|
||||
#define NTSYNC_WAIT_REALTIME 0x1
|
||||
|
||||
struct ntsync_wait_args {
|
||||
@@ -38,6 +43,7 @@ struct ntsync_wait_args {
|
||||
#define NTSYNC_IOC_WAIT_ANY _IOWR('N', 0x82, struct ntsync_wait_args)
|
||||
#define NTSYNC_IOC_WAIT_ALL _IOWR('N', 0x83, struct ntsync_wait_args)
|
||||
#define NTSYNC_IOC_CREATE_MUTEX _IOW ('N', 0x84, struct ntsync_mutex_args)
|
||||
+#define NTSYNC_IOC_CREATE_EVENT _IOW ('N', 0x87, struct ntsync_event_args)
|
||||
|
||||
#define NTSYNC_IOC_SEM_RELEASE _IOWR('N', 0x81, __u32)
|
||||
#define NTSYNC_IOC_MUTEX_UNLOCK _IOWR('N', 0x85, struct ntsync_mutex_args)
|
@ -1,67 +0,0 @@
|
||||
From bf60db9cfeccc8f92636b6dcf2eccd7fcd8d84f3 Mon Sep 17 00:00:00 2001
|
||||
From: Elizabeth Figura <zfigura@codeweavers.com>
|
||||
Date: Fri, 13 Dec 2024 13:34:50 -0600
|
||||
Subject: ntsync: Introduce NTSYNC_IOC_EVENT_SET.
|
||||
|
||||
This corresponds to the NT syscall NtSetEvent().
|
||||
|
||||
This sets the event to the signaled state, and returns its previous state.
|
||||
|
||||
Signed-off-by: Elizabeth Figura <zfigura@codeweavers.com>
|
||||
---
|
||||
drivers/misc/ntsync.c | 27 +++++++++++++++++++++++++++
|
||||
include/uapi/linux/ntsync.h | 1 +
|
||||
2 files changed, 28 insertions(+)
|
||||
|
||||
--- a/drivers/misc/ntsync.c
|
||||
+++ b/drivers/misc/ntsync.c
|
||||
@@ -534,6 +534,31 @@ static int ntsync_mutex_kill(struct ntsy
|
||||
return ret;
|
||||
}
|
||||
|
||||
+static int ntsync_event_set(struct ntsync_obj *event, void __user *argp)
|
||||
+{
|
||||
+ struct ntsync_device *dev = event->dev;
|
||||
+ __u32 prev_state;
|
||||
+ bool all;
|
||||
+
|
||||
+ if (event->type != NTSYNC_TYPE_EVENT)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ all = ntsync_lock_obj(dev, event);
|
||||
+
|
||||
+ prev_state = event->u.event.signaled;
|
||||
+ event->u.event.signaled = true;
|
||||
+ if (all)
|
||||
+ try_wake_all_obj(dev, event);
|
||||
+ try_wake_any_event(event);
|
||||
+
|
||||
+ ntsync_unlock_obj(dev, event, all);
|
||||
+
|
||||
+ if (put_user(prev_state, (__u32 __user *)argp))
|
||||
+ return -EFAULT;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static int ntsync_obj_release(struct inode *inode, struct file *file)
|
||||
{
|
||||
struct ntsync_obj *obj = file->private_data;
|
||||
@@ -557,6 +582,8 @@ static long ntsync_obj_ioctl(struct file
|
||||
return ntsync_mutex_unlock(obj, argp);
|
||||
case NTSYNC_IOC_MUTEX_KILL:
|
||||
return ntsync_mutex_kill(obj, argp);
|
||||
+ case NTSYNC_IOC_EVENT_SET:
|
||||
+ return ntsync_event_set(obj, argp);
|
||||
default:
|
||||
return -ENOIOCTLCMD;
|
||||
}
|
||||
--- a/include/uapi/linux/ntsync.h
|
||||
+++ b/include/uapi/linux/ntsync.h
|
||||
@@ -48,5 +48,6 @@ struct ntsync_wait_args {
|
||||
#define NTSYNC_IOC_SEM_RELEASE _IOWR('N', 0x81, __u32)
|
||||
#define NTSYNC_IOC_MUTEX_UNLOCK _IOWR('N', 0x85, struct ntsync_mutex_args)
|
||||
#define NTSYNC_IOC_MUTEX_KILL _IOW ('N', 0x86, __u32)
|
||||
+#define NTSYNC_IOC_EVENT_SET _IOR ('N', 0x88, __u32)
|
||||
|
||||
#endif
|
@ -1,64 +0,0 @@
|
||||
From f2de3c99a840cac45446515dd268cb9d64f9f892 Mon Sep 17 00:00:00 2001
|
||||
From: Elizabeth Figura <zfigura@codeweavers.com>
|
||||
Date: Fri, 13 Dec 2024 13:34:51 -0600
|
||||
Subject: ntsync: Introduce NTSYNC_IOC_EVENT_RESET.
|
||||
|
||||
This corresponds to the NT syscall NtResetEvent().
|
||||
|
||||
This sets the event to the unsignaled state, and returns its previous state.
|
||||
|
||||
Signed-off-by: Elizabeth Figura <zfigura@codeweavers.com>
|
||||
---
|
||||
drivers/misc/ntsync.c | 24 ++++++++++++++++++++++++
|
||||
include/uapi/linux/ntsync.h | 1 +
|
||||
2 files changed, 25 insertions(+)
|
||||
|
||||
--- a/drivers/misc/ntsync.c
|
||||
+++ b/drivers/misc/ntsync.c
|
||||
@@ -559,6 +559,28 @@ static int ntsync_event_set(struct ntsyn
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static int ntsync_event_reset(struct ntsync_obj *event, void __user *argp)
|
||||
+{
|
||||
+ struct ntsync_device *dev = event->dev;
|
||||
+ __u32 prev_state;
|
||||
+ bool all;
|
||||
+
|
||||
+ if (event->type != NTSYNC_TYPE_EVENT)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ all = ntsync_lock_obj(dev, event);
|
||||
+
|
||||
+ prev_state = event->u.event.signaled;
|
||||
+ event->u.event.signaled = false;
|
||||
+
|
||||
+ ntsync_unlock_obj(dev, event, all);
|
||||
+
|
||||
+ if (put_user(prev_state, (__u32 __user *)argp))
|
||||
+ return -EFAULT;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static int ntsync_obj_release(struct inode *inode, struct file *file)
|
||||
{
|
||||
struct ntsync_obj *obj = file->private_data;
|
||||
@@ -584,6 +606,8 @@ static long ntsync_obj_ioctl(struct file
|
||||
return ntsync_mutex_kill(obj, argp);
|
||||
case NTSYNC_IOC_EVENT_SET:
|
||||
return ntsync_event_set(obj, argp);
|
||||
+ case NTSYNC_IOC_EVENT_RESET:
|
||||
+ return ntsync_event_reset(obj, argp);
|
||||
default:
|
||||
return -ENOIOCTLCMD;
|
||||
}
|
||||
--- a/include/uapi/linux/ntsync.h
|
||||
+++ b/include/uapi/linux/ntsync.h
|
||||
@@ -49,5 +49,6 @@ struct ntsync_wait_args {
|
||||
#define NTSYNC_IOC_MUTEX_UNLOCK _IOWR('N', 0x85, struct ntsync_mutex_args)
|
||||
#define NTSYNC_IOC_MUTEX_KILL _IOW ('N', 0x86, __u32)
|
||||
#define NTSYNC_IOC_EVENT_SET _IOR ('N', 0x88, __u32)
|
||||
+#define NTSYNC_IOC_EVENT_RESET _IOR ('N', 0x89, __u32)
|
||||
|
||||
#endif
|
@ -1,60 +0,0 @@
|
||||
From 50c791dde217f9fdc1785de77fa2ae888d6bdb4e Mon Sep 17 00:00:00 2001
|
||||
From: Elizabeth Figura <zfigura@codeweavers.com>
|
||||
Date: Fri, 13 Dec 2024 13:34:52 -0600
|
||||
Subject: ntsync: Introduce NTSYNC_IOC_EVENT_PULSE.
|
||||
|
||||
This corresponds to the NT syscall NtPulseEvent().
|
||||
|
||||
This wakes up any waiters as if the event had been set, but does not set the
|
||||
event, instead resetting it if it had been signalled. Thus, for a manual-reset
|
||||
event, all waiters are woken, whereas for an auto-reset event, at most one
|
||||
waiter is woken.
|
||||
|
||||
Signed-off-by: Elizabeth Figura <zfigura@codeweavers.com>
|
||||
---
|
||||
drivers/misc/ntsync.c | 8 ++++++--
|
||||
include/uapi/linux/ntsync.h | 1 +
|
||||
2 files changed, 7 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/misc/ntsync.c
|
||||
+++ b/drivers/misc/ntsync.c
|
||||
@@ -534,7 +534,7 @@ static int ntsync_mutex_kill(struct ntsy
|
||||
return ret;
|
||||
}
|
||||
|
||||
-static int ntsync_event_set(struct ntsync_obj *event, void __user *argp)
|
||||
+static int ntsync_event_set(struct ntsync_obj *event, void __user *argp, bool pulse)
|
||||
{
|
||||
struct ntsync_device *dev = event->dev;
|
||||
__u32 prev_state;
|
||||
@@ -550,6 +550,8 @@ static int ntsync_event_set(struct ntsyn
|
||||
if (all)
|
||||
try_wake_all_obj(dev, event);
|
||||
try_wake_any_event(event);
|
||||
+ if (pulse)
|
||||
+ event->u.event.signaled = false;
|
||||
|
||||
ntsync_unlock_obj(dev, event, all);
|
||||
|
||||
@@ -605,9 +607,11 @@ static long ntsync_obj_ioctl(struct file
|
||||
case NTSYNC_IOC_MUTEX_KILL:
|
||||
return ntsync_mutex_kill(obj, argp);
|
||||
case NTSYNC_IOC_EVENT_SET:
|
||||
- return ntsync_event_set(obj, argp);
|
||||
+ return ntsync_event_set(obj, argp, false);
|
||||
case NTSYNC_IOC_EVENT_RESET:
|
||||
return ntsync_event_reset(obj, argp);
|
||||
+ case NTSYNC_IOC_EVENT_PULSE:
|
||||
+ return ntsync_event_set(obj, argp, true);
|
||||
default:
|
||||
return -ENOIOCTLCMD;
|
||||
}
|
||||
--- a/include/uapi/linux/ntsync.h
|
||||
+++ b/include/uapi/linux/ntsync.h
|
||||
@@ -50,5 +50,6 @@ struct ntsync_wait_args {
|
||||
#define NTSYNC_IOC_MUTEX_KILL _IOW ('N', 0x86, __u32)
|
||||
#define NTSYNC_IOC_EVENT_SET _IOR ('N', 0x88, __u32)
|
||||
#define NTSYNC_IOC_EVENT_RESET _IOR ('N', 0x89, __u32)
|
||||
+#define NTSYNC_IOC_EVENT_PULSE _IOR ('N', 0x8a, __u32)
|
||||
|
||||
#endif
|
@ -1,64 +0,0 @@
|
||||
From 248013d9877d47dc5219344268c10b62de1f52f2 Mon Sep 17 00:00:00 2001
|
||||
From: Elizabeth Figura <zfigura@codeweavers.com>
|
||||
Date: Fri, 13 Dec 2024 13:34:53 -0600
|
||||
Subject: ntsync: Introduce NTSYNC_IOC_SEM_READ.
|
||||
|
||||
This corresponds to the NT syscall NtQuerySemaphore().
|
||||
|
||||
This returns the current count and maximum count of the semaphore.
|
||||
|
||||
Signed-off-by: Elizabeth Figura <zfigura@codeweavers.com>
|
||||
---
|
||||
drivers/misc/ntsync.c | 24 ++++++++++++++++++++++++
|
||||
include/uapi/linux/ntsync.h | 1 +
|
||||
2 files changed, 25 insertions(+)
|
||||
|
||||
--- a/drivers/misc/ntsync.c
|
||||
+++ b/drivers/misc/ntsync.c
|
||||
@@ -583,6 +583,28 @@ static int ntsync_event_reset(struct nts
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static int ntsync_sem_read(struct ntsync_obj *sem, void __user *argp)
|
||||
+{
|
||||
+ struct ntsync_sem_args __user *user_args = argp;
|
||||
+ struct ntsync_device *dev = sem->dev;
|
||||
+ struct ntsync_sem_args args;
|
||||
+ bool all;
|
||||
+
|
||||
+ if (sem->type != NTSYNC_TYPE_SEM)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ all = ntsync_lock_obj(dev, sem);
|
||||
+
|
||||
+ args.count = sem->u.sem.count;
|
||||
+ args.max = sem->u.sem.max;
|
||||
+
|
||||
+ ntsync_unlock_obj(dev, sem, all);
|
||||
+
|
||||
+ if (copy_to_user(user_args, &args, sizeof(args)))
|
||||
+ return -EFAULT;
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static int ntsync_obj_release(struct inode *inode, struct file *file)
|
||||
{
|
||||
struct ntsync_obj *obj = file->private_data;
|
||||
@@ -602,6 +624,8 @@ static long ntsync_obj_ioctl(struct file
|
||||
switch (cmd) {
|
||||
case NTSYNC_IOC_SEM_RELEASE:
|
||||
return ntsync_sem_release(obj, argp);
|
||||
+ case NTSYNC_IOC_SEM_READ:
|
||||
+ return ntsync_sem_read(obj, argp);
|
||||
case NTSYNC_IOC_MUTEX_UNLOCK:
|
||||
return ntsync_mutex_unlock(obj, argp);
|
||||
case NTSYNC_IOC_MUTEX_KILL:
|
||||
--- a/include/uapi/linux/ntsync.h
|
||||
+++ b/include/uapi/linux/ntsync.h
|
||||
@@ -51,5 +51,6 @@ struct ntsync_wait_args {
|
||||
#define NTSYNC_IOC_EVENT_SET _IOR ('N', 0x88, __u32)
|
||||
#define NTSYNC_IOC_EVENT_RESET _IOR ('N', 0x89, __u32)
|
||||
#define NTSYNC_IOC_EVENT_PULSE _IOR ('N', 0x8a, __u32)
|
||||
+#define NTSYNC_IOC_SEM_READ _IOR ('N', 0x8b, struct ntsync_sem_args)
|
||||
|
||||
#endif
|
@ -1,66 +0,0 @@
|
||||
From 8fc7a993fd8bc6b1a09b4b965bee7d16bb2156cc Mon Sep 17 00:00:00 2001
|
||||
From: Elizabeth Figura <zfigura@codeweavers.com>
|
||||
Date: Fri, 13 Dec 2024 13:34:54 -0600
|
||||
Subject: ntsync: Introduce NTSYNC_IOC_MUTEX_READ.
|
||||
|
||||
This corresponds to the NT syscall NtQueryMutant().
|
||||
|
||||
This returns the recursion count, owner, and abandoned state of the mutex.
|
||||
|
||||
Signed-off-by: Elizabeth Figura <zfigura@codeweavers.com>
|
||||
---
|
||||
drivers/misc/ntsync.c | 26 ++++++++++++++++++++++++++
|
||||
include/uapi/linux/ntsync.h | 1 +
|
||||
2 files changed, 27 insertions(+)
|
||||
|
||||
--- a/drivers/misc/ntsync.c
|
||||
+++ b/drivers/misc/ntsync.c
|
||||
@@ -605,6 +605,30 @@ static int ntsync_sem_read(struct ntsync
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static int ntsync_mutex_read(struct ntsync_obj *mutex, void __user *argp)
|
||||
+{
|
||||
+ struct ntsync_mutex_args __user *user_args = argp;
|
||||
+ struct ntsync_device *dev = mutex->dev;
|
||||
+ struct ntsync_mutex_args args;
|
||||
+ bool all;
|
||||
+ int ret;
|
||||
+
|
||||
+ if (mutex->type != NTSYNC_TYPE_MUTEX)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ all = ntsync_lock_obj(dev, mutex);
|
||||
+
|
||||
+ args.count = mutex->u.mutex.count;
|
||||
+ args.owner = mutex->u.mutex.owner;
|
||||
+ ret = mutex->u.mutex.ownerdead ? -EOWNERDEAD : 0;
|
||||
+
|
||||
+ ntsync_unlock_obj(dev, mutex, all);
|
||||
+
|
||||
+ if (copy_to_user(user_args, &args, sizeof(args)))
|
||||
+ return -EFAULT;
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
static int ntsync_obj_release(struct inode *inode, struct file *file)
|
||||
{
|
||||
struct ntsync_obj *obj = file->private_data;
|
||||
@@ -630,6 +654,8 @@ static long ntsync_obj_ioctl(struct file
|
||||
return ntsync_mutex_unlock(obj, argp);
|
||||
case NTSYNC_IOC_MUTEX_KILL:
|
||||
return ntsync_mutex_kill(obj, argp);
|
||||
+ case NTSYNC_IOC_MUTEX_READ:
|
||||
+ return ntsync_mutex_read(obj, argp);
|
||||
case NTSYNC_IOC_EVENT_SET:
|
||||
return ntsync_event_set(obj, argp, false);
|
||||
case NTSYNC_IOC_EVENT_RESET:
|
||||
--- a/include/uapi/linux/ntsync.h
|
||||
+++ b/include/uapi/linux/ntsync.h
|
||||
@@ -52,5 +52,6 @@ struct ntsync_wait_args {
|
||||
#define NTSYNC_IOC_EVENT_RESET _IOR ('N', 0x89, __u32)
|
||||
#define NTSYNC_IOC_EVENT_PULSE _IOR ('N', 0x8a, __u32)
|
||||
#define NTSYNC_IOC_SEM_READ _IOR ('N', 0x8b, struct ntsync_sem_args)
|
||||
+#define NTSYNC_IOC_MUTEX_READ _IOR ('N', 0x8c, struct ntsync_mutex_args)
|
||||
|
||||
#endif
|
@ -1,64 +0,0 @@
|
||||
From aed34cc9c28dba5e3735d7c59e1970a32eefc5f4 Mon Sep 17 00:00:00 2001
|
||||
From: Elizabeth Figura <zfigura@codeweavers.com>
|
||||
Date: Fri, 13 Dec 2024 13:34:55 -0600
|
||||
Subject: ntsync: Introduce NTSYNC_IOC_EVENT_READ.
|
||||
|
||||
This corresponds to the NT syscall NtQueryEvent().
|
||||
|
||||
This returns the signaled state of the event and whether it is manual-reset.
|
||||
|
||||
Signed-off-by: Elizabeth Figura <zfigura@codeweavers.com>
|
||||
---
|
||||
drivers/misc/ntsync.c | 24 ++++++++++++++++++++++++
|
||||
include/uapi/linux/ntsync.h | 1 +
|
||||
2 files changed, 25 insertions(+)
|
||||
|
||||
--- a/drivers/misc/ntsync.c
|
||||
+++ b/drivers/misc/ntsync.c
|
||||
@@ -629,6 +629,28 @@ static int ntsync_mutex_read(struct ntsy
|
||||
return ret;
|
||||
}
|
||||
|
||||
+static int ntsync_event_read(struct ntsync_obj *event, void __user *argp)
|
||||
+{
|
||||
+ struct ntsync_event_args __user *user_args = argp;
|
||||
+ struct ntsync_device *dev = event->dev;
|
||||
+ struct ntsync_event_args args;
|
||||
+ bool all;
|
||||
+
|
||||
+ if (event->type != NTSYNC_TYPE_EVENT)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ all = ntsync_lock_obj(dev, event);
|
||||
+
|
||||
+ args.manual = event->u.event.manual;
|
||||
+ args.signaled = event->u.event.signaled;
|
||||
+
|
||||
+ ntsync_unlock_obj(dev, event, all);
|
||||
+
|
||||
+ if (copy_to_user(user_args, &args, sizeof(args)))
|
||||
+ return -EFAULT;
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static int ntsync_obj_release(struct inode *inode, struct file *file)
|
||||
{
|
||||
struct ntsync_obj *obj = file->private_data;
|
||||
@@ -662,6 +684,8 @@ static long ntsync_obj_ioctl(struct file
|
||||
return ntsync_event_reset(obj, argp);
|
||||
case NTSYNC_IOC_EVENT_PULSE:
|
||||
return ntsync_event_set(obj, argp, true);
|
||||
+ case NTSYNC_IOC_EVENT_READ:
|
||||
+ return ntsync_event_read(obj, argp);
|
||||
default:
|
||||
return -ENOIOCTLCMD;
|
||||
}
|
||||
--- a/include/uapi/linux/ntsync.h
|
||||
+++ b/include/uapi/linux/ntsync.h
|
||||
@@ -53,5 +53,6 @@ struct ntsync_wait_args {
|
||||
#define NTSYNC_IOC_EVENT_PULSE _IOR ('N', 0x8a, __u32)
|
||||
#define NTSYNC_IOC_SEM_READ _IOR ('N', 0x8b, struct ntsync_sem_args)
|
||||
#define NTSYNC_IOC_MUTEX_READ _IOR ('N', 0x8c, struct ntsync_mutex_args)
|
||||
+#define NTSYNC_IOC_EVENT_READ _IOR ('N', 0x8d, struct ntsync_event_args)
|
||||
|
||||
#endif
|
@ -1,187 +0,0 @@
|
||||
From 361a7fb848ba9cac87855cb68f9ab000ed1027be Mon Sep 17 00:00:00 2001
|
||||
From: Elizabeth Figura <zfigura@codeweavers.com>
|
||||
Date: Fri, 13 Dec 2024 13:34:56 -0600
|
||||
Subject: ntsync: Introduce alertable waits.
|
||||
|
||||
NT waits can optionally be made "alertable". This is a special channel for
|
||||
thread wakeup that is mildly similar to SIGIO. A thread has an internal single
|
||||
bit of "alerted" state, and if a thread is alerted while an alertable wait, the
|
||||
wait will return a special value, consume the "alerted" state, and will not
|
||||
consume any of its objects.
|
||||
|
||||
Alerts are implemented using events; the user-space NT emulator is expected to
|
||||
create an internal ntsync event for each thread and pass that event to wait
|
||||
functions.
|
||||
|
||||
Signed-off-by: Elizabeth Figura <zfigura@codeweavers.com>
|
||||
---
|
||||
drivers/misc/ntsync.c | 70 ++++++++++++++++++++++++++++++++-----
|
||||
include/uapi/linux/ntsync.h | 3 +-
|
||||
2 files changed, 63 insertions(+), 10 deletions(-)
|
||||
|
||||
--- a/drivers/misc/ntsync.c
|
||||
+++ b/drivers/misc/ntsync.c
|
||||
@@ -869,22 +869,29 @@ static int setup_wait(struct ntsync_devi
|
||||
const struct ntsync_wait_args *args, bool all,
|
||||
struct ntsync_q **ret_q)
|
||||
{
|
||||
+ int fds[NTSYNC_MAX_WAIT_COUNT + 1];
|
||||
const __u32 count = args->count;
|
||||
- int fds[NTSYNC_MAX_WAIT_COUNT];
|
||||
struct ntsync_q *q;
|
||||
+ __u32 total_count;
|
||||
__u32 i, j;
|
||||
|
||||
- if (args->pad[0] || args->pad[1] || (args->flags & ~NTSYNC_WAIT_REALTIME))
|
||||
+ if (args->pad || (args->flags & ~NTSYNC_WAIT_REALTIME))
|
||||
return -EINVAL;
|
||||
|
||||
if (args->count > NTSYNC_MAX_WAIT_COUNT)
|
||||
return -EINVAL;
|
||||
|
||||
+ total_count = count;
|
||||
+ if (args->alert)
|
||||
+ total_count++;
|
||||
+
|
||||
if (copy_from_user(fds, u64_to_user_ptr(args->objs),
|
||||
array_size(count, sizeof(*fds))))
|
||||
return -EFAULT;
|
||||
+ if (args->alert)
|
||||
+ fds[count] = args->alert;
|
||||
|
||||
- q = kmalloc(struct_size(q, entries, count), GFP_KERNEL);
|
||||
+ q = kmalloc(struct_size(q, entries, total_count), GFP_KERNEL);
|
||||
if (!q)
|
||||
return -ENOMEM;
|
||||
q->task = current;
|
||||
@@ -894,7 +901,7 @@ static int setup_wait(struct ntsync_devi
|
||||
q->ownerdead = false;
|
||||
q->count = count;
|
||||
|
||||
- for (i = 0; i < count; i++) {
|
||||
+ for (i = 0; i < total_count; i++) {
|
||||
struct ntsync_q_entry *entry = &q->entries[i];
|
||||
struct ntsync_obj *obj = get_obj(dev, fds[i]);
|
||||
|
||||
@@ -944,10 +951,10 @@ static void try_wake_any_obj(struct ntsy
|
||||
static int ntsync_wait_any(struct ntsync_device *dev, void __user *argp)
|
||||
{
|
||||
struct ntsync_wait_args args;
|
||||
+ __u32 i, total_count;
|
||||
struct ntsync_q *q;
|
||||
int signaled;
|
||||
bool all;
|
||||
- __u32 i;
|
||||
int ret;
|
||||
|
||||
if (copy_from_user(&args, argp, sizeof(args)))
|
||||
@@ -957,9 +964,13 @@ static int ntsync_wait_any(struct ntsync
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
+ total_count = args.count;
|
||||
+ if (args.alert)
|
||||
+ total_count++;
|
||||
+
|
||||
/* queue ourselves */
|
||||
|
||||
- for (i = 0; i < args.count; i++) {
|
||||
+ for (i = 0; i < total_count; i++) {
|
||||
struct ntsync_q_entry *entry = &q->entries[i];
|
||||
struct ntsync_obj *obj = entry->obj;
|
||||
|
||||
@@ -968,9 +979,15 @@ static int ntsync_wait_any(struct ntsync
|
||||
ntsync_unlock_obj(dev, obj, all);
|
||||
}
|
||||
|
||||
- /* check if we are already signaled */
|
||||
+ /*
|
||||
+ * Check if we are already signaled.
|
||||
+ *
|
||||
+ * Note that the API requires that normal objects are checked before
|
||||
+ * the alert event. Hence we queue the alert event last, and check
|
||||
+ * objects in order.
|
||||
+ */
|
||||
|
||||
- for (i = 0; i < args.count; i++) {
|
||||
+ for (i = 0; i < total_count; i++) {
|
||||
struct ntsync_obj *obj = q->entries[i].obj;
|
||||
|
||||
if (atomic_read(&q->signaled) != -1)
|
||||
@@ -987,7 +1004,7 @@ static int ntsync_wait_any(struct ntsync
|
||||
|
||||
/* and finally, unqueue */
|
||||
|
||||
- for (i = 0; i < args.count; i++) {
|
||||
+ for (i = 0; i < total_count; i++) {
|
||||
struct ntsync_q_entry *entry = &q->entries[i];
|
||||
struct ntsync_obj *obj = entry->obj;
|
||||
|
||||
@@ -1047,6 +1064,14 @@ static int ntsync_wait_all(struct ntsync
|
||||
*/
|
||||
list_add_tail(&entry->node, &obj->all_waiters);
|
||||
}
|
||||
+ if (args.alert) {
|
||||
+ struct ntsync_q_entry *entry = &q->entries[args.count];
|
||||
+ struct ntsync_obj *obj = entry->obj;
|
||||
+
|
||||
+ dev_lock_obj(dev, obj);
|
||||
+ list_add_tail(&entry->node, &obj->any_waiters);
|
||||
+ dev_unlock_obj(dev, obj);
|
||||
+ }
|
||||
|
||||
/* check if we are already signaled */
|
||||
|
||||
@@ -1054,6 +1079,21 @@ static int ntsync_wait_all(struct ntsync
|
||||
|
||||
mutex_unlock(&dev->wait_all_lock);
|
||||
|
||||
+ /*
|
||||
+ * Check if the alert event is signaled, making sure to do so only
|
||||
+ * after checking if the other objects are signaled.
|
||||
+ */
|
||||
+
|
||||
+ if (args.alert) {
|
||||
+ struct ntsync_obj *obj = q->entries[args.count].obj;
|
||||
+
|
||||
+ if (atomic_read(&q->signaled) == -1) {
|
||||
+ bool all = ntsync_lock_obj(dev, obj);
|
||||
+ try_wake_any_obj(obj);
|
||||
+ ntsync_unlock_obj(dev, obj, all);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
/* sleep */
|
||||
|
||||
ret = ntsync_schedule(q, &args);
|
||||
@@ -1079,6 +1119,18 @@ static int ntsync_wait_all(struct ntsync
|
||||
|
||||
mutex_unlock(&dev->wait_all_lock);
|
||||
|
||||
+ if (args.alert) {
|
||||
+ struct ntsync_q_entry *entry = &q->entries[args.count];
|
||||
+ struct ntsync_obj *obj = entry->obj;
|
||||
+ bool all;
|
||||
+
|
||||
+ all = ntsync_lock_obj(dev, obj);
|
||||
+ list_del(&entry->node);
|
||||
+ ntsync_unlock_obj(dev, obj, all);
|
||||
+
|
||||
+ put_obj(obj);
|
||||
+ }
|
||||
+
|
||||
signaled = atomic_read(&q->signaled);
|
||||
if (signaled != -1) {
|
||||
struct ntsync_wait_args __user *user_args = argp;
|
||||
--- a/include/uapi/linux/ntsync.h
|
||||
+++ b/include/uapi/linux/ntsync.h
|
||||
@@ -34,7 +34,8 @@ struct ntsync_wait_args {
|
||||
__u32 index;
|
||||
__u32 flags;
|
||||
__u32 owner;
|
||||
- __u32 pad[2];
|
||||
+ __u32 alert;
|
||||
+ __u32 pad;
|
||||
};
|
||||
|
||||
#define NTSYNC_MAX_WAIT_COUNT 64
|
@ -1,30 +0,0 @@
|
||||
From b240b27e5348d38acbc4a12f1dc762dd1845f391 Mon Sep 17 00:00:00 2001
|
||||
From: Elizabeth Figura <zfigura@codeweavers.com>
|
||||
Date: Fri, 13 Dec 2024 13:35:09 -0600
|
||||
Subject: maintainers: Add an entry for ntsync.
|
||||
|
||||
Add myself as maintainer, supported by CodeWeavers.
|
||||
|
||||
Signed-off-by: Elizabeth Figura <zfigura@codeweavers.com>
|
||||
---
|
||||
MAINTAINERS | 9 +++++++++
|
||||
1 file changed, 9 insertions(+)
|
||||
|
||||
--- a/MAINTAINERS
|
||||
+++ b/MAINTAINERS
|
||||
@@ -16486,6 +16486,15 @@ T: git https://github.com/Paragon-Softwa
|
||||
F: Documentation/filesystems/ntfs3.rst
|
||||
F: fs/ntfs3/
|
||||
|
||||
+NTSYNC SYNCHRONIZATION PRIMITIVE DRIVER
|
||||
+M: Elizabeth Figura <zfigura@codeweavers.com>
|
||||
+L: wine-devel@winehq.org
|
||||
+S: Supported
|
||||
+F: Documentation/userspace-api/ntsync.rst
|
||||
+F: drivers/misc/ntsync.c
|
||||
+F: include/uapi/linux/ntsync.h
|
||||
+F: tools/testing/selftests/drivers/ntsync/
|
||||
+
|
||||
NUBUS SUBSYSTEM
|
||||
M: Finn Thain <fthain@linux-m68k.org>
|
||||
L: linux-m68k@lists.linux-m68k.org
|
413
debian/patches/misc-ntsync7/0017-docs-ntsync-Add-documentation-for-the-ntsync-uAPI.patch
vendored
413
debian/patches/misc-ntsync7/0017-docs-ntsync-Add-documentation-for-the-ntsync-uAPI.patch
vendored
@ -1,413 +0,0 @@
|
||||
From 733e310bb840117593a0eb4726fa63b34fea9cc3 Mon Sep 17 00:00:00 2001
|
||||
From: Elizabeth Figura <zfigura@codeweavers.com>
|
||||
Date: Fri, 13 Dec 2024 13:35:10 -0600
|
||||
Subject: docs: ntsync: Add documentation for the ntsync uAPI.
|
||||
|
||||
Add an overall explanation of the driver architecture, and complete and precise
|
||||
specification for its intended behaviour.
|
||||
|
||||
Signed-off-by: Elizabeth Figura <zfigura@codeweavers.com>
|
||||
---
|
||||
Documentation/userspace-api/index.rst | 1 +
|
||||
Documentation/userspace-api/ntsync.rst | 385 +++++++++++++++++++++++++
|
||||
2 files changed, 386 insertions(+)
|
||||
create mode 100644 Documentation/userspace-api/ntsync.rst
|
||||
|
||||
--- a/Documentation/userspace-api/index.rst
|
||||
+++ b/Documentation/userspace-api/index.rst
|
||||
@@ -63,6 +63,7 @@ Everything else
|
||||
vduse
|
||||
futex2
|
||||
perf_ring_buffer
|
||||
+ ntsync
|
||||
|
||||
.. only:: subproject and html
|
||||
|
||||
--- /dev/null
|
||||
+++ b/Documentation/userspace-api/ntsync.rst
|
||||
@@ -0,0 +1,385 @@
|
||||
+===================================
|
||||
+NT synchronization primitive driver
|
||||
+===================================
|
||||
+
|
||||
+This page documents the user-space API for the ntsync driver.
|
||||
+
|
||||
+ntsync is a support driver for emulation of NT synchronization
|
||||
+primitives by user-space NT emulators. It exists because implementation
|
||||
+in user-space, using existing tools, cannot match Windows performance
|
||||
+while offering accurate semantics. It is implemented entirely in
|
||||
+software, and does not drive any hardware device.
|
||||
+
|
||||
+This interface is meant as a compatibility tool only, and should not
|
||||
+be used for general synchronization. Instead use generic, versatile
|
||||
+interfaces such as futex(2) and poll(2).
|
||||
+
|
||||
+Synchronization primitives
|
||||
+==========================
|
||||
+
|
||||
+The ntsync driver exposes three types of synchronization primitives:
|
||||
+semaphores, mutexes, and events.
|
||||
+
|
||||
+A semaphore holds a single volatile 32-bit counter, and a static 32-bit
|
||||
+integer denoting the maximum value. It is considered signaled (that is,
|
||||
+can be acquired without contention, or will wake up a waiting thread)
|
||||
+when the counter is nonzero. The counter is decremented by one when a
|
||||
+wait is satisfied. Both the initial and maximum count are established
|
||||
+when the semaphore is created.
|
||||
+
|
||||
+A mutex holds a volatile 32-bit recursion count, and a volatile 32-bit
|
||||
+identifier denoting its owner. A mutex is considered signaled when its
|
||||
+owner is zero (indicating that it is not owned). The recursion count is
|
||||
+incremented when a wait is satisfied, and ownership is set to the given
|
||||
+identifier.
|
||||
+
|
||||
+A mutex also holds an internal flag denoting whether its previous owner
|
||||
+has died; such a mutex is said to be abandoned. Owner death is not
|
||||
+tracked automatically based on thread death, but rather must be
|
||||
+communicated using ``NTSYNC_IOC_MUTEX_KILL``. An abandoned mutex is
|
||||
+inherently considered unowned.
|
||||
+
|
||||
+Except for the "unowned" semantics of zero, the actual value of the
|
||||
+owner identifier is not interpreted by the ntsync driver at all. The
|
||||
+intended use is to store a thread identifier; however, the ntsync
|
||||
+driver does not actually validate that a calling thread provides
|
||||
+consistent or unique identifiers.
|
||||
+
|
||||
+An event is similar to a semaphore with a maximum count of one. It holds
|
||||
+a volatile boolean state denoting whether it is signaled or not. There
|
||||
+are two types of events, auto-reset and manual-reset. An auto-reset
|
||||
+event is designaled when a wait is satisfied; a manual-reset event is
|
||||
+not. The event type is specified when the event is created.
|
||||
+
|
||||
+Unless specified otherwise, all operations on an object are atomic and
|
||||
+totally ordered with respect to other operations on the same object.
|
||||
+
|
||||
+Objects are represented by files. When all file descriptors to an
|
||||
+object are closed, that object is deleted.
|
||||
+
|
||||
+Char device
|
||||
+===========
|
||||
+
|
||||
+The ntsync driver creates a single char device /dev/ntsync. Each file
|
||||
+description opened on the device represents a unique instance intended
|
||||
+to back an individual NT virtual machine. Objects created by one ntsync
|
||||
+instance may only be used with other objects created by the same
|
||||
+instance.
|
||||
+
|
||||
+ioctl reference
|
||||
+===============
|
||||
+
|
||||
+All operations on the device are done through ioctls. There are four
|
||||
+structures used in ioctl calls::
|
||||
+
|
||||
+ struct ntsync_sem_args {
|
||||
+ __u32 count;
|
||||
+ __u32 max;
|
||||
+ };
|
||||
+
|
||||
+ struct ntsync_mutex_args {
|
||||
+ __u32 owner;
|
||||
+ __u32 count;
|
||||
+ };
|
||||
+
|
||||
+ struct ntsync_event_args {
|
||||
+ __u32 signaled;
|
||||
+ __u32 manual;
|
||||
+ };
|
||||
+
|
||||
+ struct ntsync_wait_args {
|
||||
+ __u64 timeout;
|
||||
+ __u64 objs;
|
||||
+ __u32 count;
|
||||
+ __u32 owner;
|
||||
+ __u32 index;
|
||||
+ __u32 alert;
|
||||
+ __u32 flags;
|
||||
+ __u32 pad;
|
||||
+ };
|
||||
+
|
||||
+Depending on the ioctl, members of the structure may be used as input,
|
||||
+output, or not at all.
|
||||
+
|
||||
+The ioctls on the device file are as follows:
|
||||
+
|
||||
+.. c:macro:: NTSYNC_IOC_CREATE_SEM
|
||||
+
|
||||
+ Create a semaphore object. Takes a pointer to struct
|
||||
+ :c:type:`ntsync_sem_args`, which is used as follows:
|
||||
+
|
||||
+ .. list-table::
|
||||
+
|
||||
+ * - ``count``
|
||||
+ - Initial count of the semaphore.
|
||||
+ * - ``max``
|
||||
+ - Maximum count of the semaphore.
|
||||
+
|
||||
+ Fails with ``EINVAL`` if ``count`` is greater than ``max``.
|
||||
+ On success, returns a file descriptor the created semaphore.
|
||||
+
|
||||
+.. c:macro:: NTSYNC_IOC_CREATE_MUTEX
|
||||
+
|
||||
+ Create a mutex object. Takes a pointer to struct
|
||||
+ :c:type:`ntsync_mutex_args`, which is used as follows:
|
||||
+
|
||||
+ .. list-table::
|
||||
+
|
||||
+ * - ``count``
|
||||
+ - Initial recursion count of the mutex.
|
||||
+ * - ``owner``
|
||||
+ - Initial owner of the mutex.
|
||||
+
|
||||
+ If ``owner`` is nonzero and ``count`` is zero, or if ``owner`` is
|
||||
+ zero and ``count`` is nonzero, the function fails with ``EINVAL``.
|
||||
+ On success, returns a file descriptor the created mutex.
|
||||
+
|
||||
+.. c:macro:: NTSYNC_IOC_CREATE_EVENT
|
||||
+
|
||||
+ Create an event object. Takes a pointer to struct
|
||||
+ :c:type:`ntsync_event_args`, which is used as follows:
|
||||
+
|
||||
+ .. list-table::
|
||||
+
|
||||
+ * - ``signaled``
|
||||
+ - If nonzero, the event is initially signaled, otherwise
|
||||
+ nonsignaled.
|
||||
+ * - ``manual``
|
||||
+ - If nonzero, the event is a manual-reset event, otherwise
|
||||
+ auto-reset.
|
||||
+
|
||||
+ On success, returns a file descriptor the created event.
|
||||
+
|
||||
+The ioctls on the individual objects are as follows:
|
||||
+
|
||||
+.. c:macro:: NTSYNC_IOC_SEM_POST
|
||||
+
|
||||
+ Post to a semaphore object. Takes a pointer to a 32-bit integer,
|
||||
+ which on input holds the count to be added to the semaphore, and on
|
||||
+ output contains its previous count.
|
||||
+
|
||||
+ If adding to the semaphore's current count would raise the latter
|
||||
+ past the semaphore's maximum count, the ioctl fails with
|
||||
+ ``EOVERFLOW`` and the semaphore is not affected. If raising the
|
||||
+ semaphore's count causes it to become signaled, eligible threads
|
||||
+ waiting on this semaphore will be woken and the semaphore's count
|
||||
+ decremented appropriately.
|
||||
+
|
||||
+.. c:macro:: NTSYNC_IOC_MUTEX_UNLOCK
|
||||
+
|
||||
+ Release a mutex object. Takes a pointer to struct
|
||||
+ :c:type:`ntsync_mutex_args`, which is used as follows:
|
||||
+
|
||||
+ .. list-table::
|
||||
+
|
||||
+ * - ``owner``
|
||||
+ - Specifies the owner trying to release this mutex.
|
||||
+ * - ``count``
|
||||
+ - On output, contains the previous recursion count.
|
||||
+
|
||||
+ If ``owner`` is zero, the ioctl fails with ``EINVAL``. If ``owner``
|
||||
+ is not the current owner of the mutex, the ioctl fails with
|
||||
+ ``EPERM``.
|
||||
+
|
||||
+ The mutex's count will be decremented by one. If decrementing the
|
||||
+ mutex's count causes it to become zero, the mutex is marked as
|
||||
+ unowned and signaled, and eligible threads waiting on it will be
|
||||
+ woken as appropriate.
|
||||
+
|
||||
+.. c:macro:: NTSYNC_IOC_SET_EVENT
|
||||
+
|
||||
+ Signal an event object. Takes a pointer to a 32-bit integer, which on
|
||||
+ output contains the previous state of the event.
|
||||
+
|
||||
+ Eligible threads will be woken, and auto-reset events will be
|
||||
+ designaled appropriately.
|
||||
+
|
||||
+.. c:macro:: NTSYNC_IOC_RESET_EVENT
|
||||
+
|
||||
+ Designal an event object. Takes a pointer to a 32-bit integer, which
|
||||
+ on output contains the previous state of the event.
|
||||
+
|
||||
+.. c:macro:: NTSYNC_IOC_PULSE_EVENT
|
||||
+
|
||||
+ Wake threads waiting on an event object while leaving it in an
|
||||
+ unsignaled state. Takes a pointer to a 32-bit integer, which on
|
||||
+ output contains the previous state of the event.
|
||||
+
|
||||
+ A pulse operation can be thought of as a set followed by a reset,
|
||||
+ performed as a single atomic operation. If two threads are waiting on
|
||||
+ an auto-reset event which is pulsed, only one will be woken. If two
|
||||
+ threads are waiting a manual-reset event which is pulsed, both will
|
||||
+ be woken. However, in both cases, the event will be unsignaled
|
||||
+ afterwards, and a simultaneous read operation will always report the
|
||||
+ event as unsignaled.
|
||||
+
|
||||
+.. c:macro:: NTSYNC_IOC_READ_SEM
|
||||
+
|
||||
+ Read the current state of a semaphore object. Takes a pointer to
|
||||
+ struct :c:type:`ntsync_sem_args`, which is used as follows:
|
||||
+
|
||||
+ .. list-table::
|
||||
+
|
||||
+ * - ``count``
|
||||
+ - On output, contains the current count of the semaphore.
|
||||
+ * - ``max``
|
||||
+ - On output, contains the maximum count of the semaphore.
|
||||
+
|
||||
+.. c:macro:: NTSYNC_IOC_READ_MUTEX
|
||||
+
|
||||
+ Read the current state of a mutex object. Takes a pointer to struct
|
||||
+ :c:type:`ntsync_mutex_args`, which is used as follows:
|
||||
+
|
||||
+ .. list-table::
|
||||
+
|
||||
+ * - ``owner``
|
||||
+ - On output, contains the current owner of the mutex, or zero
|
||||
+ if the mutex is not currently owned.
|
||||
+ * - ``count``
|
||||
+ - On output, contains the current recursion count of the mutex.
|
||||
+
|
||||
+ If the mutex is marked as abandoned, the function fails with
|
||||
+ ``EOWNERDEAD``. In this case, ``count`` and ``owner`` are set to
|
||||
+ zero.
|
||||
+
|
||||
+.. c:macro:: NTSYNC_IOC_READ_EVENT
|
||||
+
|
||||
+ Read the current state of an event object. Takes a pointer to struct
|
||||
+ :c:type:`ntsync_event_args`, which is used as follows:
|
||||
+
|
||||
+ .. list-table::
|
||||
+
|
||||
+ * - ``signaled``
|
||||
+ - On output, contains the current state of the event.
|
||||
+ * - ``manual``
|
||||
+ - On output, contains 1 if the event is a manual-reset event,
|
||||
+ and 0 otherwise.
|
||||
+
|
||||
+.. c:macro:: NTSYNC_IOC_KILL_OWNER
|
||||
+
|
||||
+ Mark a mutex as unowned and abandoned if it is owned by the given
|
||||
+ owner. Takes an input-only pointer to a 32-bit integer denoting the
|
||||
+ owner. If the owner is zero, the ioctl fails with ``EINVAL``. If the
|
||||
+ owner does not own the mutex, the function fails with ``EPERM``.
|
||||
+
|
||||
+ Eligible threads waiting on the mutex will be woken as appropriate
|
||||
+ (and such waits will fail with ``EOWNERDEAD``, as described below).
|
||||
+
|
||||
+.. c:macro:: NTSYNC_IOC_WAIT_ANY
|
||||
+
|
||||
+ Poll on any of a list of objects, atomically acquiring at most one.
|
||||
+ Takes a pointer to struct :c:type:`ntsync_wait_args`, which is
|
||||
+ used as follows:
|
||||
+
|
||||
+ .. list-table::
|
||||
+
|
||||
+ * - ``timeout``
|
||||
+ - Absolute timeout in nanoseconds. If ``NTSYNC_WAIT_REALTIME``
|
||||
+ is set, the timeout is measured against the REALTIME clock;
|
||||
+ otherwise it is measured against the MONOTONIC clock. If the
|
||||
+ timeout is equal to or earlier than the current time, the
|
||||
+ function returns immediately without sleeping. If ``timeout``
|
||||
+ is U64_MAX, the function will sleep until an object is
|
||||
+ signaled, and will not fail with ``ETIMEDOUT``.
|
||||
+ * - ``objs``
|
||||
+ - Pointer to an array of ``count`` file descriptors
|
||||
+ (specified as an integer so that the structure has the same
|
||||
+ size regardless of architecture). If any object is
|
||||
+ invalid, the function fails with ``EINVAL``.
|
||||
+ * - ``count``
|
||||
+ - Number of objects specified in the ``objs`` array.
|
||||
+ If greater than ``NTSYNC_MAX_WAIT_COUNT``, the function fails
|
||||
+ with ``EINVAL``.
|
||||
+ * - ``owner``
|
||||
+ - Mutex owner identifier. If any object in ``objs`` is a mutex,
|
||||
+ the ioctl will attempt to acquire that mutex on behalf of
|
||||
+ ``owner``. If ``owner`` is zero, the ioctl fails with
|
||||
+ ``EINVAL``.
|
||||
+ * - ``index``
|
||||
+ - On success, contains the index (into ``objs``) of the object
|
||||
+ which was signaled. If ``alert`` was signaled instead,
|
||||
+ this contains ``count``.
|
||||
+ * - ``alert``
|
||||
+ - Optional event object file descriptor. If nonzero, this
|
||||
+ specifies an "alert" event object which, if signaled, will
|
||||
+ terminate the wait. If nonzero, the identifier must point to a
|
||||
+ valid event.
|
||||
+ * - ``flags``
|
||||
+ - Zero or more flags. Currently the only flag is
|
||||
+ ``NTSYNC_WAIT_REALTIME``, which causes the timeout to be
|
||||
+ measured against the REALTIME clock instead of MONOTONIC.
|
||||
+ * - ``pad``
|
||||
+ - Unused, must be set to zero.
|
||||
+
|
||||
+ This function attempts to acquire one of the given objects. If unable
|
||||
+ to do so, it sleeps until an object becomes signaled, subsequently
|
||||
+ acquiring it, or the timeout expires. In the latter case the ioctl
|
||||
+ fails with ``ETIMEDOUT``. The function only acquires one object, even
|
||||
+ if multiple objects are signaled.
|
||||
+
|
||||
+ A semaphore is considered to be signaled if its count is nonzero, and
|
||||
+ is acquired by decrementing its count by one. A mutex is considered
|
||||
+ to be signaled if it is unowned or if its owner matches the ``owner``
|
||||
+ argument, and is acquired by incrementing its recursion count by one
|
||||
+ and setting its owner to the ``owner`` argument. An auto-reset event
|
||||
+ is acquired by designaling it; a manual-reset event is not affected
|
||||
+ by acquisition.
|
||||
+
|
||||
+ Acquisition is atomic and totally ordered with respect to other
|
||||
+ operations on the same object. If two wait operations (with different
|
||||
+ ``owner`` identifiers) are queued on the same mutex, only one is
|
||||
+ signaled. If two wait operations are queued on the same semaphore,
|
||||
+ and a value of one is posted to it, only one is signaled.
|
||||
+
|
||||
+ If an abandoned mutex is acquired, the ioctl fails with
|
||||
+ ``EOWNERDEAD``. Although this is a failure return, the function may
|
||||
+ otherwise be considered successful. The mutex is marked as owned by
|
||||
+ the given owner (with a recursion count of 1) and as no longer
|
||||
+ abandoned, and ``index`` is still set to the index of the mutex.
|
||||
+
|
||||
+ The ``alert`` argument is an "extra" event which can terminate the
|
||||
+ wait, independently of all other objects.
|
||||
+
|
||||
+ It is valid to pass the same object more than once, including by
|
||||
+ passing the same event in the ``objs`` array and in ``alert``. If a
|
||||
+ wakeup occurs due to that object being signaled, ``index`` is set to
|
||||
+ the lowest index corresponding to that object.
|
||||
+
|
||||
+ The function may fail with ``EINTR`` if a signal is received.
|
||||
+
|
||||
+.. c:macro:: NTSYNC_IOC_WAIT_ALL
|
||||
+
|
||||
+ Poll on a list of objects, atomically acquiring all of them. Takes a
|
||||
+ pointer to struct :c:type:`ntsync_wait_args`, which is used
|
||||
+ identically to ``NTSYNC_IOC_WAIT_ANY``, except that ``index`` is
|
||||
+ always filled with zero on success if not woken via alert.
|
||||
+
|
||||
+ This function attempts to simultaneously acquire all of the given
|
||||
+ objects. If unable to do so, it sleeps until all objects become
|
||||
+ simultaneously signaled, subsequently acquiring them, or the timeout
|
||||
+ expires. In the latter case the ioctl fails with ``ETIMEDOUT`` and no
|
||||
+ objects are modified.
|
||||
+
|
||||
+ Objects may become signaled and subsequently designaled (through
|
||||
+ acquisition by other threads) while this thread is sleeping. Only
|
||||
+ once all objects are simultaneously signaled does the ioctl acquire
|
||||
+ them and return. The entire acquisition is atomic and totally ordered
|
||||
+ with respect to other operations on any of the given objects.
|
||||
+
|
||||
+ If an abandoned mutex is acquired, the ioctl fails with
|
||||
+ ``EOWNERDEAD``. Similarly to ``NTSYNC_IOC_WAIT_ANY``, all objects are
|
||||
+ nevertheless marked as acquired. Note that if multiple mutex objects
|
||||
+ are specified, there is no way to know which were marked as
|
||||
+ abandoned.
|
||||
+
|
||||
+ As with "any" waits, the ``alert`` argument is an "extra" event which
|
||||
+ can terminate the wait. Critically, however, an "all" wait will
|
||||
+ succeed if all members in ``objs`` are signaled, *or* if ``alert`` is
|
||||
+ signaled. In the latter case ``index`` will be set to ``count``. As
|
||||
+ with "any" waits, if both conditions are filled, the former takes
|
||||
+ priority, and objects in ``objs`` will be acquired.
|
||||
+
|
||||
+ Unlike ``NTSYNC_IOC_WAIT_ANY``, it is not valid to pass the same
|
||||
+ object more than once, nor is it valid to pass the same object in
|
||||
+ ``objs`` and in ``alert``. If this is attempted, the function fails
|
||||
+ with ``EINVAL``.
|
@ -1,25 +0,0 @@
|
||||
From 4871bb89577d78a3d55b44e47c3a4f677dbdc89b Mon Sep 17 00:00:00 2001
|
||||
From: Elizabeth Figura <zfigura@codeweavers.com>
|
||||
Date: Fri, 13 Dec 2024 13:35:11 -0600
|
||||
Subject: ntsync: No longer depend on BROKEN.
|
||||
|
||||
f5b335dc025cfee90957efa90dc72fada0d5abb4 ("misc: ntsync: mark driver as "broken"
|
||||
to prevent from building") was committed to avoid the driver being used while
|
||||
only part of its functionality was released. Since the rest of the functionality
|
||||
has now been committed, revert this.
|
||||
|
||||
Signed-off-by: Elizabeth Figura <zfigura@codeweavers.com>
|
||||
---
|
||||
drivers/misc/Kconfig | 1 -
|
||||
1 file changed, 1 deletion(-)
|
||||
|
||||
--- a/drivers/misc/Kconfig
|
||||
+++ b/drivers/misc/Kconfig
|
||||
@@ -517,7 +517,6 @@ config OPEN_DICE
|
||||
|
||||
config NTSYNC
|
||||
tristate "NT synchronization primitive emulation"
|
||||
- depends on BROKEN
|
||||
help
|
||||
This module provides kernel support for emulation of Windows NT
|
||||
synchronization primitives. It is not a hardware driver.
|
@ -1,22 +0,0 @@
|
||||
From 2aa0cab3a568e6adccbe708ee2e79185638860ed Mon Sep 17 00:00:00 2001
|
||||
From: Mike Lothian <mike@fireburn.co.uk>
|
||||
Date: Fri, 14 Feb 2025 12:28:00 +0000
|
||||
Subject: ntsync: Set the permissions to be 0666
|
||||
|
||||
This allows ntsync to be usuable by non-root processes out of the box
|
||||
|
||||
Signed-off-by: Mike Lothian <mike@fireburn.co.uk>
|
||||
---
|
||||
drivers/misc/ntsync.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
--- a/drivers/misc/ntsync.c
|
||||
+++ b/drivers/misc/ntsync.c
|
||||
@@ -1206,6 +1206,7 @@ static struct miscdevice ntsync_misc = {
|
||||
.minor = MISC_DYNAMIC_MINOR,
|
||||
.name = NTSYNC_NAME,
|
||||
.fops = &ntsync_fops,
|
||||
+ .mode = 0666, // Setting file permissions to 0666
|
||||
};
|
||||
|
||||
module_misc_device(ntsync_misc);
|
14
debian/patches/misc-openwrt/0001-mac80211-ignore-AP-power-level-when-tx-power-type-is.patch
vendored
14
debian/patches/misc-openwrt/0001-mac80211-ignore-AP-power-level-when-tx-power-type-is.patch
vendored
@ -21,12 +21,12 @@ Signed-off-by: Alexandre Frade <kernel@xanmod.org>
|
||||
--- a/net/mac80211/iface.c
|
||||
+++ b/net/mac80211/iface.c
|
||||
@@ -62,7 +62,8 @@ bool __ieee80211_recalc_txpower(struct i
|
||||
if (sdata->deflink.user_power_level != IEEE80211_UNSET_POWER_LEVEL)
|
||||
power = min(power, sdata->deflink.user_power_level);
|
||||
if (link->user_power_level != IEEE80211_UNSET_POWER_LEVEL)
|
||||
power = min(power, link->user_power_level);
|
||||
|
||||
- if (sdata->deflink.ap_power_level != IEEE80211_UNSET_POWER_LEVEL)
|
||||
+ if (sdata->deflink.ap_power_level != IEEE80211_UNSET_POWER_LEVEL &&
|
||||
+ sdata->vif.bss_conf.txpower_type != NL80211_TX_POWER_FIXED)
|
||||
power = min(power, sdata->deflink.ap_power_level);
|
||||
- if (link->ap_power_level != IEEE80211_UNSET_POWER_LEVEL)
|
||||
+ if (link->ap_power_level != IEEE80211_UNSET_POWER_LEVEL &&
|
||||
+ link->conf->txpower_type != NL80211_TX_POWER_FIXED)
|
||||
power = min(power, link->ap_power_level);
|
||||
|
||||
if (power != sdata->vif.bss_conf.txpower) {
|
||||
if (power != link->conf->txpower) {
|
||||
|
@ -1,4 +1,4 @@
|
||||
From 421120bda34d994c5e0e07a89e2f9c40c53e8e87 Mon Sep 17 00:00:00 2001
|
||||
From 90b69178f6a866c7f3330c2006f6b5396146192c Mon Sep 17 00:00:00 2001
|
||||
From: graysky <therealgraysky AT proton DOT me>
|
||||
Date: Mon, 16 Sep 2024 05:55:58 -0400
|
||||
Subject: ZEN: Add graysky's more-uarches
|
||||
@ -123,10 +123,10 @@ REFERENCES
|
||||
3. https://github.com/graysky2/kernel_gcc_patch/issues/15
|
||||
4. http://www.linuxforge.net/docs/linux/linux-gcc.php
|
||||
---
|
||||
arch/x86/Kconfig.cpu | 359 ++++++++++++++++++++++++++++++--
|
||||
arch/x86/Makefile | 87 +++++++-
|
||||
arch/x86/include/asm/vermagic.h | 70 +++++++
|
||||
3 files changed, 499 insertions(+), 17 deletions(-)
|
||||
arch/x86/Kconfig.cpu | 367 ++++++++++++++++++++++++++++++--
|
||||
arch/x86/Makefile | 89 +++++++-
|
||||
arch/x86/include/asm/vermagic.h | 72 +++++++
|
||||
3 files changed, 511 insertions(+), 17 deletions(-)
|
||||
|
||||
--- a/arch/x86/Kconfig.cpu
|
||||
+++ b/arch/x86/Kconfig.cpu
|
||||
@ -257,7 +257,7 @@ REFERENCES
|
||||
+
|
||||
+config MZEN5
|
||||
+ bool "AMD Zen 5"
|
||||
+ depends on (CC_IS_GCC && GCC_VERSION > 140000) || (CC_IS_CLANG && CLANG_VERSION >= 191000)
|
||||
+ depends on (CC_IS_GCC && GCC_VERSION > 140000) || (CC_IS_CLANG && CLANG_VERSION >= 190100)
|
||||
+ help
|
||||
+ Select this for AMD Family 19h Zen 5 processors.
|
||||
+
|
||||
@ -285,7 +285,7 @@ REFERENCES
|
||||
help
|
||||
|
||||
Select this for Intel Core 2 and newer Core 2 Xeons (Xeon 51xx and
|
||||
@@ -278,14 +388,191 @@ config MCORE2
|
||||
@@ -278,14 +388,199 @@ config MCORE2
|
||||
family in /proc/cpuinfo. Newer ones have 6 and older ones 15
|
||||
(not a typo)
|
||||
|
||||
@ -393,14 +393,22 @@ REFERENCES
|
||||
+
|
||||
+ Enables -march=cannonlake
|
||||
+
|
||||
+config MICELAKE
|
||||
+config MICELAKE_CLIENT
|
||||
+ bool "Intel Ice Lake"
|
||||
+ help
|
||||
+
|
||||
+ Select this for 10th Gen Core processors in the Ice Lake family.
|
||||
+ Select this for 10th Gen Core client processors in the Ice Lake family.
|
||||
+
|
||||
+ Enables -march=icelake-client
|
||||
+
|
||||
+config MICELAKE_SERVER
|
||||
+ bool "Intel Ice Lake Server"
|
||||
+ help
|
||||
+
|
||||
+ Select this for 10th Gen Core server processors in the Ice Lake family.
|
||||
+
|
||||
+ Enables -march=icelake-server
|
||||
+
|
||||
+config MCASCADELAKE
|
||||
+ bool "Intel Cascade Lake"
|
||||
+ help
|
||||
@ -483,7 +491,7 @@ REFERENCES
|
||||
|
||||
config GENERIC_CPU
|
||||
bool "Generic-x86-64"
|
||||
@@ -294,6 +581,26 @@ config GENERIC_CPU
|
||||
@@ -294,6 +589,26 @@ config GENERIC_CPU
|
||||
Generic x86-64 CPU.
|
||||
Run equally well on all x86-64 CPUs.
|
||||
|
||||
@ -510,7 +518,7 @@ REFERENCES
|
||||
endchoice
|
||||
|
||||
config X86_GENERIC
|
||||
@@ -308,6 +615,30 @@ config X86_GENERIC
|
||||
@@ -308,6 +623,30 @@ config X86_GENERIC
|
||||
This is really intended for distributors who need more
|
||||
generic optimizations.
|
||||
|
||||
@ -541,32 +549,32 @@ REFERENCES
|
||||
#
|
||||
# Define implied options from the CPU selection here
|
||||
config X86_INTERNODE_CACHE_SHIFT
|
||||
@@ -318,7 +649,7 @@ config X86_INTERNODE_CACHE_SHIFT
|
||||
@@ -318,7 +657,7 @@ config X86_INTERNODE_CACHE_SHIFT
|
||||
config X86_L1_CACHE_SHIFT
|
||||
int
|
||||
default "7" if MPENTIUM4 || MPSC
|
||||
- default "6" if MK7 || MK8 || MPENTIUMM || MCORE2 || MATOM || MVIAC7 || X86_GENERIC || GENERIC_CPU
|
||||
+ default "6" if MK7 || MK8 || MPENTIUMM || MCORE2 || MATOM || MVIAC7 || X86_GENERIC || GENERIC_CPU || MK8SSE3 || MK10 || MBARCELONA || MBOBCAT || MJAGUAR || MBULLDOZER || MPILEDRIVER || MSTEAMROLLER || MEXCAVATOR || MZEN || MZEN2 || MZEN3 || MZEN4 || MZEN5 || MNEHALEM || MWESTMERE || MSILVERMONT || MGOLDMONT || MGOLDMONTPLUS || MSANDYBRIDGE || MIVYBRIDGE || MHASWELL || MBROADWELL || MSKYLAKE || MSKYLAKEX || MCANNONLAKE || MICELAKE || MCASCADELAKE || MCOOPERLAKE || MTIGERLAKE || MSAPPHIRERAPIDS || MROCKETLAKE || MALDERLAKE || MRAPTORLAKE || MMETEORLAKE || MEMERALDRAPIDS || MNATIVE_INTEL || MNATIVE_AMD
|
||||
+ default "6" if MK7 || MK8 || MPENTIUMM || MCORE2 || MATOM || MVIAC7 || X86_GENERIC || GENERIC_CPU || MK8SSE3 || MK10 || MBARCELONA || MBOBCAT || MJAGUAR || MBULLDOZER || MPILEDRIVER || MSTEAMROLLER || MEXCAVATOR || MZEN || MZEN2 || MZEN3 || MZEN4 || MZEN5 || MNEHALEM || MWESTMERE || MSILVERMONT || MGOLDMONT || MGOLDMONTPLUS || MSANDYBRIDGE || MIVYBRIDGE || MHASWELL || MBROADWELL || MSKYLAKE || MSKYLAKEX || MCANNONLAKE || MICELAKE_CLIENT || MICELAKE_SERVER || MCASCADELAKE || MCOOPERLAKE || MTIGERLAKE || MSAPPHIRERAPIDS || MROCKETLAKE || MALDERLAKE || MRAPTORLAKE || MMETEORLAKE || MEMERALDRAPIDS || MNATIVE_INTEL || MNATIVE_AMD
|
||||
default "4" if MELAN || M486SX || M486 || MGEODEGX1
|
||||
default "5" if MWINCHIP3D || MWINCHIPC6 || MCRUSOE || MEFFICEON || MCYRIXIII || MK6 || MPENTIUMIII || MPENTIUMII || M686 || M586MMX || M586TSC || M586 || MVIAC3_2 || MGEODE_LX
|
||||
|
||||
@@ -336,11 +667,11 @@ config X86_ALIGNMENT_16
|
||||
@@ -336,11 +675,11 @@ config X86_ALIGNMENT_16
|
||||
|
||||
config X86_INTEL_USERCOPY
|
||||
def_bool y
|
||||
- depends on MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M586MMX || X86_GENERIC || MK8 || MK7 || MEFFICEON || MCORE2
|
||||
+ depends on MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M586MMX || X86_GENERIC || MK8 || MK7 || MEFFICEON || MCORE2 || MNEHALEM || MWESTMERE || MSILVERMONT || MGOLDMONT || MGOLDMONTPLUS || MSANDYBRIDGE || MIVYBRIDGE || MHASWELL || MBROADWELL || MSKYLAKE || MSKYLAKEX || MCANNONLAKE || MICELAKE || MCASCADELAKE || MCOOPERLAKE || MTIGERLAKE || MSAPPHIRERAPIDS || MROCKETLAKE || MALDERLAKE || MRAPTORLAKE || MMETEORLAKE || MEMERALDRAPIDS || MNATIVE_INTEL
|
||||
+ depends on MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M586MMX || X86_GENERIC || MK8 || MK7 || MEFFICEON || MCORE2 || MNEHALEM || MWESTMERE || MSILVERMONT || MGOLDMONT || MGOLDMONTPLUS || MSANDYBRIDGE || MIVYBRIDGE || MHASWELL || MBROADWELL || MSKYLAKE || MSKYLAKEX || MCANNONLAKE || MICELAKE_CLIENT || MICELAKE_SERVER || MCASCADELAKE || MCOOPERLAKE || MTIGERLAKE || MSAPPHIRERAPIDS || MROCKETLAKE || MALDERLAKE || MRAPTORLAKE || MMETEORLAKE || MEMERALDRAPIDS || MNATIVE_INTEL
|
||||
|
||||
config X86_USE_PPRO_CHECKSUM
|
||||
def_bool y
|
||||
- depends on MWINCHIP3D || MWINCHIPC6 || MCYRIXIII || MK7 || MK6 || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || MK8 || MVIAC3_2 || MVIAC7 || MEFFICEON || MGEODE_LX || MCORE2 || MATOM
|
||||
+ depends on MWINCHIP3D || MWINCHIPC6 || MCYRIXIII || MK7 || MK6 || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || MK8 || MVIAC3_2 || MVIAC7 || MEFFICEON || MGEODE_LX || MCORE2 || MATOM || MK8SSE3 || MK10 || MBARCELONA || MBOBCAT || MJAGUAR || MBULLDOZER || MPILEDRIVER || MSTEAMROLLER || MEXCAVATOR || MZEN || MZEN2 || MZEN3 || MZEN4 || MZEN5 || MNEHALEM || MWESTMERE || MSILVERMONT || MGOLDMONT || MGOLDMONTPLUS || MSANDYBRIDGE || MIVYBRIDGE || MHASWELL || MBROADWELL || MSKYLAKE || MSKYLAKEX || MCANNONLAKE || MICELAKE || MCASCADELAKE || MCOOPERLAKE || MTIGERLAKE || MSAPPHIRERAPIDS || MROCKETLAKE || MALDERLAKE || MRAPTORLAKE || MMETEORLAKE || MEMERALDRAPIDS || MNATIVE_INTEL || MNATIVE_AMD
|
||||
+ depends on MWINCHIP3D || MWINCHIPC6 || MCYRIXIII || MK7 || MK6 || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || MK8 || MVIAC3_2 || MVIAC7 || MEFFICEON || MGEODE_LX || MCORE2 || MATOM || MK8SSE3 || MK10 || MBARCELONA || MBOBCAT || MJAGUAR || MBULLDOZER || MPILEDRIVER || MSTEAMROLLER || MEXCAVATOR || MZEN || MZEN2 || MZEN3 || MZEN4 || MZEN5 || MNEHALEM || MWESTMERE || MSILVERMONT || MGOLDMONT || MGOLDMONTPLUS || MSANDYBRIDGE || MIVYBRIDGE || MHASWELL || MBROADWELL || MSKYLAKE || MSKYLAKEX || MCANNONLAKE || MICELAKE_CLIENT || MICELAKE_SERVER || MCASCADELAKE || MCOOPERLAKE || MTIGERLAKE || MSAPPHIRERAPIDS || MROCKETLAKE || MALDERLAKE || MRAPTORLAKE || MMETEORLAKE || MEMERALDRAPIDS || MNATIVE_INTEL || MNATIVE_AMD
|
||||
|
||||
#
|
||||
# P6_NOPs are a relatively minor optimization that require a family >=
|
||||
--- a/arch/x86/Makefile
|
||||
+++ b/arch/x86/Makefile
|
||||
@@ -182,15 +182,96 @@ else
|
||||
@@ -182,15 +182,98 @@ else
|
||||
cflags-$(CONFIG_MK8) += -march=k8
|
||||
cflags-$(CONFIG_MPSC) += -march=nocona
|
||||
cflags-$(CONFIG_MCORE2) += -march=core2
|
||||
@ -608,7 +616,8 @@ REFERENCES
|
||||
+ cflags-$(CONFIG_MSKYLAKE) += -march=skylake
|
||||
+ cflags-$(CONFIG_MSKYLAKEX) += -march=skylake-avx512
|
||||
+ cflags-$(CONFIG_MCANNONLAKE) += -march=cannonlake
|
||||
+ cflags-$(CONFIG_MICELAKE) += -march=icelake-client
|
||||
+ cflags-$(CONFIG_MICELAKE_CLIENT) += -march=icelake-client
|
||||
+ cflags-$(CONFIG_MICELAKE_SERVER) += -march=icelake-server
|
||||
+ cflags-$(CONFIG_MCASCADELAKE) += -march=cascadelake
|
||||
+ cflags-$(CONFIG_MCOOPERLAKE) += -march=cooperlake
|
||||
+ cflags-$(CONFIG_MTIGERLAKE) += -march=tigerlake
|
||||
@ -653,7 +662,8 @@ REFERENCES
|
||||
+ rustflags-$(CONFIG_MSKYLAKE) += -Ctarget-cpu=skylake
|
||||
+ rustflags-$(CONFIG_MSKYLAKEX) += -Ctarget-cpu=skylake-avx512
|
||||
+ rustflags-$(CONFIG_MCANNONLAKE) += -Ctarget-cpu=cannonlake
|
||||
+ rustflags-$(CONFIG_MICELAKE) += -Ctarget-cpu=icelake-client
|
||||
+ rustflags-$(CONFIG_MICELAKE_CLIENT) += -Ctarget-cpu=icelake-client
|
||||
+ rustflags-$(CONFIG_MICELAKE_SERVER) += -Ctarget-cpu=icelake-server
|
||||
+ rustflags-$(CONFIG_MCASCADELAKE) += -Ctarget-cpu=cascadelake
|
||||
+ rustflags-$(CONFIG_MCOOPERLAKE) += -Ctarget-cpu=cooperlake
|
||||
+ rustflags-$(CONFIG_MTIGERLAKE) += -Ctarget-cpu=tigerlake
|
||||
@ -668,7 +678,7 @@ REFERENCES
|
||||
KBUILD_CFLAGS += -mno-red-zone
|
||||
--- a/arch/x86/include/asm/vermagic.h
|
||||
+++ b/arch/x86/include/asm/vermagic.h
|
||||
@@ -17,6 +17,54 @@
|
||||
@@ -17,6 +17,56 @@
|
||||
#define MODULE_PROC_FAMILY "586MMX "
|
||||
#elif defined CONFIG_MCORE2
|
||||
#define MODULE_PROC_FAMILY "CORE2 "
|
||||
@ -700,8 +710,10 @@ REFERENCES
|
||||
+#define MODULE_PROC_FAMILY "SKYLAKEX "
|
||||
+#elif defined CONFIG_MCANNONLAKE
|
||||
+#define MODULE_PROC_FAMILY "CANNONLAKE "
|
||||
+#elif defined CONFIG_MICELAKE
|
||||
+#define MODULE_PROC_FAMILY "ICELAKE "
|
||||
+#elif defined CONFIG_MICELAKE_CLIENT
|
||||
+#define MODULE_PROC_FAMILY "ICELAKE_CLIENT "
|
||||
+#elif defined CONFIG_MICELAKE_SERVER
|
||||
+#define MODULE_PROC_FAMILY "ICELAKE_SERVER "
|
||||
+#elif defined CONFIG_MCASCADELAKE
|
||||
+#define MODULE_PROC_FAMILY "CASCADELAKE "
|
||||
+#elif defined CONFIG_MCOOPERLAKE
|
||||
@ -723,7 +735,7 @@ REFERENCES
|
||||
#elif defined CONFIG_MATOM
|
||||
#define MODULE_PROC_FAMILY "ATOM "
|
||||
#elif defined CONFIG_M686
|
||||
@@ -35,6 +83,28 @@
|
||||
@@ -35,6 +85,28 @@
|
||||
#define MODULE_PROC_FAMILY "K7 "
|
||||
#elif defined CONFIG_MK8
|
||||
#define MODULE_PROC_FAMILY "K8 "
|
||||
|
@ -1,4 +1,4 @@
|
||||
From 1fc1195e784540ad1966b57267fc927a87c5d21d Mon Sep 17 00:00:00 2001
|
||||
From f4f448a305e9d705b9a0da102ddfd58bfaac5cc0 Mon Sep 17 00:00:00 2001
|
||||
From: "Jan Alexander Steffens (heftig)" <heftig@archlinux.org>
|
||||
Date: Sun, 11 Dec 2022 23:51:16 +0100
|
||||
Subject: ZEN: Restore CONFIG_OPTIMIZE_FOR_PERFORMANCE_O3
|
||||
@ -13,7 +13,7 @@ dependency on CONFIG_ARC and adds RUSTFLAGS.
|
||||
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -820,6 +820,9 @@ KBUILD_CFLAGS += -fno-delete-null-pointe
|
||||
@@ -872,6 +872,9 @@ KBUILD_CFLAGS += -fno-delete-null-pointe
|
||||
ifdef CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE
|
||||
KBUILD_CFLAGS += -O2
|
||||
KBUILD_RUSTFLAGS += -Copt-level=2
|
||||
@ -25,7 +25,7 @@ dependency on CONFIG_ARC and adds RUSTFLAGS.
|
||||
KBUILD_RUSTFLAGS += -Copt-level=s
|
||||
--- a/init/Kconfig
|
||||
+++ b/init/Kconfig
|
||||
@@ -1451,6 +1451,12 @@ config CC_OPTIMIZE_FOR_PERFORMANCE
|
||||
@@ -1465,6 +1465,12 @@ config CC_OPTIMIZE_FOR_PERFORMANCE
|
||||
with the "-O2" compiler flag for best performance and most
|
||||
helpful compile-time warnings.
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -828,6 +828,10 @@ KBUILD_CFLAGS += -Os
|
||||
@@ -880,6 +880,10 @@ KBUILD_CFLAGS += -Os
|
||||
KBUILD_RUSTFLAGS += -Copt-level=s
|
||||
endif
|
||||
|
||||
|
3
debian/patches/mixed-arch/0004-XANMOD-x86-build-Prevent-generating-avx2-and-avx512-.patch
vendored
3
debian/patches/mixed-arch/0004-XANMOD-x86-build-Prevent-generating-avx2-and-avx512-.patch
vendored
@ -1,8 +1,7 @@
|
||||
From 3ebc1fdf3e0ee9bff1efe20eb5791eba5c84a810 Mon Sep 17 00:00:00 2001
|
||||
From: Alexandre Frade <kernel@xanmod.org>
|
||||
Date: Thu, 3 Aug 2023 13:53:49 +0000
|
||||
Subject: [PATCH 01/19] XANMOD: x86/build: Prevent generating avx2 and avx512
|
||||
floating-point code
|
||||
Subject: XANMOD: x86/build: Prevent generating avx2 and avx512 floating-point code
|
||||
|
||||
Signed-off-by: Alexandre Frade <kernel@xanmod.org>
|
||||
---
|
||||
|
11
debian/patches/mixed-arch/0006-XANMOD-kbuild-Add-GCC-SMS-based-modulo-scheduling-fl.patch
vendored
11
debian/patches/mixed-arch/0006-XANMOD-kbuild-Add-GCC-SMS-based-modulo-scheduling-fl.patch
vendored
@ -1,17 +1,16 @@
|
||||
From dccbc0ca6c05ae315967a603870d553c231a68a1 Mon Sep 17 00:00:00 2001
|
||||
From b1a99a2a9675f80b7c04a239a6b047373ccf3a17 Mon Sep 17 00:00:00 2001
|
||||
From: Alexandre Frade <kernel@xanmod.org>
|
||||
Date: Mon, 16 Sep 2024 00:55:35 +0000
|
||||
Subject: [PATCH 02/18] XANMOD: kbuild: Add GCC SMS-based modulo scheduling
|
||||
flags
|
||||
Subject: XANMOD: kbuild: Add GCC SMS-based modulo scheduling flags
|
||||
|
||||
Signed-off-by: Alexandre Frade <kernel@xanmod.org>
|
||||
---
|
||||
Makefile | 7 ++++
|
||||
1 file changed, 7 insertions(+)
|
||||
Makefile | 4 ++++
|
||||
1 file changed, 4 insertions(+)
|
||||
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -832,6 +832,13 @@ ifdef CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE
|
||||
@@ -884,6 +884,13 @@ ifdef CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE
|
||||
KBUILD_CFLAGS += $(call cc-option,-fivopts)
|
||||
endif
|
||||
|
||||
|
24
debian/patches/mixed-arch/0007-PF-kbuild-6.12-adopt-proposed-upstream-change-for-gener.patch
vendored
24
debian/patches/mixed-arch/0007-PF-kbuild-6.12-adopt-proposed-upstream-change-for-gener.patch
vendored
@ -1,24 +0,0 @@
|
||||
From 578cb97f41beb5d2dde81b8a4c1db6e01e8bcc6a Mon Sep 17 00:00:00 2001
|
||||
From: Oleksandr Natalenko <oleksandr@natalenko.name>
|
||||
Date: Wed, 11 Dec 2024 08:50:50 +0100
|
||||
Subject: kbuild-6.12: adopt proposed upstream change for generic CPUs
|
||||
|
||||
Link: https://lore.kernel.org/lkml/20241210144945.2325330-4-arnd@kernel.org/
|
||||
Signed-off-by: Oleksandr Natalenko <oleksandr@natalenko.name>
|
||||
---
|
||||
arch/x86/Makefile | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/arch/x86/Makefile
|
||||
+++ b/arch/x86/Makefile
|
||||
@@ -184,8 +184,8 @@ else
|
||||
cflags-$(CONFIG_MCORE2) += -march=core2
|
||||
cflags-$(CONFIG_MATOM) += -march=bonnell
|
||||
ifeq ($(CONFIG_X86_64_VERSION),1)
|
||||
- cflags-$(CONFIG_GENERIC_CPU) += -mtune=generic
|
||||
- rustflags-$(CONFIG_GENERIC_CPU) += -Ztune-cpu=generic
|
||||
+ cflags-$(CONFIG_GENERIC_CPU) += -march=x86-64 -mtune=generic
|
||||
+ rustflags-$(CONFIG_GENERIC_CPU) += -Ctarget-cpu=x86-64 -Ztune-cpu=generic
|
||||
else
|
||||
cflags-$(CONFIG_GENERIC_CPU) += -march=x86-64-v$(CONFIG_X86_64_VERSION)
|
||||
rustflags-$(CONFIG_GENERIC_CPU) += -Ctarget-cpu=x86-64-v$(CONFIG_X86_64_VERSION)
|
59
debian/patches/patchset-pf/amd-pstate/0001-cpufreq-amd-pstate-Modify-the-min_perf-calculation-i.patch
vendored
Normal file
59
debian/patches/patchset-pf/amd-pstate/0001-cpufreq-amd-pstate-Modify-the-min_perf-calculation-i.patch
vendored
Normal file
@ -0,0 +1,59 @@
|
||||
From b6c0305214154bc26d20b130266fc1ba8341b58c Mon Sep 17 00:00:00 2001
|
||||
From: Dhananjay Ugwekar <dhananjay.ugwekar@amd.com>
|
||||
Date: Wed, 5 Feb 2025 11:25:14 +0000
|
||||
Subject: cpufreq/amd-pstate: Modify the min_perf calculation in adjust_perf
|
||||
callback
|
||||
|
||||
Instead of setting a fixed floor at lowest_nonlinear_perf, use the
|
||||
min_limit_perf value, so that it gives the user the freedom to lower the
|
||||
floor further.
|
||||
|
||||
There are two minimum frequency/perf limits that we need to consider in
|
||||
the adjust_perf callback. One provided by schedutil i.e. the sg_cpu->bw_min
|
||||
value passed in _min_perf arg, another is the effective value of
|
||||
min_freq_qos request that is updated in cpudata->min_limit_perf. Modify the
|
||||
code to use the bigger of these two values.
|
||||
|
||||
Signed-off-by: Dhananjay Ugwekar <dhananjay.ugwekar@amd.com>
|
||||
Reviewed-by: Mario Limonciello <mario.limonciello@amd.com>
|
||||
---
|
||||
drivers/cpufreq/amd-pstate.c | 12 ++++++------
|
||||
1 file changed, 6 insertions(+), 6 deletions(-)
|
||||
|
||||
--- a/drivers/cpufreq/amd-pstate.c
|
||||
+++ b/drivers/cpufreq/amd-pstate.c
|
||||
@@ -672,7 +672,7 @@ static void amd_pstate_adjust_perf(unsig
|
||||
unsigned long capacity)
|
||||
{
|
||||
unsigned long max_perf, min_perf, des_perf,
|
||||
- cap_perf, lowest_nonlinear_perf;
|
||||
+ cap_perf, min_limit_perf;
|
||||
struct cpufreq_policy *policy = cpufreq_cpu_get(cpu);
|
||||
struct amd_cpudata *cpudata;
|
||||
|
||||
@@ -684,20 +684,20 @@ static void amd_pstate_adjust_perf(unsig
|
||||
if (policy->min != cpudata->min_limit_freq || policy->max != cpudata->max_limit_freq)
|
||||
amd_pstate_update_min_max_limit(policy);
|
||||
|
||||
-
|
||||
cap_perf = READ_ONCE(cpudata->highest_perf);
|
||||
- lowest_nonlinear_perf = READ_ONCE(cpudata->lowest_nonlinear_perf);
|
||||
+ min_limit_perf = READ_ONCE(cpudata->min_limit_perf);
|
||||
|
||||
des_perf = cap_perf;
|
||||
if (target_perf < capacity)
|
||||
des_perf = DIV_ROUND_UP(cap_perf * target_perf, capacity);
|
||||
|
||||
- min_perf = READ_ONCE(cpudata->lowest_perf);
|
||||
if (_min_perf < capacity)
|
||||
min_perf = DIV_ROUND_UP(cap_perf * _min_perf, capacity);
|
||||
+ else
|
||||
+ min_perf = cap_perf;
|
||||
|
||||
- if (min_perf < lowest_nonlinear_perf)
|
||||
- min_perf = lowest_nonlinear_perf;
|
||||
+ if (min_perf < min_limit_perf)
|
||||
+ min_perf = min_limit_perf;
|
||||
|
||||
max_perf = cpudata->max_limit_perf;
|
||||
if (max_perf < min_perf)
|
27
debian/patches/patchset-pf/amd-pstate/0002-cpufreq-amd-pstate-Remove-the-redundant-des_perf-cla.patch
vendored
Normal file
27
debian/patches/patchset-pf/amd-pstate/0002-cpufreq-amd-pstate-Remove-the-redundant-des_perf-cla.patch
vendored
Normal file
@ -0,0 +1,27 @@
|
||||
From 6e51c53b5e940312c71ce5ea68cf94a000beab01 Mon Sep 17 00:00:00 2001
|
||||
From: Dhananjay Ugwekar <dhananjay.ugwekar@amd.com>
|
||||
Date: Wed, 5 Feb 2025 11:25:15 +0000
|
||||
Subject: cpufreq/amd-pstate: Remove the redundant des_perf clamping in
|
||||
adjust_perf
|
||||
|
||||
des_perf is later on clamped between min_perf and max_perf in
|
||||
amd_pstate_update. So, remove the redundant clamping from
|
||||
amd_pstate_adjust_perf.
|
||||
|
||||
Signed-off-by: Dhananjay Ugwekar <dhananjay.ugwekar@amd.com>
|
||||
Reviewed-by: Mario Limonciello <mario.limonciello@amd.com>
|
||||
---
|
||||
drivers/cpufreq/amd-pstate.c | 2 --
|
||||
1 file changed, 2 deletions(-)
|
||||
|
||||
--- a/drivers/cpufreq/amd-pstate.c
|
||||
+++ b/drivers/cpufreq/amd-pstate.c
|
||||
@@ -703,8 +703,6 @@ static void amd_pstate_adjust_perf(unsig
|
||||
if (max_perf < min_perf)
|
||||
max_perf = min_perf;
|
||||
|
||||
- des_perf = clamp_t(unsigned long, des_perf, min_perf, max_perf);
|
||||
-
|
||||
amd_pstate_update(cpudata, min_perf, des_perf, max_perf, true,
|
||||
policy->governor->flags);
|
||||
cpufreq_cpu_put(policy);
|
51
debian/patches/patchset-pf/amd-pstate/0003-cpufreq-amd-pstate-Pass-min-max_limit_perf-as-min-ma.patch
vendored
Normal file
51
debian/patches/patchset-pf/amd-pstate/0003-cpufreq-amd-pstate-Pass-min-max_limit_perf-as-min-ma.patch
vendored
Normal file
@ -0,0 +1,51 @@
|
||||
From ad3fffe8ff1f18ad437d8b0d0bb602ba3c24adf7 Mon Sep 17 00:00:00 2001
|
||||
From: Dhananjay Ugwekar <dhananjay.ugwekar@amd.com>
|
||||
Date: Wed, 5 Feb 2025 11:25:16 +0000
|
||||
Subject: cpufreq/amd-pstate: Pass min/max_limit_perf as min/max_perf to
|
||||
amd_pstate_update
|
||||
|
||||
Currently, amd_pstate_update_freq passes the hardware perf limits as
|
||||
min/max_perf to amd_pstate_update, which eventually gets programmed into
|
||||
the min/max_perf fields of the CPPC_REQ register.
|
||||
|
||||
Instead pass the effective perf limits i.e. min/max_limit_perf values to
|
||||
amd_pstate_update as min/max_perf.
|
||||
|
||||
Signed-off-by: Dhananjay Ugwekar <dhananjay.ugwekar@amd.com>
|
||||
Reviewed-by: Mario Limonciello <mario.limonciello@amd.com>
|
||||
---
|
||||
drivers/cpufreq/amd-pstate.c | 9 ++++-----
|
||||
1 file changed, 4 insertions(+), 5 deletions(-)
|
||||
|
||||
--- a/drivers/cpufreq/amd-pstate.c
|
||||
+++ b/drivers/cpufreq/amd-pstate.c
|
||||
@@ -615,7 +615,7 @@ static int amd_pstate_update_freq(struct
|
||||
{
|
||||
struct cpufreq_freqs freqs;
|
||||
struct amd_cpudata *cpudata = policy->driver_data;
|
||||
- unsigned long max_perf, min_perf, des_perf, cap_perf;
|
||||
+ unsigned long des_perf, cap_perf;
|
||||
|
||||
if (!cpudata->max_freq)
|
||||
return -ENODEV;
|
||||
@@ -624,8 +624,6 @@ static int amd_pstate_update_freq(struct
|
||||
amd_pstate_update_min_max_limit(policy);
|
||||
|
||||
cap_perf = READ_ONCE(cpudata->highest_perf);
|
||||
- min_perf = READ_ONCE(cpudata->lowest_perf);
|
||||
- max_perf = cap_perf;
|
||||
|
||||
freqs.old = policy->cur;
|
||||
freqs.new = target_freq;
|
||||
@@ -642,8 +640,9 @@ static int amd_pstate_update_freq(struct
|
||||
if (!fast_switch)
|
||||
cpufreq_freq_transition_begin(policy, &freqs);
|
||||
|
||||
- amd_pstate_update(cpudata, min_perf, des_perf,
|
||||
- max_perf, fast_switch, policy->governor->flags);
|
||||
+ amd_pstate_update(cpudata, cpudata->min_limit_perf, des_perf,
|
||||
+ cpudata->max_limit_perf, fast_switch,
|
||||
+ policy->governor->flags);
|
||||
|
||||
if (!fast_switch)
|
||||
cpufreq_freq_transition_end(policy, &freqs, false);
|
355
debian/patches/patchset-pf/amd-pstate/0004-cpufreq-amd-pstate-Convert-all-perf-values-to-u8.patch
vendored
Normal file
355
debian/patches/patchset-pf/amd-pstate/0004-cpufreq-amd-pstate-Convert-all-perf-values-to-u8.patch
vendored
Normal file
@ -0,0 +1,355 @@
|
||||
From 300686c32b77583f45c6763535da85f2242bf820 Mon Sep 17 00:00:00 2001
|
||||
From: Dhananjay Ugwekar <dhananjay.ugwekar@amd.com>
|
||||
Date: Wed, 5 Feb 2025 11:25:17 +0000
|
||||
Subject: cpufreq/amd-pstate: Convert all perf values to u8
|
||||
|
||||
All perf values are always within 0-255 range, hence convert their
|
||||
datatype to u8 everywhere.
|
||||
|
||||
Signed-off-by: Dhananjay Ugwekar <dhananjay.ugwekar@amd.com>
|
||||
Reviewed-by: Mario Limonciello <mario.limonciello@amd.com>
|
||||
---
|
||||
drivers/cpufreq/amd-pstate-trace.h | 46 +++++++++++------------
|
||||
drivers/cpufreq/amd-pstate.c | 60 +++++++++++++++---------------
|
||||
drivers/cpufreq/amd-pstate.h | 18 ++++-----
|
||||
3 files changed, 62 insertions(+), 62 deletions(-)
|
||||
|
||||
--- a/drivers/cpufreq/amd-pstate-trace.h
|
||||
+++ b/drivers/cpufreq/amd-pstate-trace.h
|
||||
@@ -24,9 +24,9 @@
|
||||
|
||||
TRACE_EVENT(amd_pstate_perf,
|
||||
|
||||
- TP_PROTO(unsigned long min_perf,
|
||||
- unsigned long target_perf,
|
||||
- unsigned long capacity,
|
||||
+ TP_PROTO(u8 min_perf,
|
||||
+ u8 target_perf,
|
||||
+ u8 capacity,
|
||||
u64 freq,
|
||||
u64 mperf,
|
||||
u64 aperf,
|
||||
@@ -47,9 +47,9 @@ TRACE_EVENT(amd_pstate_perf,
|
||||
),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
- __field(unsigned long, min_perf)
|
||||
- __field(unsigned long, target_perf)
|
||||
- __field(unsigned long, capacity)
|
||||
+ __field(u8, min_perf)
|
||||
+ __field(u8, target_perf)
|
||||
+ __field(u8, capacity)
|
||||
__field(unsigned long long, freq)
|
||||
__field(unsigned long long, mperf)
|
||||
__field(unsigned long long, aperf)
|
||||
@@ -70,10 +70,10 @@ TRACE_EVENT(amd_pstate_perf,
|
||||
__entry->fast_switch = fast_switch;
|
||||
),
|
||||
|
||||
- TP_printk("amd_min_perf=%lu amd_des_perf=%lu amd_max_perf=%lu freq=%llu mperf=%llu aperf=%llu tsc=%llu cpu_id=%u fast_switch=%s",
|
||||
- (unsigned long)__entry->min_perf,
|
||||
- (unsigned long)__entry->target_perf,
|
||||
- (unsigned long)__entry->capacity,
|
||||
+ TP_printk("amd_min_perf=%hhu amd_des_perf=%hhu amd_max_perf=%hhu freq=%llu mperf=%llu aperf=%llu tsc=%llu cpu_id=%u fast_switch=%s",
|
||||
+ (u8)__entry->min_perf,
|
||||
+ (u8)__entry->target_perf,
|
||||
+ (u8)__entry->capacity,
|
||||
(unsigned long long)__entry->freq,
|
||||
(unsigned long long)__entry->mperf,
|
||||
(unsigned long long)__entry->aperf,
|
||||
@@ -86,10 +86,10 @@ TRACE_EVENT(amd_pstate_perf,
|
||||
TRACE_EVENT(amd_pstate_epp_perf,
|
||||
|
||||
TP_PROTO(unsigned int cpu_id,
|
||||
- unsigned int highest_perf,
|
||||
- unsigned int epp,
|
||||
- unsigned int min_perf,
|
||||
- unsigned int max_perf,
|
||||
+ u8 highest_perf,
|
||||
+ u8 epp,
|
||||
+ u8 min_perf,
|
||||
+ u8 max_perf,
|
||||
bool boost
|
||||
),
|
||||
|
||||
@@ -102,10 +102,10 @@ TRACE_EVENT(amd_pstate_epp_perf,
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(unsigned int, cpu_id)
|
||||
- __field(unsigned int, highest_perf)
|
||||
- __field(unsigned int, epp)
|
||||
- __field(unsigned int, min_perf)
|
||||
- __field(unsigned int, max_perf)
|
||||
+ __field(u8, highest_perf)
|
||||
+ __field(u8, epp)
|
||||
+ __field(u8, min_perf)
|
||||
+ __field(u8, max_perf)
|
||||
__field(bool, boost)
|
||||
),
|
||||
|
||||
@@ -118,12 +118,12 @@ TRACE_EVENT(amd_pstate_epp_perf,
|
||||
__entry->boost = boost;
|
||||
),
|
||||
|
||||
- TP_printk("cpu%u: [%u<->%u]/%u, epp=%u, boost=%u",
|
||||
+ TP_printk("cpu%u: [%hhu<->%hhu]/%hhu, epp=%hhu, boost=%u",
|
||||
(unsigned int)__entry->cpu_id,
|
||||
- (unsigned int)__entry->min_perf,
|
||||
- (unsigned int)__entry->max_perf,
|
||||
- (unsigned int)__entry->highest_perf,
|
||||
- (unsigned int)__entry->epp,
|
||||
+ (u8)__entry->min_perf,
|
||||
+ (u8)__entry->max_perf,
|
||||
+ (u8)__entry->highest_perf,
|
||||
+ (u8)__entry->epp,
|
||||
(bool)__entry->boost
|
||||
)
|
||||
);
|
||||
--- a/drivers/cpufreq/amd-pstate.c
|
||||
+++ b/drivers/cpufreq/amd-pstate.c
|
||||
@@ -186,7 +186,7 @@ static inline int get_mode_idx_from_str(
|
||||
static DEFINE_MUTEX(amd_pstate_limits_lock);
|
||||
static DEFINE_MUTEX(amd_pstate_driver_lock);
|
||||
|
||||
-static s16 msr_get_epp(struct amd_cpudata *cpudata)
|
||||
+static u8 msr_get_epp(struct amd_cpudata *cpudata)
|
||||
{
|
||||
u64 value;
|
||||
int ret;
|
||||
@@ -207,7 +207,7 @@ static inline s16 amd_pstate_get_epp(str
|
||||
return static_call(amd_pstate_get_epp)(cpudata);
|
||||
}
|
||||
|
||||
-static s16 shmem_get_epp(struct amd_cpudata *cpudata)
|
||||
+static u8 shmem_get_epp(struct amd_cpudata *cpudata)
|
||||
{
|
||||
u64 epp;
|
||||
int ret;
|
||||
@@ -218,11 +218,11 @@ static s16 shmem_get_epp(struct amd_cpud
|
||||
return ret;
|
||||
}
|
||||
|
||||
- return (s16)(epp & 0xff);
|
||||
+ return FIELD_GET(AMD_CPPC_EPP_PERF_MASK, epp);
|
||||
}
|
||||
|
||||
-static int msr_update_perf(struct amd_cpudata *cpudata, u32 min_perf,
|
||||
- u32 des_perf, u32 max_perf, u32 epp, bool fast_switch)
|
||||
+static int msr_update_perf(struct amd_cpudata *cpudata, u8 min_perf,
|
||||
+ u8 des_perf, u8 max_perf, u8 epp, bool fast_switch)
|
||||
{
|
||||
u64 value, prev;
|
||||
|
||||
@@ -257,15 +257,15 @@ static int msr_update_perf(struct amd_cp
|
||||
DEFINE_STATIC_CALL(amd_pstate_update_perf, msr_update_perf);
|
||||
|
||||
static inline int amd_pstate_update_perf(struct amd_cpudata *cpudata,
|
||||
- u32 min_perf, u32 des_perf,
|
||||
- u32 max_perf, u32 epp,
|
||||
+ u8 min_perf, u8 des_perf,
|
||||
+ u8 max_perf, u8 epp,
|
||||
bool fast_switch)
|
||||
{
|
||||
return static_call(amd_pstate_update_perf)(cpudata, min_perf, des_perf,
|
||||
max_perf, epp, fast_switch);
|
||||
}
|
||||
|
||||
-static int msr_set_epp(struct amd_cpudata *cpudata, u32 epp)
|
||||
+static int msr_set_epp(struct amd_cpudata *cpudata, u8 epp)
|
||||
{
|
||||
u64 value, prev;
|
||||
int ret;
|
||||
@@ -292,12 +292,12 @@ static int msr_set_epp(struct amd_cpudat
|
||||
|
||||
DEFINE_STATIC_CALL(amd_pstate_set_epp, msr_set_epp);
|
||||
|
||||
-static inline int amd_pstate_set_epp(struct amd_cpudata *cpudata, u32 epp)
|
||||
+static inline int amd_pstate_set_epp(struct amd_cpudata *cpudata, u8 epp)
|
||||
{
|
||||
return static_call(amd_pstate_set_epp)(cpudata, epp);
|
||||
}
|
||||
|
||||
-static int shmem_set_epp(struct amd_cpudata *cpudata, u32 epp)
|
||||
+static int shmem_set_epp(struct amd_cpudata *cpudata, u8 epp)
|
||||
{
|
||||
int ret;
|
||||
struct cppc_perf_ctrls perf_ctrls;
|
||||
@@ -320,7 +320,7 @@ static int amd_pstate_set_energy_pref_in
|
||||
int pref_index)
|
||||
{
|
||||
struct amd_cpudata *cpudata = policy->driver_data;
|
||||
- int epp;
|
||||
+ u8 epp;
|
||||
|
||||
if (!pref_index)
|
||||
epp = cpudata->epp_default;
|
||||
@@ -479,8 +479,8 @@ static inline int amd_pstate_init_perf(s
|
||||
return static_call(amd_pstate_init_perf)(cpudata);
|
||||
}
|
||||
|
||||
-static int shmem_update_perf(struct amd_cpudata *cpudata, u32 min_perf,
|
||||
- u32 des_perf, u32 max_perf, u32 epp, bool fast_switch)
|
||||
+static int shmem_update_perf(struct amd_cpudata *cpudata, u8 min_perf,
|
||||
+ u8 des_perf, u8 max_perf, u8 epp, bool fast_switch)
|
||||
{
|
||||
struct cppc_perf_ctrls perf_ctrls;
|
||||
|
||||
@@ -531,14 +531,14 @@ static inline bool amd_pstate_sample(str
|
||||
return true;
|
||||
}
|
||||
|
||||
-static void amd_pstate_update(struct amd_cpudata *cpudata, u32 min_perf,
|
||||
- u32 des_perf, u32 max_perf, bool fast_switch, int gov_flags)
|
||||
+static void amd_pstate_update(struct amd_cpudata *cpudata, u8 min_perf,
|
||||
+ u8 des_perf, u8 max_perf, bool fast_switch, int gov_flags)
|
||||
{
|
||||
unsigned long max_freq;
|
||||
struct cpufreq_policy *policy = cpufreq_cpu_get(cpudata->cpu);
|
||||
- u32 nominal_perf = READ_ONCE(cpudata->nominal_perf);
|
||||
+ u8 nominal_perf = READ_ONCE(cpudata->nominal_perf);
|
||||
|
||||
- des_perf = clamp_t(unsigned long, des_perf, min_perf, max_perf);
|
||||
+ des_perf = clamp_t(u8, des_perf, min_perf, max_perf);
|
||||
|
||||
max_freq = READ_ONCE(cpudata->max_limit_freq);
|
||||
policy->cur = div_u64(des_perf * max_freq, max_perf);
|
||||
@@ -550,7 +550,7 @@ static void amd_pstate_update(struct amd
|
||||
|
||||
/* limit the max perf when core performance boost feature is disabled */
|
||||
if (!cpudata->boost_supported)
|
||||
- max_perf = min_t(unsigned long, nominal_perf, max_perf);
|
||||
+ max_perf = min_t(u8, nominal_perf, max_perf);
|
||||
|
||||
if (trace_amd_pstate_perf_enabled() && amd_pstate_sample(cpudata)) {
|
||||
trace_amd_pstate_perf(min_perf, des_perf, max_perf, cpudata->freq,
|
||||
@@ -591,7 +591,8 @@ static int amd_pstate_verify(struct cpuf
|
||||
|
||||
static int amd_pstate_update_min_max_limit(struct cpufreq_policy *policy)
|
||||
{
|
||||
- u32 max_limit_perf, min_limit_perf, max_perf, max_freq;
|
||||
+ u8 max_limit_perf, min_limit_perf, max_perf;
|
||||
+ u32 max_freq;
|
||||
struct amd_cpudata *cpudata = policy->driver_data;
|
||||
|
||||
max_perf = READ_ONCE(cpudata->highest_perf);
|
||||
@@ -615,7 +616,7 @@ static int amd_pstate_update_freq(struct
|
||||
{
|
||||
struct cpufreq_freqs freqs;
|
||||
struct amd_cpudata *cpudata = policy->driver_data;
|
||||
- unsigned long des_perf, cap_perf;
|
||||
+ u8 des_perf, cap_perf;
|
||||
|
||||
if (!cpudata->max_freq)
|
||||
return -ENODEV;
|
||||
@@ -670,8 +671,7 @@ static void amd_pstate_adjust_perf(unsig
|
||||
unsigned long target_perf,
|
||||
unsigned long capacity)
|
||||
{
|
||||
- unsigned long max_perf, min_perf, des_perf,
|
||||
- cap_perf, min_limit_perf;
|
||||
+ u8 max_perf, min_perf, des_perf, cap_perf, min_limit_perf;
|
||||
struct cpufreq_policy *policy = cpufreq_cpu_get(cpu);
|
||||
struct amd_cpudata *cpudata;
|
||||
|
||||
@@ -905,8 +905,8 @@ static int amd_pstate_init_freq(struct a
|
||||
{
|
||||
int ret;
|
||||
u32 min_freq, max_freq;
|
||||
- u32 highest_perf, nominal_perf, nominal_freq;
|
||||
- u32 lowest_nonlinear_perf, lowest_nonlinear_freq;
|
||||
+ u8 highest_perf, nominal_perf, lowest_nonlinear_perf;
|
||||
+ u32 nominal_freq, lowest_nonlinear_freq;
|
||||
struct cppc_perf_caps cppc_perf;
|
||||
|
||||
ret = cppc_get_perf_caps(cpudata->cpu, &cppc_perf);
|
||||
@@ -1113,7 +1113,7 @@ static ssize_t show_amd_pstate_lowest_no
|
||||
static ssize_t show_amd_pstate_highest_perf(struct cpufreq_policy *policy,
|
||||
char *buf)
|
||||
{
|
||||
- u32 perf;
|
||||
+ u8 perf;
|
||||
struct amd_cpudata *cpudata = policy->driver_data;
|
||||
|
||||
perf = READ_ONCE(cpudata->highest_perf);
|
||||
@@ -1124,7 +1124,7 @@ static ssize_t show_amd_pstate_highest_p
|
||||
static ssize_t show_amd_pstate_prefcore_ranking(struct cpufreq_policy *policy,
|
||||
char *buf)
|
||||
{
|
||||
- u32 perf;
|
||||
+ u8 perf;
|
||||
struct amd_cpudata *cpudata = policy->driver_data;
|
||||
|
||||
perf = READ_ONCE(cpudata->prefcore_ranking);
|
||||
@@ -1187,7 +1187,7 @@ static ssize_t show_energy_performance_p
|
||||
struct cpufreq_policy *policy, char *buf)
|
||||
{
|
||||
struct amd_cpudata *cpudata = policy->driver_data;
|
||||
- int preference;
|
||||
+ u8 preference;
|
||||
|
||||
switch (cpudata->epp_cached) {
|
||||
case AMD_CPPC_EPP_PERFORMANCE:
|
||||
@@ -1549,7 +1549,7 @@ static void amd_pstate_epp_cpu_exit(stru
|
||||
static int amd_pstate_epp_update_limit(struct cpufreq_policy *policy)
|
||||
{
|
||||
struct amd_cpudata *cpudata = policy->driver_data;
|
||||
- u32 epp;
|
||||
+ u8 epp;
|
||||
|
||||
amd_pstate_update_min_max_limit(policy);
|
||||
|
||||
@@ -1598,7 +1598,7 @@ static int amd_pstate_epp_set_policy(str
|
||||
static int amd_pstate_epp_reenable(struct cpufreq_policy *policy)
|
||||
{
|
||||
struct amd_cpudata *cpudata = policy->driver_data;
|
||||
- u64 max_perf;
|
||||
+ u8 max_perf;
|
||||
int ret;
|
||||
|
||||
ret = amd_pstate_cppc_enable(true);
|
||||
@@ -1635,7 +1635,7 @@ static int amd_pstate_epp_cpu_online(str
|
||||
static int amd_pstate_epp_cpu_offline(struct cpufreq_policy *policy)
|
||||
{
|
||||
struct amd_cpudata *cpudata = policy->driver_data;
|
||||
- int min_perf;
|
||||
+ u8 min_perf;
|
||||
|
||||
if (cpudata->suspended)
|
||||
return 0;
|
||||
--- a/drivers/cpufreq/amd-pstate.h
|
||||
+++ b/drivers/cpufreq/amd-pstate.h
|
||||
@@ -70,13 +70,13 @@ struct amd_cpudata {
|
||||
struct freq_qos_request req[2];
|
||||
u64 cppc_req_cached;
|
||||
|
||||
- u32 highest_perf;
|
||||
- u32 nominal_perf;
|
||||
- u32 lowest_nonlinear_perf;
|
||||
- u32 lowest_perf;
|
||||
- u32 prefcore_ranking;
|
||||
- u32 min_limit_perf;
|
||||
- u32 max_limit_perf;
|
||||
+ u8 highest_perf;
|
||||
+ u8 nominal_perf;
|
||||
+ u8 lowest_nonlinear_perf;
|
||||
+ u8 lowest_perf;
|
||||
+ u8 prefcore_ranking;
|
||||
+ u8 min_limit_perf;
|
||||
+ u8 max_limit_perf;
|
||||
u32 min_limit_freq;
|
||||
u32 max_limit_freq;
|
||||
|
||||
@@ -93,11 +93,11 @@ struct amd_cpudata {
|
||||
bool hw_prefcore;
|
||||
|
||||
/* EPP feature related attributes*/
|
||||
- s16 epp_cached;
|
||||
+ u8 epp_cached;
|
||||
u32 policy;
|
||||
u64 cppc_cap1_cached;
|
||||
bool suspended;
|
||||
- s16 epp_default;
|
||||
+ u8 epp_default;
|
||||
};
|
||||
|
||||
/*
|
131
debian/patches/patchset-pf/amd-pstate/0005-cpufreq-amd-pstate-Modularize-perf-freq-conversion.patch
vendored
Normal file
131
debian/patches/patchset-pf/amd-pstate/0005-cpufreq-amd-pstate-Modularize-perf-freq-conversion.patch
vendored
Normal file
@ -0,0 +1,131 @@
|
||||
From 8b87350a2e336e54b4d2638ac042bb2f7416312a Mon Sep 17 00:00:00 2001
|
||||
From: Dhananjay Ugwekar <dhananjay.ugwekar@amd.com>
|
||||
Date: Wed, 5 Feb 2025 11:25:18 +0000
|
||||
Subject: cpufreq/amd-pstate: Modularize perf<->freq conversion
|
||||
|
||||
Delegate the perf<->frequency conversion to helper functions to reduce
|
||||
code duplication, and improve readability.
|
||||
|
||||
Signed-off-by: Dhananjay Ugwekar <dhananjay.ugwekar@amd.com>
|
||||
Reviewed-by: Mario Limonciello <mario.limonciello@amd.com>
|
||||
---
|
||||
drivers/cpufreq/amd-pstate.c | 57 +++++++++++++++++++-----------------
|
||||
1 file changed, 30 insertions(+), 27 deletions(-)
|
||||
|
||||
--- a/drivers/cpufreq/amd-pstate.c
|
||||
+++ b/drivers/cpufreq/amd-pstate.c
|
||||
@@ -142,6 +142,20 @@ static struct quirk_entry quirk_amd_7k62
|
||||
.lowest_freq = 550,
|
||||
};
|
||||
|
||||
+static inline u8 freq_to_perf(struct amd_cpudata *cpudata, unsigned int freq_val)
|
||||
+{
|
||||
+ u8 perf_val = DIV_ROUND_UP_ULL((u64)freq_val * cpudata->nominal_perf,
|
||||
+ cpudata->nominal_freq);
|
||||
+
|
||||
+ return clamp_t(u8, perf_val, cpudata->lowest_perf, cpudata->highest_perf);
|
||||
+}
|
||||
+
|
||||
+static inline u32 perf_to_freq(struct amd_cpudata *cpudata, u8 perf_val)
|
||||
+{
|
||||
+ return DIV_ROUND_UP_ULL((u64)cpudata->nominal_freq * perf_val,
|
||||
+ cpudata->nominal_perf);
|
||||
+}
|
||||
+
|
||||
static int __init dmi_matched_7k62_bios_bug(const struct dmi_system_id *dmi)
|
||||
{
|
||||
/**
|
||||
@@ -534,14 +548,12 @@ static inline bool amd_pstate_sample(str
|
||||
static void amd_pstate_update(struct amd_cpudata *cpudata, u8 min_perf,
|
||||
u8 des_perf, u8 max_perf, bool fast_switch, int gov_flags)
|
||||
{
|
||||
- unsigned long max_freq;
|
||||
struct cpufreq_policy *policy = cpufreq_cpu_get(cpudata->cpu);
|
||||
u8 nominal_perf = READ_ONCE(cpudata->nominal_perf);
|
||||
|
||||
des_perf = clamp_t(u8, des_perf, min_perf, max_perf);
|
||||
|
||||
- max_freq = READ_ONCE(cpudata->max_limit_freq);
|
||||
- policy->cur = div_u64(des_perf * max_freq, max_perf);
|
||||
+ policy->cur = perf_to_freq(cpudata, des_perf);
|
||||
|
||||
if ((cppc_state == AMD_PSTATE_GUIDED) && (gov_flags & CPUFREQ_GOV_DYNAMIC_SWITCHING)) {
|
||||
min_perf = des_perf;
|
||||
@@ -591,14 +603,11 @@ static int amd_pstate_verify(struct cpuf
|
||||
|
||||
static int amd_pstate_update_min_max_limit(struct cpufreq_policy *policy)
|
||||
{
|
||||
- u8 max_limit_perf, min_limit_perf, max_perf;
|
||||
- u32 max_freq;
|
||||
+ u8 max_limit_perf, min_limit_perf;
|
||||
struct amd_cpudata *cpudata = policy->driver_data;
|
||||
|
||||
- max_perf = READ_ONCE(cpudata->highest_perf);
|
||||
- max_freq = READ_ONCE(cpudata->max_freq);
|
||||
- max_limit_perf = div_u64(policy->max * max_perf, max_freq);
|
||||
- min_limit_perf = div_u64(policy->min * max_perf, max_freq);
|
||||
+ max_limit_perf = freq_to_perf(cpudata, policy->max);
|
||||
+ min_limit_perf = freq_to_perf(cpudata, policy->min);
|
||||
|
||||
if (cpudata->policy == CPUFREQ_POLICY_PERFORMANCE)
|
||||
min_limit_perf = min(cpudata->nominal_perf, max_limit_perf);
|
||||
@@ -616,21 +625,15 @@ static int amd_pstate_update_freq(struct
|
||||
{
|
||||
struct cpufreq_freqs freqs;
|
||||
struct amd_cpudata *cpudata = policy->driver_data;
|
||||
- u8 des_perf, cap_perf;
|
||||
-
|
||||
- if (!cpudata->max_freq)
|
||||
- return -ENODEV;
|
||||
+ u8 des_perf;
|
||||
|
||||
if (policy->min != cpudata->min_limit_freq || policy->max != cpudata->max_limit_freq)
|
||||
amd_pstate_update_min_max_limit(policy);
|
||||
|
||||
- cap_perf = READ_ONCE(cpudata->highest_perf);
|
||||
-
|
||||
freqs.old = policy->cur;
|
||||
freqs.new = target_freq;
|
||||
|
||||
- des_perf = DIV_ROUND_CLOSEST(target_freq * cap_perf,
|
||||
- cpudata->max_freq);
|
||||
+ des_perf = freq_to_perf(cpudata, target_freq);
|
||||
|
||||
WARN_ON(fast_switch && !policy->fast_switch_enabled);
|
||||
/*
|
||||
@@ -905,7 +908,6 @@ static int amd_pstate_init_freq(struct a
|
||||
{
|
||||
int ret;
|
||||
u32 min_freq, max_freq;
|
||||
- u8 highest_perf, nominal_perf, lowest_nonlinear_perf;
|
||||
u32 nominal_freq, lowest_nonlinear_freq;
|
||||
struct cppc_perf_caps cppc_perf;
|
||||
|
||||
@@ -923,16 +925,17 @@ static int amd_pstate_init_freq(struct a
|
||||
else
|
||||
nominal_freq = cppc_perf.nominal_freq;
|
||||
|
||||
- highest_perf = READ_ONCE(cpudata->highest_perf);
|
||||
- nominal_perf = READ_ONCE(cpudata->nominal_perf);
|
||||
- max_freq = div_u64((u64)highest_perf * nominal_freq, nominal_perf);
|
||||
-
|
||||
- lowest_nonlinear_perf = READ_ONCE(cpudata->lowest_nonlinear_perf);
|
||||
- lowest_nonlinear_freq = div_u64((u64)nominal_freq * lowest_nonlinear_perf, nominal_perf);
|
||||
- WRITE_ONCE(cpudata->min_freq, min_freq * 1000);
|
||||
- WRITE_ONCE(cpudata->lowest_nonlinear_freq, lowest_nonlinear_freq * 1000);
|
||||
- WRITE_ONCE(cpudata->nominal_freq, nominal_freq * 1000);
|
||||
- WRITE_ONCE(cpudata->max_freq, max_freq * 1000);
|
||||
+ min_freq *= 1000;
|
||||
+ nominal_freq *= 1000;
|
||||
+
|
||||
+ WRITE_ONCE(cpudata->nominal_freq, nominal_freq);
|
||||
+ WRITE_ONCE(cpudata->min_freq, min_freq);
|
||||
+
|
||||
+ max_freq = perf_to_freq(cpudata, cpudata->highest_perf);
|
||||
+ lowest_nonlinear_freq = perf_to_freq(cpudata, cpudata->lowest_nonlinear_perf);
|
||||
+
|
||||
+ WRITE_ONCE(cpudata->lowest_nonlinear_freq, lowest_nonlinear_freq);
|
||||
+ WRITE_ONCE(cpudata->max_freq, max_freq);
|
||||
|
||||
/**
|
||||
* Below values need to be initialized correctly, otherwise driver will fail to load
|
37
debian/patches/patchset-pf/amd-pstate/0006-cpufreq-amd-pstate-Remove-the-unnecessary-cpufreq_up.patch
vendored
Normal file
37
debian/patches/patchset-pf/amd-pstate/0006-cpufreq-amd-pstate-Remove-the-unnecessary-cpufreq_up.patch
vendored
Normal file
@ -0,0 +1,37 @@
|
||||
From b638a74c3b16e0781bb25478c135726862c9271d Mon Sep 17 00:00:00 2001
|
||||
From: Dhananjay Ugwekar <dhananjay.ugwekar@amd.com>
|
||||
Date: Wed, 5 Feb 2025 11:25:19 +0000
|
||||
Subject: cpufreq/amd-pstate: Remove the unnecessary cpufreq_update_policy call
|
||||
|
||||
The update_limits callback is only called in two conditions.
|
||||
|
||||
* When the preferred core rankings change. In which case, we just need to
|
||||
change the prefcore ranking in the cpudata struct. As there are no changes
|
||||
to any of the perf values, there is no need to call cpufreq_update_policy()
|
||||
|
||||
* When the _PPC ACPI object changes, i.e. the highest allowed Pstate
|
||||
changes. The _PPC object is only used for a table based cpufreq driver
|
||||
like acpi-cpufreq, hence is irrelevant for CPPC based amd-pstate.
|
||||
|
||||
Hence, the cpufreq_update_policy() call becomes unnecessary and can be
|
||||
removed.
|
||||
|
||||
Signed-off-by: Dhananjay Ugwekar <dhananjay.ugwekar@amd.com>
|
||||
Reviewed-by: Mario Limonciello <mario.limonciello@amd.com>
|
||||
---
|
||||
drivers/cpufreq/amd-pstate.c | 4 ----
|
||||
1 file changed, 4 deletions(-)
|
||||
|
||||
--- a/drivers/cpufreq/amd-pstate.c
|
||||
+++ b/drivers/cpufreq/amd-pstate.c
|
||||
@@ -853,10 +853,6 @@ static void amd_pstate_update_limits(uns
|
||||
sched_set_itmt_core_prio((int)cur_high, cpu);
|
||||
}
|
||||
cpufreq_cpu_put(policy);
|
||||
-
|
||||
- if (!highest_perf_changed)
|
||||
- cpufreq_update_policy(cpu);
|
||||
-
|
||||
}
|
||||
|
||||
/*
|
26
debian/patches/patchset-pf/amd-pstate/0007-cpufreq-amd-pstate-Add-missing-NULL-ptr-check-in-amd.patch
vendored
Normal file
26
debian/patches/patchset-pf/amd-pstate/0007-cpufreq-amd-pstate-Add-missing-NULL-ptr-check-in-amd.patch
vendored
Normal file
@ -0,0 +1,26 @@
|
||||
From 156278367fd2c0863dc06f9a7df0a654ae336726 Mon Sep 17 00:00:00 2001
|
||||
From: Dhananjay Ugwekar <dhananjay.ugwekar@amd.com>
|
||||
Date: Wed, 5 Feb 2025 11:25:21 +0000
|
||||
Subject: cpufreq/amd-pstate: Add missing NULL ptr check in amd_pstate_update
|
||||
|
||||
Check if policy is NULL before dereferencing it in amd_pstate_update.
|
||||
|
||||
Fixes: e8f555daacd3 ("cpufreq/amd-pstate: fix setting policy current frequency value")
|
||||
Signed-off-by: Dhananjay Ugwekar <dhananjay.ugwekar@amd.com>
|
||||
Reviewed-by: Mario Limonciello <mario.limonciello@amd.com>
|
||||
---
|
||||
drivers/cpufreq/amd-pstate.c | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
--- a/drivers/cpufreq/amd-pstate.c
|
||||
+++ b/drivers/cpufreq/amd-pstate.c
|
||||
@@ -551,6 +551,9 @@ static void amd_pstate_update(struct amd
|
||||
struct cpufreq_policy *policy = cpufreq_cpu_get(cpudata->cpu);
|
||||
u8 nominal_perf = READ_ONCE(cpudata->nominal_perf);
|
||||
|
||||
+ if (!policy)
|
||||
+ return;
|
||||
+
|
||||
des_perf = clamp_t(u8, des_perf, min_perf, max_perf);
|
||||
|
||||
policy->cur = perf_to_freq(cpudata, des_perf);
|
124
debian/patches/patchset-pf/amd-pstate/0008-cpufreq-amd-pstate-Use-scope-based-cleanup-for-cpufr.patch
vendored
Normal file
124
debian/patches/patchset-pf/amd-pstate/0008-cpufreq-amd-pstate-Use-scope-based-cleanup-for-cpufr.patch
vendored
Normal file
@ -0,0 +1,124 @@
|
||||
From e36868a11daa43eff94abd32f19b1783e89298d4 Mon Sep 17 00:00:00 2001
|
||||
From: Dhananjay Ugwekar <dhananjay.ugwekar@amd.com>
|
||||
Date: Wed, 5 Feb 2025 11:25:22 +0000
|
||||
Subject: cpufreq/amd-pstate: Use scope based cleanup for cpufreq_policy refs
|
||||
|
||||
There have been instances in past where refcount decrementing is missed
|
||||
while exiting a function. Use automatic scope based cleanup to avoid
|
||||
such errors.
|
||||
|
||||
Signed-off-by: Dhananjay Ugwekar <dhananjay.ugwekar@amd.com>
|
||||
Reviewed-by: Mario Limonciello <mario.limonciello@amd.com>
|
||||
---
|
||||
drivers/cpufreq/amd-pstate.c | 25 ++++++++-----------------
|
||||
include/linux/cpufreq.h | 3 +++
|
||||
2 files changed, 11 insertions(+), 17 deletions(-)
|
||||
|
||||
--- a/drivers/cpufreq/amd-pstate.c
|
||||
+++ b/drivers/cpufreq/amd-pstate.c
|
||||
@@ -548,7 +548,7 @@ static inline bool amd_pstate_sample(str
|
||||
static void amd_pstate_update(struct amd_cpudata *cpudata, u8 min_perf,
|
||||
u8 des_perf, u8 max_perf, bool fast_switch, int gov_flags)
|
||||
{
|
||||
- struct cpufreq_policy *policy = cpufreq_cpu_get(cpudata->cpu);
|
||||
+ struct cpufreq_policy *policy __free(put_cpufreq_policy) = cpufreq_cpu_get(cpudata->cpu);
|
||||
u8 nominal_perf = READ_ONCE(cpudata->nominal_perf);
|
||||
|
||||
if (!policy)
|
||||
@@ -574,8 +574,6 @@ static void amd_pstate_update(struct amd
|
||||
}
|
||||
|
||||
amd_pstate_update_perf(cpudata, min_perf, des_perf, max_perf, 0, fast_switch);
|
||||
-
|
||||
- cpufreq_cpu_put(policy);
|
||||
}
|
||||
|
||||
static int amd_pstate_verify(struct cpufreq_policy_data *policy_data)
|
||||
@@ -587,7 +585,8 @@ static int amd_pstate_verify(struct cpuf
|
||||
* amd-pstate qos_requests.
|
||||
*/
|
||||
if (policy_data->min == FREQ_QOS_MIN_DEFAULT_VALUE) {
|
||||
- struct cpufreq_policy *policy = cpufreq_cpu_get(policy_data->cpu);
|
||||
+ struct cpufreq_policy *policy __free(put_cpufreq_policy) =
|
||||
+ cpufreq_cpu_get(policy_data->cpu);
|
||||
struct amd_cpudata *cpudata;
|
||||
|
||||
if (!policy)
|
||||
@@ -595,7 +594,6 @@ static int amd_pstate_verify(struct cpuf
|
||||
|
||||
cpudata = policy->driver_data;
|
||||
policy_data->min = cpudata->lowest_nonlinear_freq;
|
||||
- cpufreq_cpu_put(policy);
|
||||
}
|
||||
|
||||
cpufreq_verify_within_cpu_limits(policy_data);
|
||||
@@ -678,7 +676,7 @@ static void amd_pstate_adjust_perf(unsig
|
||||
unsigned long capacity)
|
||||
{
|
||||
u8 max_perf, min_perf, des_perf, cap_perf, min_limit_perf;
|
||||
- struct cpufreq_policy *policy = cpufreq_cpu_get(cpu);
|
||||
+ struct cpufreq_policy *policy __free(put_cpufreq_policy) = cpufreq_cpu_get(cpu);
|
||||
struct amd_cpudata *cpudata;
|
||||
|
||||
if (!policy)
|
||||
@@ -710,7 +708,6 @@ static void amd_pstate_adjust_perf(unsig
|
||||
|
||||
amd_pstate_update(cpudata, min_perf, des_perf, max_perf, true,
|
||||
policy->governor->flags);
|
||||
- cpufreq_cpu_put(policy);
|
||||
}
|
||||
|
||||
static int amd_pstate_cpu_boost_update(struct cpufreq_policy *policy, bool on)
|
||||
@@ -824,28 +821,23 @@ static void amd_pstate_init_prefcore(str
|
||||
|
||||
static void amd_pstate_update_limits(unsigned int cpu)
|
||||
{
|
||||
- struct cpufreq_policy *policy = NULL;
|
||||
+ struct cpufreq_policy *policy __free(put_cpufreq_policy) = cpufreq_cpu_get(cpu);
|
||||
struct amd_cpudata *cpudata;
|
||||
u32 prev_high = 0, cur_high = 0;
|
||||
- int ret;
|
||||
bool highest_perf_changed = false;
|
||||
|
||||
if (!amd_pstate_prefcore)
|
||||
return;
|
||||
|
||||
- policy = cpufreq_cpu_get(cpu);
|
||||
if (!policy)
|
||||
return;
|
||||
|
||||
- cpudata = policy->driver_data;
|
||||
-
|
||||
guard(mutex)(&amd_pstate_driver_lock);
|
||||
|
||||
- ret = amd_get_highest_perf(cpu, &cur_high);
|
||||
- if (ret) {
|
||||
- cpufreq_cpu_put(policy);
|
||||
+ if (amd_get_highest_perf(cpu, &cur_high))
|
||||
return;
|
||||
- }
|
||||
+
|
||||
+ cpudata = policy->driver_data;
|
||||
|
||||
prev_high = READ_ONCE(cpudata->prefcore_ranking);
|
||||
highest_perf_changed = (prev_high != cur_high);
|
||||
@@ -855,7 +847,6 @@ static void amd_pstate_update_limits(uns
|
||||
if (cur_high < CPPC_MAX_PERF)
|
||||
sched_set_itmt_core_prio((int)cur_high, cpu);
|
||||
}
|
||||
- cpufreq_cpu_put(policy);
|
||||
}
|
||||
|
||||
/*
|
||||
--- a/include/linux/cpufreq.h
|
||||
+++ b/include/linux/cpufreq.h
|
||||
@@ -210,6 +210,9 @@ static inline struct cpufreq_policy *cpu
|
||||
static inline void cpufreq_cpu_put(struct cpufreq_policy *policy) { }
|
||||
#endif
|
||||
|
||||
+/* Scope based cleanup macro for cpufreq_policy kobject reference counting */
|
||||
+DEFINE_FREE(put_cpufreq_policy, struct cpufreq_policy *, if (_T) cpufreq_cpu_put(_T))
|
||||
+
|
||||
static inline bool policy_is_inactive(struct cpufreq_policy *policy)
|
||||
{
|
||||
return cpumask_empty(policy->cpus);
|
26
debian/patches/patchset-pf/amd-pstate/0009-cpufreq-amd-pstate-Remove-the-unncecessary-driver_lo.patch
vendored
Normal file
26
debian/patches/patchset-pf/amd-pstate/0009-cpufreq-amd-pstate-Remove-the-unncecessary-driver_lo.patch
vendored
Normal file
@ -0,0 +1,26 @@
|
||||
From 9b7b7d59c5425246ffda281e761ef3ec3b0e4fbc Mon Sep 17 00:00:00 2001
|
||||
From: Dhananjay Ugwekar <dhananjay.ugwekar@amd.com>
|
||||
Date: Wed, 5 Feb 2025 11:25:23 +0000
|
||||
Subject: cpufreq/amd-pstate: Remove the unncecessary driver_lock in
|
||||
amd_pstate_update_limits
|
||||
|
||||
There is no need to take a driver wide lock while updating the
|
||||
highest_perf value in the percpu cpudata struct. Hence remove it.
|
||||
|
||||
Signed-off-by: Dhananjay Ugwekar <dhananjay.ugwekar@amd.com>
|
||||
Reviewed-by: Mario Limonciello <mario.limonciello@amd.com>
|
||||
---
|
||||
drivers/cpufreq/amd-pstate.c | 2 --
|
||||
1 file changed, 2 deletions(-)
|
||||
|
||||
--- a/drivers/cpufreq/amd-pstate.c
|
||||
+++ b/drivers/cpufreq/amd-pstate.c
|
||||
@@ -832,8 +832,6 @@ static void amd_pstate_update_limits(uns
|
||||
if (!policy)
|
||||
return;
|
||||
|
||||
- guard(mutex)(&amd_pstate_driver_lock);
|
||||
-
|
||||
if (amd_get_highest_perf(cpu, &cur_high))
|
||||
return;
|
||||
|
35
debian/patches/patchset-pf/amd-pstate/0010-cpufreq-amd-pstate-Fix-the-clamping-of-perf-values.patch
vendored
Normal file
35
debian/patches/patchset-pf/amd-pstate/0010-cpufreq-amd-pstate-Fix-the-clamping-of-perf-values.patch
vendored
Normal file
@ -0,0 +1,35 @@
|
||||
From f09ef5b8aacd5b16ac1ea93103b41a7e88b174ed Mon Sep 17 00:00:00 2001
|
||||
From: Dhananjay Ugwekar <dhananjay.ugwekar@amd.com>
|
||||
Date: Sat, 22 Feb 2025 03:32:22 +0000
|
||||
Subject: cpufreq/amd-pstate: Fix the clamping of perf values
|
||||
|
||||
The clamping in freq_to_perf() is broken right now, as we first typecast
|
||||
(read wraparound) the overflowing value into a u8 and then clamp it down.
|
||||
So, use a u32 to store the >255 value in certain edge cases and then clamp
|
||||
it down into a u8.
|
||||
|
||||
Also, use a "explicit typecast + clamp" instead of just a "clamp_t" as the
|
||||
latter typecasts first and then clamps between the limits, which defeats
|
||||
our purpose.
|
||||
|
||||
Fixes: 305621eb6a8b ("cpufreq/amd-pstate: Modularize perf<->freq conversion")
|
||||
Signed-off-by: Dhananjay Ugwekar <dhananjay.ugwekar@amd.com>
|
||||
---
|
||||
drivers/cpufreq/amd-pstate.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/cpufreq/amd-pstate.c
|
||||
+++ b/drivers/cpufreq/amd-pstate.c
|
||||
@@ -144,10 +144,10 @@ static struct quirk_entry quirk_amd_7k62
|
||||
|
||||
static inline u8 freq_to_perf(struct amd_cpudata *cpudata, unsigned int freq_val)
|
||||
{
|
||||
- u8 perf_val = DIV_ROUND_UP_ULL((u64)freq_val * cpudata->nominal_perf,
|
||||
+ u32 perf_val = DIV_ROUND_UP_ULL((u64)freq_val * cpudata->nominal_perf,
|
||||
cpudata->nominal_freq);
|
||||
|
||||
- return clamp_t(u8, perf_val, cpudata->lowest_perf, cpudata->highest_perf);
|
||||
+ return (u8)clamp(perf_val, cpudata->lowest_perf, cpudata->highest_perf);
|
||||
}
|
||||
|
||||
static inline u32 perf_to_freq(struct amd_cpudata *cpudata, u8 perf_val)
|
42
debian/patches/patchset-pf/amd-pstate/0011-cpufreq-amd-pstate-Invalidate-cppc_req_cached-during.patch
vendored
Normal file
42
debian/patches/patchset-pf/amd-pstate/0011-cpufreq-amd-pstate-Invalidate-cppc_req_cached-during.patch
vendored
Normal file
@ -0,0 +1,42 @@
|
||||
From 210d043d7b244588c911e355f2d5339bda9c8209 Mon Sep 17 00:00:00 2001
|
||||
From: Mario Limonciello <mario.limonciello@amd.com>
|
||||
Date: Wed, 26 Feb 2025 01:49:16 -0600
|
||||
Subject: cpufreq/amd-pstate: Invalidate cppc_req_cached during suspend
|
||||
|
||||
During resume it's possible the firmware didn't restore the CPPC request
|
||||
MSR but the kernel thinks the values line up. This leads to incorrect
|
||||
performance after resume from suspend.
|
||||
|
||||
To fix the issue invalidate the cached value at suspend. During resume use
|
||||
the saved values programmed as cached limits.
|
||||
|
||||
Reviewed-by: Gautham R. Shenoy <gautham.shenoy@amd.com>
|
||||
Reviewed-by: Dhananjay Ugwekar <dhananjay.ugwekar@amd.com>
|
||||
Reported-by: Miroslav Pavleski <miroslav@pavleski.net>
|
||||
Closes: https://bugzilla.kernel.org/show_bug.cgi?id=217931
|
||||
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
|
||||
---
|
||||
drivers/cpufreq/amd-pstate.c | 5 ++++-
|
||||
1 file changed, 4 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/cpufreq/amd-pstate.c
|
||||
+++ b/drivers/cpufreq/amd-pstate.c
|
||||
@@ -1605,7 +1605,7 @@ static int amd_pstate_epp_reenable(struc
|
||||
max_perf, policy->boost_enabled);
|
||||
}
|
||||
|
||||
- return amd_pstate_update_perf(cpudata, 0, 0, max_perf, cpudata->epp_cached, false);
|
||||
+ return amd_pstate_epp_update_limit(policy);
|
||||
}
|
||||
|
||||
static int amd_pstate_epp_cpu_online(struct cpufreq_policy *policy)
|
||||
@@ -1654,6 +1654,9 @@ static int amd_pstate_epp_suspend(struct
|
||||
if (cppc_state != AMD_PSTATE_ACTIVE)
|
||||
return 0;
|
||||
|
||||
+ /* invalidate to ensure it's rewritten during resume */
|
||||
+ cpudata->cppc_req_cached = 0;
|
||||
+
|
||||
/* set this flag to avoid setting core offline*/
|
||||
cpudata->suspended = true;
|
||||
|
35
debian/patches/patchset-pf/amd-pstate/0012-cpufreq-amd-pstate-Show-a-warning-when-a-CPU-fails-t.patch
vendored
Normal file
35
debian/patches/patchset-pf/amd-pstate/0012-cpufreq-amd-pstate-Show-a-warning-when-a-CPU-fails-t.patch
vendored
Normal file
@ -0,0 +1,35 @@
|
||||
From a0233b8c2c01e98ddeb2e80768d4c7172311b200 Mon Sep 17 00:00:00 2001
|
||||
From: Mario Limonciello <mario.limonciello@amd.com>
|
||||
Date: Wed, 26 Feb 2025 01:49:17 -0600
|
||||
Subject: cpufreq/amd-pstate: Show a warning when a CPU fails to setup
|
||||
|
||||
I came across a system that MSR_AMD_CPPC_CAP1 for some CPUs isn't
|
||||
populated. This is an unexpected behavior that is most likely a
|
||||
BIOS bug. In the event it happens I'd like users to report bugs
|
||||
to properly root cause and get this fixed.
|
||||
|
||||
Reviewed-by: Gautham R. Shenoy <gautham.shenoy@amd.com>
|
||||
Reviewed-by: Dhananjay Ugwekar <dhananjay.ugwekar@amd.com>
|
||||
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
|
||||
---
|
||||
drivers/cpufreq/amd-pstate.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
--- a/drivers/cpufreq/amd-pstate.c
|
||||
+++ b/drivers/cpufreq/amd-pstate.c
|
||||
@@ -1028,6 +1028,7 @@ static int amd_pstate_cpu_init(struct cp
|
||||
free_cpudata2:
|
||||
freq_qos_remove_request(&cpudata->req[0]);
|
||||
free_cpudata1:
|
||||
+ pr_warn("Failed to initialize CPU %d: %d\n", policy->cpu, ret);
|
||||
kfree(cpudata);
|
||||
return ret;
|
||||
}
|
||||
@@ -1521,6 +1522,7 @@ static int amd_pstate_epp_cpu_init(struc
|
||||
return 0;
|
||||
|
||||
free_cpudata1:
|
||||
+ pr_warn("Failed to initialize CPU %d: %d\n", policy->cpu, ret);
|
||||
kfree(cpudata);
|
||||
return ret;
|
||||
}
|
209
debian/patches/patchset-pf/amd-pstate/0013-cpufreq-amd-pstate-Drop-min-and-max-cached-frequenci.patch
vendored
Normal file
209
debian/patches/patchset-pf/amd-pstate/0013-cpufreq-amd-pstate-Drop-min-and-max-cached-frequenci.patch
vendored
Normal file
@ -0,0 +1,209 @@
|
||||
From ad672c3336331cab028c27e4a73153f517bb1844 Mon Sep 17 00:00:00 2001
|
||||
From: Mario Limonciello <mario.limonciello@amd.com>
|
||||
Date: Wed, 26 Feb 2025 01:49:18 -0600
|
||||
Subject: cpufreq/amd-pstate: Drop min and max cached frequencies
|
||||
|
||||
Use the perf_to_freq helpers to calculate this on the fly.
|
||||
As the members are no longer cached add an extra check into
|
||||
amd_pstate_epp_update_limit() to avoid unnecessary calls in
|
||||
amd_pstate_update_min_max_limit().
|
||||
|
||||
Reviewed-by: Gautham R. Shenoy <gautham.shenoy@amd.com>
|
||||
Reviewed-by: Dhananjay Ugwekar <dhananjay.ugwekar@amd.com>
|
||||
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
|
||||
---
|
||||
drivers/cpufreq/amd-pstate-ut.c | 14 +++++------
|
||||
drivers/cpufreq/amd-pstate.c | 43 +++++++++------------------------
|
||||
drivers/cpufreq/amd-pstate.h | 9 ++-----
|
||||
3 files changed, 20 insertions(+), 46 deletions(-)
|
||||
|
||||
--- a/drivers/cpufreq/amd-pstate-ut.c
|
||||
+++ b/drivers/cpufreq/amd-pstate-ut.c
|
||||
@@ -214,14 +214,14 @@ static void amd_pstate_ut_check_freq(u32
|
||||
break;
|
||||
cpudata = policy->driver_data;
|
||||
|
||||
- if (!((cpudata->max_freq >= cpudata->nominal_freq) &&
|
||||
+ if (!((policy->cpuinfo.max_freq >= cpudata->nominal_freq) &&
|
||||
(cpudata->nominal_freq > cpudata->lowest_nonlinear_freq) &&
|
||||
- (cpudata->lowest_nonlinear_freq > cpudata->min_freq) &&
|
||||
- (cpudata->min_freq > 0))) {
|
||||
+ (cpudata->lowest_nonlinear_freq > policy->cpuinfo.min_freq) &&
|
||||
+ (policy->cpuinfo.min_freq > 0))) {
|
||||
amd_pstate_ut_cases[index].result = AMD_PSTATE_UT_RESULT_FAIL;
|
||||
pr_err("%s cpu%d max=%d >= nominal=%d > lowest_nonlinear=%d > min=%d > 0, the formula is incorrect!\n",
|
||||
- __func__, cpu, cpudata->max_freq, cpudata->nominal_freq,
|
||||
- cpudata->lowest_nonlinear_freq, cpudata->min_freq);
|
||||
+ __func__, cpu, policy->cpuinfo.max_freq, cpudata->nominal_freq,
|
||||
+ cpudata->lowest_nonlinear_freq, policy->cpuinfo.min_freq);
|
||||
goto skip_test;
|
||||
}
|
||||
|
||||
@@ -233,13 +233,13 @@ static void amd_pstate_ut_check_freq(u32
|
||||
}
|
||||
|
||||
if (cpudata->boost_supported) {
|
||||
- if ((policy->max == cpudata->max_freq) ||
|
||||
+ if ((policy->max == policy->cpuinfo.max_freq) ||
|
||||
(policy->max == cpudata->nominal_freq))
|
||||
amd_pstate_ut_cases[index].result = AMD_PSTATE_UT_RESULT_PASS;
|
||||
else {
|
||||
amd_pstate_ut_cases[index].result = AMD_PSTATE_UT_RESULT_FAIL;
|
||||
pr_err("%s cpu%d policy_max=%d should be equal cpu_max=%d or cpu_nominal=%d !\n",
|
||||
- __func__, cpu, policy->max, cpudata->max_freq,
|
||||
+ __func__, cpu, policy->max, policy->cpuinfo.max_freq,
|
||||
cpudata->nominal_freq);
|
||||
goto skip_test;
|
||||
}
|
||||
--- a/drivers/cpufreq/amd-pstate.c
|
||||
+++ b/drivers/cpufreq/amd-pstate.c
|
||||
@@ -717,7 +717,7 @@ static int amd_pstate_cpu_boost_update(s
|
||||
int ret = 0;
|
||||
|
||||
nominal_freq = READ_ONCE(cpudata->nominal_freq);
|
||||
- max_freq = READ_ONCE(cpudata->max_freq);
|
||||
+ max_freq = perf_to_freq(cpudata, READ_ONCE(cpudata->highest_perf));
|
||||
|
||||
if (on)
|
||||
policy->cpuinfo.max_freq = max_freq;
|
||||
@@ -917,13 +917,10 @@ static int amd_pstate_init_freq(struct a
|
||||
nominal_freq *= 1000;
|
||||
|
||||
WRITE_ONCE(cpudata->nominal_freq, nominal_freq);
|
||||
- WRITE_ONCE(cpudata->min_freq, min_freq);
|
||||
|
||||
max_freq = perf_to_freq(cpudata, cpudata->highest_perf);
|
||||
lowest_nonlinear_freq = perf_to_freq(cpudata, cpudata->lowest_nonlinear_perf);
|
||||
-
|
||||
WRITE_ONCE(cpudata->lowest_nonlinear_freq, lowest_nonlinear_freq);
|
||||
- WRITE_ONCE(cpudata->max_freq, max_freq);
|
||||
|
||||
/**
|
||||
* Below values need to be initialized correctly, otherwise driver will fail to load
|
||||
@@ -948,9 +945,9 @@ static int amd_pstate_init_freq(struct a
|
||||
|
||||
static int amd_pstate_cpu_init(struct cpufreq_policy *policy)
|
||||
{
|
||||
- int min_freq, max_freq, ret;
|
||||
- struct device *dev;
|
||||
struct amd_cpudata *cpudata;
|
||||
+ struct device *dev;
|
||||
+ int ret;
|
||||
|
||||
/*
|
||||
* Resetting PERF_CTL_MSR will put the CPU in P0 frequency,
|
||||
@@ -981,17 +978,11 @@ static int amd_pstate_cpu_init(struct cp
|
||||
if (ret)
|
||||
goto free_cpudata1;
|
||||
|
||||
- min_freq = READ_ONCE(cpudata->min_freq);
|
||||
- max_freq = READ_ONCE(cpudata->max_freq);
|
||||
-
|
||||
policy->cpuinfo.transition_latency = amd_pstate_get_transition_latency(policy->cpu);
|
||||
policy->transition_delay_us = amd_pstate_get_transition_delay_us(policy->cpu);
|
||||
|
||||
- policy->min = min_freq;
|
||||
- policy->max = max_freq;
|
||||
-
|
||||
- policy->cpuinfo.min_freq = min_freq;
|
||||
- policy->cpuinfo.max_freq = max_freq;
|
||||
+ policy->cpuinfo.min_freq = policy->min = perf_to_freq(cpudata, cpudata->lowest_perf);
|
||||
+ policy->cpuinfo.max_freq = policy->max = perf_to_freq(cpudata, cpudata->highest_perf);
|
||||
|
||||
policy->boost_enabled = READ_ONCE(cpudata->boost_supported);
|
||||
|
||||
@@ -1015,9 +1006,6 @@ static int amd_pstate_cpu_init(struct cp
|
||||
goto free_cpudata2;
|
||||
}
|
||||
|
||||
- cpudata->max_limit_freq = max_freq;
|
||||
- cpudata->min_limit_freq = min_freq;
|
||||
-
|
||||
policy->driver_data = cpudata;
|
||||
|
||||
if (!current_pstate_driver->adjust_perf)
|
||||
@@ -1075,14 +1063,10 @@ static int amd_pstate_cpu_suspend(struct
|
||||
static ssize_t show_amd_pstate_max_freq(struct cpufreq_policy *policy,
|
||||
char *buf)
|
||||
{
|
||||
- int max_freq;
|
||||
struct amd_cpudata *cpudata = policy->driver_data;
|
||||
|
||||
- max_freq = READ_ONCE(cpudata->max_freq);
|
||||
- if (max_freq < 0)
|
||||
- return max_freq;
|
||||
|
||||
- return sysfs_emit(buf, "%u\n", max_freq);
|
||||
+ return sysfs_emit(buf, "%u\n", perf_to_freq(cpudata, READ_ONCE(cpudata->highest_perf)));
|
||||
}
|
||||
|
||||
static ssize_t show_amd_pstate_lowest_nonlinear_freq(struct cpufreq_policy *policy,
|
||||
@@ -1440,10 +1424,10 @@ static bool amd_pstate_acpi_pm_profile_u
|
||||
|
||||
static int amd_pstate_epp_cpu_init(struct cpufreq_policy *policy)
|
||||
{
|
||||
- int min_freq, max_freq, ret;
|
||||
struct amd_cpudata *cpudata;
|
||||
struct device *dev;
|
||||
u64 value;
|
||||
+ int ret;
|
||||
|
||||
/*
|
||||
* Resetting PERF_CTL_MSR will put the CPU in P0 frequency,
|
||||
@@ -1474,19 +1458,13 @@ static int amd_pstate_epp_cpu_init(struc
|
||||
if (ret)
|
||||
goto free_cpudata1;
|
||||
|
||||
- min_freq = READ_ONCE(cpudata->min_freq);
|
||||
- max_freq = READ_ONCE(cpudata->max_freq);
|
||||
-
|
||||
- policy->cpuinfo.min_freq = min_freq;
|
||||
- policy->cpuinfo.max_freq = max_freq;
|
||||
+ policy->cpuinfo.min_freq = policy->min = perf_to_freq(cpudata, cpudata->lowest_perf);
|
||||
+ policy->cpuinfo.max_freq = policy->max = perf_to_freq(cpudata, cpudata->highest_perf);
|
||||
/* It will be updated by governor */
|
||||
policy->cur = policy->cpuinfo.min_freq;
|
||||
|
||||
policy->driver_data = cpudata;
|
||||
|
||||
- policy->min = policy->cpuinfo.min_freq;
|
||||
- policy->max = policy->cpuinfo.max_freq;
|
||||
-
|
||||
policy->boost_enabled = READ_ONCE(cpudata->boost_supported);
|
||||
|
||||
/*
|
||||
@@ -1544,7 +1522,8 @@ static int amd_pstate_epp_update_limit(s
|
||||
struct amd_cpudata *cpudata = policy->driver_data;
|
||||
u8 epp;
|
||||
|
||||
- amd_pstate_update_min_max_limit(policy);
|
||||
+ if (policy->min != cpudata->min_limit_freq || policy->max != cpudata->max_limit_freq)
|
||||
+ amd_pstate_update_min_max_limit(policy);
|
||||
|
||||
if (cpudata->policy == CPUFREQ_POLICY_PERFORMANCE)
|
||||
epp = 0;
|
||||
--- a/drivers/cpufreq/amd-pstate.h
|
||||
+++ b/drivers/cpufreq/amd-pstate.h
|
||||
@@ -46,8 +46,6 @@ struct amd_aperf_mperf {
|
||||
* @max_limit_perf: Cached value of the performance corresponding to policy->max
|
||||
* @min_limit_freq: Cached value of policy->min (in khz)
|
||||
* @max_limit_freq: Cached value of policy->max (in khz)
|
||||
- * @max_freq: the frequency (in khz) that mapped to highest_perf
|
||||
- * @min_freq: the frequency (in khz) that mapped to lowest_perf
|
||||
* @nominal_freq: the frequency (in khz) that mapped to nominal_perf
|
||||
* @lowest_nonlinear_freq: the frequency (in khz) that mapped to lowest_nonlinear_perf
|
||||
* @cur: Difference of Aperf/Mperf/tsc count between last and current sample
|
||||
@@ -77,11 +75,8 @@ struct amd_cpudata {
|
||||
u8 prefcore_ranking;
|
||||
u8 min_limit_perf;
|
||||
u8 max_limit_perf;
|
||||
- u32 min_limit_freq;
|
||||
- u32 max_limit_freq;
|
||||
-
|
||||
- u32 max_freq;
|
||||
- u32 min_freq;
|
||||
+ u32 min_limit_freq;
|
||||
+ u32 max_limit_freq;
|
||||
u32 nominal_freq;
|
||||
u32 lowest_nonlinear_freq;
|
||||
|
611
debian/patches/patchset-pf/amd-pstate/0014-cpufreq-amd-pstate-Move-perf-values-into-a-union.patch
vendored
Normal file
611
debian/patches/patchset-pf/amd-pstate/0014-cpufreq-amd-pstate-Move-perf-values-into-a-union.patch
vendored
Normal file
@ -0,0 +1,611 @@
|
||||
From b96076ada115f25a4944f6f111b22c44a5d1a3cf Mon Sep 17 00:00:00 2001
|
||||
From: Mario Limonciello <mario.limonciello@amd.com>
|
||||
Date: Wed, 26 Feb 2025 01:49:19 -0600
|
||||
Subject: cpufreq/amd-pstate: Move perf values into a union
|
||||
|
||||
By storing perf values in a union all the writes and reads can
|
||||
be done atomically, removing the need for some concurrency protections.
|
||||
|
||||
While making this change, also drop the cached frequency values,
|
||||
using inline helpers to calculate them on demand from perf value.
|
||||
|
||||
Reviewed-by: Gautham R. Shenoy <gautham.shenoy@amd.com>
|
||||
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
|
||||
---
|
||||
drivers/cpufreq/amd-pstate-ut.c | 18 +--
|
||||
drivers/cpufreq/amd-pstate.c | 205 ++++++++++++++++++--------------
|
||||
drivers/cpufreq/amd-pstate.h | 51 +++++---
|
||||
3 files changed, 158 insertions(+), 116 deletions(-)
|
||||
|
||||
--- a/drivers/cpufreq/amd-pstate-ut.c
|
||||
+++ b/drivers/cpufreq/amd-pstate-ut.c
|
||||
@@ -129,6 +129,7 @@ static void amd_pstate_ut_check_perf(u32
|
||||
struct cppc_perf_caps cppc_perf;
|
||||
struct cpufreq_policy *policy = NULL;
|
||||
struct amd_cpudata *cpudata = NULL;
|
||||
+ union perf_cached cur_perf;
|
||||
|
||||
for_each_possible_cpu(cpu) {
|
||||
policy = cpufreq_cpu_get(cpu);
|
||||
@@ -162,19 +163,20 @@ static void amd_pstate_ut_check_perf(u32
|
||||
lowest_perf = AMD_CPPC_LOWEST_PERF(cap1);
|
||||
}
|
||||
|
||||
- if (highest_perf != READ_ONCE(cpudata->highest_perf) && !cpudata->hw_prefcore) {
|
||||
+ cur_perf = READ_ONCE(cpudata->perf);
|
||||
+ if (highest_perf != cur_perf.highest_perf && !cpudata->hw_prefcore) {
|
||||
pr_err("%s cpu%d highest=%d %d highest perf doesn't match\n",
|
||||
- __func__, cpu, highest_perf, cpudata->highest_perf);
|
||||
+ __func__, cpu, highest_perf, cur_perf.highest_perf);
|
||||
goto skip_test;
|
||||
}
|
||||
- if ((nominal_perf != READ_ONCE(cpudata->nominal_perf)) ||
|
||||
- (lowest_nonlinear_perf != READ_ONCE(cpudata->lowest_nonlinear_perf)) ||
|
||||
- (lowest_perf != READ_ONCE(cpudata->lowest_perf))) {
|
||||
+ if (nominal_perf != cur_perf.nominal_perf ||
|
||||
+ (lowest_nonlinear_perf != cur_perf.lowest_nonlinear_perf) ||
|
||||
+ (lowest_perf != cur_perf.lowest_perf)) {
|
||||
amd_pstate_ut_cases[index].result = AMD_PSTATE_UT_RESULT_FAIL;
|
||||
pr_err("%s cpu%d nominal=%d %d lowest_nonlinear=%d %d lowest=%d %d, they should be equal!\n",
|
||||
- __func__, cpu, nominal_perf, cpudata->nominal_perf,
|
||||
- lowest_nonlinear_perf, cpudata->lowest_nonlinear_perf,
|
||||
- lowest_perf, cpudata->lowest_perf);
|
||||
+ __func__, cpu, nominal_perf, cur_perf.nominal_perf,
|
||||
+ lowest_nonlinear_perf, cur_perf.lowest_nonlinear_perf,
|
||||
+ lowest_perf, cur_perf.lowest_perf);
|
||||
goto skip_test;
|
||||
}
|
||||
|
||||
--- a/drivers/cpufreq/amd-pstate.c
|
||||
+++ b/drivers/cpufreq/amd-pstate.c
|
||||
@@ -142,18 +142,17 @@ static struct quirk_entry quirk_amd_7k62
|
||||
.lowest_freq = 550,
|
||||
};
|
||||
|
||||
-static inline u8 freq_to_perf(struct amd_cpudata *cpudata, unsigned int freq_val)
|
||||
+static inline u8 freq_to_perf(union perf_cached perf, u32 nominal_freq, unsigned int freq_val)
|
||||
{
|
||||
- u32 perf_val = DIV_ROUND_UP_ULL((u64)freq_val * cpudata->nominal_perf,
|
||||
- cpudata->nominal_freq);
|
||||
+ u32 perf_val = DIV_ROUND_UP_ULL((u64)freq_val * perf.nominal_perf, nominal_freq);
|
||||
|
||||
- return (u8)clamp(perf_val, cpudata->lowest_perf, cpudata->highest_perf);
|
||||
+ return (u8)clamp(perf_val, perf.lowest_perf, perf.highest_perf);
|
||||
}
|
||||
|
||||
-static inline u32 perf_to_freq(struct amd_cpudata *cpudata, u8 perf_val)
|
||||
+static inline u32 perf_to_freq(union perf_cached perf, u32 nominal_freq, u8 perf_val)
|
||||
{
|
||||
- return DIV_ROUND_UP_ULL((u64)cpudata->nominal_freq * perf_val,
|
||||
- cpudata->nominal_perf);
|
||||
+ return DIV_ROUND_UP_ULL((u64)nominal_freq * perf_val,
|
||||
+ perf.nominal_perf);
|
||||
}
|
||||
|
||||
static int __init dmi_matched_7k62_bios_bug(const struct dmi_system_id *dmi)
|
||||
@@ -347,7 +346,9 @@ static int amd_pstate_set_energy_pref_in
|
||||
}
|
||||
|
||||
if (trace_amd_pstate_epp_perf_enabled()) {
|
||||
- trace_amd_pstate_epp_perf(cpudata->cpu, cpudata->highest_perf,
|
||||
+ union perf_cached perf = READ_ONCE(cpudata->perf);
|
||||
+
|
||||
+ trace_amd_pstate_epp_perf(cpudata->cpu, perf.highest_perf,
|
||||
epp,
|
||||
FIELD_GET(AMD_CPPC_MIN_PERF_MASK, cpudata->cppc_req_cached),
|
||||
FIELD_GET(AMD_CPPC_MAX_PERF_MASK, cpudata->cppc_req_cached),
|
||||
@@ -425,6 +426,7 @@ static inline int amd_pstate_cppc_enable
|
||||
|
||||
static int msr_init_perf(struct amd_cpudata *cpudata)
|
||||
{
|
||||
+ union perf_cached perf = READ_ONCE(cpudata->perf);
|
||||
u64 cap1, numerator;
|
||||
|
||||
int ret = rdmsrl_safe_on_cpu(cpudata->cpu, MSR_AMD_CPPC_CAP1,
|
||||
@@ -436,19 +438,21 @@ static int msr_init_perf(struct amd_cpud
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
- WRITE_ONCE(cpudata->highest_perf, numerator);
|
||||
- WRITE_ONCE(cpudata->max_limit_perf, numerator);
|
||||
- WRITE_ONCE(cpudata->nominal_perf, AMD_CPPC_NOMINAL_PERF(cap1));
|
||||
- WRITE_ONCE(cpudata->lowest_nonlinear_perf, AMD_CPPC_LOWNONLIN_PERF(cap1));
|
||||
- WRITE_ONCE(cpudata->lowest_perf, AMD_CPPC_LOWEST_PERF(cap1));
|
||||
+ perf.highest_perf = numerator;
|
||||
+ perf.max_limit_perf = numerator;
|
||||
+ perf.min_limit_perf = AMD_CPPC_LOWEST_PERF(cap1);
|
||||
+ perf.nominal_perf = AMD_CPPC_NOMINAL_PERF(cap1);
|
||||
+ perf.lowest_nonlinear_perf = AMD_CPPC_LOWNONLIN_PERF(cap1);
|
||||
+ perf.lowest_perf = AMD_CPPC_LOWEST_PERF(cap1);
|
||||
+ WRITE_ONCE(cpudata->perf, perf);
|
||||
WRITE_ONCE(cpudata->prefcore_ranking, AMD_CPPC_HIGHEST_PERF(cap1));
|
||||
- WRITE_ONCE(cpudata->min_limit_perf, AMD_CPPC_LOWEST_PERF(cap1));
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int shmem_init_perf(struct amd_cpudata *cpudata)
|
||||
{
|
||||
struct cppc_perf_caps cppc_perf;
|
||||
+ union perf_cached perf = READ_ONCE(cpudata->perf);
|
||||
u64 numerator;
|
||||
|
||||
int ret = cppc_get_perf_caps(cpudata->cpu, &cppc_perf);
|
||||
@@ -459,14 +463,14 @@ static int shmem_init_perf(struct amd_cp
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
- WRITE_ONCE(cpudata->highest_perf, numerator);
|
||||
- WRITE_ONCE(cpudata->max_limit_perf, numerator);
|
||||
- WRITE_ONCE(cpudata->nominal_perf, cppc_perf.nominal_perf);
|
||||
- WRITE_ONCE(cpudata->lowest_nonlinear_perf,
|
||||
- cppc_perf.lowest_nonlinear_perf);
|
||||
- WRITE_ONCE(cpudata->lowest_perf, cppc_perf.lowest_perf);
|
||||
+ perf.highest_perf = numerator;
|
||||
+ perf.max_limit_perf = numerator;
|
||||
+ perf.min_limit_perf = cppc_perf.lowest_perf;
|
||||
+ perf.nominal_perf = cppc_perf.nominal_perf;
|
||||
+ perf.lowest_nonlinear_perf = cppc_perf.lowest_nonlinear_perf;
|
||||
+ perf.lowest_perf = cppc_perf.lowest_perf;
|
||||
+ WRITE_ONCE(cpudata->perf, perf);
|
||||
WRITE_ONCE(cpudata->prefcore_ranking, cppc_perf.highest_perf);
|
||||
- WRITE_ONCE(cpudata->min_limit_perf, cppc_perf.lowest_perf);
|
||||
|
||||
if (cppc_state == AMD_PSTATE_ACTIVE)
|
||||
return 0;
|
||||
@@ -549,14 +553,14 @@ static void amd_pstate_update(struct amd
|
||||
u8 des_perf, u8 max_perf, bool fast_switch, int gov_flags)
|
||||
{
|
||||
struct cpufreq_policy *policy __free(put_cpufreq_policy) = cpufreq_cpu_get(cpudata->cpu);
|
||||
- u8 nominal_perf = READ_ONCE(cpudata->nominal_perf);
|
||||
+ union perf_cached perf = READ_ONCE(cpudata->perf);
|
||||
|
||||
if (!policy)
|
||||
return;
|
||||
|
||||
des_perf = clamp_t(u8, des_perf, min_perf, max_perf);
|
||||
|
||||
- policy->cur = perf_to_freq(cpudata, des_perf);
|
||||
+ policy->cur = perf_to_freq(perf, cpudata->nominal_freq, des_perf);
|
||||
|
||||
if ((cppc_state == AMD_PSTATE_GUIDED) && (gov_flags & CPUFREQ_GOV_DYNAMIC_SWITCHING)) {
|
||||
min_perf = des_perf;
|
||||
@@ -565,7 +569,7 @@ static void amd_pstate_update(struct amd
|
||||
|
||||
/* limit the max perf when core performance boost feature is disabled */
|
||||
if (!cpudata->boost_supported)
|
||||
- max_perf = min_t(u8, nominal_perf, max_perf);
|
||||
+ max_perf = min_t(u8, perf.nominal_perf, max_perf);
|
||||
|
||||
if (trace_amd_pstate_perf_enabled() && amd_pstate_sample(cpudata)) {
|
||||
trace_amd_pstate_perf(min_perf, des_perf, max_perf, cpudata->freq,
|
||||
@@ -602,39 +606,41 @@ static int amd_pstate_verify(struct cpuf
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static int amd_pstate_update_min_max_limit(struct cpufreq_policy *policy)
|
||||
+static void amd_pstate_update_min_max_limit(struct cpufreq_policy *policy)
|
||||
{
|
||||
- u8 max_limit_perf, min_limit_perf;
|
||||
struct amd_cpudata *cpudata = policy->driver_data;
|
||||
+ union perf_cached perf = READ_ONCE(cpudata->perf);
|
||||
|
||||
- max_limit_perf = freq_to_perf(cpudata, policy->max);
|
||||
- min_limit_perf = freq_to_perf(cpudata, policy->min);
|
||||
+ perf.max_limit_perf = freq_to_perf(perf, cpudata->nominal_freq, policy->max);
|
||||
+ perf.min_limit_perf = freq_to_perf(perf, cpudata->nominal_freq, policy->min);
|
||||
|
||||
if (cpudata->policy == CPUFREQ_POLICY_PERFORMANCE)
|
||||
- min_limit_perf = min(cpudata->nominal_perf, max_limit_perf);
|
||||
+ perf.min_limit_perf = min(perf.nominal_perf, perf.max_limit_perf);
|
||||
|
||||
- WRITE_ONCE(cpudata->max_limit_perf, max_limit_perf);
|
||||
- WRITE_ONCE(cpudata->min_limit_perf, min_limit_perf);
|
||||
WRITE_ONCE(cpudata->max_limit_freq, policy->max);
|
||||
WRITE_ONCE(cpudata->min_limit_freq, policy->min);
|
||||
-
|
||||
- return 0;
|
||||
+ WRITE_ONCE(cpudata->perf, perf);
|
||||
}
|
||||
|
||||
static int amd_pstate_update_freq(struct cpufreq_policy *policy,
|
||||
unsigned int target_freq, bool fast_switch)
|
||||
{
|
||||
struct cpufreq_freqs freqs;
|
||||
- struct amd_cpudata *cpudata = policy->driver_data;
|
||||
+ struct amd_cpudata *cpudata;
|
||||
+ union perf_cached perf;
|
||||
u8 des_perf;
|
||||
|
||||
+ cpudata = policy->driver_data;
|
||||
+
|
||||
if (policy->min != cpudata->min_limit_freq || policy->max != cpudata->max_limit_freq)
|
||||
amd_pstate_update_min_max_limit(policy);
|
||||
|
||||
+ perf = READ_ONCE(cpudata->perf);
|
||||
+
|
||||
freqs.old = policy->cur;
|
||||
freqs.new = target_freq;
|
||||
|
||||
- des_perf = freq_to_perf(cpudata, target_freq);
|
||||
+ des_perf = freq_to_perf(perf, cpudata->nominal_freq, target_freq);
|
||||
|
||||
WARN_ON(fast_switch && !policy->fast_switch_enabled);
|
||||
/*
|
||||
@@ -645,8 +651,8 @@ static int amd_pstate_update_freq(struct
|
||||
if (!fast_switch)
|
||||
cpufreq_freq_transition_begin(policy, &freqs);
|
||||
|
||||
- amd_pstate_update(cpudata, cpudata->min_limit_perf, des_perf,
|
||||
- cpudata->max_limit_perf, fast_switch,
|
||||
+ amd_pstate_update(cpudata, perf.min_limit_perf, des_perf,
|
||||
+ perf.max_limit_perf, fast_switch,
|
||||
policy->governor->flags);
|
||||
|
||||
if (!fast_switch)
|
||||
@@ -675,9 +681,10 @@ static void amd_pstate_adjust_perf(unsig
|
||||
unsigned long target_perf,
|
||||
unsigned long capacity)
|
||||
{
|
||||
- u8 max_perf, min_perf, des_perf, cap_perf, min_limit_perf;
|
||||
+ u8 max_perf, min_perf, des_perf, cap_perf;
|
||||
struct cpufreq_policy *policy __free(put_cpufreq_policy) = cpufreq_cpu_get(cpu);
|
||||
struct amd_cpudata *cpudata;
|
||||
+ union perf_cached perf;
|
||||
|
||||
if (!policy)
|
||||
return;
|
||||
@@ -687,8 +694,8 @@ static void amd_pstate_adjust_perf(unsig
|
||||
if (policy->min != cpudata->min_limit_freq || policy->max != cpudata->max_limit_freq)
|
||||
amd_pstate_update_min_max_limit(policy);
|
||||
|
||||
- cap_perf = READ_ONCE(cpudata->highest_perf);
|
||||
- min_limit_perf = READ_ONCE(cpudata->min_limit_perf);
|
||||
+ perf = READ_ONCE(cpudata->perf);
|
||||
+ cap_perf = perf.highest_perf;
|
||||
|
||||
des_perf = cap_perf;
|
||||
if (target_perf < capacity)
|
||||
@@ -699,10 +706,10 @@ static void amd_pstate_adjust_perf(unsig
|
||||
else
|
||||
min_perf = cap_perf;
|
||||
|
||||
- if (min_perf < min_limit_perf)
|
||||
- min_perf = min_limit_perf;
|
||||
+ if (min_perf < perf.min_limit_perf)
|
||||
+ min_perf = perf.min_limit_perf;
|
||||
|
||||
- max_perf = cpudata->max_limit_perf;
|
||||
+ max_perf = perf.max_limit_perf;
|
||||
if (max_perf < min_perf)
|
||||
max_perf = min_perf;
|
||||
|
||||
@@ -713,11 +720,12 @@ static void amd_pstate_adjust_perf(unsig
|
||||
static int amd_pstate_cpu_boost_update(struct cpufreq_policy *policy, bool on)
|
||||
{
|
||||
struct amd_cpudata *cpudata = policy->driver_data;
|
||||
+ union perf_cached perf = READ_ONCE(cpudata->perf);
|
||||
u32 nominal_freq, max_freq;
|
||||
int ret = 0;
|
||||
|
||||
nominal_freq = READ_ONCE(cpudata->nominal_freq);
|
||||
- max_freq = perf_to_freq(cpudata, READ_ONCE(cpudata->highest_perf));
|
||||
+ max_freq = perf_to_freq(perf, cpudata->nominal_freq, perf.highest_perf);
|
||||
|
||||
if (on)
|
||||
policy->cpuinfo.max_freq = max_freq;
|
||||
@@ -882,30 +890,30 @@ static u32 amd_pstate_get_transition_lat
|
||||
}
|
||||
|
||||
/*
|
||||
- * amd_pstate_init_freq: Initialize the max_freq, min_freq,
|
||||
- * nominal_freq and lowest_nonlinear_freq for
|
||||
- * the @cpudata object.
|
||||
+ * amd_pstate_init_freq: Initialize the nominal_freq and lowest_nonlinear_freq
|
||||
+ * for the @cpudata object.
|
||||
*
|
||||
- * Requires: highest_perf, lowest_perf, nominal_perf and
|
||||
- * lowest_nonlinear_perf members of @cpudata to be
|
||||
- * initialized.
|
||||
+ * Requires: all perf members of @cpudata to be initialized.
|
||||
*
|
||||
- * Returns 0 on success, non-zero value on failure.
|
||||
+ * Returns 0 on success, non-zero value on failure.
|
||||
*/
|
||||
static int amd_pstate_init_freq(struct amd_cpudata *cpudata)
|
||||
{
|
||||
- int ret;
|
||||
- u32 min_freq, max_freq;
|
||||
- u32 nominal_freq, lowest_nonlinear_freq;
|
||||
+ u32 min_freq, max_freq, nominal_freq, lowest_nonlinear_freq;
|
||||
struct cppc_perf_caps cppc_perf;
|
||||
+ union perf_cached perf;
|
||||
+ int ret;
|
||||
|
||||
ret = cppc_get_perf_caps(cpudata->cpu, &cppc_perf);
|
||||
if (ret)
|
||||
return ret;
|
||||
+ perf = READ_ONCE(cpudata->perf);
|
||||
|
||||
- if (quirks && quirks->lowest_freq)
|
||||
+ if (quirks && quirks->lowest_freq) {
|
||||
min_freq = quirks->lowest_freq;
|
||||
- else
|
||||
+ perf.lowest_perf = freq_to_perf(perf, nominal_freq, min_freq);
|
||||
+ WRITE_ONCE(cpudata->perf, perf);
|
||||
+ } else
|
||||
min_freq = cppc_perf.lowest_freq;
|
||||
|
||||
if (quirks && quirks->nominal_freq)
|
||||
@@ -918,8 +926,8 @@ static int amd_pstate_init_freq(struct a
|
||||
|
||||
WRITE_ONCE(cpudata->nominal_freq, nominal_freq);
|
||||
|
||||
- max_freq = perf_to_freq(cpudata, cpudata->highest_perf);
|
||||
- lowest_nonlinear_freq = perf_to_freq(cpudata, cpudata->lowest_nonlinear_perf);
|
||||
+ max_freq = perf_to_freq(perf, nominal_freq, perf.highest_perf);
|
||||
+ lowest_nonlinear_freq = perf_to_freq(perf, nominal_freq, perf.lowest_nonlinear_perf);
|
||||
WRITE_ONCE(cpudata->lowest_nonlinear_freq, lowest_nonlinear_freq);
|
||||
|
||||
/**
|
||||
@@ -946,6 +954,7 @@ static int amd_pstate_init_freq(struct a
|
||||
static int amd_pstate_cpu_init(struct cpufreq_policy *policy)
|
||||
{
|
||||
struct amd_cpudata *cpudata;
|
||||
+ union perf_cached perf;
|
||||
struct device *dev;
|
||||
int ret;
|
||||
|
||||
@@ -981,8 +990,14 @@ static int amd_pstate_cpu_init(struct cp
|
||||
policy->cpuinfo.transition_latency = amd_pstate_get_transition_latency(policy->cpu);
|
||||
policy->transition_delay_us = amd_pstate_get_transition_delay_us(policy->cpu);
|
||||
|
||||
- policy->cpuinfo.min_freq = policy->min = perf_to_freq(cpudata, cpudata->lowest_perf);
|
||||
- policy->cpuinfo.max_freq = policy->max = perf_to_freq(cpudata, cpudata->highest_perf);
|
||||
+ perf = READ_ONCE(cpudata->perf);
|
||||
+
|
||||
+ policy->cpuinfo.min_freq = policy->min = perf_to_freq(perf,
|
||||
+ cpudata->nominal_freq,
|
||||
+ perf.lowest_perf);
|
||||
+ policy->cpuinfo.max_freq = policy->max = perf_to_freq(perf,
|
||||
+ cpudata->nominal_freq,
|
||||
+ perf.highest_perf);
|
||||
|
||||
policy->boost_enabled = READ_ONCE(cpudata->boost_supported);
|
||||
|
||||
@@ -1063,23 +1078,27 @@ static int amd_pstate_cpu_suspend(struct
|
||||
static ssize_t show_amd_pstate_max_freq(struct cpufreq_policy *policy,
|
||||
char *buf)
|
||||
{
|
||||
- struct amd_cpudata *cpudata = policy->driver_data;
|
||||
+ struct amd_cpudata *cpudata;
|
||||
+ union perf_cached perf;
|
||||
|
||||
+ cpudata = policy->driver_data;
|
||||
+ perf = READ_ONCE(cpudata->perf);
|
||||
|
||||
- return sysfs_emit(buf, "%u\n", perf_to_freq(cpudata, READ_ONCE(cpudata->highest_perf)));
|
||||
+ return sysfs_emit(buf, "%u\n",
|
||||
+ perf_to_freq(perf, cpudata->nominal_freq, perf.highest_perf));
|
||||
}
|
||||
|
||||
static ssize_t show_amd_pstate_lowest_nonlinear_freq(struct cpufreq_policy *policy,
|
||||
char *buf)
|
||||
{
|
||||
- int freq;
|
||||
- struct amd_cpudata *cpudata = policy->driver_data;
|
||||
+ struct amd_cpudata *cpudata;
|
||||
+ union perf_cached perf;
|
||||
|
||||
- freq = READ_ONCE(cpudata->lowest_nonlinear_freq);
|
||||
- if (freq < 0)
|
||||
- return freq;
|
||||
+ cpudata = policy->driver_data;
|
||||
+ perf = READ_ONCE(cpudata->perf);
|
||||
|
||||
- return sysfs_emit(buf, "%u\n", freq);
|
||||
+ return sysfs_emit(buf, "%u\n",
|
||||
+ perf_to_freq(perf, cpudata->nominal_freq, perf.lowest_nonlinear_perf));
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1089,12 +1108,11 @@ static ssize_t show_amd_pstate_lowest_no
|
||||
static ssize_t show_amd_pstate_highest_perf(struct cpufreq_policy *policy,
|
||||
char *buf)
|
||||
{
|
||||
- u8 perf;
|
||||
- struct amd_cpudata *cpudata = policy->driver_data;
|
||||
+ struct amd_cpudata *cpudata;
|
||||
|
||||
- perf = READ_ONCE(cpudata->highest_perf);
|
||||
+ cpudata = policy->driver_data;
|
||||
|
||||
- return sysfs_emit(buf, "%u\n", perf);
|
||||
+ return sysfs_emit(buf, "%u\n", cpudata->perf.highest_perf);
|
||||
}
|
||||
|
||||
static ssize_t show_amd_pstate_prefcore_ranking(struct cpufreq_policy *policy,
|
||||
@@ -1425,6 +1443,7 @@ static bool amd_pstate_acpi_pm_profile_u
|
||||
static int amd_pstate_epp_cpu_init(struct cpufreq_policy *policy)
|
||||
{
|
||||
struct amd_cpudata *cpudata;
|
||||
+ union perf_cached perf;
|
||||
struct device *dev;
|
||||
u64 value;
|
||||
int ret;
|
||||
@@ -1458,8 +1477,15 @@ static int amd_pstate_epp_cpu_init(struc
|
||||
if (ret)
|
||||
goto free_cpudata1;
|
||||
|
||||
- policy->cpuinfo.min_freq = policy->min = perf_to_freq(cpudata, cpudata->lowest_perf);
|
||||
- policy->cpuinfo.max_freq = policy->max = perf_to_freq(cpudata, cpudata->highest_perf);
|
||||
+ perf = READ_ONCE(cpudata->perf);
|
||||
+
|
||||
+ policy->cpuinfo.min_freq = policy->min = perf_to_freq(perf,
|
||||
+ cpudata->nominal_freq,
|
||||
+ perf.lowest_perf);
|
||||
+ policy->cpuinfo.max_freq = policy->max = perf_to_freq(perf,
|
||||
+ cpudata->nominal_freq,
|
||||
+ perf.highest_perf);
|
||||
+
|
||||
/* It will be updated by governor */
|
||||
policy->cur = policy->cpuinfo.min_freq;
|
||||
|
||||
@@ -1520,6 +1546,7 @@ static void amd_pstate_epp_cpu_exit(stru
|
||||
static int amd_pstate_epp_update_limit(struct cpufreq_policy *policy)
|
||||
{
|
||||
struct amd_cpudata *cpudata = policy->driver_data;
|
||||
+ union perf_cached perf;
|
||||
u8 epp;
|
||||
|
||||
if (policy->min != cpudata->min_limit_freq || policy->max != cpudata->max_limit_freq)
|
||||
@@ -1530,15 +1557,16 @@ static int amd_pstate_epp_update_limit(s
|
||||
else
|
||||
epp = READ_ONCE(cpudata->epp_cached);
|
||||
|
||||
+ perf = READ_ONCE(cpudata->perf);
|
||||
if (trace_amd_pstate_epp_perf_enabled()) {
|
||||
- trace_amd_pstate_epp_perf(cpudata->cpu, cpudata->highest_perf, epp,
|
||||
- cpudata->min_limit_perf,
|
||||
- cpudata->max_limit_perf,
|
||||
+ trace_amd_pstate_epp_perf(cpudata->cpu, perf.highest_perf, epp,
|
||||
+ perf.min_limit_perf,
|
||||
+ perf.max_limit_perf,
|
||||
policy->boost_enabled);
|
||||
}
|
||||
|
||||
- return amd_pstate_update_perf(cpudata, cpudata->min_limit_perf, 0U,
|
||||
- cpudata->max_limit_perf, epp, false);
|
||||
+ return amd_pstate_update_perf(cpudata, perf.min_limit_perf, 0U,
|
||||
+ perf.max_limit_perf, epp, false);
|
||||
}
|
||||
|
||||
static int amd_pstate_epp_set_policy(struct cpufreq_policy *policy)
|
||||
@@ -1570,20 +1598,18 @@ static int amd_pstate_epp_set_policy(str
|
||||
static int amd_pstate_epp_reenable(struct cpufreq_policy *policy)
|
||||
{
|
||||
struct amd_cpudata *cpudata = policy->driver_data;
|
||||
- u8 max_perf;
|
||||
+ union perf_cached perf = READ_ONCE(cpudata->perf);
|
||||
int ret;
|
||||
|
||||
ret = amd_pstate_cppc_enable(true);
|
||||
if (ret)
|
||||
pr_err("failed to enable amd pstate during resume, return %d\n", ret);
|
||||
|
||||
- max_perf = READ_ONCE(cpudata->highest_perf);
|
||||
-
|
||||
if (trace_amd_pstate_epp_perf_enabled()) {
|
||||
- trace_amd_pstate_epp_perf(cpudata->cpu, cpudata->highest_perf,
|
||||
+ trace_amd_pstate_epp_perf(cpudata->cpu, perf.highest_perf,
|
||||
cpudata->epp_cached,
|
||||
FIELD_GET(AMD_CPPC_MIN_PERF_MASK, cpudata->cppc_req_cached),
|
||||
- max_perf, policy->boost_enabled);
|
||||
+ perf.highest_perf, policy->boost_enabled);
|
||||
}
|
||||
|
||||
return amd_pstate_epp_update_limit(policy);
|
||||
@@ -1607,22 +1633,21 @@ static int amd_pstate_epp_cpu_online(str
|
||||
static int amd_pstate_epp_cpu_offline(struct cpufreq_policy *policy)
|
||||
{
|
||||
struct amd_cpudata *cpudata = policy->driver_data;
|
||||
- u8 min_perf;
|
||||
+ union perf_cached perf = READ_ONCE(cpudata->perf);
|
||||
|
||||
if (cpudata->suspended)
|
||||
return 0;
|
||||
|
||||
- min_perf = READ_ONCE(cpudata->lowest_perf);
|
||||
-
|
||||
guard(mutex)(&amd_pstate_limits_lock);
|
||||
|
||||
if (trace_amd_pstate_epp_perf_enabled()) {
|
||||
- trace_amd_pstate_epp_perf(cpudata->cpu, cpudata->highest_perf,
|
||||
+ trace_amd_pstate_epp_perf(cpudata->cpu, perf.highest_perf,
|
||||
AMD_CPPC_EPP_BALANCE_POWERSAVE,
|
||||
- min_perf, min_perf, policy->boost_enabled);
|
||||
+ perf.lowest_perf, perf.lowest_perf,
|
||||
+ policy->boost_enabled);
|
||||
}
|
||||
|
||||
- return amd_pstate_update_perf(cpudata, min_perf, 0, min_perf,
|
||||
+ return amd_pstate_update_perf(cpudata, perf.lowest_perf, 0, perf.lowest_perf,
|
||||
AMD_CPPC_EPP_BALANCE_POWERSAVE, false);
|
||||
}
|
||||
|
||||
--- a/drivers/cpufreq/amd-pstate.h
|
||||
+++ b/drivers/cpufreq/amd-pstate.h
|
||||
@@ -13,6 +13,36 @@
|
||||
/*********************************************************************
|
||||
* AMD P-state INTERFACE *
|
||||
*********************************************************************/
|
||||
+
|
||||
+/**
|
||||
+ * union perf_cached - A union to cache performance-related data.
|
||||
+ * @highest_perf: the maximum performance an individual processor may reach,
|
||||
+ * assuming ideal conditions
|
||||
+ * For platforms that support the preferred core feature, the highest_perf value maybe
|
||||
+ * configured to any value in the range 166-255 by the firmware (because the preferred
|
||||
+ * core ranking is encoded in the highest_perf value). To maintain consistency across
|
||||
+ * all platforms, we split the highest_perf and preferred core ranking values into
|
||||
+ * cpudata->perf.highest_perf and cpudata->prefcore_ranking.
|
||||
+ * @nominal_perf: the maximum sustained performance level of the processor,
|
||||
+ * assuming ideal operating conditions
|
||||
+ * @lowest_nonlinear_perf: the lowest performance level at which nonlinear power
|
||||
+ * savings are achieved
|
||||
+ * @lowest_perf: the absolute lowest performance level of the processor
|
||||
+ * @min_limit_perf: Cached value of the performance corresponding to policy->min
|
||||
+ * @max_limit_perf: Cached value of the performance corresponding to policy->max
|
||||
+ */
|
||||
+union perf_cached {
|
||||
+ struct {
|
||||
+ u8 highest_perf;
|
||||
+ u8 nominal_perf;
|
||||
+ u8 lowest_nonlinear_perf;
|
||||
+ u8 lowest_perf;
|
||||
+ u8 min_limit_perf;
|
||||
+ u8 max_limit_perf;
|
||||
+ };
|
||||
+ u64 val;
|
||||
+};
|
||||
+
|
||||
/**
|
||||
* struct amd_aperf_mperf
|
||||
* @aperf: actual performance frequency clock count
|
||||
@@ -30,20 +60,9 @@ struct amd_aperf_mperf {
|
||||
* @cpu: CPU number
|
||||
* @req: constraint request to apply
|
||||
* @cppc_req_cached: cached performance request hints
|
||||
- * @highest_perf: the maximum performance an individual processor may reach,
|
||||
- * assuming ideal conditions
|
||||
- * For platforms that do not support the preferred core feature, the
|
||||
- * highest_pef may be configured with 166 or 255, to avoid max frequency
|
||||
- * calculated wrongly. we take the fixed value as the highest_perf.
|
||||
- * @nominal_perf: the maximum sustained performance level of the processor,
|
||||
- * assuming ideal operating conditions
|
||||
- * @lowest_nonlinear_perf: the lowest performance level at which nonlinear power
|
||||
- * savings are achieved
|
||||
- * @lowest_perf: the absolute lowest performance level of the processor
|
||||
+ * @perf: cached performance-related data
|
||||
* @prefcore_ranking: the preferred core ranking, the higher value indicates a higher
|
||||
* priority.
|
||||
- * @min_limit_perf: Cached value of the performance corresponding to policy->min
|
||||
- * @max_limit_perf: Cached value of the performance corresponding to policy->max
|
||||
* @min_limit_freq: Cached value of policy->min (in khz)
|
||||
* @max_limit_freq: Cached value of policy->max (in khz)
|
||||
* @nominal_freq: the frequency (in khz) that mapped to nominal_perf
|
||||
@@ -68,13 +87,9 @@ struct amd_cpudata {
|
||||
struct freq_qos_request req[2];
|
||||
u64 cppc_req_cached;
|
||||
|
||||
- u8 highest_perf;
|
||||
- u8 nominal_perf;
|
||||
- u8 lowest_nonlinear_perf;
|
||||
- u8 lowest_perf;
|
||||
+ union perf_cached perf;
|
||||
+
|
||||
u8 prefcore_ranking;
|
||||
- u8 min_limit_perf;
|
||||
- u8 max_limit_perf;
|
||||
u32 min_limit_freq;
|
||||
u32 max_limit_freq;
|
||||
u32 nominal_freq;
|
89
debian/patches/patchset-pf/amd-pstate/0015-cpufreq-amd-pstate-Overhaul-locking.patch
vendored
Normal file
89
debian/patches/patchset-pf/amd-pstate/0015-cpufreq-amd-pstate-Overhaul-locking.patch
vendored
Normal file
@ -0,0 +1,89 @@
|
||||
From 6c0b59640cce68d7574078d7d1e549bdb8f0128d Mon Sep 17 00:00:00 2001
|
||||
From: Mario Limonciello <mario.limonciello@amd.com>
|
||||
Date: Wed, 26 Feb 2025 01:49:20 -0600
|
||||
Subject: cpufreq/amd-pstate: Overhaul locking
|
||||
|
||||
amd_pstate_cpu_boost_update() and refresh_frequency_limits() both
|
||||
update the policy state and have nothing to do with the amd-pstate
|
||||
driver itself.
|
||||
|
||||
A global "limits" lock doesn't make sense because each CPU can have
|
||||
policies changed independently. Each time a CPU changes values they
|
||||
will atomically be written to the per-CPU perf member. Drop per CPU
|
||||
locking cases.
|
||||
|
||||
The remaining "global" driver lock is used to ensure that only one
|
||||
entity can change driver modes at a given time.
|
||||
|
||||
Reviewed-by: Gautham R. Shenoy <gautham.shenoy@amd.com>
|
||||
Reviewed-by: Dhananjay Ugwekar <dhananjay.ugwekar@amd.com>
|
||||
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
|
||||
---
|
||||
drivers/cpufreq/amd-pstate.c | 13 +++----------
|
||||
1 file changed, 3 insertions(+), 10 deletions(-)
|
||||
|
||||
--- a/drivers/cpufreq/amd-pstate.c
|
||||
+++ b/drivers/cpufreq/amd-pstate.c
|
||||
@@ -196,7 +196,6 @@ static inline int get_mode_idx_from_str(
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
-static DEFINE_MUTEX(amd_pstate_limits_lock);
|
||||
static DEFINE_MUTEX(amd_pstate_driver_lock);
|
||||
|
||||
static u8 msr_get_epp(struct amd_cpudata *cpudata)
|
||||
@@ -752,7 +751,6 @@ static int amd_pstate_set_boost(struct c
|
||||
pr_err("Boost mode is not supported by this processor or SBIOS\n");
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
- guard(mutex)(&amd_pstate_driver_lock);
|
||||
|
||||
ret = amd_pstate_cpu_boost_update(policy, state);
|
||||
refresh_frequency_limits(policy);
|
||||
@@ -1170,8 +1168,6 @@ static ssize_t store_energy_performance_
|
||||
if (ret < 0)
|
||||
return -EINVAL;
|
||||
|
||||
- guard(mutex)(&amd_pstate_limits_lock);
|
||||
-
|
||||
ret = amd_pstate_set_energy_pref_index(policy, ret);
|
||||
|
||||
return ret ? ret : count;
|
||||
@@ -1344,8 +1340,10 @@ int amd_pstate_update_status(const char
|
||||
if (mode_idx < 0 || mode_idx >= AMD_PSTATE_MAX)
|
||||
return -EINVAL;
|
||||
|
||||
- if (mode_state_machine[cppc_state][mode_idx])
|
||||
+ if (mode_state_machine[cppc_state][mode_idx]) {
|
||||
+ guard(mutex)(&amd_pstate_driver_lock);
|
||||
return mode_state_machine[cppc_state][mode_idx](mode_idx);
|
||||
+ }
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1366,7 +1364,6 @@ static ssize_t status_store(struct devic
|
||||
char *p = memchr(buf, '\n', count);
|
||||
int ret;
|
||||
|
||||
- guard(mutex)(&amd_pstate_driver_lock);
|
||||
ret = amd_pstate_update_status(buf, p ? p - buf : count);
|
||||
|
||||
return ret < 0 ? ret : count;
|
||||
@@ -1638,8 +1635,6 @@ static int amd_pstate_epp_cpu_offline(st
|
||||
if (cpudata->suspended)
|
||||
return 0;
|
||||
|
||||
- guard(mutex)(&amd_pstate_limits_lock);
|
||||
-
|
||||
if (trace_amd_pstate_epp_perf_enabled()) {
|
||||
trace_amd_pstate_epp_perf(cpudata->cpu, perf.highest_perf,
|
||||
AMD_CPPC_EPP_BALANCE_POWERSAVE,
|
||||
@@ -1679,8 +1674,6 @@ static int amd_pstate_epp_resume(struct
|
||||
struct amd_cpudata *cpudata = policy->driver_data;
|
||||
|
||||
if (cpudata->suspended) {
|
||||
- guard(mutex)(&amd_pstate_limits_lock);
|
||||
-
|
||||
/* enable amd pstate from suspend state*/
|
||||
amd_pstate_epp_reenable(policy);
|
||||
|
48
debian/patches/patchset-pf/amd-pstate/0016-cpufreq-amd-pstate-Drop-cppc_cap1_cached.patch
vendored
Normal file
48
debian/patches/patchset-pf/amd-pstate/0016-cpufreq-amd-pstate-Drop-cppc_cap1_cached.patch
vendored
Normal file
@ -0,0 +1,48 @@
|
||||
From 7c9409faeb921c76988b4cd2294ca0a959775f35 Mon Sep 17 00:00:00 2001
|
||||
From: Mario Limonciello <mario.limonciello@amd.com>
|
||||
Date: Wed, 26 Feb 2025 01:49:21 -0600
|
||||
Subject: cpufreq/amd-pstate: Drop `cppc_cap1_cached`
|
||||
|
||||
The `cppc_cap1_cached` variable isn't used at all, there is no
|
||||
need to read it at initialization for each CPU.
|
||||
|
||||
Reviewed-by: Gautham R. Shenoy <gautham.shenoy@amd.com>
|
||||
Reviewed-by: Dhananjay Ugwekar <dhananjay.ugwekar@amd.com>
|
||||
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
|
||||
---
|
||||
drivers/cpufreq/amd-pstate.c | 5 -----
|
||||
drivers/cpufreq/amd-pstate.h | 2 --
|
||||
2 files changed, 7 deletions(-)
|
||||
|
||||
--- a/drivers/cpufreq/amd-pstate.c
|
||||
+++ b/drivers/cpufreq/amd-pstate.c
|
||||
@@ -1508,11 +1508,6 @@ static int amd_pstate_epp_cpu_init(struc
|
||||
if (ret)
|
||||
return ret;
|
||||
WRITE_ONCE(cpudata->cppc_req_cached, value);
|
||||
-
|
||||
- ret = rdmsrl_on_cpu(cpudata->cpu, MSR_AMD_CPPC_CAP1, &value);
|
||||
- if (ret)
|
||||
- return ret;
|
||||
- WRITE_ONCE(cpudata->cppc_cap1_cached, value);
|
||||
}
|
||||
ret = amd_pstate_set_epp(cpudata, cpudata->epp_default);
|
||||
if (ret)
|
||||
--- a/drivers/cpufreq/amd-pstate.h
|
||||
+++ b/drivers/cpufreq/amd-pstate.h
|
||||
@@ -76,7 +76,6 @@ struct amd_aperf_mperf {
|
||||
* AMD P-State driver supports preferred core featue.
|
||||
* @epp_cached: Cached CPPC energy-performance preference value
|
||||
* @policy: Cpufreq policy value
|
||||
- * @cppc_cap1_cached Cached MSR_AMD_CPPC_CAP1 register value
|
||||
*
|
||||
* The amd_cpudata is key private data for each CPU thread in AMD P-State, and
|
||||
* represents all the attributes and goals that AMD P-State requests at runtime.
|
||||
@@ -105,7 +104,6 @@ struct amd_cpudata {
|
||||
/* EPP feature related attributes*/
|
||||
u8 epp_cached;
|
||||
u32 policy;
|
||||
- u64 cppc_cap1_cached;
|
||||
bool suspended;
|
||||
u8 epp_default;
|
||||
};
|
144
debian/patches/patchset-pf/amd-pstate/0017-cpufreq-amd-pstate-ut-Use-_free-macro-to-free-put-po.patch
vendored
Normal file
144
debian/patches/patchset-pf/amd-pstate/0017-cpufreq-amd-pstate-ut-Use-_free-macro-to-free-put-po.patch
vendored
Normal file
@ -0,0 +1,144 @@
|
||||
From 346b2824b742a8f5943db8c8200ba4a7492bb3cf Mon Sep 17 00:00:00 2001
|
||||
From: Mario Limonciello <mario.limonciello@amd.com>
|
||||
Date: Wed, 26 Feb 2025 01:49:22 -0600
|
||||
Subject: cpufreq/amd-pstate-ut: Use _free macro to free put policy
|
||||
|
||||
Using a scoped cleanup macro simplifies cleanup code.
|
||||
|
||||
Reviewed-by: Dhananjay Ugwekar <dhananjay.ugwekar@amd.com>
|
||||
Reviewed-by: Gautham R. Shenoy <gautham.shenoy@amd.com>
|
||||
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
|
||||
---
|
||||
drivers/cpufreq/amd-pstate-ut.c | 33 ++++++++++++++-------------------
|
||||
1 file changed, 14 insertions(+), 19 deletions(-)
|
||||
|
||||
--- a/drivers/cpufreq/amd-pstate-ut.c
|
||||
+++ b/drivers/cpufreq/amd-pstate-ut.c
|
||||
@@ -26,6 +26,7 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/moduleparam.h>
|
||||
#include <linux/fs.h>
|
||||
+#include <linux/cleanup.h>
|
||||
|
||||
#include <acpi/cppc_acpi.h>
|
||||
|
||||
@@ -127,11 +128,12 @@ static void amd_pstate_ut_check_perf(u32
|
||||
u32 highest_perf = 0, nominal_perf = 0, lowest_nonlinear_perf = 0, lowest_perf = 0;
|
||||
u64 cap1 = 0;
|
||||
struct cppc_perf_caps cppc_perf;
|
||||
- struct cpufreq_policy *policy = NULL;
|
||||
struct amd_cpudata *cpudata = NULL;
|
||||
union perf_cached cur_perf;
|
||||
|
||||
for_each_possible_cpu(cpu) {
|
||||
+ struct cpufreq_policy *policy __free(put_cpufreq_policy) = NULL;
|
||||
+
|
||||
policy = cpufreq_cpu_get(cpu);
|
||||
if (!policy)
|
||||
break;
|
||||
@@ -142,7 +144,7 @@ static void amd_pstate_ut_check_perf(u32
|
||||
if (ret) {
|
||||
amd_pstate_ut_cases[index].result = AMD_PSTATE_UT_RESULT_FAIL;
|
||||
pr_err("%s cppc_get_perf_caps ret=%d error!\n", __func__, ret);
|
||||
- goto skip_test;
|
||||
+ return;
|
||||
}
|
||||
|
||||
highest_perf = cppc_perf.highest_perf;
|
||||
@@ -154,7 +156,7 @@ static void amd_pstate_ut_check_perf(u32
|
||||
if (ret) {
|
||||
amd_pstate_ut_cases[index].result = AMD_PSTATE_UT_RESULT_FAIL;
|
||||
pr_err("%s read CPPC_CAP1 ret=%d error!\n", __func__, ret);
|
||||
- goto skip_test;
|
||||
+ return;
|
||||
}
|
||||
|
||||
highest_perf = AMD_CPPC_HIGHEST_PERF(cap1);
|
||||
@@ -167,7 +169,7 @@ static void amd_pstate_ut_check_perf(u32
|
||||
if (highest_perf != cur_perf.highest_perf && !cpudata->hw_prefcore) {
|
||||
pr_err("%s cpu%d highest=%d %d highest perf doesn't match\n",
|
||||
__func__, cpu, highest_perf, cur_perf.highest_perf);
|
||||
- goto skip_test;
|
||||
+ return;
|
||||
}
|
||||
if (nominal_perf != cur_perf.nominal_perf ||
|
||||
(lowest_nonlinear_perf != cur_perf.lowest_nonlinear_perf) ||
|
||||
@@ -177,7 +179,7 @@ static void amd_pstate_ut_check_perf(u32
|
||||
__func__, cpu, nominal_perf, cur_perf.nominal_perf,
|
||||
lowest_nonlinear_perf, cur_perf.lowest_nonlinear_perf,
|
||||
lowest_perf, cur_perf.lowest_perf);
|
||||
- goto skip_test;
|
||||
+ return;
|
||||
}
|
||||
|
||||
if (!((highest_perf >= nominal_perf) &&
|
||||
@@ -188,15 +190,11 @@ static void amd_pstate_ut_check_perf(u32
|
||||
pr_err("%s cpu%d highest=%d >= nominal=%d > lowest_nonlinear=%d > lowest=%d > 0, the formula is incorrect!\n",
|
||||
__func__, cpu, highest_perf, nominal_perf,
|
||||
lowest_nonlinear_perf, lowest_perf);
|
||||
- goto skip_test;
|
||||
+ return;
|
||||
}
|
||||
- cpufreq_cpu_put(policy);
|
||||
}
|
||||
|
||||
amd_pstate_ut_cases[index].result = AMD_PSTATE_UT_RESULT_PASS;
|
||||
- return;
|
||||
-skip_test:
|
||||
- cpufreq_cpu_put(policy);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -207,10 +205,11 @@ skip_test:
|
||||
static void amd_pstate_ut_check_freq(u32 index)
|
||||
{
|
||||
int cpu = 0;
|
||||
- struct cpufreq_policy *policy = NULL;
|
||||
struct amd_cpudata *cpudata = NULL;
|
||||
|
||||
for_each_possible_cpu(cpu) {
|
||||
+ struct cpufreq_policy *policy __free(put_cpufreq_policy) = NULL;
|
||||
+
|
||||
policy = cpufreq_cpu_get(cpu);
|
||||
if (!policy)
|
||||
break;
|
||||
@@ -224,14 +223,14 @@ static void amd_pstate_ut_check_freq(u32
|
||||
pr_err("%s cpu%d max=%d >= nominal=%d > lowest_nonlinear=%d > min=%d > 0, the formula is incorrect!\n",
|
||||
__func__, cpu, policy->cpuinfo.max_freq, cpudata->nominal_freq,
|
||||
cpudata->lowest_nonlinear_freq, policy->cpuinfo.min_freq);
|
||||
- goto skip_test;
|
||||
+ return;
|
||||
}
|
||||
|
||||
if (cpudata->lowest_nonlinear_freq != policy->min) {
|
||||
amd_pstate_ut_cases[index].result = AMD_PSTATE_UT_RESULT_FAIL;
|
||||
pr_err("%s cpu%d cpudata_lowest_nonlinear_freq=%d policy_min=%d, they should be equal!\n",
|
||||
__func__, cpu, cpudata->lowest_nonlinear_freq, policy->min);
|
||||
- goto skip_test;
|
||||
+ return;
|
||||
}
|
||||
|
||||
if (cpudata->boost_supported) {
|
||||
@@ -243,20 +242,16 @@ static void amd_pstate_ut_check_freq(u32
|
||||
pr_err("%s cpu%d policy_max=%d should be equal cpu_max=%d or cpu_nominal=%d !\n",
|
||||
__func__, cpu, policy->max, policy->cpuinfo.max_freq,
|
||||
cpudata->nominal_freq);
|
||||
- goto skip_test;
|
||||
+ return;
|
||||
}
|
||||
} else {
|
||||
amd_pstate_ut_cases[index].result = AMD_PSTATE_UT_RESULT_FAIL;
|
||||
pr_err("%s cpu%d must support boost!\n", __func__, cpu);
|
||||
- goto skip_test;
|
||||
+ return;
|
||||
}
|
||||
- cpufreq_cpu_put(policy);
|
||||
}
|
||||
|
||||
amd_pstate_ut_cases[index].result = AMD_PSTATE_UT_RESULT_PASS;
|
||||
- return;
|
||||
-skip_test:
|
||||
- cpufreq_cpu_put(policy);
|
||||
}
|
||||
|
||||
static int amd_pstate_set_mode(enum amd_pstate_mode mode)
|
37
debian/patches/patchset-pf/amd-pstate/0018-cpufreq-amd-pstate-ut-Allow-lowest-nonlinear-and-low.patch
vendored
Normal file
37
debian/patches/patchset-pf/amd-pstate/0018-cpufreq-amd-pstate-ut-Allow-lowest-nonlinear-and-low.patch
vendored
Normal file
@ -0,0 +1,37 @@
|
||||
From 310f8a994f55561902e5a75ff8623988921e3908 Mon Sep 17 00:00:00 2001
|
||||
From: Mario Limonciello <mario.limonciello@amd.com>
|
||||
Date: Wed, 26 Feb 2025 01:49:23 -0600
|
||||
Subject: cpufreq/amd-pstate-ut: Allow lowest nonlinear and lowest to be the
|
||||
same
|
||||
|
||||
Several Ryzen AI processors support the exact same value for lowest
|
||||
nonlinear perf and lowest perf. Loosen up the unit tests to allow this
|
||||
scenario.
|
||||
|
||||
Reviewed-by: Gautham R. Shenoy <gautham.shenoy@amd.com>
|
||||
Reviewed-by: Dhananjay Ugwekar <dhananjay.ugwekar@amd.com>
|
||||
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
|
||||
---
|
||||
drivers/cpufreq/amd-pstate-ut.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/cpufreq/amd-pstate-ut.c
|
||||
+++ b/drivers/cpufreq/amd-pstate-ut.c
|
||||
@@ -184,7 +184,7 @@ static void amd_pstate_ut_check_perf(u32
|
||||
|
||||
if (!((highest_perf >= nominal_perf) &&
|
||||
(nominal_perf > lowest_nonlinear_perf) &&
|
||||
- (lowest_nonlinear_perf > lowest_perf) &&
|
||||
+ (lowest_nonlinear_perf >= lowest_perf) &&
|
||||
(lowest_perf > 0))) {
|
||||
amd_pstate_ut_cases[index].result = AMD_PSTATE_UT_RESULT_FAIL;
|
||||
pr_err("%s cpu%d highest=%d >= nominal=%d > lowest_nonlinear=%d > lowest=%d > 0, the formula is incorrect!\n",
|
||||
@@ -217,7 +217,7 @@ static void amd_pstate_ut_check_freq(u32
|
||||
|
||||
if (!((policy->cpuinfo.max_freq >= cpudata->nominal_freq) &&
|
||||
(cpudata->nominal_freq > cpudata->lowest_nonlinear_freq) &&
|
||||
- (cpudata->lowest_nonlinear_freq > policy->cpuinfo.min_freq) &&
|
||||
+ (cpudata->lowest_nonlinear_freq >= policy->cpuinfo.min_freq) &&
|
||||
(policy->cpuinfo.min_freq > 0))) {
|
||||
amd_pstate_ut_cases[index].result = AMD_PSTATE_UT_RESULT_FAIL;
|
||||
pr_err("%s cpu%d max=%d >= nominal=%d > lowest_nonlinear=%d > min=%d > 0, the formula is incorrect!\n",
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user