公告

Gentoo交流群:87709706 欢迎您的加入

#1 站务处理 » 服务器切换完毕 » 2025-10-18 05:49:40

batsom
回复: 0

网赚切换服务器顺利完毕,如果您有什么疑问记得联系我们,期待您的回复

#2 站务处理 » 网站更换服务器通知 » 2025-10-15 01:25:13

batsom
回复: 0

服务器将于2025年10月20号到期,新服务器正在测试,我们将于2025年10月18日 4:00-6:00进行服务器切换,在此期间网站访问会出现波动,如有疑问和任何建议请邮件联系我们团队[email protected],或者加我们官方QQ群:87709706

#3 Re: 新手园地 » cf+v2 » 2025-08-27 20:42:26

嗯嗯嗯!测试几下就明白了

#5 安装问题 » 内核6.12.16 » 2025-03-30 23:34:40

batsom
回复: 0

gentoo /usr/src/linux #  make -j9 &&  make modules_install &&  make install
  SYNC    include/config/auto.conf
.config:879:warning: symbol value '0' invalid for BASE_SMALL
.config:7499:warning: symbol value 'm' invalid for VFIO_VIRQFD
.config:8722:warning: symbol value 'm' invalid for FSCACHE
*
* Restart config...
*
*
* RCU Subsystem
*
Make expert-level adjustments to RCU configuration (RCU_EXPERT) [N/y/?] n
Offload RCU callback processing from boot-selected CPUs (RCU_NOCB_CPU) [Y/?] y
  Offload RCU callback processing from all CPUs by default (RCU_NOCB_CPU_DEFAULT_ALL) [N/y/?] n
RCU callback lazy invocation functionality (RCU_LAZY) [N/y/?] (NEW)
*
* Control Group support
*
Control Group support (CGROUPS) [Y/?] y
  Favor dynamic modification latency reduction by default (CGROUP_FAVOR_DYNMODS) [N/y/?] n
  Memory controller (MEMCG) [Y/n/?] y
    Legacy cgroup v1 memory controller (MEMCG_V1) [N/y/?] (NEW)
  IO controller (BLK_CGROUP) [Y/n/?] y
  PIDs controller (CGROUP_PIDS) [Y/n/?] y
  RDMA controller (CGROUP_RDMA) [Y/n/?] y
  Freezer controller (CGROUP_FREEZER) [Y/n/?] y
  HugeTLB controller (CGROUP_HUGETLB) [Y/n/?] y
  Cpuset controller (CPUSETS) [Y/n/?] y
    Legacy cgroup v1 cpusets controller (CPUSETS_V1) [N/y/?] (NEW)
    Include legacy /proc/<pid>/cpuset file (PROC_PID_CPUSET) [Y/n/?] y
  Device controller (CGROUP_DEVICE) [Y/n/?] y
  Simple CPU accounting controller (CGROUP_CPUACCT) [Y/n/?] y
  Perf controller (CGROUP_PERF) [Y/n/?] y
  Support for eBPF programs attached to cgroups (CGROUP_BPF) [Y/?] y
  Misc resource controller (CGROUP_MISC) [N/y/?] n
  Debug controller (CGROUP_DEBUG) [N/y/?] n

Local version - append to kernel release (LOCALVERSION) [-x86_64] -x86_64
Automatically append version information to the version string (LOCALVERSION_AUTO) [N/y/?] n
Build ID Salt (BUILD_SALT) []
Kernel compression mode
> 1. Gzip (KERNEL_GZIP)
  2. Bzip2 (KERNEL_BZIP2)
  3. LZMA (KERNEL_LZMA)
  4. XZ (KERNEL_XZ)
  5. LZO (KERNEL_LZO)
  6. LZ4 (KERNEL_LZ4)
  7. ZSTD (KERNEL_ZSTD)
choice[1-7?]: 1
Default init path (DEFAULT_INIT) []
Default hostname (DEFAULT_HOSTNAME) [(none)] (none)
System V IPC (SYSVIPC) [Y/?] y
POSIX Message Queues (POSIX_MQUEUE) [Y/n/?] y
General notification queue (WATCH_QUEUE) [Y/n/?] y
Enable process_vm_readv/writev syscalls (CROSS_MEMORY_ATTACH) [Y/n/?] y
uselib syscall (for libc5 and earlier) (USELIB) [N/y/?] n
Auditing support (AUDIT) [Y/n/?] y
Preemption Model
  1. No Forced Preemption (Server) (PREEMPT_NONE)
> 2. Voluntary Kernel Preemption (Desktop) (PREEMPT_VOLUNTARY)
  3. Preemptible Kernel (Low-Latency Desktop) (PREEMPT)
choice[1-3?]: 2
Preemption behaviour defined on boot (PREEMPT_DYNAMIC) [Y/n/?] y
Core Scheduling for SMT (SCHED_CORE) [N/y/?] n
CPU isolation (CPU_ISOLATION) [Y/?] y
Kernel .config support (IKCONFIG) [Y/n/m/?] y
  Enable access to .config through /proc/config.gz (IKCONFIG_PROC) [Y/n/?] y
Enable kernel headers through /sys/kernel/kheaders.tar.xz (IKHEADERS) [N/m/y/?] n
Kernel log buffer size (16 => 64KB, 17 => 128KB) (LOG_BUF_SHIFT) [18] 18
CPU kernel log buffer size contribution (13 => 8 KB, 17 => 128KB) (LOG_CPU_MAX_BUF_SHIFT) [12] 12
Printk indexing debugfs interface (PRINTK_INDEX) [N/y/?] n
Memory placement aware NUMA scheduler (NUMA_BALANCING) [Y/n/?] y
  Automatically enable NUMA aware memory/task placement (NUMA_BALANCING_DEFAULT_ENABLED) [Y/n/?] y
Checkpoint/restore support (CHECKPOINT_RESTORE) [Y/n/?] y
Automatic process group scheduling (SCHED_AUTOGROUP) [Y/n/?] y
Kernel->user space relay support (formerly relayfs) (RELAY) [Y/?] y
Initial RAM filesystem and RAM disk (initramfs/initrd) support (BLK_DEV_INITRD) [Y/?] y
  Initramfs source file(s) (INITRAMFS_SOURCE) []
  Support initial ramdisk/ramfs compressed using gzip (RD_GZIP) [Y/n/?] y
  Support initial ramdisk/ramfs compressed using bzip2 (RD_BZIP2) [Y/n/?] y
  Support initial ramdisk/ramfs compressed using LZMA (RD_LZMA) [Y/n/?] y
  Support initial ramdisk/ramfs compressed using XZ (RD_XZ) [Y/n/?] y
  Support initial ramdisk/ramfs compressed using LZO (RD_LZO) [Y/n/?] y
  Support initial ramdisk/ramfs compressed using LZ4 (RD_LZ4) [Y/n/?] y
  Support initial ramdisk/ramfs compressed using ZSTD (RD_ZSTD) [Y/n/?] y
Boot config support (BOOT_CONFIG) [Y/?] y
  Force unconditional bootconfig processing (BOOT_CONFIG_FORCE) [N/y/?] (NEW)
  Embed bootconfig file in the kernel (BOOT_CONFIG_EMBED) [N/y/?] n
Preserve cpio archive mtimes in initramfs (INITRAMFS_PRESERVE_MTIME) [Y/n/?] y
Compiler optimization level
> 1. Optimize for performance (-O2) (CC_OPTIMIZE_FOR_PERFORMANCE)
  2. Optimize for size (-Os) (CC_OPTIMIZE_FOR_SIZE)
choice[1-2?]: 1
Load all symbols for debugging/ksymoops (KALLSYMS) [Y/?] y
  Test the basic functions and performance of kallsyms (KALLSYMS_SELFTEST) [N/y/?] (NEW)
  Include all symbols in kallsyms (KALLSYMS_ALL) [Y/?] y
Profiling support (PROFILING) [Y/n/?] y
*
* Kexec and crash features
*
Enable kexec system call (KEXEC) [Y/n/?] y
Enable kexec file based system call (KEXEC_FILE) [Y/n/?] y
  Verify kernel signature during kexec_file_load() syscall (KEXEC_SIG) [Y/n/?] y
    Require a valid signature in kexec_file_load() syscall (KEXEC_SIG_FORCE) [N/y/?] n
    Enable bzImage signature verification support (KEXEC_BZIMAGE_VERIFY_SIG) [Y/n/?] y
kexec jump (KEXEC_JUMP) [Y/n/?] y
kernel crash dumps (CRASH_DUMP) [Y/n/?] y
  Update the crash elfcorehdr on system configuration changes (CRASH_HOTPLUG) [Y/n/?] (NEW)
    Specify the maximum number of memory regions for the elfcorehdr (CRASH_MAX_MEMORY_RANGES) [8192] (NEW)
*
* Processor type and features
*
Symmetric multi-processing support (SMP) [Y/n/?] y
Support x2apic (X86_X2APIC) [Y/?] y
Enable MSI and MSI-x delivery by posted interrupts (X86_POSTED_MSI) [N/y/?] (NEW)
Enable MPS table (X86_MPPARSE) [Y/n/?] y
x86 CPU resource control support (X86_CPU_RESCTRL) [Y/n/?] y
Flexible Return and Event Delivery (X86_FRED) [N/y/?] (NEW)
Support for extended (non-PC) x86 platforms (X86_EXTENDED_PLATFORM) [Y/n/?] y
  Numascale NumaChip (X86_NUMACHIP) [N/y/?] n
  ScaleMP vSMP (X86_VSMP) [N/y/?] n
  SGI Ultraviolet (X86_UV) [Y/n/?] y
  Goldfish (Virtual Platform) (X86_GOLDFISH) [N/y/?] n
  Intel MID platform support (X86_INTEL_MID) [N/y/?] n
Intel Low Power Subsystem Support (X86_INTEL_LPSS) [Y/n/?] y
AMD ACPI2Platform devices support (X86_AMD_PLATFORM_DEVICE) [Y/n/?] y
Intel SoC IOSF Sideband support for SoC platforms (IOSF_MBI) [Y/?] y
  Enable IOSF sideband access through debugfs (IOSF_MBI_DEBUG) [N/y/?] n
Single-depth WCHAN output (SCHED_OMIT_FRAME_POINTER) [Y/n/?] y
Processor family
  1. Opteron/Athlon64/Hammer/K8 (MK8)
  2. Intel P4 / older Netburst based Xeon (MPSC)
  3. Core 2/newer Xeon (MCORE2)
  4. Intel Atom (MATOM)
> 5. Generic-x86-64 (GENERIC_CPU)
choice[1-5?]: 5
Old AMD GART IOMMU support (GART_IOMMU) [Y/n/?] y
Enable Maximum number of SMP Processors and NUMA Nodes (MAXSMP) [Y/n/?] y
Cluster scheduler support (SCHED_CLUSTER) [Y/n/?] y
Multi-core scheduler support (SCHED_MC) [Y/n/?] y
  CPU core priorities scheduler support (SCHED_MC_PRIO) [Y/n/?] y
Reroute for broken boot IRQs (X86_REROUTE_FOR_BROKEN_BOOT_IRQS) [Y/n/?] y
Machine Check / overheating reporting (X86_MCE) [Y/n/?] y
  Support for deprecated /dev/mcelog character device (X86_MCELOG_LEGACY) [Y/n/?] y
  Intel MCE features (X86_MCE_INTEL) [Y/n/?] y
  AMD MCE features (X86_MCE_AMD) [Y/n/?] y
Machine check injector support (X86_MCE_INJECT) [M/n/y/?] m
IOPERM and IOPL Emulation (X86_IOPL_IOPERM) [Y/n/?] y
Late microcode loading (DANGEROUS) (MICROCODE_LATE_LOADING) [N/y/?] n
/dev/cpu/*/msr - Model-specific register support (X86_MSR) [M/n/y/?] m
/dev/cpu/*/cpuid - CPU information support (X86_CPUID) [M/n/y/?] m
Enable 5-level page tables support (X86_5LEVEL) [Y/n/?] y
Enable statistic for Change Page Attribute (X86_CPA_STATISTICS) [N/y/?] n
AMD Secure Memory Encryption (SME) support (AMD_MEM_ENCRYPT) [Y/n/?] y
NUMA Memory Allocation and Scheduler Support (NUMA) [Y/n/?] y
  Old style AMD Opteron NUMA detection (AMD_NUMA) [Y/n/?] y
  ACPI NUMA detection (X86_64_ACPI_NUMA) [Y/n/?] y
Enable sysfs memory/probe interface (ARCH_MEMORY_PROBE) [Y/n/?] y
Support non-standard NVDIMMs and ADR protected memory (X86_PMEM_LEGACY) [M/n/y/?] m
Check for low memory corruption (X86_CHECK_BIOS_CORRUPTION) [Y/n/?] y
  Set the default setting of memory_corruption_check (X86_BOOTPARAM_MEMORY_CORRUPTION_CHECK) [N/y/?] n
MTRR (Memory Type Range Register) support (MTRR) [Y/?] y
  MTRR cleanup support (MTRR_SANITIZER) [Y/n/?] y
    MTRR cleanup enable value (0-1) (MTRR_SANITIZER_ENABLE_DEFAULT) [0] 0
    MTRR cleanup spare reg num (0-7) (MTRR_SANITIZER_SPARE_REG_NR_DEFAULT) [1] 1
Indirect Branch Tracking (X86_KERNEL_IBT) [N/y/?] n
Memory Protection Keys (X86_INTEL_MEMORY_PROTECTION_KEYS) [Y/n/?] y
TSX enable mode
> 1. off (X86_INTEL_TSX_MODE_OFF)
  2. on (X86_INTEL_TSX_MODE_ON)
  3. auto (X86_INTEL_TSX_MODE_AUTO)
choice[1-3?]: 1
Software Guard eXtensions (SGX) (X86_SGX) [Y/n/?] y
X86 userspace shadow stack (X86_USER_SHADOW_STACK) [N/y/?] (NEW)
EFI runtime service support (EFI) [Y/n/?] y
  EFI stub support (EFI_STUB) [Y/n/?] y
    EFI handover protocol (DEPRECATED) (EFI_HANDOVER_PROTOCOL) [Y/n/?] (NEW)
    EFI mixed-mode support (EFI_MIXED) [Y/n/?] y
Timer frequency
  1. 100 HZ (HZ_100)
  2. 250 HZ (HZ_250)
> 3. 300 HZ (HZ_300)
  4. 1000 HZ (HZ_1000)
choice[1-4?]: 3
Physical address where the kernel is loaded (PHYSICAL_START) [0x1000000] 0x1000000
Build a relocatable kernel (RELOCATABLE) [Y/?] y
  Randomize the address of the kernel image (KASLR) (RANDOMIZE_BASE) [Y/n/?] y
Alignment value to which kernel should be aligned (PHYSICAL_ALIGN) [0x1000000] 0x1000000
Randomize the kernel memory sections (RANDOMIZE_MEMORY) [Y/n/?] y
Disable the 32-bit vDSO (needed for glibc 2.3.3) (COMPAT_VDSO) [N/y/?] n
vsyscall table for legacy applications
> 1. Emulate execution only (LEGACY_VSYSCALL_XONLY)
  2. None (LEGACY_VSYSCALL_NONE)
choice[1-2?]: 1
Built-in kernel command line (CMDLINE_BOOL) [N/y/?] n
Enforce strict size checking for sigaltstack (STRICT_SIGALTSTACK_SIZE) [N/y/?] n
Kernel Live Patching (LIVEPATCH) [Y/n/?] y
*
* Mitigations for CPU vulnerabilities
*
Mitigations for CPU vulnerabilities (CPU_MITIGATIONS) [Y/n/?] (NEW)
  Remove the kernel mapping in user mode (MITIGATION_PAGE_TABLE_ISOLATION) [Y/n/?] (NEW)
  Avoid speculative indirect branches in kernel (MITIGATION_RETPOLINE) [Y/n/?] (NEW)
    Enable return-thunks (MITIGATION_RETHUNK) [Y/n/?] (NEW)
      Enable UNRET on kernel entry (MITIGATION_UNRET_ENTRY) [Y/n/?] (NEW)
  Mitigate RSB underflow with call depth tracking (MITIGATION_CALL_DEPTH_TRACKING) [Y/n/?] (NEW)
    Enable call thunks and call depth tracking debugging (CALL_THUNKS_DEBUG) [N/y/?] (NEW)
  Enable IBPB on kernel entry (MITIGATION_IBPB_ENTRY) [Y/n/?] (NEW)
  Enable IBRS on kernel entry (MITIGATION_IBRS_ENTRY) [Y/n/?] (NEW)
  Mitigate speculative RAS overflow on AMD (MITIGATION_SRSO) [Y/n/?] (NEW)
  Mitigate Straight-Line-Speculation (MITIGATION_SLS) [N/y/?] (NEW)
  Mitigate Gather Data Sampling (MITIGATION_GDS) [Y/n/?] (NEW)
  RFDS Mitigation (MITIGATION_RFDS) [Y/n/?] (NEW)
  Mitigate Spectre-BHB (Branch History Injection) (MITIGATION_SPECTRE_BHI) [Y/n/?] (NEW)
  Mitigate Microarchitectural Data Sampling (MDS) hardware bug (MITIGATION_MDS) [Y/n/?] (NEW)
  Mitigate TSX Asynchronous Abort (TAA) hardware bug (MITIGATION_TAA) [Y/n/?] (NEW)
  Mitigate MMIO Stale Data hardware bug (MITIGATION_MMIO_STALE_DATA) [Y/n/?] (NEW)
  Mitigate L1 Terminal Fault (L1TF) hardware bug (MITIGATION_L1TF) [Y/n/?] (NEW)
  Mitigate RETBleed hardware bug (MITIGATION_RETBLEED) [Y/n/?] (NEW)
  Mitigate SPECTRE V1 hardware bug (MITIGATION_SPECTRE_V1) [Y/n/?] (NEW)
  Mitigate SPECTRE V2 hardware bug (MITIGATION_SPECTRE_V2) [Y/n/?] (NEW)
  Mitigate Special Register Buffer Data Sampling (SRBDS) hardware bug (MITIGATION_SRBDS) [Y/n/?] (NEW)
  Mitigate Speculative Store Bypass (SSB) hardware bug (MITIGATION_SSB) [Y/n/?] (NEW)
*
* Power management and ACPI options
*
Suspend to RAM and standby (SUSPEND) [Y/n/?] y
Hibernation (aka 'suspend to disk') (HIBERNATION) [Y/n/?] y
  Userspace snapshot device (HIBERNATION_SNAPSHOT_DEV) [Y/n/?] y
  Default compressor
  > 1. lzo (HIBERNATION_COMP_LZO) (NEW)
    2. lz4 (HIBERNATION_COMP_LZ4) (NEW)
  choice[1-2?]:
Default resume partition (PM_STD_PARTITION) []
Opportunistic sleep (PM_AUTOSLEEP) [N/y/?] n
Userspace opportunistic sleep (PM_USERSPACE_AUTOSLEEP) [N/y/?] n
User space wakeup sources interface (PM_WAKELOCKS) [N/y/?] n
Device power management core functionality (PM) [Y/?] y
  Power Management Debug Support (PM_DEBUG) [Y/n/?] y
    Extra PM attributes in sysfs for low-level debugging/testing (PM_ADVANCED_DEBUG) [N/y/?] n
    Test suspend/resume and wakealarm during bootup (PM_TEST_SUSPEND) [N/y/?] n
Suspend/resume event tracing (PM_TRACE_RTC) [Y/n/?] y
Enable workqueue power-efficient mode by default (WQ_POWER_EFFICIENT_DEFAULT) [N/y/?] n
Energy Model for devices with DVFS (CPUs, GPUs, etc) (ENERGY_MODEL) [Y/n/?] y
*
* ACPI (Advanced Configuration and Power Interface) Support
*
ACPI (Advanced Configuration and Power Interface) Support (ACPI) [Y/n/?] y
  AML debugger interface (ACPI_DEBUGGER) [N/y/?] n
  ACPI Serial Port Console Redirection Support (ACPI_SPCR_TABLE) [Y/n/?] y
  ACPI Firmware Performance Data Table (FPDT) support (ACPI_FPDT) [N/y/?] n
  Allow supported ACPI revision to be overridden (ACPI_REV_OVERRIDE_POSSIBLE) [Y/n/?] y
  EC read/write access through /sys/kernel/debug/ec (ACPI_EC_DEBUGFS) [M/n/y/?] m
  AC Adapter (ACPI_AC) [Y/n/m/?] y
  Battery (ACPI_BATTERY) [Y/n/m/?] y
  Button (ACPI_BUTTON) [Y/n/m/?] y
  Video (ACPI_VIDEO) [M/?] m
  Fan (ACPI_FAN) [Y/m/?] y
  ACPI Time and Alarm (TAD) Device Support (ACPI_TAD) [M/n/y/?] m
  Dock (ACPI_DOCK) [Y/n/?] y
  Processor (ACPI_PROCESSOR) [Y/?] y
  IPMI (ACPI_IPMI) [M/n/?] m
  Processor Aggregator (ACPI_PROCESSOR_AGGREGATOR) [M/n/y/?] m
  Thermal Zone (ACPI_THERMAL) [Y/n/m/?] y
  Allow upgrading ACPI tables via initrd (ACPI_TABLE_UPGRADE) [Y/n/?] y
  Debug Statements (ACPI_DEBUG) [Y/n/?] y
  PCI slot detection driver (ACPI_PCI_SLOT) [Y/n/?] y
  Container and Module Devices (ACPI_CONTAINER) [Y/?] y
  Memory Hotplug (ACPI_HOTPLUG_MEMORY) [Y/n/?] y
  Smart Battery System (ACPI_SBS) [M/n/y/?] m
  Hardware Error Device (ACPI_HED) [Y/?] y
  Boottime Graphics Resource Table support (ACPI_BGRT) [Y/n/?] y
  ACPI NVDIMM Firmware Interface Table (NFIT) (ACPI_NFIT) [M/n/y/?] m
    Enable debug for NVDIMM security commands (NFIT_SECURITY_DEBUG) [N/y/?] n
  ACPI Heterogeneous Memory Attribute Table Support (ACPI_HMAT) [Y/n/?] y
  ACPI Platform Error Interface (APEI) (ACPI_APEI) [Y/n/?] y
    APEI Generic Hardware Error Source (ACPI_APEI_GHES) [Y/n/?] y
    APEI PCIe AER logging/recovering support (ACPI_APEI_PCIEAER) [Y/n/?] y
  APEI memory error recovering support (ACPI_APEI_MEMORY_FAILURE) [Y/n/?] y
  APEI Error INJection (EINJ) (ACPI_APEI_EINJ) [M/n/y/?] m
  APEI Error Record Serialization Table (ERST) Debug Support (ACPI_APEI_ERST_DEBUG) [N/m/y/?] n
  Extended Error Log support (ACPI_EXTLOG) [M/n/y/?] m
  ACPI configfs support (ACPI_CONFIGFS) [M/n/y/?] m
  ACPI Platform Firmware Runtime Update and Telemetry (ACPI_PFRUT) [N/m/y/?] n
  ACPI PCC Address Space (ACPI_PCC) [Y/n/?] y
  ACPI FFH Address Space (ACPI_FFH) [N/y/?] (NEW)
  Platform Runtime Mechanism Support (ACPI_PRMT) [Y/n/?] y
*
* CPU Frequency scaling
*
CPU Frequency scaling (CPU_FREQ) [Y/?] y
  CPU frequency transition statistics (CPU_FREQ_STAT) [Y/n/?] y
  Default CPUFreq governor
    1. performance (CPU_FREQ_DEFAULT_GOV_PERFORMANCE)
    2. powersave (CPU_FREQ_DEFAULT_GOV_POWERSAVE)
    3. userspace (CPU_FREQ_DEFAULT_GOV_USERSPACE)
  > 4. schedutil (CPU_FREQ_DEFAULT_GOV_SCHEDUTIL)
  choice[1-4?]: 4
  'performance' governor (CPU_FREQ_GOV_PERFORMANCE) [Y/?] y
  'powersave' governor (CPU_FREQ_GOV_POWERSAVE) [Y/n/m/?] y
  'userspace' governor for userspace frequency scaling (CPU_FREQ_GOV_USERSPACE) [Y/n/m/?] y
  'ondemand' cpufreq policy governor (CPU_FREQ_GOV_ONDEMAND) [Y/n/m/?] y
  'conservative' cpufreq governor (CPU_FREQ_GOV_CONSERVATIVE) [Y/n/m/?] y
  'schedutil' cpufreq policy governor (CPU_FREQ_GOV_SCHEDUTIL) [Y/?] y
  *
  * CPU frequency scaling drivers
  *
  Intel P state control (X86_INTEL_PSTATE) [Y/?] y
  Processor Clocking Control interface driver (X86_PCC_CPUFREQ) [M/n/y/?] m
  AMD Processor P-State driver (X86_AMD_PSTATE) [Y/?] y
    AMD Processor P-State default mode (X86_AMD_PSTATE_DEFAULT_MODE) [3] (NEW)
    selftest for AMD Processor P-State driver (X86_AMD_PSTATE_UT) [N/m/y/?] n
  ACPI Processor P-States driver (X86_ACPI_CPUFREQ) [M/n/y/?] m
    Legacy cpb sysfs knob support for AMD CPUs (X86_ACPI_CPUFREQ_CPB) [Y/n/?] y
  AMD Opteron/Athlon64 PowerNow! (X86_POWERNOW_K8) [M/n/?] m
  AMD frequency sensitivity feedback powersave bias (X86_AMD_FREQ_SENSITIVITY) [M/n/?] m
  Intel Enhanced SpeedStep (deprecated) (X86_SPEEDSTEP_CENTRINO) [N/m/y/?] n
  Intel Pentium 4 clock modulation (X86_P4_CLOCKMOD) [M/n/y/?] m
  *
  * shared options
  *
Cpuidle Driver for Intel Processors (INTEL_IDLE) [Y/n/?] y
*
* Binary Emulations
*
IA32 Emulation (IA32_EMULATION) [Y/n/?] y
  IA32 emulation disabled by default (IA32_EMULATION_DEFAULT_DISABLED) [N/y/?] (NEW)
x32 ABI for 64-bit mode (X86_X32_ABI) [N/y/?] n
*
* Virtualization
*
Virtualization (VIRTUALIZATION) [Y/n/?] y
  Kernel-based Virtual Machine (KVM) support (KVM) [M/n/y/?] m
    KVM for Intel (and compatible) processors support (KVM_INTEL) [M/n/?] m
      Software Guard eXtensions (SGX) Virtualization (X86_SGX_KVM) [N/y/?] n
    KVM for AMD processors support (KVM_AMD) [M/n/?] m
      AMD Secure Encrypted Virtualization (SEV) support (KVM_AMD_SEV) [Y/n/?] y
    System Management Mode emulation (KVM_SMM) [Y/n/?] (NEW)
    Support for Microsoft Hyper-V emulation (KVM_HYPERV) [Y/n/?] (NEW)
    Support for Xen hypercall interface (KVM_XEN) [N/y/?] n
  Maximum number of vCPUs per KVM guest (KVM_MAX_NR_VCPUS) [4096] (NEW)
*
* General architecture-dependent options
*
Kprobes (KPROBES) [Y/?] y
Optimize very unlikely/likely branches (JUMP_LABEL) [Y/?] y
  Static key selftest (STATIC_KEYS_SELFTEST) [N/y/?] n
Static call selftest (STATIC_CALL_SELFTEST) [N/y/?] n
Enable seccomp to safely execute untrusted bytecode (SECCOMP) [Y/?] y
  Show seccomp filter cache status in /proc/pid/seccomp_cache (SECCOMP_CACHE_DEBUG) [N/y/?] n
Stack Protector buffer overflow detection (STACKPROTECTOR) [Y/n/?] y
  Strong Stack Protector (STACKPROTECTOR_STRONG) [Y/n/?] y
Link Time Optimization (LTO)
> 1. None (LTO_NONE)
choice[1]: 1
MMU page size
> 1. 4KiB pages (PAGE_SIZE_4KB) (NEW)
choice[1]: 1
Provide system calls for 32-bit time_t (COMPAT_32BIT_TIME) [Y/n/?] y
Use a virtually-mapped stack (VMAP_STACK) [Y/n/?] y
Support for randomizing kernel stack offset on syscall entry (RANDOMIZE_KSTACK_OFFSET) [Y/?] y
  Default state of kernel stack offset randomization (RANDOMIZE_KSTACK_OFFSET_DEFAULT) [N/y/?] n
Locking event counts collection (LOCK_EVENT_COUNTS) [N/y/?] n
*
* Enable loadable module support
*
Enable loadable module support (MODULES) [Y/n/?] y
  Module debugging (MODULE_DEBUG) [N/y/?] (NEW)
  Forced module loading (MODULE_FORCE_LOAD) [Y/n/?] y
  Module unloading (MODULE_UNLOAD) [Y/n/?] y
    Forced module unloading (MODULE_FORCE_UNLOAD) [Y/n/?] y
    Tainted module unload tracking (MODULE_UNLOAD_TAINT_TRACKING) [N/y/?] n
  Module versioning support (MODVERSIONS) [Y/n/?] y
  Source checksum for all modules (MODULE_SRCVERSION_ALL) [Y/n/?] y
  Module signature verification (MODULE_SIG) [Y/?] y
    Require modules to be validly signed (MODULE_SIG_FORCE) [N/y/?] n
    Automatically sign all modules (MODULE_SIG_ALL) [Y/n/?] y
  Hash algorithm to sign modules
    1. SHA-1 (MODULE_SIG_SHA1)
  > 2. SHA-256 (MODULE_SIG_SHA256)
    3. SHA-384 (MODULE_SIG_SHA384)
    4. SHA-512 (MODULE_SIG_SHA512)
    5. SHA3-256 (MODULE_SIG_SHA3_256) (NEW)
    6. SHA3-384 (MODULE_SIG_SHA3_384) (NEW)
    7. SHA3-512 (MODULE_SIG_SHA3_512) (NEW)
  choice[1-7?]:
  Module compression (MODULE_COMPRESS) [N/y/?] (NEW)
  Allow loading of modules with missing namespace imports (MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS) [N/y/?] n
  Path to modprobe binary (MODPROBE_PATH) [/sbin/modprobe] /sbin/modprobe
  Trim unused exported kernel symbols (TRIM_UNUSED_KSYMS) [N/y/?] (NEW)
*
* Enable the block layer
*
Enable the block layer (BLOCK) [Y/?] y
  Legacy autoloading support (BLOCK_LEGACY_AUTOLOAD) [Y/?] y
  Block layer SG support v4 helper lib (BLK_DEV_BSGLIB) [Y/?] y
  Block layer data integrity support (BLK_DEV_INTEGRITY) [Y/?] y
  Allow writing to mounted block devices (BLK_DEV_WRITE_MOUNTED) [Y/n/?] (NEW)
  Zoned block device support (BLK_DEV_ZONED) [Y/n/?] y
  Block layer bio throttling support (BLK_DEV_THROTTLING) [Y/n/?] y
  Enable support for block device writeback throttling (BLK_WBT) [Y/n/?] y
    Enable writeback throttling by default (BLK_WBT_MQ) [Y/n/?] y
  Enable support for latency based cgroup IO protection (BLK_CGROUP_IOLATENCY) [Y/n/?] y
  Enable support to track FC I/O Traffic across cgroup applications (BLK_CGROUP_FC_APPID) [N/y/?] n
  Enable support for cost model based cgroup IO controller (BLK_CGROUP_IOCOST) [Y/n/?] y
  Cgroup I/O controller for assigning an I/O priority class (BLK_CGROUP_IOPRIO) [N/y/?] n
  Block layer debugging information in debugfs (BLK_DEBUG_FS) [Y/n/?] y
  Logic for interfacing with Opal enabled SEDs (BLK_SED_OPAL) [Y/n/?] y
  Enable inline encryption support in block layer (BLK_INLINE_ENCRYPTION) [N/y/?] n
*
* Support for paging of anonymous memory (swap)
*
Support for paging of anonymous memory (swap) (SWAP) [Y/n/?] y
  Compressed cache for swap pages (ZSWAP) [Y/n/?] y
    Enable the compressed cache for swap pages by default (ZSWAP_DEFAULT_ON) [N/y/?] n
    Shrink the zswap pool on memory pressure (ZSWAP_SHRINKER_DEFAULT_ON) [N/y/?] (NEW)
    Default compressor
      1. Deflate (ZSWAP_COMPRESSOR_DEFAULT_DEFLATE)
    > 2. LZO (ZSWAP_COMPRESSOR_DEFAULT_LZO)
      3. 842 (ZSWAP_COMPRESSOR_DEFAULT_842)
      4. LZ4 (ZSWAP_COMPRESSOR_DEFAULT_LZ4)
      5. LZ4HC (ZSWAP_COMPRESSOR_DEFAULT_LZ4HC)
      6. zstd (ZSWAP_COMPRESSOR_DEFAULT_ZSTD)
    choice[1-6?]: 2
    Default allocator
    > 1. zbud (ZSWAP_ZPOOL_DEFAULT_ZBUD)
      2. z3foldi (DEPRECATED) (ZSWAP_ZPOOL_DEFAULT_Z3FOLD_DEPRECATED) (NEW)
      3. zsmalloc (ZSWAP_ZPOOL_DEFAULT_ZSMALLOC)
    choice[1-3?]:
    2:1 compression allocator (zbud) (ZBUD) [Y/?] y
    3:1 compression allocator (z3fold) (DEPRECATED) (Z3FOLD_DEPRECATED) [N/m/y/?] (NEW)
*
* Memory Management options
*
N:1 compression allocator (zsmalloc) (ZSMALLOC) [Y/m/?] y
  Export zsmalloc statistics (ZSMALLOC_STAT) [N/y/?] n
  Maximum number of physical pages per-zspage (ZSMALLOC_CHAIN_SIZE) [8] (NEW)
*
* Slab allocator options
*
Allow slab caches to be merged (SLAB_MERGE_DEFAULT) [Y/n/?] y
Randomize slab freelist (SLAB_FREELIST_RANDOM) [Y/n/?] y
Harden slab freelist metadata (SLAB_FREELIST_HARDENED) [Y/n/?] y
Support allocation from separate kmalloc buckets (SLAB_BUCKETS) [Y/n/?] (NEW)
Enable performance statistics (SLUB_STATS) [N/y/?] n
Enable per cpu partial caches (SLUB_CPU_PARTIAL) [Y/n/?] y
Randomize slab caches for normal kmalloc (RANDOM_KMALLOC_CACHES) [N/y/?] (NEW)
Page allocator randomization (SHUFFLE_PAGE_ALLOCATOR) [Y/n/?] y
Disable heap randomization (COMPAT_BRK) [N/y/?] n
Sparse Memory virtual memmap (SPARSEMEM_VMEMMAP) [Y/?] y
Allow for balloon memory compaction/migration (BALLOON_COMPACTION) [Y/n/?] y
Allow for memory compaction (COMPACTION) [Y/?] y
Free page reporting (PAGE_REPORTING) [Y/n/?] y
Page migration (MIGRATION) [Y/?] y
Maximum scale factor of PCP (Per-CPU pageset) batch allocate/free (PCP_BATCH_SCALE_MAX) [5] (NEW)
Enable KSM for page merging (KSM) [Y/n/?] y
Low address space to protect from user allocation (DEFAULT_MMAP_MIN_ADDR) [65536] 65536
Enable recovery from hardware memory errors (MEMORY_FAILURE) [Y/n/?] y
  HWPoison pages injector (HWPOISON_INJECT) [M/n/y/?] m
*
* Transparent Hugepage Support
*
Transparent Hugepage Support (TRANSPARENT_HUGEPAGE) [Y/n/?] y
  Transparent Hugepage Support sysfs defaults
    1. always (TRANSPARENT_HUGEPAGE_ALWAYS)
  > 2. madvise (TRANSPARENT_HUGEPAGE_MADVISE)
    3. never (TRANSPARENT_HUGEPAGE_NEVER) (NEW)
  choice[1-3?]:
  Read-only THP for filesystems (EXPERIMENTAL) (READ_ONLY_THP_FOR_FS) [N/y/?] n
Contiguous Memory Allocator (CMA) [Y/n/?] y
  CMA debugfs interface (CMA_DEBUGFS) [N/y/?] n
  CMA information through sysfs interface (CMA_SYSFS) [N/y/?] n
  Maximum count of the CMA areas (CMA_AREAS) [7] 7
Track memory changes (MEM_SOFT_DIRTY) [Y/n/?] y
Defer initialisation of struct pages to kthreads (DEFERRED_STRUCT_PAGE_INIT) [Y/n/?] y
Enable idle page tracking (IDLE_PAGE_TRACKING) [N/y/?] n
Device memory (pmem, HMM, etc...) hotplug support (ZONE_DEVICE) [Y/n/?] y
Unaddressable device memory (GPU memory, ...) (DEVICE_PRIVATE) [Y/n/?] y
Collect percpu memory statistics (PERCPU_STATS) [N/y/?] n
Enable infrastructure for get_user_pages()-related unit tests (GUP_TEST) [N/y/?] n
Enable a module to run time tests on dma_pool (DMAPOOL_TEST) [N/m/y/?] (NEW)
Anonymous VMA name support (ANON_VMA_NAME) [N/y/?] n
Multi-Gen LRU (LRU_GEN) [Y/n/?] y
  Enable by default (LRU_GEN_ENABLED) [Y/n/?] y
  Full stats for debugging (LRU_GEN_STATS) [N/y/?] n
NUMA emulation (NUMA_EMU) [N/y/?] n
*
* Networking options
*
Packet socket (PACKET) [Y/n/m/?] y
  Packet: sockets monitoring interface (PACKET_DIAG) [M/n/y/?] m
Unix domain sockets (UNIX) [Y/?] y
  UNIX: socket monitoring interface (UNIX_DIAG) [M/n/y/?] m
Transport Layer Security support (TLS) [M/n/y/?] m
  Transport Layer Security HW offload (TLS_DEVICE) [Y/n/?] y
  Transport Layer Security TCP stack bypass (TLS_TOE) [N/y/?] n
Transformation user configuration interface (XFRM_USER) [Y/n/m/?] y
  Compatible ABI support (XFRM_USER_COMPAT) [N/m/y/?] n
Transformation virtual interface (XFRM_INTERFACE) [M/n/y/?] m
Transformation sub policy support (XFRM_SUB_POLICY) [Y/n/?] y
Transformation migrate database (XFRM_MIGRATE) [Y/?] y
Transformation statistics (XFRM_STATISTICS) [Y/n/?] y
PF_KEY sockets (NET_KEY) [M/n/y/?] m
  PF_KEY MIGRATE (NET_KEY_MIGRATE) [Y/n/?] y
SMC socket protocol family (SMC) [M/n/?] m
  SMC: socket monitoring interface (SMC_DIAG) [M/n/?] m
  SMC intra-OS shortcut with loopback-ism (SMC_LO) [N/y/?] (NEW)
XDP sockets (XDP_SOCKETS) [Y/n/?] y
  XDP sockets: monitoring interface (XDP_SOCKETS_DIAG) [M/n/y/?] m
TCP/IP networking (INET) [Y/?] y
  IP: multicasting (IP_MULTICAST) [Y/n/?] y
  IP: advanced router (IP_ADVANCED_ROUTER) [Y/n/?] y
    FIB TRIE statistics (IP_FIB_TRIE_STATS) [Y/n/?] y
    IP: policy routing (IP_MULTIPLE_TABLES) [Y/n/?] y
    IP: equal cost multipath (IP_ROUTE_MULTIPATH) [Y/n/?] y
    IP: verbose route monitoring (IP_ROUTE_VERBOSE) [Y/n/?] y
  IP: kernel level autoconfiguration (IP_PNP) [N/y/?] n
  IP: tunneling (NET_IPIP) [M/n/y/?] m
  IP: GRE demultiplexer (NET_IPGRE_DEMUX) [M/n/y/?] m
  IP: GRE tunnels over IP (NET_IPGRE) [M/n/?] m
    IP: broadcast GRE over IP (NET_IPGRE_BROADCAST) [Y/n/?] y
  IP: multicast routing (IP_MROUTE) [Y/n/?] y
    IP: multicast policy routing (IP_MROUTE_MULTIPLE_TABLES) [Y/n/?] y
    IP: PIM-SM version 1 support (IP_PIMSM_V1) [Y/n/?] y
    IP: PIM-SM version 2 support (IP_PIMSM_V2) [Y/n/?] y
  IP: TCP syncookie support (SYN_COOKIES) [Y/?] y
  Virtual (secure) IP: tunneling (NET_IPVTI) [M/n/y/?] m
  IP: Foo (IP protocols) over UDP (NET_FOU) [M/y/?] m
  IP: FOU encapsulation of IP tunnels (NET_FOU_IP_TUNNELS) [Y/n/?] y
  IP: AH transformation (INET_AH) [M/n/y/?] m
  IP: ESP transformation (INET_ESP) [M/n/y/?] m
    IP: ESP transformation offload (INET_ESP_OFFLOAD) [M/n/?] m
    IP: ESP in TCP encapsulation (RFC 8229) (INET_ESPINTCP) [N/y/?] n
  IP: IPComp transformation (INET_IPCOMP) [M/n/y/?] m
  INET: socket monitoring interface (INET_DIAG) [M/n/y/?] m
    UDP: socket monitoring interface (INET_UDP_DIAG) [M/n/?] m
    RAW: socket monitoring interface (INET_RAW_DIAG) [M/n/?] m
    INET: allow privileged process to administratively close sockets (INET_DIAG_DESTROY) [Y/n/?] y
  TCP: Authentication Option (RFC5925) (TCP_AO) [N/y/?] (NEW)
  TCP: MD5 Signature Option support (RFC2385) (TCP_MD5SIG) [Y/n/?] y
  NetLabel subsystem support (NETLABEL) [Y/n/?] y
  MPTCP: Multipath TCP (MPTCP) [Y/n/?] y
    MPTCP: IPv6 support for Multipath TCP (MPTCP_IPV6) [Y/n/?] y
Security Marking (NETWORK_SECMARK) [Y/?] y
Timestamping in PHY devices (NETWORK_PHY_TIMESTAMPING) [Y/n/?] y
The Reliable Datagram Sockets Protocol (RDS) [M/n/y/?] m
  RDS over Infiniband (RDS_RDMA) [M/n/?] m
  RDS over TCP (RDS_TCP) [M/n/?] m
  RDS debugging messages (RDS_DEBUG) [N/y/?] n
Asynchronous Transfer Mode (ATM) (ATM) [M/n/y/?] m
  Classical IP over ATM (ATM_CLIP) [M/n/?] m
    Do NOT send ICMP if no neighbour (ATM_CLIP_NO_ICMP) [N/y/?] n
  LAN Emulation (LANE) support (ATM_LANE) [M/n/?] m
    Multi-Protocol Over ATM (MPOA) support (ATM_MPOA) [N/m/?] n
  RFC1483/2684 Bridged protocols (ATM_BR2684) [M/n/?] m
    Per-VC IP filter kludge (ATM_BR2684_IPFILTER) [N/y/?] n
802.1d Ethernet Bridging (BRIDGE) [M/n/y/?] m
  IGMP/MLD snooping (BRIDGE_IGMP_SNOOPING) [Y/n/?] y
  VLAN filtering (BRIDGE_VLAN_FILTERING) [Y/n/?] y
  MRP protocol (BRIDGE_MRP) [Y/n/?] y
  CFM protocol (BRIDGE_CFM) [Y/n/?] y
*
* Distributed Switch Architecture
*
Distributed Switch Architecture (NET_DSA) [M/n/?] m
  No-op tag driver (NET_DSA_TAG_NONE) [M/?] (NEW) m
  Tag driver for Atheros AR9331 SoC with built-in switch (NET_DSA_TAG_AR9331) [N/m/?] n
  Tag driver for Broadcom switches using in-frame headers (NET_DSA_TAG_BRCM) [M/?] m
  Tag driver for Broadcom legacy switches using in-frame headers (NET_DSA_TAG_BRCM_LEGACY) [M/?] m
  Tag driver for Broadcom switches using prepended headers (NET_DSA_TAG_BRCM_PREPEND) [M/?] m
  Tag driver for Hirschmann Hellcreek TSN switches (NET_DSA_TAG_HELLCREEK) [N/m/?] n
  Tag driver for Lantiq / Intel GSWIP switches (NET_DSA_TAG_GSWIP) [M/n/?] m
  Tag driver for Marvell switches using DSA headers (NET_DSA_TAG_DSA) [M/?] m
  Tag driver for Marvell switches using EtherType DSA headers (NET_DSA_TAG_EDSA) [M/?] m
  Tag driver for Mediatek switches (NET_DSA_TAG_MTK) [M/?] m
  Tag driver for Microchip 8795/937x/9477/9893 families of switches (NET_DSA_TAG_KSZ) [M/?] m
  Tag driver for Ocelot family of switches, using NPI port (NET_DSA_TAG_OCELOT) [N/m/?] n
  Tag driver for Ocelot family of switches, using VLAN (NET_DSA_TAG_OCELOT_8021Q) [N/m/?] n
  Tag driver for Qualcomm Atheros QCA8K switches (NET_DSA_TAG_QCA) [M/?] m
  Tag driver for Realtek 4 byte protocol A tags (NET_DSA_TAG_RTL4_A) [N/m/?] n
  Tag driver for Realtek 8 byte protocol 4 tags (NET_DSA_TAG_RTL8_4) [N/m/?] n
  Tag driver for Renesas RZ/N1 A5PSW switch (NET_DSA_TAG_RZN1_A5PSW) [N/m/?] n
  Tag driver for SMSC/Microchip LAN9303 family of switches (NET_DSA_TAG_LAN9303) [M/?] m
  Tag driver for NXP SJA1105 switches (NET_DSA_TAG_SJA1105) [M/n/?] m
  Tag driver for switches using a trailer tag (NET_DSA_TAG_TRAILER) [M/n/?] m
  Tag driver for Microchip/Vitesse VSC73xx family of switches, using VLAN (NET_DSA_TAG_VSC73XX_8021Q) [N/m/?] (NEW)
  Tag driver for XRS700x switches (NET_DSA_TAG_XRS700X) [N/m/?] n
802.1Q/802.1ad VLAN Support (VLAN_8021Q) [M/n/y/?] m
  GVRP (GARP VLAN Registration Protocol) support (VLAN_8021Q_GVRP) [Y/n/?] y
  MVRP (Multiple VLAN Registration Protocol) support (VLAN_8021Q_MVRP) [Y/n/?] y
ANSI/IEEE 802.2 LLC type 2 Support (LLC2) [N/m/y/?] n
Appletalk protocol support (ATALK) [M/n/y/?] m
CCITT X.25 Packet Layer (X25) [N/m/y/?] n
LAPB Data Link Driver (LAPB) [N/m/y/?] n
Phonet protocols family (PHONET) [N/m/y/?] n
Data Center Bridging support (DCB) [Y/?] y
DNS Resolver support (DNS_RESOLVER) [M/y/?] m
B.A.T.M.A.N. Advanced Meshing Protocol (BATMAN_ADV) [M/n/y/?] m
  B.A.T.M.A.N. V protocol (BATMAN_ADV_BATMAN_V) [Y/n/?] y
  Bridge Loop Avoidance (BATMAN_ADV_BLA) [Y/n/?] y
  Distributed ARP Table (BATMAN_ADV_DAT) [Y/n/?] y
  Network Coding (BATMAN_ADV_NC) [Y/n/?] y
  Multicast optimisation (BATMAN_ADV_MCAST) [Y/n/?] y
  B.A.T.M.A.N. debugging (BATMAN_ADV_DEBUG) [N/y/?] n
  B.A.T.M.A.N. tracing support (BATMAN_ADV_TRACING) [Y/n/?] y
Open vSwitch (OPENVSWITCH) [M/n/?] m
  Open vSwitch GRE tunneling support (OPENVSWITCH_GRE) [M/n/?] m
  Open vSwitch VXLAN tunneling support (OPENVSWITCH_VXLAN) [M/n/?] m
  Open vSwitch Geneve tunneling support (OPENVSWITCH_GENEVE) [M/n/?] m
Virtual Socket protocol (VSOCKETS) [M/n/y/?] m
  Virtual Sockets monitoring interface (VSOCKETS_DIAG) [M/n/?] m
  Virtual Sockets loopback transport (VSOCKETS_LOOPBACK) [M/n/?] m
  VMware VMCI transport for Virtual Sockets (VMWARE_VMCI_VSOCKETS) [M/n/?] m
NETLINK: socket monitoring interface (NETLINK_DIAG) [M/n/y/?] m
High-availability Seamless Redundancy (HSR & PRP) (HSR) [N/m/y/?] n
Switch (and switch-ish) device support (NET_SWITCHDEV) [Y/?] y
L3 Master device support (NET_L3_MASTER_DEV) [Y/?] y
Qualcomm IPC Router support (QRTR) [N/m/y/?] n
NCSI interface support (NET_NCSI) [Y/n/?] y
  Get NCSI OEM MAC Address (NCSI_OEM_CMD_GET_MAC) [Y/n/?] y
  Keep PHY Link up (NCSI_OEM_CMD_KEEP_PHY) [N/y/?] n
Use percpu variables to maintain network device refcount (PCPU_DEV_REFCNT) [Y/n/?] y
Maximum number of fragments per skb_shared_info (MAX_SKB_FRAGS) [17] (NEW)
Receive packet steering (RPS) [Y/n/?] y
  Hardware acceleration of RFS (RFS_ACCEL) [Y/n/?] y
Network priority cgroup (CGROUP_NET_PRIO) [Y/n/?] y
Network classid cgroup (CGROUP_NET_CLASSID) [Y/?] y
Enable Byte Queue Limits (BQL) [Y/n/?] y
enable BPF STREAM_PARSER (BPF_STREAM_PARSER) [Y/n/?] y
Net flow limit (NET_FLOW_LIMIT) [Y/n/?] y
*
* Bluetooth subsystem support
*
Bluetooth subsystem support (BT) [M/n/?] m
  Bluetooth Classic (BR/EDR) features (BT_BREDR) [Y/n/?] y
    RFCOMM protocol support (BT_RFCOMM) [M/n/y/?] m
      RFCOMM TTY support (BT_RFCOMM_TTY) [Y/n/?] y
    BNEP protocol support (BT_BNEP) [M/n/y/?] m
      Multicast filter support (BT_BNEP_MC_FILTER) [Y/n/?] y
      Protocol filter support (BT_BNEP_PROTO_FILTER) [Y/n/?] y
    HIDP protocol support (BT_HIDP) [M/n/y/?] m
  Bluetooth Low Energy (LE) features (BT_LE) [Y/n/?] y
    Bluetooth L2CAP Enhanced Credit Flow Control (BT_LE_L2CAP_ECRED) [Y/n/?] (NEW)
    Bluetooth 6LoWPAN support (BT_6LOWPAN) [M/n/?] m
  Enable LED triggers (BT_LEDS) [Y/n/?] y
  Enable Microsoft extensions (BT_MSFTEXT) [Y/n/?] y
  Enable Android Open Source Project extensions (BT_AOSPEXT) [N/y/?] n
  Export Bluetooth internals in debugfs (BT_DEBUGFS) [Y/n/?] y
  Bluetooth self testing support (BT_SELFTEST) [N/y/?] n
  *
  * Bluetooth device drivers
  *
  HCI USB driver (BT_HCIBTUSB) [M/n/?] m
    Enable USB autosuspend for Bluetooth USB devices by default (BT_HCIBTUSB_AUTOSUSPEND) [Y/n/?] y
    Enable USB poll_sync for Bluetooth USB devices by default (BT_HCIBTUSB_POLL_SYNC) [Y/n/?] (NEW)
    Broadcom protocol support (BT_HCIBTUSB_BCM) [Y/n/?] y
    MediaTek protocol support (BT_HCIBTUSB_MTK) [N/y/?] n
    Realtek protocol support (BT_HCIBTUSB_RTL) [Y/n/?] y
  HCI SDIO driver (BT_HCIBTSDIO) [M/n/?] m
  HCI UART driver (BT_HCIUART) [M/n/?] m
    UART (H4) protocol support (BT_HCIUART_H4) [Y/?] y
    UART Nokia H4+ protocol support (BT_HCIUART_NOKIA) [M/n/?] m
    BCSP protocol support (BT_HCIUART_BCSP) [Y/n/?] y
    Atheros AR300x serial support (BT_HCIUART_ATH3K) [Y/n/?] y
  HCILL protocol support (BT_HCIUART_LL) [Y/n/?] y
  Three-wire UART (H5) protocol support (BT_HCIUART_3WIRE) [Y/?] y
  Intel protocol support (BT_HCIUART_INTEL) [Y/n/?] y
  Broadcom protocol support (BT_HCIUART_BCM) [Y/n/?] y
  Realtek protocol support (BT_HCIUART_RTL) [Y/n/?] y
  Qualcomm Atheros protocol support (BT_HCIUART_QCA) [Y/n/?] y
  Intel AG6XX protocol support (BT_HCIUART_AG6XX) [Y/n/?] y
  Marvell protocol support (BT_HCIUART_MRVL) [Y/n/?] y
  Amlogic protocol support (BT_HCIUART_AML) [N/y/?] (NEW)
  HCI BCM203x USB driver (BT_HCIBCM203X) [M/n/?] m
  HCI BCM4377/4378/4387/4388 PCIe driver (BT_HCIBCM4377) [N/m/?] (NEW)
  HCI BPA10x USB driver (BT_HCIBPA10X) [M/n/?] m
  HCI BlueFRITZ! USB driver (BT_HCIBFUSB) [M/n/?] m
  HCI DTL1 (PC Card) driver (BT_HCIDTL1) [M/n/?] m
  HCI BT3C (PC Card) driver (BT_HCIBT3C) [M/n/?] m
  HCI BlueCard (PC Card) driver (BT_HCIBLUECARD) [M/n/?] m
  HCI VHCI (Virtual HCI device) driver (BT_HCIVHCI) [M/n/?] m
  Marvell Bluetooth driver support (BT_MRVL) [M/n/?] m
    Marvell BT-over-SDIO driver (BT_MRVL_SDIO) [M/n/?] m
  Atheros firmware download driver (BT_ATH3K) [M/n/?] m
  MediaTek HCI SDIO driver (BT_MTKSDIO) [M/n/?] m
  MediaTek HCI UART driver (BT_MTKUART) [N/m/?] n
  NXP protocol support (BT_NXPUART) [N/m/?] (NEW)
  Intel HCI PCIe driver (BT_INTEL_PCIE) [N/m/?] (NEW)
*
* Networking support
*
Networking support (NET) [Y/?] y
  RxRPC session sockets (AF_RXRPC) [M/y/?] m
    IPv6 support for RxRPC (AF_RXRPC_IPV6) [Y/n/?] y
    Inject packet loss into RxRPC packet stream (AF_RXRPC_INJECT_LOSS) [N/y/?] n
    Inject delay into packet reception (AF_RXRPC_INJECT_RX_DELAY) [N/y/?] (NEW)
    RxRPC dynamic debugging (AF_RXRPC_DEBUG) [Y/n/?] y
    RxRPC Kerberos security (RXKAD) [Y/n/?] y
    RxRPC test service (RXPERF) [N/m/?] (NEW)
  KCM sockets (AF_KCM) [M/n/y/?] m
  Ceph core library (CEPH_LIB) [M/y/?] m
    Include file:line in ceph debug output (CEPH_LIB_PRETTYDEBUG) [N/y/?] n
    Use in-kernel support for DNS lookup (CEPH_LIB_USE_DNS_RESOLVER) [N/y/?] n
  Network light weight tunnels (LWTUNNEL) [Y/?] y
    Execute BPF program as route nexthop action (LWTUNNEL_BPF) [Y/n/?] y
  Page pool stats (PAGE_POOL_STATS) [N/y/?] n
  Generic failover module (FAILOVER) [M/y/?] m
  Netlink interface for ethtool (ETHTOOL_NETLINK) [Y/n/?] y
*
* PCI support
*
PCI support (PCI) [Y/n/?] y
  PCI Express Port Bus support (PCIEPORTBUS) [Y/n/?] y
    PCI Express Hotplug driver (HOTPLUG_PCI_PCIE) [Y/n/?] y
    PCI Express Advanced Error Reporting support (PCIEAER) [Y/n/?] y
      PCI Express error injection support (PCIEAER_INJECT) [M/n/y/?] m
      PCI Express ECRC settings control (PCIE_ECRC) [Y/n/?] y
  PCI Express ASPM control (PCIEASPM) [Y/?] y
    Default ASPM policy
    > 1. BIOS default (PCIEASPM_DEFAULT)
      2. Powersave (PCIEASPM_POWERSAVE)
      3. Power Supersave (PCIEASPM_POWER_SUPERSAVE)
      4. Performance (PCIEASPM_PERFORMANCE)
    choice[1-4?]: 1
  PCI Express Downstream Port Containment support (PCIE_DPC) [Y/n/?] y
  PCI Express Precision Time Measurement support (PCIE_PTM) [Y/n/?] y
  PCI Express Error Disconnect Recover support (PCIE_EDR) [N/y/?] n
  Message Signaled Interrupts (MSI and MSI-X) (PCI_MSI) [Y/?] y
  PCI Debugging (PCI_DEBUG) [N/y/?] n
  Enable PCI resource re-allocation detection (PCI_REALLOC_ENABLE_AUTO) [N/y/?] n
  PCI Stub driver (PCI_STUB) [Y/n/m/?] y
  PCI PF Stub driver (PCI_PF_STUB) [M/n/y/?] m
  Xen PCI Frontend (XEN_PCIDEV_FRONTEND) [M/n/y/?] m
  PCI IOV support (PCI_IOV) [Y/?] y
  Native PCIe Enclosure Management (PCI_NPEM) [N/y/?] (NEW)
  PCI PRI support (PCI_PRI) [Y/?] y
  PCI PASID support (PCI_PASID) [Y/?] y
  PCI peer-to-peer transfer support (PCI_P2PDMA) [Y/n/?] y
  VGA Arbitration (VGA_ARB) [Y/?] y
    Maximum number of GPUs (VGA_ARB_MAX_GPUS) [16] 16
*
* Firmware loader
*
Firmware loading facility (FW_LOADER) [Y/?] y
  Log filenames and checksums for loaded firmware (FW_LOADER_DEBUG) [Y/n/?] (NEW)
  Build named firmware blobs into the kernel binary (EXTRA_FIRMWARE) []
  Enable the firmware sysfs fallback mechanism (FW_LOADER_USER_HELPER) [N/y/?] n
  Enable compressed firmware support (FW_LOADER_COMPRESS) [Y/n/?] y
    Enable XZ-compressed firmware support (FW_LOADER_COMPRESS_XZ) [Y/n/?] y
    Enable ZSTD-compressed firmware support (FW_LOADER_COMPRESS_ZSTD) [N/y/?] n
  Enable firmware caching during suspend (FW_CACHE) [Y/n/?] y
  Enable users to initiate firmware updates using sysfs (FW_UPLOAD) [N/y/?] n
*
* Generic Driver Options
*
Support for uevent helper (UEVENT_HELPER) [N/y/?] n
Maintain a devtmpfs filesystem to mount at /dev (DEVTMPFS) [Y/?] y
  Automount devtmpfs at /dev, after the kernel mounted the rootfs (DEVTMPFS_MOUNT) [Y/n/?] y
  Use nosuid,noexec mount options on devtmpfs (DEVTMPFS_SAFE) [N/y/?] n
Select only drivers that don't need compile-time external firmware (STANDALONE) [Y/n/?] y
Disable drivers features which enable custom firmware building (PREVENT_FIRMWARE_BUILD) [Y/n/?] y
Driver Core verbose debug messages (DEBUG_DRIVER) [N/y/?] n
Managed device resources verbose debug messages (DEBUG_DEVRES) [Y/n/?] y
Test driver remove calls during probe (UNSTABLE) (DEBUG_TEST_DRIVER_REMOVE) [N/y/?] n
Build kernel module to test asynchronous driver probing (TEST_ASYNC_DRIVER_PROBE) [N/m/?] n
Enable verbose DMA_FENCE_TRACE messages (DMA_FENCE_TRACE) [N/y/?] n
sync_state() behavior defaults to timeout instead of strict (FW_DEVLINK_SYNC_STATE_TIMEOUT) [N/y/?] (NEW)
*
* Firmware Drivers
*
BIOS Enhanced Disk Drive calls determine boot disk (EDD) [M/n/y/?] m
  Sets default behavior for EDD detection to off (EDD_OFF) [N/y/?] n
Export DMI identification via sysfs to userspace (DMIID) [Y/?] y
DMI table support in sysfs (DMI_SYSFS) [Y/n/m/?] y
iSCSI Boot Firmware Table Attributes (ISCSI_IBFT_FIND) [Y/?] y
iSCSI Boot Firmware Table Attributes module (ISCSI_IBFT) [M/n/y/?] m
QEMU fw_cfg device support in sysfs (FW_CFG_SYSFS) [M/n/y/?] m
  QEMU fw_cfg device parameter parsing (FW_CFG_SYSFS_CMDLINE) [N/y/?] n
Mark VGA/VBE/EFI FB as generic system framebuffer (SYSFB_SIMPLEFB) [N/y/?] n
IMX SCMI MISC Protocol driver (IMX_SCMI_MISC_DRV) [N/m/y/?] (NEW)
*
* Enable UBI - Unsorted block images
*
Enable UBI - Unsorted block images (MTD_UBI) [M/n/?] m
  UBI wear-leveling threshold (MTD_UBI_WL_THRESHOLD) [4096] 4096
  Maximum expected bad eraseblock count per 1024 eraseblocks (MTD_UBI_BEB_LIMIT) [20] 20
  UBI Fastmap (Experimental feature) (MTD_UBI_FASTMAP) [N/y/?] n
  MTD devices emulation driver (gluebi) (MTD_UBI_GLUEBI) [N/m/?] n
  Read-only block devices on top of UBI volumes (MTD_UBI_BLOCK) [N/y/?] n
  UBI virtual NVMEM (MTD_UBI_NVMEM) [N/m/?] (NEW)
*
* Block devices
*
Block devices (BLK_DEV) [Y/n/?] y
  Null test block driver (BLK_DEV_NULL_BLK) [M/n/y/?] m
  Normal floppy disk support (BLK_DEV_FD) [M/n/y/?] m
    Support for raw floppy disk commands (DEPRECATED) (BLK_DEV_FD_RAWCMD) [N/y/?] n
  Block Device Driver for Micron PCIe SSDs (BLK_DEV_PCIESSD_MTIP32XX) [M/n/y/?] m
  Compressed RAM block device support (ZRAM) [M/n/y/?] m
    lz4 compression support (ZRAM_BACKEND_LZ4) [N/y/?] (NEW)
    lz4hc compression support (ZRAM_BACKEND_LZ4HC) [N/y/?] (NEW)
    zstd compression support (ZRAM_BACKEND_ZSTD) [N/y/?] (NEW)
    deflate compression support (ZRAM_BACKEND_DEFLATE) [N/y/?] (NEW)
    842 compression support (ZRAM_BACKEND_842) [N/y/?] (NEW)
    Default zram compressor
    > 1. lzo-rle (ZRAM_DEF_COMP_LZORLE)
      2. lzo (ZRAM_DEF_COMP_LZO)
    choice[1-2?]: 1
    Write back incompressible or idle page to backing device (ZRAM_WRITEBACK) [Y/n/?] y
    Track access time of zram entries (ZRAM_TRACK_ENTRY_ACTIME) [Y/?] (NEW) y
    Track zRam block status (ZRAM_MEMORY_TRACKING) [Y/n/?] y
    Enable multiple compression streams (ZRAM_MULTI_COMP) [N/y/?] (NEW)
  Loopback device support (BLK_DEV_LOOP) [M/n/y/?] m
    Number of loop devices to pre-create at init time (BLK_DEV_LOOP_MIN_COUNT) [0] 0
  DRBD Distributed Replicated Block Device support (BLK_DEV_DRBD) [M/n/y/?] m
    DRBD fault injection (DRBD_FAULT_INJECTION) [N/y/?] n
  Network block device support (BLK_DEV_NBD) [M/n/y/?] m
  RAM block device support (BLK_DEV_RAM) [M/n/y/?] m
    Default number of RAM disks (BLK_DEV_RAM_COUNT) [16] 16
    Default RAM disk size (kbytes) (BLK_DEV_RAM_SIZE) [16384] 16384
  Packet writing on CD/DVD media (DEPRECATED) (CDROM_PKTCDVD) [M/n/y/?] m
    Free buffers for data gathering (CDROM_PKTCDVD_BUFFERS) [8] 8
    Enable write caching (CDROM_PKTCDVD_WCACHE) [N/y/?] n
  ATA over Ethernet support (ATA_OVER_ETH) [M/n/y/?] m
  Xen virtual block device support (XEN_BLKDEV_FRONTEND) [M/n/y/?] m
  Xen block-device backend driver (XEN_BLKDEV_BACKEND) [M/n/y/?] m
  Rados block device (RBD) (BLK_DEV_RBD) [M/n/y/?] m
  Userspace block driver (Experimental) (BLK_DEV_UBLK) [N/m/y/?] n
  RDMA Network Block Device driver client (BLK_DEV_RNBD_CLIENT) [N/m/?] n
  RDMA Network Block Device driver server (BLK_DEV_RNBD_SERVER) [N/m/?] n
*
* NVME Support
*
NVM Express block device (BLK_DEV_NVME) [M/n/y/?] m
NVMe multipath support (NVME_MULTIPATH) [Y/n/?] y
NVMe verbose error reporting (NVME_VERBOSE_ERRORS) [N/y/?] n
NVMe hardware monitoring (NVME_HWMON) [Y/n/?] y
NVM Express over Fabrics RDMA host driver (NVME_RDMA) [M/n/?] m
NVM Express over Fabrics FC host driver (NVME_FC) [M/n/y/?] m
NVM Express over Fabrics TCP host driver (NVME_TCP) [M/n/y/?] m
  NVMe over Fabrics TCP TLS encryption support (NVME_TCP_TLS) [N/y/?] (NEW)
NVMe over Fabrics In-Band Authentication in host side (NVME_HOST_AUTH) [N/y/?] (NEW)
NVMe Target support (NVME_TARGET) [M/n/?] m
  NVMe Target debugfs support (NVME_TARGET_DEBUGFS) [N/y/?] (NEW)
  NVMe Target Passthrough support (NVME_TARGET_PASSTHRU) [Y/n/?] y
  NVMe loopback device support (NVME_TARGET_LOOP) [M/n/?] m
  NVMe over Fabrics RDMA target support (NVME_TARGET_RDMA) [M/n/?] m
  NVMe over Fabrics FC target driver (NVME_TARGET_FC) [M/n/?] m
    NVMe over Fabrics FC Transport Loopback Test driver (NVME_TARGET_FCLOOP) [M/n/?] m
  NVMe over Fabrics TCP target support (NVME_TARGET_TCP) [M/n/?] m
    NVMe over Fabrics TCP target TLS encryption support (NVME_TARGET_TCP_TLS) [N/y/?] (NEW)
  NVMe over Fabrics In-band Authentication in target side (NVME_TARGET_AUTH) [N/y/?] n
*
* Misc devices
*
Analog Devices Digital Potentiometers (AD525X_DPOT) [N/m/y/?] n
Dummy IRQ handler (DUMMY_IRQ) [N/m/y/?] n
Device driver for IBM RSA service processor (IBM_ASM) [M/n/y/?] m
Sensable PHANToM (PCI) (PHANTOM) [N/m/y/?] n
RPMB partition interface (RPMB) [N/m/?] (NEW)
TI Flash Media interface support (TIFM_CORE) [M/y/?] m
  TI Flash Media PCI74xx/PCI76xx host adapter support (TIFM_7XX1) [M/n/?] m
Integrated Circuits ICS932S401 (ICS932S401) [N/m/?] n
Enclosure Services (ENCLOSURE_SERVICES) [M/n/y/?] m
Support communication between SGI SSIs (SGI_XP) [M/n/y/?] m
Channel interface driver for the HP iLO processor (HP_ILO) [M/n/y/?] m
SGI GRU driver (SGI_GRU) [M/y/?] m
  SGI GRU driver debug (SGI_GRU_DEBUG) [N/y/?] n
Medfield Avago APDS9802 ALS Sensor module (APDS9802ALS) [M/n/?] m
Intersil ISL29003 ambient light sensor (ISL29003) [M/n/?] m
Intersil ISL29020 ambient light sensor (ISL29020) [M/n/?] m
Taos TSL2550 ambient light sensor (SENSORS_TSL2550) [M/n/?] m
BH1770GLC / SFH7770 combined ALS - Proximity sensor (SENSORS_BH1770) [M/n/?] m
APDS990X combined als and proximity sensors (SENSORS_APDS990X) [M/n/?] m
Honeywell HMC6352 compass (HMC6352) [N/m/?] n
Dallas DS1682 Total Elapsed Time Recorder with Alarm (DS1682) [N/m/?] n
VMware Balloon Driver (VMWARE_BALLOON) [M/n/?] m
Lattice ECP3 FPGA bitstream configuration via SPI (LATTICE_ECP3_CONFIG) [N/m/y/?] n
Generic on-chip SRAM driver (SRAM) [N/y/?] n
Synopsys DesignWare xData PCIe driver (DW_XDATA_PCIE) [N/m/y/?] n
PCI Endpoint Test driver (PCI_ENDPOINT_TEST) [N/m/y/?] n
Xilinx SDFEC 16 (XILINX_SDFEC) [N/m/y/?] n
ENE CB710/720 Flash memory card reader support (CB710_CORE) [M/y/?] m
  Enable driver debugging (CB710_DEBUG) [N/y/?] n
STMicroeletronics LIS3LV02Dx three-axis digital accelerometer (I2C) (SENSORS_LIS3_I2C) [M/n/?] m
*
* Altera FPGA firmware download module (requires I2C)
*
Altera FPGA firmware download module (ALTERA_STAPL) [M/n/?] m
Intel Management Engine Interface (INTEL_MEI) [M/n/y/?] m
  ME Enabled Intel Chipsets (INTEL_MEI_ME) [M/n/?] m
  Intel Trusted Execution Environment with ME Interface (INTEL_MEI_TXE) [M/n/?] m
  Intel MEI GSC embedded device (INTEL_MEI_GSC) [N/m/?] n
  Intel visual sensing controller device transport driver (INTEL_MEI_VSC_HW) [N/m/?] (NEW)
  Intel HDCP2.2 services of ME Interface (INTEL_MEI_HDCP) [M/n/?] m
  Intel PXP services of ME Interface (INTEL_MEI_PXP) [N/m/?] n
  Intel GSC Proxy services of ME Interface (INTEL_MEI_GSC_PROXY) [N/m/?] (NEW)
VMware VMCI Driver (VMWARE_VMCI) [M/n/y/?] m
Line Echo Canceller support (ECHO) [M/n/y/?] m
Support for Broadcom VK Accelerators (BCM_VK) [N/m/y/?] n
Alcor Micro/Alcor Link PCI-E card reader (MISC_ALCOR_PCI) [M/n/y/?] m
Realtek PCI-E card reader (MISC_RTSX_PCI) [M/n/y/?] m
Realtek USB card reader (MISC_RTSX_USB) [M/n/y/?] m
Accelerator Framework for User Land (UACCE) [N/m/y/?] n
pvpanic device support (PVPANIC) [N/y/?] n
Microchip PCI1XXXX PCIe to GPIO Expander + OTP/EEPROM manager (GP_PCI1XXXX) [N/m/y/?] n
KEBA CP500 system FPGA support (KEBA_CP500) [N/m/y/?] (NEW)
*
* Serial ATA and Parallel ATA drivers (libata)
*
Serial ATA and Parallel ATA drivers (libata) (ATA) [Y/n/m/?] y
  Verbose ATA error reporting (ATA_VERBOSE_ERROR) [Y/n/?] y
  ATA ACPI Support (ATA_ACPI) [Y/n/?] y
    SATA Zero Power Optical Disc Drive (ZPODD) support (SATA_ZPODD) [N/y/?] n
  SATA Port Multiplier support (SATA_PMP) [Y/n/?] y
  *
  * Controllers with non-SFF native interface
  *
  AHCI SATA support (SATA_AHCI) [M/n/y/?] m
    Default SATA Link Power Management policy (SATA_MOBILE_LPM_POLICY) [3] 3
  Platform AHCI SATA support (SATA_AHCI_PLATFORM) [M/n/y/?] m
  Synopsys DWC AHCI SATA support (AHCI_DWC) [N/m/y/?] n
  Initio 162x SATA support (Very Experimental) (SATA_INIC162X) [M/n/y/?] m
  ACard AHCI variant (ATP 8620) (SATA_ACARD_AHCI) [M/n/y/?] m
  Silicon Image 3124/3132 SATA support (SATA_SIL24) [M/n/y/?] m
  ATA SFF support (for legacy IDE and PATA) (ATA_SFF) [Y/n/?] y
    *
    * SFF controllers with custom DMA interface
    *
    Pacific Digital ADMA support (PDC_ADMA) [M/n/y/?] m
    Pacific Digital SATA QStor support (SATA_QSTOR) [M/n/y/?] m
    Promise SATA SX4 support (Experimental) (SATA_SX4) [M/n/y/?] m
    ATA BMDMA support (ATA_BMDMA) [Y/n/?] y
      *
      * SATA SFF controllers with BMDMA
      *

      VITESSE VSC-7174 / INTEL 31244 SATA support (SATA_VITESSE) [M/n/y/?] m
      *
      * PATA SFF controllers with BMDMA
      *
      ALi PATA support (PATA_ALI) [M/n/y/?] m
      AMD/NVidia PATA support (PATA_AMD) [M/n/y/?] m
      ARTOP 6210/6260 PATA support (PATA_ARTOP) [M/n/y/?] m
      ATI PATA support (PATA_ATIIXP) [M/n/y/?] m
      ARTOP/Acard ATP867X PATA support (PATA_ATP867X) [M/n/y/?] m
      CMD64x PATA support (PATA_CMD64X) [M/n/y/?] m
      Cypress CY82C693 PATA support (Very Experimental) (PATA_CYPRESS) [N/m/y/?] n
      EFAR SLC90E66 support (PATA_EFAR) [M/n/y/?] m
      HPT 366/368 PATA support (PATA_HPT366) [M/n/y/?] m
      HPT 370/370A/371/372/374/302 PATA support (PATA_HPT37X) [M/n/y/?] m
      HPT 371N/372N/302N PATA support (PATA_HPT3X2N) [M/n/y/?] m
      HPT 343/363 PATA support (PATA_HPT3X3) [M/n/y/?] m
        HPT 343/363 DMA support (PATA_HPT3X3_DMA) [N/y/?] n
      IT8213 PATA support (Experimental) (PATA_IT8213) [M/n/y/?] m
      IT8211/2 PATA support (PATA_IT821X) [M/n/y/?] m
      JMicron PATA support (PATA_JMICRON) [M/n/y/?] m
      Marvell PATA support via legacy mode (PATA_MARVELL) [M/n/y/?] m
      NETCELL Revolution RAID support (PATA_NETCELL) [M/n/y/?] m
      Ninja32/Delkin Cardbus ATA support (PATA_NINJA32) [M/n/y/?] m
      Nat Semi NS87415 PATA support (PATA_NS87415) [M/n/y/?] m
      Intel PATA old PIIX support (PATA_OLDPIIX) [M/n/y/?] m
      OPTI FireStar PATA support (Very Experimental) (PATA_OPTIDMA) [M/n/y/?] m
      Promise PATA 2027x support (PATA_PDC2027X) [M/n/y/?] m
      Older Promise PATA controller support (PATA_PDC_OLD) [M/n/y/?] m
      RADISYS 82600 PATA support (Experimental) (PATA_RADISYS) [N/m/y/?] n
      RDC PATA support (PATA_RDC) [N/m/y/?] n
      Intel SCH PATA support (PATA_SCH) [M/n/y/?] m
      SERVERWORKS OSB4/CSB5/CSB6/HT1000 PATA support (PATA_SERVERWORKS) [M/n/y/?] m
      CMD / Silicon Image 680 PATA support (PATA_SIL680) [M/n/y/?] m
      SiS PATA support (PATA_SIS) [M/y/?] m
      Toshiba Piccolo support (Experimental) (PATA_TOSHIBA) [M/n/y/?] m
      Compaq Triflex PATA support (PATA_TRIFLEX) [M/n/y/?] m
      VIA PATA support (PATA_VIA) [M/n/y/?] m
      Winbond SL82C105 PATA support (PATA_WINBOND) [M/n/y/?] m
    *
    * PIO-only SFF controllers
    *
    CMD640 PCI PATA support (Experimental) (PATA_CMD640_PCI) [M/n/y/?] m
    Intel PATA MPIIX support (PATA_MPIIX) [M/n/y/?] m
    Nat Semi NS87410 PATA support (PATA_NS87410) [M/n/y/?] m
    OPTI621/6215 PATA support (Very Experimental) (PATA_OPTI) [M/n/y/?] m
    PCMCIA PATA support (PATA_PCMCIA) [M/n/?] m
    PC Tech RZ1000 PATA support (PATA_RZ1000) [N/m/y/?] n
    Parallel port IDE device support (PATA_PARPORT) [N/m/?] (NEW)
    *
    * Generic fallback / legacy drivers
    *
    ACPI firmware driver for PATA (PATA_ACPI) [M/n/y/?] m
    Generic ATA support (ATA_GENERIC) [M/n/y/?] m
    Legacy ISA PATA support (Experimental) (PATA_LEGACY) [N/m/y/?] n
*
* Multiple devices driver support (RAID and LVM)
*
Multiple devices driver support (RAID and LVM) (MD) [Y/n/?] y
  RAID support (BLK_DEV_MD) [M/y/?] m
  MD bitmap file support (deprecated) (MD_BITMAP_FILE) [Y/n/?] (NEW)
  Linear (append) mode (MD_LINEAR) [M/n/?] m
  RAID-0 (striping) mode (MD_RAID0) [M/?] m
  RAID-1 (mirroring) mode (MD_RAID1) [M/?] m
  RAID-10 (mirrored striping) mode (MD_RAID10) [M/?] m
  RAID-4/RAID-5/RAID-6 mode (MD_RAID456) [M/?] m
  Cluster Support for MD (MD_CLUSTER) [N/m/?] n
  Block device as cache (BCACHE) [N/m/y/?] n
  Device mapper support (BLK_DEV_DM) [M/n/y/?] m
    Device mapper debugging support (DM_DEBUG) [Y/n/?] y
    Block manager locking (DM_DEBUG_BLOCK_MANAGER_LOCKING) [Y/n/?] y
      Keep stack trace of persistent data block lock holders (DM_DEBUG_BLOCK_STACK_TRACING) [N/y/?] n
    Unstriped target (DM_UNSTRIPED) [M/n/?] m
    Crypt target support (DM_CRYPT) [M/n/?] m
    Snapshot target (DM_SNAPSHOT) [M/n/?] m
    Thin provisioning target (DM_THIN_PROVISIONING) [M/n/?] m
    Cache target (EXPERIMENTAL) (DM_CACHE) [M/n/?] m
      Stochastic MQ Cache Policy (EXPERIMENTAL) (DM_CACHE_SMQ) [M/n/?] m
    Writecache target (DM_WRITECACHE) [M/n/?] m
    Emulated block size target (EXPERIMENTAL) (DM_EBS) [N/m/?] n
    Era target (EXPERIMENTAL) (DM_ERA) [N/m/?] n
    Clone target (EXPERIMENTAL) (DM_CLONE) [M/n/?] m
    Mirror target (DM_MIRROR) [M/n/?] m
      Mirror userspace logging (DM_LOG_USERSPACE) [M/n/?] m
    RAID 1/4/5/6/10 target (DM_RAID) [M/n/?] m
    Zero target (DM_ZERO) [M/n/?] m
    Multipath target (DM_MULTIPATH) [M/n/?] m
      I/O Path Selector based on the number of in-flight I/Os (DM_MULTIPATH_QL) [M/n/?] m
      I/O Path Selector based on the service time (DM_MULTIPATH_ST) [M/n/?] m
      I/O Path Selector based on historical service time (DM_MULTIPATH_HST) [M/n/?] m
      I/O Path Selector based on CPU submission (DM_MULTIPATH_IOA) [N/m/?] n
    I/O delaying target (DM_DELAY) [M/n/?] m
    Bad sector simulation target (DM_DUST) [M/n/?] m
    DM uevents (DM_UEVENT) [Y/n/?] y
    Flakey target (DM_FLAKEY) [M/n/?] m
    Verity target support (DM_VERITY) [M/n/?] m
      Verity data device root hash signature verification support (DM_VERITY_VERIFY_ROOTHASH_SIG) [Y/n/?] y
        Verity data device root hash signature verification with secondary keyring (DM_VERITY_VERIFY_ROOTHASH_SIG_SECONDARY_KEYRING) [N/y/?] n
        Verity data device root hash signature verification with platform keyring (DM_VERITY_VERIFY_ROOTHASH_SIG_PLATFORM_KEYRING) [N/y/?] (NEW)
      Verity forward error correction support (DM_VERITY_FEC) [Y/n/?] y
    Switch target support (EXPERIMENTAL) (DM_SWITCH) [M/n/?] m
    Log writes target support (DM_LOG_WRITES) [M/n/?] m
    Integrity target support (DM_INTEGRITY) [M/n/?] m
    Drive-managed zoned block device target support (DM_ZONED) [M/n/?] m
    DM audit events (DM_AUDIT) [Y/?] y
    VDO: deduplication and compression target (DM_VDO) [N/m/?] (NEW)
*
* Generic Target Core Mod (TCM) and ConfigFS Infrastructure
*
Generic Target Core Mod (TCM) and ConfigFS Infrastructure (TARGET_CORE) [M/n/y/?] m
  TCM/IBLOCK Subsystem Plugin for Linux/BLOCK (TCM_IBLOCK) [M/n/?] m
  TCM/FILEIO Subsystem Plugin for Linux/VFS (TCM_FILEIO) [M/n/?] m
  TCM/pSCSI Subsystem Plugin for Linux/SCSI (TCM_PSCSI) [M/n/?] m
  TCM/USER Subsystem Plugin for Linux (TCM_USER2) [M/n/?] m
  TCM Virtual SAS target and Linux/SCSI LDD fabric loopback module (LOOPBACK_TARGET) [M/n/?] m
  TCM_FC fabric Plugin (TCM_FC) [M/n/?] m
  SCSI Target Mode Stack (ISCSI_TARGET) [M/n/?] m
    Chelsio iSCSI target offload driver (ISCSI_TARGET_CXGB4) [M/n/?] m
  FireWire SBP-2 fabric module (SBP_TARGET) [M/n/?] m
  TCM Virtual Remote target (REMOTE_TARGET) [N/m/?] (NEW)
*
* Network device support
*
Network device support (NETDEVICES) [Y/?] y
  Network core driver support (NET_CORE) [Y/n/?] y
    Bonding driver support (BONDING) [M/n/?] m
    Dummy net driver support (DUMMY) [M/n/y/?] m
    WireGuard secure network tunnel (WIREGUARD) [M/n/y/?] m
      Debugging checks and verbose messages (WIREGUARD_DEBUG) [N/y/?] n
    EQL (serial line load balancing) support (EQUALIZER) [M/n/y/?] m
    Fibre Channel driver support (NET_FC) [Y/n/?] y
    Intermediate Functional Block support (IFB) [M/n/?] m
    MAC-VLAN support (MACVLAN) [M/n/y/?] m
      MAC-VLAN based tap driver (MACVTAP) [M/n/?] m
    IP-VLAN support (IPVLAN) [M/n/y/?] m
      IP-VLAN based tap driver (IPVTAP) [M/n/?] m
    Virtual eXtensible Local Area Network (VXLAN) (VXLAN) [M/n/y/?] m
    Generic Network Virtualization Encapsulation (GENEVE) [M/n/y/?] m
    Bare UDP Encapsulation (BAREUDP) [M/n/y/?] m
    GPRS Tunneling Protocol datapath (GTP-U) (GTP) [M/n/y/?] m
    Packet Forwarding Control Protocol (PFCP) (PFCP) [N/m/y/?] (NEW)
    Automatic Multicast Tunneling (AMT) (AMT) [N/m/y/?] n
    IEEE 802.1AE MAC-level encryption (MACsec) (MACSEC) [M/n/y/?] m
    Network console logging support (NETCONSOLE) [M/n/y/?] m
      Dynamic reconfiguration of logging targets (NETCONSOLE_DYNAMIC) [Y/n/?] y
      Set kernel extended message by default (NETCONSOLE_EXTENDED_LOG) [N/y/?] (NEW)
    Virtual Ethernet over NTB Transport (NTB_NETDEV) [M/n/?] m
    Universal TUN/TAP device driver support (TUN) [M/n/y/?] m
    Support for cross-endian vnet headers on little-endian kernels (TUN_VNET_CROSS_LE) [N/y/?] n
    Virtual ethernet pair device (VETH) [M/n/y/?] m
    Virtual netlink monitoring device (NLMON) [M/n/y/?] m
    BPF-programmable network device (NETKIT) [N/y/?] (NEW)
    Virtual Routing and Forwarding (Lite) (NET_VRF) [M/n/y/?] m
    Virtual vsock monitoring device (VSOCKMON) [M/n/?] m
  *
  * Distributed Switch Architecture drivers
  *
  Broadcom Starfighter 2 Ethernet switch support (NET_DSA_BCM_SF2) [M/n/?] m
  DSA mock-up Ethernet switch chip support (NET_DSA_LOOP) [M/n/?] m
  Hirschmann Hellcreek TSN Switch support (NET_DSA_HIRSCHMANN_HELLCREEK) [N/m/?] n
  Lantiq / Intel GSWIP (NET_DSA_LANTIQ_GSWIP) [N/m/?] n
  MediaTek MT7530 and MT7531 Ethernet switch support (NET_DSA_MT7530) [M/n/?] m
    MediaTek MT7530 MDIO interface driver (NET_DSA_MT7530_MDIO) [M/n/?] (NEW)
    MediaTek MT7530 MMIO interface driver (NET_DSA_MT7530_MMIO) [M/n/?] (NEW)
  Marvell 88E6060 ethernet switch chip support (NET_DSA_MV88E6060) [N/m/?] n
  *
  * Microchip KSZ8XXX/KSZ9XXX/LAN937X series switch support
  *
  Microchip KSZ8XXX/KSZ9XXX/LAN937X series switch support (NET_DSA_MICROCHIP_KSZ_COMMON) [M/n/?] m
    KSZ series I2C connected switch driver (NET_DSA_MICROCHIP_KSZ9477_I2C) [N/m/?] n
    KSZ series SPI connected switch driver (NET_DSA_MICROCHIP_KSZ_SPI) [N/m/?] n
    Support for the PTP clock on the KSZ9563/LAN937x Ethernet Switch (NET_DSA_MICROCHIP_KSZ_PTP) [N/y/?] (NEW)
    KSZ series SMI connected switch driver (NET_DSA_MICROCHIP_KSZ8863_SMI) [N/m/?] n
  Marvell 88E6xxx Ethernet switch fabric support (NET_DSA_MV88E6XXX) [M/n/?] m
    PTP support for Marvell 88E6xxx (NET_DSA_MV88E6XXX_PTP) [Y/n/?] y
  Qualcomm Atheros AR9331 Ethernet switch support (NET_DSA_AR9331) [N/m/?] n
  Qualcomm Atheros QCA8K Ethernet switch family support (NET_DSA_QCA8K) [M/n/?] m
    Qualcomm Atheros QCA8K Ethernet switch family LEDs support (NET_DSA_QCA8K_LEDS_SUPPORT) [N/y/?] (NEW)
  NXP SJA1105 Ethernet switch family support (NET_DSA_SJA1105) [N/m/?] n
  Arrow XRS7000X series switch in I2C mode (NET_DSA_XRS700X_I2C) [N/m/?] n
  Arrow XRS7000X series switch in MDIO mode (NET_DSA_XRS700X_MDIO) [N/m/?] n
  SMSC/Microchip LAN9303 3-ports 10/100 ethernet switch in I2C managed mode (NET_DSA_SMSC_LAN9303_I2C) [M/n/?] m
  Microchip LAN9303/LAN9354 3-ports 10/100 ethernet switch in MDIO managed mode (NET_DSA_SMSC_LAN9303_MDIO) [M/n/?] m
  Vitesse VSC7385/7388/7395/7398 SPI mode support (NET_DSA_VITESSE_VSC73XX_SPI) [N/m/?] n
  Vitesse VSC7385/7388/7395/7398 Platform mode support (NET_DSA_VITESSE_VSC73XX_PLATFORM) [N/m/?] n
  *
  * Ethernet driver support
  *
  Ethernet driver support (ETHERNET) [Y/?] y
    3Com devices (NET_VENDOR_3COM) [Y/n/?] y
      3Com 3c574 PCMCIA support (PCMCIA_3C574) [M/n/?] m
      3Com 3c589 PCMCIA support (PCMCIA_3C589) [M/n/?] m
      3c590/3c900 series (592/595/597) "Vortex/Boomerang" support (VORTEX) [M/n/y/?] m
      3cr990 series "Typhoon" support (TYPHOON) [M/n/y/?] m
    Adaptec devices (NET_VENDOR_ADAPTEC) [Y/n/?] y
      Adaptec Starfire/DuraLAN support (ADAPTEC_STARFIRE) [M/n/y/?] m
    Agere devices (NET_VENDOR_AGERE) [Y/n/?] y
      Agere ET-1310 Gigabit Ethernet support (ET131X) [M/n/y/?] m
    Alacritech devices (NET_VENDOR_ALACRITECH) [Y/n/?] y
      Alacritech Slicoss support (SLICOSS) [N/m/y/?] n
    Alteon devices (NET_VENDOR_ALTEON) [Y/n/?] y
      Alteon AceNIC/3Com 3C985/NetGear GA620 Gigabit support (ACENIC) [M/n/y/?] m
        Omit support for old Tigon I based AceNICs (ACENIC_OMIT_TIGON_I) [N/y/?] n
    Altera Triple-Speed Ethernet MAC support (ALTERA_TSE) [M/n/y/?] m
    Amazon Devices (NET_VENDOR_AMAZON) [Y/n/?] y
      Elastic Network Adapter (ENA) support (ENA_ETHERNET) [M/n/y/?] m
    AMD devices (NET_VENDOR_AMD) [Y/n/?] y
      AMD 8111 (new PCI LANCE) support (AMD8111_ETH) [M/n/y/?] m
      AMD PCnet32 PCI support (PCNET32) [M/n/y/?] m
      New Media PCMCIA support (PCMCIA_NMCLAN) [M/n/?] m
      AMD 10GbE Ethernet driver (AMD_XGBE) [M/n/y/?] m
        Data Center Bridging (DCB) support (AMD_XGBE_DCB) [Y/n/?] y
      AMD/Pensando Data Systems Core Device Support (PDS_CORE) [N/m/y/?] (NEW)
    aQuantia devices (NET_VENDOR_AQUANTIA) [Y/n/?] y
      aQuantia AQtion(tm) Support (AQTION) [M/n/?] m
    ARC devices (NET_VENDOR_ARC) [Y/n/?] y
    Asix devices (NET_VENDOR_ASIX) [Y/n/?] y
      Asix AX88796C-SPI support (SPI_AX88796C) [N/m/y/?] n
    Atheros devices (NET_VENDOR_ATHEROS) [Y/n/?] y
      Atheros L2 Fast Ethernet support (ATL2) [M/n/y/?] m
      Atheros/Attansic L1 Gigabit Ethernet support (ATL1) [M/n/y/?] m
      Atheros L1E Gigabit Ethernet support (ATL1E) [M/n/y/?] m
      Atheros L1C Gigabit Ethernet support (ATL1C) [M/n/y/?] m
      Qualcomm Atheros AR816x/AR817x support (ALX) [M/n/y/?] m
    Beckhoff CX5020 EtherCAT master support (CX_ECAT) [N/m/y/?] n
    Broadcom devices (NET_VENDOR_BROADCOM) [Y/?] y
      Broadcom 440x/47xx ethernet support (B44) [M/n/y/?] m
      Broadcom GENET internal MAC support (BCMGENET) [M/n/y/?] m
      QLogic bnx2 support (BNX2) [M/y/?] m
      QLogic CNIC support (CNIC) [M/y/?] m
      Broadcom Tigon3 support (TIGON3) [M/n/y/?] m
        Broadcom Tigon3 HWMON support (TIGON3_HWMON) [Y/n/?] y
      Broadcom NetXtremeII 10Gb support (BNX2X) [M/n/y/?] m
        Broadcom 578xx and 57712 SR-IOV support (BNX2X_SRIOV) [Y/n/?] y
      Broadcom SYSTEMPORT internal MAC support (SYSTEMPORT) [N/m/?] n
      Broadcom NetXtreme-C/E support (BNXT) [M/n/y/?] m
        Broadcom NetXtreme-C/E SR-IOV support (BNXT_SRIOV) [Y/n/?] y
        TC Flower offload support for NetXtreme-C/E (BNXT_FLOWER_OFFLOAD) [Y/n/?] y
        Data Center Bridging (DCB) Support (BNXT_DCB) [Y/n/?] y
        Broadcom NetXtreme-C/E HWMON support (BNXT_HWMON) [Y/n/?] y
    Cadence devices (NET_VENDOR_CADENCE) [Y/n/?] y
      Cadence MACB/GEM support (MACB) [M/n/y/?] m
        Use IEEE 1588 hwstamp (MACB_USE_HWSTAMP) [Y/n/?] y
        Cadence PCI MACB/GEM support (MACB_PCI) [M/n/?] m
    Cavium ethernet drivers (NET_VENDOR_CAVIUM) [N/y/?] n
    Chelsio devices (NET_VENDOR_CHELSIO) [Y/?] y
      Chelsio 10Gb Ethernet support (CHELSIO_T1) [M/n/y/?] m
        Chelsio gigabit Ethernet support (CHELSIO_T1_1G) [Y/n/?] y
      Chelsio Communications T3 10Gb Ethernet support (CHELSIO_T3) [M/y/?] m
      Chelsio Communications T4/T5/T6 Ethernet support (CHELSIO_T4) [M/?] m
        Data Center Bridging (DCB) Support for Chelsio T4/T5/T6 cards (CHELSIO_T4_DCB) [Y/n/?] y
          Fibre Channel over Ethernet (FCoE) Support for Chelsio T5 cards (CHELSIO_T4_FCOE) [N/y/?] n
      Chelsio Communications T4/T5/T6 Virtual Function Ethernet support (CHELSIO_T4VF) [M/n/y/?] m
      Chelsio Inline Crypto support (CHELSIO_INLINE_CRYPTO) [Y/n/?] y
        Chelsio IPSec XFRM Tx crypto offload (CHELSIO_IPSEC_INLINE) [M/n/?] m
        Chelsio Inline KTLS Offload (CHELSIO_TLS_DEVICE) [N/m/?] n
    Cisco devices (NET_VENDOR_CISCO) [Y/?] y
      Cisco VIC Ethernet NIC Support (ENIC) [M/y/?] m
    Cortina Gemini devices (NET_VENDOR_CORTINA) [N/y/?] n
    Davicom devices (NET_VENDOR_DAVICOM) [Y/n/?] y
      DM9051 SPI support (DM9051) [N/m/y/?] n
    Dave ethernet support (DNET) (DNET) [M/n/y/?] m
    Digital Equipment devices (NET_VENDOR_DEC) [Y/n/?] y
      DEC - Tulip devices (NET_TULIP) [Y/n/?] y
        Early DECchip Tulip (dc2104x) PCI support (DE2104X) [M/n/y/?] m
          Descriptor Skip Length in 32 bit longwords (DE2104X_DSL) [0] 0
        DECchip Tulip (dc2114x) PCI support (TULIP) [M/n/y/?] m
          New bus configuration (TULIP_MWI) [N/y/?] n
          Use PCI shared mem for NIC registers (TULIP_MMIO) [Y/n/?] y
          Use RX polling (NAPI) (TULIP_NAPI) [N/y/?] n
        Winbond W89c840 Ethernet support (WINBOND_840) [M/n/y/?] m
        Davicom DM910x/DM980x support (DM9102) [M/n/y/?] m
        ULi M526x controller support (ULI526X) [M/n/y/?] m
        Xircom CardBus support (PCMCIA_XIRCOM) [M/n/y/?] m
    D-Link devices (NET_VENDOR_DLINK) [Y/n/?] y
      DL2000/TC902x/IP1000A-based Gigabit Ethernet support (DL2K) [M/n/y/?] m
      Sundance Alta support (SUNDANCE) [M/n/y/?] m
        Use MMIO instead of PIO (SUNDANCE_MMIO) [N/y/?] n
    Emulex devices (NET_VENDOR_EMULEX) [Y/?] y
      ServerEngines' 10Gbps NIC - BladeEngine (BE2NET) [M/y/?] m
        HWMON support for be2net driver (BE2NET_HWMON) [N/y/?] n
        Support for BE2 chipsets (BE2NET_BE2) [Y/n/?] y
        Support for BE3 chipsets (BE2NET_BE3) [Y/n/?] y
        Support for Lancer chipsets (BE2NET_LANCER) [Y/n/?] y
        Support for Skyhawk chipsets (BE2NET_SKYHAWK) [Y/n/?] y
    Engleder devices (NET_VENDOR_ENGLEDER) [Y/n/?] y
      TSN endpoint support (TSNEP) [N/m/y/?] n
    EZchip devices (NET_VENDOR_EZCHIP) [N/y/?] n
    Fujitsu devices (NET_VENDOR_FUJITSU) [N/y/?] n
    Fungible devices (NET_VENDOR_FUNGIBLE) [Y/n/?] y
      Fungible Ethernet device driver (FUN_ETH) [N/m/?] n
    Google Devices (NET_VENDOR_GOOGLE) [Y/n/?] y
      Google Virtual NIC (gVNIC) support (GVE) [M/n/y/?] m
    Huawei devices (NET_VENDOR_HUAWEI) [N/y/?] n
    Intel (82586/82593/82596) devices (NET_VENDOR_I825XX) [N/y/?] n
    Intel devices (NET_VENDOR_INTEL) [Y/n/?] y
      Intel(R) PRO/100+ support (E100) [M/n/y/?] m
      Intel(R) PRO/1000 Gigabit Ethernet support (E1000) [M/n/y/?] m
      Intel(R) PRO/1000 PCI-Express Gigabit Ethernet support (E1000E) [M/n/y/?] m
        Support HW cross-timestamp on PCH devices (E1000E_HWTS) [Y/n/?] y
      Intel(R) 82575/82576 PCI-Express Gigabit Ethernet support (IGB) [M/n/y/?] m
        Intel(R) PCI-Express Gigabit adapters HWMON support (IGB_HWMON) [Y/n/?] y
        Direct Cache Access (DCA) Support (IGB_DCA) [Y/n/?] y
      Intel(R) 82576 Virtual Function Ethernet support (IGBVF) [M/n/y/?] m
      Intel(R) 10GbE PCI Express adapters support (IXGBE) [M/n/y/?] m
        Intel(R) 10GbE PCI Express adapters HWMON support (IXGBE_HWMON) [Y/n/?] y
        Direct Cache Access (DCA) Support (IXGBE_DCA) [Y/n/?] y
        Data Center Bridging (DCB) Support (IXGBE_DCB) [Y/n/?] y
        IPSec XFRM cryptography-offload acceleration (IXGBE_IPSEC) [Y/n/?] y
      Intel(R) 10GbE PCI Express Virtual Function Ethernet support (IXGBEVF) [M/n/y/?] m
        IPSec XFRM cryptography-offload acceleration (IXGBEVF_IPSEC) [Y/n/?] y
      Intel(R) Ethernet Controller XL710 Family support (I40E) [M/n/y/?] m
        Data Center Bridging (DCB) Support (I40E_DCB) [N/y/?] n
      Intel(R) Ethernet Adaptive Virtual Function support (I40EVF) [M/n/y/?] m
      Intel(R) Ethernet Connection E800 Series Support (ICE) [M/n/y/?] m
        Intel(R) Ethernet Connection E800 Series Support HWMON support (ICE_HWMON) [Y/n/?] (NEW)
        Switchdev Support (ICE_SWITCHDEV) [Y/n/?] y
        Support HW cross-timestamp on platforms with PTM support (ICE_HWTS) [Y/n/?] y
      Intel(R) FM10000 Ethernet Switch Host Interface Support (FM10K) [M/n/y/?] m
      Intel(R) Ethernet Controller I225-LM/I225-V support (IGC) [M/n/y/?] m
      Intel(R) Infrastructure Data Path Function Support (IDPF) [N/m/y/?] (NEW)
    JMicron(R) PCI-Express Gigabit Ethernet support (JME) [M/n/y/?] m
    Analog Devices devices (NET_VENDOR_ADI) [Y/n/?] y
      Analog Devices ADIN1110 MAC-PHY (ADIN1110) [N/m/y/?] n
    LiteX devices (NET_VENDOR_LITEX) [Y/n/?] y
    Marvell devices (NET_VENDOR_MARVELL) [Y/n/?] y
      Marvell MDIO interface support (MVMDIO) [M/n/y/?] m
      Marvell Yukon Gigabit Ethernet support (SKGE) [M/n/y/?] m
        Debugging interface (SKGE_DEBUG) [N/y/?] n
        Support for older SysKonnect Genesis boards (SKGE_GENESIS) [Y/n/?] y
      Marvell Yukon 2 support (SKY2) [M/n/y/?] m
        Debugging interface (SKY2_DEBUG) [N/y/?] n
      Marvell Octeon PCI Endpoint NIC Driver (OCTEON_EP) [N/m/y/?] n
      Marvell Octeon PCI Endpoint NIC VF Driver (OCTEON_EP_VF) [N/m/y/?] (NEW)
      Marvell Prestera Switch ASICs support (PRESTERA) [N/m/?] n
    Mellanox devices (NET_VENDOR_MELLANOX) [Y/?] y
      Mellanox Technologies 1/10/40Gbit Ethernet support (MLX4_EN) [M/n/y/?] m
        Data Center Bridging (DCB) Support (MLX4_EN_DCB) [Y/n/?] y
      Support for old gen2 Mellanox PCI IDs (MLX4_CORE_GEN2) [Y/n/?] y
      Mellanox 5th generation network adapters (ConnectX series) core driver (MLX5_CORE) [M/n/?] m
        Mellanox Technologies Innova support (MLX5_FPGA) [N/y/?] n
        Mellanox 5th generation network adapters (ConnectX series) Ethernet support (MLX5_CORE_EN) [Y/n/?] y
          Mellanox MLX5 ethernet accelerated receive flow steering (ARFS) support (MLX5_EN_ARFS) [Y/n/?] y
          Mellanox MLX5 ethernet rx nfc flow steering support (MLX5_EN_RXNFC) [Y/n/?] y
          Mellanox Technologies MLX5 MPFS support (MLX5_MPFS) [Y/n/?] y
          Mellanox Technologies MLX5 SRIOV E-Switch support (MLX5_ESWITCH) [Y/n/?] y
            MLX5 TC classifier action support (MLX5_CLS_ACT) [Y/n/?] y
              MLX5 TC connection tracking offload support (MLX5_TC_CT) [Y/n/?] y
              MLX5 TC sample offload support (MLX5_TC_SAMPLE) [Y/n/?] y
          Data Center Bridging (DCB) Support (MLX5_CORE_EN_DCB) [Y/n/?] y
          Mellanox 5th generation network adapters (connectX series) IPoIB offloads support (MLX5_CORE_IPOIB) [Y/n/?] y
          Connect-X support for MACSec offload (MLX5_MACSEC) [N/y/?] (NEW)
          Mellanox Technologies IPsec Connect-X support (MLX5_EN_IPSEC) [N/y/?] n
          Mellanox Technologies TLS Connect-X support (MLX5_EN_TLS) [N/y/?] n
          Mellanox Technologies software-managed steering (MLX5_SW_STEERING) [Y/n/?] y
          Mellanox Technologies hardware-managed steering (MLX5_HW_STEERING) [Y/n/?] (NEW)
          Mellanox Technologies subfunction device support using auxiliary device (MLX5_SF) [N/y/?] n
        Mellanox 5th generation network adapters (ConnectX series) DPLL support (MLX5_DPLL) [N/m/?] (NEW)
      Mellanox Technologies Switch ASICs support (MLXSW_CORE) [M/n/y/?] m
        HWMON support for Mellanox Technologies Switch ASICs (MLXSW_CORE_HWMON) [Y/n/?] y
        Thermal zone support for Mellanox Technologies Switch ASICs (MLXSW_CORE_THERMAL) [Y/n/?] y
        PCI bus implementation for Mellanox Technologies Switch ASICs (MLXSW_PCI) [M/n/?] m
        I2C bus implementation for Mellanox Technologies Switch ASICs (MLXSW_I2C) [M/n/?] m
        Mellanox Technologies Spectrum family support (MLXSW_SPECTRUM) [M/n/?] m
          Data Center Bridging (DCB) support (MLXSW_SPECTRUM_DCB) [Y/n/?] y
        Mellanox Technologies minimal I2C support (MLXSW_MINIMAL) [M/n/?] m
      Mellanox Technologies firmware flash module (MLXFW) [M/y/?] m
    Meta Platforms devices (NET_VENDOR_META) [Y/n/?] (NEW)
      Meta Platforms Host Network Interface (FBNIC) [N/m/y/?] (NEW)
    Micrel devices (NET_VENDOR_MICREL) [Y/n/?] y
      Micrel KSZ8841/42 with generic bus interface (KS8842) [N/m/y/?] n
      Micrel KS8851 SPI (KS8851) [N/m/y/?] n
      Micrel KS8851 MLL (KS8851_MLL) [N/m/y/?] n
      Micrel KSZ8841/2 PCI (KSZ884X_PCI) [M/n/y/?] m
    Microchip devices (NET_VENDOR_MICROCHIP) [N/y/?] n
    Microsemi devices (NET_VENDOR_MICROSEMI) [N/y/?] n
    Microsoft Network Devices (NET_VENDOR_MICROSOFT) [Y/n/?] y
    Myricom devices (NET_VENDOR_MYRI) [Y/n/?] y
      Myricom Myri-10G Ethernet support (MYRI10GE) [M/n/y/?] m
        Direct Cache Access (DCA) Support (MYRI10GE_DCA) [Y/n/?] y
    Myson MTD-8xx PCI Ethernet support (FEALNX) [M/n/y/?] m
    National Instruments Devices (NET_VENDOR_NI) [N/y/?] n
    National Semiconductor devices (NET_VENDOR_NATSEMI) [Y/n/?] y
      National Semiconductor DP8381x series PCI Ethernet support (NATSEMI) [M/n/y/?] m
      National Semiconductor DP83820 support (NS83820) [M/n/y/?] m
    Neterion (Exar) devices (NET_VENDOR_NETERION) [Y/n/?] y
      Neterion (Exar) Xframe 10Gb Ethernet Adapter (S2IO) [M/n/y/?] m
    Netronome(R) devices (NET_VENDOR_NETRONOME) [Y/n/?] y
      Netronome(R) NFP4000/NFP6000 NIC driver (NFP) [M/n/?] m
        NFP4000/NFP6000 TC Flower offload support (NFP_APP_FLOWER) [Y/n/?] y
        NFP4000/NFP6000 Advanced buffer management NIC support (NFP_APP_ABM_NIC) [N/y/?] n
        NFP IPsec crypto offload support (NFP_NET_IPSEC) [Y/n/?] (NEW)
        Debug support for Netronome(R) NFP4000/NFP6000 NIC drivers (NFP_DEBUG) [N/y/?] n
    National Semiconductor 8390 devices (NET_VENDOR_8390) [Y/n/?] y
      Asix AX88190 PCMCIA support (PCMCIA_AXNET) [M/n/?] m
      PCI NE2000 and clones support (see help) (NE2K_PCI) [M/n/y/?] m
      NE2000 compatible PCMCIA support (PCMCIA_PCNET) [M/n/?] m
    NVIDIA devices (NET_VENDOR_NVIDIA) [Y/n/?] y
      nForce Ethernet support (FORCEDETH) [M/n/y/?] m
    OKI Semiconductor devices (NET_VENDOR_OKI) [Y/n/?] y
    OpenCores 10/100 Mbps Ethernet MAC support (ETHOC) [M/n/y/?] m
    OPEN Alliance TC6 10BASE-T1x MAC-PHY support (OA_TC6) [N/m/y/?] (NEW)
    Packet Engines devices (NET_VENDOR_PACKET_ENGINES) [Y/n/?] y
      Packet Engines Hamachi GNIC-II support (HAMACHI) [M/n/y/?] m
      Packet Engines Yellowfin Gigabit-NIC support (YELLOWFIN) [M/n/y/?] m
    Pensando devices (NET_VENDOR_PENSANDO) [Y/n/?] y
      Pensando Ethernet IONIC Support (IONIC) [M/n/y/?] m
    QLogic devices (NET_VENDOR_QLOGIC) [Y/n/?] y
      QLogic QLA3XXX Network Driver Support (QLA3XXX) [M/n/y/?] m
      QLOGIC QLCNIC 1/10Gb Converged Ethernet NIC Support (QLCNIC) [M/n/y/?] m
        QLOGIC QLCNIC 83XX family SR-IOV Support (QLCNIC_SRIOV) [Y/n/?] y
        QLOGIC QLCNIC 82XX and 83XX family DCB Support (QLCNIC_DCB) [Y/n/?] y
        QLOGIC QLCNIC 82XX and 83XX family HWMON support (QLCNIC_HWMON) [Y/n/?] y
      NetXen Multi port (1/10) Gigabit Ethernet NIC (NETXEN_NIC) [M/n/y/?] m
      QLogic QED 25/40/100Gb core driver (QED) [M/n/y/?] m
      QLogic QED 25/40/100Gb SR-IOV support (QED_SRIOV) [Y/n/?] y
      QLogic QED 25/40/100Gb Ethernet NIC (QEDE) [M/n/?] m
    QLogic BR-series devices (NET_VENDOR_BROCADE) [Y/n/?] y
      QLogic BR-series 1010/1020/1860 10Gb Ethernet Driver support (BNA) [M/n/y/?] m
    Qualcomm devices (NET_VENDOR_QUALCOMM) [N/y/?] n
    RDC devices (NET_VENDOR_RDC) [Y/n/?] y
      RDC R6040 Fast Ethernet Adapter support (R6040) [M/n/y/?] m
    Realtek devices (NET_VENDOR_REALTEK) [Y/n/?] y
      AT-LAN-TEC/RealTek pocket adapter support (ATP) [M/n/?] m
      RealTek RTL-8139 C+ PCI Fast Ethernet Adapter support (8139CP) [M/n/y/?] m
      RealTek RTL-8129/8130/8139 PCI Fast Ethernet Adapter support (8139TOO) [M/n/y/?] m
        Use PIO instead of MMIO (8139TOO_PIO) [N/y/?] n
        Support for uncommon RTL-8139 rev. K (automatic channel equalization) (8139TOO_TUNE_TWISTER) [N/y/?] n
        Support for older RTL-8129/8130 boards (8139TOO_8129) [Y/n/?] y
        Use older RX-reset method (8139_OLD_RX_RESET) [N/y/?] n
      Realtek 8169/8168/8101/8125 ethernet support (R8169) [M/n/y/?] m
      Realtek Automotive Switch 9054/9068/9072/9075/9068/9071 PCIe Interface support (RTASE) [N/m/y/?] (NEW)
    Renesas devices (NET_VENDOR_RENESAS) [N/y/?] n
    Rocker devices (NET_VENDOR_ROCKER) [Y/n/?] y
      Rocker switch driver (EXPERIMENTAL) (ROCKER) [M/n/?] m
    Samsung Ethernet devices (NET_VENDOR_SAMSUNG) [N/y/?] n
    SEEQ devices (NET_VENDOR_SEEQ) [N/y/?] n
    Silan devices (NET_VENDOR_SILAN) [Y/n/?] y
      Silan SC92031 PCI Fast Ethernet Adapter driver (SC92031) [M/n/y/?] m
    Silicon Integrated Systems (SiS) devices (NET_VENDOR_SIS) [Y/n/?] y
      SiS 900/7016 PCI Fast Ethernet Adapter support (SIS900) [M/n/y/?] m
      SiS190/SiS191 gigabit ethernet support (SIS190) [M/n/y/?] m
    Solarflare devices (NET_VENDOR_SOLARFLARE) [Y/n/?] y
      Solarflare SFC9100/EF100-family support (SFC) [M/n/y/?] m
        Solarflare SFC9100-family MTD support (SFC_MTD) [Y/n/?] y
        Solarflare SFC9100-family hwmon support (SFC_MCDI_MON) [Y/n/?] y
        Solarflare SFC9100-family SR-IOV support (SFC_SRIOV) [Y/n/?] y
        Solarflare SFC9100-family MCDI logging support (SFC_MCDI_LOGGING) [N/y/?] n
      Solarflare SFC4000 support (SFC_FALCON) [M/n/y/?] m
        Solarflare SFC4000 MTD support (SFC_FALCON_MTD) [Y/n/?] y
      Solarflare SFC9000 support (SFC_SIENA) [N/m/y/?] n
    SMC (SMSC)/Western Digital devices (NET_VENDOR_SMSC) [Y/n/?] y
      SMC 91Cxx PCMCIA support (PCMCIA_SMC91C92) [M/n/?] m
      SMC EtherPower II (EPIC100) [M/n/y/?] m
      SMSC LAN911x/LAN921x families embedded ethernet support (SMSC911X) [M/n/y/?] m
      SMSC LAN9420 PCI ethernet adapter support (SMSC9420) [M/n/y/?] m
    Socionext ethernet drivers (NET_VENDOR_SOCIONEXT) [N/y/?] n
    STMicroelectronics devices (NET_VENDOR_STMICRO) [Y/n/?] y
      STMicroelectronics Multi-Gigabit Ethernet driver (STMMAC_ETH) [M/n/y/?] m
        Support for STMMAC Selftests (STMMAC_SELFTESTS) [N/y/?] n
        STMMAC Platform bus support (STMMAC_PLATFORM) [N/m/?] n
        Intel GMAC support (DWMAC_INTEL) [M/n/?] m
        STMMAC PCI bus support (STMMAC_PCI) [N/m/?] n
    Sun devices (NET_VENDOR_SUN) [Y/n/?] y
      Sun Happy Meal 10/100baseT support (HAPPYMEAL) [M/n/y/?] m
      Sun GEM support (SUNGEM) [M/n/y/?] m
      Sun Cassini support (CASSINI) [M/n/y/?] m
      Sun Neptune 10Gbit Ethernet support (NIU) [M/n/y/?] m
    Synopsys devices (NET_VENDOR_SYNOPSYS) [N/y/?] n
    Tehuti devices (NET_VENDOR_TEHUTI) [Y/n/?] y
      Tehuti Networks 10G Ethernet (TEHUTI) [M/n/y/?] m
      Tehuti Networks TN40xx 10G Ethernet adapters (TEHUTI_TN40) [N/m/y/?] (NEW)
    Texas Instruments (TI) devices (NET_VENDOR_TI) [Y/n/?] y
      TI CPSW Phy mode Selection (DEPRECATED) (TI_CPSW_PHY_SEL) [N/y/?] n
      TI ThunderLAN support (TLAN) [M/n/y/?] m
    Vertexcom devices (NET_VENDOR_VERTEXCOM) [Y/n/?] y
      Vertexcom MSE102x SPI (MSE102X) [N/m/y/?] n
    VIA devices (NET_VENDOR_VIA) [Y/n/?] y
      VIA Rhine support (VIA_RHINE) [M/n/y/?] m
        Use MMIO instead of PIO (VIA_RHINE_MMIO) [Y/n/?] y
      VIA Velocity support (VIA_VELOCITY) [M/n/y/?] m
    Wangxun devices (NET_VENDOR_WANGXUN) [Y/n/?] y
      Wangxun(R) GbE PCI Express adapters support (NGBE) [N/m/y/?] n
      Wangxun(R) 10GbE PCI Express adapters support (TXGBE) [N/m/?] n
    WIZnet devices (NET_VENDOR_WIZNET) [Y/n/?] y
      WIZnet W5100 Ethernet support (WIZNET_W5100) [M/n/y/?] m
      WIZnet W5300 Ethernet support (WIZNET_W5300) [M/n/y/?] m
      WIZnet interface mode
        1. Direct address bus mode (WIZNET_BUS_DIRECT)
        2. Indirect address bus mode (WIZNET_BUS_INDIRECT)
      > 3. Select interface mode in runtime (WIZNET_BUS_ANY)
      choice[1-3?]: 3
      WIZnet W5100/W5200/W5500 Ethernet support for SPI mode (WIZNET_W5100_SPI) [M/n/?] m
    Xilinx devices (NET_VENDOR_XILINX) [Y/n/?] y
      Xilinx 10/100 Ethernet Lite support (XILINX_EMACLITE) [N/m/y/?] n
      Xilinx LL TEMAC (LocalLink Tri-mode Ethernet MAC) driver (XILINX_LL_TEMAC) [M/n/y/?] m
    Xircom devices (NET_VENDOR_XIRCOM) [Y/n/?] y
      Xircom 16-bit PCMCIA support (PCMCIA_XIRC2PS) [M/n/?] m
  FDDI driver support (FDDI) [N/m/y/?] n
  HIPPI driver support (HIPPI) [N/y/?] n
  *
  * PHY Device support and infrastructure
  *
  PHY Device support and infrastructure (PHYLIB) [M/y/?] m
    Support LED triggers for tracking link state (LED_TRIGGER_PHY) [Y/n/?] y
    MDIO Bus/PHY emulation with fixed speed/link PHYs (FIXED_PHY) [M/?] m
    SFP cage support (SFP) [M/n/?] m
    *
    * MII PHY device drivers
    *
    Airoha EN8811H 2.5 Gigabit PHY (AIR_EN8811H_PHY) [N/m/?] (NEW)
    AMD and Altima PHYs (AMD_PHY) [M/n/?] m
    Analog Devices Industrial Ethernet PHYs (ADIN_PHY) [M/n/?] m
    Analog Devices Industrial Ethernet T1L PHYs (ADIN1100_PHY) [N/m/?] n
    Aquantia PHYs (AQUANTIA_PHY) [M/n/?] m
    Asix PHYs (AX88796B_PHY) [M/?] m
    Broadcom 54XX PHYs (BROADCOM_PHY) [M/n/?] m
    Broadcom BCM54140 PHY (BCM54140_PHY) [M/n/?] m
    Broadcom 7xxx SOCs internal PHYs (BCM7XXX_PHY) [M/?] m
    Broadcom BCM84881 PHY (BCM84881_PHY) [N/m/?] n
    Broadcom BCM8706 and BCM8727 PHYs (BCM87XX_PHY) [M/n/?] m
    Cicada PHYs (CICADA_PHY) [M/n/?] m
    Cortina EDC CDR 10G Ethernet PHY (CORTINA_PHY) [M/n/?] m
    Davicom PHYs (DAVICOM_PHY) [M/n/?] m
    ICPlus PHYs (ICPLUS_PHY) [M/n/?] m
    Intel LXT PHYs (LXT_PHY) [M/n/?] m
    Intel XWAY PHYs (INTEL_XWAY_PHY) [M/n/?] m
    LSI ET1011C PHY (LSI_ET1011C_PHY) [M/n/?] m
    Marvell Alaska PHYs (MARVELL_PHY) [M/n/?] m
    Marvell Alaska 10Gbit PHYs (MARVELL_10G_PHY) [M/n/?] m
    Marvell 88Q2XXX PHY (MARVELL_88Q2XXX_PHY) [N/m/?] (NEW)
    Marvell 88X2222 PHY (MARVELL_88X2222_PHY) [N/m/?] n
    Maxlinear Ethernet PHYs (MAXLINEAR_GPHY) [N/m/?] n
    MediaTek Gigabit Ethernet PHYs (MEDIATEK_GE_PHY) [M/?] m
    Micrel PHYs (MICREL_PHY) [M/n/?] m
    Microchip 10BASE-T1S Ethernet PHYs (MICROCHIP_T1S_PHY) [N/m/?] (NEW)
    Microchip PHYs (MICROCHIP_PHY) [M/?] m
    Microchip T1 PHYs (MICROCHIP_T1_PHY) [N/m/?] n
    Microsemi PHYs (MICROSEMI_PHY) [M/n/?] m
    Motorcomm PHYs (MOTORCOMM_PHY) [N/m/?] n
    National Semiconductor PHYs (NATIONAL_PHY) [M/n/?] m
    NXP 100BASE-TX PHYs (NXP_CBTX_PHY) [N/m/?] (NEW)
    NXP C45 TJA11XX PHYs (NXP_C45_TJA11XX_PHY) [N/m/?] n
    NXP TJA11xx PHYs support (NXP_TJA11XX_PHY) [N/m/?] n
    Onsemi 10BASE-T1S Ethernet PHY (NCN26000_PHY) [N/m/?] (NEW)
    Qualcomm Atheros AR803X PHYs (AT803X_PHY) [M/n/?] m
    Qualcomm Atheros QCA833x PHYs (QCA83XX_PHY) [N/m/?] (NEW)
    Qualcomm QCA808x PHYs (QCA808X_PHY) [N/m/?] (NEW)
    Quality Semiconductor PHYs (QSEMI_PHY) [M/n/?] m
    Realtek PHYs (REALTEK_PHY) [M/?] m
    Renesas PHYs (RENESAS_PHY) [N/m/?] n
    Rockchip Ethernet PHYs (ROCKCHIP_PHY) [N/m/?] n
    SMSC PHYs (SMSC_PHY) [M/?] m
    STMicroelectronics STe10Xp PHYs (STE10XP) [M/n/?] m
    Teranetics PHYs (TERANETICS_PHY) [M/n/?] m
    Texas Instruments DP83822/825/826 PHYs (DP83822_PHY) [M/n/?] m
    Texas Instruments DP83TC811 PHY (DP83TC811_PHY) [N/m/?] n
    Texas Instruments DP83848 PHY (DP83848_PHY) [M/n/?] m
    Texas Instruments DP83867 Gigabit PHY (DP83867_PHY) [N/m/?] n
    Texas Instruments DP83869 Gigabit PHY (DP83869_PHY) [M/n/?] m
    Texas Instruments DP83TD510 Ethernet 10Base-T1L PHY (DP83TD510_PHY) [N/m/?] n
    Texas Instruments DP83TG720 Ethernet 1000Base-T1 PHY (DP83TG720_PHY) [N/m/?] (NEW)
    Vitesse PHYs (VITESSE_PHY) [M/n/?] m
    Xilinx GMII2RGMII converter driver (XILINX_GMII2RGMII) [M/n/?] m
  Micrel KS8995MA 5-ports 10/100 managed Ethernet switch (MICREL_KS8995MA) [N/m/y/?] n
  *
  * CAN Device Drivers
  *
  CAN Device Drivers (CAN_DEV) [M/n/?] m
    Virtual Local CAN Interface (vcan) (CAN_VCAN) [M/n/?] m
    Virtual CAN Tunnel (vxcan) (CAN_VXCAN) [M/n/?] m
    CAN device drivers with Netlink support (CAN_NETLINK) [Y/n/?] y
      CAN bit-timing calculation (CAN_CALC_BITTIMING) [Y/n/?] y
      Serial / USB serial ELM327 based OBD-II Interfaces (can327) (CAN_CAN327) [N/m/?] n
      Kvaser PCIe FD cards (CAN_KVASER_PCIEFD) [N/m/?] n
      Serial / USB serial CAN Adaptors (slcan) (CAN_SLCAN) [M/n/?] m
      CTU CAN-FD IP core PCI/PCIe driver (CAN_CTUCANFD_PCI) [N/m/?] n
      esd electronics gmbh CAN-PCI(e)/402 family (CAN_ESD_402_PCI) [N/m/?] (NEW)
      IFI CAN_FD IP (CAN_IFI_CANFD) [M/n/?] m
      PEAK-System PCAN-PCIe FD cards (CAN_PEAK_PCIEFD) [M/n/?] m
      Softing Gmbh CAN generic support (CAN_SOFTING) [M/n/?] m
        Softing Gmbh CAN pcmcia cards (CAN_SOFTING_CS) [N/m/?] n
      *
      * CAN USB interfaces
      *
      8 devices USB2CAN interface (CAN_8DEV_USB) [M/n/?] m
      EMS CPC-USB/ARM7 CAN/USB interface (CAN_EMS_USB) [M/n/?] m
      esd electronics gmbh CAN/USB interfaces (CAN_ESD_USB) [N/m/?] n
      ETAS ES58X CAN/USB interfaces (CAN_ETAS_ES58X) [N/m/?] n
      Fintek F81604 USB to 2CAN interface (CAN_F81604) [N/m/?] (NEW)
      Geschwister Schneider UG and candleLight compatible interfaces (CAN_GS_USB) [M/n/?] m
      Kvaser CAN/USB interface (CAN_KVASER_USB) [M/n/?] m
      Microchip CAN BUS Analyzer interface (CAN_MCBA_USB) [M/n/?] m
      PEAK PCAN-USB/USB Pro interfaces for CAN 2.0b/CAN-FD (CAN_PEAK_USB) [M/n/?] m
      Theobroma Systems UCAN interface (CAN_UCAN) [N/m/?] n
    CAN devices debugging messages (CAN_DEBUG_DEVICES) [N/y/?] n
  PLIP (parallel port) support (PLIP) [N/m/?] n
  PPP (point-to-point protocol) support (PPP) [M/y/?] m
    PPP BSD-Compress compression (PPP_BSDCOMP) [M/n/?] m
    PPP Deflate compression (PPP_DEFLATE) [M/n/?] m
    PPP filtering (PPP_FILTER) [Y/n/?] y
    PPP MPPE compression (encryption) (PPP_MPPE) [M/n/?] m
    PPP multilink support (PPP_MULTILINK) [Y/n/?] y
    PPP over ATM (PPPOATM) [M/n/?] m
    PPP over Ethernet (PPPOE) [M/n/?] m
      Number of PPPoE hash bits
        1. 1 bit (2 buckets) (PPPOE_HASH_BITS_1) (NEW)
        2. 2 bits (4 buckets) (PPPOE_HASH_BITS_2) (NEW)
      > 3. 4 bits (16 buckets) (PPPOE_HASH_BITS_4) (NEW)
        4. 8 bits (256 buckets) (PPPOE_HASH_BITS_8) (NEW)
      choice[1-4?]:
    PPP over IPv4 (PPTP) (PPTP) [M/n/?] m
    PPP over L2TP (PPPOL2TP) [M/n/?] m
    PPP support for async serial ports (PPP_ASYNC) [M/n/?] m
    PPP support for sync tty ports (PPP_SYNC_TTY) [M/n/?] m
  SLIP (serial line) support (SLIP) [M/n/y/?] m
  CSLIP compressed headers (SLIP_COMPRESSED) [Y/n/?] y
  Keepalive and linefill (SLIP_SMART) [Y/n/?] y
  Six bit SLIP encapsulation (SLIP_MODE_SLIP6) [N/y/?] n
  *
  * Wireless LAN
  *
  Wireless LAN (WLAN) [Y/n/?] y
    ADMtek devices (WLAN_VENDOR_ADMTEK) [N/y/?] n
    Atheros/Qualcomm devices (WLAN_VENDOR_ATH) [Y/n/?] y
      Atheros wireless debugging (ATH_DEBUG) [N/y/?] n
      Atheros 5xxx wireless cards support (ATH5K) [M/n/?] m
        Atheros 5xxx debugging (ATH5K_DEBUG) [Y/n/?] y
        Atheros 5xxx tracer (ATH5K_TRACER) [N/y/?] n
      Atheros 5xxx PCI bus support (ATH5K_PCI) [Y/?] y
      Atheros bluetooth coexistence support (ATH9K_BTCOEX_SUPPORT) [Y/n/?] y
      Atheros 802.11n wireless cards support (ATH9K) [M/n/?] m
        Atheros ath9k PCI/PCIe bus support (ATH9K_PCI) [Y/n/?] y
        Atheros ath9k AHB bus support (ATH9K_AHB) [Y/n/?] y
        Atheros ath9k debugging (ATH9K_DEBUGFS) [Y/n/?] y
          Detailed station statistics (ATH9K_STATION_STATISTICS) [N/y/?] n
        Atheros ath9k ACK timeout estimation algorithm (ATH9K_DYNACK) [N/y/?] n
        Wake on Wireless LAN support (EXPERIMENTAL) (ATH9K_WOW) [N/y/?] n
        Channel Context support (ATH9K_CHANNEL_CONTEXT) [N/y/?] n
      Atheros ath9k pci loader for EEPROM-less chips (ATH9K_PCI_NO_EEPROM) [M/n/y/?] m
      Atheros HTC based wireless cards support (ATH9K_HTC) [M/n/?] m
        Atheros ath9k_htc debugging (ATH9K_HTC_DEBUGFS) [N/y/?] n
      Random number generator support (ATH9K_HWRNG) [N/y/?] n
      Atheros ath9k/ath9k_htc spectral scan support (ATH9K_COMMON_SPECTRAL) [N/y/?] n
      Linux Community AR9170 802.11n USB support (CARL9170) [M/n/?] m
        SoftLED Support (CARL9170_LEDS) [Y/n/?] y
        DebugFS Support (CARL9170_DEBUGFS) [N/y/?] n
        Random number generator (CARL9170_HWRNG) [N/y/?] n
      Atheros mobile chipsets support (ATH6KL) [M/n/?] m
        Atheros ath6kl SDIO support (ATH6KL_SDIO) [M/n/?] m
        Atheros ath6kl USB support (ATH6KL_USB) [M/n/?] m
        Atheros ath6kl debugging (ATH6KL_DEBUG) [Y/n/?] y
        Atheros ath6kl tracing support (ATH6KL_TRACING) [N/y/?] n
      Atheros AR5523 wireless driver support (AR5523) [M/n/?] m
      Wilocity 60g WiFi card wil6210 support (WIL6210) [M/n/?] m
        Use Clear-On-Read mode for ISR registers for wil6210 (WIL6210_ISR_COR) [Y/n/?] y
        wil6210 tracing support (WIL6210_TRACING) [N/y/?] n
        wil6210 debugfs support (WIL6210_DEBUGFS) [Y/n/?] y
      Atheros 802.11ac wireless cards support (ATH10K) [M/n/?] m
      Atheros ath10k PCI support (ATH10K_PCI) [M/n/?] m
      Atheros ath10k SDIO support (ATH10K_SDIO) [M/n/?] m
      Atheros ath10k USB support (EXPERIMENTAL) (ATH10K_USB) [M/n/?] m
      Atheros ath10k debugging (ATH10K_DEBUG) [N/y/?] n
      Atheros ath10k debugfs support (ATH10K_DEBUGFS) [Y/n/?] y
      Atheros ath10k spectral scan support (ATH10K_SPECTRAL) [N/y/?] n
      Atheros ath10k tracing support (ATH10K_TRACING) [N/y/?] n
      Qualcomm Atheros WCN3660/3680 support (WCN36XX) [M/n/?] m
        WCN36XX debugfs support (WCN36XX_DEBUGFS) [N/y/?] n
      Qualcomm Technologies 802.11ax chipset support (ATH11K) [N/m/?] n
      Qualcomm Technologies Wi-Fi 7 support (ath12k) (ATH12K) [N/m/?] (NEW)
    Atmel devices (WLAN_VENDOR_ATMEL) [N/y/?] n
    Broadcom devices (WLAN_VENDOR_BROADCOM) [Y/n/?] y
      Broadcom 43xx wireless support (mac80211 stack) (B43) [M/n/?] m
      Supported bus types
      > 1. BCMA and SSB (B43_BUSES_BCMA_AND_SSB)
        2. BCMA only (B43_BUSES_BCMA)
        3. SSB only (B43_BUSES_SSB)
      choice[1-3?]: 1
      Broadcom 43xx SDIO device support (B43_SDIO) [Y/n/?] y
      Support for G-PHY (802.11g) devices (B43_PHY_G) [Y/n/?] y
      Support for N-PHY (the main 802.11n series) devices (B43_PHY_N) [Y/n/?] y
      Support for LP-PHY (low-power 802.11g) devices (B43_PHY_LP) [Y/n/?] y
      Support for HT-PHY (high throughput 802.11n) devices (B43_PHY_HT) [Y/n/?] y
      Broadcom 43xx debugging (B43_DEBUG) [N/y/?] n
      Broadcom 43xx-legacy wireless support (mac80211 stack) (B43LEGACY) [M/n/?] m
        Broadcom 43xx-legacy debugging (B43LEGACY_DEBUG) [N/y/?] n
        Broadcom 43xx-legacy data transfer mode
        > 1. DMA + PIO (B43LEGACY_DMA_AND_PIO_MODE)
          2. DMA (Direct Memory Access) only (B43LEGACY_DMA_MODE)
          3. PIO (Programmed I/O) only (B43LEGACY_PIO_MODE)
        choice[1-3?]: 1
      Broadcom IEEE802.11n PCIe SoftMAC WLAN driver (BRCMSMAC) [M/n/?] m
      Broadcom FullMAC WLAN driver (BRCMFMAC) [M/n/?] m
      SDIO bus interface support for FullMAC driver (BRCMFMAC_SDIO) [Y/n/?] y
      USB bus interface support for FullMAC driver (BRCMFMAC_USB) [Y/n/?] y
      PCIE bus interface support for FullMAC driver (BRCMFMAC_PCIE) [Y/n/?] y
      Broadcom device tracing (BRCM_TRACING) [N/y/?] n
      Broadcom driver debug functions (BRCMDBG) [N/y/?] n
    Intel devices (WLAN_VENDOR_INTEL) [Y/n/?] y
      Intel PRO/Wireless 2100 Network Connection (IPW2100) [M/n/?] m
        Enable promiscuous mode (IPW2100_MONITOR) [Y/n/?] y
        Enable full debugging output in IPW2100 module. (IPW2100_DEBUG) [N/y/?] n
      Intel PRO/Wireless 2200BG and 2915ABG Network Connection (IPW2200) [M/n/?] m
        Enable promiscuous mode (IPW2200_MONITOR) [Y/n/?] y
          Enable radiotap format 802.11 raw packet support (IPW2200_RADIOTAP) [Y/?] y
          Enable creation of a RF radiotap promiscuous interface (IPW2200_PROMISCUOUS) [Y/n/?] y
        Enable QoS support (IPW2200_QOS) [Y/n/?] y
        Enable full debugging output in IPW2200 module. (IPW2200_DEBUG) [N/y/?] n
      Full debugging output for the LIBIPW component (LIBIPW_DEBUG) [N/y/?] n
      Intel Wireless WiFi 4965AGN (iwl4965) (IWL4965) [M/n/?] m
      Intel PRO/Wireless 3945ABG/BG Network Connection (iwl3945) (IWL3945) [M/n/?] m
      Intel Wireless WiFi Next Gen AGN - Wireless-N/Advanced-N/Ultimate-N (iwlwifi)  (IWLWIFI) [M/n/?] m
        Intel Wireless WiFi DVM Firmware support (IWLDVM) [M/n/?] m
        Intel Wireless WiFi MVM Firmware support (IWLMVM) [M/n/?] m
    Intersil devices (WLAN_VENDOR_INTERSIL) [Y/n/?] y
      Softmac Prism54 support (P54_COMMON) [M/n/?] m
        Prism54 USB support (P54_USB) [M/n/?] m
        Prism54 PCI support (P54_PCI) [M/n/?] m
        Prism54 SPI (stlc45xx) support (P54_SPI) [N/m/?] n
    Marvell devices (WLAN_VENDOR_MARVELL) [Y/n/?] y
      Marvell 8xxx Libertas WLAN driver support (LIBERTAS) [M/n/?] m
        Marvell Libertas 8388 USB 802.11b/g cards (LIBERTAS_USB) [M/n/?] m
        Marvell Libertas 8385/8686/8688 SDIO 802.11b/g cards (LIBERTAS_SDIO) [M/n/?] m
        Marvell Libertas 8686 SPI 802.11b/g cards (LIBERTAS_SPI) [N/m/?] n
        Enable full debugging output in the Libertas module. (LIBERTAS_DEBUG) [N/y/?] n
        Enable mesh support (LIBERTAS_MESH) [Y/n/?] y
      Marvell 8xxx Libertas WLAN driver support with thin firmware (LIBERTAS_THINFIRM) [N/m/?] n
      Marvell WiFi-Ex Driver (MWIFIEX) [M/n/?] m
        Marvell WiFi-Ex Driver for SD8786/SD8787/SD8797/SD8887/SD8897/SD8977/SD8978/SD8987/SD8997 (MWIFIEX_SDIO) [M/n/?] m
        Marvell WiFi-Ex Driver for PCIE 8766/8897/8997 (MWIFIEX_PCIE) [M/n/?] m
        Marvell WiFi-Ex Driver for USB8766/8797/8997 (MWIFIEX_USB) [M/n/?] m
      Marvell 88W8xxx PCI/PCIe Wireless support (MWL8K) [M/n/?] m
    MediaTek devices (WLAN_VENDOR_MEDIATEK) [Y/n/?] y
      MediaTek MT7601U (USB) support (MT7601U) [M/n/?] m
      MediaTek MT76x0U (USB) support (MT76x0U) [M/n/?] m
      MediaTek MT76x0E (PCIe) support (MT76x0E) [M/n/?] m
      MediaTek MT76x2E (PCIe) support (MT76x2E) [M/n/?] m
      MediaTek MT76x2U (USB) support (MT76x2U) [M/n/?] m
      MediaTek MT7603E (PCIe) and MT76x8 WLAN support (MT7603E) [M/n/?] m
      MediaTek MT7615E and MT7663E (PCIe) support (MT7615E) [M/n/?] m
      MediaTek MT7663U (USB) support (MT7663U) [N/m/?] n
      MediaTek MT7663S (SDIO) support (MT7663S) [N/m/?] n
      MediaTek MT7915E (PCIe) support (MT7915E) [N/m/?] n
      MediaTek MT7921E (PCIe) support (MT7921E) [N/m/?] n
      MediaTek MT7921S (SDIO) support (MT7921S) [N/m/?] n
      MediaTek MT7921U (USB) support (MT7921U) [N/m/?] n
      MediaTek MT7996 (PCIe) support (MT7996E) [N/m/?] (NEW)
      MediaTek MT7925E (PCIe) support (MT7925E) [N/m/?] (NEW)
      MediaTek MT7925U (USB) support (MT7925U) [N/m/?] (NEW)
    Microchip devices (WLAN_VENDOR_MICROCHIP) [Y/n/?] y
      Atmel WILC1000 SDIO (WiFi only) (WILC1000_SDIO) [N/m/?] n
      Atmel WILC1000 SPI (WiFi only) (WILC1000_SPI) [N/m/?] n
    pureLiFi devices (WLAN_VENDOR_PURELIFI) [Y/n/?] y
      pureLiFi X, XL, XC device support (PLFXLC) [N/m/?] n
    Ralink devices (WLAN_VENDOR_RALINK) [Y/n/?] y
    Realtek devices (WLAN_VENDOR_REALTEK) [Y/n/?] y
      Realtek 8180/8185/8187SE PCI support (RTL8180) [M/n/?] m
      Realtek 8187 and 8187B USB support (RTL8187) [M/n/?] m
      *
      * Realtek rtlwifi family of devices
      *
      Realtek rtlwifi family of devices (RTL_CARDS) [M/n/?] m
        Realtek RTL8192CE/RTL8188CE Wireless Network Adapter (RTL8192CE) [M/n/?] m
        Realtek RTL8192SE/RTL8191SE PCIe Wireless Network Adapter (RTL8192SE) [M/n/?] m
        Realtek RTL8192DE/RTL8188DE PCIe Wireless Network Adapter (RTL8192DE) [M/n/?] m
        Realtek RTL8723AE PCIe Wireless Network Adapter (RTL8723AE) [M/n/?] m
        Realtek RTL8723BE PCIe Wireless Network Adapter (RTL8723BE) [M/n/?] m
        Realtek RTL8188EE Wireless Network Adapter (RTL8188EE) [M/n/?] m
        Realtek RTL8192EE Wireless Network Adapter (RTL8192EE) [M/n/?] m
        Realtek RTL8821AE/RTL8812AE Wireless Network Adapter (RTL8821AE) [M/n/?] m
        Realtek RTL8192CU/RTL8188CU USB Wireless Network Adapter (RTL8192CU) [M/n/?] m
        Realtek RTL8192DU USB Wireless Network Adapter (RTL8192DU) [N/m/?] (NEW)
        Debugging output for rtlwifi driver family (RTLWIFI_DEBUG) [N/y/?] n
      Realtek 802.11n USB wireless chips support (RTL8XXXU) [M/n/?] m
        Include support for untested Realtek 8xxx USB devices (EXPERIMENTAL) (RTL8XXXU_UNTESTED) [Y/n/?] y
      *
      * Realtek 802.11ac wireless chips support
      *
      Realtek 802.11ac wireless chips support (RTW88) [M/n/?] m
        Realtek 8822BE PCI wireless network adapter (RTW88_8822BE) [M/n/?] m
        Realtek 8822BS SDIO wireless network adapter (RTW88_8822BS) [N/m/?] (NEW)
        Realtek 8822BU USB wireless network adapter (RTW88_8822BU) [N/m/?] (NEW)
        Realtek 8822CE PCI wireless network adapter (RTW88_8822CE) [M/n/?] m
        Realtek 8822CS SDIO wireless network adapter (RTW88_8822CS) [N/m/?] (NEW)
        Realtek 8822CU USB wireless network adapter (RTW88_8822CU) [N/m/?] (NEW)
        Realtek 8723DE PCI wireless network adapter (RTW88_8723DE) [N/m/?] n
        Realtek 8723DS SDIO wireless network adapter (RTW88_8723DS) [N/m/?] (NEW)
        Realtek 8723CS SDIO wireless network adapter (RTW88_8723CS) [N/m/?] (NEW)
        Realtek 8723DU USB wireless network adapter (RTW88_8723DU) [N/m/?] (NEW)
        Realtek 8821CE PCI wireless network adapter (RTW88_8821CE) [N/m/?] n
        Realtek 8821CS SDIO wireless network adapter (RTW88_8821CS) [N/m/?] (NEW)
        Realtek 8821CU USB wireless network adapter (RTW88_8821CU) [N/m/?] (NEW)
        Realtek rtw88 debug support (RTW88_DEBUG) [N/y/?] n
        Realtek rtw88 debugfs support (RTW88_DEBUGFS) [N/y/?] n
    Redpine Signals Inc devices (WLAN_VENDOR_RSI) [Y/n/?] y
      Redpine Signals Inc 91x WLAN driver support (RSI_91X) [M/n/?] m
        Redpine Signals Inc debug support (RSI_DEBUGFS) [Y/n/?] y
        Redpine Signals SDIO bus support (RSI_SDIO) [M/n/?] m
        Redpine Signals USB bus support (RSI_USB) [M/n/?] m
        Redpine Signals WLAN BT Coexistence support (RSI_COEX) [Y/n/?] y
    Silicon Laboratories devices (WLAN_VENDOR_SILABS) [Y/n/?] y
      Silicon Labs wireless chips WF200 and further (WFX) [N/m/?] n
    STMicroelectronics devices (WLAN_VENDOR_ST) [Y/n/?] y
      CW1200 WLAN support (CW1200) [M/n/?] m
        Support SDIO platforms (CW1200_WLAN_SDIO) [M/n/?] m
        Support SPI platforms (CW1200_WLAN_SPI) [M/n/?] m
    Texas Instrument devices (WLAN_VENDOR_TI) [Y/n/?] y
      TI wl1251 driver support (WL1251) [M/n/?] m
        TI wl1251 SPI support (WL1251_SPI) [M/n/?] m
        TI wl1251 SDIO support (WL1251_SDIO) [M/n/?] m
      TI wl12xx support (WL12XX) [M/n/?] m
      TI wl18xx support (WL18XX) [M/n/?] m
      TI wlcore support (WLCORE) [M/?] m
        TI wlcore SDIO support (WLCORE_SDIO) [M/n/?] m
    ZyDAS devices (WLAN_VENDOR_ZYDAS) [Y/n/?] y
      ZyDAS ZD1211/ZD1211B USB-wireless support (ZD1211RW) [M/n/?] m
        ZyDAS ZD1211 debugging (ZD1211RW_DEBUG) [N/y/?] n
    Quantenna wireless cards support (WLAN_VENDOR_QUANTENNA) [Y/n/?] y
      Quantenna QSR1000/QSR2000/QSR10g PCIe support (QTNFMAC_PCIE) [M/n/?] m
    Simulated radio testing tool for mac80211 (MAC80211_HWSIM) [M/n/?] m
    Wifi wrapper for ethernet drivers (VIRT_WIFI) [M/n/?] m
  Xen network device frontend driver (XEN_NETDEV_FRONTEND) [M/n/y/?] m
  Xen backend network device (XEN_NETDEV_BACKEND) [M/n/y/?] m
  VMware VMXNET3 ethernet driver (VMXNET3) [M/n/y/?] m
  FUJITSU Extended Socket Network Device driver (FUJITSU_ES) [M/n/y/?] m
  Simulated networking device (NETDEVSIM) [M/n/?] m
  Failover driver (NET_FAILOVER) [M/n/y/?] m
*
* Joysticks/Gamepads
*
Joysticks/Gamepads (INPUT_JOYSTICK) [Y/n/?] y
  Classic PC analog joysticks and gamepads (JOYSTICK_ANALOG) [M/n/y/?] m
  Assassin 3D and MadCatz Panther devices (JOYSTICK_A3D) [M/n/y/?] m
  Simple joystick connected over ADC (JOYSTICK_ADC) [N/m/?] n
  Logitech ADI digital joysticks and gamepads (JOYSTICK_ADI) [M/n/y/?] m
  Creative Labs Blaster Cobra gamepad (JOYSTICK_COBRA) [M/n/y/?] m
  Genius Flight2000 Digital joysticks and gamepads (JOYSTICK_GF2K) [M/n/y/?] m
  Gravis GrIP joysticks and gamepads (JOYSTICK_GRIP) [M/n/y/?] m
  Gravis GrIP MultiPort (JOYSTICK_GRIP_MP) [M/n/y/?] m
  Guillemot joysticks and gamepads (JOYSTICK_GUILLEMOT) [M/n/y/?] m
  InterAct digital joysticks and gamepads (JOYSTICK_INTERACT) [M/n/y/?] m
  Microsoft SideWinder digital joysticks and gamepads (JOYSTICK_SIDEWINDER) [M/n/y/?] m
  ThrustMaster DirectConnect joysticks and gamepads (JOYSTICK_TMDC) [M/n/y/?] m
  I-Force devices (JOYSTICK_IFORCE) [M/n/y/?] m
    I-Force USB joysticks and wheels (JOYSTICK_IFORCE_USB) [M/n/?] m
    I-Force Serial joysticks and wheels (JOYSTICK_IFORCE_232) [M/n/?] m
  Logitech WingMan Warrior joystick (JOYSTICK_WARRIOR) [M/n/y/?] m
  LogiCad3d Magellan/SpaceMouse 6dof controllers (JOYSTICK_MAGELLAN) [M/n/y/?] m
  SpaceTec SpaceOrb/Avenger 6dof controllers (JOYSTICK_SPACEORB) [M/n/y/?] m
  SpaceTec SpaceBall 6dof controllers (JOYSTICK_SPACEBALL) [M/n/y/?] m
  Gravis Stinger gamepad (JOYSTICK_STINGER) [M/n/y/?] m
  Twiddler as a joystick (JOYSTICK_TWIDJOY) [M/n/y/?] m
  5-byte Zhenhua RC transmitter (JOYSTICK_ZHENHUA) [M/n/y/?] m
  Multisystem, Sega Genesis, Saturn joysticks and gamepads (JOYSTICK_DB9) [M/n/?] m
  Multisystem, NES, SNES, N64, PSX joysticks and gamepads (JOYSTICK_GAMECON) [M/n/?] m
  Multisystem joysticks via TurboGraFX device (JOYSTICK_TURBOGRAFX) [M/n/?] m
  Austria Microsystem AS5011 joystick (JOYSTICK_AS5011) [N/m/?] n
  Gameport data dumper (JOYSTICK_JOYDUMP) [M/n/y/?] m
  Xbox gamepad support (JOYSTICK_XPAD) [M/n/y/?] m
    Xbox gamepad rumble support (JOYSTICK_XPAD_FF) [Y/n/?] y
    LED Support for the Xbox 360 controller Guide button (JOYSTICK_XPAD_LEDS) [Y/n/?] y
  Walkera WK-0701 RC transmitter (JOYSTICK_WALKERA0701) [M/n/?] m
  PlayStation 1/2 joypads via SPI interface (JOYSTICK_PSXPAD_SPI) [M/n/y/?] m
    PlayStation 1/2 joypads force feedback (rumble) support (JOYSTICK_PSXPAD_SPI_FF) [Y/n/?] y
  PhoenixRC Flight Controller Adapter (JOYSTICK_PXRC) [M/n/y/?] m
  SparkFun Qwiic Joystick (JOYSTICK_QWIIC) [N/m/?] n
  FlySky FS-iA6B RC Receiver (JOYSTICK_FSIA6B) [N/m/y/?] n
  Raspberry Pi Sense HAT joystick (JOYSTICK_SENSEHAT) [N/m/?] n
  Adafruit Mini I2C Gamepad with Seesaw (JOYSTICK_SEESAW) [N/m/?] (NEW)
*
* Touchscreens
*
Touchscreens (INPUT_TOUCHSCREEN) [Y/n/?] y
  ADS7846/TSC2046/AD7873 and AD(S)7843 based touchscreens (TOUCHSCREEN_ADS7846) [N/m/y/?] n
  AD7877 based touchscreens (TOUCHSCREEN_AD7877) [N/m/y/?] n
  Analog Devices AD7879-1/AD7889-1 touchscreen interface (TOUCHSCREEN_AD7879) [N/m/y/?] n
  Generic ADC based resistive touchscreen (TOUCHSCREEN_ADC) [N/m/?] n
  Atmel mXT I2C Touchscreen (TOUCHSCREEN_ATMEL_MXT) [M/n/?] m
    Support T37 Diagnostic Data (TOUCHSCREEN_ATMEL_MXT_T37) [N/y/?] n
  AUO in-cell touchscreen using Pixcir ICs (TOUCHSCREEN_AUO_PIXCIR) [M/n/?] m
  BU21013 based touch panel controllers (TOUCHSCREEN_BU21013) [N/m/?] n
  Rohm BU21029 based touch panel controllers (TOUCHSCREEN_BU21029) [N/m/?] n
  chipone icn8505 touchscreen controller (TOUCHSCREEN_CHIPONE_ICN8505) [M/n/?] m
  cy8ctma140 touchscreen (TOUCHSCREEN_CY8CTMA140) [N/m/?] n
  cy8ctmg110 touchscreen (TOUCHSCREEN_CY8CTMG110) [N/m/?] n
  Cypress TTSP touchscreen (TOUCHSCREEN_CYTTSP_CORE) [N/m/y/?] n
  Cypress TrueTouch Gen5 Touchscreen Driver (TOUCHSCREEN_CYTTSP5) [N/m/?] (NEW)
  Dynapro serial touchscreen (TOUCHSCREEN_DYNAPRO) [M/n/y/?] m
  Hampshire serial touchscreen (TOUCHSCREEN_HAMPSHIRE) [N/m/y/?] n
  EETI touchscreen panel support (TOUCHSCREEN_EETI) [M/n/?] m
  EETI eGalax serial touchscreen (TOUCHSCREEN_EGALAX_SERIAL) [M/n/y/?] m
  EETI EXC3000 multi-touch panel support (TOUCHSCREEN_EXC3000) [N/m/?] n
  Fujitsu serial touchscreen (TOUCHSCREEN_FUJITSU) [M/n/y/?] m
  Goodix I2C touchscreen (TOUCHSCREEN_GOODIX) [M/n/?] m
  Goodix Berlin I2C touchscreen (TOUCHSCREEN_GOODIX_BERLIN_I2C) [N/m/?] (NEW)
  Goodix Berlin SPI touchscreen (TOUCHSCREEN_GOODIX_BERLIN_SPI) [N/m/y/?] (NEW)
  HiDeep Touch IC (TOUCHSCREEN_HIDEEP) [N/m/?] n
  Hycon hy46xx touchscreen support (TOUCHSCREEN_HYCON_HY46XX) [N/m/?] n
  Hynitron touchscreen support (TOUCHSCREEN_HYNITRON_CSTXXX) [N/m/?] (NEW)
  Ilitek ILI210X based touchscreen (TOUCHSCREEN_ILI210X) [M/n/?] m
  Ilitek I2C 213X/23XX/25XX/Lego Series Touch ICs (TOUCHSCREEN_ILITEK) [N/m/?] n
  Samsung S6SY761 Touchscreen driver (TOUCHSCREEN_S6SY761) [N/m/?] n
  Gunze AHL-51S touchscreen (TOUCHSCREEN_GUNZE) [M/n/y/?] m
  Elan eKTF2127 I2C touchscreen (TOUCHSCREEN_EKTF2127) [N/m/?] n
  Elan eKTH I2C touchscreen (TOUCHSCREEN_ELAN) [M/n/?] m
  Elo serial touchscreens (TOUCHSCREEN_ELO) [M/n/y/?] m
  Wacom W8001 penabled serial touchscreen (TOUCHSCREEN_WACOM_W8001) [M/n/y/?] m
  Wacom Tablet support (I2C) (TOUCHSCREEN_WACOM_I2C) [M/n/?] m
  MAX11801 based touchscreens (TOUCHSCREEN_MAX11801) [N/m/?] n
  MELFAS MMS114 touchscreen (TOUCHSCREEN_MMS114) [M/n/?] m
  MELFAS MIP4 Touchscreen (TOUCHSCREEN_MELFAS_MIP4) [N/m/?] n
  MStar msg2638 touchscreen support (TOUCHSCREEN_MSG2638) [N/m/?] n
  MicroTouch serial touchscreens (TOUCHSCREEN_MTOUCH) [M/n/y/?] m
  Novatek NT11205 touchscreen support (TOUCHSCREEN_NOVATEK_NVT_TS) [N/m/?] (NEW)
  Imagis touchscreen support (TOUCHSCREEN_IMAGIS) [N/m/?] n
  iNexio serial touchscreens (TOUCHSCREEN_INEXIO) [M/n/y/?] m
  Penmount serial touchscreen (TOUCHSCREEN_PENMOUNT) [M/n/y/?] m
  EDT FocalTech FT5x06 I2C Touchscreen support (TOUCHSCREEN_EDT_FT5X06) [M/n/?] m
  Touchright serial touchscreen (TOUCHSCREEN_TOUCHRIGHT) [M/n/y/?] m
  Touchwin serial touchscreen (TOUCHSCREEN_TOUCHWIN) [M/n/y/?] m
  PIXCIR I2C touchscreens (TOUCHSCREEN_PIXCIR) [M/n/?] m
  Weida HiTech I2C touchscreen (TOUCHSCREEN_WDT87XX_I2C) [N/m/?] n
  Support for WM97xx AC97 touchscreen controllers (TOUCHSCREEN_WM97XX) [N/m/?] n
  USB Touchscreen Driver (TOUCHSCREEN_USB_COMPOSITE) [M/n/y/?] m
  Sahara TouchIT-213 touchscreen (TOUCHSCREEN_TOUCHIT213) [M/n/y/?] m
  TSC-10/25/40 serial touchscreen support (TOUCHSCREEN_TSC_SERIO) [M/n/y/?] m
  TSC2004 based touchscreens (TOUCHSCREEN_TSC2004) [N/m/?] n
  TSC2005 based touchscreens (TOUCHSCREEN_TSC2005) [N/m/y/?] n
  TSC2007 based touchscreens (TOUCHSCREEN_TSC2007) [M/n/?] m
    IIO interface for external ADC input and temperature (TOUCHSCREEN_TSC2007_IIO) [Y/n/?] y
  Raydium I2C Touchscreen (TOUCHSCREEN_RM_TS) [M/n/?] m
  Silead I2C touchscreen (TOUCHSCREEN_SILEAD) [M/n/?] m
  SiS 9200 family I2C touchscreen (TOUCHSCREEN_SIS_I2C) [M/n/?] m
  Sitronix ST1232 or ST1633 touchscreen controllers (TOUCHSCREEN_ST1232) [M/n/?] m
  STMicroelectronics STMFTS touchscreen (TOUCHSCREEN_STMFTS) [N/m/?] n
  Samsung SUR40 (Surface 2.0/PixelSense) touchscreen (TOUCHSCREEN_SUR40) [N/m/?] n
  Ntrig/Microsoft Surface 3 SPI touchscreen (TOUCHSCREEN_SURFACE3_SPI) [M/n/y/?] m
  Semtech SX8654 touchscreen (TOUCHSCREEN_SX8654) [N/m/?] n
  TPS6507x based touchscreens (TOUCHSCREEN_TPS6507X) [N/m/?] n
  Zeitec ZET6223 touchscreen driver (TOUCHSCREEN_ZET6223) [M/n/?] m
  Neonode zForce infrared touchscreens (TOUCHSCREEN_ZFORCE) [M/n/?] m
  Toradex Colibri on board touchscreen driver (TOUCHSCREEN_COLIBRI_VF50) [N/m/?] n
  ROHM BU21023/24 Dual touch support resistive touchscreens (TOUCHSCREEN_ROHM_BU21023) [N/m/?] n
  Azoteq IQS550/572/525 trackpad/touchscreen controller (TOUCHSCREEN_IQS5XX) [M/n/?] m
  Azoteq IQS7210A/7211A/E trackpad/touchscreen controller (TOUCHSCREEN_IQS7211) [N/m/?] (NEW)
  Zinitix touchscreen support (TOUCHSCREEN_ZINITIX) [N/m/?] n
  Himax hx83112b touchscreen driver (TOUCHSCREEN_HIMAX_HX83112B) [N/m/?] (NEW)
*
* Character devices
*
Enable TTY (TTY) [Y/?] y
  Virtual terminal (VT) [Y/?] y
    Support for binding and unbinding console drivers (VT_HW_CONSOLE_BINDING) [Y/?] y
  Legacy (BSD) PTY support (LEGACY_PTYS) [N/y/?] n
  Allow legacy TIOCSTI usage (LEGACY_TIOCSTI) [Y/n/?] (NEW)
  Automatically load TTY Line Disciplines (LDISC_AUTOLOAD) [Y/n/?] y
  *
  * Serial drivers
  *
  8250/16550 and compatible serial support (SERIAL_8250) [Y/m/?] y
    Support 8250_core.* kernel options (DEPRECATED) (SERIAL_8250_DEPRECATED_OPTIONS) [N/y/?] n
    Support for variants of the 16550A serial port (SERIAL_8250_16550A_VARIANTS) [N/y/?] n
    Support for Fintek variants (SERIAL_8250_FINTEK) [N/y/?] n
    Console on 8250/16550 and compatible serial port (SERIAL_8250_CONSOLE) [Y/n/?] y
  8250/16550 PCI device support (SERIAL_8250_PCI) [Y/n/m/?] y
  8250/16550 Exar/Commtech PCI/PCIe device support (SERIAL_8250_EXAR) [M/n/y/?] m
  8250/16550 PCMCIA device support (SERIAL_8250_CS) [M/n/?] m
  Maximum number of 8250/16550 serial ports (SERIAL_8250_NR_UARTS) [32] 32
  Number of 8250/16550 serial ports to register at runtime (SERIAL_8250_RUNTIME_UARTS) [32] 32
  Extended 8250/16550 serial driver options (SERIAL_8250_EXTENDED) [Y/n/?] y
    Support more than 4 legacy serial ports (SERIAL_8250_MANY_PORTS) [Y/n/?] y
  Microchip 8250 based serial port (SERIAL_8250_PCI1XXXX) [N/m/y/?] (NEW)
  Support for sharing serial interrupts (SERIAL_8250_SHARE_IRQ) [Y/n/?] y
  Autodetect IRQ on standard ports (unsafe) (SERIAL_8250_DETECT_IRQ) [N/y/?] n
  Support RSA serial ports (SERIAL_8250_RSA) [Y/n/?] y
  Support for Synopsys DesignWare 8250 quirks (SERIAL_8250_DW) [Y/n/m/?] y
  Ralink RT288x/RT305x/RT3662/RT3883 serial port support (SERIAL_8250_RT288X) [Y/n/?] y
  Support for serial ports on Intel LPSS platforms (SERIAL_8250_LPSS) [M/n/y/?] m
  Support for serial ports on Intel MID platforms (SERIAL_8250_MID) [Y/n/m/?] y
  Support for Pericom and Acces I/O serial ports (SERIAL_8250_PERICOM) [Y/n/m/?] y
  *
  * Non-8250 serial port support
  *
  Serial console over KGDB NMI debugger port (SERIAL_KGDB_NMI) [N/y/?] n
  MAX3100/3110/3111/3222 support (SERIAL_MAX3100) [N/m/y/?] n
  MAX310X support (SERIAL_MAX310X) [N/m/y/?] n
  Xilinx uartlite serial port support (SERIAL_UARTLITE) [N/m/y/?] n
  Digi International NEO and Classic PCI Support (SERIAL_JSM) [M/n/y/?] m
  Lantiq serial driver (SERIAL_LANTIQ) [N/m/y/?] n
  SCCNXP serial port support (SERIAL_SCCNXP) [N/m/y/?] n
  NXP SC16IS7xx UART support (SERIAL_SC16IS7XX) [N/m/y/?] n
  Altera JTAG UART support (SERIAL_ALTERA_JTAGUART) [N/m/y/?] n
  Altera UART support (SERIAL_ALTERA_UART) [N/m/y/?] n
  ARC UART driver support (SERIAL_ARC) [M/n/y/?] m
    Number of ARC UART ports (SERIAL_ARC_NR_PORTS) [1] 1
  Comtrol RocketPort EXPRESS/INFINITY support (SERIAL_RP2) [N/m/y/?] n
  Freescale lpuart serial port support (SERIAL_FSL_LPUART) [N/m/y/?] n
  Freescale LINFlexD UART serial port support (SERIAL_FSL_LINFLEXUART) [N/m/y/?] n
  Support for Spreadtrum serial (SERIAL_SPRD) [N/m/y/?] n
  Non-standard serial port support (SERIAL_NONSTANDARD) [Y/n/?] y
    Moxa Intellio support (MOXA_INTELLIO) [N/m/y/?] n
    Moxa SmartIO support v. 2.0 (MOXA_SMARTIO) [N/m/y/?] n
    HDLC line discipline support (N_HDLC) [M/n/y/?] m
  IPWireless 3G UMTS PCMCIA card support (IPWIRELESS) [M/n/?] m
  GSM MUX line discipline support (EXPERIMENTAL) (N_GSM) [M/n/y/?] m
  HSDPA Broadband Wireless Data Card - Globe Trotter (NOZOMI) [M/n/y/?] m
  NULL TTY driver (NULL_TTY) [M/n/y/?] m
  Xen Hypervisor Console support (HVC_XEN) [Y/n/?] y
    Xen Hypervisor Multiple Consoles support (HVC_XEN_FRONTEND) [Y/n/?] y
Parallel printer support (PRINTER) [M/n/?] m
  Support for console on line printer (LP_CONSOLE) [Y/n/?] y
Support for user-space parallel port device drivers (PPDEV) [M/n/?] m
Virtio console (VIRTIO_CONSOLE) [N/m/y/?] n
Generate a panic event to all BMCs on a panic (IPMI_PANIC_EVENT) [N/y/?] n
Device interface for IPMI (IPMI_DEVICE_INTERFACE) [M/n/?] m
IPMI System Interface handler (IPMI_SI) [M/?] m
IPMI SMBus handler (SSIF) (IPMI_SSIF) [M/n/?] m
IPMI IPMB interface (IPMI_IPMB) [N/m/?] n
IPMI Watchdog Timer (IPMI_WATCHDOG) [M/n/?] m
IPMI Poweroff (IPMI_POWEROFF) [M/n/?] m
SSIF IPMI BMC driver (SSIF_IPMI_BMC) [N/m/?] (NEW)
IPMB Interface handler (IPMB_DEVICE_INTERFACE) [N/m/?] n
Applicom intelligent fieldbus card support (APPLICOM) [N/m/y/?] n
ACP Modem (Mwave) support (MWAVE) [M/n/y/?] m
/dev/mem virtual device support (DEVMEM) [Y/n/?] y
/dev/nvram support (NVRAM) [M/y/?] m
/dev/port character device (DEVPORT) [Y/n/?] y
HPET - High Precision Event Timer (HPET) [Y/n/?] y
  Allow mmap of HPET (HPET_MMAP) [N/y/?] n
Hangcheck timer (HANGCHECK_TIMER) [M/n/y/?] m
UV_MMTIMER Memory mapped RTC for SGI UV (UV_MMTIMER) [M/n/y/?] m
*
* TPM Hardware Support
*
TPM Hardware Support (TCG_TPM) [Y/?] y
  Use HMAC and encrypted transactions on the TPM bus (TCG_TPM2_HMAC) [Y/n/?] (NEW)
  TPM HW Random Number Generator support (HW_RANDOM_TPM) [Y/n/?] y
  TPM Interface Specification 1.2 Interface / TPM 2.0 FIFO Interface (TCG_TIS) [Y/?] y
  TPM Interface Specification 1.3 Interface / TPM 2.0 FIFO Interface - (SPI) (TCG_TIS_SPI) [M/n/y/?] m
    Cr50 SPI Interface (TCG_TIS_SPI_CR50) [N/y/?] n
  TPM Interface Specification 1.3 Interface / TPM 2.0 FIFO Interface - (I2C - generic) (TCG_TIS_I2C) [N/m/?] n
  TPM Interface Specification 2.0 Interface (I2C - CR50) (TCG_TIS_I2C_CR50) [N/m/?] n
  TPM Interface Specification 1.2 Interface (I2C - Atmel) (TCG_TIS_I2C_ATMEL) [N/m/?] n
  TPM Interface Specification 1.2 Interface (I2C - Infineon) (TCG_TIS_I2C_INFINEON) [N/m/?] n
  TPM Interface Specification 1.2 Interface (I2C - Nuvoton) (TCG_TIS_I2C_NUVOTON) [N/m/?] n
  National Semiconductor TPM Interface (TCG_NSC) [M/n/y/?] m
  Atmel TPM Interface (TCG_ATMEL) [M/n/y/?] m
  Infineon Technologies TPM Interface (TCG_INFINEON) [M/n/y/?] m
  XEN TPM Interface (TCG_XEN) [N/m/y/?] n
  TPM 2.0 CRB Interface (TCG_CRB) [Y/?] y
  VTPM Proxy Interface (TCG_VTPM_PROXY) [M/n/y/?] m
  STMicroelectronics TPM Interface Specification 1.2 Interface (I2C) (TCG_TIS_ST33ZP24_I2C) [N/m/?] n
  STMicroelectronics TPM Interface Specification 1.2 Interface (SPI) (TCG_TIS_ST33ZP24_SPI) [N/m/y/?] n
Telecom clock driver for ATCA SBC (TELCLOCK) [M/n/y/?] m
Xillybus generic FPGA interface (XILLYBUS) [M/n/y/?] m
  Xillybus over PCIe (XILLYBUS_PCIE) [M/n/?] m
XillyUSB: Xillybus generic FPGA interface for USB (XILLYUSB) [N/m/y/?] n
*
* I2C Hardware Bus support
*
*
* PC SMBus host controller drivers
*
ALI 1535 (I2C_ALI1535) [N/m/?] n
ALI 1563 (I2C_ALI1563) [N/m/?] n
ALI 15x3 (I2C_ALI15X3) [N/m/?] n
AMD 756/766/768/8111 and nVidia nForce (I2C_AMD756) [M/n/?] m
  SMBus multiplexing on the Tyan S4882 (I2C_AMD756_S4882) [M/n/?] m
AMD 8111 (I2C_AMD8111) [M/n/?] m
AMD MP2 PCIe (I2C_AMD_MP2) [M/n/?] m
Intel 82801 (ICH/PCH) (I2C_I801) [M/?] m
Intel SCH SMBus 1.0 (I2C_ISCH) [M/n/?] m
Intel iSMT SMBus Controller (I2C_ISMT) [M/n/?] m
Intel PIIX4 and compatible (ATI/AMD/Serverworks/Broadcom/SMSC) (I2C_PIIX4) [M/n/?] m
Nvidia nForce2, nForce3 and nForce4 (I2C_NFORCE2) [M/n/?] m
  SMBus multiplexing on the Tyan S4985 (I2C_NFORCE2_S4985) [M/n/?] m
NVIDIA GPU I2C controller (I2C_NVIDIA_GPU) [M/n/?] m
SiS 5595 (I2C_SIS5595) [N/m/?] n
SiS 630/730/964 (I2C_SIS630) [N/m/?] n
SiS 96x (I2C_SIS96X) [M/n/?] m
VIA VT82C586B (I2C_VIA) [M/n/?] m
VIA VT82C596/82C686/82xx and CX700/VX8xx/VX900 (I2C_VIAPRO) [M/n/?] m
Zhaoxin I2C Interface (I2C_ZHAOXIN) [N/m/?] (NEW)
*
* ACPI drivers
*
SMBus Control Method Interface (I2C_SCMI) [M/n/?] m
*
* I2C system bus drivers (mostly embedded / system-on-chip)
*
CBUS I2C driver (I2C_CBUS_GPIO) [N/m/?] n
Synopsys DesignWare I2C adapter (I2C_DESIGNWARE_CORE) [M/n/?] m
  Synopsys DesignWare Slave (I2C_DESIGNWARE_SLAVE) [Y/n/?] y
  Synopsys DesignWare Platform driver (I2C_DESIGNWARE_PLATFORM) [M/n/?] m
    AMD PSP I2C semaphore support (I2C_DESIGNWARE_AMDPSP) [N/y/?] n
    Intel Baytrail I2C semaphore support (I2C_DESIGNWARE_BAYTRAIL) [Y/n/?] y
  Synopsys DesignWare PCI driver (I2C_DESIGNWARE_PCI) [M/n/?] m
EMMA Mobile series I2C adapter (I2C_EMEV2) [N/m/?] n
GPIO-based bitbanging I2C (I2C_GPIO) [N/m/?] n
OpenCores I2C Controller (I2C_OCORES) [N/m/?] n
PCA9564/PCA9665 as platform device (I2C_PCA_PLATFORM) [M/n/?] m
Simtec Generic I2C interface (I2C_SIMTEC) [M/n/?] m
Xilinx I2C Controller (I2C_XILINX) [N/m/?] n
*
* External I2C/SMBus adapter drivers
*
Diolan U2C-12 USB adapter (I2C_DIOLAN_U2C) [M/n/?] m
Silicon Labs CP2615 USB sound card and I2C adapter (I2C_CP2615) [N/m/?] n
Parallel port adapter (I2C_PARPORT) [M/n/?] m
PCI1XXXX I2C Host Adapter (I2C_PCI1XXXX) [N/m/?] n
RobotFuzz Open Source InterFace USB adapter (I2C_ROBOTFUZZ_OSIF) [N/m/?] n
TAOS evaluation module (I2C_TAOS_EVM) [N/m/?] n
Tiny-USB adapter (I2C_TINY_USB) [M/n/?] m
Viperboard I2C master support (I2C_VIPERBOARD) [M/n/?] m
*
* Other I2C/SMBus bus drivers
*
Mellanox I2C driver (I2C_MLXCPLD) [M/n/?] m
Virtio I2C Adapter (I2C_VIRTIO) [N/m/?] n
*
* SPI support
*
SPI support (SPI) [Y/n/?] y
  Debug support for SPI drivers (SPI_DEBUG) [N/y/?] n
  SPI memory extension (SPI_MEM) [N/y/?] n
  *
  * SPI Master Controller Drivers
  *
  Altera SPI Controller platform driver (SPI_ALTERA) [N/m/y/?] n
  Analog Devices AXI SPI Engine controller (SPI_AXI_SPI_ENGINE) [N/m/y/?] n
  Utilities for Bitbanging SPI host controllers (SPI_BITBANG) [N/m/y/?] n
  Parallel port adapter for AVR Butterfly (DEVELOPMENT) (SPI_BUTTERFLY) [N/m/?] n
  Cadence SPI controller (SPI_CADENCE) [N/m/y/?] n
  CH341 USB2SPI adapter (SPI_CH341) [N/m/y/?] (NEW)
  DesignWare SPI controller core support (SPI_DESIGNWARE) [N/m/y/?] n
  GPIO-based bitbanging SPI Master (SPI_GPIO) [N/m/y/?] n
  Parallel port adapter for LM70 eval board (DEVELOPMENT) (SPI_LM70_LLP) [N/m/?] n
  Microchip FPGA SPI controllers (SPI_MICROCHIP_CORE) [N/m/y/?] n
  Microchip FPGA QSPI controllers (SPI_MICROCHIP_CORE_QSPI) [N/m/y/?] n
  Lantiq SSC SPI controller (SPI_LANTIQ_SSC) [N/m/y/?] n
  OpenCores tiny SPI (SPI_OC_TINY) [N/m/y/?] n
  PCI1XXXX SPI Bus support (SPI_PCI1XXXX) [N/m/y/?] (NEW)
  PXA2xx SSP SPI master (SPI_PXA2XX) [M/n/y/?] m
  NXP SC18IS602/602B/603 I2C to SPI bridge (SPI_SC18IS602) [N/m/?] n
  SiFive SPI controller (SPI_SIFIVE) [N/m/y/?] n
  Macronix MX25F0A SPI controller (SPI_MXIC) [N/m/y/?] n
  Analog Devices AD-FMCOMMS1-EBZ SPI-I2C-bridge driver (SPI_XCOMM) [N/m/?] n
  Xilinx SPI controller common module (SPI_XILINX) [N/m/y/?] n
  AMD SPI controller (SPI_AMD) [M/n/y/?] m
  *
  * SPI Multiplexer support
  *
  SPI multiplexer support (SPI_MUX) [M/n/y/?] m
  *
  * SPI Protocol Masters
  *
  User mode SPI device driver support (SPI_SPIDEV) [M/n/y/?] m
  spi loopback test framework support (SPI_LOOPBACK_TEST) [N/m/?] n
  Infineon TLE62X0 (for power switching) (SPI_TLE62X0) [N/m/y/?] n
  SPI slave protocol handlers (SPI_SLAVE) [N/y/?] n
*
* PTP clock support
*
PTP clock support (PTP_1588_CLOCK) [Y/n/m/?] y
Driver for the National Semiconductor DP83640 PHYTER (DP83640_PHY) [M/n/?] m
ZHAW InES PTP time stamping IP core (PTP_1588_CLOCK_INES) [N/m/?] n
KVM virtual PTP clock (PTP_1588_CLOCK_KVM) [M/n/y/?] m
IDT 82P33xxx PTP clock (PTP_1588_CLOCK_IDT82P33) [M/n/?] m
IDT CLOCKMATRIX as PTP clock (PTP_1588_CLOCK_IDTCM) [M/n/?] m
RENESAS FemtoClock3 Wireless as PTP clock (PTP_1588_CLOCK_FC3W) [N/m/?] (NEW)
Mock-up PTP clock (PTP_1588_CLOCK_MOCK) [N/m/y/?] (NEW)
VMware virtual PTP clock (PTP_1588_CLOCK_VMW) [M/n/y/?] m
OpenCompute TimeCard as PTP clock (PTP_1588_CLOCK_OCP) [N/m/?] n
*
* Intel pinctrl drivers
*
Intel Baytrail GPIO pin control (PINCTRL_BAYTRAIL) [N/y/?] n
Intel Cherryview/Braswell pinctrl and GPIO driver (PINCTRL_CHERRYVIEW) [M/n/y/?] m
Intel Lynxpoint pinctrl and GPIO driver (PINCTRL_LYNXPOINT) [N/m/y/?] n
Intel pinctrl and GPIO platform driver (PINCTRL_INTEL_PLATFORM) [N/m/y/?] (NEW)
Intel Alder Lake pinctrl and GPIO driver (PINCTRL_ALDERLAKE) [N/m/y/?] n
Intel Broxton pinctrl and GPIO driver (PINCTRL_BROXTON) [M/n/y/?] m
Intel Cannon Lake PCH pinctrl and GPIO driver (PINCTRL_CANNONLAKE) [M/n/y/?] m
Intel Cedar Fork pinctrl and GPIO driver (PINCTRL_CEDARFORK) [M/n/y/?] m
Intel Denverton pinctrl and GPIO driver (PINCTRL_DENVERTON) [M/n/y/?] m
Intel Elkhart Lake SoC pinctrl and GPIO driver (PINCTRL_ELKHARTLAKE) [N/m/y/?] n
Intel Emmitsburg pinctrl and GPIO driver (PINCTRL_EMMITSBURG) [N/m/y/?] n
Intel Gemini Lake SoC pinctrl and GPIO driver (PINCTRL_GEMINILAKE) [M/n/y/?] m
Intel Ice Lake PCH pinctrl and GPIO driver (PINCTRL_ICELAKE) [M/n/y/?] m
Intel Jasper Lake PCH pinctrl and GPIO driver (PINCTRL_JASPERLAKE) [N/m/y/?] n
Intel Lakefield SoC pinctrl and GPIO driver (PINCTRL_LAKEFIELD) [N/m/y/?] n
Intel Lewisburg pinctrl and GPIO driver (PINCTRL_LEWISBURG) [M/n/y/?] m
Intel Meteor Lake pinctrl and GPIO driver (PINCTRL_METEORLAKE) [N/m/y/?] n
Intel Meteor Point pinctrl and GPIO driver (PINCTRL_METEORPOINT) [N/m/y/?] (NEW)
Intel Sunrisepoint pinctrl and GPIO driver (PINCTRL_SUNRISEPOINT) [M/n/y/?] m
Intel Tiger Lake pinctrl and GPIO driver (PINCTRL_TIGERLAKE) [M/n/y/?] m
*
* Memory mapped GPIO drivers
*
AMD Promontory GPIO support (GPIO_AMDPT) [M/n/y/?] m
Synopsys DesignWare APB GPIO driver (GPIO_DWAPB) [N/m/y/?] n
Support for GPIO pins on XR17V352/354/358 (GPIO_EXAR) [M/n/?] m
Generic memory-mapped GPIO controller support (MMIO platform device) (GPIO_GENERIC_PLATFORM) [N/m/y/?] n
Intel Granite Rapids-D vGPIO support (GPIO_GRANITERAPIDS) [N/m/y/?] (NEW)
Intel ICH GPIO (GPIO_ICH) [M/n/?] m
GPIO support for Fujitsu MB86S7x Platforms (GPIO_MB86S7X) [N/m/y/?] n
GPIO support for AMD Fusion Controller Hub (G-series SOCs) (GPIO_AMD_FCH) [M/y/?] m
*
* I2C GPIO expanders
*
FXL6408 I2C GPIO expander (GPIO_FXL6408) [N/m/?] (NEW)
DS4520 I2C GPIO expander (GPIO_DS4520) [N/m/?] (NEW)
Maxim MAX7300 GPIO expander (GPIO_MAX7300) [N/m/?] n
MAX7319, MAX7320-7327 I2C Port Expanders (GPIO_MAX732X) [N/m/?] n
PCA95[357]x, PCA9698, TCA64xx, and MAX7310 I/O ports (GPIO_PCA953X) [M/n/?] m
  Interrupt controller support for PCA953x (GPIO_PCA953X_IRQ) [N/y/?] n
PCA9570 4-Bit I2C GPO expander (GPIO_PCA9570) [N/m/?] n
PCF857x, PCA{85,96}7x, and MAX732[89] I2C GPIO expanders (GPIO_PCF857X) [N/m/?] n
TPIC2810 8-Bit I2C GPO expander (GPIO_TPIC2810) [N/m/?] n
*
* MFD GPIO expanders
*
ROHM BD9571 GPIO support (GPIO_BD9571MWV) [M/n/?] m
Intel Elkhart Lake PSE GPIO support (GPIO_ELKHARTLAKE) [N/m/y/?] (NEW)
*
* Virtual GPIO drivers
*
GPIO Aggregator (GPIO_AGGREGATOR) [N/m/y/?] n
GPIO latch driver (GPIO_LATCH) [N/m/y/?] (NEW)
GPIO Testing Driver (DEPRECATED) (GPIO_MOCKUP) [N/m/y/?] n
GPIO Simulator Module (GPIO_SIM) [N/m/y/?] n
*
* GPIO Debugging utilities
*
GPIO Virtual User Testing Module (GPIO_VIRTUSER) [N/m/y/?] (NEW)
*
* Power Sequencing support
*
Power Sequencing support (POWER_SEQUENCING) [N/m/y/?] (NEW)
*
* Power supply class support
*
Power supply class support (POWER_SUPPLY) [Y/?] y
  Power supply debug (POWER_SUPPLY_DEBUG) [N/y/?] n
  Expose power supply sensors as hwmon device (POWER_SUPPLY_HWMON) [Y/n/?] y
  Generic battery support using IIO (GENERIC_ADC_BATTERY) [N/m/?] n
  Injoinic IP5xxx power bank IC driver (IP5XXX_POWER) [N/m/?] n
  Test power driver (TEST_POWER) [N/m/y/?] n
  ADP5061 battery charger driver (CHARGER_ADP5061) [N/m/?] n
  CW2015 Battery driver (BATTERY_CW2015) [M/n/?] m
  DS2780 battery driver (BATTERY_DS2780) [N/m/y/?] n
  DS2781 battery driver (BATTERY_DS2781) [N/m/y/?] n
  DS2782/DS2786 standalone gas-gauge (BATTERY_DS2782) [N/m/?] n
  Samsung SDI batteries (BATTERY_SAMSUNG_SDI) [N/y/?] n
  SBS Compliant gas gauge (BATTERY_SBS) [N/m/?] n
  SBS Compliant charger (CHARGER_SBS) [N/m/?] n
  Smart Battery System Manager (MANAGER_SBS) [N/m/?] n
  BQ27xxx battery driver (BATTERY_BQ27XXX) [N/m/y/?] n
  AXP20x power supply driver (AXP20X_POWER) [N/m/?] n
  X-Powers AXP288 Charger (AXP288_CHARGER) [M/n/?] m
  X-Powers AXP288 Fuel Gauge (AXP288_FUEL_GAUGE) [M/n/?] m
  Maxim MAX17040/17041/17043 family Fuel Gauge (BATTERY_MAX17040) [N/m/?] n
  Maxim MAX17042/17047/17050/8997/8966 family Fuel Gauge (BATTERY_MAX17042) [M/n/?] m
  Maxim MAX17201/MAX17205 Fuel Gauge (BATTERY_MAX1720X) [N/m/?] (NEW)
  ISP1704 USB Charger Detection (CHARGER_ISP1704) [N/m/y/?] n
  MAX8903 Battery DC-DC Charger for USB and Adapter Power (CHARGER_MAX8903) [N/m/y/?] n
  TI/National Semiconductor LP8727 charger driver (CHARGER_LP8727) [N/m/?] n
  GPIO charger (CHARGER_GPIO) [N/m/y/?] n
  Battery charger manager for multiple chargers (CHARGER_MANAGER) [N/m/y/?] n
  Analog Devices LT3651 charger (CHARGER_LT3651) [M/n/y/?] m
  LTC4162-L charger (CHARGER_LTC4162L) [N/m/?] n
  Maxim MAX77976 battery charger driver (CHARGER_MAX77976) [N/m/?] n
  TI BQ2415x battery charger driver (CHARGER_BQ2415X) [N/m/?] n
  TI BQ24190 battery charger driver (CHARGER_BQ24190) [M/n/?] m
  TI BQ24250/24251/24257 battery charger driver (CHARGER_BQ24257) [N/m/?] n
  TI BQ24735 battery charger support (CHARGER_BQ24735) [N/m/?] n
  TI BQ2515X battery charger family (CHARGER_BQ2515X) [N/m/?] n
  TI BQ25890 battery charger driver (CHARGER_BQ25890) [N/m/?] n
  TI BQ25980 battery charger driver (CHARGER_BQ25980) [N/m/?] n
  TI BQ256XX battery charger driver (CHARGER_BQ256XX) [N/m/?] n
  Summit Microelectronics SMB3XX Battery Charger (CHARGER_SMB347) [M/n/?] m
  LTC2941/LTC2943 Battery Gauge Driver (BATTERY_GAUGE_LTC2941) [N/m/?] n
  Goldfish battery driver (BATTERY_GOLDFISH) [N/m/y/?] n
  RT5033 fuel gauge support (BATTERY_RT5033) [N/m/?] n
  Richtek RT9455 battery charger driver (CHARGER_RT9455) [N/m/?] n
  Richtek RT9467 Battery Charger Driver (CHARGER_RT9467) [N/m/?] (NEW)
  Richtek RT9471 battery charger driver (CHARGER_RT9471) [N/m/?] (NEW)
  ROHM bd99954 charger driver (CHARGER_BD99954) [N/m/?] n
  uPI uG3105 battery monitor driver (BATTERY_UG3105) [N/m/?] n
  Mitsumi MM8013 fuel gauge driver (FUEL_GAUGE_MM8013) [N/m/?] (NEW)
*
* Hardware Monitoring support
*
Hardware Monitoring support (HWMON) [Y/m/?] y
  Hardware Monitoring Chip debugging messages (HWMON_DEBUG_CHIP) [N/y/?] n
  *
  * Native drivers
  *
  Abit uGuru (rev 1 & 2) (SENSORS_ABITUGURU) [M/n/y/?] m
  Abit uGuru (rev 3) (SENSORS_ABITUGURU3) [M/n/y/?] m
  Analog Devices AD7314 and compatibles (SENSORS_AD7314) [M/n/y/?] m
  Analog Devices AD7414 (SENSORS_AD7414) [M/n/?] m
  Analog Devices AD7416, AD7417 and AD7418 (SENSORS_AD7418) [M/n/?] m
  Analog Devices ADM1025 and compatibles (SENSORS_ADM1025) [M/n/?] m
  Analog Devices ADM1026 and compatibles (SENSORS_ADM1026) [M/n/?] m
  Analog Devices ADM1029 (SENSORS_ADM1029) [M/n/?] m
  Analog Devices ADM1031 and compatibles (SENSORS_ADM1031) [M/n/?] m
  Analog Devices ADM1177 and compatibles (SENSORS_ADM1177) [N/m/?] n
  Analog Devices ADM9240 and compatibles (SENSORS_ADM9240) [M/n/?] m
  Analog Devices ADT7310/ADT7320 (SENSORS_ADT7310) [M/n/y/?] m
  Analog Devices ADT7410/ADT7420 (SENSORS_ADT7410) [M/n/?] m
  Analog Devices ADT7411 (SENSORS_ADT7411) [M/n/?] m
  Analog Devices ADT7462 (SENSORS_ADT7462) [M/n/?] m
  Analog Devices ADT7470 (SENSORS_ADT7470) [M/n/?] m
  Analog Devices ADT7473, ADT7475, ADT7476 and ADT7490 (SENSORS_ADT7475) [M/n/?] m
  Aosong AHT10, AHT20 (SENSORS_AHT10) [N/m/?] n
  Aquacomputer D5 Next, Octo, Quadro, Farbwerk, Farbwerk 360, High Flow Next (SENSORS_AQUACOMPUTER_D5NEXT) [N/m/y/?] n
  Synaptics AS370 SoC hardware monitoring driver (SENSORS_AS370) [N/m/y/?] n
  Andigilog aSC7621 (SENSORS_ASC7621) [M/n/?] m
  ASUS ROG RYUJIN II 360 hardware monitoring driver (SENSORS_ASUS_ROG_RYUJIN) [N/m/y/?] (NEW)
  Analog Devices FAN Control HDL Core driver (SENSORS_AXI_FAN_CONTROL) [M/n/y/?] m
  AMD Athlon64/FX or Opteron temperature sensor (SENSORS_K8TEMP) [M/n/y/?] m
  AMD Family 10h+ temperature sensor (SENSORS_K10TEMP) [M/n/y/?] m
  AMD Family 15h processor power (SENSORS_FAM15H_POWER) [M/n/y/?] m
  Apple SMC (Motion sensor, light sensor, keyboard backlight) (SENSORS_APPLESMC) [M/n/y/?] m
  Asus ASB100 Bach (SENSORS_ASB100) [M/n/?] m
  Attansic ATXP1 VID controller (SENSORS_ATXP1) [M/n/?] m
  Amphenol ChipCap 2 relative humidity and temperature sensor (SENSORS_CHIPCAP2) [N/m/?] (NEW)
  Corsair Commander Pro controller (SENSORS_CORSAIR_CPRO) [N/m/y/?] n
  Corsair PSU HID controller (SENSORS_CORSAIR_PSU) [M/n/y/?] m
  Hard disk drives with temperature sensors (SENSORS_DRIVETEMP) [M/n/y/?] m
  Dallas Semiconductor DS620 (SENSORS_DS620) [M/n/?] m
  Dallas Semiconductor DS1621 and compatibles (SENSORS_DS1621) [M/n/?] m
  Dell laptop SMM BIOS hwmon driver (SENSORS_DELL_SMM) [M/n/?] m
    Legacy /proc/i8k interface of Dell laptop SMM BIOS hwmon driver (I8K) [N/y/?] n
  FB-DIMM AMB temperature sensor on Intel 5000 series chipsets (SENSORS_I5K_AMB) [M/n/y/?] m
  Fintek F71805F/FG, F71806F/FG and F71872F/FG (SENSORS_F71805F) [M/n/y/?] m
  Fintek F71882FG and compatibles (SENSORS_F71882FG) [M/n/y/?] m
  Fintek F75375S/SP, F75373 and F75387 (SENSORS_F75375S) [M/n/?] m
  Fujitsu Siemens Computers sensor chips (SENSORS_FSCHMD) [M/n/?] m
  Fujitsu Technology Solutions sensor chip Teutates (SENSORS_FTSTEUTATES) [M/n/?] m
  Gigabyte Waterforce X240/X280/X360 AIO CPU coolers (SENSORS_GIGABYTE_WATERFORCE) [N/m/y/?] (NEW)
  Genesys Logic GL518SM (SENSORS_GL518SM) [M/n/?] m
  Genesys Logic GL520SM (SENSORS_GL520SM) [M/n/?] m
  GMT G760A (SENSORS_G760A) [M/n/?] m
  GMT G762 and G763 (SENSORS_G762) [M/n/?] m
  Honeywell Humidicon HIH-6130 humidity/temperature sensor (SENSORS_HIH6130) [N/m/?] n
  Renesas HS3001 humidity and temperature sensors (SENSORS_HS3001) [N/m/?] (NEW)
  IBM Active Energy Manager temperature/power sensors and control (SENSORS_IBMAEM) [M/n/?] m
  IBM PowerExecutive temperature/power sensors (SENSORS_IBMPEX) [M/n/?] m
  Hwmon driver that uses channels specified via iio maps (SENSORS_IIO_HWMON) [N/m/?] n
  Intel 5500/5520/X58 temperature sensor (SENSORS_I5500) [M/n/y/?] m
  Intel Core/Core2/Atom temperature sensor (SENSORS_CORETEMP) [M/n/y/?] m
  ITE IT87xx and compatibles (SENSORS_IT87) [M/n/y/?] m
  JEDEC JC42.4 compliant memory module temperature sensors (SENSORS_JC42) [M/n/?] m
  ChargerLAB POWER-Z USB-C tester (SENSORS_POWERZ) [N/m/y/?] (NEW)
  Lattice POWR1220 Power Monitoring (SENSORS_POWR1220) [M/n/?] m
  Sensor reader for Lenovo ThinkStations (SENSORS_LENOVO_EC) [N/m/y/?] (NEW)
  Lineage Compact Power Line Power Entry Module (SENSORS_LINEAGE) [M/n/?] m
  Linear Technology LTC2945 (SENSORS_LTC2945) [M/n/?] m
  Analog Devices LTC2947 High Precision Power and Energy Monitor over I2C (SENSORS_LTC2947_I2C) [N/m/?] n
  Analog Devices LTC2947 High Precision Power and Energy Monitor over SPI (SENSORS_LTC2947_SPI) [N/m/y/?] n
  Linear Technology LTC2990 (SENSORS_LTC2990) [M/n/?] m
  Analog Devices LTC2991 (SENSORS_LTC2991) [N/m/?] (NEW)
  Linear Technology LTC2992 (SENSORS_LTC2992) [N/m/?] n
  Linear Technology LTC4151 (SENSORS_LTC4151) [M/n/?] m
  Linear Technology LTC4215 (SENSORS_LTC4215) [M/n/?] m
  Linear Technology LTC4222 (SENSORS_LTC4222) [M/n/?] m
  Linear Technology LTC4245 (SENSORS_LTC4245) [M/n/?] m
  Linear Technology LTC4260 (SENSORS_LTC4260) [M/n/?] m
  Linear Technology LTC4261 (SENSORS_LTC4261) [M/n/?] m
  Analog Devices LTC4282 (SENSORS_LTC4282) [N/m/?] (NEW)
  Maxim MAX1111 Serial 8-bit ADC chip and compatibles (SENSORS_MAX1111) [M/n/y/?] m
  Maxim MAX127 12-bit 8-channel Data Acquisition System (SENSORS_MAX127) [N/m/?] n
  Maxim MAX16065 System Manager and compatibles (SENSORS_MAX16065) [M/n/?] m
  Maxim MAX1619 sensor chip (SENSORS_MAX1619) [M/n/?] m
  Maxim MAX1668 and compatibles (SENSORS_MAX1668) [M/n/?] m
  Maxim MAX197 and compatibles (SENSORS_MAX197) [M/n/y/?] m
  MAX31722 temperature sensor (SENSORS_MAX31722) [M/n/y/?] m
  MAX31730 temperature sensor (SENSORS_MAX31730) [N/m/?] n
  MAX31760 fan speed controller (SENSORS_MAX31760) [N/m/?] n
  MAX31827 low-power temperature switch and similar devices (MAX31827) [N/m/?] (NEW)
  Maxim MAX6620 fan controller (SENSORS_MAX6620) [N/m/?] n
  Maxim MAX6621 sensor chip (SENSORS_MAX6621) [N/m/?] n
  Maxim MAX6639 sensor chip (SENSORS_MAX6639) [M/n/?] m
  Maxim MAX6650 sensor chip (SENSORS_MAX6650) [M/n/?] m
  Maxim MAX6697 and compatibles (SENSORS_MAX6697) [M/n/?] m
  Maxim MAX31790 sensor chip (SENSORS_MAX31790) [M/n/?] m
  NXP MC34VR500 hardware monitoring driver (SENSORS_MC34VR500) [N/m/?] (NEW)
  Microchip MCP3021 and compatibles (SENSORS_MCP3021) [M/n/?] m
  Microchip TC654/TC655 and compatibles (SENSORS_TC654) [M/n/?] m
  Texas Instruments TPS23861 PoE PSE (SENSORS_TPS23861) [N/m/?] n
  Moortec Semiconductor MR75203 PVT Controller (SENSORS_MR75203) [N/m/y/?] n
  National Semiconductor ADCxxxSxxx (SENSORS_ADCXX) [M/n/y/?] m
  National Semiconductor LM63 and compatibles (SENSORS_LM63) [M/n/?] m
  National Semiconductor LM70 and compatibles (SENSORS_LM70) [M/n/y/?] m
  National Semiconductor LM73 (SENSORS_LM73) [M/n/?] m
  National Semiconductor LM75 and compatibles (SENSORS_LM75) [M/n/?] m
  National Semiconductor LM77 (SENSORS_LM77) [M/n/?] m
  National Semiconductor LM78 and compatibles (SENSORS_LM78) [M/n/?] m
  National Semiconductor LM80 and LM96080 (SENSORS_LM80) [M/n/?] m
  National Semiconductor LM83 and compatibles (SENSORS_LM83) [M/n/?] m
  National Semiconductor LM85 and compatibles (SENSORS_LM85) [M/n/?] m
  National Semiconductor LM87 and compatibles (SENSORS_LM87) [M/n/?] m
  National Semiconductor LM90 and compatibles (SENSORS_LM90) [M/n/?] m
  National Semiconductor LM92 and compatibles (SENSORS_LM92) [M/n/?] m
  National Semiconductor LM93 and compatibles (SENSORS_LM93) [M/n/?] m
  National Semiconductor LM95234 and compatibles (SENSORS_LM95234) [M/n/?] m
  National Semiconductor LM95241 and compatibles (SENSORS_LM95241) [M/n/?] m
  National Semiconductor LM95245 and compatibles (SENSORS_LM95245) [M/n/?] m
  National Semiconductor PC87360 family (SENSORS_PC87360) [M/n/y/?] m
  National Semiconductor PC87427 (SENSORS_PC87427) [M/n/y/?] m
  NTC thermistor support (SENSORS_NTC_THERMISTOR) [M/n/?] m
  Nuvoton NCT6683D (SENSORS_NCT6683) [M/n/y/?] m
  Platform driver for Nuvoton NCT6775F and compatibles (SENSORS_NCT6775) [M/n/y/?] m
  I2C driver for Nuvoton NCT6775F and compatibles (SENSORS_NCT6775_I2C) [N/m/?] n
  Nuvoton NCT7802Y (SENSORS_NCT7802) [M/n/?] m
  Nuvoton NCT7904 (SENSORS_NCT7904) [M/n/?] m
  Nuvoton NPCM750 and compatible PWM and Fan controllers (SENSORS_NPCM7XX) [M/n/y/?] m
  NZXT Kraken X42/X51/X62/X72 liquid coolers (SENSORS_NZXT_KRAKEN2) [N/m/y/?] n
  NZXT Kraken X53/X63/X73, Z53/Z63/Z73 coolers (SENSORS_NZXT_KRAKEN3) [N/m/y/?] (NEW)
  NZXT RGB & Fan Controller/Smart Device v2 (SENSORS_NZXT_SMART2) [N/m/y/?] n
  POWER8 OCC through I2C (SENSORS_OCC_P8_I2C) [N/m/?] (NEW)
  OneXPlayer EC fan control (SENSORS_OXP) [N/m/y/?] (NEW)
  Philips PCF8591 ADC/DAC (SENSORS_PCF8591) [M/n/?] m
  *
  * PMBus support
  *
  PMBus support (PMBUS) [M/n/?] m
    Generic PMBus devices (SENSORS_PMBUS) [M/n/?] m
    ACBEL FSG032 Power Supply (SENSORS_ACBEL_FSG032) [N/m/?] (NEW)
    Analog Devices ADM1266 Sequencer (SENSORS_ADM1266) [N/m/?] n
    Analog Devices ADM1275 and compatibles (SENSORS_ADM1275) [M/n/?] m
    Analog Devices ADP1050 digital controller for Power Supplies (SENSORS_ADP1050) [N/m/?] (NEW)
    Bel PFE Compatible Power Supplies (SENSORS_BEL_PFE) [N/m/?] n
    BluTek BPA-RS600 Power Supplies (SENSORS_BPA_RS600) [N/m/?] n
    Delta AHE-50DC fan control module (SENSORS_DELTA_AHE50DC_FAN) [N/m/?] n
    FSP/3Y-Power power supplies (SENSORS_FSP_3Y) [N/m/?] n
    IBM Common Form Factor Power Supply (SENSORS_IBM_CFFPS) [N/m/?] n
    Delta DPS920AB Power Supply (SENSORS_DPS920AB) [N/m/?] n
    INSPUR Power System Power Supply (SENSORS_INSPUR_IPSPS) [N/m/?] n
    Infineon IR35221 (SENSORS_IR35221) [N/m/?] n
    Infineon IR36021 (SENSORS_IR36021) [N/m/?] n
    Infineon IR38064 and compatibles (SENSORS_IR38064) [N/m/?] n
    Infineon IRPS5401 (SENSORS_IRPS5401) [N/m/?] n
    Renesas Digital Multiphase Voltage Regulators (SENSORS_ISL68137) [N/m/?] n
    National Semiconductor LM25066 and compatibles (SENSORS_LM25066) [M/n/?] m
      Regulator support for LM25066 and compatibles (SENSORS_LM25066_REGULATOR) [N/y/?] n
    Analog Devices LT7182S (SENSORS_LT7182S) [N/m/?] n
    Linear Technologies LTC2978 and compatibles (SENSORS_LTC2978) [M/n/?] m
      Regulator support for LTC2978 and compatibles (SENSORS_LTC2978_REGULATOR) [N/y/?] n
    Linear Technologies LTC3815 (SENSORS_LTC3815) [M/n/?] m
    Analog Devices LTC4286 (SENSORS_LTC4286) [N/y/?] (NEW)
    Maxim MAX15301 (SENSORS_MAX15301) [N/m/?] n
    Maxim MAX16064 (SENSORS_MAX16064) [M/n/?] m
    Maxim MAX16508, MAX16600, MAX16601, and MAX16602 (SENSORS_MAX16601) [N/m/?] n
    Maxim MAX20710, MAX20730, MAX20734, MAX20743 (SENSORS_MAX20730) [N/m/?] n
    Maxim MAX20751 (SENSORS_MAX20751) [M/n/?] m
    Maxim MAX31785 and compatibles (SENSORS_MAX31785) [N/m/?] n
    Maxim MAX34440 and compatibles (SENSORS_MAX34440) [M/n/?] m
    Maxim MAX8688 (SENSORS_MAX8688) [M/n/?] m
    MPS MP2856 (SENSORS_MP2856) [N/m/?] (NEW)
    MPS MP2888 (SENSORS_MP2888) [N/m/?] n
    MPS MP2891 (SENSORS_MP2891) [N/m/?] (NEW)
    MPS MP2975 (SENSORS_MP2975) [N/m/?] n
    MPS MP2993 (SENSORS_MP2993) [N/m/?] (NEW)
    MPS MP5023 (SENSORS_MP5023) [N/m/?] n
    MPS MP5920 (SENSORS_MP5920) [N/m/?] (NEW)
    MPS MP5990 (SENSORS_MP5990) [N/m/?] (NEW)
    MPS MP9941 (SENSORS_MP9941) [N/m/?] (NEW)
    MPS MPQ7932 (SENSORS_MPQ7932) [N/m/?] (NEW)
    MPS MPQ8785 (SENSORS_MPQ8785) [N/m/?] (NEW)
    Flex PIM4328 and compatibles (SENSORS_PIM4328) [N/m/?] n
    Vicor PLI1209BC (SENSORS_PLI1209BC) [N/m/?] n
    ST PM6764TR (SENSORS_PM6764TR) [N/m/?] n
    Infineon PXE1610 (SENSORS_PXE1610) [N/m/?] n
    Delta Power Supplies Q54SJ108A2 (SENSORS_Q54SJ108A2) [N/m/?] n
    ST STPDDC60 (SENSORS_STPDDC60) [N/m/?] n
    Infineon TDA38640 (SENSORS_TDA38640) [N/m/?] (NEW)
    TI TPS40422 (SENSORS_TPS40422) [M/n/?] m
    TI TPS53647, TPS53667, TPS53676, TPS53679, TPS53681, TPS53688 (SENSORS_TPS53679) [M/n/?] m
    TPS546D24 (SENSORS_TPS546D24) [N/m/?] n
    TI UCD90120, UCD90124, UCD90160, UCD90320, UCD9090, UCD90910 (SENSORS_UCD9000) [M/n/?] m
    TI UCD9220, UCD9222, UCD9224, UCD9240, UCD9244, UCD9246, UCD9248 (SENSORS_UCD9200) [M/n/?] m
    Infineon XDP710 family (SENSORS_XDP710) [N/m/?] (NEW)
    Infineon XDPE152 family (SENSORS_XDPE152) [N/m/?] n
    Infineon XDPE122 family (SENSORS_XDPE122) [N/m/?] n
    Intersil ZL6100 and compatibles (SENSORS_ZL6100) [M/n/?] m
  Astera Labs PT5161L PCIe retimer hardware monitoring (SENSORS_PT5161L) [N/m/?] (NEW)
  PWM fan (SENSORS_PWM_FAN) [N/m/y/?] (NEW)
  Emulated SB-TSI temperature sensor (SENSORS_SBTSI) [N/m/?] n
  Emulated SB-RMI sensor (SENSORS_SBRMI) [N/m/?] n
  Sensiron humidity and temperature sensors. SHT15 and compat. (SENSORS_SHT15) [M/n/y/?] m
  Sensiron humidity and temperature sensors. SHT21 and compat. (SENSORS_SHT21) [M/n/?] m
  Sensiron humidity and temperature sensors. SHT3x and compat. (SENSORS_SHT3x) [M/n/?] m
  Sensiron humidity and temperature sensors. SHT4x and compat. (SENSORS_SHT4x) [N/m/?] n
  Sensiron humidity and temperature sensors. SHTC1 and compat. (SENSORS_SHTC1) [M/n/?] m
  Silicon Integrated Systems Corp. SiS5595 (SENSORS_SIS5595) [M/n/y/?] m
  SMSC DME1737, SCH311x and compatibles (SENSORS_DME1737) [M/n/?] m
  SMSC EMC1403/23 thermal sensor (SENSORS_EMC1403) [M/n/?] m
  SMSC EMC2103 (SENSORS_EMC2103) [N/m/?] n
  Microchip EMC2305 and compatible EMC2301/2/3 (SENSORS_EMC2305) [N/m/?] n
  SMSC EMC6W201 (SENSORS_EMC6W201) [M/n/?] m
  SMSC LPC47M10x and compatibles (SENSORS_SMSC47M1) [M/n/y/?] m
  SMSC LPC47M192 and compatibles (SENSORS_SMSC47M192) [M/n/?] m
  SMSC LPC47B397-NC (SENSORS_SMSC47B397) [M/n/y/?] m
  SMSC SCH5627 (SENSORS_SCH5627) [M/n/y/?] m
  SMSC SCH5636 (SENSORS_SCH5636) [M/n/y/?] m
  ST Microelectronics STTS751 (SENSORS_STTS751) [N/m/?] n
  Texas Instruments ADC128D818 (SENSORS_ADC128D818) [M/n/?] m
  Texas Instruments ADS7828 and compatibles (SENSORS_ADS7828) [M/n/?] m
  Texas Instruments ADS7871 A/D converter (SENSORS_ADS7871) [M/n/y/?] m
  Texas Instruments AMC6821 (SENSORS_AMC6821) [M/n/?] m
  TI / Burr Brown INA209 (SENSORS_INA209) [M/n/?] m
  Texas Instruments INA219 and compatibles (SENSORS_INA2XX) [M/n/?] m
  Texas Instruments INA238 (SENSORS_INA238) [N/m/?] n
  Texas Instruments INA3221 Triple Power Monitor (SENSORS_INA3221) [M/n/?] m
  SPD5118 Compliant Temperature Sensors (SENSORS_SPD5118) [N/m/?] (NEW)
  Microchip TC74 (SENSORS_TC74) [M/n/?] m
  Texas Instruments THMC50 / Analog Devices ADM1022 (SENSORS_THMC50) [M/n/?] m
  Texas Instruments TMP102 (SENSORS_TMP102) [M/n/?] m
  Texas Instruments TMP103 (SENSORS_TMP103) [M/n/?] m
  Texas Instruments TMP108 (SENSORS_TMP108) [M/n/?] m
  Texas Instruments TMP401 and compatibles (SENSORS_TMP401) [M/n/?] m
  Texas Instruments TMP421 and compatible (SENSORS_TMP421) [M/n/?] m
  Texas Instruments TMP464 and compatible (SENSORS_TMP464) [N/m/?] n
  Texas Instruments TMP513 and compatibles (SENSORS_TMP513) [N/m/?] n
  VIA CPU temperature sensor (SENSORS_VIA_CPUTEMP) [M/n/y/?] m
  VIA686A (SENSORS_VIA686A) [M/n/y/?] m
  VIA VT1211 (SENSORS_VT1211) [M/n/y/?] m
  VIA VT8231 (SENSORS_VT8231) [M/n/y/?] m
  Nuvoton W83773G (SENSORS_W83773G) [M/n/?] m
  Winbond W83781D, W83782D, W83783S, Asus AS99127F (SENSORS_W83781D) [M/n/?] m
  Winbond W83791D (SENSORS_W83791D) [M/n/?] m
  Winbond W83792D (SENSORS_W83792D) [M/n/?] m
  Winbond W83793 (SENSORS_W83793) [M/n/?] m
  Winbond/Nuvoton W83795G/ADG (SENSORS_W83795) [M/n/?] m
    Include automatic fan control support (SENSORS_W83795_FANCTRL) [N/y/?] n
  Winbond W83L785TS-S (SENSORS_W83L785TS) [M/n/?] m
  Winbond W83L786NG, W83L786NR (SENSORS_W83L786NG) [M/n/?] m
  Winbond W83627HF, W83627THF, W83637HF, W83687THF, W83697HF (SENSORS_W83627HF) [M/n/y/?] m
  Winbond W83627EHF/EHG/DHG/UHG, W83667HG (SENSORS_W83627EHF) [M/n/y/?] m
  APM X-Gene SoC hardware monitoring driver (SENSORS_XGENE) [N/m/y/?] n
  *
  * ACPI drivers
  *
  ACPI 4.0 power meter (SENSORS_ACPI_POWER) [M/n/y/?] m
  ASUS ATK0110 (SENSORS_ATK0110) [M/n/y/?] m
  ASUS WMI X370/X470/B450/X399 (SENSORS_ASUS_WMI) [N/m/?] n
  ASUS EC Sensors (SENSORS_ASUS_EC) [N/m/y/?] n
  HP WMI Sensors (SENSORS_HP_WMI) [N/m/?] (NEW)
*
* Thermal drivers
*
Thermal drivers (THERMAL) [Y/?] y
  Thermal netlink management (THERMAL_NETLINK) [N/y/?] n
  Thermal state transition statistics (THERMAL_STATISTICS) [Y/n/?] y
  Thermal subsystem debug support (THERMAL_DEBUGFS) [N/y/?] (NEW)
  Thermal core testing facility (THERMAL_CORE_TESTING) [N/m/y/?] (NEW)
  Emergency poweroff delay in milli-seconds (THERMAL_EMERGENCY_POWEROFF_DELAY_MS) [0] 0
  Expose thermal sensors as hwmon device (THERMAL_HWMON) [Y/n/?] y
  Default Thermal governor
  > 1. step_wise (THERMAL_DEFAULT_GOV_STEP_WISE)
    2. fair_share (THERMAL_DEFAULT_GOV_FAIR_SHARE)
    3. user_space (THERMAL_DEFAULT_GOV_USER_SPACE)
    4. power_allocator (THERMAL_DEFAULT_GOV_POWER_ALLOCATOR)
    5. bang_bang (THERMAL_DEFAULT_GOV_BANG_BANG) (NEW)
  choice[1-5?]:
  Fair-share thermal governor (THERMAL_GOV_FAIR_SHARE) [Y/n/?] y
  Step_wise thermal governor (THERMAL_GOV_STEP_WISE) [Y/?] y
  Bang Bang thermal governor (THERMAL_GOV_BANG_BANG) [Y/?] y
  User_space thermal governor (THERMAL_GOV_USER_SPACE) [Y/?] y
  Power allocator thermal governor (THERMAL_GOV_POWER_ALLOCATOR) [Y/n/?] y
  Generic device cooling support (DEVFREQ_THERMAL) [Y/n/?] y
  Thermal emulation mode support (THERMAL_EMULATION) [N/y/?] n
  Generic ADC based thermal sensor (GENERIC_ADC_THERMAL) [N/m/?] n
*
* Watchdog Timer Support
*
Watchdog Timer Support (WATCHDOG) [Y/n/?] y
  WatchDog Timer Driver Core (WATCHDOG_CORE) [Y/m/?] y
  Disable watchdog shutdown on close (WATCHDOG_NOWAYOUT) [N/y/?] n
  Update boot-enabled watchdog until userspace takes over (WATCHDOG_HANDLE_BOOT_ENABLED) [Y/n/?] y
  Timeout value for opening watchdog device (WATCHDOG_OPEN_TIMEOUT) [0] 0
  Read different watchdog information through sysfs (WATCHDOG_SYSFS) [Y/n/?] y
  Enable watchdog hrtimer-based pretimeouts (WATCHDOG_HRTIMER_PRETIMEOUT) [N/y/?] n
  *
  * Watchdog Pretimeout Governors
  *
  Enable watchdog pretimeout governors (WATCHDOG_PRETIMEOUT_GOV) [N/y/?] n
  *
  * Watchdog Device Drivers
  *
  Software watchdog (SOFT_WATCHDOG) [M/n/y/?] m
  Lenovo SE10 Watchdog (LENOVO_SE10_WDT) [N/m/y/?] (NEW)
  ACPI Watchdog Action Table (WDAT) (WDAT_WDT) [M/n/y/?] m
  Xilinx Watchdog timer (XILINX_WATCHDOG) [N/m/y/?] n
  Zodiac RAVE Watchdog Timer (ZIIRAVE_WATCHDOG) [N/m/?] n
  Cadence Watchdog Timer (CADENCE_WATCHDOG) [N/m/y/?] n
  Synopsys DesignWare watchdog (DW_WATCHDOG) [N/m/y/?] n
  Max63xx watchdog (MAX63XX_WATCHDOG) [N/m/y/?] n
  Acquire SBC Watchdog Timer (ACQUIRE_WDT) [N/m/y/?] n
  Advantech SBC Watchdog Timer (ADVANTECH_WDT) [N/m/y/?] n
  Advantech Embedded Controller Watchdog Timer (ADVANTECH_EC_WDT) [N/m/y/?] (NEW)
  ALi M1535 PMU Watchdog Timer (ALIM1535_WDT) [M/n/y/?] m
  ALi M7101 PMU Computer Watchdog (ALIM7101_WDT) [M/n/y/?] m
  WinSystems EBC-C384 Watchdog Timer (EBC_C384_WDT) [N/m/y/?] n
  Exar Watchdog Timer (EXAR_WDT) [N/m/y/?] n
  Fintek F718xx, F818xx Super I/O Watchdog (F71808E_WDT) [M/n/y/?] m
  AMD/ATI SP5100 TCO Timer/Watchdog (SP5100_TCO) [M/n/y/?] m
  Compulab SBC-FITPC2 watchdog (SBC_FITPC2_WATCHDOG) [M/n/y/?] m
  Eurotech CPU-1220/1410 Watchdog Timer (EUROTECH_WDT) [N/m/y/?] n
  IB700 SBC Watchdog Timer (IB700_WDT) [M/n/y/?] m
  IBM Automatic Server Restart (IBMASR) [M/n/y/?] m
  ICP Single Board Computer Watchdog Timer (WAFER_WDT) [N/m/y/?] n
  Intel 6300ESB Timer/Watchdog (I6300ESB_WDT) [M/n/y/?] m
  Intel Atom E6xx Watchdog (IE6XX_WDT) [M/n/y/?] m
  Intel TCO Timer/Watchdog (ITCO_WDT) [M/n/?] m
    Intel TCO Timer/Watchdog Specific Vendor Support (ITCO_VENDOR_SUPPORT) [Y/n/?] y
  IT8712F (Smart Guardian) Watchdog Timer (IT8712F_WDT) [M/n/y/?] m
  IT87 Watchdog Timer (IT87_WDT) [M/n/y/?] m
  HP ProLiant iLO2+ Hardware Watchdog Timer (HP_WATCHDOG) [M/n/y/?] m
    NMI support for the HP ProLiant iLO2+ Hardware Watchdog Timer (HPWDT_NMI_DECODING) [Y/n/?] y
  National Semiconductor PC87307/PC97307 (ala SC1200) Watchdog (SC1200_WDT) [N/m/y/?] n
  NS PC87413 watchdog (PC87413_WDT) [N/m/y/?] n
  nVidia TCO Timer/Watchdog (NV_TCO) [M/n/y/?] m
  SBC-60XX Watchdog Timer (60XX_WDT) [N/m/y/?] n
  SMA CPU5 Watchdog (CPU5_WDT) [N/m/y/?] n
  SMSC SCH311X Watchdog Timer (SMSC_SCH311X_WDT) [M/n/y/?] m
  Winbond SMsC37B787 Watchdog Timer (SMSC37B787_WDT) [N/m/y/?] n
  TQ-Systems TQMX86 Watchdog Timer (TQMX86_WDT) [M/n/y/?] m
  VIA Watchdog Timer (VIA_WDT) [M/n/y/?] m
  Watchdog timer for W83627HF/W83627DHG and compatibles (W83627HF_WDT) [M/n/y/?] m
  W83877F (EMACS) Watchdog Timer (W83877F_WDT) [M/n/y/?] m
  W83977F (PCM-5335) Watchdog Timer (W83977F_WDT) [M/n/y/?] m
  ZF MachZ Watchdog (MACHZ_WDT) [M/n/y/?] m
  Winsystems SBC EPX-C3 watchdog (SBC_EPX_C3_WATCHDOG) [N/m/y/?] n
  Intel MEI iAMT Watchdog (INTEL_MEI_WDT) [M/n/?] m
  NI 903x/913x Watchdog (NI903X_WDT) [N/m/y/?] n
  NIC7018 Watchdog (NIC7018_WDT) [M/n/y/?] m
  MEN A21 VME CPU Carrier Board Watchdog Timer (MEN_A21_WDT) [N/m/y/?] n
  Xen Watchdog support (XEN_WDT) [M/n/y/?] m
  *
  * PCI-based Watchdog Cards
  *
  Berkshire Products PCI-PC Watchdog (PCIPCWATCHDOG) [M/n/y/?] m
  PCI-WDT500/501 Watchdog timer (WDTPCI) [M/n/y/?] m
  *
  * USB-based Watchdog Cards
  *
  Berkshire Products USB-PC Watchdog (USBPCWATCHDOG) [M/n/y/?] m
*
* Multifunction device drivers
*
Ampere Computing SMpro core driver (MFD_SMPRO) [N/m/?] (NEW)
Broadcom BCM590xx PMUs (MFD_BCM590XX) [N/m/?] n
ROHM BD9571MWV PMIC (MFD_BD9571MWV) [M/n/?] m
X-Powers AXP series PMICs with I2C (MFD_AXP20X_I2C) [M/n/?] m
Cirrus Logic CS42L43 (I2C) (MFD_CS42L43_I2C) [N/m/?] (NEW)
Cirrus Logic CS42L43 (SoundWire) (MFD_CS42L43_SDW) [N/m/?] (NEW)
Cirrus Logic Madera codecs (MFD_MADERA) [N/m/y/?] n
Dialog Semiconductor DA9052/53 PMIC variants with SPI (MFD_DA9052_SPI) [N/y/?] n
Dialog Semiconductor DA9062/61 PMIC Support (MFD_DA9062) [N/m/?] n
Dialog Semiconductor DA9063 PMIC Support (MFD_DA9063) [N/m/?] n
Dialog Semiconductor DA9150 Charger Fuel-Gauge chip (MFD_DA9150) [N/m/?] n
Diolan DLN2 support (MFD_DLN2) [N/m/y/?] n
Freescale MC13783 and MC13892 SPI interface (MFD_MC13XXX_SPI) [N/m/y/?] n
Freescale MC13892 I2C interface (MFD_MC13XXX_I2C) [N/m/?] n
Monolithic Power Systems MP2629 ADC and Battery charger (MFD_MP2629) [N/m/?] n
Intel Quark MFD I2C GPIO (MFD_INTEL_QUARK_I2C_GPIO) [N/m/y/?] n
Intel ICH LPC (LPC_ICH) [M/y/?] m
Intel SCH LPC (LPC_SCH) [M/y/?] m
Intel Low Power Subsystem support in ACPI mode (MFD_INTEL_LPSS_ACPI) [M/n/y/?] m
Intel Low Power Subsystem support in PCI mode (MFD_INTEL_LPSS_PCI) [M/n/y/?] m
Intel PMC Driver for Broxton (MFD_INTEL_PMC_BXT) [N/m/y/?] n
Azoteq IQS620A/621/622/624/625 core support (MFD_IQS62X) [N/m/?] n
Janz CMOD-IO PCI MODULbus Carrier Board (MFD_JANZ_CMODIO) [N/m/y/?] n
Kontron module PLD device (MFD_KEMPLD) [N/m/y/?] n
Marvell 88PM800 (MFD_88PM800) [N/m/?] n
Marvell 88PM805 (MFD_88PM805) [N/m/?] n
Maxim Semiconductor MAX14577/77836 MUIC + Charger Support (MFD_MAX14577) [N/m/?] n
Maxim Semiconductor MAX77693 PMIC Support (MFD_MAX77693) [N/m/?] n
Maxim Semiconductor MAX8907 PMIC Support (MFD_MAX8907) [N/m/?] n
Mediatek MT6360 SubPMIC (MFD_MT6360) [N/m/?] n
MediaTek MT6370 SubPMIC (MFD_MT6370) [N/m/?] n
MediaTek MT6397 PMIC Support (MFD_MT6397) [N/m/y/?] n
MEN 14F021P00 Board Management Controller Support (MFD_MENF21BMC) [N/m/?] n
Microsemi Ocelot External Control Support (MFD_OCELOT) [N/m/y/?] n
Motorola EZXPCAP Support (EZX_PCAP) [N/y/?] n
Nano River Technologies Viperboard (MFD_VIPERBOARD) [M/n/y/?] m
Nokia Retu and Tahvo multi-function device (MFD_RETU) [N/m/?] n
NXP PCF50633 (MFD_PCF50633) [N/m/?] n
Silergy SY7636A voltage regulator (MFD_SY7636A) [N/m/?] n
RDC R-321x southbridge (MFD_RDC321X) [N/m/y/?] n
Richtek RT4831 four channel WLED and Display Bias Voltage (MFD_RT4831) [N/m/?] n
Richtek RT5033 Power Management IC (MFD_RT5033) [N/m/?] n
Richtek RT5120 Power Management IC (MFD_RT5120) [N/m/?] n
Silicon Laboratories 4761/64/68 AM/FM radio. (MFD_SI476X_CORE) [N/m/?] n
Silicon Motion SM501 (MFD_SM501) [M/n/y/?] m
  Export GPIO via GPIO layer (MFD_SM501_GPIO) [Y/n/?] y
Skyworks Solutions SKY81452 (MFD_SKY81452) [N/m/?] n
System Controller Register R/W Based on Regmap (MFD_SYSCON) [N/y/?] n
TI/National Semiconductor LP3943 MFD Driver (MFD_LP3943) [N/m/?] n
TI Lighting Management Unit driver (MFD_TI_LMU) [N/m/?] n
TI TPS61050/61052 Boost Converters (TPS6105X) [N/m/?] n
TI TPS6501x Power Management chips (TPS65010) [N/m/?] n
TI TPS6507x Power Management / Touch Screen chips (TPS6507X) [N/m/?] n
TI TPS65086 Power Management Integrated Chips (PMICs) (MFD_TPS65086) [N/m/?] n
TI LP873X Power Management IC (MFD_TI_LP873X) [N/m/?] n
TI TPS65912 Power Management chip with I2C (MFD_TPS65912_I2C) [N/m/?] n
TI TPS65912 Power Management chip with SPI (MFD_TPS65912_SPI) [N/m/y/?] n
TI TPS6594 Power Management chip with I2C (MFD_TPS6594_I2C) [N/m/?] (NEW)
TI TPS6594 Power Management chip with SPI (MFD_TPS6594_SPI) [N/m/y/?] (NEW)
TI WL1273 FM radio (MFD_WL1273_CORE) [M/n/?] m
TI/National Semiconductor LM3533 Lighting Power chip (MFD_LM3533) [N/m/?] n
TQ-Systems IO controller TQMX86 (MFD_TQMX86) [N/m/y/?] n
VIA VX855/VX875 integrated south bridge (MFD_VX855) [M/n/y/?] m
Cirrus Logic/Wolfson Microelectronics Arizona platform with I2C (MFD_ARIZONA_I2C) [N/m/?] n
Cirrus Logic/Wolfson Microelectronics Arizona platform with SPI (MFD_ARIZONA_SPI) [N/m/y/?] n
Wolfson Microelectronics WM831x/2x PMICs with SPI (MFD_WM831X_SPI) [N/y/?] n
Wolfson Microelectronics WM8994 (MFD_WM8994) [N/m/?] n
Actions Semi ATC260x PMICs with I2C (MFD_ATC260X_I2C) [N/m/?] n
Cirrus Logic CS40L50 (I2C) (MFD_CS40L50_I2C) [N/m/?] (NEW)
Cirrus Logic CS40L50 (SPI) (MFD_CS40L50_SPI) [N/m/y/?] (NEW)
RAVE SP MCU core driver (RAVE_SP_CORE) [N/m/y/?] n
Intel MAX 10 Board Management Controller with SPI (MFD_INTEL_M10_BMC_SPI) [N/m/y/?] (NEW)
*
* Voltage and Current Regulator Support
*
Voltage and Current Regulator Support (REGULATOR) [Y/?] y
  Regulator debug support (REGULATOR_DEBUG) [N/y/?] n
  Fixed voltage regulator support (REGULATOR_FIXED_VOLTAGE) [N/m/y/?] n
  Virtual regulator consumer support (REGULATOR_VIRTUAL_CONSUMER) [N/m/y/?] n
  Userspace regulator consumer support (REGULATOR_USERSPACE_CONSUMER) [N/m/y/?] n
  Enable support for receiving regulator events via netlink (REGULATOR_NETLINK_EVENTS) [N/y/?] (NEW)
  Marvell 88PG86X voltage regulators (REGULATOR_88PG86X) [N/m/?] n
  Active-semi act8865 voltage regulator (REGULATOR_ACT8865) [N/m/?] n
  Analog Devices AD5398/AD5821 regulators (REGULATOR_AD5398) [N/m/?] n
  Awinic AW37503 Dual Output Power regulators (REGULATOR_AW37503) [N/m/?] (NEW)
  X-POWERS AXP20X PMIC Regulators (REGULATOR_AXP20X) [N/m/?] n
  ROHM BD9571MWV Regulators (REGULATOR_BD9571MWV) [N/m/?] n
  Dialog Semiconductor DA9210 regulator (REGULATOR_DA9210) [N/m/?] n
  Dialog Semiconductor DA9211/DA9212/DA9213/DA9223/DA9214/DA9224/DA9215/DA9225 regulator (REGULATOR_DA9211) [N/m/?] n
  Fairchild FAN53555 Regulator (REGULATOR_FAN53555) [N/m/?] n
  GPIO regulator support (REGULATOR_GPIO) [N/m/y/?] n
  Intersil ISL9305 regulator (REGULATOR_ISL9305) [N/m/?] n
  Intersil ISL6271A Power regulator (REGULATOR_ISL6271A) [N/m/?] n
  National Semiconductors LP3971 PMIC regulator driver (REGULATOR_LP3971) [N/m/?] n
  National Semiconductors LP3972 PMIC regulator driver (REGULATOR_LP3972) [N/m/?] n
  TI/National Semiconductor LP8720/LP8725 voltage regulators (REGULATOR_LP872X) [N/m/?] n
  TI LP8755 High Performance PMU driver (REGULATOR_LP8755) [N/m/?] n
  LTC3589 8-output voltage regulator (REGULATOR_LTC3589) [N/m/?] n
  LTC3676 8-output voltage regulator (REGULATOR_LTC3676) [N/m/?] n
  Maxim 1586/1587 voltage regulator (REGULATOR_MAX1586) [N/m/?] n
  Analog Devices MAX77503 Regulator (REGULATOR_MAX77503) [N/m/?] (NEW)
  ADI MAX77857/MAX77831 regulator support (REGULATOR_MAX77857) [N/m/?] (NEW)
  Maxim 8649 voltage regulator (REGULATOR_MAX8649) [N/m/?] n
  Maxim 8660/8661 voltage regulator (REGULATOR_MAX8660) [N/m/?] n
  Maxim 8893 voltage regulator (REGULATOR_MAX8893) [N/m/?] n
  Maxim MAX8952 Power Management IC (REGULATOR_MAX8952) [N/m/?] n
  Maxim MAX20086-MAX20089 Camera Power Protectors (REGULATOR_MAX20086) [N/m/?] n
  Maxim MAX20411 High-Efficiency Single Step-Down Converter (REGULATOR_MAX20411) [N/m/?] (NEW)
  Maxim 77826 regulator (REGULATOR_MAX77826) [N/m/?] n
  MPS MP8859 regulator driver (REGULATOR_MP8859) [N/m/?] n
  MediaTek MT6311 PMIC (REGULATOR_MT6311) [N/m/?] n
  NXP PCA9450A/PCA9450B/PCA9450C regulator driver (REGULATOR_PCA9450) [N/m/?] n
  Powerventure Semiconductor PV88060 regulator (REGULATOR_PV88060) [N/m/?] n
  Powerventure Semiconductor PV88080 regulator (REGULATOR_PV88080) [N/m/?] n
  Powerventure Semiconductor PV88090 regulator (REGULATOR_PV88090) [N/m/?] n
  PWM voltage regulator (REGULATOR_PWM) [N/m/y/?] n
  Renesas RAA215300 driver (REGULATOR_RAA215300) [N/m/?] (NEW)
  Richtek RT4801 Regulators (REGULATOR_RT4801) [N/m/?] n
  Richtek RT4803 boost regualtor (REGULATOR_RT4803) [N/m/?] (NEW)
  Richtek RT5190A PMIC (REGULATOR_RT5190A) [N/m/?] n
  Richtek RT5739 Regulator (REGULATOR_RT5739) [N/m/?] (NEW)
  Richtek RT5759 Regulator (REGULATOR_RT5759) [N/m/?] n
  Richtek RT6160 BuckBoost voltage regulator (REGULATOR_RT6160) [N/m/?] n
  Richtek RT6190 4-Switch BuckBoost controller (REGULATOR_RT6190) [N/m/?] (NEW)
  Richtek RT6245 voltage regulator (REGULATOR_RT6245) [N/m/?] n
  Richtek RTQ2134 SubPMIC Regulator (REGULATOR_RTQ2134) [N/m/?] n
  Richtek RTMV20 Laser Diode Regulator (REGULATOR_RTMV20) [N/m/?] n
  Richtek RTQ6752 TFT LCD voltage regulator (REGULATOR_RTQ6752) [N/m/?] n
  Richtek RTQ2208 SubPMIC Regulator (REGULATOR_RTQ2208) [N/m/?] (NEW)
  Dialog Semiconductor SLG51000 regulators (REGULATOR_SLG51000) [N/m/?] n
  TI TPS51632 Power Regulator (REGULATOR_TPS51632) [N/m/?] n
  TI TPS6236x Power Regulator (REGULATOR_TPS62360) [N/m/?] n
  TI TPS65023 Power regulators (REGULATOR_TPS65023) [N/m/?] n
  TI TPS6507X Power regulators (REGULATOR_TPS6507X) [N/m/?] n
  TI TPS65132 Dual Output Power regulators (REGULATOR_TPS65132) [N/m/?] n
  TI TPS6524X Power regulators (REGULATOR_TPS6524X) [N/m/y/?] n
*
* HDMI CEC drivers
*
HDMI CEC drivers (MEDIA_CEC_SUPPORT) [Y/n/?] y
  Chrontel CH7322 CEC controller (CEC_CH7322) [M/n/?] m
  Generic GPIO-based CEC driver (CEC_GPIO) [N/m/y/?] n
  SECO Boards HDMI CEC driver (CEC_SECO) [M/n/y/?] m
    SECO Boards IR RC5 support (CEC_SECO_RC) [Y/n/?] y
  Extron DA HD 4K Plus CEC driver (USB_EXTRON_DA_HD_4K_PLUS_CEC) [N/m/?] (NEW)
  Pulse Eight HDMI CEC (USB_PULSE8_CEC) [N/m/y/?] n
  RainShadow Tech HDMI CEC (USB_RAINSHADOW_CEC) [N/m/y/?] n
*
* Camera sensor devices
*
Camera sensor devices (VIDEO_CAMERA_SENSOR) [Y/n/?] (NEW)
  Allied Vision ALVIUM MIPI CSI-2 camera support (VIDEO_ALVIUM_CSI2) [N/m/?] (NEW)
  ON Semiconductor AR0521 sensor support (VIDEO_AR0521) [N/m/?] n
  GalaxyCore GC0308 sensor support (VIDEO_GC0308) [N/m/?] (NEW)
  GalaxyCore gc05a2 sensor support (VIDEO_GC05A2) [N/m/?] (NEW)
  GalaxyCore gc08a3 sensor support (VIDEO_GC08A3) [N/m/?] (NEW)
  GalaxyCore GC2145 sensor support (VIDEO_GC2145) [N/m/?] (NEW)
  Hynix Hi-556 sensor support (VIDEO_HI556) [N/m/?] n
  Hynix Hi-846 sensor support (VIDEO_HI846) [N/m/?] n
  Hynix Hi-847 sensor support (VIDEO_HI847) [N/m/?] n
  Sony IMX208 sensor support (VIDEO_IMX208) [N/m/?] n
  Sony IMX214 sensor support (VIDEO_IMX214) [N/m/?] n
  Sony IMX219 sensor support (VIDEO_IMX219) [N/m/?] n
  Sony IMX258 sensor support (VIDEO_IMX258) [N/m/?] n
  Sony IMX274 sensor support (VIDEO_IMX274) [N/m/?] n
  Sony IMX283 sensor support (VIDEO_IMX283) [N/m/?] (NEW)
  Sony IMX290 sensor support (VIDEO_IMX290) [N/m/?] n
  Sony IMX296 sensor support (VIDEO_IMX296) [N/m/?] (NEW)
  Sony IMX319 sensor support (VIDEO_IMX319) [N/m/?] n
  Sony IMX355 sensor support (VIDEO_IMX355) [N/m/?] n
  mt9m001 support (VIDEO_MT9M001) [N/m/?] n
  mt9m111, mt9m112 and mt9m131 support (VIDEO_MT9M111) [N/m/?] n
  onsemi MT9M114 sensor support (VIDEO_MT9M114) [N/m/?] (NEW)
  Aptina MT9P031 support (VIDEO_MT9P031) [N/m/?] n
  Aptina MT9T111/MT9T112 support (VIDEO_MT9T112) [N/m/?] n
  Micron mt9v011 sensor support (VIDEO_MT9V011) [M/?] m
  Micron MT9V032 sensor support (VIDEO_MT9V032) [N/m/?] n
  Aptina MT9V111 sensor support (VIDEO_MT9V111) [N/m/?] n
  OmniVision OG01A1B sensor support (VIDEO_OG01A1B) [N/m/?] n
  OmniVision OV01A10 sensor support (VIDEO_OV01A10) [N/m/?] (NEW)
  OmniVision OV02A10 sensor support (VIDEO_OV02A10) [N/m/?] n
  OmniVision OV08D10 sensor support (VIDEO_OV08D10) [N/m/?] n
  OmniVision OV08X40 sensor support (VIDEO_OV08X40) [N/m/?] (NEW)
  OmniVision OV13858 sensor support (VIDEO_OV13858) [N/m/?] n
  OmniVision OV13B10 sensor support (VIDEO_OV13B10) [N/m/?] n
  OmniVision OV2640 sensor support (VIDEO_OV2640) [M/?] m
  OmniVision OV2659 sensor support (VIDEO_OV2659) [N/m/?] n
  OmniVision OV2680 sensor support (VIDEO_OV2680) [N/m/?] n
  OmniVision OV2685 sensor support (VIDEO_OV2685) [N/m/?] n
  OmniVision OV2740 sensor support (VIDEO_OV2740) [N/m/?] n
  OmniVision OV4689 sensor support (VIDEO_OV4689) [N/m/?] (NEW)
  OmniVision OV5647 sensor support (VIDEO_OV5647) [N/m/?] n
  OmniVision OV5648 sensor support (VIDEO_OV5648) [N/m/?] n
  OmniVision OV5670 sensor support (VIDEO_OV5670) [N/m/?] n
  OmniVision OV5675 sensor support (VIDEO_OV5675) [N/m/?] n
  OmniVision OV5693 sensor support (VIDEO_OV5693) [N/m/?] n
  OmniVision OV5695 sensor support (VIDEO_OV5695) [N/m/?] n
  OmniVision OV64A40 sensor support (VIDEO_OV64A40) [N/m/?] (NEW)
  OmniVision OV6650 sensor support (VIDEO_OV6650) [N/m/?] n
  OmniVision OV7251 sensor support (VIDEO_OV7251) [N/m/?] n
  OmniVision OV7640 sensor support (VIDEO_OV7640) [M/?] m
  OmniVision OV7670 sensor support (VIDEO_OV7670) [N/m/?] n
  OmniVision OV772x sensor support (VIDEO_OV772X) [N/m/?] n
  OmniVision OV7740 sensor support (VIDEO_OV7740) [N/m/?] n
  OmniVision OV8856 sensor support (VIDEO_OV8856) [N/m/?] n
  OmniVision OV8858 sensor support (VIDEO_OV8858) [N/m/?] (NEW)
  OmniVision OV8865 sensor support (VIDEO_OV8865) [N/m/?] n
  OmniVision OV9640 sensor support (VIDEO_OV9640) [N/m/?] n
  OmniVision OV9650/OV9652 sensor support (VIDEO_OV9650) [N/m/?] n
  OmniVision OV9734 sensor support (VIDEO_OV9734) [N/m/?] n
  IMI RDACM20 camera support (VIDEO_RDACM20) [N/m/?] n
  IMI RDACM21 camera support (VIDEO_RDACM21) [N/m/?] n
  Sharp RJ54N1CB0C sensor support (VIDEO_RJ54N1) [N/m/?] n
  Samsung S5C73M3 sensor support (VIDEO_S5C73M3) [N/m/?] n
  Samsung S5K5BAF sensor support (VIDEO_S5K5BAF) [N/m/?] n
  Samsung S5K6A3 sensor support (VIDEO_S5K6A3) [N/m/?] n
  MIPI CCS/SMIA++/SMIA sensor support (VIDEO_CCS) [N/m/?] n
  ET8EK8 camera sensor support (VIDEO_ET8EK8) [N/m/?] n
*
* Camera ISPs
*
THine THP7312 support (VIDEO_THP7312) [N/m/?] (NEW)
*
* Lens drivers
*
AD5820 lens voice coil support (VIDEO_AD5820) [N/m/?] n
AK7375 lens voice coil support (VIDEO_AK7375) [N/m/?] n
DW9714 lens voice coil support (VIDEO_DW9714) [N/m/?] n
DW9719 lens voice coil support (VIDEO_DW9719) [N/m/?] (NEW)
DW9768 lens voice coil support (VIDEO_DW9768) [N/m/?] n
DW9807 lens voice coil support (VIDEO_DW9807_VCM) [N/m/?] n
*
* Auxiliary Display support
*
Auxiliary Display support (AUXDISPLAY) [Y/n/?] y
  HD44780 Character LCD support (HD44780) [M/n/y/?] m
  lcd2s 20x4 character display over I2C console (LCD2S) [N/m/?] n
  Change LCD initialization message ? (PANEL_CHANGE_MESSAGE) [N/y/?] n
  Backlight initial state
    1. Off (CHARLCD_BL_OFF)
    2. On (CHARLCD_BL_ON)
  > 3. Flash (CHARLCD_BL_FLASH)
  choice[1-3?]: 3
  KS0108 LCD Controller (KS0108) [M/n/?] m
    Parallel port where the LCD is connected (KS0108_PORT) [0x378] 0x378
    Delay between each control writing (microseconds) (KS0108_DELAY) [2] 2
    CFAG12864B LCD (CFAG12864B) [M/n/?] m
      Refresh rate (hertz) (CFAG12864B_RATE) [20] 20
  Imagination Technologies ASCII LCD Display (IMG_ASCII_LCD) [N/m/y/?] n
  Holtek Ht16K33 LED controller with keyscan (HT16K33) [N/m/?] n
  Maxim MAX6958/6959 7-segment LED controller (MAX6959) [N/m/?] (NEW)
  Generic 7-segment LED display (SEG_LED_GPIO) [N/m/y/?] (NEW)
*
* Direct Rendering Manager (XFree86 4.1.0 and higher DRI support)
*
Direct Rendering Manager (XFree86 4.1.0 and higher DRI support) (DRM) [M/n/y/?] m
  Insert extra checks and debug info into the DRM range managers (DRM_DEBUG_MM) [N/y/?] (NEW)
  Display a user-friendly message when a kernel panic occurs (DRM_PANIC) [N/y/?] (NEW)
  Enable legacy fbdev support for your modesetting driver (DRM_FBDEV_EMULATION) [Y/n/?] y
    Overallocation of the fbdev buffer (DRM_FBDEV_OVERALLOC) [100] 100
  Allow to specify an EDID data set instead of probing for it (DRM_LOAD_EDID_FIRMWARE) [Y/n/?] y
  Enable DisplayPort CEC-Tunneling-over-AUX HDMI support (DRM_DISPLAY_DP_AUX_CEC) [N/y/?] (NEW)
  DRM DP AUX Interface (DRM_DISPLAY_DP_AUX_CHARDEV) [N/y/?] (NEW)
  ATI Radeon (DRM_RADEON) [M/n/?] m
    Always enable userptr support (DRM_RADEON_USERPTR) [Y/n/?] y
  AMD GPU (DRM_AMDGPU) [M/n/?] m
    Enable amdgpu support for SI parts (DRM_AMDGPU_SI) [Y/n/?] y
    Enable amdgpu support for CIK parts (DRM_AMDGPU_CIK) [Y/n/?] y
    Always enable userptr write support (DRM_AMDGPU_USERPTR) [Y/?] y
    Enable AMD Image Signal Processor IP support (DRM_AMD_ISP) [N/y/?] (NEW)
    HSA kernel driver for AMD GPU devices (HSA_AMD) [Y/n/?] y
      Enable HMM-based shared virtual memory manager (HSA_AMD_SVM) [Y/n/?] y
  Nouveau (NVIDIA) cards (DRM_NOUVEAU) [M/n/?] m
    Maximum debug level (NOUVEAU_DEBUG) [5] 5
    Default debug level (NOUVEAU_DEBUG_DEFAULT) [3] 3
    Enable additional MMU debugging (NOUVEAU_DEBUG_MMU) [N/y/?] n
    Enable additional push buffer debugging (NOUVEAU_DEBUG_PUSH) [N/y/?] n
    Support for backlight control (DRM_NOUVEAU_BACKLIGHT) [Y/n/?] y
    (EXPERIMENTAL) Enable SVM (Shared Virtual Memory) support (DRM_NOUVEAU_SVM) [N/y/?] n
    Use GSP firmware for Turing/Ampere (needs firmware installed) (DRM_NOUVEAU_GSP_DEFAULT) [N/y/?] (NEW)
  Intel 8xx/9xx/G3x/G4x/HD Graphics (DRM_I915) [M/n/?] m
    Force probe i915 for selected Intel hardware IDs (DRM_I915_FORCE_PROBE) []
    Enable capturing GPU state following a hang (DRM_I915_CAPTURE_ERROR) [Y/n/?] y
      Compress GPU error state (DRM_I915_COMPRESS_ERROR) [Y/n/?] y
    Always enable userptr support (DRM_I915_USERPTR) [Y/n/?] y
    Enable KVM host support Intel GVT-g graphics virtualization (DRM_I915_GVT_KVMGT) [M/n/?] m
  Intel Xe Graphics (DRM_XE) [N/m/?] (NEW)
  Virtual GEM provider (DRM_VGEM) [M/n/?] m
  Virtual KMS (EXPERIMENTAL) (DRM_VKMS) [M/n/?] m
  DRM driver for VMware Virtual GPU (DRM_VMWGFX) [M/n/?] m
    Enable mksGuestStats instrumentation of vmwgfx by default (DRM_VMWGFX_MKSSTATS) [N/y/?] n
  Intel GMA500/600/3600/3650 KMS Framebuffer (DRM_GMA500) [M/n/?] m
  DisplayLink (DRM_UDL) [M/n/?] m
  AST server chips (DRM_AST) [M/n/?] m
  Matrox G200 (DRM_MGAG200) [M/n/?] m
  QXL virtual GPU (DRM_QXL) [M/n/?] m
  *
  * Display Panels
  *
  AUO A030JTN01 (DRM_PANEL_AUO_A030JTN01) [N/m/?] (NEW)
  Ilitek ILI9341 240x320 QVGA panels (DRM_PANEL_ILITEK_ILI9341) [N/m/?] (NEW)
  Orise Technology ota5601a RGB/SPI panel (DRM_PANEL_ORISETECH_OTA5601A) [N/m/?] (NEW)
  Raspberry Pi 7-inch touchscreen panel (DRM_PANEL_RASPBERRYPI_TOUCHSCREEN) [N/m/?] n
  Widechips WS2401 DPI panel driver (DRM_PANEL_WIDECHIPS_WS2401) [N/m/?] n
  ETNAVIV (DRM support for Vivante GPU IP cores) (DRM_ETNAVIV) [N/m/?] n
  DRM Support for bochs dispi vga interface (qemu stdvga) (DRM_BOCHS) [M/n/?] m
  Cirrus driver for QEMU emulated device (DRM_CIRRUS_QEMU) [M/n/?] m
  GM12U320 driver for USB projectors (DRM_GM12U320) [M/n/?] m
  DRM support for MIPI DBI compatible panels (DRM_PANEL_MIPI_DBI) [N/m/?] n
  Simple framebuffer driver (DRM_SIMPLEDRM) [N/m/?] n
  DRM support for HX8357D display panels (TINYDRM_HX8357D) [N/m/?] n
  DRM support for ILI9163 display panels (TINYDRM_ILI9163) [N/m/?] n
  DRM support for ILI9225 display panels (TINYDRM_ILI9225) [N/m/?] n
  DRM support for ILI9341 display panels (TINYDRM_ILI9341) [N/m/?] n
  DRM support for ILI9486 display panels (TINYDRM_ILI9486) [N/m/?] n
  DRM support for MI0283QT (TINYDRM_MI0283QT) [N/m/?] n
  DRM support for Pervasive Displays RePaper panels (V231) (TINYDRM_REPAPER) [N/m/?] n
  DRM support for Sitronix ST7586 display panels (TINYDRM_ST7586) [N/m/?] n
  DRM support for Sitronix ST7715R/ST7735R display panels (TINYDRM_ST7735R) [N/m/?] n
  Para-virtualized frontend driver for Xen guest OS (DRM_XEN_FRONTEND) [N/m/?] n
  Virtual Box Graphics Card (DRM_VBOXVIDEO) [M/n/?] m
  GUD USB Display (DRM_GUD) [N/m/?] n
  DRM support for Solomon SSD13xx OLED displays (DRM_SSD130X) [N/m/?] n
*
* Frame buffer Devices
*
OpenCores VGA/LCD core 2.0 framebuffer support (FB_OPENCORES) [N/m/y/?] n
Epson S1D13XXX framebuffer support (FB_S1D13XXX) [N/m/y/?] n
nVidia Framebuffer Support (FB_NVIDIA) [N/m/y/?] n
nVidia Riva support (FB_RIVA) [N/m/y/?] n
Intel740 support (FB_I740) [N/m/y/?] n
Matrox acceleration (FB_MATROX) [N/m/y/?] n
ATI Radeon display support (FB_RADEON) [N/m/y/?] n
ATI Rage128 display support (FB_ATY128) [N/m/y/?] n
ATI Mach64 display support (FB_ATY) [N/m/y/?] n
S3 Trio/Virge support (FB_S3) [N/m/y/?] n
S3 Savage support (FB_SAVAGE) [N/m/y/?] n
SiS/XGI display support (FB_SIS) [N/m/y/?] n
VIA UniChrome (Pro) and Chrome9 display support (FB_VIA) [N/m/?] n
NeoMagic display support (FB_NEOMAGIC) [N/m/y/?] n
IMG Kyro support (FB_KYRO) [N/m/y/?] n
3Dfx Banshee/Voodoo3/Voodoo5 display support (FB_3DFX) [N/m/y/?] n
3Dfx Voodoo Graphics (sst1) support (FB_VOODOO1) [N/m/y/?] n
VIA VT8623 support (FB_VT8623) [N/m/y/?] n
Trident/CyberXXX/CyberBlade support (FB_TRIDENT) [N/m/y/?] n
ARK 2000PV support (FB_ARK) [N/m/y/?] n
Permedia3 support (FB_PM3) [N/m/y/?] n
Fujitsu carmine frame buffer support (FB_CARMINE) [N/m/y/?] n
Silicon Motion SM501 framebuffer support (FB_SM501) [N/m/?] n
SMSC UFX6000/7000 USB Framebuffer support (FB_SMSCUFX) [N/m/y/?] n
Displaylink USB Framebuffer support (FB_UDL) [N/m/y/?] n
Framebuffer support for IBM GXT4000P/4500P/6000P/6500P adaptors (FB_IBM_GXT4500) [N/m/y/?] n
Virtual Frame Buffer support (ONLY FOR TESTING!) (FB_VIRTUAL) [M/n/y/?] m
Xen virtual frame buffer support (XEN_FBDEV_FRONTEND) [Y/n/m/?] y
E-Ink Metronome/8track controller support (FB_METRONOME) [N/m/y/?] n
Fujitsu MB862xx GDC support (FB_MB862XX) [N/m/y/?] n
Simple framebuffer support (FB_SIMPLE) [N/m/y/?] n
Solomon SSD1307 framebuffer support (FB_SSD1307) [N/m/?] n
Silicon Motion SM712 framebuffer support (FB_SM712) [N/m/y/?] n
Enable firmware EDID (FIRMWARE_EDID) [N/y/?] n
Provide legacy /dev/fb* device (FB_DEVICE) [Y/n/?] (NEW)
Enable Video Mode Handling Helpers (FB_MODE_HELPERS) [N/y/?] n
Enable Tile Blitting Support (FB_TILEBLITTING) [Y/n/?] y
*
* Backlight & LCD device support
*
Lowlevel LCD controls (LCD_CLASS_DEVICE) [M/n/y/?] m
  Epson L4F00242T03 LCD (LCD_L4F00242T03) [N/m/?] n
  Samsung LMS283GF05 LCD (LCD_LMS283GF05) [N/m/?] n
  Samsung LTV350QV LCD Panel (LCD_LTV350QV) [N/m/?] n
  ILI Technology ILI9221/ILI9222 support (LCD_ILI922X) [N/m/?] n
  ILI Technology ILI9320 controller support (LCD_ILI9320) [N/m/?] n
  Toppoly TDO24M  and TDO35S LCD Panels support (LCD_TDO24M) [N/m/?] n
  VGG2432A4 LCM device support (LCD_VGG2432A4) [N/m/?] n
  Platform LCD controls (LCD_PLATFORM) [M/n/?] m
  AMS369FG06 AMOLED LCD Driver (LCD_AMS369FG06) [N/m/?] n
  LMS501KF03 LCD Driver (LCD_LMS501KF03) [N/m/?] n
  Himax HX-8357 LCD Driver (LCD_HX8357) [N/m/?] n
  ORISE Technology OTM3225A support (LCD_OTM3225A) [N/m/?] n
Lowlevel Backlight controls (BACKLIGHT_CLASS_DEVICE) [M/y/?] m
  Backlight Driver for Kinetic KTD253 (BACKLIGHT_KTD253) [N/m/?] n
  Backlight Driver for Kinetic KTD2801 (BACKLIGHT_KTD2801) [N/m/?] (NEW)
  Backlight Driver for Kinetic KTZ8866 (BACKLIGHT_KTZ8866) [N/m/?] (NEW)
  Generic PWM based Backlight Driver (BACKLIGHT_PWM) [M/n/?] m
  Apple Backlight Driver (BACKLIGHT_APPLE) [M/n/?] m
  Qualcomm PMIC WLED Driver (BACKLIGHT_QCOM_WLED) [N/m/?] n
  Tabletkiosk Sahara Touch-iT Backlight Driver (BACKLIGHT_SAHARA) [N/m/?] n
  Backlight Driver for ADP8860/ADP8861/ADP8863 using WLED (BACKLIGHT_ADP8860) [N/m/?] n
  Backlight Driver for ADP8870 using WLED (BACKLIGHT_ADP8870) [N/m/?] n
  Backlight Driver for LM3509 (BACKLIGHT_LM3509) [N/m/?] (NEW)
  Backlight Driver for LM3630A (BACKLIGHT_LM3630A) [N/m/?] n
  Backlight Driver for LM3639 (BACKLIGHT_LM3639) [N/m/?] n
  Backlight driver for TI LP855X (BACKLIGHT_LP855X) [M/n/?] m
  Backlight Driver for MPS MP3309C (BACKLIGHT_MP3309C) [N/m/?] (NEW)
  Generic GPIO based Backlight Driver (BACKLIGHT_GPIO) [N/m/?] n
  Sanyo LV5207LP Backlight (BACKLIGHT_LV5207LP) [N/m/?] n
  Rohm BD6107 Backlight (BACKLIGHT_BD6107) [N/m/?] n
  Backlight driver for the Arctic Sands ARCxCnnnn family (BACKLIGHT_ARCXCNN) [M/n/?] m
*
* Compute Acceleration Framework
*
Compute Acceleration Framework (DRM_ACCEL) [N/y/?] (NEW)
*
* Advanced Linux Sound Architecture
*
Advanced Linux Sound Architecture (SND) [M/n/?] m
  Enable OSS Emulation (SND_OSSEMUL) [Y/n/?] y
    OSS Mixer API (SND_MIXER_OSS) [M/n/?] m
    OSS PCM (digital audio) API (SND_PCM_OSS) [M/n/?] m
      OSS PCM (digital audio) API - Include plugin system (SND_PCM_OSS_PLUGINS) [Y/n/?] y
  HR-timer backend support (SND_HRTIMER) [M/n/?] m
  Dynamic device file minor numbers (SND_DYNAMIC_MINORS) [Y/?] y
    Max number of sound cards (SND_MAX_CARDS) [32] 32
  Support old ALSA API (SND_SUPPORT_OLD_API) [N/y/?] n
  Sound Proc FS Support (SND_PROC_FS) [Y/?] y
    Verbose procfs contents (SND_VERBOSE_PROCFS) [Y/n/?] y
  Debug (SND_DEBUG) [N/y/?] n
  Validate input data to control API (SND_CTL_INPUT_VALIDATION) [N/y/?] n
  Enable support for userspace-controlled virtual timers (SND_UTIMER) [N/y/?] (NEW)
  Sequencer support (SND_SEQUENCER) [M/n/?] m
    Sequencer dummy client (SND_SEQ_DUMMY) [M/n/?] m
    OSS Sequencer API (SND_SEQUENCER_OSS) [M/n/?] m
    Use HR-timer as default sequencer timer (SND_SEQ_HRTIMER_DEFAULT) [Y/n/?] y
    Support for UMP events (SND_SEQ_UMP) [N/y/?] (NEW)
  *
  * Generic sound devices
  *
  Generic sound devices (SND_DRIVERS) [Y/n/?] y
    PC-Speaker support (READ HELP!) (SND_PCSP) [N/m/?] n
    Dummy (/dev/null) soundcard (SND_DUMMY) [M/n/?] m
    Generic loopback driver (PCM) (SND_ALOOP) [M/n/?] m
    Virtual PCM test driver (SND_PCMTEST) [N/m/?] (NEW)
    Virtual MIDI soundcard (SND_VIRMIDI) [M/n/?] m
    MOTU MidiTimePiece AV multiport MIDI (SND_MTPAV) [M/n/?] m
    ESI Miditerminal 4140 driver (SND_MTS64) [M/n/?] m
    UART16550 serial MIDI driver (SND_SERIAL_U16550) [M/n/?] m
    Generic MPU-401 UART driver (SND_MPU401) [M/n/?] m
    Portman 2x4 driver (SND_PORTMAN2X4) [M/n/?] m
    AC97 Power-Saving Mode (SND_AC97_POWER_SAVE) [Y/n/?] y
      Default time-out for AC97 power-save mode (SND_AC97_POWER_SAVE_DEFAULT) [0] 0
  *
  * HD-Audio
  *
  HD Audio PCI (SND_HDA_INTEL) [M/n/?] m
  Build hwdep interface for HD-audio driver (SND_HDA_HWDEP) [Y/n/?] y
  Allow dynamic codec reconfiguration (SND_HDA_RECONFIG) [Y/?] y
  Support digital beep via input layer (SND_HDA_INPUT_BEEP) [Y/n/?] y
    Digital beep registration mode (0=off, 1=on) (SND_HDA_INPUT_BEEP_MODE) [0] 0
  Support initialization patch loading for HD-audio (SND_HDA_PATCH_LOADER) [Y/n/?] y
  Build CS35L41 HD-audio side codec support for I2C Bus (SND_HDA_SCODEC_CS35L41_I2C) [N/m/?] n
  Build CS35L41 HD-audio codec support for SPI Bus (SND_HDA_SCODEC_CS35L41_SPI) [N/m/?] n
  Build CS35L56 HD-audio side codec support for I2C Bus (SND_HDA_SCODEC_CS35L56_I2C) [N/m/?] (NEW)
  Build CS35L56 HD-audio side codec support for SPI Bus (SND_HDA_SCODEC_CS35L56_SPI) [N/m/?] (NEW)
  Build TAS2781 HD-audio side codec support for I2C Bus (SND_HDA_SCODEC_TAS2781_I2C) [N/m/?] (NEW)
  Build Realtek HD-audio codec support (SND_HDA_CODEC_REALTEK) [M/n/?] m
  Build Analog Devices HD-audio codec support (SND_HDA_CODEC_ANALOG) [M/n/?] m
  Build IDT/Sigmatel HD-audio codec support (SND_HDA_CODEC_SIGMATEL) [M/n/?] m
  Build VIA HD-audio codec support (SND_HDA_CODEC_VIA) [M/n/?] m
  Build HDMI/DisplayPort HD-audio codec support (SND_HDA_CODEC_HDMI) [M/n/?] m
  Build Cirrus Logic codec support (SND_HDA_CODEC_CIRRUS) [M/n/?] m
  Build Cirrus Logic HDA bridge support (SND_HDA_CODEC_CS8409) [N/m/?] n
  Build Conexant HD-audio codec support (SND_HDA_CODEC_CONEXANT) [M/n/?] m
  Build Senarytech HD-audio codec support (SND_HDA_CODEC_SENARYTECH) [N/m/?] (NEW)
  Build Creative CA0110-IBG codec support (SND_HDA_CODEC_CA0110) [M/n/?] m
  Build Creative CA0132 codec support (SND_HDA_CODEC_CA0132) [M/n/?] m
    Support new DSP code for CA0132 codec (SND_HDA_CODEC_CA0132_DSP) [Y/n/?] y
  Build C-Media HD-audio codec support (SND_HDA_CODEC_CMEDIA) [M/n/?] m
  Build Silicon Labs 3054 HD-modem codec support (SND_HDA_CODEC_SI3054) [M/n/?] m
  Enable generic HD-audio codec parser (SND_HDA_GENERIC) [M/?] m
  Default time-out for HD-audio power-save mode (SND_HDA_POWER_SAVE_DEFAULT) [1] 1
  Enable Silent Stream always for HDMI (SND_HDA_INTEL_HDMI_SILENT_STREAM) [N/y/?] n
  Use the device identifier field for controls (SND_HDA_CTL_DEV_ID) [N/y/?] n
  Pre-allocated buffer size for HD-audio driver (SND_HDA_PREALLOC_SIZE) [0] 0
  Prefer SOF driver over SST on BY/CHT platforms (SND_INTEL_BYT_PREFER_SOF) [N/y/?] n
  *
  * USB sound devices
  *
  USB sound devices (SND_USB) [Y/n/?] y
    USB Audio/MIDI driver (SND_USB_AUDIO) [M/n/?] m
      MIDI 2.0 support by USB Audio driver (SND_USB_AUDIO_MIDI_V2) [N/y/?] (NEW)
    Edirol UA-101/UA-1000 driver (SND_USB_UA101) [M/n/?] m
    Tascam US-122, US-224 and US-428 USB driver (SND_USB_USX2Y) [M/n/?] m
    Native Instruments USB audio devices (SND_USB_CAIAQ) [M/n/?] m
      enable input device for controllers (SND_USB_CAIAQ_INPUT) [Y/n/?] y
    Tascam US-122L USB driver (SND_USB_US122L) [M/n/?] m
    TerraTec DMX 6Fire USB (SND_USB_6FIRE) [M/n/?] m
    M2Tech hiFace USB-SPDIF driver (SND_USB_HIFACE) [M/n/?] m
    Behringer BCD2000 MIDI driver (SND_BCD2000) [M/n/?] m
    Line 6 POD USB support (SND_USB_POD) [M/n/?] m
    Line 6 POD X3/HD300/400/500 USB support (SND_USB_PODHD) [M/n/?] m
    TonePort GX, UX1 and UX2 USB support (SND_USB_TONEPORT) [M/n/?] m
    Variax Workbench USB support (SND_USB_VARIAX) [M/n/?] m
  *
  * ALSA for SoC audio support
  *
  ALSA for SoC audio support (SND_SOC) [M/n/?] m
    Audio support for Analog Devices reference designs (SND_SOC_ADI) [N/m/?] n
    AMD Audio Coprocessor support (SND_SOC_AMD_ACP) [M/n/?] m
      AMD CZ support for DA7219, RT5682 and MAX9835 (SND_SOC_AMD_CZ_DA7219MX98357_MACH) [M/n/?] m
      AMD CZ support for RT5645 (SND_SOC_AMD_CZ_RT5645_MACH) [M/n/?] m
      AMD ST support for ES8336 (SND_SOC_AMD_ST_ES8336_MACH) [N/m/?] n
    AMD Audio Coprocessor-v3.x support (SND_SOC_AMD_ACP3x) [M/n/?] m
    AMD Audio Coprocessor - Renoir support (SND_SOC_AMD_RENOIR) [M/n/?] m
      AMD Renoir support for DMIC (SND_SOC_AMD_RENOIR_MACH) [M/n/?] m
    AMD Audio Coprocessor-v5.x I2S support (SND_SOC_AMD_ACP5x) [N/m/?] n
    AMD Audio Coprocessor-v6.x Yellow Carp support (SND_SOC_AMD_ACP6x) [N/m/?] n
    AMD ACP configuration selection (SND_AMD_ACP_CONFIG) [M/?] m
    AMD Audio ACP Common support (SND_SOC_AMD_ACP_COMMON) [N/m/?] n
    AMD Audio Coprocessor-v6.2 RPL support (SND_SOC_AMD_RPL_ACP6x) [N/m/?] n
    support for AMD platforms with ACP version >= 6.3 (SND_SOC_AMD_ACP63_TOPLEVEL) [M/n/?] (NEW)
      AMD Audio Coprocessor-v6.3 Pink Sardine support (SND_SOC_AMD_PS) [N/m/?] n
    SoC Audio for the Atmel System-on-Chip (SND_ATMEL_SOC) [N/m/?] n
    SoC Audio support for the Broadcom BCM63XX I2S module (SND_BCM63XX_I2S_WHISTLER) [N/m/?] n
    Synopsys I2S Device Driver (SND_DESIGNWARE_I2S) [N/m/?] n
    Google Chameleon v3 I2S device (SND_SOC_CHV3_I2S) [N/m/?] (NEW)
    Hisilicon I2S controller (SND_I2S_HI6210_I2S) [M/n/?] m
    Audio support for Imagination Technologies designs (SND_SOC_IMG) [N/y/?] n
    Intel ASoC SST drivers (SND_SOC_INTEL_SST_TOPLEVEL) [Y/n/?] y
      Haswell and Broadwell (SND_SOC_INTEL_CATPT) [N/m/?] n
      PCI HiFi2 (Merrifield) Platforms (SND_SST_ATOM_HIFI2_PLATFORM_PCI) [N/m/?] n
      ACPI HiFi2 (Baytrail, Cherrytrail) Platforms (SND_SST_ATOM_HIFI2_PLATFORM_ACPI) [M/n/?] m
    Intel AVS driver (SND_SOC_INTEL_AVS) [N/m/?] n
    *
    * Intel Machine drivers
    *
    Intel Machine drivers (SND_SOC_INTEL_MACH) [Y/?] y
      Use more user friendly long card names (SND_SOC_INTEL_USER_FRIENDLY_LONG_NAMES) [Y/n/?] y
      Broadwell with RT5650 codec (SND_SOC_INTEL_BDW_RT5650_MACH) [N/m/?] n
      Broadwell with RT5677 codec (SND_SOC_INTEL_BDW_RT5677_MACH) [N/m/?] n
      Broadwell with RT286 I2S codec (SND_SOC_INTEL_BROADWELL_MACH) [N/m/?] n
      Baytrail and Baytrail-CR with RT5640 codec (SND_SOC_INTEL_BYTCR_RT5640_MACH) [M/n/?] m
      Baytrail and Baytrail-CR with RT5651 codec (SND_SOC_INTEL_BYTCR_RT5651_MACH) [M/n/?] m
      Cherrytrail & Braswell with RT5672 codec (SND_SOC_INTEL_CHT_BSW_RT5672_MACH) [M/n/?] m
      Cherrytrail & Braswell with RT5645/5650 codec (SND_SOC_INTEL_CHT_BSW_RT5645_MACH) [M/n/?] m
      Cherrytrail & Braswell with MAX98090 & TI codec (SND_SOC_INTEL_CHT_BSW_MAX98090_TI_MACH) [M/n/?] m
      Cherrytrail & Braswell with NAU88L24 codec (SND_SOC_INTEL_CHT_BSW_NAU8824_MACH) [M/n/?] m
      Baytrail & Cherrytrail with CX2072X codec (SND_SOC_INTEL_BYT_CHT_CX2072X_MACH) [M/n/?] m
      Baytrail & Cherrytrail with DA7212/7213 codec (SND_SOC_INTEL_BYT_CHT_DA7213_MACH) [M/n/?] m
      Baytrail & Cherrytrail with ES8316 codec (SND_SOC_INTEL_BYT_CHT_ES8316_MACH) [M/n/?] m
      Baytrail & Cherrytrail platform with no codec (MinnowBoard MAX, Up) (SND_SOC_INTEL_BYT_CHT_NOCODEC_MACH) [N/m/?] n
      SOF with Wolfson/Cirrus WM8804 codec (SND_SOC_INTEL_SOF_WM8804_MACH) [N/m/?] n
      GLK with DA7219 and MAX98357A in I2S Mode (SND_SOC_INTEL_GLK_DA7219_MAX98357A_MACH) [N/m/?] n
      GLK with RT5682 and MAX98357A in I2S Mode (SND_SOC_INTEL_GLK_RT5682_MAX98357A_MACH) [N/m/?] n
      Skylake+ with HDA Codecs (SND_SOC_INTEL_SKL_HDA_DSP_GENERIC_MACH) [M/n/?] m
      SOF with rt5650/rt5682 codec in I2S Mode (SND_SOC_INTEL_SOF_RT5682_MACH) [M/n/?] m
      SOF with cs42l42 codec in I2S Mode (SND_SOC_INTEL_SOF_CS42L42_MACH) [N/m/?] n
      SOF with TI PCM512x codec (SND_SOC_INTEL_SOF_PCM512x_MACH) [N/m/?] n
      SOF with ES8336 or ES8326 codec in I2S mode (SND_SOC_INTEL_SOF_ES8336_MACH) [N/m/?] n
      SOF with nau8825 codec in I2S Mode (SND_SOC_INTEL_SOF_NAU8825_MACH) [N/m/?] n
      CML_LP with DA7219 and MAX98357A in I2S Mode (SND_SOC_INTEL_CML_LP_DA7219_MAX98357A_MACH) [M/n/?] m
      CML with RT1011 and RT5682 in I2S Mode (SND_SOC_INTEL_SOF_CML_RT1011_RT5682_MACH) [N/m/?] n
      SOF with DA7219 codec in I2S Mode (SND_SOC_INTEL_SOF_DA7219_MACH) [M/n/?] (NEW)
      SOF with amplifiers in I2S Mode (SND_SOC_INTEL_SOF_SSP_AMP_MACH) [N/m/?] n
      EHL with RT5660 in I2S mode (SND_SOC_INTEL_EHL_RT5660_MACH) [N/m/?] n
      SoundWire generic machine driver (SND_SOC_INTEL_SOUNDWIRE_SOF_MACH) [N/m/?] n
    ALSA BT SCO CVSD/MSBC Driver (SND_SOC_MTK_BTCVSD) [N/m/?] n
    *
    * Sound Open Firmware Support
    *
    Sound Open Firmware Support (SND_SOC_SOF_TOPLEVEL) [Y/n/?] y
      SOF PCI enumeration support (SND_SOC_SOF_PCI) [M/n/?] m
      SOF ACPI enumeration support (SND_SOC_SOF_ACPI) [M/n/?] m
      SOF support for AMD audio DSPs (SND_SOC_SOF_AMD_TOPLEVEL) [N/m/?] n
      SOF support for Intel audio DSPs (SND_SOC_SOF_INTEL_TOPLEVEL) [Y/n/?] y
        SOF support for Baytrail, Braswell and Cherrytrail (SND_SOC_SOF_BAYTRAIL) [M/n/?] m
        SOF support for Broadwell (SND_SOC_SOF_BROADWELL) [M/n/?] m
        SOF support for Tangier/Merrifield (SND_SOC_SOF_MERRIFIELD) [M/n/?] m
        SOF support for SkyLake (SND_SOC_SOF_SKYLAKE) [M/n/?] m
        SOF support for KabyLake (SND_SOC_SOF_KABYLAKE) [M/n/?] m
        SOF support for Apollolake (SND_SOC_SOF_APOLLOLAKE) [M/n/?] m
        SOF support for GeminiLake (SND_SOC_SOF_GEMINILAKE) [M/n/?] m
        SOF support for Cannonlake (SND_SOC_SOF_CANNONLAKE) [M/n/?] m
        SOF support for CoffeeLake (SND_SOC_SOF_COFFEELAKE) [M/n/?] m
        SOF support for CometLake (SND_SOC_SOF_COMETLAKE) [M/n/?] m
        SOF support for Icelake (SND_SOC_SOF_ICELAKE) [M/n/?] m
        SOF support for JasperLake (SND_SOC_SOF_JASPERLAKE) [M/n/?] m
        SOF support for Tigerlake (SND_SOC_SOF_TIGERLAKE) [M/n/?] m
        SOF support for ElkhartLake (SND_SOC_SOF_ELKHARTLAKE) [M/n/?] m
        SOF support for Alderlake (SND_SOC_SOF_ALDERLAKE) [M/n/?] m
        SOF support for Meteorlake (SND_SOC_SOF_METEORLAKE) [M/n/?] m
        SOF support for Lunarlake (SND_SOC_SOF_LUNARLAKE) [M/n/?] (NEW)
        SOF support for Pantherlake (SND_SOC_SOF_PANTHERLAKE) [M/n/?] (NEW)
        SOF support for HDA Links(HDA/HDMI) (SND_SOC_SOF_HDA_LINK) [Y/n/?] y
          SOF support for HDAudio codecs (SND_SOC_SOF_HDA_AUDIO_CODEC) [Y/n/?] y
        SOF support for SoundWire (SND_SOC_SOF_INTEL_SOUNDWIRE) [M/n/?] m
    Audio support for the Xilinx I2S (SND_SOC_XILINX_I2S) [N/m/?] n
    Audio support for the Xilinx audio formatter (SND_SOC_XILINX_AUDIO_FORMATTER) [N/m/?] n
    Audio support for the Xilinx SPDIF (SND_SOC_XILINX_SPDIF) [N/m/?] n
    XTFPGA I2S master (SND_SOC_XTFPGA_I2S) [N/m/?] n
    *
    * CODEC drivers
    *
    Build generic ASoC AC97 CODEC driver (SND_SOC_AC97_CODEC) [M/n/?] m
    Analog Devices ADAU1372 CODEC (I2C) (SND_SOC_ADAU1372_I2C) [N/m/?] n
    Analog Devices ADAU1372 CODEC (SPI) (SND_SOC_ADAU1372_SPI) [N/m/?] n
    Analog Devices ADAU1701 CODEC (SND_SOC_ADAU1701) [N/m/?] n
    Analog Devices AU1761 CODEC - I2C (SND_SOC_ADAU1761_I2C) [M/n/?] m
    Analog Devices AU1761 CODEC - SPI (SND_SOC_ADAU1761_SPI) [M/n/?] m
    Analog Devices ADAU7002 Stereo PDM-to-I2S/TDM Converter (SND_SOC_ADAU7002) [M/?] m
    Analog Devices ADAU7118 8 Channel PDM-to-I2S/TDM Converter - HW Mode (SND_SOC_ADAU7118_HW) [N/m/?] n
    Analog Devices ADAU7118 8 Channel PDM-to-I2S/TDM Converter - I2C (SND_SOC_ADAU7118_I2C) [N/m/?] n
    AKM AK4104 CODEC (SND_SOC_AK4104) [N/m/?] n
    AKM AK4118 CODEC (SND_SOC_AK4118) [N/m/?] n
    AKM AK4375 CODEC (SND_SOC_AK4375) [N/m/?] n
    AKM AK4458 CODEC (SND_SOC_AK4458) [N/m/?] n
    AKM AK4554 CODEC (SND_SOC_AK4554) [N/m/?] n
    AKM AK4613 CODEC (SND_SOC_AK4613) [N/m/?] n
    AKM AK4619 CODEC (SND_SOC_AK4619) [N/m/?] (NEW)
    AKM AK4642 CODEC (SND_SOC_AK4642) [N/m/?] n
    AKM AK5638 CODEC (SND_SOC_AK5386) [N/m/?] n
    AKM AK5558 CODEC (SND_SOC_AK5558) [M/n/?] m
    Realtek ALC5623 CODEC (SND_SOC_ALC5623) [N/m/?] n
    Audio IIO Auxiliary device (SND_SOC_AUDIO_IIO_AUX) [N/m/?] (NEW)
    Awinic AW8738 Audio Amplifier (SND_SOC_AW8738) [N/m/?] n
    Soc Audio for awinic aw88395 (SND_SOC_AW88395) [N/m/?] (NEW)
    Soc Audio for awinic aw88261 (SND_SOC_AW88261) [N/m/?] (NEW)
    Soc Audio for awinic aw87390 (SND_SOC_AW87390) [N/m/?] (NEW)
    Soc Audio for awinic aw88399 (SND_SOC_AW88399) [N/m/?] (NEW)
    ROHM BD28623 CODEC (SND_SOC_BD28623) [M/n/?] m
    Dummy BT SCO codec driver (SND_SOC_BT_SCO) [N/m/?] n
    Google Chameleon v3 codec driver (SND_SOC_CHV3_CODEC) [N/m/?] (NEW)
    Cirrus Logic CS35L32 CODEC (SND_SOC_CS35L32) [N/m/?] n
    Cirrus Logic CS35L33 CODEC (SND_SOC_CS35L33) [N/m/?] n
    Cirrus Logic CS35L34 CODEC (SND_SOC_CS35L34) [M/n/?] m
    Cirrus Logic CS35L35 CODEC (SND_SOC_CS35L35) [M/n/?] m
    Cirrus Logic CS35L36 CODEC (SND_SOC_CS35L36) [M/n/?] m
    Cirrus Logic CS35L41 CODEC (SPI) (SND_SOC_CS35L41_SPI) [N/m/?] n
    Cirrus Logic CS35L41 CODEC (I2C) (SND_SOC_CS35L41_I2C) [N/m/?] n
    Cirrus Logic CS35L45 CODEC (SPI) (SND_SOC_CS35L45_SPI) [N/m/?] n
    Cirrus Logic CS35L45 CODEC (I2C) (SND_SOC_CS35L45_I2C) [N/m/?] n
    Cirrus Logic CS35L56 CODEC (I2C) (SND_SOC_CS35L56_I2C) [N/m/?] (NEW)
    Cirrus Logic CS35L56 CODEC (SPI) (SND_SOC_CS35L56_SPI) [N/m/?] (NEW)
    Cirrus Logic CS35L56 CODEC (SDW) (SND_SOC_CS35L56_SDW) [N/m/?] (NEW)
    Cirrus Logic CS42L42 CODEC (I2C) (SND_SOC_CS42L42) [M/n/?] m
    Cirrus Logic CS42L42 CODEC on Soundwire (SND_SOC_CS42L42_SDW) [N/m/?] (NEW)
    Cirrus Logic CS42L51 CODEC (I2C) (SND_SOC_CS42L51_I2C) [N/m/?] n
    Cirrus Logic CS42L52 CODEC (SND_SOC_CS42L52) [N/m/?] n
    Cirrus Logic CS42L56 CODEC (SND_SOC_CS42L56) [N/m/?] n
    Cirrus Logic CS42L73 CODEC (SND_SOC_CS42L73) [N/m/?] n
    Cirrus Logic CS42L83 CODEC (SND_SOC_CS42L83) [N/m/?] n
    Cirrus Logic CS4234 CODEC (SND_SOC_CS4234) [N/m/?] n
    Cirrus Logic CS4265 CODEC (SND_SOC_CS4265) [N/m/?] n
    Cirrus Logic CS4270 CODEC (SND_SOC_CS4270) [N/m/?] n
    Cirrus Logic CS4271 CODEC (I2C) (SND_SOC_CS4271_I2C) [N/m/?] n
    Cirrus Logic CS4271 CODEC (SPI) (SND_SOC_CS4271_SPI) [N/m/?] n
    Cirrus Logic CS42448/CS42888 CODEC (I2C) (SND_SOC_CS42XX8_I2C) [N/m/?] n
    Cirrus Logic CS43130 CODEC (SND_SOC_CS43130) [M/n/?] m
    Cirrus Logic CS4341 CODEC (SND_SOC_CS4341) [N/m/?] n
    Cirrus Logic CS4349 CODEC (SND_SOC_CS4349) [N/m/?] n
    Cirrus Logic CS53L30 CODEC (SND_SOC_CS53L30) [N/m/?] n
    Cirrus Logic CS530x ADCs (I2C) (SND_SOC_CS530X_I2C) [N/m/?] (NEW)
    Conexant CX2072X CODEC (SND_SOC_CX2072X) [M/?] m
    Dialog DA7213 CODEC (SND_SOC_DA7213) [M/?] m
    Generic Digital Microphone CODEC (SND_SOC_DMIC) [M/?] m
    Everest Semi ES7134 CODEC (SND_SOC_ES7134) [M/n/?] m
    Everest Semi ES7241 CODEC (SND_SOC_ES7241) [N/m/?] n
    Everest Semi ES8311 CODEC (SND_SOC_ES8311) [N/m/?] (NEW)
    Everest Semi ES8316 CODEC (SND_SOC_ES8316) [M/?] m
    Everest Semi ES8326 CODEC (SND_SOC_ES8326) [N/m/?] n
    Everest Semi ES8328 CODEC (I2C) (SND_SOC_ES8328_I2C) [M/n/?] m
    Everest Semi ES8328 CODEC (SPI) (SND_SOC_ES8328_SPI) [M/n/?] m
    GTM601 UMTS modem audio codec (SND_SOC_GTM601) [N/m/?] n
    HD-Audio codec driver (SND_SOC_HDA) [N/m/?] n
    ICS43423 and compatible i2s microphones (SND_SOC_ICS43432) [N/m/?] n
    Renesas IDT821034 quad PCM codec (SND_SOC_IDT821034) [N/m/?] (NEW)
    Maxim MAX98088/9 Low-Power, Stereo Audio Codec (SND_SOC_MAX98088) [M/n/?] m
    Maxim MAX98090 CODEC (SND_SOC_MAX98090) [M/?] m
    Maxim MAX98357A CODEC (SND_SOC_MAX98357A) [M/?] m
    Maxim MAX98504 speaker amplifier (SND_SOC_MAX98504) [N/m/?] n
    Maxim MAX9867 CODEC (SND_SOC_MAX9867) [M/n/?] m
    Maxim Integrated MAX98927 Speaker Amplifier (SND_SOC_MAX98927) [M/n/?] m
    Maxim Integrated MAX98520 Speaker Amplifier (SND_SOC_MAX98520) [N/m/?] n
    Analog Devices MAX98363 Soundwire Speaker Amplifier (SND_SOC_MAX98363) [N/m/?] (NEW)
    Maxim Integrated MAX98373 Speaker Amplifier (SND_SOC_MAX98373_I2C) [M/?] m
    Maxim Integrated MAX98373 Speaker Amplifier - SDW (SND_SOC_MAX98373_SDW) [M/n/?] m
    Analog Devices MAX98388 Speaker Amplifier (SND_SOC_MAX98388) [N/m/?] (NEW)
    Maxim Integrated MAX98390 Speaker Amplifier (SND_SOC_MAX98390) [M/?] m
    Analog Devices MAX98396 Speaker Amplifier (SND_SOC_MAX98396) [N/m/?] n
    Maxim MAX9860 Mono Audio Voice Codec (SND_SOC_MAX9860) [N/m/?] n
    Qualcomm MSM8916 WCD DIGITAL Codec (SND_SOC_MSM8916_WCD_DIGITAL) [N/m/?] n
    Texas Instruments PCM1681 CODEC (SND_SOC_PCM1681) [N/m/?] n
    Texas Instruments PCM1789 CODEC (I2C) (SND_SOC_PCM1789_I2C) [M/n/?] m
    Texas Instruments PCM179X CODEC (I2C) (SND_SOC_PCM179X_I2C) [N/m/?] n
    Texas Instruments PCM179X CODEC (SPI) (SND_SOC_PCM179X_SPI) [N/m/?] n
    Texas Instruments PCM186x CODECs - I2C (SND_SOC_PCM186X_I2C) [M/n/?] m
    Texas Instruments PCM186x CODECs - SPI (SND_SOC_PCM186X_SPI) [M/n/?] m
    Texas Instruments PCM3060 CODEC - I2C (SND_SOC_PCM3060_I2C) [M/n/?] m
    Texas Instruments PCM3060 CODEC - SPI (SND_SOC_PCM3060_SPI) [M/n/?] m
    Texas Instruments PCM3168A CODEC - I2C (SND_SOC_PCM3168A_I2C) [N/m/?] n
    Texas Instruments PCM3168A CODEC - SPI (SND_SOC_PCM3168A_SPI) [N/m/?] n
    Texas Instruments PCM5102A CODEC (SND_SOC_PCM5102A) [N/m/?] n
    Texas Instruments PCM512x CODECs - I2C (SND_SOC_PCM512x_I2C) [N/m/?] n
    Texas Instruments PCM512x CODECs - SPI (SND_SOC_PCM512x_SPI) [N/m/?] n
    Texas Instruments PCM6240 Family Audio chips based on I2C (SND_SOC_PCM6240) [N/m/?] (NEW)
    Infineon PEB2466 quad PCM codec (SND_SOC_PEB2466) [N/m/?] (NEW)
    Realtek RT1017 SDCA Codec - SDW (SND_SOC_RT1017_SDCA_SDW) [N/m/?] (NEW)
    Realtek RT1308 Codec - SDW (SND_SOC_RT1308_SDW) [M/n/?] m
    Realtek RT1316 Codec - SDW (SND_SOC_RT1316_SDW) [N/m/?] n
    Realtek RT1318 Codec - SDW (SND_SOC_RT1318_SDW) [N/m/?] n
    Realtek RT1320 Codec - SDW (SND_SOC_RT1320_SDW) [N/m/?] (NEW)
    Realtek RT5616 CODEC (SND_SOC_RT5616) [N/m/?] n
    Realtek ALC5631/RT5631 CODEC (SND_SOC_RT5631) [N/m/?] n
    Realtek RT5640/RT5639 Codec (SND_SOC_RT5640) [M/?] m
    Realtek RT5658/RT5659 Codec (SND_SOC_RT5659) [N/m/?] n
    Realtek RT5682 Codec - SDW (SND_SOC_RT5682_SDW) [M/n/?] m
    Realtek RT700 Codec - SDW (SND_SOC_RT700_SDW) [M/n/?] m
    Realtek RT711 Codec - SDW (SND_SOC_RT711_SDW) [M/n/?] m
    Realtek RT711 SDCA Codec - SDW (SND_SOC_RT711_SDCA_SDW) [N/m/?] n
    Realtek RT712 SDCA Codec - SDW (SND_SOC_RT712_SDCA_SDW) [N/m/?] (NEW)
    Realtek RT712 SDCA DMIC Codec - SDW (SND_SOC_RT712_SDCA_DMIC_SDW) [N/m/?] (NEW)
    Realtek RT722 SDCA Codec - SDW (SND_SOC_RT722_SDCA_SDW) [N/m/?] (NEW)
    Realtek RT715 Codec - SDW (SND_SOC_RT715_SDW) [M/n/?] m
    Realtek RT715 SDCA Codec - SDW (SND_SOC_RT715_SDCA_SDW) [N/m/?] n
    Richtek RT9120 Stereo Class-D Amplifier (SND_SOC_RT9120) [N/m/?] n
    Richtek RTQ9128 45W Digital Input Amplifier (SND_SOC_RTQ9128) [N/m/?] (NEW)
    Freescale SGTL5000 CODEC (SND_SOC_SGTL5000) [N/m/?] n
    Simple Audio Amplifier (SND_SOC_SIMPLE_AMPLIFIER) [M/n/?] m
    Simple Audio Mux (SND_SOC_SIMPLE_MUX) [N/m/?] n
    Iron Device SMA1303 Audio Amplifier (SND_SOC_SMA1303) [N/m/?] (NEW)
    S/PDIF CODEC (SND_SOC_SPDIF) [M/n/?] m
    Texas Instruments SRC4XXX DIR/DIT and SRC codecs (SND_SOC_SRC4XXX_I2C) [N/m/?] n
    Analog Devices SSM2305 Class-D Amplifier (SND_SOC_SSM2305) [N/m/?] n
    Analog Devices SSM2518 Class-D Amplifier (SND_SOC_SSM2518) [N/m/?] n
    Analog Devices SSM2602 CODEC - SPI (SND_SOC_SSM2602_SPI) [N/m/?] n
    Analog Devices SSM2602 CODEC - I2C (SND_SOC_SSM2602_I2C) [N/m/?] n
    Analog Devices ssm4567 amplifier driver support (SND_SOC_SSM4567) [M/n/?] m
    STA326, STA328 and STA329 speaker amplifier (SND_SOC_STA32X) [N/m/?] n
    STA350 speaker amplifier (SND_SOC_STA350) [N/m/?] n
    codec Audio support for STI SAS codec (SND_SOC_STI_SAS) [N/m/?] n
    Texas Instruments TAS2552 Mono Audio amplifier (SND_SOC_TAS2552) [N/m/?] n
    Texas Instruments TAS2562 Mono Audio amplifier (SND_SOC_TAS2562) [N/m/?] n
    Texas Instruments TAS2764 Mono Audio amplifier (SND_SOC_TAS2764) [N/m/?] n
    Texas Instruments TAS2770 speaker amplifier (SND_SOC_TAS2770) [N/m/?] n
    Texas Instruments TAS2780 Mono Audio amplifier (SND_SOC_TAS2780) [N/m/?] n
    Texas Instruments TAS2781 speaker amplifier based on I2C (SND_SOC_TAS2781_I2C) [N/m/?] (NEW)
    Texas Instruments TAS5086 speaker amplifier (SND_SOC_TAS5086) [N/m/?] n
    Texas Instruments TAS571x power amplifiers (SND_SOC_TAS571X) [N/m/?] n
    Texas Instruments TAS5720 Mono Audio amplifier (SND_SOC_TAS5720) [N/m/?] n
    Texas Instruments TAS5805M speaker amplifier (SND_SOC_TAS5805M) [N/m/?] n
    Texas Instruments TAS6424 Quad-Channel Audio amplifier (SND_SOC_TAS6424) [M/n/?] m
    ST TDA7419 audio processor (SND_SOC_TDA7419) [M/n/?] m
    NXP Semiconductors TFA9879 amplifier (SND_SOC_TFA9879) [N/m/?] n
    NXP/Goodix TFA989X (TFA1) amplifiers (SND_SOC_TFA989X) [N/m/?] n
    Texas Instruments TLV320ADC3001/3101 audio ADC (SND_SOC_TLV320ADC3XXX) [N/m/?] n
    Texas Instruments TLV320AIC23 audio CODEC - I2C (SND_SOC_TLV320AIC23_I2C) [N/m/?] n
    Texas Instruments TLV320AIC23 audio CODEC - SPI (SND_SOC_TLV320AIC23_SPI) [N/m/?] n
    Texas Instruments TLV320AIC31xx CODECs (SND_SOC_TLV320AIC31XX) [N/m/?] n
    Texas Instruments TLV320AIC32x4 audio CODECs - I2C (SND_SOC_TLV320AIC32X4_I2C) [M/n/?] m
    Texas Instruments TLV320AIC32x4 audio CODECs - SPI (SND_SOC_TLV320AIC32X4_SPI) [M/n/?] m
    Texas Instruments TLV320AIC3x audio CODECs - I2C (SND_SOC_TLV320AIC3X_I2C) [N/m/?] n
    Texas Instruments TLV320AIC3x audio CODECs - SPI (SND_SOC_TLV320AIC3X_SPI) [N/m/?] n
    Texas Instruments TLV320ADCX140 CODEC family (SND_SOC_TLV320ADCX140) [N/m/?] n
    TI Headset/Mic detect and keypress chip (SND_SOC_TS3A227E) [M/?] m
    Tempo Semiconductor TSCS42xx CODEC (SND_SOC_TSCS42XX) [M/n/?] m
    Tempo Semiconductor TSCS454 CODEC (SND_SOC_TSCS454) [N/m/?] n
    NXP UDA1334 DAC (SND_SOC_UDA1334) [N/m/?] n
    WCD9370/WCD9375 Codec - SDW (SND_SOC_WCD937X_SDW) [N/m/?] (NEW)
    WCD9380/WCD9385 Codec - SDW (SND_SOC_WCD938X_SDW) [N/m/?] n
    WCD9390/WCD9395 Codec - SDW (SND_SOC_WCD939X_SDW) [N/m/?] (NEW)
    Wolfson Microelectronics WM8510 CODEC (SND_SOC_WM8510) [N/m/?] n
    Wolfson Microelectronics WM8523 DAC (SND_SOC_WM8523) [N/m/?] n
    Wolfson Microelectronics WM8524 DAC (SND_SOC_WM8524) [M/n/?] m
    Wolfson Microelectronics WM8580 and WM8581 CODECs (SND_SOC_WM8580) [N/m/?] n
    Wolfson Microelectronics WM8711 CODEC (SND_SOC_WM8711) [N/m/?] n
    Wolfson Microelectronics WM8728 DAC (SND_SOC_WM8728) [N/m/?] n
    Wolfson Microelectronics WM8731 CODEC with I2C (SND_SOC_WM8731_I2C) [N/m/?] n
    Wolfson Microelectronics WM8731 CODEC with SPI (SND_SOC_WM8731_SPI) [N/m/?] n
    Wolfson Microelectronics WM8737 ADC (SND_SOC_WM8737) [N/m/?] n
    Wolfson Microelectronics WM8741 DAC (SND_SOC_WM8741) [N/m/?] n
    Wolfson Microelectronics WM8750 CODEC (SND_SOC_WM8750) [N/m/?] n
    Wolfson Microelectronics WM8753 CODEC (SND_SOC_WM8753) [N/m/?] n
    Wolfson Microelectronics WM8770 CODEC (SND_SOC_WM8770) [N/m/?] n
    Wolfson Microelectronics WM8776 CODEC (SND_SOC_WM8776) [N/m/?] n
    Wolfson Microelectronics WM8782 ADC (SND_SOC_WM8782) [N/m/?] n
    Wolfson Microelectronics WM8804 S/PDIF transceiver I2C (SND_SOC_WM8804_I2C) [N/m/?] n
    Wolfson Microelectronics WM8804 S/PDIF transceiver SPI (SND_SOC_WM8804_SPI) [N/m/?] n
    Wolfson Microelectronics WM8903 CODEC (SND_SOC_WM8903) [N/m/?] n
    Wolfson Microelectronics WM8904 CODEC (SND_SOC_WM8904) [N/m/?] n
    Wolfson Microelectronics WM8940 codec (SND_SOC_WM8940) [N/m/?] n
    Wolfson Microelectronics WM8960 CODEC (SND_SOC_WM8960) [N/m/?] n
    Wolfson Microelectronics WM8961 CODEC (SND_SOC_WM8961) [N/m/?] (NEW)
    Wolfson Microelectronics WM8962 CODEC (SND_SOC_WM8962) [N/m/?] n
    Wolfson Microelectronics WM8974 codec (SND_SOC_WM8974) [N/m/?] n
    Wolfson Microelectronics WM8978 codec (SND_SOC_WM8978) [N/m/?] n
    Wolfson Microelectronics WM8985 and WM8758 codec driver (SND_SOC_WM8985) [N/m/?] n
    WSA881X Codec (SND_SOC_WSA881X) [N/m/?] n
    WSA883X Codec (SND_SOC_WSA883X) [N/m/?] n
    WSA884X Codec (SND_SOC_WSA884X) [N/m/?] (NEW)
    Microsemi ZL38060 Connected Home Audio Processor (SND_SOC_ZL38060) [N/m/?] n
    Maxim MAX9759 speaker Amplifier (SND_SOC_MAX9759) [M/n/?] m
    MediaTek MT6351 Codec (SND_SOC_MT6351) [N/m/?] n
    MediaTek MT6357 Codec (SND_SOC_MT6357) [N/m/?] (NEW)
    MediaTek MT6358 Codec (SND_SOC_MT6358) [N/m/?] n
    Mediatek MT6660 Speaker Amplifier (SND_SOC_MT6660) [N/m/?] n
    Nuvoton Technology Corporation NAU8315 CODEC (SND_SOC_NAU8315) [N/m/?] n
    Nuvoton Technology Corporation NAU85L40 CODEC (SND_SOC_NAU8540) [M/n/?] m
    Nuvoton Technology Corporation NAU88C10 CODEC (SND_SOC_NAU8810) [N/m/?] n
    Nuvoton Technology Corporation NAU88L21 CODEC (SND_SOC_NAU8821) [N/m/?] n
    Nuvoton Technology Corporation NAU88C22 CODEC (SND_SOC_NAU8822) [N/m/?] n
    Nuvoton Technology Corporation NAU88L24 CODEC (SND_SOC_NAU8824) [M/?] m
    Texas Instruments TPA6130A2 headphone amplifier (SND_SOC_TPA6130A2) [N/m/?] n
    Qualcomm WSA Macro in LPASS(Low Power Audio SubSystem) (SND_SOC_LPASS_WSA_MACRO) [N/m/?] n
    Qualcomm VA Macro in LPASS(Low Power Audio SubSystem) (SND_SOC_LPASS_VA_MACRO) [N/m/?] n
    Qualcomm RX Macro in LPASS(Low Power Audio SubSystem) (SND_SOC_LPASS_RX_MACRO) [N/m/?] n
    Qualcomm TX Macro in LPASS(Low Power Audio SubSystem) (SND_SOC_LPASS_TX_MACRO) [N/m/?] n
    ASoC Simple sound card support (SND_SIMPLE_CARD) [M/n/?] m
  Xen para-virtualized sound frontend driver (SND_XEN_FRONTEND) [N/m/?] n
*
* HID bus support
*
HID bus support (HID_SUPPORT) [Y/n/?] (NEW)
  HID bus core support (HID) [Y/?] y
    Battery level reporting for HID devices (HID_BATTERY_STRENGTH) [Y/n/?] y
    /dev/hidraw raw HID device support (HIDRAW) [Y/n/?] y
    User-space I/O driver support for HID subsystem (UHID) [M/n/y/?] m
    Generic HID driver (HID_GENERIC) [Y/n/m/?] y
    *
    * Special HID drivers
    *
    A4TECH mice (HID_A4TECH) [M/n/y/?] m
    Accutouch touch device (HID_ACCUTOUCH) [M/n/y/?] m
    ACRUX game controller support (HID_ACRUX) [M/n/y/?] m
      ACRUX force feedback support (HID_ACRUX_FF) [Y/n/?] y
    Apple {i,Power,Mac}Books (HID_APPLE) [M/n/y/?] m
    Apple infrared receiver (HID_APPLEIR) [M/n/y/?] m
    Asus (HID_ASUS) [M/n/?] m
    Aureal (HID_AUREAL) [M/n/y/?] m
    Belkin Flip KVM and Wireless keyboard (HID_BELKIN) [M/n/y/?] m
    Betop Production Inc. force feedback support (HID_BETOP_FF) [M/n/y/?] m
    BigBen Interactive Kids' gamepad support (HID_BIGBEN_FF) [M/n/y/?] m
    Cherry Cymotion keyboard (HID_CHERRY) [M/n/y/?] m
    Chicony devices (HID_CHICONY) [M/n/y/?] m
    Corsair devices (HID_CORSAIR) [M/n/y/?] m
    Cougar devices (HID_COUGAR) [M/n/y/?] m
    Macally devices (HID_MACALLY) [M/n/y/?] m
    Prodikeys PC-MIDI Keyboard support (HID_PRODIKEYS) [M/n/?] m
    CMedia audio chips (HID_CMEDIA) [M/n/y/?] m
    Silicon Labs CP2112 HID USB-to-SMBus Bridge support (HID_CP2112) [M/n/?] m
    Creative SB0540 infrared receiver (HID_CREATIVE_SB0540) [N/m/y/?] n
    Cypress mouse and barcode readers (HID_CYPRESS) [M/n/y/?] m
    DragonRise Inc. game controller (HID_DRAGONRISE) [M/n/y/?] m
      DragonRise Inc. force feedback (DRAGONRISE_FF) [Y/n/?] y
    EMS Production Inc. force feedback support (HID_EMS_FF) [M/n/y/?] m
    ELAN USB Touchpad Support (HID_ELAN) [M/n/y/?] m
    ELECOM HID devices (HID_ELECOM) [M/n/y/?] m
    ELO USB 4000/4500 touchscreen (HID_ELO) [M/n/y/?] m
    EVision Keyboards Support (HID_EVISION) [N/m/y/?] (NEW)
    Ezkey BTC 8193 keyboard (HID_EZKEY) [M/n/y/?] m
    FTDI FT260 USB HID to I2C host support (HID_FT260) [N/m/?] n
    Gembird Joypad (HID_GEMBIRD) [M/n/y/?] m
    Google Fiber TV Box remote control support (HID_GFRM) [M/n/y/?] m
    Glorious PC Gaming Race mice (HID_GLORIOUS) [N/m/y/?] n
    Holtek HID devices (HID_HOLTEK) [M/n/y/?] m
      Holtek On Line Grip force feedback support (HOLTEK_FF) [Y/n/?] y
    Goodix GT7986U SPI HID touchscreen (HID_GOODIX_SPI) [N/m/y/?] (NEW)
    Google Stadia force feedback (HID_GOOGLE_STADIA_FF) [N/m/y/?] (NEW)
    Vivaldi Keyboard (HID_VIVALDI) [N/m/y/?] n
    MSI GT68xR LED support (HID_GT683R) [M/n/y/?] m
    Keytouch HID devices (HID_KEYTOUCH) [M/n/y/?] m
    KYE/Genius devices (HID_KYE) [M/n/y/?] m
    UC-Logic (HID_UCLOGIC) [M/n/y/?] m
    Waltop (HID_WALTOP) [M/n/y/?] m
    ViewSonic/Signotec (HID_VIEWSONIC) [M/n/y/?] m
    VRC-2 Car Controller (HID_VRC2) [N/m/y/?] n
    Xiaomi (HID_XIAOMI) [N/m/y/?] n
    Gyration remote control (HID_GYRATION) [M/n/y/?] m
    ION iCade arcade controller (HID_ICADE) [M/n/y/?] m
    ITE devices (HID_ITE) [M/n/y/?] m
    Jabra USB HID Driver (HID_JABRA) [M/n/y/?] m
    Twinhan IR remote control (HID_TWINHAN) [M/n/y/?] m
    Kensington Slimblade Trackball (HID_KENSINGTON) [M/n/y/?] m
    LC-Power (HID_LCPOWER) [M/n/y/?] m
    Simple RGB LED support (HID_LED) [M/y/?] m
    Lenovo / Thinkpad devices (HID_LENOVO) [M/n/y/?] m
    Letsketch WP9620N tablets (HID_LETSKETCH) [N/m/y/?] n
    Logitech devices (HID_LOGITECH) [M/n/y/?] m
      Logitech receivers full support (HID_LOGITECH_DJ) [M/n/?] m
      Logitech HID++ devices support (HID_LOGITECH_HIDPP) [M/?] m
      Logitech force feedback support (LOGITECH_FF) [Y/n/?] y
      Logitech force feedback support (variant 2) (LOGIRUMBLEPAD2_FF) [Y/n/?] y
      Logitech Flight System G940 force feedback support (LOGIG940_FF) [Y/n/?] y
      Logitech wheels configuration and force feedback support (LOGIWHEELS_FF) [Y/n/?] y
    Apple Magic Mouse/Trackpad multi-touch support (HID_MAGICMOUSE) [Y/n/m/?] y
    Maltron L90 keyboard (HID_MALTRON) [M/n/y/?] m
    Mayflash game controller adapter force feedback (HID_MAYFLASH) [M/n/y/?] m
    Mega World based game controller force feedback support (HID_MEGAWORLD_FF) [N/m/y/?] n
    Redragon keyboards (HID_REDRAGON) [N/m/y/?] n
    Microsoft non-fully HID-compliant devices (HID_MICROSOFT) [M/n/y/?] m
    Monterey Genius KB29E keyboard (HID_MONTEREY) [M/n/y/?] m
    HID Multitouch panels (HID_MULTITOUCH) [M/n/y/?] m
    Nintendo Joy-Con, NSO, and Pro Controller support (HID_NINTENDO) [N/m/y/?] n
    NTI keyboard adapters (HID_NTI) [M/n/y/?] m
    N-Trig touch screen (HID_NTRIG) [Y/n/m/?] y
    NVIDIA SHIELD devices (HID_NVIDIA_SHIELD) [N/m/?] (NEW)
    Ortek PKB-1700/WKB-2000/Skycable wireless keyboard and mouse trackpad (HID_ORTEK) [M/n/y/?] m
    Pantherlord/GreenAsia game controller (HID_PANTHERLORD) [M/n/y/?] m
      Pantherlord force feedback support (PANTHERLORD_FF) [Y/n/?] y
    Penmount touch device (HID_PENMOUNT) [M/n/y/?] m
    Petalynx Maxter remote control (HID_PETALYNX) [M/n/y/?] m
    PicoLCD (graphic version) (HID_PICOLCD) [M/n/y/?] m
    Plantronics USB HID Driver (HID_PLANTRONICS) [M/n/y/?] m
    PhoenixRC HID Flight Controller (HID_PXRC) [N/m/y/?] n
    Razer non-fully HID-compliant devices (HID_RAZER) [N/m/y/?] n
    Primax non-fully HID-compliant devices (HID_PRIMAX) [M/n/y/?] m
    Retrode 2 USB adapter for vintage video games (HID_RETRODE) [M/n/y/?] m
    Roccat device support (HID_ROCCAT) [M/n/y/?] m
    Saitek (Mad Catz) non-fully HID-compliant devices (HID_SAITEK) [M/n/y/?] m
    Samsung InfraRed remote control or keyboards (HID_SAMSUNG) [M/n/y/?] m
    Semitek USB keyboards (HID_SEMITEK) [N/m/y/?] n
    SiGma Micro-based keyboards (HID_SIGMAMICRO) [N/m/y/?] n
    Sony PS2/3/4 accessories (HID_SONY) [M/n/y/?] m
      Sony PS2/3/4 accessories force feedback support (SONY_FF) [Y/n/?] y
    Speedlink VAD Cezanne mouse support (HID_SPEEDLINK) [M/n/y/?] m
    Steam Controller/Deck support (HID_STEAM) [M/n/y/?] m
      Steam Deck force feedback support (STEAM_FF) [N/y/?] (NEW)
    Steelseries devices support (HID_STEELSERIES) [M/n/y/?] m
    Sunplus wireless desktop (HID_SUNPLUS) [M/n/y/?] m
    Synaptics RMI4 device support (HID_RMI) [M/n/y/?] m
    GreenAsia (Product ID 0x12) game controller support (HID_GREENASIA) [M/n/y/?] m
      GreenAsia (Product ID 0x12) force feedback support (GREENASIA_FF) [Y/n/?] y
    SmartJoy PLUS PS2/USB adapter support (HID_SMARTJOYPLUS) [M/n/y/?] m
      SmartJoy PLUS PS2/USB adapter force feedback support (SMARTJOYPLUS_FF) [Y/n/?] y
    TiVo Slide Bluetooth remote control support (HID_TIVO) [M/n/y/?] m
    TopSeed Cyberlink, BTC Emprex, Conceptronic remote control support (HID_TOPSEED) [M/n/y/?] m
    Topre REALFORCE keyboards (HID_TOPRE) [N/m/y/?] n
    ThingM blink(1) USB RGB LED (HID_THINGM) [M/n/y/?] m
    ThrustMaster devices support (HID_THRUSTMASTER) [M/n/y/?] m
      ThrustMaster devices force feedback support (THRUSTMASTER_FF) [Y/n/?] y
    THQ PS3 uDraw tablet (HID_UDRAW_PS3) [M/n/y/?] m
    U2F Zero LED and RNG support (HID_U2FZERO) [M/n/y/?] m
    Wacom Intuos/Graphire tablet support (USB) (HID_WACOM) [M/n/y/?] m
    Nintendo Wii / Wii U peripherals (HID_WIIMOTE) [M/n/y/?] m
    WinWing Orion2 throttle support (HID_WINWING) [N/m/y/?] (NEW)
    Xin-Mo non-fully compliant devices (HID_XINMO) [M/n/y/?] m
    Zeroplus based game controller support (HID_ZEROPLUS) [M/n/y/?] m
      Zeroplus based game controller force feedback support (ZEROPLUS_FF) [Y/n/?] y
    Zydacron remote control support (HID_ZYDACRON) [M/n/y/?] m
    HID Sensors framework support (HID_SENSOR_HUB) [M/n/y/?] m
      HID Sensors hub custom sensor support (HID_SENSOR_CUSTOM_SENSOR) [N/m/?] n
    Alps HID device support (HID_ALPS) [M/n/y/?] m
    Microchip MCP2200 HID USB-to-GPIO bridge (HID_MCP2200) [N/m/y/?] (NEW)
    Microchip MCP2221 HID USB-to-I2C/SMbus host support (HID_MCP2221) [N/m/?] n
    *
    * HID-BPF support
    *
    HID-BPF support (HID_BPF) [N/y/?] (NEW)
  *
  * I2C HID support
  *
  I2C HID support (I2C_HID) [M/n/?] (NEW)
    HID over I2C transport layer ACPI driver (I2C_HID_ACPI) [N/m/?] n
    HID over I2C transport layer Open Firmware driver (I2C_HID_OF) [N/m/?] (NEW)
*
* USB support
*
USB support (USB_SUPPORT) [Y/n/?] y
  USB LED Triggers (USB_LED_TRIG) [Y/n/?] y
  USB ULPI PHY interface support (USB_ULPI_BUS) [M/n/y/?] m
  USB GPIO Based Connection Detection Driver (USB_CONN_GPIO) [N/m/y/?] n
  Support for Host-side USB (USB) [Y/m/?] y
  PCI based USB host interface (USB_PCI) [Y/n/?] y
    AMD PCI USB host support (USB_PCI_AMD) [Y/n/?] (NEW)
  USB announce new devices (USB_ANNOUNCE_NEW_DEVICES) [Y/n/?] y
  *
  * Miscellaneous USB options
  *
  Enable USB persist by default (USB_DEFAULT_PERSIST) [Y/n/?] y
  Limit USB device initialization to only a few retries (USB_FEW_INIT_RETRIES) [N/y/?] n
  Dynamic USB minor allocation (USB_DYNAMIC_MINORS) [N/y/?] n
  OTG support (USB_OTG) [N/y/?] n
  Rely on OTG and EH Targeted Peripherals List (USB_OTG_PRODUCTLIST) [N/y/?] n
  USB port LED trigger (USB_LEDS_TRIGGER_USBPORT) [M/n/y/?] m
  Default autosuspend delay (USB_AUTOSUSPEND_DELAY) [2] 2
  Default authorization mode for USB devices (USB_DEFAULT_AUTHORIZATION_MODE) [1] (NEW)
  USB Monitor (USB_MON) [Y/n/m/?] y
  *
  * USB Host Controller Drivers
  *
  Cypress C67x00 HCD support (USB_C67X00_HCD) [N/m/y/?] n
  xHCI HCD (USB 3.0) support (USB_XHCI_HCD) [M/n/y/?] m
    xHCI support for debug capability (USB_XHCI_DBGCAP) [Y/n/?] y
    Support for additional Renesas xHCI controller with firmware (USB_XHCI_PCI_RENESAS) [M/n/?] m
    Generic xHCI driver for a platform device (USB_XHCI_PLATFORM) [M/n/?] m
  EHCI HCD (USB 2.0) support (USB_EHCI_HCD) [M/n/y/?] m
    Root Hub Transaction Translators (USB_EHCI_ROOT_HUB_TT) [Y/n/?] y
    Improved Transaction Translator scheduling (USB_EHCI_TT_NEWSCHED) [Y/n/?] y
    Support for Freescale on-chip EHCI USB controller (USB_EHCI_FSL) [N/m/?] n
    Generic EHCI driver for a platform device (USB_EHCI_HCD_PLATFORM) [N/m/?] n
  OXU210HP HCD support (USB_OXU210HP_HCD) [N/m/y/?] n
  ISP116X HCD support (USB_ISP116X_HCD) [N/m/y/?] n
  MAX3421 HCD (USB-over-SPI) support (USB_MAX3421_HCD) [N/m/y/?] n
  OHCI HCD (USB 1.1) support (USB_OHCI_HCD) [M/n/y/?] m
    OHCI support for PCI-bus USB controllers (USB_OHCI_HCD_PCI) [M/n/?] m
    OHCI support for Broadcom SSB OHCI core (DEPRECATED) (USB_OHCI_HCD_SSB) [N/y/?] n
    Generic OHCI driver for a platform device (USB_OHCI_HCD_PLATFORM) [N/m/?] n
  UHCI HCD (most Intel and VIA) support (USB_UHCI_HCD) [M/n/y/?] m
  SL811HS HCD support (USB_SL811_HCD) [M/n/y/?] m
    partial ISO support (USB_SL811_HCD_ISO) [Y/n/?] y
    CF/PCMCIA support for SL811HS HCD (USB_SL811_CS) [N/m/?] n
  R8A66597 HCD support (USB_R8A66597_HCD) [N/m/y/?] n
  BCMA usb host driver (USB_HCD_BCMA) [N/m/?] n
  SSB usb host driver (USB_HCD_SSB) [N/m/?] n
  HCD test mode support (USB_HCD_TEST_MODE) [N/y/?] n
  Xen usb virtual host driver (USB_XEN_HCD) [N/m/y/?] n
  *
  * USB Device Class drivers
  *
  USB Modem (CDC ACM) support (USB_ACM) [M/y/?] m
  USB Printer support (USB_PRINTER) [M/n/y/?] m
  USB Wireless Device Management support (USB_WDM) [M/y/?] m
  USB Test and Measurement Class support (USB_TMC) [M/n/y/?] m
  *
  * NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may
  *
  *
  * also be needed; see USB_STORAGE Help for more info
  *
  USB Mass Storage support (USB_STORAGE) [M/n/y/?] m
    USB Mass Storage verbose debug (USB_STORAGE_DEBUG) [N/y/?] n
    Realtek Card Reader support (USB_STORAGE_REALTEK) [M/n/?] m
      Realtek Card Reader autosuspend support (REALTEK_AUTOPM) [Y/n/?] y
    Datafab Compact Flash Reader support (USB_STORAGE_DATAFAB) [M/n/?] m
    Freecom USB/ATAPI Bridge support (USB_STORAGE_FREECOM) [M/n/?] m
    ISD-200 USB/ATA Bridge support (USB_STORAGE_ISD200) [M/n/?] m
    USBAT/USBAT02-based storage support (USB_STORAGE_USBAT) [M/n/?] m
    SanDisk SDDR-09 (and other SmartMedia, including DPCM) support (USB_STORAGE_SDDR09) [M/n/?] m
    SanDisk SDDR-55 SmartMedia support (USB_STORAGE_SDDR55) [M/n/?] m
    Lexar Jumpshot Compact Flash Reader (USB_STORAGE_JUMPSHOT) [M/n/?] m
    Olympus MAUSB-10/Fuji DPC-R1 support (USB_STORAGE_ALAUDA) [M/n/?] m
    Support OneTouch Button on Maxtor Hard Drives (USB_STORAGE_ONETOUCH) [M/n/?] m
    Support for Rio Karma music player (USB_STORAGE_KARMA) [M/n/?] m
    SAT emulation on Cypress USB/ATA Bridge with ATACB (USB_STORAGE_CYPRESS_ATACB) [M/n/?] m
    USB ENE card reader support (USB_STORAGE_ENE_UB6250) [M/n/?] m
    USB Attached SCSI (USB_UAS) [M/n/?] m
  *
  * USB Imaging devices
  *
  USB Mustek MDC800 Digital Camera support (USB_MDC800) [M/n/y/?] m
  Microtek X6USB scanner support (USB_MICROTEK) [M/n/y/?] m
  USB/IP support (USBIP_CORE) [M/n/y/?] m
    VHCI hcd (USBIP_VHCI_HCD) [M/n/?] m
      Number of ports per USB/IP virtual host controller (USBIP_VHCI_HC_PORTS) [8] 8
      Number of USB/IP virtual host controllers (USBIP_VHCI_NR_HCS) [1] 1
    Host driver (USBIP_HOST) [M/n/?] m
    Debug messages for USB/IP (USBIP_DEBUG) [N/y/?] n
  *
  * USB dual-mode controller drivers
  *
  Cadence USB Support (USB_CDNS_SUPPORT) [N/m/y/?] n
  Inventra Highspeed Dual Role Controller (USB_MUSB_HDRC) [N/m/y/?] n
  DesignWare USB3 DRD Core Support (USB_DWC3) [N/m/y/?] n
  DesignWare USB2 DRD Core Support (USB_DWC2) [N/m/y/?] n
  ChipIdea Highspeed Dual Role Controller (USB_CHIPIDEA) [N/m/?] n
  NXP ISP 1760/1761/1763 support (USB_ISP1760) [N/m/y/?] n
  *
  * USB port drivers
  *
  *
  * USB Miscellaneous drivers
  *
  USS720 parport driver (USB_USS720) [M/n/?] m
  EMI 6|2m USB Audio interface support (USB_EMI62) [M/n/y/?] m
  EMI 2|6 USB Audio interface support (USB_EMI26) [M/n/y/?] m
  ADU devices from Ontrak Control Systems (USB_ADUTUX) [M/n/y/?] m
  USB 7-Segment LED Display (USB_SEVSEG) [M/n/y/?] m
  USB Lego Infrared Tower support (USB_LEGOTOWER) [M/n/y/?] m
  USB LCD driver support (USB_LCD) [M/n/y/?] m
  Cypress CY7C63xxx USB driver support (USB_CYPRESS_CY7C63) [N/m/y/?] n
  Cypress USB thermometer driver support (USB_CYTHERM) [N/m/y/?] n
  Siemens ID USB Mouse Fingerprint sensor support (USB_IDMOUSE) [M/n/y/?] m
  Apple Cinema Display support (USB_APPLEDISPLAY) [M/n/y/?] m
  Fast charge control for iOS devices (APPLE_MFI_FASTCHARGE) [M/n/y/?] m
  Intel La Jolla Cove Adapter support (USB_LJCA) [N/m/y/?] (NEW)
  USB 2.0 SVGA dongle support (Net2280/SiS315) (USB_SISUSBVGA) [M/n/?] m
  USB LD driver (USB_LD) [M/n/y/?] m
  PlayStation 2 Trance Vibrator driver support (USB_TRANCEVIBRATOR) [M/n/y/?] m
  IO Warrior driver support (USB_IOWARRIOR) [M/n/y/?] m
  USB testing driver (USB_TEST) [N/m/y/?] n
  USB EHSET Test Fixture driver (USB_EHSET_TEST_FIXTURE) [N/m/y/?] n
  iSight firmware loading support (USB_ISIGHTFW) [M/n/y/?] m
  USB YUREX driver support (USB_YUREX) [M/n/y/?] m
  Functions for loading firmware on EZUSB chips (USB_EZUSB_FX2) [M/y/?] m
  USB251XB Hub Controller Configuration Driver (USB_HUB_USB251XB) [M/n/?] m
  USB3503 HSIC to USB20 Driver (USB_HSIC_USB3503) [M/n/?] m
  USB4604 HSIC to USB20 Driver (USB_HSIC_USB4604) [M/n/?] m
  USB Link Layer Test driver (USB_LINK_LAYER_TEST) [N/m/y/?] n
  ChaosKey random number generator driver support (USB_CHAOSKEY) [M/n/y/?] m
  *
  * USB Type-C Multiplexer/DeMultiplexer Switch support
  *
  ON Semi FSA4480 Analog Audio Switch driver (TYPEC_MUX_FSA4480) [N/m/?] n
  Generic GPIO based SBU mux for USB Type-C applications (TYPEC_MUX_GPIO_SBU) [N/m/?] (NEW)
  Pericom PI3USB30532 Type-C cross switch driver (TYPEC_MUX_PI3USB30532) [M/n/?] m
  ITE IT5205 Type-C USB Alt Mode Passive MUX driver (TYPEC_MUX_IT5205) [N/m/?] (NEW)
  On Semiconductor NB7VPQ904M Type-C redriver driver (TYPEC_MUX_NB7VPQ904M) [N/m/?] (NEW)
  NXP PTN36502 Type-C redriver driver (TYPEC_MUX_PTN36502) [N/m/?] (NEW)
  Qualcomm WCD939x USBSS Analog Audio Switch driver (TYPEC_MUX_WCD939X_USBSS) [N/m/?] (NEW)
  USB Role Switch Support (USB_ROLE_SWITCH) [M/y/?] m
    Intel XHCI USB Role Switch (USB_ROLES_INTEL_XHCI) [M/n/?] m
*
* LED Support
*
LED Support (NEW_LEDS) [Y/?] y
  LED Class Support (LEDS_CLASS) [Y/m/?] y
    LED Flash Class Support (LEDS_CLASS_FLASH) [M/n/y/?] m
    LED Multicolor Class Support (LEDS_CLASS_MULTICOLOR) [N/m/y/?] n
    LED Class brightness_hw_changed attribute support (LEDS_BRIGHTNESS_HW_CHANGED) [Y/n/?] y
  *
  * LED drivers
  *
  Front panel LED support for PC Engines APU/APU2/APU3 boards (LEDS_APU) [M/n/y/?] m
  LED support for Awinic AW20036/AW20054/AW20072/AW20108 (LEDS_AW200XX) [N/m/?] (NEW)
  LCD Backlight driver for LM3530 (LEDS_LM3530) [M/n/?] m
  LCD Backlight driver for LM3532 (LEDS_LM3532) [M/n/?] m
  LED support for LM3642 Chip (LEDS_LM3642) [N/m/?] n
  LED driver for PCA9532 dimmer (LEDS_PCA9532) [M/n/?] m
    Enable GPIO support for PCA9532 (LEDS_PCA9532_GPIO) [Y/n/?] y
  LED Support for GPIO connected LEDs (LEDS_GPIO) [M/y/?] m
  LED Support for N.S. LP3944 (Fun Light) I2C chip (LEDS_LP3944) [M/n/?] m
  LED Support for TI LP3952 2 channel LED driver (LEDS_LP3952) [M/n/?] m
  LED Support for PCA955x I2C chips (LEDS_PCA955X) [N/m/?] n
  LED support for PCA963x I2C chip (LEDS_PCA963X) [N/m/?] n
  LED Support for PCA995x I2C chips (LEDS_PCA995X) [N/m/?] (NEW)
  LED Support for DAC124S085 SPI DAC (LEDS_DAC124S085) [N/m/y/?] n
  PWM driven LED Support (LEDS_PWM) [N/m/y/?] n
  REGULATOR driven LED support (LEDS_REGULATOR) [N/m/y/?] n
  LED driver for BD2606MVV (LEDS_BD2606MVV) [N/m/?] (NEW)
  LED driver for BD2802 RGB LED (LEDS_BD2802) [N/m/?] n
  LED driver for Intel NAS SS4200 series (LEDS_INTEL_SS4200) [M/n/y/?] m
  LED driver for LT3593 controllers (LEDS_LT3593) [N/m/y/?] n
  LED Support for TCA6507 I2C chip (LEDS_TCA6507) [N/m/?] n
  LED driver for TLC59108 and TLC59116 controllers (LEDS_TLC591XX) [N/m/?] n
  LED support for LM3554 and LM3556 chips (LEDS_LM355x) [N/m/?] n
  LED Support for ISSI IS31FL319x I2C LED controller family (LEDS_IS31FL319X) [N/m/?] n
  *
  * LED driver for blink(1) USB RGB LED is under Special HID drivers (HID_THINGM)
  *
  LED support for the BlinkM I2C RGB LED (LEDS_BLINKM) [M/n/?] m
  LED support for the Mellanox boards (LEDS_MLXCPLD) [M/n/y/?] m
  LED support for the Mellanox switches management control (LEDS_MLXREG) [M/n/y/?] m
  Userspace LED support (LEDS_USER) [M/n/y/?] m
  LED support for NI PXI NIC78bx devices (LEDS_NIC78BX) [M/n/y/?] m
  LED support for SPI LED controller with a single byte (LEDS_SPI_BYTE) [N/m/y/?] (NEW)
  *
  * Flash and Torch LED drivers
  *
  AS3645A and LM3555 LED flash controllers support (LEDS_AS3645A) [M/n/?] m
  LED support for LM3601x Chips (LEDS_LM3601X) [M/n/?] m
  LED support for Richtek RT8515 flash/torch LED (LEDS_RT8515) [N/m/?] n
  LED support for the SGM3140 (LEDS_SGM3140) [N/m/?] n
  *
  * RGB LED drivers
  *
  *
  * LED Triggers
  *
  *
  * LED Trigger support
  *
  LED Trigger support (LEDS_TRIGGERS) [Y/?] y
    LED Timer Trigger (LEDS_TRIGGER_TIMER) [M/n/y/?] m
    LED One-shot Trigger (LEDS_TRIGGER_ONESHOT) [M/n/y/?] m
    LED Disk Trigger (LEDS_TRIGGER_DISK) [Y/n/?] y
    LED MTD (NAND/NOR) Trigger (LEDS_TRIGGER_MTD) [Y/n/?] y
    LED Heartbeat Trigger (LEDS_TRIGGER_HEARTBEAT) [M/n/y/?] m
    LED backlight Trigger (LEDS_TRIGGER_BACKLIGHT) [M/n/y/?] m
    LED CPU Trigger (LEDS_TRIGGER_CPU) [N/y/?] n
    LED activity Trigger (LEDS_TRIGGER_ACTIVITY) [M/n/y/?] m
    LED GPIO Trigger (LEDS_TRIGGER_GPIO) [M/n/y/?] m
    LED Default ON Trigger (LEDS_TRIGGER_DEFAULT_ON) [M/n/y/?] m
    *
    * iptables trigger is under Netfilter config (LED target)
    *
    LED Transient Trigger (LEDS_TRIGGER_TRANSIENT) [M/n/y/?] m
    LED Camera Flash/Torch Trigger (LEDS_TRIGGER_CAMERA) [M/n/y/?] m
    LED Panic Trigger (LEDS_TRIGGER_PANIC) [Y/n/?] y
    LED Netdev Trigger (LEDS_TRIGGER_NETDEV) [M/n/y/?] m
    LED Pattern Trigger (LEDS_TRIGGER_PATTERN) [M/n/y/?] m
    LED Trigger for TTY devices (LEDS_TRIGGER_TTY) [N/m/y/?] n
    LED Input events trigger (LEDS_TRIGGER_INPUT_EVENTS) [N/m/y/?] (NEW)
  *
  * Simple LED drivers
  *
*
* Real Time Clock
*
Real Time Clock (RTC_CLASS) [Y/n/?] y
  Set system time from RTC on startup and resume (RTC_HCTOSYS) [Y/n/?] y
    RTC used to set the system time (RTC_HCTOSYS_DEVICE) [rtc0] rtc0
  Set the RTC time based on NTP synchronization (RTC_SYSTOHC) [N/y/?] n
  RTC debug support (RTC_DEBUG) [N/y/?] n
  RTC non volatile storage support (RTC_NVMEM) [Y/n/?] y
  *
  * RTC interfaces
  *
  /sys/class/rtc/rtcN (sysfs) (RTC_INTF_SYSFS) [Y/n/?] y
  /proc/driver/rtc (procfs for rtcN) (RTC_INTF_PROC) [Y/n/?] y
  /dev/rtcN (character devices) (RTC_INTF_DEV) [Y/n/?] y
    RTC UIE emulation on dev interface (RTC_INTF_DEV_UIE_EMUL) [N/y/?] n
  Test driver/device (RTC_DRV_TEST) [N/m/y/?] n
  *
  * I2C RTC drivers
  *
  Abracon AB-RTCMC-32.768kHz-B5ZE-S3 (RTC_DRV_ABB5ZES3) [N/m/?] n
  Abracon AB-RTCMC-32.768kHz-EOZ9 (RTC_DRV_ABEOZ9) [M/n/?] m
  Abracon ABx80x (RTC_DRV_ABX80X) [M/n/?] m
  Dallas/Maxim DS1307/37/38/39/40/41, ST M41T00, EPSON RX-8025, ISL12057 (RTC_DRV_DS1307) [M/n/?] m
    Century bit support for rtc-ds1307 (RTC_DRV_DS1307_CENTURY) [N/y/?] n
  Dallas/Maxim DS1374 (RTC_DRV_DS1374) [M/n/?] m
    Dallas/Maxim DS1374 watchdog timer (RTC_DRV_DS1374_WDT) [Y/n/?] y
  Dallas/Maxim DS1672 (RTC_DRV_DS1672) [M/n/?] m
  Maxim MAX6900 (RTC_DRV_MAX6900) [M/n/?] m
  Analog Devices MAX31335 (RTC_DRV_MAX31335) [N/m/?] (NEW)
  Ricoh R2025S/D, RS5C372A/B, RV5C386, RV5C387A (RTC_DRV_RS5C372) [M/n/?] m
  Intersil ISL1208 (RTC_DRV_ISL1208) [M/n/?] m
  Intersil ISL12022 (RTC_DRV_ISL12022) [M/n/?] m
  Xicor/Intersil X1205 (RTC_DRV_X1205) [M/n/?] m
  NXP PCF8523 (RTC_DRV_PCF8523) [M/n/?] m
  NXP PCF85063 (RTC_DRV_PCF85063) [M/n/?] m
  NXP PCF85363 (RTC_DRV_PCF85363) [N/m/?] n
  Philips PCF8563/Epson RTC8564 (RTC_DRV_PCF8563) [M/n/?] m
  Philips PCF8583 (RTC_DRV_PCF8583) [M/n/?] m
  ST M41T62/65/M41T80/81/82/83/84/85/87 and compatible (RTC_DRV_M41T80) [M/n/?] m
    ST M41T65/M41T80 series RTC watchdog timer (RTC_DRV_M41T80_WDT) [Y/n/?] y
  TI BQ32000 (RTC_DRV_BQ32K) [M/n/?] m
  Seiko Instruments S-35390A (RTC_DRV_S35390A) [N/m/?] n
  Ramtron FM3130 (RTC_DRV_FM3130) [M/n/?] m
  Epson RX8010SJ (RTC_DRV_RX8010) [M/n/?] m
  Epson RX8111 (RTC_DRV_RX8111) [N/m/?] (NEW)
  Epson RX-8571/RX-8581 (RTC_DRV_RX8581) [M/n/?] m
  Epson RX-8025SA/NB (RTC_DRV_RX8025) [M/n/?] m
  EM Microelectronic EM3027 (RTC_DRV_EM3027) [M/n/?] m
  Micro Crystal RV3028 (RTC_DRV_RV3028) [M/n/?] m
  Micro Crystal RV3032 (RTC_DRV_RV3032) [N/m/?] n
  Micro Crystal RV8803, Epson RX8900 (RTC_DRV_RV8803) [N/m/?] n
  DFRobot SD2405AL (RTC_DRV_SD2405AL) [N/m/?] (NEW)
  ZXW Shenzhen whwave SD3078 (RTC_DRV_SD3078) [M/n/?] m
  *
  * SPI RTC drivers
  *
  ST M41T93 (RTC_DRV_M41T93) [M/n/y/?] m
  ST M41T94 (RTC_DRV_M41T94) [M/n/y/?] m
  Dallas/Maxim DS1302 (RTC_DRV_DS1302) [N/m/y/?] n
  Dallas/Maxim DS1305/DS1306 (RTC_DRV_DS1305) [M/n/y/?] m
  Dallas/Maxim DS1343/DS1344 (RTC_DRV_DS1343) [M/n/y/?] m
  Dallas/Maxim DS1347 (RTC_DRV_DS1347) [M/n/y/?] m
  Dallas/Maxim DS1390/93/94 (RTC_DRV_DS1390) [M/n/y/?] m
  Maxim MAX6916 (RTC_DRV_MAX6916) [M/n/y/?] m
  Epson RTC-9701JE (RTC_DRV_R9701) [M/n/y/?] m
  Epson RX-4581 (RTC_DRV_RX4581) [M/n/y/?] m
  Ricoh RS5C348A/B (RTC_DRV_RS5C348) [M/n/y/?] m
  Maxim MAX6902 (RTC_DRV_MAX6902) [M/n/y/?] m
  NXP PCF2123 (RTC_DRV_PCF2123) [M/n/y/?] m
  Microchip MCP795 (RTC_DRV_MCP795) [M/n/y/?] m
  *
  * SPI and I2C RTC drivers
  *
  Dallas/Maxim DS3232/DS3234 (RTC_DRV_DS3232) [M/n/?] m
    HWMON support for Dallas/Maxim DS3232/DS3234 (RTC_DRV_DS3232_HWMON) [N/y/?] n
  NXP PCF2127 (RTC_DRV_PCF2127) [M/n/?] m
  Micro Crystal RV3029/3049 (RTC_DRV_RV3029C2) [M/n/?] m
    HWMON support for RV3029/3049 (RTC_DRV_RV3029_HWMON) [Y/n/?] y
  Epson RX-6110 (RTC_DRV_RX6110) [N/m/?] n
  *
  * Platform RTC drivers
  *
  PC-style 'CMOS' (RTC_DRV_CMOS) [Y/n/m/?] y
  Dallas DS1286 (RTC_DRV_DS1286) [M/n/y/?] m
  Dallas DS1511 (RTC_DRV_DS1511) [M/n/y/?] m
  Maxim/Dallas DS1553 (RTC_DRV_DS1553) [M/n/y/?] m
  Dallas/Maxim DS1685 Family (RTC_DRV_DS1685_FAMILY) [M/n/y/?] m
    Subtype
    > 1. DS1685/DS1687 (RTC_DRV_DS1685)
      2. DS1689/DS1693 (RTC_DRV_DS1689)
      3. DS17285/DS17287 (RTC_DRV_DS17285)
      4. DS17485/DS17487 (RTC_DRV_DS17485)
      5. DS17885/DS17887 (RTC_DRV_DS17885)
    choice[1-5?]: 1
  Maxim/Dallas DS1742/1743 (RTC_DRV_DS1742) [M/n/y/?] m
  Maxim/Dallas DS2404 (RTC_DRV_DS2404) [M/n/y/?] m
  Simtek STK17TA8 (RTC_DRV_STK17TA8) [M/n/y/?] m
  ST M48T86/Dallas DS12887 (RTC_DRV_M48T86) [N/m/y/?] n
  ST M48T35 (RTC_DRV_M48T35) [M/n/y/?] m
  ST M48T59/M48T08/M48T02 (RTC_DRV_M48T59) [M/n/y/?] m
  Oki MSM6242 (RTC_DRV_MSM6242) [M/n/y/?] m
  Ricoh RP5C01 (RTC_DRV_RP5C01) [M/n/y/?] m
  *
  * on-CPU RTC drivers
  *
  Faraday Technology FTRTC010 RTC (RTC_DRV_FTRTC010) [N/m/y/?] n
  *
  * HID Sensor RTC drivers
  *
  HID Sensor Time (RTC_DRV_HID_SENSOR_TIME) [N/m/?] n
  Goldfish Real Time Clock (RTC_DRV_GOLDFISH) [N/m/y/?] n
*
* DMA Engine support
*
DMA Engine support (DMADEVICES) [Y/n/?] y
  DMA Engine debugging (DMADEVICES_DEBUG) [N/y/?] n
  *
  * DMA Devices
  *
  Altera / Intel mSGDMA Engine (ALTERA_MSGDMA) [M/n/y/?] m
  Intel integrated DMA 64-bit support (INTEL_IDMA64) [M/n/y/?] m
  Intel Data Accelerators support (INTEL_IDXD) [M/n/y/?] m
  Legacy behavior for idxd driver (INTEL_IDXD_COMPAT) [N/y/?] n
  Accelerator Shared Virtual Memory Support (INTEL_IDXD_SVM) [Y/n/?] y
  Intel Data Accelerators performance monitor support (INTEL_IDXD_PERFMON) [N/y/?] n
  Intel I/OAT DMA support (INTEL_IOATDMA) [M/n/y/?] m
  PLX ExpressLane PEX Switch DMA Engine Support (PLX_DMA) [N/m/y/?] n
  Xilinx AXI DMAS Engine (XILINX_DMA) [N/m/y/?] (NEW)
  Xilinx DMA/Bridge Subsystem DMA Engine (XILINX_XDMA) [N/m/y/?] (NEW)
  AMD Queue-based DMA (AMD_QDMA) [N/m/y/?] (NEW)
  AMD PassThru DMA Engine (AMD_PTDMA) [N/m/y/?] n
  Qualcomm Technologies HIDMA Management support (QCOM_HIDMA_MGMT) [N/m/y/?] n
  Qualcomm Technologies HIDMA Channel support (QCOM_HIDMA) [N/m/y/?] n
  Synopsys DesignWare AHB DMA platform driver (DW_DMAC) [M/n/y/?] m
  Synopsys DesignWare AHB DMA PCI driver (DW_DMAC_PCI) [M/y/?] m
  Synopsys DesignWare eDMA controller driver (DW_EDMA) [M/n/y/?] m
    Synopsys DesignWare eDMA PCIe driver (DW_EDMA_PCIE) [M/n/?] m
  Sifive PDMA controller driver (SF_PDMA) [N/m/y/?] n
  Lightning Mountain centralized DMA controllers (INTEL_LDMA) [N/y/?] n
  *
  * DMA Clients
  *
  Async_tx: Offload support for the async_tx api (ASYNC_TX_DMA) [Y/n/?] y
  DMA Test client (DMATEST) [N/m/y/?] n
*
* VFIO Non-Privileged userspace driver framework
*
VFIO Non-Privileged userspace driver framework (VFIO) [M/n/y/?] m
  Support for the VFIO group /dev/vfio/$group_id (VFIO_GROUP) [Y/?] (NEW) y
    Support for the VFIO container /dev/vfio/vfio (VFIO_CONTAINER) [Y/?] (NEW) y
    VFIO No-IOMMU support (VFIO_NOIOMMU) [N/y/?] n
  Export VFIO internals in DebugFS (VFIO_DEBUGFS) [N/y/?] (NEW)
  *
  * VFIO support for PCI devices
  *
  Generic VFIO support for any PCI device (VFIO_PCI) [M/n/?] m
    Generic VFIO PCI support for VGA devices (VFIO_PCI_VGA) [Y/n/?] y
    Generic VFIO PCI extensions for Intel graphics (GVT-d) (VFIO_PCI_IGD) [Y/n/?] y
  VFIO support for MLX5 PCI devices (MLX5_VFIO_PCI) [N/m/?] n
  VFIO support for QAT VF PCI devices (QAT_VFIO_PCI) [N/m/?] (NEW)
*
* Media staging drivers
*
Media staging drivers (STAGING_MEDIA) [Y/n/?] y
  AV7110 cards (DVB_AV7110) [N/m/?] (NEW)
  Intel ipu3-imgu driver (VIDEO_IPU3_IMGU) [N/m/?] n
  *
  * StarFive media platform drivers
  *
*
* Platform support for Chrome hardware
*
Platform support for Chrome hardware (CHROME_PLATFORMS) [Y/n/?] y
  ChromeOS specific ACPI extensions (CHROMEOS_ACPI) [N/m/y/?] n
  Chrome OS Laptop (CHROMEOS_LAPTOP) [M/n/?] m
  Chrome OS pstore support (CHROMEOS_PSTORE) [M/n/y/?] m
  ChromeOS Tablet Switch Controller (CHROMEOS_TBMC) [N/m/y/?] n
  ChromeOS Embedded Controller (CROS_EC) [N/m/y/?] n
  Backlight LED support for Chrome OS keyboards (CROS_KBD_LED_BACKLIGHT) [M/n/y/?] m
  ChromeOS HPS device (CROS_HPS_I2C) [N/m/?] (NEW)
  ChromeOS Privacy Screen support (CHROMEOS_PRIVACY_SCREEN) [N/m/?] n
*
* Platform support for CZ.NIC's Turris hardware
*
Platform support for CZ.NIC's Turris hardware (CZNIC_PLATFORMS) [N/y/?] (NEW)
*
* X86 Platform Specific Device Drivers
*
X86 Platform Specific Device Drivers (X86_PLATFORM_DEVICES) [Y/?] y
  WMI (ACPI_WMI) [M/y/?] m
    WMI embedded Binary MOF driver (WMI_BMOF) [M/n/?] m
    Huawei WMI laptop extras driver (HUAWEI_WMI) [M/n/?] m
  Sysfs structure for UV systems (UV_SYSFS) [N/m/y/?] n
  WMI support for MXM Laptop Graphics (MXM_WMI) [M/?] m
  EC Backlight Driver for Hybrid Graphics Notebook Systems (NVIDIA_WMI_EC_BACKLIGHT) [N/m/?] n
  Xiaomi WMI key driver (XIAOMI_WMI) [N/m/?] n
  Gigabyte WMI temperature driver (GIGABYTE_WMI) [N/m/?] n
  Lenovo Yoga Book tablet key driver (YOGABOOK) [N/m/?] (NEW)
  Lenovo Yoga Tablet 2 1380 fast charge driver (YT2_1380) [N/m/y/?] (NEW)
  Acer Aspire One temperature and fan driver (ACERHDF) [M/n/y/?] m
  Acer Wireless Radio Control Driver (ACER_WIRELESS) [M/n/y/?] m
  Acer WMI Laptop Extras (ACER_WMI) [M/n/?] m
  AMD SoC PMC driver (AMD_PMC) [M/n/y/?] m
    AMD SoC MP2 STB function (AMD_MP2_STB) [Y/n/?] (NEW)
  AMD HSMP Driver (AMD_HSMP) [N/m/y/?] n
  AMD Wifi RF Band mitigations (WBRF) (AMD_WBRF) [N/y/?] (NEW)
  Advantech ACPI Software Button Driver (ADV_SWBUTTON) [N/m/y/?] n
  Apple Gmux Driver (APPLE_GMUX) [M/n/?] m
  Asus Laptop Extras (ASUS_LAPTOP) [M/n/?] m
  Asus Wireless Radio Control Driver (ASUS_WIRELESS) [M/n/y/?] m
  ASUS WMI Driver (ASUS_WMI) [M/n/?] m
    Asus Notebook WMI Driver (ASUS_NB_WMI) [M/n/?] m
  Asus TF103C 2-in-1 keyboard dock (ASUS_TF103C_DOCK) [N/m/?] n
  Cisco Meraki MX100 Platform Driver (MERAKI_MX100) [N/m/?] n
  Eee PC Hotkey Driver (EEEPC_LAPTOP) [M/n/?] m
  Eee PC WMI Driver (EEEPC_WMI) [M/n/?] m
  Fujitsu-Siemens Amilo rfkill support (AMILO_RFKILL) [M/n/?] m
  Fujitsu Laptop Extras (FUJITSU_LAPTOP) [M/n/?] m
  Fujitsu Tablet Extras (FUJITSU_TABLET) [M/n/y/?] m
  GPD Pocket Fan Controller support (GPD_POCKET_FAN) [M/n/y/?] m
  Wireless hotkey button (WIRELESS_HOTKEY) [N/m/y/?] n
  Device driver to enable PRTL support (IBM_RTL) [N/m/y/?] n
  Lenovo IdeaPad Laptop Extras (IDEAPAD_LAPTOP) [M/n/?] m
    Lenovo Yoga Tablet Mode Control (LENOVO_YMC) [N/m/?] (NEW)
  Thinkpad Hard Drive Active Protection System (hdaps) (SENSORS_HDAPS) [M/n/y/?] m
  ThinkPad ACPI Laptop Extras (THINKPAD_ACPI) [M/n/?] m
    Console audio control ALSA interface (THINKPAD_ACPI_ALSA_SUPPORT) [Y/n/?] y
    Maintainer debug facilities (THINKPAD_ACPI_DEBUGFACILITIES) [N/y/?] n
    Verbose debug mode (THINKPAD_ACPI_DEBUG) [N/y/?] n
    Allow control of important LEDs (unsafe) (THINKPAD_ACPI_UNSAFE_LEDS) [N/y/?] n
    Video output control support (THINKPAD_ACPI_VIDEO) [Y/n/?] y
    Support NVRAM polling for hot keys (THINKPAD_ACPI_HOTKEY_POLL) [Y/n/?] y
  Lenovo WMI-based systems management driver (THINKPAD_LMI) [N/m/?] n
  Intel AtomISP v2 camera LED driver (INTEL_ATOMISP2_LED) [N/m/?] n
  Intel AtomISP v2 dummy / power-management driver (INTEL_ATOMISP2_PM) [M/n/y/?] m
  Intel In Field Scan (INTEL_IFS) [N/m/y/?] (NEW)
  Intel Specific Absorption Rate Driver (INTEL_SAR_INT1092) [N/m/y/?] n
  Intel SkyLake ACPI INT3472 Driver (INTEL_SKL_INT3472) [N/m/?] n
  Intel WMI Slim Bootloader firmware update signaling driver (INTEL_WMI_SBL_FW_UPDATE) [N/m/?] n
  Intel WMI thunderbolt force power driver (INTEL_WMI_THUNDERBOLT) [M/n/?] m
  Intel HID Event (INTEL_HID_EVENT) [M/n/?] m
  Intel Virtual Button (INTEL_VBTN) [M/n/?] m
  Intel ACPI INT0002 Virtual GPIO driver (INTEL_INT0002_VGPIO) [M/n/y/?] m
  Intel Oaktrail Platform Extras (INTEL_OAKTRAIL) [M/n/?] m
  Intel Cherry Trail Whiskey Cove ACPI INT33FE Driver (INTEL_CHTWC_INT33FE) [N/m/?] n
  Intel ISHTP eclite controller Driver (INTEL_ISHTP_ECLITE) [N/m/?] n
  Intel P-Unit IPC Driver (INTEL_PUNIT_IPC) [M/n/y/?] m
  Intel Rapid Start Technology Driver (INTEL_RST) [M/n/y/?] m
  Intel Smart Connect disabling driver (INTEL_SMARTCONNECT) [Y/n/m/?] y
  Intel Turbo Boost Max Technology 3.0 enumeration driver (INTEL_TURBO_MAX_3) [Y/n/?] y
  Intel Vendor Specific Extended Capabilities Driver (INTEL_VSEC) [N/m/y/?] n
  ACPI Quickstart button driver (ACPI_QUICKSTART) [N/m/y/?] (NEW)
  MeeGoPad ANX7428 Type-C Switch (MEEGOPAD_ANX7428) [N/m/?] (NEW)
  MSI EC Extras (MSI_EC) [N/m/y/?] (NEW)
  MSI Laptop Extras (MSI_LAPTOP) [M/n/?] m
  MSI WMI extras (MSI_WMI) [M/n/?] m
  MSI WMI Platform features (MSI_WMI_PLATFORM) [N/m/?] (NEW)
  PC Engines APUv2/3 front button and LEDs driver (PCENGINES_APU2) [M/n/y/?] m
  Barco P50 GPIO driver for identify LED/button (BARCO_P50_GPIO) [N/m/y/?] n
  Samsung Laptop driver (SAMSUNG_LAPTOP) [M/n/?] m
  Samsung Q10 Extras (SAMSUNG_Q10) [M/n/y/?] m
  Toshiba Laptop Extras (ACPI_TOSHIBA) [M/n/?] m
  Toshiba Bluetooth RFKill switch support (TOSHIBA_BT_RFKILL) [M/n/?] m
  Toshiba HDD Active Protection Sensor (TOSHIBA_HAPS) [M/n/y/?] m
  Toshiba WMI Hotkeys Driver (EXPERIMENTAL) (TOSHIBA_WMI) [M/n/?] m
  CMPC Laptop Extras (ACPI_CMPC) [M/n/?] m
  Compal (and others) Laptop Extras (COMPAL_LAPTOP) [M/n/?] m
  LG Laptop Extras (LG_LAPTOP) [M/n/?] m
  Panasonic Laptop Extras (PANASONIC_LAPTOP) [M/n/?] m
  Sony Laptop Extras (SONY_LAPTOP) [M/n/?] m
    Sonypi compatibility (SONYPI_COMPAT) [Y/n/?] y
  System76 ACPI Driver (SYSTEM76_ACPI) [M/n/y/?] m
  Topstar Laptop Extras (TOPSTAR_LAPTOP) [M/n/y/?] m
  Serial bus multi instantiate pseudo device driver (SERIAL_MULTI_INSTANTIATE) [N/m/?] n
  Mellanox Technologies platform support (MLX_PLATFORM) [M/n/?] m
  Inspur WMI platform profile driver (INSPUR_PLATFORM_PROFILE) [N/m/?] (NEW)
  Lenovo WMI Camera Button driver (LENOVO_WMI_CAMERA) [N/m/?] (NEW)
  X86 Android tablet support (X86_ANDROID_TABLETS) [N/m/?] n
  Intel Intelligent Power Sharing (INTEL_IPS) [M/n/y/?] m
  Intel SCU PCI driver (INTEL_SCU_PCI) [N/y/?] n
  Intel SCU platform driver (INTEL_SCU_PLATFORM) [N/m/y/?] n
  Siemens Simatic IPC Class driver (SIEMENS_SIMATIC_IPC) [N/m/y/?] n
  Winmate FM07/FM07P front-panel keys driver (WINMATE_FM07_KEYS) [N/m/y/?] n
  SEL-3350 LEDs and power supplies (SEL3350_PLATFORM) [N/m/?] (NEW)
*
* IOMMU Hardware Support
*
IOMMU Hardware Support (IOMMU_SUPPORT) [Y/n/?] y
  Export IOMMU internals in DebugFS (IOMMU_DEBUGFS) [N/y/?] n
  IOMMU default domain type
    1. Translated - Strict (IOMMU_DEFAULT_DMA_STRICT)
  > 2. Translated - Lazy (IOMMU_DEFAULT_DMA_LAZY)
    3. Passthrough (IOMMU_DEFAULT_PASSTHROUGH)
  choice[1-3?]: 2
  AMD IOMMU support (AMD_IOMMU) [Y/n/?] y
  Support for Intel IOMMU using DMA Remapping Devices (INTEL_IOMMU) [Y/n/?] y
    Support for Shared Virtual Memory with Intel IOMMU (INTEL_IOMMU_SVM) [Y/n/?] y
    Enable Intel DMA Remapping Devices by default (INTEL_IOMMU_DEFAULT_ON) [N/y/?] n
    Enable Intel IOMMU scalable mode by default (INTEL_IOMMU_SCALABLE_MODE_DEFAULT_ON) [N/y/?] n
    Intel IOMMU performance events (INTEL_IOMMU_PERF_EVENTS) [Y/n/?] (NEW)
  IOMMU Userspace API (IOMMUFD) [N/m/y/?] (NEW)
  Support for Interrupt Remapping (IRQ_REMAP) [Y/n/?] y
*
* SoundWire support
*
SoundWire support (SOUNDWIRE) [M/n/y/?] m
  *
  * SoundWire Devices
  *
  AMD SoundWire Manager driver (SOUNDWIRE_AMD) [N/m/?] (NEW)
  Intel SoundWire Master driver (SOUNDWIRE_INTEL) [M/?] m
  Qualcomm SoundWire Master driver (SOUNDWIRE_QCOM) [M/n/?] m
*
* Nuvoton WPCM450 SoC driver
*
Nuvoton WPCM450 SoC driver (WPCM450_SOC) [N/m/y/?] (NEW)
*
* External Connector Class (extcon) support
*
External Connector Class (extcon) support (EXTCON) [Y/?] y
  *
  * Extcon Device Drivers
  *
  ADC Jack extcon support (EXTCON_ADC_JACK) [N/m/?] n
  X-Power AXP288 EXTCON support (EXTCON_AXP288) [M/n/?] m
  FSA9480 EXTCON Support (EXTCON_FSA9480) [N/m/?] n
  GPIO extcon support (EXTCON_GPIO) [N/m/y/?] n
  Intel INT3496 ACPI device extcon driver (EXTCON_INTEL_INT3496) [M/n/y/?] m
  LC824206XA extcon Support (EXTCON_LC824206XA) [N/m/?] (NEW)
  Maxim MAX3355 USB OTG EXTCON Support (EXTCON_MAX3355) [N/m/y/?] n
  NXP PTN5150 CC LOGIC USB EXTCON support (EXTCON_PTN5150) [N/m/?] n
  Richtek RT8973A EXTCON support (EXTCON_RT8973A) [N/m/?] n
  Silicon Mitus SM5502/SM5504/SM5703 EXTCON support (EXTCON_SM5502) [N/m/?] n
  USB GPIO extcon support (EXTCON_USB_GPIO) [N/m/y/?] n
  TI TUSB320 USB-C extcon support (EXTCON_USBC_TUSB320) [N/m/?] n
*
* Accelerometers
*
Analog Devices ADIS16201 Dual-Axis Digital Inclinometer and Accelerometer (ADIS16201) [N/m/?] n
Analog Devices ADIS16209 Dual-Axis Digital Inclinometer and Accelerometer (ADIS16209) [N/m/?] n
Analog Devices ADXL313 3-Axis Digital Accelerometer I2C Driver (ADXL313_I2C) [N/m/?] n
Analog Devices ADXL313 3-Axis Digital Accelerometer SPI Driver (ADXL313_SPI) [N/m/?] n
Analog Devices ADXL345 3-Axis Digital Accelerometer I2C Driver (ADXL345_I2C) [N/m/?] n
Analog Devices ADXL345 3-Axis Digital Accelerometer SPI Driver (ADXL345_SPI) [N/m/?] n
Analog Devices ADXL355 3-Axis Digital Accelerometer I2C Driver (ADXL355_I2C) [N/m/?] n
Analog Devices ADXL355 3-Axis Digital Accelerometer SPI Driver (ADXL355_SPI) [N/m/?] n
Analog Devices ADXL367 3-Axis Accelerometer SPI Driver (ADXL367_SPI) [N/m/?] n
Analog Devices ADXL367 3-Axis Accelerometer I2C Driver (ADXL367_I2C) [N/m/?] n
Analog Devices ADXL372 3-Axis Accelerometer SPI Driver (ADXL372_SPI) [M/n/?] m
Analog Devices ADXL372 3-Axis Accelerometer I2C Driver (ADXL372_I2C) [M/n/?] m
Analog Devices ADXL380 3-Axis Accelerometer SPI Driver (ADXL380_SPI) [N/m/?] (NEW)
Analog Devices ADXL380 3-Axis Accelerometer I2C Driver (ADXL380_I2C) [N/m/?] (NEW)
Bosch BMA023/BMA1x0/BMA250 3-Axis Accelerometer Driver (BMA180) [N/m/?] n
Bosch BMA220 3-Axis Accelerometer Driver (BMA220) [N/m/?] n
Bosch BMA400 3-Axis Accelerometer Driver (BMA400) [N/m/?] n
Bosch BMC150 Accelerometer Driver (BMC150_ACCEL) [M/n/?] m
Bosch BMI088 Accelerometer Driver (BMI088_ACCEL) [N/m/?] n
MiraMEMS DA280 3-axis 14-bit digital accelerometer driver (DA280) [M/n/?] m
MiraMEMS DA311 3-axis 12-bit digital accelerometer driver (DA311) [M/n/?] m
Domintech DMARD06 Digital Accelerometer Driver (DMARD06) [N/m/?] n
Domintech DMARD09 3-axis Accelerometer Driver (DMARD09) [N/m/?] n
Domintech DMARD10 3-axis Accelerometer Driver (DMARD10) [M/n/?] m
NXP FXLS8962AF/FXLS8964AF Accelerometer I2C Driver (FXLS8962AF_I2C) [N/m/?] n
NXP FXLS8962AF/FXLS8964AF Accelerometer SPI Driver (FXLS8962AF_SPI) [N/m/?] n
HID Accelerometers 3D (HID_SENSOR_ACCEL_3D) [M/n/?] m
STMicroelectronics accelerometers 3-Axis Driver (IIO_ST_ACCEL_3AXIS) [M/n/?] m
  STMicroelectronics accelerometers 3-Axis I2C Interface (IIO_ST_ACCEL_I2C_3AXIS) [M/n/?] m
  STMicroelectronics accelerometers 3-Axis SPI Interface (IIO_ST_ACCEL_SPI_3AXIS) [M/n/?] m
Kionix KX022A tri-axis digital accelerometer SPI interface (IIO_KX022A_SPI) [N/m/?] (NEW)
Kionix KX022A tri-axis digital accelerometer I2C interface (IIO_KX022A_I2C) [N/m/?] (NEW)
Kionix KXSD9 Accelerometer Driver (KXSD9) [N/m/?] n
Kionix 3-Axis Accelerometer Driver (KXCJK1013) [M/n/?] m
mCube MC3230 Digital Accelerometer Driver (MC3230) [N/m/?] n
Freescale MMA7455L/MMA7456L Accelerometer I2C Driver (MMA7455_I2C) [N/m/?] n
Freescale MMA7455L/MMA7456L Accelerometer SPI Driver (MMA7455_SPI) [N/m/?] n
Freescale MMA7660FC 3-Axis Accelerometer Driver (MMA7660) [M/n/?] m
Freescale / NXP MMA8452Q and similar Accelerometers Driver (MMA8452) [N/m/?] n
Freescale MMA9551L Intelligent Motion-Sensing Platform Driver (MMA9551) [N/m/?] n
Freescale MMA9553L Intelligent Pedometer Platform Driver (MMA9553) [N/m/?] n
MEMSensing Digital 3-Axis Accelerometer Driver (MSA311) [N/m/?] n
Memsic MXC4005XC 3-Axis Accelerometer Driver (MXC4005) [M/n/?] m
Memsic MXC6255 Orientation Sensing Accelerometer Driver (MXC6255) [M/n/?] m
VTI SCA3000 series accelerometers (SCA3000) [N/m/?] n
Murata SCA3300 3-Axis Accelerometer Driver (SCA3300) [N/m/?] n
Sensortek STK8312 3-Axis Accelerometer Driver (STK8312) [N/m/?] n
Sensortek STK8BA50 3-Axis Accelerometer Driver (STK8BA50) [N/m/?] n
*
* Analog to digital converters
*
Analog Devices AD4000 ADC Driver (AD4000) [N/m/?] (NEW)
Analog Device AD4130 ADC Driver (AD4130) [N/m/?] (NEW)
Analog Device AD4695 ADC Driver (AD4695) [N/m/?] (NEW)
Analog Devices AD7091R5 ADC Driver (AD7091R5) [N/m/?] n
Analog Devices AD7091R8 ADC Driver (AD7091R8) [N/m/?] (NEW)
Analog Devices AD7124 and similar sigma-delta ADCs driver (AD7124) [M/n/?] m
Analog Devices AD7173 driver (AD7173) [N/m/?] (NEW)
Analog Devices AD7192 and similar ADC driver (AD7192) [N/m/?] n
Analog Devices AD7265/AD7266 ADC driver (AD7266) [N/m/?] n
Analog Devices AD7280A Lithium Ion Battery Monitoring System (AD7280) [N/m/?] n
Analog Devices AD7291 ADC driver (AD7291) [N/m/?] n
Analog Devices AD7292 ADC driver (AD7292) [M/n/?] m
Analog Devices AD7298 ADC driver (AD7298) [N/m/?] n
Analog Devices AD7380 ADC driver (AD7380) [N/m/?] (NEW)
Analog Devices AD7476 1-channel ADCs driver and other similar devices from AD and TI (AD7476) [N/m/?] n
Analog Devices AD7606 ADC driver with parallel interface support (AD7606_IFACE_PARALLEL) [N/m/?] n
Analog Devices AD7606 ADC driver with spi interface support (AD7606_IFACE_SPI) [N/m/?] n
Analog Devices AD7766/AD7767 ADC driver (AD7766) [M/n/?] m
Analog Devices AD7768-1 ADC driver (AD7768_1) [N/m/?] n
Analog Devices AD7780 and similar ADCs driver (AD7780) [N/m/?] n
Analog Devices AD7791 ADC driver (AD7791) [N/m/?] n
Analog Devices AD7793 and similar ADCs driver (AD7793) [N/m/?] n
Analog Devices AD7887 ADC driver (AD7887) [N/m/?] n
Analog Devices AD7923 and similar ADCs driver (AD7923) [N/m/?] n
Analog Devices AD7944 and similar ADCs driver (AD7944) [N/m/?] (NEW)
Analog Devices AD7949 and similar ADCs driver (AD7949) [M/n/?] m
Analog Devices AD799x ADC driver (AD799X) [N/m/?] n
Analog Devices AD9467 High Speed ADC driver (AD9467) [N/m/?] (NEW)
X-Powers AXP20X and AXP22X ADC driver (AXP20X_ADC) [N/m/?] n
X-Powers AXP288 ADC driver (AXP288_ADC) [M/n/?] m
Cosmic Circuits 10001 ADC driver (CC10001_ADC) [N/m/?] n
Envelope detector using a DAC and a comparator (ENVELOPE_DETECTOR) [N/m/?] n
Holt Integrated Circuits HI-8435 threshold detector (HI8435) [N/m/?] n
AVIA HX711 ADC for weight cells (HX711) [N/m/?] n
Texas Instruments INA2xx Power Monitors IIO driver (INA2XX_ADC) [N/m/?] n
Linear Technology LTC2309 ADC driver (LTC2309) [N/m/?] (NEW)
Linear Technology LTC2471 and LTC2473 ADC driver (LTC2471) [N/m/?] n
Linear Technology LTC2485 ADC driver (LTC2485) [N/m/?] n
Linear Technology LTC2496 ADC driver (LTC2496) [N/m/?] n
Linear Technology LTC2497 ADC driver (LTC2497) [N/m/?] n
Maxim max1027 ADC driver (MAX1027) [N/m/?] n
Maxim max11100 ADC driver (MAX11100) [N/m/?] n
Maxim max1117/max1118/max1119 ADCs driver (MAX1118) [N/m/?] n
Maxim max11205 ADC driver (MAX11205) [N/m/?] n
Analog Devices MAX11410 ADC driver (MAX11410) [N/m/?] (NEW)
Maxim max1241 ADC driver (MAX1241) [M/n/?] m
Maxim max1363 ADC driver (MAX1363) [M/n/?] m
Maxim max34408/max344089 ADC driver (MAX34408) [N/m/?] (NEW)
Maxim max9611/max9612 ADC driver (MAX9611) [N/m/?] n
Microchip Technology MCP3x01/02/04/08 and MCP3550/1/3 (MCP320X) [N/m/?] n
Microchip Technology MCP3421/2/3/4/5/6/7/8 driver (MCP3422) [N/m/?] n
Microchip Technology MCP3461/2/4/R, MCP3561/2/4/R driver (MCP3564) [N/m/?] (NEW)
Microchip Technology MCP3911 driver (MCP3911) [M/n/?] m
Nuvoton NAU7802 ADC driver (NAU7802) [N/m/?] n
Microchip Technology PAC1921 driver (PAC1921) [N/m/?] (NEW)
Microchip Technology PAC1934 driver (PAC1934) [N/m/?] (NEW)
Richtek RTQ6056 Current and Power Monitor ADC (RICHTEK_RTQ6056) [N/m/?] n
Generic sigma delta modulator (SD_ADC_MODULATOR) [N/m/?] n
Texas Instruments ADC081C/ADC101C/ADC121C family (TI_ADC081C) [N/m/?] n
Texas Instruments ADC0831/ADC0832/ADC0834/ADC0838 (TI_ADC0832) [N/m/?] n
Texas Instruments ADC084S021 (TI_ADC084S021) [N/m/?] n
Texas Instruments ADC12130/ADC12132/ADC12138 (TI_ADC12138) [N/m/?] n
Texas Instruments ADC108S102 and ADC128S102 driver (TI_ADC108S102) [N/m/?] n
Texas Instruments ADC128S052/ADC122S021/ADC124S021 (TI_ADC128S052) [M/n/?] m
Texas Instruments ADC161S626 1-channel differential ADC (TI_ADC161S626) [N/m/?] n
Texas Instruments ADS1015 ADC (TI_ADS1015) [M/n/?] m
Texas Instruments ADS1119 ADC (TI_ADS1119) [N/m/?] (NEW)
Texas Instruments ADS7924 ADC (TI_ADS7924) [N/m/?] (NEW)
Texas Instruments ADS1100 and ADS1000 ADC (TI_ADS1100) [N/m/?] (NEW)
Texas Instruments ADS1298 (TI_ADS1298) [N/m/?] (NEW)
Texas Instruments ADS7950 ADC driver (TI_ADS7950) [N/m/?] n
Texas Instruments ADS8344 (TI_ADS8344) [N/m/?] n
Texas Instruments ADS8688 (TI_ADS8688) [N/m/?] n
Texas Instruments ADS124S08 (TI_ADS124S08) [N/m/?] n
Texas Instruments ADS131E08 (TI_ADS131E08) [N/m/?] n
Texas Instruments LMP92064 ADC driver (TI_LMP92064) [N/m/?] (NEW)
Texas Instruments TLC4541 ADC driver (TI_TLC4541) [N/m/?] n
Texas Instruments TSC2046 ADC driver (TI_TSC2046) [N/m/?] n
Freescale vf610 ADC driver (VF610_ADC) [N/m/?] n
Viperboard ADC support (VIPERBOARD_ADC) [N/m/?] n
Xilinx XADC driver (XILINX_XADC) [N/m/?] n
*
* Analog to digital and digital to analog converters
*
Analog Devices AD74115H driver (AD74115) [N/m/?] (NEW)
Analog Devices AD74412R/AD74413R driver (AD74413R) [N/m/?] n
*
* Chemical Sensors
*
Aosong AGS02MA TVOC sensor driver (AOSONG_AGS02MA) [N/m/?] (NEW)
Atlas Scientific OEM SM sensors (ATLAS_PH_SENSOR) [N/m/?] n
Atlas Scientific EZO sensors (ATLAS_EZO_SENSOR) [N/m/?] n
Bosch Sensortec BME680 sensor driver (BME680) [M/n/?] m
AMS CCS811 VOC sensor (CCS811) [N/m/?] n
ScioSense ENS160 sensor driver (ENS160) [N/m/?] (NEW)
AMS iAQ-Core VOC sensors (IAQCORE) [N/m/?] n
Plantower PMS7003 particulate matter sensor (PMS7003) [N/m/?] n
SCD30 carbon dioxide sensor driver (SCD30_CORE) [N/m/?] n
SCD4X carbon dioxide sensor driver (SCD4X) [N/m/?] n
Sensirion SGPxx gas sensors (SENSIRION_SGP30) [N/m/?] n
Sensirion SGP40 gas sensor (SENSIRION_SGP40) [N/m/?] n
SPS30 particulate matter sensor I2C driver (SPS30_I2C) [N/m/?] n
SPS30 particulate matter sensor serial driver (SPS30_SERIAL) [N/m/?] n
Senseair Sunrise 006-0-0007 CO2 sensor (SENSEAIR_SUNRISE_CO2) [N/m/?] n
SGX Sensortech MiCS VZ89X VOC sensor (VZ89X) [N/m/?] n
*
* Digital to analog converters
*
Analog Devices AD3552R DAC driver (AD3552R) [N/m/?] n
Analog Devices AD5064 and similar multi-channel DAC driver (AD5064) [N/m/?] n
Analog Devices AD5360/61/62/63/70/71/73 DAC driver (AD5360) [N/m/?] n
Analog Devices AD5380/81/82/83/84/90/91/92 DAC driver (AD5380) [N/m/?] n
Analog Devices AD5421 DAC driver (AD5421) [N/m/?] n
Analog Devices AD5446 and similar single channel DACs driver (AD5446) [N/m/?] n
Analog Devices AD5449 and similar DACs driver (AD5449) [N/m/?] n
Analog Devices AD5592R ADC/DAC driver (AD5592R) [N/m/?] n
Analog Devices AD5593R ADC/DAC driver (AD5593R) [N/m/?] n
Analog Devices AD5504/AD5501 DAC SPI driver (AD5504) [N/m/?] n
Analog Devices AD5624/44/64R DAC spi driver (AD5624R_SPI) [N/m/?] n
Analog Devices AD9739A RF DAC spi driver (AD9739A) [N/m/?] (NEW)
Analog Devices LTC2688 DAC spi driver (LTC2688) [N/m/?] n
Analog Devices AD5686 and similar multi-channel DACs (SPI) (AD5686_SPI) [N/m/?] n
Analog Devices AD5696 and similar multi-channel DACs (I2C) (AD5696_I2C) [N/m/?] n
Analog Devices AD5755/AD5755-1/AD5757/AD5735/AD5737 DAC driver (AD5755) [N/m/?] n
Analog Devices AD5758 DAC driver (AD5758) [N/m/?] n
Analog Devices AD5761/61R/21/21R DAC driver (AD5761) [N/m/?] n
Analog Devices AD5764/64R/44/44R DAC driver (AD5764) [N/m/?] n
Analog Devices AD5766/AD5767 DAC driver (AD5766) [N/m/?] n
Analog Devices AD5770R IDAC driver (AD5770R) [N/m/?] n
Analog Devices AD5760/AD5780/AD5781/AD5790/AD5791 DAC SPI driver (AD5791) [N/m/?] n
Analog Devices AD7293 Power Amplifier Current Controller (AD7293) [N/m/?] n
Analog Devices AD7303 DAC driver (AD7303) [N/m/?] n
Analog Devices AD8801/AD8803 DAC driver (AD8801) [N/m/?] n
DAC emulation using a DPOT (DPOT_DAC) [N/m/?] n
Maxim Integrated DS4422/DS4424 DAC driver (DS4424) [N/m/?] n
Linear Technology LTC1660/LTC1665 DAC SPI driver (LTC1660) [M/n/?] m
Linear Technology LTC2632-12/10/8 and similar DAC spi driver (LTC2632) [N/m/?] n
Analog Devices LTC2664 and LTC2672 DAC SPI driver (LTC2664) [N/m/?] (NEW)
Mitsubishi M62332 DAC driver (M62332) [N/m/?] n
Maxim MAX517/518/519/520/521 DAC driver (MAX517) [N/m/?] n
Maxim MAX5522 DAC driver (MAX5522) [N/m/?] (NEW)
Maxim MAX5821 DAC driver (MAX5821) [N/m/?] n
MCP4725/6 DAC driver (MCP4725) [N/m/?] n
MCP4728 DAC driver (MCP4728) [N/m/?] (NEW)
MCP4801/02/11/12/21/22 DAC driver (MCP4821) [N/m/?] (NEW)
MCP4902, MCP4912, MCP4922 DAC driver (MCP4922) [N/m/?] n
Texas Instruments 8/10/12-bit 2/4-channel DAC driver (TI_DAC082S085) [N/m/?] n
Texas Instruments 8/10/12/16-bit 1/2/4-channel DAC driver (TI_DAC5571) [N/m/?] n
Texas Instruments 8/10/12-bit 1-channel DAC driver (TI_DAC7311) [M/n/?] m
Texas Instruments 12-bit 2-channel DAC driver (TI_DAC7612) [N/m/?] n
Vybrid vf610 DAC driver (VF610_DAC) [N/m/?] n
*
* Phase-Locked Loop (PLL) frequency synthesizers
*
Analog Devices ADF4350/ADF4351 Wideband Synthesizers (ADF4350) [N/m/?] n
Analog Devices ADF4371/ADF4372 Wideband Synthesizers (ADF4371) [N/m/?] n
Analog Devices ADF4377 Microwave Wideband Synthesizer (ADF4377) [N/m/?] (NEW)
Analog Devices ADMFM2000 Dual Microwave Down Converter (ADMFM2000) [N/m/?] (NEW)
Analog Devices ADMV1013 Microwave Upconverter (ADMV1013) [N/m/?] n
Analog Devices ADMV1014 Microwave Downconverter (ADMV1014) [N/m/?] n
Analog Devices ADMV4420 K Band Downconverter (ADMV4420) [N/m/?] n
Analog Devices ADRF6780 Microwave Upconverter (ADRF6780) [N/m/?] n
*
* Humidity sensors
*
Aosong AM2315 relative humidity and temperature sensor (AM2315) [N/m/?] n
DHT11 (and compatible sensors) driver (DHT11) [M/n/?] m
ENS210 temperature and humidity sensor (ENS210) [N/m/?] (NEW)
TI HDC100x relative humidity and temperature sensor (HDC100X) [N/m/?] n
TI HDC2010 relative humidity and temperature sensor (HDC2010) [N/m/?] n
TI HDC3020 relative humidity and temperature sensor (HDC3020) [N/m/?] (NEW)
HID Environmental humidity sensor (HID_SENSOR_HUMIDITY) [M/n/?] m
STMicroelectronics HTS221 sensor Driver (HTS221) [M/n/?] m
Measurement Specialties HTU21 humidity & temperature sensor (HTU21) [N/m/?] n
SI7005 relative humidity and temperature sensor (SI7005) [N/m/?] n
Si7013/20/21 Relative Humidity and Temperature Sensors (SI7020) [N/m/?] n
*
* Inertial measurement units
*
Analog Devices ADIS16400 and similar IMU SPI driver (ADIS16400) [N/m/?] n
Analog Devices ADIS16460 and similar IMU driver (ADIS16460) [N/m/?] n
Analog Devices ADIS16475 and similar IMU driver (ADIS16475) [N/m/?] n
Analog Devices ADIS16480 and similar IMU driver (ADIS16480) [N/m/?] n
Bosch BMI160 I2C driver (BMI160_I2C) [N/m/?] n
Bosch BMI160 SPI driver (BMI160_SPI) [N/m/?] n
Bosch BMI323 I2C driver (BMI323_I2C) [N/m/?] (NEW)
Bosch BMI323 SPI driver (BMI323_SPI) [N/m/?] (NEW)
Bosch BNO055 attached via UART (BOSCH_BNO055_SERIAL) [N/m/?] n
Bosch BNO055 attached via I2C bus (BOSCH_BNO055_I2C) [N/m/?] n
NXP FXOS8700 I2C driver (FXOS8700_I2C) [N/m/?] n
NXP FXOS8700 SPI driver (FXOS8700_SPI) [N/m/?] n
Kionix KMX61 6-axis accelerometer and magnetometer (KMX61) [N/m/?] n
InvenSense ICM-426xx I2C driver (INV_ICM42600_I2C) [N/m/?] n
InvenSense ICM-426xx SPI driver (INV_ICM42600_SPI) [N/m/?] n
Invensense MPU6050 devices (I2C) (INV_MPU6050_I2C) [M/n/?] m
Invensense MPU6050 devices (SPI) (INV_MPU6050_SPI) [N/m/?] n
ST_LSM6DSx driver for STM 6-axis IMU MEMS sensors (IIO_ST_LSM6DSX) [M/n/?] m
STMicroelectronics LSM9DS0 IMU driver (IIO_ST_LSM9DS0) [N/m/?] n
*
* Light sensors
*
ACPI Ambient Light Sensor (ACPI_ALS) [M/n/?] m
ADJD-S311-CR999 digital color sensor (ADJD_S311) [N/m/?] n
ADUX1020 photometric sensor (ADUX1020) [N/m/?] n
AL3010 ambient light sensor (AL3010) [N/m/?] n
AL3320A ambient light sensor (AL3320A) [N/m/?] n
APDS9300 ambient light sensor (APDS9300) [N/m/?] n
Avago APDS9306 Ambient Light Sensor (APDS9306) [N/m/?] (NEW)
Avago APDS9960 gesture/RGB/ALS/proximity sensor (APDS9960) [N/m/?] n
AMS AS73211 XYZ color sensor and AMS AS7331 UV sensor (AS73211) [N/m/?] n
ROHM BH1745 colour sensor (BH1745) [N/m/?] (NEW)
ROHM BH1750 ambient light sensor (BH1750) [M/n/?] m
ROHM BH1780 ambient light sensor (BH1780) [N/m/?] n
CM32181 driver (CM32181) [M/n/?] m
CM3232 ambient light sensor (CM3232) [N/m/?] n
Capella CM3323 color light sensor (CM3323) [N/m/?] n
Capella CM3605 ambient light and proximity sensor (CM3605) [N/m/?] n
CM36651 driver (CM36651) [N/m/?] n
Sharp GP2AP002 Proximity/ALS sensor (GP2AP002) [N/m/?] n
Sharp GP2AP020A00F Proximity/ALS sensor (GP2AP020A00F) [N/m/?] n
Intersil 29018 light and proximity sensor (SENSORS_ISL29018) [N/m/?] n
Intersil ISL29028 Concurrent Light and Proximity Sensor (SENSORS_ISL29028) [N/m/?] n
Intersil ISL29125 digital color light sensor (ISL29125) [N/m/?] n
Intersil ISL76682 Light Sensor (ISL76682) [N/m/?] (NEW)
HID ALS (HID_SENSOR_ALS) [M/n/?] m
HID PROX (HID_SENSOR_PROX) [N/m/?] n
JSA1212 ALS and proximity sensor driver (JSA1212) [N/m/?] n
ROHM BU27008 color (RGB+C/IR) sensor (ROHM_BU27008) [N/m/?] (NEW)
ROHM BU27034 ambient light sensor (ROHM_BU27034) [N/m/?] (NEW)
ROHM RPR0521 ALS and proximity sensor driver (RPR0521) [M/n/?] m
LTR-390UV-01 ambient light and UV sensor (LTR390) [N/m/?] (NEW)
LTR-501ALS-01 light sensor (LTR501) [N/m/?] n
Liteon LTRF216A Light Sensor (LTRF216A) [N/m/?] n
LV0104CS Ambient Light Sensor (LV0104CS) [M/n/?] m
MAX44000 Ambient and Infrared Proximity Sensor (MAX44000) [N/m/?] n
MAX44009 Ambient Light Sensor (MAX44009) [M/n/?] m
ON Semiconductor NOA1305 ambient light sensor (NOA1305) [N/m/?] n
Texas Instruments OPT3001 Light Sensor (OPT3001) [M/n/?] m
Texas Instruments OPT4001 Light Sensor (OPT4001) [N/m/?] (NEW)
TXC PA12203001 light and proximity sensor (PA12203001) [M/n/?] m
SI1133 UV Index Sensor and Ambient Light Sensor (SI1133) [N/m/?] n
SI1132 and SI1141/2/3/5/6/7 combined ALS, UV index and proximity sensor (SI1145) [N/m/?] n
STK3310 ALS and proximity sensor (STK3310) [M/n/?] m
STMicroelectronics UVIS25 sensor driver (ST_UVIS25) [M/n/?] m
TAOS TCS3414 digital color sensor (TCS3414) [N/m/?] n
TAOS TCS3472 color light-to-digital converter (TCS3472) [N/m/?] n
TAOS TSL2560, TSL2561, TSL2562 and TSL2563 ambient light sensors (SENSORS_TSL2563) [N/m/?] n
TAOS TSL2580, TSL2581 and TSL2583 light-to-digital converters (TSL2583) [N/m/?] n
TAOS TSL2591 ambient light sensor (TSL2591) [N/m/?] n
TAOS TSL/TMD2x71 and TSL/TMD2x72 Family of light and proximity sensors (TSL2772) [M/n/?] m
TAOS TSL4531 ambient light sensors (TSL4531) [N/m/?] n
UPISEMI light and proximity sensor (US5182D) [N/m/?] n
VCNL4000/4010/4020/4200 combined ALS and proximity sensor (VCNL4000) [N/m/?] n
VCNL4035 combined ALS and proximity sensor (VCNL4035) [M/n/?] m
VEML6030 ambient light sensor (VEML6030) [N/m/?] n
VEML6040 RGBW light sensor (VEML6040) [N/m/?] (NEW)
VEML6070 UV A light sensor (VEML6070) [N/m/?] n
VEML6075 UVA and UVB light sensor (VEML6075) [N/m/?] (NEW)
VL6180 ALS, range and proximity sensor (VL6180) [M/n/?] m
ZOPT2201 ALS and UV B sensor (ZOPT2201) [M/n/?] m
*
* Magnetometer sensors
*
Asahi Kasei AK8974 3-Axis Magnetometer (AK8974) [N/m/?] n
Asahi Kasei AK8975 3-Axis Magnetometer (AK8975) [M/n/?] m
Asahi Kasei AK09911 3-axis Compass (AK09911) [N/m/?] n
Bosch BMC150 I2C Magnetometer Driver (BMC150_MAGN_I2C) [M/n/?] m
Bosch BMC150 SPI Magnetometer Driver (BMC150_MAGN_SPI) [N/m/?] n
Freescale MAG3110 3-Axis Magnetometer (MAG3110) [N/m/?] n
HID Magenetometer 3D (HID_SENSOR_MAGNETOMETER_3D) [M/n/?] m
MEMSIC MMC35240 3-axis magnetic sensor (MMC35240) [N/m/?] n
STMicroelectronics magnetometers 3-Axis Driver (IIO_ST_MAGN_3AXIS) [M/n/?] m
  STMicroelectronics magnetometers 3-Axis I2C Interface (IIO_ST_MAGN_I2C_3AXIS) [M/n/?] m
  STMicroelectronics magnetometers 3-Axis SPI Interface (IIO_ST_MAGN_SPI_3AXIS) [M/n/?] m
Honeywell HMC5843/5883/5883L 3-Axis Magnetometer (I2C) (SENSORS_HMC5843_I2C) [N/m/?] n
Honeywell HMC5983 3-Axis Magnetometer (SPI) (SENSORS_HMC5843_SPI) [N/m/?] n
PNI RM3100 3-Axis Magnetometer (I2C) (SENSORS_RM3100_I2C) [M/n/?] m
PNI RM3100 3-Axis Magnetometer (SPI) (SENSORS_RM3100_SPI) [M/n/?] m
TI TMAG5273 Low-Power Linear 3D Hall-Effect Sensor (TI_TMAG5273) [N/m/?] (NEW)
Yamaha YAS530 family of 3-Axis Magnetometers (I2C) (YAMAHA_YAS530) [N/m/?] n
*
* Digital potentiometers
*
Analog Devices AD5110 and similar Digital Potentiometer driver (AD5110) [N/m/?] n
Analog Devices AD5272 and similar Digital Potentiometer driver (AD5272) [M/n/?] m
Maxim Integrated DS1803 and similar Digital Potentiometer driver (DS1803) [N/m/?] n
Maxim MAX5432-MAX5435 Digital Potentiometer driver (MAX5432) [N/m/?] n
Maxim MAX5481-MAX5484 Digital Potentiometer driver (MAX5481) [N/m/?] n
Maxim MAX5487/MAX5488/MAX5489 Digital Potentiometer driver (MAX5487) [N/m/?] n
Microchip MCP4017/18/19 Digital Potentiometer driver (MCP4018) [M/n/?] m
Microchip MCP413X/414X/415X/416X/423X/424X/425X/426X Digital Potentiometer driver (MCP4131) [N/m/?] n
Microchip MCP45xx/MCP46xx Digital Potentiometer driver (MCP4531) [N/m/?] n
Microchip MCP41xxx/MCP42xxx Digital Potentiometer driver (MCP41010) [M/n/?] m
Texas Instruments digital potentiometer driver (TPL0102) [N/m/?] n
Renesas X9250 quad controlled potentiometers (X9250) [N/m/?] (NEW)
*
* Pressure sensors
*
Honeywell ABP pressure sensor driver (ABP060MG) [M/n/?] m
ROHM BM1390GLV-Z pressure sensor driver (ROHM_BM1390) [N/m/?] (NEW)
Bosch Sensortec BMP180/BMP280/BMP380/BMP580 pressure sensor driver (BMP280) [M/n/?] m
All Sensors DLHL60D and DLHL60G low voltage digital pressure sensors (DLHL60D) [N/m/?] n
Infineon DPS310 pressure and temperature sensor (DPS310) [N/m/?] n
HID PRESS (HID_SENSOR_PRESS) [N/m/?] n
Hope RF HP03 temperature and pressure sensor driver (HP03) [N/m/?] n
Honeywell HSC/SSC TruStability pressure sensor series (HSC030PA) [N/m/?] (NEW)
InvenSense ICP-101xx pressure and temperature sensor (ICP10100) [N/m/?] n
Freescale MPL115A2 pressure sensor driver (MPL115_I2C) [M/n/?] m
Freescale MPL115A1 pressure sensor driver (MPL115_SPI) [N/m/?] n
Freescale MPL3115A2 pressure sensor driver (MPL3115) [N/m/?] n
Honeywell MPRLS0025PA (MicroPressure sensors series) (MPRLS0025PA) [N/m/?] (NEW)
Measurement Specialties MS5611 pressure sensor driver (MS5611) [N/m/?] n
Measurement Specialties MS5637 pressure & temperature sensor (MS5637) [N/m/?] n
Sensirion SDP500 differential pressure sensor I2C driver (SDP500) [N/m/?] (NEW)
STMicroelectronics pressure sensor Driver (IIO_ST_PRESS) [N/m/?] n
EPCOS T5403 digital barometric pressure sensor driver (T5403) [N/m/?] n
HOPERF HP206C precision barometer and altimeter sensor (HP206C) [N/m/?] n
Murata ZPA2326 pressure sensor driver (ZPA2326) [N/m/?] n
*
* Proximity and distance sensors
*
TYHX HX9023S SAR sensor (HX9023S) [N/m/?] (NEW)
Murata IRS-D200 PIR sensor (IRSD200) [N/m/?] (NEW)
Intersil ISL29501 Time Of Flight sensor (ISL29501) [N/m/?] n
PulsedLight LIDAR sensor (LIDAR_LITE_V2) [N/m/?] n
MaxSonar I2CXL family ultrasonic sensors (MB1232) [M/n/?] m
Parallax GPIO bitbanged ranger sensors (PING) [N/m/?] n
RFD77402 ToF sensor (RFD77402) [N/m/?] n
GPIO bitbanged ultrasonic ranger sensor (SRF04, MB1000) (SRF04) [N/m/?] n
SX9310/SX9311 Semtech proximity sensor (SX9310) [N/m/?] n
SX9324 Semtech proximity sensor (SX9324) [N/m/?] n
SX9360 Semtech proximity sensor (SX9360) [N/m/?] n
SX9500 Semtech proximity sensor (SX9500) [N/m/?] n
Devantech SRF02/SRF08/SRF10 ultrasonic ranger sensor (SRF08) [N/m/?] n
VCNL3020 proximity sensor (VCNL3020) [N/m/?] n
STMicroelectronics VL53L0X ToF ranger sensor (I2C) (VL53L0X_I2C) [M/n/?] m
AW96103/AW96105 Awinic proximity sensor (AW96103) [N/m/?] (NEW)
*
* Temperature sensors
*
Analog Devices Multi-Sensor Digital Temperature Measurement System (LTC2983) [N/m/?] n
Maxim thermocouple sensors (MAXIM_THERMOCOUPLE) [M/n/?] m
HID Environmental temperature sensor (HID_SENSOR_TEMP) [M/n/?] m
MLX90614 contact-less infrared sensor (MLX90614) [M/n/?] m
MLX90632 contact-less infrared sensor with medical accuracy (MLX90632) [M/n/?] m
MLX90635 contact-less infrared sensor with medical accuracy (MLX90635) [N/m/?] (NEW)
TMP006 infrared thermopile sensor (TMP006) [N/m/?] n
TMP007 infrared thermopile sensor with Integrated Math Engine (TMP007) [N/m/?] n
TMP117 Digital temperature sensor with integrated NV memory (TMP117) [N/m/?] n
Measurement Specialties TSYS01 temperature sensor using I2C bus connection (TSYS01) [N/m/?] n
Measurement Specialties TSYS02D temperature sensor (TSYS02D) [N/m/?] n
Maxim MAX30208 digital temperature sensor (MAX30208) [N/m/?] (NEW)
MAX31856 thermocouple sensor (MAX31856) [M/n/?] m
MAX31865 RTD to Digital converter (MAX31865) [N/m/?] n
MCP9600 thermocouple EMF converter (MCP9600) [N/m/?] (NEW)
*
* Pulse-Width Modulation (PWM) Support
*
Pulse-Width Modulation (PWM) Support (PWM) [Y/n/?] y
  PWM lowlevel drivers additional checks and debug messages (PWM_DEBUG) [N/y/?] n
  Clock based PWM support (PWM_CLK) [N/m/y/?] n
  DesignWare PWM Controller (PCI bus) (PWM_DWC) [N/m/y/?] n
  GPIO PWM support (PWM_GPIO) [N/m/y/?] (NEW)
  Intel LPSS PWM PCI driver (PWM_LPSS_PCI) [M/n/y/?] m
  Intel LPSS PWM platform driver (PWM_LPSS_PLATFORM) [M/n/y/?] m
  NXP PCA9685 PWM driver (PWM_PCA9685) [N/m/?] n
*
* Reset Controller Support
*
Reset Controller Support (RESET_CONTROLLER) [Y/?] y
  GPIO reset controller (RESET_GPIO) [N/m/y/?] (NEW)
  TI SYSCON Reset Driver (RESET_TI_SYSCON) [N/m/y/?] n
  TI TPS380x Reset Driver (RESET_TI_TPS380X) [N/m/y/?] n
*
* Performance monitor support
*
Synopsys DesignWare PCIe PMU (DWC_PCIE_PMU) [N/m/y/?] (NEW)
*
* Reliability, Availability and Serviceability (RAS) features
*
Reliability, Availability and Serviceability (RAS) features (RAS) [Y/?] y
  Correctable Errors Collector (RAS_CEC) [Y/n/?] y
    CEC debugging machinery (RAS_CEC_DEBUG) [N/y/?] n
  AMD Address Translation Library (AMD_ATL) [M/n/y/?] (NEW)
    FRU Memory Poison Manager (RAS_FMPM) [M/n/?] (NEW)
*
* NVDIMM (Non-Volatile Memory Device) Support
*
NVDIMM (Non-Volatile Memory Device) Support (LIBNVDIMM) [M/y/?] m
  PMEM: Persistent memory block device support (BLK_DEV_PMEM) [M/n/?] m
  BTT: Block Translation Table (atomic sector updates) (BTT) [Y/n/?] y
  PFN: Map persistent (device) memory (NVDIMM_PFN) [Y/n/?] y
    NVDIMM DAX: Raw access to persistent memory (NVDIMM_DAX) [Y/n/?] y
  Enable NVDIMM security unit tests (NVDIMM_SECURITY_TEST) [N/y/?] (NEW)
*
* File systems
*
Validate filesystem parameter description (VALIDATE_FS_PARSER) [N/y/?] n
Second extended fs support (DEPRECATED) (EXT2_FS) [N/m/y/?] n
The Extended 3 (ext3) filesystem (EXT3_FS) [N/m/y/?] n
The Extended 4 (ext4) filesystem (EXT4_FS) [M/n/y/?] m
  Use ext4 for ext2 file systems (EXT4_USE_FOR_EXT2) [Y/n/?] y
  Ext4 POSIX Access Control Lists (EXT4_FS_POSIX_ACL) [Y/n/?] y
  Ext4 Security Labels (EXT4_FS_SECURITY) [Y/n/?] y
  Ext4 debugging support (EXT4_DEBUG) [N/y/?] n
JBD2 (ext4) debugging support (JBD2_DEBUG) [N/y/?] n
Reiserfs support (deprecated) (REISERFS_FS) [M/n/y/?] m
  Enable reiserfs debug mode (REISERFS_CHECK) [N/y/?] n
  Stats in /proc/fs/reiserfs (REISERFS_PROC_INFO) [Y/n/?] y
  ReiserFS extended attributes (REISERFS_FS_XATTR) [Y/n/?] y
    ReiserFS POSIX Access Control Lists (REISERFS_FS_POSIX_ACL) [Y/n/?] y
    ReiserFS Security Labels (REISERFS_FS_SECURITY) [Y/n/?] y
JFS filesystem support (JFS_FS) [M/n/y/?] m
  JFS POSIX Access Control Lists (JFS_POSIX_ACL) [Y/n/?] y
  JFS Security Labels (JFS_SECURITY) [Y/n/?] y
  JFS debugging (JFS_DEBUG) [N/y/?] n
  JFS statistics (JFS_STATISTICS) [Y/n/?] y
XFS filesystem support (XFS_FS) [M/n/y/?] m
  Support deprecated V4 (crc=0) format (XFS_SUPPORT_V4) [Y/n/?] y
  Support deprecated case-insensitive ascii (ascii-ci=1) format (XFS_SUPPORT_ASCII_CI) [Y/n/?] (NEW)
  XFS Quota support (XFS_QUOTA) [Y/n/?] y
  XFS POSIX ACL support (XFS_POSIX_ACL) [Y/n/?] y
  XFS Realtime subvolume support (XFS_RT) [Y/n/?] y
XFS online metadata check support (XFS_ONLINE_SCRUB) [Y/n/?] y
  XFS online metadata check usage data collection (XFS_ONLINE_SCRUB_STATS) [Y/n/?] (NEW)
  XFS online metadata repair support (XFS_ONLINE_REPAIR) [N/y/?] n
XFS Verbose Warnings (XFS_WARN) [N/y/?] n
XFS Debugging support (XFS_DEBUG) [N/y/?] n
GFS2 file system support (GFS2_FS) [M/n/y/?] m
  GFS2 DLM locking (GFS2_FS_LOCKING_DLM) [Y/n/?] y
OCFS2 file system support (OCFS2_FS) [M/n/?] m
  O2CB Kernelspace Clustering (OCFS2_FS_O2CB) [M/n/?] m
  OCFS2 Userspace Clustering (OCFS2_FS_USERSPACE_CLUSTER) [M/n/?] m
  OCFS2 statistics (OCFS2_FS_STATS) [Y/n/?] y
  OCFS2 logging support (OCFS2_DEBUG_MASKLOG) [N/y/?] n
  OCFS2 expensive checks (OCFS2_DEBUG_FS) [N/y/?] n
Btrfs filesystem support (BTRFS_FS) [M/n/y/?] m
  Btrfs POSIX Access Control Lists (BTRFS_FS_POSIX_ACL) [Y/n/?] y
  Btrfs will run sanity tests upon loading (BTRFS_FS_RUN_SANITY_TESTS) [N/y/?] n
  Btrfs debugging support (BTRFS_DEBUG) [N/y/?] n
  Btrfs assert support (BTRFS_ASSERT) [N/y/?] n
  Btrfs with the ref verify tool compiled in (BTRFS_FS_REF_VERIFY) [N/y/?] n
NILFS2 file system support (NILFS2_FS) [M/n/y/?] m
F2FS filesystem support (F2FS_FS) [M/n/y/?] m
  F2FS Status Information (F2FS_STAT_FS) [Y/n/?] y
  F2FS extended attributes (F2FS_FS_XATTR) [Y/?] y
    F2FS Access Control Lists (F2FS_FS_POSIX_ACL) [Y/n/?] y
    F2FS Security Labels (F2FS_FS_SECURITY) [Y/n/?] y
  F2FS consistency checking feature (F2FS_CHECK_FS) [N/y/?] n
  F2FS fault injection facility (F2FS_FAULT_INJECTION) [N/y/?] n
  F2FS compression feature (F2FS_FS_COMPRESSION) [Y/n/?] y
    LZO compression support (F2FS_FS_LZO) [Y/n/?] y
      LZO-RLE compression support (F2FS_FS_LZORLE) [Y/n/?] y
    LZ4 compression support (F2FS_FS_LZ4) [Y/n/?] y
      LZ4HC compression support (F2FS_FS_LZ4HC) [Y/n/?] y
    ZSTD compression support (F2FS_FS_ZSTD) [Y/n/?] y
  F2FS IO statistics information (F2FS_IOSTAT) [Y/n/?] y
  F2FS unfair rw_semaphore (F2FS_UNFAIR_RWSEM) [N/y/?] n
bcachefs filesystem support (EXPERIMENTAL) (BCACHEFS_FS) [N/m/y/?] (NEW)
zonefs filesystem support (ZONEFS_FS) [M/n/y/?] m
File system based Direct Access (DAX) support (FS_DAX) [Y/n/?] y
Enable filesystem export operations for block IO (EXPORTFS_BLOCK_OPS) [Y/?] y
FS Encryption (Per-file encryption) (FS_ENCRYPTION) [Y/n/?] y
FS Verity (read-only file-based authenticity protection) (FS_VERITY) [Y/n/?] y
  FS Verity builtin signature support (FS_VERITY_BUILTIN_SIGNATURES) [N/y/?] n
Dnotify support (DNOTIFY) [Y/n/?] y
Inotify support for userspace (INOTIFY_USER) [Y/?] y
Filesystem wide access notification (FANOTIFY) [Y/?] y
  fanotify permissions checking (FANOTIFY_ACCESS_PERMISSIONS) [Y/n/?] y
Quota support (QUOTA) [Y/?] y
Report quota messages through netlink interface (QUOTA_NETLINK_INTERFACE) [Y/n/?] y
Additional quota sanity checks (QUOTA_DEBUG) [N/y/?] n
Old quota format support (QFMT_V1) [N/m/y/?] n
Quota format vfsv0 and vfsv1 support (QFMT_V2) [Y/n/m/?] y
Kernel automounter support (supports v3, v4 and v5) (AUTOFS_FS) [Y/?] y
FUSE (Filesystem in Userspace) support (FUSE_FS) [M/n/y/?] m
  Character device in Userspace support (CUSE) [M/n/?] m
  Virtio Filesystem (VIRTIO_FS) [N/m/?] n
  FUSE passthrough operations support (FUSE_PASSTHROUGH) [Y/n/?] (NEW)
Overlay filesystem support (OVERLAY_FS) [M/n/y/?] m
  Overlayfs: turn on redirect directory feature by default (OVERLAY_FS_REDIRECT_DIR) [N/y/?] n
  Overlayfs: follow redirects even if redirects are turned off (OVERLAY_FS_REDIRECT_ALWAYS_FOLLOW) [Y/n/?] y
  Overlayfs: turn on inodes index feature by default (OVERLAY_FS_INDEX) [N/y/?] n
  Overlayfs: auto enable inode number mapping (OVERLAY_FS_XINO_AUTO) [N/y/?] n
  Overlayfs: turn on metadata only copy up feature by default (OVERLAY_FS_METACOPY) [N/y/?] n
  Overlayfs: turn on extra debugging checks (OVERLAY_FS_DEBUG) [N/y/?] (NEW)
*
* Caches
*
Gather statistical information on local caching (NETFS_STATS) [Y/?] y
Enable dynamic debugging netfslib and FS-Cache (NETFS_DEBUG) [N/y/?] (NEW)
General filesystem local caching manager (FSCACHE) [Y/?] (NEW) y
  Gather statistical information on local caching (FSCACHE_STATS) [Y/n/?] y
  Filesystem caching on files (CACHEFILES) [M/n/?] m
    Debug CacheFiles (CACHEFILES_DEBUG) [N/y/?] n
    Provide error injection for cachefiles (CACHEFILES_ERROR_INJECTION) [N/y/?] n
    Support for on-demand read (CACHEFILES_ONDEMAND) [N/y/?] n
*
* DOS/FAT/EXFAT/NT Filesystems
*
MSDOS fs support (MSDOS_FS) [M/n/y/?] m
VFAT (Windows-95) fs support (VFAT_FS) [M/n/y/?] m
Default codepage for FAT (FAT_DEFAULT_CODEPAGE) [437] 437
Default iocharset for FAT (FAT_DEFAULT_IOCHARSET) [ascii] ascii
Enable FAT UTF-8 option by default (FAT_DEFAULT_UTF8) [N/y/?] n
exFAT filesystem support (EXFAT_FS) [M/n/y/?] m
  Default iocharset for exFAT (EXFAT_DEFAULT_IOCHARSET) [utf8] utf8
NTFS Read-Write file system support (NTFS3_FS) [M/y/?] m
  64 bits per NTFS clusters (NTFS3_64BIT_CLUSTER) [N/y/?] (NEW)
  activate support of external compressions lzx/xpress (NTFS3_LZX_XPRESS) [N/y/?] (NEW)
  NTFS POSIX Access Control Lists (NTFS3_FS_POSIX_ACL) [N/y/?] (NEW)
NTFS file system support (NTFS_FS) [M/n/y/?] m
*
* Pseudo filesystems
*
/proc file system support (PROC_FS) [Y/?] y
  /proc/kcore support (PROC_KCORE) [Y/n/?] y
  /proc/vmcore support (PROC_VMCORE) [Y/n/?] y
    Device Hardware/Firmware Log Collection (PROC_VMCORE_DEVICE_DUMP) [Y/n/?] y
  Include /proc/<pid>/task/<tid>/children file (PROC_CHILDREN) [Y/?] y
Tmpfs virtual memory file system support (former shm fs) (TMPFS) [Y/?] y
  Tmpfs POSIX Access Control Lists (TMPFS_POSIX_ACL) [Y/?] y
  Tmpfs extended attributes (TMPFS_XATTR) [Y/?] y
  Use 64-bit ino_t by default in tmpfs (TMPFS_INODE64) [Y/n/?] y
  Tmpfs quota support (TMPFS_QUOTA) [N/y/?] (NEW)
Userspace-driven configuration filesystem (CONFIGFS_FS) [M/y/?] m
EFI Variable filesystem (EFIVAR_FS) [M/n/y/?] m
*
* Miscellaneous filesystems
*
Miscellaneous filesystems (MISC_FILESYSTEMS) [Y/?] y
  ORANGEFS (Powered by PVFS) support (ORANGEFS_FS) [M/n/y/?] m
  ADFS file system support (ADFS_FS) [N/m/y/?] n
  Amiga FFS file system support (AFFS_FS) [M/n/y/?] m
  eCrypt filesystem layer support (ECRYPT_FS) [M/n/y/?] m
    Enable notifications for userspace key wrap/unwrap (ECRYPT_FS_MESSAGING) [N/y/?] n
  Apple Macintosh file system support (HFS_FS) [M/n/y/?] m
  Apple Extended HFS file system support (HFSPLUS_FS) [M/n/y/?] m
  BeOS file system (BeFS) support (read only) (BEFS_FS) [M/n/y/?] m
    Debug BeFS (BEFS_DEBUG) [N/y/?] n
  BFS file system support (BFS_FS) [N/m/y/?] n
  EFS file system support (read only) (EFS_FS) [N/m/y/?] n
  Journalling Flash File System v2 (JFFS2) support (JFFS2_FS) [M/n/?] m
    JFFS2 debugging verbosity (0 = quiet, 2 = noisy) (JFFS2_FS_DEBUG) [0] 0
    JFFS2 write-buffering support (JFFS2_FS_WRITEBUFFER) [Y/n/?] y
      Verify JFFS2 write-buffer reads (JFFS2_FS_WBUF_VERIFY) [N/y/?] n
    JFFS2 summary support (JFFS2_SUMMARY) [Y/n/?] y
    JFFS2 XATTR support (JFFS2_FS_XATTR) [Y/n/?] y
      JFFS2 POSIX Access Control Lists (JFFS2_FS_POSIX_ACL) [Y/n/?] y
      JFFS2 Security Labels (JFFS2_FS_SECURITY) [Y/n/?] y
    Advanced compression options for JFFS2 (JFFS2_COMPRESSION_OPTIONS) [N/y/?] n
  UBIFS file system support (UBIFS_FS) [M/n/?] m
    Advanced compression options (UBIFS_FS_ADVANCED_COMPR) [N/y/?] n
    Access time support (UBIFS_ATIME_SUPPORT) [Y/n/?] y
    UBIFS XATTR support (UBIFS_FS_XATTR) [Y/?] y
      UBIFS Security Labels (UBIFS_FS_SECURITY) [Y/n/?] y
    UBIFS authentication support (UBIFS_FS_AUTHENTICATION) [Y/n/?] y
  Compressed ROM file system support (cramfs) (CRAMFS) [M/n/y/?] m
    Support CramFs image directly mapped in physical memory (CRAMFS_MTD) [N/y/?] n
  SquashFS 4.0 - Squashed file system support (SQUASHFS) [M/n/y/?] m
    File decompression options
    > 1. Decompress file data into an intermediate buffer (SQUASHFS_FILE_CACHE)
      2. Decompress files directly into the page cache (SQUASHFS_FILE_DIRECT)
    choice[1-2?]: 1
    Select the parallel decompression mode during mount (SQUASHFS_CHOICE_DECOMP_BY_MOUNT) [N/y/?] (NEW)
      Select decompression parallel mode at compile time
      > 1. Single threaded compression (SQUASHFS_COMPILE_DECOMP_SINGLE) (NEW)
        2. Use multiple decompressors for parallel I/O (SQUASHFS_COMPILE_DECOMP_MULTI) (NEW)
        3. Use percpu multiple decompressors for parallel I/O (SQUASHFS_COMPILE_DECOMP_MULTI_PERCPU) (NEW)
      choice[1-3?]:
    Squashfs XATTR support (SQUASHFS_XATTR) [Y/n/?] y
    Include support for ZLIB compressed file systems (SQUASHFS_ZLIB) [Y/n/?] y
    Include support for LZ4 compressed file systems (SQUASHFS_LZ4) [Y/n/?] y
    Include support for LZO compressed file systems (SQUASHFS_LZO) [Y/n/?] y
    Include support for XZ compressed file systems (SQUASHFS_XZ) [Y/n/?] y
    Include support for ZSTD compressed file systems (SQUASHFS_ZSTD) [Y/n/?] y
    Use 4K device block size? (SQUASHFS_4K_DEVBLK_SIZE) [N/y/?] n
    Additional option for memory-constrained systems (SQUASHFS_EMBEDDED) [N/y/?] n
  FreeVxFS file system support (VERITAS VxFS(TM) compatible) (VXFS_FS) [N/m/y/?] n
  Minix file system support (MINIX_FS) [M/n/y/?] m
  SonicBlue Optimized MPEG File System support (OMFS_FS) [N/m/y/?] n
  OS/2 HPFS file system support (HPFS_FS) [N/m/y/?] n
  QNX4 file system support (read only) (QNX4FS_FS) [N/m/y/?] n
  QNX6 file system support (read only) (QNX6FS_FS) [N/m/y/?] n
  ROM file system support (ROMFS_FS) [M/n/y/?] m
    RomFS backing stores
    > 1. Block device-backed ROM file system support (ROMFS_BACKED_BY_BLOCK)
      2. MTD-backed ROM file system support (ROMFS_BACKED_BY_MTD)
      3. Both the above (ROMFS_BACKED_BY_BOTH)
    choice[1-3?]: 1
  Persistent store support (PSTORE) [Y/?] y
    Pstore compression (deflate) (PSTORE_COMPRESS) [Y/n/?] y
    Log kernel console messages (PSTORE_CONSOLE) [N/y/?] n
    Log user space messages (PSTORE_PMSG) [N/y/?] n
    Persistent function tracer (PSTORE_FTRACE) [N/y/?] n
    Log panic/oops to a RAM buffer (PSTORE_RAM) [M/n/y/?] m
    Log panic/oops to a block device (PSTORE_BLK) [M/n/y/?] m
      block device identifier (PSTORE_BLK_BLKDEV) []
      Size in Kbytes of kmsg dump log to store (PSTORE_BLK_KMSG_SIZE) [64] 64
      Maximum kmsg dump reason to store (PSTORE_BLK_MAX_REASON) [2] 2
  System V/Xenix/V7/Coherent file system support (SYSV_FS) [M/n/y/?] m
  UFS file system support (read only) (UFS_FS) [M/n/y/?] m
    UFS file system write support (DANGEROUS) (UFS_FS_WRITE) [N/y/?] n
    UFS debugging (UFS_DEBUG) [N/y/?] n
  EROFS filesystem support (EROFS_FS) [M/n/y/?] m
    EROFS debugging feature (EROFS_FS_DEBUG) [N/y/?] n
    EROFS extended attributes (EROFS_FS_XATTR) [Y/n/?] y
      EROFS Access Control Lists (EROFS_FS_POSIX_ACL) [Y/n/?] y
      EROFS Security Labels (EROFS_FS_SECURITY) [Y/n/?] y
    File-backed EROFS filesystem support (EROFS_FS_BACKED_BY_FILE) [Y/n/?] (NEW)
    EROFS Data Compression Support (EROFS_FS_ZIP) [Y/n/?] y
      EROFS LZMA compressed data support (EROFS_FS_ZIP_LZMA) [N/y/?] n
      EROFS DEFLATE compressed data support (EROFS_FS_ZIP_DEFLATE) [N/y/?] (NEW)
      EROFS Zstandard compressed data support (EROFS_FS_ZIP_ZSTD) [N/y/?] (NEW)
    EROFS fscache-based on-demand read support (deprecated) (EROFS_FS_ONDEMAND) [N/y/?] (NEW)
  EROFS per-cpu decompression kthread workers (EROFS_FS_PCPU_KTHREAD) [N/y/?] (NEW)
  VirtualBox guest shared folder (vboxsf) support (VBOXSF_FS) [M/n/?] m
*
* Network File Systems
*
Network File Systems (NETWORK_FILESYSTEMS) [Y/n/?] y
  NFS client support (NFS_FS) [M/n/y/?] m
    NFS client support for NFS version 2 (NFS_V2) [M/n/?] m
    NFS client support for NFS version 3 (NFS_V3) [M/n/?] m
      NFS client support for the NFSv3 ACL protocol extension (NFS_V3_ACL) [Y/n/?] y
    NFS client support for NFS version 4 (NFS_V4) [M/n/?] m
    Provide swap over NFS support (NFS_SWAP) [Y/n/?] y
  NFS client support for NFSv4.1 (NFS_V4_1) [Y/n/?] y
    NFS client support for NFSv4.2 (NFS_V4_2) [Y/n/?] y
    NFSv4.1 Implementation ID Domain (NFS_V4_1_IMPLEMENTATION_ID_DOMAIN) [kernel.org] kernel.org
    NFSv4.1 client support for migration (NFS_V4_1_MIGRATION) [N/y/?] n
  Provide NFS client caching support (NFS_FSCACHE) [Y/n/?] y
  Use the legacy NFS DNS resolver (NFS_USE_LEGACY_DNS) [N/y/?] n
  NFS: Disable NFS UDP protocol support (NFS_DISABLE_UDP_SUPPORT) [Y/n/?] y
  NFS: Enable support for the NFSv4.2 READ_PLUS operation (NFS_V4_2_READ_PLUS) [N/y/?] n
  NFS server support (NFSD) [M/n/y/?] m
    NFS server support for NFS version 2 (DEPRECATED) (NFSD_V2) [N/y/?] (NEW)
    NFS server support for the NFSv3 ACL protocol extension (NFSD_V3_ACL) [Y/n/?] y
    NFS server support for NFS version 4 (NFSD_V4) [Y/n/?] y
  NFSv4.1 server support for pNFS block layouts (NFSD_BLOCKLAYOUT) [Y/n/?] y
  NFSv4.1 server support for pNFS SCSI layouts (NFSD_SCSILAYOUT) [Y/n/?] y
  NFSv4.1 server support for pNFS Flex File layouts (NFSD_FLEXFILELAYOUT) [Y/n/?] y
  NFSv4.2 inter server to server COPY (NFSD_V4_2_INTER_SSC) [Y/n/?] y
  Provide Security Label support for NFSv4 server (NFSD_V4_SECURITY_LABEL) [Y/n/?] y
  Support legacy NFSv4 client tracking methods (DEPRECATED) (NFSD_LEGACY_CLIENT_TRACKING) [Y/n/?] (NEW)
  NFS client and server support for LOCALIO auxiliary protocol (NFS_LOCALIO) [N/y/?] (NEW)
  Secure RPC: Kerberos V mechanism (RPCSEC_GSS_KRB5) [M/?] m
    Enable Kerberos enctypes based on AES and SHA-1 (RPCSEC_GSS_KRB5_ENCTYPES_AES_SHA1) [Y/n/?] (NEW)
    Enable Kerberos encryption types based on Camellia and CMAC (RPCSEC_GSS_KRB5_ENCTYPES_CAMELLIA) [N/y/?] (NEW)
    Enable Kerberos enctypes based on AES and SHA-2 (RPCSEC_GSS_KRB5_ENCTYPES_AES_SHA2) [N/y/?] (NEW)
  RPC: Enable dprintk debugging (SUNRPC_DEBUG) [Y/n/?] y
  RPC-over-RDMA transport (SUNRPC_XPRT_RDMA) [M/n/?] m
  Ceph distributed file system (CEPH_FS) [M/n/y/?] m
    Enable Ceph client caching support (CEPH_FSCACHE) [Y/n/?] y
    Ceph POSIX Access Control Lists (CEPH_FS_POSIX_ACL) [Y/n/?] y
    CephFS Security Labels (CEPH_FS_SECURITY_LABEL) [Y/n/?] y
  SMB3 and CIFS support (advanced network filesystem) (CIFS) [M/n/y/?] m
    Extended statistics (CIFS_STATS2) [N/y/?] n
    Support legacy servers which use less secure dialects (CIFS_ALLOW_INSECURE_LEGACY) [Y/n/?] y
    Kerberos/SPNEGO advanced session setup (CIFS_UPCALL) [Y/n/?] y
    CIFS extended attributes (CIFS_XATTR) [Y/n/?] y
      CIFS POSIX Extensions (CIFS_POSIX) [Y/n/?] y
    Enable CIFS debugging routines (CIFS_DEBUG) [Y/n/?] y
      Enable additional CIFS debugging routines (CIFS_DEBUG2) [N/y/?] n
      Dump encryption keys for offline decryption (Unsafe) (CIFS_DEBUG_DUMP_KEYS) [N/y/?] n
    DFS feature support (CIFS_DFS_UPCALL) [Y/n/?] y
    SWN feature support (CIFS_SWN_UPCALL) [Y/n/?] y
    SMB Direct support (CIFS_SMB_DIRECT) [N/y/?] n
    Provide CIFS client caching support (CIFS_FSCACHE) [Y/n/?] y
    SMB message compression (Experimental) (CIFS_COMPRESSION) [N/y/?] (NEW)
  SMB3 server support (SMB_SERVER) [N/m/y/?] n
  Coda file system support (advanced network fs) (CODA_FS) [M/n/y/?] m
  Andrew File System support (AFS) (AFS_FS) [M/n/y/?] m
    AFS dynamic debugging (AFS_DEBUG) [Y/n/?] y
  Provide AFS client caching support (AFS_FSCACHE) [Y/n/?] y
  AFS server cursor debugging (AFS_DEBUG_CURSOR) [N/y/?] n
  Plan 9 Resource Sharing Support (9P2000) (9P_FS) [M/n/?] m
    Enable 9P client caching support (9P_FSCACHE) [Y/n/?] y
    9P POSIX Access Control Lists (9P_FS_POSIX_ACL) [Y/n/?] y
    9P Security Labels (9P_FS_SECURITY) [Y/n/?] y
UTF-8 normalization and casefolding support (UNICODE) [Y/n/m/?] y
  Test UTF-8 normalization support (UNICODE_NORMALIZATION_SELFTEST) [N/m/y/?] n
*
* Security options
*
Enable access key retention support (KEYS) [Y/?] y
  Enable temporary caching of the last request_key() result (KEYS_REQUEST_CACHE) [Y/n/?] y
  Enable register of persistent per-UID keyrings (PERSISTENT_KEYRINGS) [Y/n/?] y
  TRUSTED KEYS (TRUSTED_KEYS) [M/n/y/?] m
    TPM-based trusted keys (TRUSTED_KEYS_TPM) [Y/n/?] y
  ENCRYPTED KEYS (ENCRYPTED_KEYS) [Y/?] y
    Allow encrypted keys with user decrypted data (USER_DECRYPTED_DATA) [N/y/?] n
  Diffie-Hellman operations on retained keys (KEY_DH_OPERATIONS) [Y/n/?] y
  Provide key/keyring change notifications (KEY_NOTIFICATIONS) [Y/n/?] y
Restrict unprivileged access to the kernel syslog (SECURITY_DMESG_RESTRICT) [N/y/?] n
Allow /proc/pid/mem access override
> 1. Traditional /proc/pid/mem behavior (PROC_MEM_ALWAYS_FORCE) (NEW)
  2. Require active ptrace() use for access override (PROC_MEM_FORCE_PTRACE) (NEW)
  3. Never (PROC_MEM_NO_FORCE) (NEW)
choice[1-3?]:
Enable different security models (SECURITY) [Y/n/?] y
Enable the securityfs filesystem (SECURITYFS) [Y/?] y
Socket and Networking Security Hooks (SECURITY_NETWORK) [Y/n/?] y
Infiniband Security Hooks (SECURITY_INFINIBAND) [Y/n/?] y
XFRM (IPSec) Networking Security Hooks (SECURITY_NETWORK_XFRM) [Y/n/?] y
Security hooks for pathname based access control (SECURITY_PATH) [Y/?] y
Enable Intel(R) Trusted Execution Technology (Intel(R) TXT) (INTEL_TXT) [Y/n/?] y
Low address space for LSM to protect from user allocation (LSM_MMAP_MIN_ADDR) [65536] 65536
Harden memory copies between kernel and userspace (HARDENED_USERCOPY) [Y/n/?] y
Harden common str/mem functions against buffer overflows (FORTIFY_SOURCE) [Y/n/?] y
Force all usermode helper calls through a single binary (STATIC_USERMODEHELPER) [N/y/?] n
SELinux Support (SECURITY_SELINUX) [Y/n/?] y
  SELinux boot parameter (SECURITY_SELINUX_BOOTPARAM) [Y/n/?] y
  SELinux Development Support (SECURITY_SELINUX_DEVELOP) [Y/n/?] y
  SELinux AVC Statistics (SECURITY_SELINUX_AVC_STATS) [Y/n/?] y
  SELinux sidtab hashtable size (SECURITY_SELINUX_SIDTAB_HASH_BITS) [9] 9
  SELinux SID to context string translation cache size (SECURITY_SELINUX_SID2STR_CACHE_SIZE) [256] 256
  SELinux kernel debugging support (SECURITY_SELINUX_DEBUG) [N/y/?] (NEW)
Simplified Mandatory Access Control Kernel Support (SECURITY_SMACK) [N/y/?] n
TOMOYO Linux Support (SECURITY_TOMOYO) [N/y/?] n
AppArmor support (SECURITY_APPARMOR) [N/y/?] n
Pin load of kernel files (modules, fw, etc) to one filesystem (SECURITY_LOADPIN) [N/y/?] n
Yama support (SECURITY_YAMA) [Y/n/?] y
Gate setid transitions to limit CAP_SET{U/G}ID capabilities (SECURITY_SAFESETID) [N/y/?] n
Basic module for enforcing kernel lockdown (SECURITY_LOCKDOWN_LSM) [Y/n/?] y
  Enable lockdown LSM early in init (SECURITY_LOCKDOWN_LSM_EARLY) [Y/n/?] y
  Kernel default lockdown mode
  > 1. None (LOCK_DOWN_KERNEL_FORCE_NONE)
    2. Integrity (LOCK_DOWN_KERNEL_FORCE_INTEGRITY)
    3. Confidentiality (LOCK_DOWN_KERNEL_FORCE_CONFIDENTIALITY)
  choice[1-3?]: 1
Landlock support (SECURITY_LANDLOCK) [N/y/?] n
*
* Integrity Policy Enforcement (IPE)
*
Integrity Policy Enforcement (IPE) (SECURITY_IPE) [N/y/?] (NEW)
Integrity subsystem (INTEGRITY) [Y/n/?] y
  Digital signature verification using multiple keyrings (INTEGRITY_SIGNATURE) [Y/n/?] y
    Enable asymmetric keys support (INTEGRITY_ASYMMETRIC_KEYS) [Y/n/?] y
      Require all keys on the integrity keyrings be signed (INTEGRITY_TRUSTED_KEYRING) [Y/?] y
      Provide keyring for platform/firmware trusted keys (INTEGRITY_PLATFORM_KEYRING) [Y/n/?] y
      Provide a keyring to which Machine Owner Keys may be added (INTEGRITY_MACHINE_KEYRING) [N/y/?] (NEW)
  Enables integrity auditing support  (INTEGRITY_AUDIT) [Y/?] y
  Integrity Measurement Architecture(IMA) (IMA) [Y/n/?] y
    Enable carrying the IMA measurement list across a soft boot (IMA_KEXEC) [N/y/?] n
    Default template
    > 1. ima-ng (default) (IMA_NG_TEMPLATE)
      2. ima-sig (IMA_SIG_TEMPLATE)
    choice[1-2?]: 1
    Default integrity hash algorithm
      1. SHA1 (default) (IMA_DEFAULT_HASH_SHA1)
    > 2. SHA256 (IMA_DEFAULT_HASH_SHA256)
      3. SHA512 (IMA_DEFAULT_HASH_SHA512)
    choice[1-3?]: 2
    Enable multiple writes to the IMA policy (IMA_WRITE_POLICY) [Y/n/?] y
    Enable reading back the current IMA policy (IMA_READ_POLICY) [Y/n/?] y
    Appraise integrity measurements (IMA_APPRAISE) [Y/n/?] y
      Enable loading an IMA architecture specific policy (IMA_ARCH_POLICY) [Y/n/?] y
      IMA build time configured policy rules (IMA_APPRAISE_BUILD_POLICY) [N/y/?] n
      ima_appraise boot parameter (IMA_APPRAISE_BOOTPARAM) [Y/n/?] y
      Support module-style signatures for appraisal (IMA_APPRAISE_MODSIG) [Y/n/?] y
    Permit keys validly signed by a built-in, machine (if configured) or secondary (IMA_KEYRINGS_PERMIT_SIGNED_BY_BUILTIN_OR_SECONDARY) [Y/n/?] y
    Create IMA machine owner blacklist keyrings (EXPERIMENTAL) (IMA_BLACKLIST_KEYRING) [N/y/?] (NEW)
    Load X509 certificate onto the '.ima' trusted keyring (IMA_LOAD_X509) [N/y/?] (NEW)
    Disable htable to allow measurement of duplicate records (IMA_DISABLE_HTABLE) [N/y/?] n
  EVM support (EVM) [Y/n/?] y
    FSUUID (version 2) (EVM_ATTR_FSUUID) [Y/n/?] y
    Add additional EVM extended attributes at runtime (EVM_ADD_XATTRS) [N/y/?] n
    Load an X509 certificate onto the '.evm' trusted keyring (EVM_LOAD_X509) [N/y/?] n
First legacy 'major LSM' to be initialized
> 1. SELinux (DEFAULT_SECURITY_SELINUX)
  2. Unix Discretionary Access Controls (DEFAULT_SECURITY_DAC)
choice[1-2?]: 1
Ordered list of enabled LSMs (LSM) [yama,loadpin,safesetid,integrity,selinux,smack,tomoyo,apparmor] yama,loadpin,safesetid,integrity,selinux,smack,tomoyo,apparmor
*
* Accelerated Cryptographic Algorithms for CPU (x86)
*
Public key crypto: Curve25519 (ADX) (CRYPTO_CURVE25519_X86) [M/y/?] m
Ciphers: AES, modes: ECB, CBC, CTS, CTR, XCTR, XTS, GCM (AES-NI/VAES) (CRYPTO_AES_NI_INTEL) [M/n/y/?] m
Ciphers: Blowfish, modes: ECB, CBC (CRYPTO_BLOWFISH_X86_64) [M/n/y/?] m
Ciphers: Camellia with modes: ECB, CBC (CRYPTO_CAMELLIA_X86_64) [M/y/?] m
Ciphers: Camellia with modes: ECB, CBC (AES-NI/AVX) (CRYPTO_CAMELLIA_AESNI_AVX_X86_64) [M/y/?] m
Ciphers: Camellia with modes: ECB, CBC (AES-NI/AVX2) (CRYPTO_CAMELLIA_AESNI_AVX2_X86_64) [M/n/y/?] m
Ciphers: CAST5 with modes: ECB, CBC (AVX) (CRYPTO_CAST5_AVX_X86_64) [M/n/y/?] m
Ciphers: CAST6 with modes: ECB, CBC (AVX) (CRYPTO_CAST6_AVX_X86_64) [M/n/y/?] m
Ciphers: Triple DES EDE with modes: ECB, CBC (CRYPTO_DES3_EDE_X86_64) [M/n/y/?] m
Ciphers: Serpent with modes: ECB, CBC (SSE2) (CRYPTO_SERPENT_SSE2_X86_64) [M/n/y/?] m
Ciphers: Serpent with modes: ECB, CBC (AVX) (CRYPTO_SERPENT_AVX_X86_64) [M/y/?] m
Ciphers: Serpent with modes: ECB, CBC (AVX2) (CRYPTO_SERPENT_AVX2_X86_64) [M/n/y/?] m
Ciphers: SM4 with modes: ECB, CBC, CTR (AES-NI/AVX) (CRYPTO_SM4_AESNI_AVX_X86_64) [N/m/y/?] n
Ciphers: SM4 with modes: ECB, CBC, CTR (AES-NI/AVX2) (CRYPTO_SM4_AESNI_AVX2_X86_64) [N/m/y/?] n
Ciphers: Twofish (CRYPTO_TWOFISH_X86_64) [M/y/?] m
Ciphers: Twofish with modes: ECB, CBC (3-way parallel) (CRYPTO_TWOFISH_X86_64_3WAY) [M/y/?] m
Ciphers: Twofish with modes: ECB, CBC (AVX) (CRYPTO_TWOFISH_AVX_X86_64) [M/n/y/?] m
Ciphers: ARIA with modes: ECB, CTR (AES-NI/AVX/GFNI) (CRYPTO_ARIA_AESNI_AVX_X86_64) [N/m/y/?] n
Ciphers: ARIA with modes: ECB, CTR (AES-NI/AVX2/GFNI) (CRYPTO_ARIA_AESNI_AVX2_X86_64) [N/m/y/?] (NEW)
Ciphers: ARIA with modes: ECB, CTR (AVX512/GFNI) (CRYPTO_ARIA_GFNI_AVX512_X86_64) [N/m/y/?] (NEW)
Ciphers: ChaCha20, XChaCha20, XChaCha12 (SSSE3/AVX2/AVX-512VL) (CRYPTO_CHACHA20_X86_64) [M/y/?] m
AEAD ciphers: AEGIS-128 (AES-NI/SSE2) (CRYPTO_AEGIS128_AESNI_SSE2) [M/n/y/?] m
Hash functions: NHPoly1305 (SSE2) (CRYPTO_NHPOLY1305_SSE2) [M/n/y/?] m
Hash functions: NHPoly1305 (AVX2) (CRYPTO_NHPOLY1305_AVX2) [M/n/y/?] m
Hash functions: BLAKE2s (SSSE3/AVX-512) (CRYPTO_BLAKE2S_X86) [Y/?] y
Hash functions: POLYVAL (CLMUL-NI) (CRYPTO_POLYVAL_CLMUL_NI) [N/m/y/?] n
Hash functions: Poly1305 (SSE2/AVX2) (CRYPTO_POLY1305_X86_64) [M/y/?] m
Hash functions: SHA-1 (SSSE3/AVX/AVX2/SHA-NI) (CRYPTO_SHA1_SSSE3) [M/n/y/?] m
Hash functions: SHA-224 and SHA-256 (SSSE3/AVX/AVX2/SHA-NI) (CRYPTO_SHA256_SSSE3) [M/n/y/?] m
Hash functions: SHA-384 and SHA-512 (SSSE3/AVX/AVX2) (CRYPTO_SHA512_SSSE3) [M/n/y/?] m
Hash functions: SM3 (AVX) (CRYPTO_SM3_AVX_X86_64) [N/m/y/?] n
Hash functions: GHASH (CLMUL-NI) (CRYPTO_GHASH_CLMUL_NI_INTEL) [M/n/y/?] m
CRC32c (SSE4.2/PCLMULQDQ) (CRYPTO_CRC32C_INTEL) [M/y/?] m
CRC32 (PCLMULQDQ) (CRYPTO_CRC32_PCLMUL) [M/n/y/?] m
CRCT10DIF (PCLMULQDQ) (CRYPTO_CRCT10DIF_PCLMUL) [M/n/y/?] m
*
* Hardware crypto devices
*
Hardware crypto devices (CRYPTO_HW) [Y/n/?] y
  Support for VIA PadLock ACE (CRYPTO_DEV_PADLOCK) [M/n/y/?] m
    PadLock driver for AES algorithm (CRYPTO_DEV_PADLOCK_AES) [M/n/?] m
    PadLock driver for SHA1 and SHA256 algorithms (CRYPTO_DEV_PADLOCK_SHA) [M/n/?] m
  Support for Microchip / Atmel ECC hw accelerator (CRYPTO_DEV_ATMEL_ECC) [M/n/?] m
  Support for Microchip / Atmel SHA accelerator and RNG (CRYPTO_DEV_ATMEL_SHA204A) [M/n/?] m
  Support for AMD Secure Processor (CRYPTO_DEV_CCP) [Y/n/?] y
    Secure Processor device driver (CRYPTO_DEV_CCP_DD) [M/n/y/?] m
      Cryptographic Coprocessor device (CRYPTO_DEV_SP_CCP) [Y/n/?] y
        Encryption and hashing offload support (CRYPTO_DEV_CCP_CRYPTO) [M/n/?] m
      Platform Security Processor (PSP) device (CRYPTO_DEV_SP_PSP) [Y/n/?] y
    Enable CCP Internals in DebugFS (CRYPTO_DEV_CCP_DEBUGFS) [N/y/?] n
  Support for Cavium CNN55XX driver (CRYPTO_DEV_NITROX_CNN55XX) [N/m/y/?] n
  Support for Intel(R) DH895xCC (CRYPTO_DEV_QAT_DH895xCC) [M/n/y/?] m
  Support for Intel(R) C3XXX (CRYPTO_DEV_QAT_C3XXX) [M/n/y/?] m
  Support for Intel(R) C62X (CRYPTO_DEV_QAT_C62X) [M/n/y/?] m
  Support for Intel(R) QAT_4XXX (CRYPTO_DEV_QAT_4XXX) [M/n/y/?] m
  Support for Intel(R) QAT_420XX (CRYPTO_DEV_QAT_420XX) [N/m/y/?] (NEW)
  Support for Intel(R) DH895xCC Virtual Function (CRYPTO_DEV_QAT_DH895xCCVF) [M/n/y/?] m
  Support for Intel(R) C3XXX Virtual Function (CRYPTO_DEV_QAT_C3XXXVF) [M/n/y/?] m
  Support for Intel(R) C62X Virtual Function (CRYPTO_DEV_QAT_C62XVF) [M/n/y/?] m
  Support for Intel(R) QAT Devices Heartbeat Error Injection (CRYPTO_DEV_QAT_ERROR_INJECTION) [N/y/?] (NEW)
  Support for Intel(R) IAA Compression Accelerator (CRYPTO_DEV_IAA_CRYPTO) [N/m/?] (NEW)
  Chelsio Crypto Co-processor Driver (CRYPTO_DEV_CHELSIO) [M/n/?] m
  Inside Secure's SafeXcel cryptographic engine driver (CRYPTO_DEV_SAFEXCEL) [N/m/y/?] n
  Support for amlogic cryptographic offloader (CRYPTO_DEV_AMLOGIC_GXL) [N/m/y/?] n
*
* Certificates for signature checking
*
File name or PKCS#11 URI of module signing key (MODULE_SIG_KEY) [certs/signing_key.pem] certs/signing_key.pem
Type of module signing key to be generated
> 1. RSA (MODULE_SIG_KEY_TYPE_RSA)
choice[1]: 1
Provide system-wide ring of trusted keys (SYSTEM_TRUSTED_KEYRING) [Y/?] y
  Additional X.509 keys for default system keyring (SYSTEM_TRUSTED_KEYS) []
  Reserve area for inserting a certificate without recompiling (SYSTEM_EXTRA_CERTIFICATE) [N/y/?] n
  Provide a keyring to which extra trustable keys may be added (SECONDARY_TRUSTED_KEYRING) [Y/n/?] y
    Only allow additional certs signed by keys on the builtin trusted keyring (SECONDARY_TRUSTED_KEYRING_SIGNED_BY_BUILTIN) [N/y/?] (NEW)
Provide system-wide ring of blacklisted keys (SYSTEM_BLACKLIST_KEYRING) [Y/n/?] y
  Hashes to be preloaded into the system blacklist keyring (SYSTEM_BLACKLIST_HASH_LIST) []
  Provide system-wide ring of revocation certificates (SYSTEM_REVOCATION_LIST) [N/y/?] n
  Allow root to add signed blacklist keys (SYSTEM_BLACKLIST_AUTH_UPDATE) [N/y/?] n
*
* Library routines
*
Automatically choose fastest RAID6 PQ functions (RAID6_PQ_BENCHMARK) [N/y/?] n
Generic bitfield packing and unpacking (PACKING) [Y/?] y
CORDIC algorithm (CORDIC) [M/y/?] m
Simple prime number generator for testing (PRIME_NUMBERS) [N/m/y/?] n
CRC-CCITT functions (CRC_CCITT) [Y/?] y
CRC16 functions (CRC16) [Y/m/?] y
CRC calculation for the T10 Data Integrity Field (CRC_T10DIF) [Y/?] y
CRC calculation for the Rocksoft model CRC64 (CRC64_ROCKSOFT) [Y/?] y
CRC ITU-T V.41 functions (CRC_ITU_T) [M/y/?] m
CRC32/CRC32c functions (CRC32) [Y/?] y
  CRC32 perform self test on init (CRC32_SELFTEST) [N/m/y/?] n
  CRC32 implementation
  > 1. Slice by 8 bytes (CRC32_SLICEBY8)
    2. Slice by 4 bytes (CRC32_SLICEBY4)
    3. Sarwate's Algorithm (one byte at a time) (CRC32_SARWATE)
    4. Classic Algorithm (one bit at a time) (CRC32_BIT)
  choice[1-4?]: 1
CRC64 functions (CRC64) [Y/?] y
CRC4 functions (CRC4) [M/n/y/?] m
CRC7 functions (CRC7) [M/y/?] m
CRC32c (Castagnoli, et al) Cyclic Redundancy-Check (LIBCRC32C) [M/y/?] m
CRC8 function (CRC8) [M/y/?] m
PRNG perform self test on init (RANDOM32_SELFTEST) [N/y/?] n
XZ decompression support (XZ_DEC) [Y/?] y
  MicroLZMA decoder (XZ_DEC_MICROLZMA) [N/y/?] n
XZ decompressor tester (XZ_DEC_TEST) [N/m/y/?] n
Dynamic allocation of DMA bounce buffers (SWIOTLB_DYNAMIC) [N/y/?] (NEW)
DMA Contiguous Memory Allocator (DMA_CMA) [Y/n/?] y
  Enable separate DMA Contiguous Memory Area for NUMA Node (DMA_NUMA_CMA) [N/y/?] (NEW)
  *
  * Default contiguous memory area size:
  *
  Size in Mega Bytes (CMA_SIZE_MBYTES) [0] 0
  Selected region size
  > 1. Use mega bytes value only (CMA_SIZE_SEL_MBYTES)
    2. Use percentage value only (CMA_SIZE_SEL_PERCENTAGE)
    3. Use lower value (minimum) (CMA_SIZE_SEL_MIN)
    4. Use higher value (maximum) (CMA_SIZE_SEL_MAX)
  choice[1-4?]: 1
  Maximum PAGE_SIZE order of alignment for contiguous buffers (CMA_ALIGNMENT) [8] 8
Enable debugging of DMA-API usage (DMA_API_DEBUG) [N/y/?] n
Enable benchmarking of streaming DMA mapping (DMA_MAP_BENCHMARK) [N/y/?] n
glob self-test on init (GLOB_SELFTEST) [N/m/y/?] n
IRQ polling library (IRQ_POLL) [Y/?] y
Select compiled-in fonts (FONTS) [Y/n/?] y
  VGA 8x8 font (FONT_8x8) [N/y/?] n
  VGA 8x16 font (FONT_8x16) [Y/?] y
  Mac console 6x11 font (not supported by all drivers) (FONT_6x11) [N/y/?] n
  console 7x14 font (not supported by all drivers) (FONT_7x14) [N/y/?] n
  Pearl (old m68k) console 8x8 font (FONT_PEARL_8x8) [N/y/?] n
  Acorn console 8x8 font (FONT_ACORN_8x8) [N/y/?] n
  Mini 4x6 font (FONT_MINI_4x6) [N/y/?] n
  Medium-size 6x10 font (FONT_6x10) [Y/n/?] y
  console 10x18 font (not supported by all drivers) (FONT_10x18) [N/y/?] n
Sparc console 8x16 font (FONT_SUN8x16) [N/y/?] n
Sparc console 12x22 font (not supported by all drivers) (FONT_SUN12x22) [N/y/?] n
Terminus 16x32 font (not supported by all drivers) (FONT_TER16x32) [Y/n/?] y
OLED 6x8 font (FONT_6x8) [N/y/?] n
Maximum number of frames in trace saved in stack depot (STACKDEPOT_MAX_FRAMES) [64] (NEW)
Boot-time test for lwq queuing (LWQ_TEST) [N/y/?] (NEW)
*
* Memory Debugging
*
Extend memmap on extra space for more information on page (PAGE_EXTENSION) [N/y/?] n
Debug page memory allocations (DEBUG_PAGEALLOC) [N/y/?] n
Enable SLUB debugging support (SLUB_DEBUG) [Y/?] y
  SLUB debugging on by default (SLUB_DEBUG_ON) [N/y/?] n
Track page owner (PAGE_OWNER) [N/y/?] n
Check for invalid mappings in user page tables (PAGE_TABLE_CHECK) [N/y/?] n
Poison pages after freeing (PAGE_POISONING) [N/y/?] n
Enable tracepoint to track down page reference manipulation (DEBUG_PAGE_REF) [N/y/?] n
Testcase for the marking rodata read-only (DEBUG_RODATA_TEST) [Y/n/?] y
Warn on W+X mappings at boot (DEBUG_WX) [Y/n/?] y
Export kernel pagetable layout to userspace via debugfs (PTDUMP_DEBUGFS) [N/y/?] n
Kernel memory leak detector (DEBUG_KMEMLEAK) [N/y/?] n
Statistics for per-vma locks (PER_VMA_LOCK_STATS) [N/y/?] (NEW)
Debug object operations (DEBUG_OBJECTS) [N/y/?] n
Enable shrinker debugging support (SHRINKER_DEBUG) [N/y/?] n
Stack utilization instrumentation (DEBUG_STACK_USAGE) [N/y/?] n
Detect stack corruption on calls to schedule() (SCHED_STACK_END_CHECK) [Y/n/?] y
Debug VM (DEBUG_VM) [Y/n/?] y
  Debug VM maple trees (DEBUG_VM_MAPLE_TREE) [N/y/?] n
  Debug VM red-black trees (DEBUG_VM_RB) [N/y/?] n
  Debug page-flags operations (DEBUG_VM_PGFLAGS) [N/y/?] n
Debug arch page table for semantics compliance (DEBUG_VM_PGTABLE) [Y/n/?] y
Debug VM translations (DEBUG_VIRTUAL) [N/y/?] n
Memory hotplug notifier error injection module (MEMORY_NOTIFIER_ERROR_INJECT) [N/m/?] n
Debug access to per_cpu maps (DEBUG_PER_CPU_MAPS) [N/y/?] n
Enable memory allocation profiling (MEM_ALLOC_PROFILING) [N/y/?] (NEW)
*
* Debug Oops, Lockups and Hangs
*
Panic on Oops (PANIC_ON_OOPS) [N/y/?] n
panic timeout (PANIC_TIMEOUT) [0] 0
Detect Soft Lockups (SOFTLOCKUP_DETECTOR) [Y/?] y
  Detect Interrupt Storm in Soft Lockups (SOFTLOCKUP_DETECTOR_INTR_STORM) [N/y/?] (NEW)
  Panic (Reboot) On Soft Lockups (BOOTPARAM_SOFTLOCKUP_PANIC) [N/y/?] n
Detect Hard Lockups (HARDLOCKUP_DETECTOR) [Y/n/?] y
  Prefer the buddy CPU hardlockup detector (HARDLOCKUP_DETECTOR_PREFER_BUDDY) [N/y/?] (NEW)
Panic (Reboot) On Hard Lockups (BOOTPARAM_HARDLOCKUP_PANIC) [N/y/?] n
Detect Hung Tasks (DETECT_HUNG_TASK) [Y/n/?] y
  Default timeout for hung task detection (in seconds) (DEFAULT_HUNG_TASK_TIMEOUT) [120] 120
  Panic (Reboot) On Hung Tasks (BOOTPARAM_HUNG_TASK_PANIC) [N/y/?] n
Detect Workqueue Stalls (WQ_WATCHDOG) [N/y/?] n
Report per-cpu work items which hog CPU for too long (WQ_CPU_INTENSIVE_REPORT) [N/y/?] (NEW)
Test module to generate lockups (TEST_LOCKUP) [N/m/?] n
*
* Kernel hacking
*
Kernel debugging (DEBUG_KERNEL) [Y/n/?] y
  Miscellaneous debug code (DEBUG_MISC) [N/y/?] n
Debug shared IRQ handlers (DEBUG_SHIRQ) [Y/n/?] y
Debug preemptible kernel (DEBUG_PREEMPT) [Y/n/?] y
Debugging for CPUs failing to respond to backtrace requests (NMI_CHECK_CPU) [N/y/?] (NEW)
Debug IRQ flag manipulation (DEBUG_IRQFLAGS) [N/y/?] n
Stack backtrace support (STACKTRACE) [Y/?] y
Warn for all uses of unseeded randomness (WARN_ALL_UNSEEDED_RANDOM) [N/y/?] n
kobject debugging (DEBUG_KOBJECT) [N/y/?] n
*
* RCU Debugging
*
performance tests for RCU (RCU_SCALE_TEST) [N/m/y/?] n
torture tests for RCU (RCU_TORTURE_TEST) [M/n/y/?] m
Scalability tests for read-side synchronization (RCU and others) (RCU_REF_SCALE_TEST) [N/m/y/?] n
RCU CPU stall timeout in seconds (RCU_CPU_STALL_TIMEOUT) [60] 60
Expedited RCU CPU stall timeout in milliseconds (RCU_EXP_CPU_STALL_TIMEOUT) [0] 0
Provide additional RCU stall debug information (RCU_CPU_STALL_CPUTIME) [N/y/?] (NEW)
Enable tracing for RCU (RCU_TRACE) [N/y/?] n
Provide debugging asserts for adding NO_HZ support to an arch (RCU_EQS_DEBUG) [N/y/?] n
Force round-robin CPU selection for unbound work items (DEBUG_WQ_FORCE_RR_CPU) [N/y/?] n
Enable CPU hotplug state control (CPU_HOTPLUG_STATE_CONTROL) [N/y/?] n
Latency measuring infrastructure (LATENCYTOP) [Y/n/?] y
Disable inlining of cgroup css reference count functions (DEBUG_CGROUP_REF) [N/y/?] (NEW)
*
* Tracers
*
Tracers (FTRACE) [Y/n/?] y
  Boot-time Tracing support (BOOTTIME_TRACING) [Y/n/?] y
  Kernel Function Tracer (FUNCTION_TRACER) [Y/?] y
    Kernel Function Graph Tracer (FUNCTION_GRAPH_TRACER) [Y/n/?] y
      Kernel Function Graph Return Value (FUNCTION_GRAPH_RETVAL) [N/y/?] (NEW)
    enable/disable function tracing dynamically (DYNAMIC_FTRACE) [Y/n/?] y
  Kernel Function Probe (fprobe) (FPROBE) [N/y/?] n
  Kernel function profiler (FUNCTION_PROFILER) [Y/n/?] y
  Trace max stack (STACK_TRACER) [Y/n/?] y
  Interrupts-off Latency Tracer (IRQSOFF_TRACER) [N/y/?] n
  Preemption-off Latency Tracer (PREEMPT_TRACER) [N/y/?] n
  Scheduling Latency Tracer (SCHED_TRACER) [Y/n/?] y
  Tracer to detect hardware latencies (like SMIs) (HWLAT_TRACER) [Y/n/?] y
  OS Noise tracer (OSNOISE_TRACER) [N/y/?] n
  Timerlat tracer (TIMERLAT_TRACER) [N/y/?] n
  Memory mapped IO tracing (MMIOTRACE) [Y/n/?] y
  Trace syscalls (FTRACE_SYSCALLS) [Y/n/?] y
  Create a snapshot trace buffer (TRACER_SNAPSHOT) [Y/?] y
    Allow snapshot to swap per CPU (TRACER_SNAPSHOT_PER_CPU_SWAP) [N/y/?] n
  Branch Profiling
  > 1. No branch profiling (BRANCH_PROFILE_NONE)
    2. Trace likely/unlikely profiler (PROFILE_ANNOTATED_BRANCHES)
  choice[1-2?]: 1
  Support for tracing block IO actions (BLK_DEV_IO_TRACE) [Y/n/?] y
  Enable kprobes-based dynamic events (KPROBE_EVENTS) [Y/n/?] y
    Do NOT protect notrace function from kprobe events (KPROBE_EVENTS_ON_NOTRACE) [N/y/?] n
  Enable uprobes-based dynamic events (UPROBE_EVENTS) [Y/n/?] y
  Enable BPF programs to override a kprobed function (BPF_KPROBE_OVERRIDE) [N/y/?] n
  Synthetic trace events (SYNTH_EVENTS) [Y/?] y
  User trace events (USER_EVENTS) [N/y/?] (NEW)
  Histogram triggers (HIST_TRIGGERS) [Y/n/?] y
  Trace event injection (TRACE_EVENT_INJECT) [N/y/?] n
  Add tracepoint that benchmarks tracepoints (TRACEPOINT_BENCHMARK) [N/y/?] n
  Ring buffer benchmark stress tester (RING_BUFFER_BENCHMARK) [M/n/y/?] m
  Show eval mappings for trace events (TRACE_EVAL_MAP_FILE) [Y/n/?] y
  Record functions that recurse in function tracing (FTRACE_RECORD_RECURSION) [N/y/?] n
  Validate RCU is on during ftrace execution (FTRACE_VALIDATE_RCU_IS_WATCHING) [N/y/?] (NEW)
  Perform a startup test on ftrace (FTRACE_STARTUP_TEST) [N/y/?] n
  Verify compile time sorting of ftrace functions (FTRACE_SORT_STARTUP_TEST) [N/y/?] n
  Ring buffer startup self test (RING_BUFFER_STARTUP_TEST) [N/y/?] n
  Verify ring buffer time stamp deltas (RING_BUFFER_VALIDATE_TIME_DELTAS) [N/y/?] n
  Test module for mmiotrace (MMIOTRACE_TEST) [N/m/?] n
  Test module to create a preempt / IRQ disable delay thread to test latency tracers (PREEMPTIRQ_DELAY_TEST) [N/m/?] n
  Test module for in-kernel synthetic event generation (SYNTH_EVENT_GEN_TEST) [N/m/?] n
  Test module for in-kernel kprobe event generation (KPROBE_EVENT_GEN_TEST) [N/m/?] n
  Hist trigger debug support (HIST_TRIGGERS_DEBUG) [N/y/?] n
Remote debugging over FireWire early on boot (PROVIDE_OHCI1394_DMA_INIT) [Y/n/?] y
Filter access to /dev/mem (STRICT_DEVMEM) [Y/n/?] y
  Filter I/O access to /dev/mem (IO_STRICT_DEVMEM) [Y/n/?] y
*
* Runtime Testing
*
Runtime Testing (RUNTIME_TESTING_MENU) [Y/n/?] y
  Dhrystone benchmark test (TEST_DHRY) [N/m/y/?] (NEW)
  Linux Kernel Dump Test Tool Module (LKDTM) [N/m/y/?] n
  Min heap test (TEST_MIN_HEAP) [N/m/y/?] n
  64bit/32bit division and modulo test (TEST_DIV64) [N/m/y/?] n
  mul_u64_u64_div_u64() test (TEST_MULDIV64) [N/m/y/?] (NEW)
  Self test for the backtrace code (BACKTRACE_SELF_TEST) [N/m/y/?] n
  Self test for reference tracker (TEST_REF_TRACKER) [N/m/y/?] n
  Red-Black tree test (RBTREE_TEST) [N/m/y/?] n
  Reed-Solomon library test (REED_SOLOMON_TEST) [N/m/y/?] n
  Interval tree test (INTERVAL_TREE_TEST) [N/m/y/?] n
  Per cpu operations test (PERCPU_TEST) [N/m/?] n
  Perform an atomic64_t self-test (ATOMIC64_SELFTEST) [Y/n/m/?] y
  Self test for hardware accelerated raid6 recovery (ASYNC_RAID6_TEST) [M/n/?] m
  Test functions located in the hexdump module at runtime (TEST_HEXDUMP) [N/m/y/?] n
  Test kstrto*() family of functions at runtime (TEST_KSTRTOX) [Y/n/m/?] y
  Test printf() family of functions at runtime (TEST_PRINTF) [N/m/y/?] n
  Test scanf() family of functions at runtime (TEST_SCANF) [N/m/y/?] n
  Test bitmap_*() family of functions at runtime (TEST_BITMAP) [N/m/y/?] n
  Test functions located in the uuid module at runtime (TEST_UUID) [N/m/y/?] n
  Test the XArray code at runtime (TEST_XARRAY) [N/m/y/?] n
  Test the Maple Tree code at runtime or module load (TEST_MAPLE_TREE) [N/m/y/?] n
  Perform selftest on resizable hash table (TEST_RHASHTABLE) [N/m/y/?] n
  Perform selftest on IDA functions (TEST_IDA) [N/m/y/?] n
  Perform selftest on priority array manager (TEST_PARMAN) [N/m/?] n
  Test module loading with 'hello world' module (TEST_LKM) [N/m/?] n
  Test module for compilation of bitops operations (TEST_BITOPS) [N/m/y/?] n
  Test module for stress/performance analysis of vmalloc allocator (TEST_VMALLOC) [N/m/?] n
  Test BPF filter functionality (TEST_BPF) [N/m/?] n
  Test blackhole netdev functionality (TEST_BLACKHOLE_DEV) [N/m/?] n
  Test find_bit functions (FIND_BIT_BENCHMARK) [N/m/y/?] n
  Test firmware loading via userspace interface (TEST_FIRMWARE) [N/m/y/?] n
  sysctl test driver (TEST_SYSCTL) [N/m/y/?] n
  udelay test driver (TEST_UDELAY) [N/m/y/?] n
  Test static keys (TEST_STATIC_KEYS) [N/m/?] n
  Test DYNAMIC_DEBUG (TEST_DYNAMIC_DEBUG) [N/m/y/?] n
  kmod stress tester (TEST_KMOD) [N/m/?] n
  Test memcat_p() helper function (TEST_MEMCAT_P) [N/m/y/?] n
  Perform selftest on object aggreration manager (TEST_OBJAGG) [N/m/?] n
  Test heap/page initialization (TEST_MEMINIT) [N/m/y/?] n
  Test HMM (Heterogeneous Memory Management) (TEST_HMM) [N/m/y/?] n
  Test freeing pages (TEST_FREE_PAGES) [N/m/y/?] n
  Test floating point operations in kernel space (TEST_FPU) [N/m/y/?] n
  Test clocksource watchdog in kernel space (TEST_CLOCKSOURCE_WATCHDOG) [N/m/y/?] n
  Test module for correctness and stress of objpool (TEST_OBJPOOL) [N/m/?] (NEW)

#6 内核模块 » Gentoo伯克利子系统之八:Linux tracing system对比分析 » 2024-07-13 13:01:51

batsom
回复: 0

Linux trace技术发展已久,经常看到很多的专业术语,从perf LTTng systemtap  bpftrace tracepoint  trace BCC bpf ebpf等词汇,这些关键的词汇有着怎样的联系和关联,通过下面的这个图可以直观的认识到这几种关键技术的内在联系。

        整个内核的跟踪和观测技术分为前端工具,内核框架支持、内核数据源支持三个部分。前端工具通常作为使用者,在跟踪内核或者观测内核时使用的命令,比如:bpftrace BCC 等工具,内核态框架是指支持上述前端工具的内核框架,比如systemtap的内核模块、BPF的字节码等。内核态数据源是指对内核跟踪或者观测获取到的数据方法,比如kprobe和tracepoint等。

FluxBB bbcode 测试

上述内核观测和跟踪技术的调用和对应关系如下:通过下面的关系图,可以看到清晰的调用关系。     

FluxBB bbcode 测试

前面的文章中介绍过Systemtap bpftrace perf在内核跟踪和观测方面的使用方法和实例。这里我们从几个维度对这几种技术进行对比分析。

FluxBB bbcode 测试

      从上面的几个维度的对比中我们能够更清晰的认识各类技术的特点。对于eBPF来说在各个方面都是占有优势的,

可编程性:BPF是可针对内核可编程的,

内核内置:也是现在内核中内置的技术框架,无需专门安装,只需要打开内核的配置参数。

安全性:BPF对编写的程序有安全检查

内核版本的支持范围:BPF主要针对高版本的内核,越高版本的内核,其包含的功能越丰富,对于老版本的内核不友好,但是systemtap基本通吃所有内核版本。

性能:在性能上这几种技术类型没有本质的区别

生态:BPF作为最近几年新发展的技术,围绕BPF的各类开源工具以及生态发展较快,其他几类工具基本处于发展停滞阶段。

功能丰富度:BPF除了内核的观测和跟踪方面发挥作用外,在内核安全、网络性能提升等多方向上都有对应的解决方案

使用便捷性:根据bpf技术的bpftrace bpf-tool等工具提供了大量可直接使用的工具,并且可以结合高级的编程语言python go进行开发,在使用便捷性上也有极大的优势。

#7 内核模块 » Gentoo伯克利子系统之七:静态跟踪点tracepoint » 2024-07-13 12:59:42

batsom
回复: 0

在《linux-observability-with-bpf》中第4章节中的案例中,有一个tracepoint bpf_prog_load的实例,在我自己的云主机上,执行不通过。发现网上也有一些人遇到。针对该问题分析了一下具体的原因。 根本原因是:内核版本的问题。
下面是《linux-observability-with-bpf》中的一个示例程序:


from bcc import BPF
 
bpf_source = """
int trace_bpf_prog_load(struct pt_regs *ctx) {
  char comm[16];
  bpf_get_current_comm(&comm, sizeof(comm));
  bpf_trace_printk("%s is loading a BPF program", comm);
  return 0;
}
"""
 
bpf = BPF(text = bpf_source)
bpf.attach_tracepoint(tp = "bpf:bpf_prog_load", fn_name = "trace_bpf_prog_load")
bpf.trace_print()

上面的程序在bpf_prog_load的函数中添加一个添加一个tracepoint点。通过下面的命令可以参考本操作系统支持tracepoint的函数。
1)通过下面目录中,查看是否有相关的events

FluxBB bbcode 测试

2)通过bcc的相关命令行工具

FluxBB bbcode 测试

        通过是上面的两个命令查看,都没有相关bpf的tracepoint点。所有执行上面的命令会出现下面的错误信息。open(/sys/kernel/debug/tracing/events/bpf/bpf_prog_load/id): No such file or directory

FluxBB bbcode 测试

        通过对内核中相关的文件进行分析, 在kernel/bpf/syscall.c文件中,我们可以看到其中提交的一个commit,去掉对bpf_prog_load的tracepoint,使用git show 4d220ed 显示下面的信息


FluxBB bbcode 测试

FluxBB bbcode 测试
        通过上面的查看,是在内核4.18之后的内核删除了。commit的描述是在有可能导致内核的panic。为了测试tracepoint的使用,可以使用下面的代码进行验证。

from bcc import BPF
 
bpf_source = """
int trace_net_dev_xmit(struct pt_regs *ctx) {
  char comm[16];
  bpf_get_current_comm(&comm, sizeof(comm));
  bpf_trace_printk("%s is loading a BPF program", comm);
  return 0;
}
"""
 
bpf = BPF(text = bpf_source)
bpf.attach_tracepoint(tp = "net:net_dev_xmit", fn_name = "trace_net_dev_xmit")
bpf.trace_print()

#8 内核模块 » Gentoo伯克利子系统之六:使用bpf实现xdp的例子 » 2024-07-13 12:55:52

batsom
回复: 0

本篇文章参考《Linux  Observability with BPF》中第7章的例子,主要功能是借助于ip命令作为前端,对其他主机访问tcp的8000端口进行限制,这里需要使用较新版本的iproute2软件工具包.

1. 下载编译iproute2 工具包,使用最新的ip命令,支持配置xdp

   git clone git://git.kernel.org/pub/scm/linux/kernel/git/shemminger/iproute2.git

在编译iproute2时,需要开启支持libbpf的选项信息,在iproute2目录下配置使用下面的配置选项信息

  ./configure --libbpf_force=on --LIBBPF_DIR=/usr/local/lib64

        执行上面的命令,可能出现下面的错误信息,

FluxBB bbcode 测试

确定libbpf的pk-config配置文件位置,/usr/local/lib64/pkgconfig/libbpf.pc  使用

export PKG_CONFIG_PATH=/usr/local/lib64/pkgconfig/ 导入libbpf的配置文件,

使用pkg-config --list-all | grep libbpf 查看是否配置libbpf

FluxBB bbcode 测试

然后执行,make && make install 进行安装。

2. 编写bpf程序

       本bpf程序对于访问本机的tcp的协议的8000端口进行限制,


#include <linux/bpf.h>
 
#include <linux/if_ether.h>
 
#include <linux/in.h>
 
#include <linux/ip.h>
 
#include <linux/if_packet.h>
 
#include <bpf/bpf_helpers.h>
 
#include <linux/if_vlan.h>
 
#include <linux/types.h>
 
#include <linux/tcp.h>
 
#include <linux/udp.h>
 
#include <bpf/bpf_helpers.h>
 
#include <bpf/bpf_endian.h>
 
 
 
static __always_inline int get_dport(void *trans_data, void *data_end, int protocol)
 
{
 
    struct tcphdr *th;
 
    struct udphdr *uh;
 
 
    switch (protocol) {
 
        case IPPROTO_TCP:
 
            th = (struct tcphdr *)trans_data;
 
            if ((void*)(th + 1) > data_end)
 
                return -1;
 
            return th->dest;
 
        case IPPROTO_UDP:
 
            uh = (struct udphdr *)trans_data;
 
            if ((void *)(uh + 1) > data_end)
 
                return -1;
 
            return uh->dest;
 
        default:
 
            return 0;
 
    }
 
 
}
 
 
SEC("mysection")
 
int myprogram(struct xdp_md *ctx) {
 
  void *data = (void *)(long)ctx->data;
 
  void *data_end = (void *)(long)ctx->data_end;
 
  char fmt[] = "source = %d \n";
 
  struct iphdr *ip;
 
  int dport;
 
  int hdport;
 
  struct ethhdr *eth = data;
 
  struct iphdr *iph = data + sizeof(struct ethhdr);
 
 
    if ((void *)(iph + 1) > data_end) {
 
        return XDP_DROP;
 
    }
 
 
  dport = get_dport(iph + 1, data_end,iph->protocol);
 
 
  if (dport == -1 || dport == bpf_htons(8000)) {
 
        bpf_trace_printk(fmt,sizeof(fmt),bpf_ntohs(dport));
 
      return XDP_DROP;
 
  }
 
 
  return XDP_PASS;
 
}
 
char _license [] SEC ("license") = "GPL";

使用下面的命令进行编译:clang -g -c -O2 -target bpf -c program.c -o program.o

编译完成后,使用下面的ip命令对某个网卡进行价值xdp文件。

ip link set dev eth0 xdp obj program.o sec mysection   

通过上面的命令加载后,在接口上出现加载的xdp的类型和ID,表明加载成功。

FluxBB bbcode 测试

使用python3 -m http.server在本地主机上其中http服务器,并监听8000端口。

FluxBB bbcode 测试

使用另一台主机上使用nmap命令扫描对方监听的端口。nmap -sS 10.9.4.222,扫描结果如下:

FluxBB bbcode 测试

ip link set dev eth0 xdp off 关闭加载的xdp程序。再次使用nmap扫描

#9 内核模块 » Gentoo伯克利子系统之五:Systemtap BPF/BCC bpftrace 实践对比 » 2024-07-13 12:52:36

batsom
回复: 0

本篇文章通过一个案例,对systemtap、BPF/BCC、bpftrace三种不同类型的内核探测工具进行剖析和对比。这个程序就是简单对icmp_rcv函数,收到icmp报文,打印出对应的源IP地址和目的IP地址。

1. 使用BPF/BCC
1.1在centos8操作系统上安装对应的软件二进制包

1)	安装kernel-devel包;
2)	安装dnf -y install bcc-tools

1.2 源码包安装

dnf install -y bison cmake ethtool flex git iperf3 libstdc+±devel python3-netaddr python3-pip gcc gcc-c++ make zlib-devel elfutils-libelf-devel
dnf install -y clang clang-devel llvm llvm-devel llvm-static ncurses-devel
dnf -y install netperf
pip3 install pyroute2
ln -s /usr/bin/python3 /usr/bin/python
dnf -y install openssl
git clone https://github.com/iovisor/bcc.git
mkdir bcc_build
cmake …/bcc -DCMAKE_INSTALL_PREFIX=/usr -DENABLE_LLVM_SHARED=1
cd …/&& make -j10
make install
1.3 程序示例

使用bpf/bcc需要的内核版本最少是4.10以上。
使用下面的bcc代码,


#!/usr/bin/env python3.6

from __future__ import print_function
from bcc import BPF
from bcc.utils import printb

bpf_text = """
#include <uapi/linux/ptrace.h>
#include <net/sock.h>
#include <bcc/proto.h>
#include <uapi/linux/icmp.h>
#include <linux/icmp.h>
#include <uapi/linux/ip.h>
#include <linux/ip.h>


static inline struct iphdr *skb_to_iphdr(const struct sk_buff *skb)
{
    // unstable API. verify logic in ip_hdr() -> skb_network_header().
    return (struct iphdr *)(skb->head + skb->network_header);
}

int icmp_rcv_cb(struct pt_regs *ctx, struct sk_buff *skb)
{
            struct icmphdr *icmph ;
            struct iphdr *iph = skb_to_iphdr(skb);
            bpf_trace_printk("ipsrc:%pI4  ipdst:%pI4 \\n",&iph->saddr, &iph->daddr);
            icmph = (struct icmphdr *)skb->data;
            bpf_trace_printk("devname:%s ----- icmp_type:%d  \\n",skb->dev->name, icmph->type);
            return 0;
};
"""
# initialize BPF
b = BPF(text=bpf_text)
b.attach_kprobe(event="icmp_rcv", fn_name="icmp_rcv_cb")
#end format output
while 1:
    # Read messages from kernel pipe
    (task, pid, cpu, flags, ts, msg) = b.trace_fields()
    print("task:%s pid: %d %s " % (task, pid, msg))
#b.trace_print()

FluxBB bbcode 测试

2. Systemtap
2.1安装 systemtap

在centos8 上直接使用yum安装 yum install systemtap systemtap-runtime
2.2 Stap-prep

FluxBB bbcode 测试

通过在http://debuginfo.centos.org/8/x86_64/Packages/下载安装完debuginfo包后,执行stap-prep命令

FluxBB bbcode 测试

简单测试可以运行成功

FluxBB bbcode 测试

2.3 程序示例

下面是systemtap的方式对icmp_rcv函数的探测,对本机收到的ICMP报文打印出,对应的源IP和目的IP地址。


stap -g icmp_systemtap.stp
#!/usr/bin/stap -g
%{
#include <linux/kernel.h>
#include <linux/net.h>
#include <linux/skbuff.h>
#include <net/ip.h>
#include <linux/module.h>
#include <uapi/linux/if_packet.h>
#include <linux/fdtable.h>
#include <net/icmp.h>

        static inline void ip2str(char *to,unsigned int from)
        {
                int size = snprintf(to,16,"%pI4",&from);
                to[size] = '\0';
         }
%}
function get_icmp_packet_info:string(skb:long)
%{
        int ret = -1;
        struct sk_buff *skb = (struct sk_buff *)STAP_ARG_skb;
        struct iphdr *ip_header;
        unsigned int src_ip_1 = 0;
        unsigned int  dst_ip_1 = 0;
        char src_ip[16],dst_ip[16];
        struct icmphdr *icmph;

        if(!skb)
        {
                goto EXIT_F;
        }

        ip_header = (struct iphdr *)skb_network_header(skb);


        if(!ip_header)
        {
                goto EXIT_F;
        }

        src_ip_1 = (unsigned int)ip_header->saddr;
        dst_ip_1 = (unsigned int)ip_header->daddr;
        ip2str(src_ip,src_ip_1);
        ip2str(dst_ip,dst_ip_1);

        icmph = icmp_hdr(skb);
        if(icmph->type == 0)
        {

                goto ECHO_ICMP;
        }
        if(icmph->type == 8)
        {
                goto REPLY_ICMP;
        }

EXIT_F:
        snprintf(STAP_RETVALUE,MAXSTRINGLEN,"ERROR:src_ip:%s dst_ip:%s",src_ip,dst_ip);
ECHO_ICMP:
        snprintf(STAP_RETVALUE,MAXSTRINGLEN,"ECHO_ICMP:src_ip:%s dst_ip:%s",src_ip,dst_ip);
REPLY_ICMP:
        snprintf(STAP_RETVALUE,MAXSTRINGLEN,"REPLY_ICMP:src_ip:%s dst_ip:%s",src_ip,dst_ip);
%}

global locations

probe begin { printf("Monitoring for recv icmp packets\n") }
probe end { printf("Stropping monitoring  packets\n") }

probe kernel.function("icmp_rcv").return
{
        printf("%s\n",get_icmp_packet_info($skb))
        iphdr = __get_skb_iphdr($skb)
        saddr = format_ipaddr(__ip_skb_saddr(iphdr), @const("AF_INET"))
        daddr = format_ipaddr(__ip_skb_daddr(iphdr), @const("AF_INET"))
        printf("src_ip:%s  dst_ip:=%s\n",saddr,daddr);

}

probe timer.sec(5)
{
        exit ()
}

下面是运行后的测试结果:

FluxBB bbcode 测试

3. bpftrace
3.1 安装软件

yum -y install bpftrace
3.2 程序示例

bpftrace是使用自定义单行代码和简短脚本的临时工具的不错的选择,而BCC是复杂工具和守护程序的理想选择、bpftrace和BCC都是BPF的前端工具。


在这里插入代码片#!/usr/bin/bpftrace

#include <linux/skbuff.h>
#include <linux/ip.h>
#include <linux/udp.h>
#include <linux/socket.h>

BEGIN
{
        printf("Tracing icmp rev.Hit  Ctrl-C end.\n");
}

kprobe:icmp_rcv
{
        $skb = (struct sk_buff *)arg0;

        $iph = (struct iphdr*)($skb->head + $skb->network_header);
        $src_ip = ntop(AF_INET,$iph->saddr);
        $dst_ip = ntop(AF_INET,$iph->daddr);

        printf("src_ip:%s  ----> dst_ip:%s\n",$src_ip,$dst_ip);
}

END
{
        printf("OVER  bye!!")
}

运行结果如下:

FluxBB bbcode 测试

4 总结

    使用systemtap工具跟踪内核需要安装和内核对应版本的debuginfo包,systemtap作为老牌的内核跟踪工具,可以支持比较老的内核版本,对于现有存量的内核定位跟踪有明显的优势。
    BPF/BCC作为新的内核跟踪工具,需要较新的内核版本,最少是4.10版本,最好是4.19版本的内核。
    通过运行对比发现,编译和运行BPF/BCC的代码比systemtap的代码要快的多。
    BPF有各类安全检查,避免在内核跟踪过程中产生panic,systemtap没有此类的安全检查,需要开发者在开发systemtap程序时,保证代码的安全性。
    Bpftrace作为内核跟踪的一种工具,特别适合简单的内核跟踪,适合一条命令搞定的内核跟踪,bpftrace也有自己的一套语法体系可用。
    各种不同类型的内核探测跟踪技术,适合不同类型的场景,在实际使用中可选择适合自己的方式。

参考文献:
https://lwn.net/Articles/852112/

#10 内核模块 » Gentoo伯克利子系统之四:使用sockmap示例:bypass内核协议栈 » 2024-07-13 12:47:16

batsom
回复: 0

当我们使用127.0.0.1的localhost地址,在本地机器上进行发送和接受数据时,整个数据的发送还是要经过完整的内核协议栈。Cilimu的网络借用bfp的sockmap bypass提高整个网络的性能,参考《How to use eBPF for accelerating Cloud Native application》文章中的示例,在centos7.6平台上进行验证和测试。具体源码的github为:。

具体的原理解释性的内容就不从其他网页上搬迁过来了。主要有以下几点需要注意的问题,在这里记录以下:

1. 文章中使用的cgroup为cgroup v2版本的,在centos7上默认使用的是cgroup v1版本,可以通过修改内核的启动参数,添加对cgroup v2版本的支持,添加cgroup_no_v1=all 支持cgroup v2

2. 在添加cgroup v2支持后,使用mount命令看不到cgroup2的支持。使用下面的命令查看是否支持cgroup2,如果看到cgroup2 说明系统已经支持。

FluxBB bbcode 测试

3. centos和ubuntu对cgroup v2的目录是不一样的,没有/sys/fs/cgroup/unified目录,需要自己创建,使用下面的命令创建cgroupv2的支持。

mkdir /root/cgroup2

mount -t cgroup2 nodev /root/cgroup2

4. 在attach的命令中,使用下面的cgroup2目录,bpftool cgroup attach "/root/cgroup2/" sock_ops pinned "/sys/fs/bpf/bpf_sockop"

测试结果:在一个窗口中开启:socat TCP4-LISTEN:1000,fork exec:cat作为服务器端,在另一个窗口中:nc localhost  1000。通过cat /sys/kernel/debug/tracing/trace_pipe文件可以看到端口号,通过在lo上面抓包也可以看到。

FluxBB bbcode 测试

使用tcpmdump抓包

通过nc发送数据

FluxBB bbcode 测试

FluxBB bbcode 测试

#11 内核模块 » Gentoo伯克利子系统之三:BPF示例程序 » 2024-06-23 23:08:52

batsom
回复: 0

上一篇文章中BPF的例子是以BCC的整体框架为基础,本篇介绍一下基于libbpf库函数为基础,结合内核中的bpf的sample为基础编写一个BPF的程序,本篇介绍是以《linux-observability-with-bpf》这本书第二章的例子为基础,由于内核版本的不同,本篇介绍是以Linux5.16内核为基础,Linux5.16内核中的接口函数与书中的给到的程序案例有较大的差别。
1. 下载并编译内核
1) 确定和编译内核版本
下载需要编译的内核版本,本次使用的内核版本为:Linux-5.16.11版本。
2) 修改内核的配置文件,设置CONFIG_DEBUG_INFO_BTF=y,编译调试,
3) 编译内核
make olddefconfig
make -j 4
make modules_install
make install
通过命令grub2-set-default 设置启动的内核
4) 重启机器使用安装的新内核版本:5.16.11.frank+
5) 确定/sys/kernel/btf/vmlinux文件是否存在。
2. 编译安装libbpf库
1) 进入目录tools/lib/bpf  在该目录下执行make install

2) 修改/etc/ld.so.conf 文件,添加/usr/local/lib64  执行ldconfig,查看ldconfig  -v 2> /dev/null | grep libbpf
如果没有编译libbpf库,在编译bpf程序中会出现,下面的错误信息
上述准备工作完毕后,有以下两种方式编译bpf的例子,第一种方式,把编写的bpf程序放到sample/bpf目录下,首先编译sample/bpf,
1. 编译内核下samples/bpf目录下的bpf
1) 在编译之前安装必要的工具:
yum -y install binutils-devel
yum -y install readline-devel
yum -y install  dwarves  libdwarves1  libdwarves1-devel(dwarves版本号最好大于1.17)
yum -y install libcap-devel 
2) 在sample/bpf目录下  make
在编译的过程中,确定vmlinux的位置,
make VMLINUX_BTF=/sys/kernel/btf/vmlinux -C samples/bpf
使用vmlinux产生vmlinux.h头文件,CO:RE开发需要vmlinux.h文件,(Compile once, run everywhere)
bpftool btf dump file /sys/kernel/btf/vmlinux format c > vmlinux.h
2. 编译自己编写的bpf程序
1)编译通过完成后,修改sample/bpf的目录下的Makefile文件,添加下面的三行代码:
hello-objs := hello_user.o
always-y += hello_kern.o
tprogs-y += hello
hello_user 为我们用户空间的程序名,hello_kern为我们的内核空间程序名。
2)Kernel hello_kern.c程序:

#include <linux/ptrace.h>
#include <linux/version.h>
#include <uapi/linux/bpf.h>
#include <bpf/bpf_helpers.h>
#include "trace_common.h"
SEC("tracepoint/syscalls/sys_enter_execve")
 int bpf_prog(struct pt_regs *ctx) {
    char msg[] = "Hello, BPF World!";
    bpf_trace_printk(msg, sizeof(msg));
    return 0;
  }
char _license[] SEC("license") = "GPL";
   u32 _version SEC("version") = LINUX_VERSION_CODE;

kernel程序比较简单,意思是在执行到内核中的execve函数时,打印 Hello BPF World!

3) 应用程序 hello_user.c

#include <bpf/bpf.h>
#include <bpf/libbpf.h>
#include <fcntl.h>
#include <unistd.h>
 
#define DEBUGFS "/sys/kernel/debug/tracing/"
int load_bpf_file(char *filename);
 
int load_bpf_file(char *path)
{
    struct bpf_object *obj;
    struct bpf_program *prog;
    struct bpf_link *link = NULL;
    int progs_fd;
    printf("%s\n",path);
 
    obj = bpf_object__open_file(path, NULL);
    if (libbpf_get_error(obj))
    {
        fprintf(stderr, "ERROR: opening BPF object file failed\n");
        return 0;
    }
 
   if (bpf_object__load(obj))
    {
        fprintf(stderr, "ERROR: loading BPF object file failed\n");
        goto cleanup;
    }
 
    prog = bpf_object__find_program_by_name(obj, "bpf_prog");
    if (!prog) {
        printf("finding a prog in obj file failed\n");
        goto cleanup;
    }
 
    link = bpf_program__attach(prog);
    if (libbpf_get_error(link)) {
        fprintf(stderr, "ERROR: bpf_program__attach failed\n");
        link = NULL;
        goto cleanup;
    }
 
 read_trace_pipe();
 
cleanup:
    bpf_link__destroy(link);
    bpf_object__close(obj);
    return 0;
}
 
void read_trace_pipe(void)
{
       int trace_fd;
 
       trace_fd = open(DEBUGFS "trace_pipe", O_RDONLY, 0);
       if (trace_fd < 0)
               return;
 
       while (1) {
               static char buf[4096];
               ssize_t sz;
 
               sz = read(trace_fd, buf, sizeof(buf) - 1);
               if (sz > 0) {
                       buf[sz] = 0;
                       puts(buf);
               }
       }
}
 
int main(int argc, char **argv) {
   if (load_bpf_file("hello_kern.o") != 0) {
       printf("The kernel didn't load the BPF program\n");
       return -1;
   }
}

执行上面的程序输出如下结果:
FluxBB bbcode 测试

第二种方法:  如果不把编写的bpf示例程序放到,samples/bpf目录下,可以单独写一个makefile文件,内容如下:

CLANG = clang
 
EXECABLE = monitor-exec
 
BPFCODE = bpf_program
 
BPFTOOLS = /data/kernel/v1/linux-stable/samples/bpf
 
CCINCLUDE += -I/data/kernel/v1/linux-stable/tools/testing/selftests/bpf
 
LOADINCLUDE += -I/data/kernel/v1/linux-stable/samples/bpf
LOADINCLUDE += -I/data/kernel/v1/linux-stable//tools/lib
LOADINCLUDE += -I/data/kernel/v1/linux-stable/tools/perf
LOADINCLUDE += -I/data/kernel/v1/linux-stable/tools/include
LIBRARY_PATH = -L/usr/local/lib64
BPFSO = -lbpf
 
CFLAGS += $(shell grep -q "define HAVE_ATTR_TEST 1" /data/kernel/v1/linux-stable/tools/perf/perf-sys.h \
                 && echo "-DHAVE_ATTR_TEST=0")
 
.PHONY: clean $(CLANG) bpfload build
 
clean:
       rm -f *.o *.so $(EXECABLE)
 
build: ${BPFCODE.c}
       $(CLANG) -O2 -target bpf -c $(BPFCODE:=.c) $(CCINCLUDE) -o ${BPFCODE:=.o}
 
bpfload: build
       clang $(CFLAGS) -o $(EXECABLE) -lelf $(LOADINCLUDE) $(LIBRARY_PATH) $(BPFSO) \
       loader.c
 
$(EXECABLE): bpfload
 
.DEFAULT_GOAL := $(EXECABLE)

1)本程序虽然以《linux-observability-with-bpf》第2章的程序为基础,但是随着内核的更新,采用5.16版本内核时load_bpf_file函数已经被移除了,需要重新调用函数实现load_bpf_file函数。
2)随着bpf和内核版本的不断变化,参考本文时需要重点关注不同的内核版本、bpftool、gcc等各类工具的版本。
3) 内核源代码中的samples/bpf目录下有大量的bpf的示例程序可以参考。
4)使用bcc框架版本的bpf程序和使用libbpf库bpf程序在编写方式上会有所不同,注意不同的接口函数。
5)centos安装libbpf -devel


sed -i -e "s|mirrorlist=|#mirrorlist=|g" /etc/yum.repos.d/CentOS-*

sed -i -e "s|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g" /etc/yum.repos.d/CentOS-*

dnf --enablerepo=PowerTools install libbpf-devel

参考文献:https://blog.aquasec.com/vmlinux.h-ebpf-programs

#12 内核模块 » Gentoo伯克利子系统之二:基于BCC的BPF示例程序 » 2024-06-13 22:31:35

batsom
回复: 0

结合前面一篇针对BPF的学习,本篇文章重点介绍编写一个对内核系统调用exec的例子。本测试例子基本上包含了全部的,syscall类别系统调用的BPF的框架。


```python
#!/usr/bin/python
from __future__ import print_function
from bcc import BPF
from collections import defaultdict

bpf_text = """
#include
#include
#include
#define ARGSIZE 256
struct data_t {
      u32 pid; // PID as in the userspace term (i.e. task->tgid in kernel)
      char comm[TASK_COMM_LEN];
      char argv[ARGSIZE];
};
BPF_PERF_OUTPUT(events);
int syscall__execve(struct pt_regs *ctx,
                   const char __user *filename,
                   const char __user *const __user *__argv,
                   const char __user *const __user *__envp)
{
    struct data_t data = {};
    bpf_trace_printk("Hello, World!222%s\\n",filename);
    data.pid = bpf_get_current_pid_tgid();
    bpf_get_current_comm(&data.comm,sizeof(data.comm));
    bpf_probe_read_user(data.argv, sizeof(data.argv), filename);
    events.perf_submit(ctx, &data, sizeof(struct data_t));
    return 0;
}
"""
b = BPF(text=bpf_text)
execve_fnname = b.get_syscall_fnname("execve")
b.attach_kprobe(event=execve_fnname, fn_name="syscall__execve")
print("%-18s %-16s %-14s" % ("COMM", "PID","ARGS"))


argv = defaultdict(list)

def print_event(cpu, data, size):
    event = b["events"].event(data)
    argv[event.pid].append(event.argv)

    argv_text = b' '.join(argv[event.pid]).replace(b'\n', b'\\n')

    print("%-18s %-16d %-14s" % (event.comm, event.pid,argv_text))


b["events"].open_perf_buffer(print_event)
while 1:
    try:
        b.perf_buffer_poll()
    except KeyboardInterrupt:
        exit()
```

主要注意点:

1. BPF_PERF_OUTPUT   创建BPF的table,通过Perf 的环形缓存区,把用户定义的event事件的数据推送到用户空间,这是把事件数据推送到用户空间的首选的方式。 也就是如果把从内核中获取到的数据,push到用户空间进行处理和展示,在代码中添加该宏。

2. b.attach_kprobe(event=execve_fnname, fn_name="syscall__execve") 这里的fn_name="syscal__execve"函数名,保持格式的绝对一致,也就是syscall__ 后面两个下划线,execve名字和内核中syscall保持一致。
3.  在内核中插桩syscall__execve 函数时,这里的第一个参数struct pt_regs *ctx 保持固定,其余的参数是syscall类函数保持一致的,下面是调用execve的参数。

int execve(const char *pathname, char *const argv[], char *const envp[]);

4.  其实整个程序包含了两个部分,一个是python的客户端,一个是以字符串的形式bpf_text出现的插桩函数,使用C语言编写,整个测试程序包含了,用户空间和内核空间的代码。

5  bpf_trace_printk函数,类似于C语言中printf,编写bpf程序时,可以用来调试打印相关信息。注意该打印函数会将信息输出到下面的文件中:/sys/kernel/debug/tracing/trace_pipe,通过跟踪该文件进行查看。

6. print_even 函数时对内核中获取的数据和信息的统一展示。

#13 内核模块 » Gentoo 伯克利子系统之一:BPF概述 » 2024-06-13 07:34:20

batsom
回复: 0

BPF的英文是Berkeley  Packet  Filter的缩写,直白的翻译过来就是伯克利数据包过滤器,从这个英文翻译可以看出,BPF原先是针对网络的数据包进行各种操作处理的一个工具集。目前已经发展到对内核事件和用户空间事件进行跟踪的一套综合的工具集。BPF的原理简单解释为,在各种内核事件和应用程序事件的发生的前面,运行一小段程序,通过运行的这段程序获取到例如:函数调用的流程、结构体内的变量值等有利于分析问题的信息。BPF在2014年正式加入Linux内核主线,随着BPF的在内核中发展,以及 eBPF的出现,已经可以对内核中绝大部分的子系统进行跟踪观测。

        BPF跟踪检测有两个前端的工具BCC和bpftrace。BCC为BPF编译器集合,BPF  Compiler Collection,他提供了开发BPF跟踪程序的高级框架,提供了一个编写内核BPF程序的C语言环境,同时也提供了 Python和Lua等用户端的接口。BCC自身大概提供了97个BPF工具(截止到BCC-0.24版本。),bpftrace大概提供了35个可用工具。当然我们可以在这个基础和框架之下,开发符合我们自己的实际需求的BPF工具。

         BPF工具主要是为分析和定位Linux系统中出现一些性能问题,包括内核和应用程序两个方向,当然也可以通过打印出调用程序的堆栈信息,获取到函数的调用关系

BCC工具:
FluxBB bbcode 测试

bpftrace工具:
FluxBB bbcode 测试


BPF主要思维导向图:
FluxBB bbcode 测试

#14 内核模块 » Gentoo时间子系统之八:动态时钟框架(CONFIG_NO_HZ、tickless) » 2024-04-23 23:29:04

batsom
回复: 0

在前面章节的讨论中,我们一直基于一个假设:Linux中的时钟事件都是由一个周期时钟提供,不管系统中的clock_event_device是工作于周期触发模式,还是工作于单触发模式,也不管定时器系统是工作于低分辨率模式,还是高精度模式,内核都竭尽所能,用不同的方式提供周期时钟,以产生定期的tick事件,tick事件或者用于全局的时间管理(jiffies和时间的更新),或者用于本地cpu的进程统计、时间轮定时器框架等等。周期性时钟虽然简单有效,但是也带来了一些缺点,尤其在系统的功耗上,因为就算系统目前无事可做,也必须定期地发出时钟事件,激活系统。为此,内核的开发者提出了动态时钟这一概念,我们可以通过内核的配置项CONFIG_NO_HZ来激活特性。有时候这一特性也被叫做tickless,不过还是把它称呼为动态时钟比较合适,因为并不是真的没有tick事件了,只是在系统无事所做的idle阶段,我们可以通过停止周期时钟来达到降低系统功耗的目的,只要有进程处于活动状态,时钟事件依然会被周期性地发出。

/*****************************************************************************************************/
声明:本博内容均由http://blog.csdn.net/droidphone原创,转载请注明出处,谢谢!
/*****************************************************************************************************/

在动态时钟正确工作之前,系统需要切换至动态时钟模式,而要切换至动态时钟模式,需要一些前提条件,最主要的一条就是cpu的时钟事件设备必须要支持单触发模式,当条件满足时,系统切换至动态时钟模式,接着,由idle进程决定是否可以停止周期时钟,退出idle进程时则需要恢复周期时钟。
1.  数据结构

在上一章的内容里,我们曾经提到,切换到高精度模式后,高精度定时器系统需要使用一个高精度定时器来模拟传统的周期时钟,其中利用了tick_sched结构中的一些字段,事实上,tick_sched结构也是实现动态时钟的一个重要的数据结构,在smp系统中,内核会为每个cpu都定义一个tick_sched结构,这通过一个percpu全局变量tick_cpu_sched来实现,它在kernel/time/tick-sched.c中定义:

/*
 * Per cpu nohz control structure
 */
static DEFINE_PER_CPU(struct tick_sched, tick_cpu_sched);

tick_sched结构在include/linux/tick.h中定义,我们看看tick_sched结构的详细定义:

struct tick_sched {
	struct hrtimer			sched_timer;
	unsigned long			check_clocks;
	enum tick_nohz_mode		nohz_mode;
	ktime_t				idle_tick;
	int				inidle;
	int				tick_stopped;
	unsigned long			idle_jiffies;
	unsigned long			idle_calls;
	unsigned long			idle_sleeps;
	int				idle_active;
	ktime_t				idle_entrytime;
	ktime_t				idle_waketime;
	ktime_t				idle_exittime;
	ktime_t				idle_sleeptime;
	ktime_t				iowait_sleeptime;
	ktime_t				sleep_length;
	unsigned long			last_jiffies;
	unsigned long			next_jiffies;
	ktime_t				idle_expires;
	int				do_timer_last;
};

sched_timer  该字段用于在高精度模式下,模拟周期时钟的一个hrtimer,请参看 Linux时间子系统之六:高精度定时器(HRTIMER)的原理和实现。

check_clocks  该字段用于实现clock_event_device和clocksource的异步通知机制,帮助系统切换至高精度模式或者是动态时钟模式。

nohz_mode  保存动态时钟的工作模式,基于低分辨率和高精度模式下,动态时钟的实现稍有不同,根据模式它可以是以下的值:

>NOHZ_MODE_INACTIVE  系统动态时钟尚未激活
>NOHZ_MODE_LOWRES  系统工作于低分辨率模式下的动态时钟
>NOHZ_MODE_HIGHRES  系统工作于高精度模式下的动态时钟

idle_tick  该字段用于保存停止周期时钟是的内核时间,当退出idle时要恢复周期时钟,需要使用该时间,以保持系统中时间线(jiffies)的正确性。

tick_stopped  该字段用于表明idle状态的周期时钟已经停止。

idle_jiffies  系统进入idle时的jiffies值,用于信息统计。

idle_calls 系统进入idle的统计次数。

idle_sleeps  系统进入idle且成功停掉周期时钟的次数。

idle_active  表明目前系统是否处于idle状态中。

idle_entrytime  系统进入idle的时刻。

idle_waketime  idle状态被打断的时刻。

idle_exittime  系统退出idle的时刻。

idle_sleeptime  累计各次idle中停止周期时钟的总时间。

sleep_length  本次idle中停止周期时钟的时间。

last_jiffies  系统中最后一次周期时钟的jiffies值。

next_jiffies  预计下一次周期时钟的jiffies。

idle_expires  进入idle后,下一个最先到期的定时器时刻。

我们知道,根据系统目前的工作模式,系统提供周期时钟(tick)的方式会有所不同,当处于低分辨率模式时,由cpu的tick_device提供周期时钟,而当处于高精度模式时,是由一个高精度定时器来提供周期时钟,下面我们分别讨论一下在两种模式下的动态时钟实现方式。
2.  低分辨率下的动态时钟
回看之前一篇文章: Linux时间子系统之四:定时器的引擎:clock_event_device中的关于tick_device一节,不管tick_device的工作模式(周期触发或者是单次触发),tick_device所关联的clock_event_device的事件回调处理函数都是:tick_handle_periodic,不管当前是否处于idle状态,他都会精确地按HZ数来提供周期性的tick事件,这不符合动态时钟的要求,所以,要使动态时钟发挥作用,系统首先要切换至支持动态时钟的工作模式:NOHZ_MODE_LOWRES  。

2.1  切换至动态时钟模式

动态时钟模式的切换过程的前半部分和切换至高精度定时器模式所经过的路径是一样的,请参考:Linux时间子系统之六:高精度定时器(HRTIMER)的原理和实现。这里再简单描述一下过程:系统工作于周期时钟模式,定期地发出tick事件中断,tick事件中断触发定时器软中断:TIMER_SOFTIRQ,执行软中断处理函数run_timer_softirq,run_timer_softirq调用hrtimer_run_pending函数:

void hrtimer_run_pending(void)
{
	if (hrtimer_hres_active())
		return;
        ......
	if (tick_check_oneshot_change(!hrtimer_is_hres_enabled()))
		hrtimer_switch_to_hres();
}

tick_check_oneshot_change函数的参数决定了现在是要切换至低分辨率动态时钟模式,还是高精度定时器模式,我们现在假设系统不支持高精度定时器模式,hrtimer_is_hres_enabled会直接返回false,对应的tick_check_oneshot_change函数的参数则是true,表明需要切换至动态时钟模式。tick_check_oneshot_change在检查过timekeeper和clock_event_device都具备动态时钟的条件后,通过tick_nohz_switch_to_nohz函数切换至动态时钟模式:

首先,该函数通过tick_switch_to_oneshot函数把tick_device的工作模式设置为单触发模式,并把它的中断事件回调函数置换为tick_nohz_handler,接着把tick_sched结构中的模式字段设置为NOHZ_MODE_LOWRES:

static void tick_nohz_switch_to_nohz(void)
{
	struct tick_sched *ts = &__get_cpu_var(tick_cpu_sched);
	ktime_t next;
 
	if (!tick_nohz_enabled)
		return;
 
	local_irq_disable();
	if (tick_switch_to_oneshot(tick_nohz_handler)) {
		local_irq_enable();
		return;
	}
 
	ts->nohz_mode = NOHZ_MODE_LOWRES;

然后,初始化tick_sched结构中的sched_timer定时器,通过tick_init_jiffy_update获取下一次tick事件的时间并初始化全局变量last_jiffies_update,以便后续可以正确地更新jiffies计数值,最后,把下一次tick事件的时间编程到tick_device中,到此,系统完成了到低分辨率动态时钟的切换过程。

	hrtimer_init(&ts->sched_timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS);
	/* Get the next period */
	next = tick_init_jiffy_update();
 
	for (;;) {
		hrtimer_set_expires(&ts->sched_timer, next);
		if (!tick_program_event(next, 0))
			break;
		next = ktime_add(next, tick_period);
	}
	local_irq_enable();
}

上面的代码中,明明现在没有切换至高精度模式,为什么要初始化tick_sched结构中的高精度定时器?原因并不是要使用它的定时功能,而是想重用hrtimer代码中的hrtimer_forward函数,利用这个函数来计算下一次tick事件的时间。

2.2  低分辨率动态时钟下的事件中断处理函数

上一节提到,当切换至低分辨率动态时钟模式后,tick_device的事件中断处理函数会被设置为tick_nohz_handler,总体来说,它和周期时钟模式的事件处理函数tick_handle_periodic所完成的工作大致类似:更新时间、更新jiffies计数值、调用update_process_time更新进程信息和触发定时器软中断等等,最后重新编程tick_device,使得它在下一个正确的tick时刻再次触发本函数:

static void tick_nohz_handler(struct clock_event_device *dev)
{
        ......
	dev->next_event.tv64 = KTIME_MAX;
 
	if (unlikely(tick_do_timer_cpu == TICK_DO_TIMER_NONE))
		tick_do_timer_cpu = cpu;
 
	/* Check, if the jiffies need an update */
	if (tick_do_timer_cpu == cpu)
		tick_do_update_jiffies64(now);
        ......	
	if (ts->tick_stopped) {
		touch_softlockup_watchdog();
		ts->idle_jiffies++;
	}
 
	update_process_times(user_mode(regs));
	profile_tick(CPU_PROFILING);
 
	while (tick_nohz_reprogram(ts, now)) {
		now = ktime_get();
		tick_do_update_jiffies64(now);
	}
}

因为现在工作于动态时钟模式,所以,tick时钟可能在idle进程中被停掉不止一个tick周期,所以当该函数被再次触发时,离上一次触发的时间可能已经不止一个tick周期,tick_nohz_reprogram对tick_device进行编程时必须正确地处理这一情况,它利用了前面所说的hrtimer_forward函数来实现这一特性:

static int tick_nohz_reprogram(struct tick_sched *ts, ktime_t now)
{
	hrtimer_forward(&ts->sched_timer, now, tick_period);
	return tick_program_event(hrtimer_get_expires(&ts->sched_timer), 0);
}

2.3  动态时钟:停止周期tick时钟事件

开启动态时钟模式后,周期时钟的开启和关闭由idle进程控制,idle进程内最终是一个循环,循环的一开始通过tick_nohz_idle_enter检测是否允许关闭周期时钟若干时间,然后进入低功耗的idle模式,当有中断事件使得cpu退出低功耗idle模式后,判断是否有新的进程被激活从而需要重新调度,如果需要则通过tick_nohz_idle_exit重新启用周期时钟,然后重新进行进程调度,等待下一次idle的发生,我们可以用下图来表示:

FluxBB bbcode 测试

停止周期时钟的时机在tick_nohz_idle_enter函数中,它把主要的工作交由tick_nohz_stop_sched_tick函数来完成。内核也不是每次进入tick_nohz_stop_sched_tick都会停止周期时钟,那么什么时候才会停止?我们想一想,这时候既然idle进程在运行,说明系统中的其他进程都在等待某种事件,系统处于无事所做的状态,唯一要处理的就是中断,除了定时器中断,其它的中断我们无法预测它会何时发生,但是我们可以知道最先一个到期的定时器的到期时间,也就是说,在该时间到期前,产生周期时钟是没有必要的,我们可以据此推算出周期时钟可以停止的tick数,然后重新对tick_device进行编程,使得在最早一个定时器到期前都不会产生周期时钟,实际上,tick_nohz_stop_sched_tick还做了一些限制:当下一个定时器的到期时间与当前jiffies值只相差1时,不会停止周期时钟,当定时器的到期时间与当前的jiffies值相差的时间大于timekeeper允许的最大idle时间时,则下一个tick时刻被设置timekeeper允许的最大idle时间,这主要是为了防止太长时间不去更新timekeeper中的系统时间,有可能导致clocksource的溢出问题。tick_nohz_stop_sched_tick函数体看起来很长,实现的也就是上述的逻辑,所以这里就不贴它的代码了,有兴趣的读者可以自行阅读内核的代码:kernel/time/tick-sched.c。

看了动态时钟的停止过程和tick_nohz_handler的实现方式,其实还有一个情况没有处理:当系统进入idle进程后,周期时钟被停止若干个tick周期,当这若干个tick周期到期后,tick事件必然会产生,tick_nohz_handler被触发调用,然后最先到期的定时器被处理。但是在tick_nohz_handler的最后,tick_device一定会被编程为紧跟着的下一个tick周期的时刻被触发,如果刚才的定时器处理后,并没有激活新的进程,我们的期望是周期时钟可以用下一个新的定时器重新计算可以停止的时间,而不是下一个tick时刻,但是tick_nohz_handler却仅仅简单地把tick_device的到期时间设为下一个周期的tick时刻,这导致了周期时钟被恢复,显然这不是我们想要的。为了处理这种情况,内核使用了一点小伎俩,我们知道定时器是在软中断中执行的,所以内核在irq_exit中的软件中断处理完后,加入了一小段代码,kernel/softirq.c :

void irq_exit(void)
{
        ......
	if (!in_interrupt() && local_softirq_pending())
		invoke_softirq();
 
#ifdef CONFIG_NO_HZ
	/* Make sure that timer wheel updates are propagated */
	if (idle_cpu(smp_processor_id()) && !in_interrupt() && !need_resched())
		tick_nohz_irq_exit();
#endif
        ......
}

关键的调用是tick_nohz_irq_exit:

void tick_nohz_irq_exit(void)
{
	struct tick_sched *ts = &__get_cpu_var(tick_cpu_sched);
 
	if (!ts->inidle)
		return;
 
	tick_nohz_stop_sched_tick(ts);
}

tick_nohz_irq_exit再次调用了tick_nohz_stop_sched_tick函数,使得系统有机会再次停止周期时钟若干个tick周期。
2.3  动态时钟:重新开启周期tick时钟事件

回到图2.3.1,当在idle进程中停止周期时钟后,在某一时刻,有新的进程被激活,在重新调度前,tick_nohz_idle_exit会被调用,该函数负责恢复被停止的周期时钟。tick_nohz_idle_exit最终会调用tick_nohz_restart函数,由tick_nohz_restart函数最后完成恢复周期时钟的工作。函数并不复杂:先是把上一次停止周期时钟的时刻设置到tick_sched结构的sched_timer定时器中,然后在通过hrtimer_forward函数把该定时器的到期时刻设置为当前时间的下一个tick时刻,对于高精度模式,启动该定时器即可,对于低分辨率模式,使用该时间对tick_device重新编程,最后通过tick_do_update_jiffies64更新jiffies数值,为了防止此时正在一个tick时刻的边界,可能当前时刻正好刚刚越过了该到期时间,函数使用了一个while循环:

static void tick_nohz_restart(struct tick_sched *ts, ktime_t now)
{
	hrtimer_cancel(&ts->sched_timer);
	hrtimer_set_expires(&ts->sched_timer, ts->idle_tick);
 
	while (1) {
		/* Forward the time to expire in the future */
		hrtimer_forward(&ts->sched_timer, now, tick_period);
 
		if (ts->nohz_mode == NOHZ_MODE_HIGHRES) {
			hrtimer_start_expires(&ts->sched_timer,
					      HRTIMER_MODE_ABS_PINNED);
			/* Check, if the timer was already in the past */
			if (hrtimer_active(&ts->sched_timer))
				break;
		} else {
			if (!tick_program_event(
				hrtimer_get_expires(&ts->sched_timer), 0))
				break;
		}
		/* Reread time and update jiffies */
		now = ktime_get();
		tick_do_update_jiffies64(now);
	}
}

3.  高精度模式下的动态时钟
高精度模式和低分辨率模式的主要区别是在切换过程中,怎样切换到高精度模式,我已经在上一篇文章中做了说明,切换到高精度模式后,动态时钟的开启和关闭和低分辨率模式下没有太大的区别,也是通过tick_nohz_stop_sched_tick和tick_nohz_restart来控制,在这两个函数中,分别判断了当前的两种模式:

>NOHZ_MODE_HIGHRES
>NOHZ_MODE_LOWRES

如果是NOHZ_MODE_HIGHRES则对tick_sched结构的sched_timer定时器进行设置,如果是NOHZ_MODE_LOWRES,则直接对tick_device进行操作。

4.  动态时钟对中断的影响
在进入和退出中断时,因为动态时钟的关系,中断系统需要作出一些配合。先说中断发生于周期时钟停止期间,如果不做任何处理,中断服务程序中如果要访问jiffies计数值,可能得到一个滞后的jiffies值,因为正常状态下,jiffies值会在恢复周期时钟时正确地更新,所以,为了防止这种情况发生,在进入中断的irq_enter期间,tick_check_idle会被调用:

void tick_check_idle(int cpu)
{
	tick_check_oneshot_broadcast(cpu);
	tick_check_nohz(cpu);
}

tick_check_nohz函数的最重要的作用就是更新jiffies计数值:

static inline void tick_check_nohz(int cpu)
{
	struct tick_sched *ts = &per_cpu(tick_cpu_sched, cpu);
	ktime_t now;
 
	if (!ts->idle_active && !ts->tick_stopped)
		return;
	now = ktime_get();
	if (ts->idle_active)
		tick_nohz_stop_idle(cpu, now);
	if (ts->tick_stopped) {
		tick_nohz_update_jiffies(now);
		tick_nohz_kick_tick(cpu, now);
	}
}

另外一种情况是在退出定时器中断时,需要重新评估周期时钟的运行状况,这一点已经在2.3节中做了说明,这里就不在赘述了。

#15 内核模块 » Gentoo时间子系统之七:定时器的应用--msleep(),hrtimer_nanosleep() » 2024-04-23 22:05:52

batsom
回复: 0

我们已经在前面几章介绍了低分辨率定时器和高精度定时器的实现原理,内核为了方便其它子系统,在时间子系统中提供了一些用于延时或调度的API,例如msleep,hrtimer_nanosleep等等,这些API基于低分辨率定时器或高精度定时器来实现,本章的内容就是讨论这些方便、好用的API是如何利用定时器系统来完成所需的功能的。

/*****************************************************************************************************/
声明:本博内容均由http://blog.csdn.net/droidphone原创,转载请注明出处,谢谢!
/*****************************************************************************************************/
1.  msleep

msleep相信大家都用过,它可能是内核用使用最广泛的延时函数之一,它会使当前进程被调度并让出cpu一段时间,因为这一特性,它不能用于中断上下文,只能用于进程上下文中。要想在中断上下文中使用延时函数,请使用会阻塞cpu的无调度版本mdelay。msleep的函数原型如下:

>void msleep(unsigned int msecs)

延时的时间由参数msecs指定,单位是毫秒,事实上,msleep的实现基于低分辨率定时器,所以msleep的实际精度只能也是1/HZ级别。内核还提供了另一个比较类似的延时函数msleep_interruptible:

unsigned long msleep_interruptible(unsigned int msecs)

延时的单位同样毫秒数,它们的区别如下:

FluxBB bbcode 测试

最主要的区别就是msleep会保证所需的延时一定会被执行完,而msleep_interruptible则可以在延时进行到一半时被信号打断而退出延时,剩余的延时数则通过返回值返回。两个函数最终的代码都会到达schedule_timeout函数,它们的调用序列如下图所示:

FluxBB bbcode 测试

下面我们看看schedule_timeout函数的实现,函数首先处理两种特殊情况,一种是传入的延时jiffies数是个负数,则打印一句警告信息,然后马上返回,另一种是延时jiffies数是MAX_SCHEDULE_TIMEOUT,表明需要一直延时,直接执行调度即可:

signed long __sched schedule_timeout(signed long timeout)
{
	struct timer_list timer;
	unsigned long expire;
 
	switch (timeout)
	{
	case MAX_SCHEDULE_TIMEOUT:
		schedule();
		goto out;
	default:
		if (timeout < 0) {
			printk(KERN_ERR "schedule_timeout: wrong timeout "
				"value %lx\n", timeout);
			dump_stack();
			current->state = TASK_RUNNING;
			goto out;
		}
	}

然后计算到期的jiffies数,并在堆栈上建立一个低分辨率定时器,把到期时间设置到该定时器中,启动定时器后,通过schedule把当前进程调度出cpu的运行队列:

	expire = timeout + jiffies;
 
	setup_timer_on_stack(&timer, process_timeout, (unsigned long)current);
	__mod_timer(&timer, expire, false, TIMER_NOT_PINNED);
	schedule();

到这个时候,进程已经被调度走,那它如何返回继续执行?我们看到定时器的到期回调函数是process_timeout,参数是当前进程的task_struct指针,看看它的实现:

static void process_timeout(unsigned long __data)
{
	wake_up_process((struct task_struct *)__data);
}

噢,没错,定时器一旦到期,进程会被唤醒并继续执行:

	del_singleshot_timer_sync(&timer);
 
	/* Remove the timer from the object tracker */
	destroy_timer_on_stack(&timer);
 
	timeout = expire - jiffies;
 
 out:
	return timeout < 0 ? 0 : timeout;
}

schedule返回后,说明要不就是定时器到期,要不就是因为其它时间导致进程被唤醒,函数要做的就是删除在堆栈上建立的定时器,返回剩余未完成的jiffies数。

说完了关键的schedule_timeout函数,我们看看msleep如何实现:

signed long __sched schedule_timeout_uninterruptible(signed long timeout)
{
	__set_current_state(TASK_UNINTERRUPTIBLE);
	return schedule_timeout(timeout);
}
 
void msleep(unsigned int msecs)
{
	unsigned long timeout = msecs_to_jiffies(msecs) + 1;
 
	while (timeout)
		timeout = schedule_timeout_uninterruptible(timeout);
}

msleep先是把毫秒转换为jiffies数,通过一个while循环保证所有的延时被执行完毕,延时操作通过schedule_timeout_uninterruptible函数完成,它仅仅是在把进程的状态修改为TASK_UNINTERRUPTIBLE后,调用上述的schedule_timeout来完成具体的延时操作,TASK_UNINTERRUPTIBLE状态保证了msleep不会被信号唤醒,也就意味着在msleep期间,进程不能被kill掉。

看看msleep_interruptible的实现:

signed long __sched schedule_timeout_interruptible(signed long timeout)
{
	__set_current_state(TASK_INTERRUPTIBLE);
	return schedule_timeout(timeout);
}
 
unsigned long msleep_interruptible(unsigned int msecs)
{
	unsigned long timeout = msecs_to_jiffies(msecs) + 1;
 
	while (timeout && !signal_pending(current))
		timeout = schedule_timeout_interruptible(timeout);
	return jiffies_to_msecs(timeout);
}

msleep_interruptible通过schedule_timeout_interruptible中转,schedule_timeout_interruptible的唯一区别就是把进程的状态设置为了TASK_INTERRUPTIBLE,说明在延时期间有信号通知,while循环会马上终止,剩余的jiffies数被转换成毫秒返回。实际上,你也可以利用schedule_timeout_interruptible或schedule_timeout_uninterruptible构造自己的延时函数,同时,内核还提供了另外一个类似的函数,不用我解释,看代码就知道它的用意了:

signed long __sched schedule_timeout_killable(signed long timeout)
{
	__set_current_state(TASK_KILLABLE);
	return schedule_timeout(timeout);
}

2.  hrtimer_nanosleep
第一节讨论的msleep函数基于时间轮定时系统,只能提供毫秒级的精度,实际上,它的精度取决于HZ的配置值,如果HZ小于1000,它甚至无法达到毫秒级的精度,要想得到更为精确的延时,我们自然想到的是要利用高精度定时器来实现。没错,linux为用户空间提供了一个api:nanosleep,它能提供纳秒级的延时精度,该用户空间函数对应的内核实现是sys_nanosleep,它的工作交由高精度定时器系统的hrtimer_nanosleep函数实现,最终的大部分工作则由do_nanosleep完成。调用过程如下图所示:

FluxBB bbcode 测试

与msleep的实现相类似,hrtimer_nanosleep函数首先在堆栈中创建一个高精度定时器,设置它的到期时间,然后通过do_nanosleep完成最终的延时工作,当前进程在挂起相应的延时时间后,退出do_nanosleep函数,销毁堆栈中的定时器并返回0值表示执行成功。不过do_nanosleep可能在没有达到所需延时数量时由于其它原因退出,如果出现这种情况,hrtimer_nanosleep的最后部分把剩余的延时时间记入进程的restart_block中,并返回ERESTART_RESTARTBLOCK错误代码,系统或者用户空间可以根据此返回值决定是否重新调用nanosleep以便把剩余的延时继续执行完成。下面是hrtimer_nanosleep的代码:

long hrtimer_nanosleep(struct timespec *rqtp, struct timespec __user *rmtp,
		       const enum hrtimer_mode mode, const clockid_t clockid)
{
	struct restart_block *restart;
	struct hrtimer_sleeper t;
	int ret = 0;
	unsigned long slack;
 
	slack = current->timer_slack_ns;
	if (rt_task(current))
		slack = 0;
 
	hrtimer_init_on_stack(&t.timer, clockid, mode);
	hrtimer_set_expires_range_ns(&t.timer, timespec_to_ktime(*rqtp), slack);
	if (do_nanosleep(&t, mode))
		goto out;
 
	/* Absolute timers do not update the rmtp value and restart: */
	if (mode == HRTIMER_MODE_ABS) {
		ret = -ERESTARTNOHAND;
		goto out;
	}
 
	if (rmtp) {
		ret = update_rmtp(&t.timer, rmtp);
		if (ret <= 0)
			goto out;
	}
 
	restart = ¤t_thread_info()->restart_block;
	restart->fn = hrtimer_nanosleep_restart;
	restart->nanosleep.clockid = t.timer.base->clockid;
	restart->nanosleep.rmtp = rmtp;
	restart->nanosleep.expires = hrtimer_get_expires_tv64(&t.timer);
 
	ret = -ERESTART_RESTARTBLOCK;
out:
	destroy_hrtimer_on_stack(&t.timer);
	return ret;
}

接着我们看看do_nanosleep的实现代码,它首先通过hrtimer_init_sleeper函数,把定时器的回调函数设置为hrtimer_wakeup,把当前进程的task_struct结构指针保存在hrtimer_sleeper结构的task字段中:

void hrtimer_init_sleeper(struct hrtimer_sleeper *sl, struct task_struct *task)
{
	sl->timer.function = hrtimer_wakeup;
	sl->task = task;
}
EXPORT_SYMBOL_GPL(hrtimer_init_sleeper);
 
static int __sched do_nanosleep(struct hrtimer_sleeper *t, enum hrtimer_mode mode)
{
	hrtimer_init_sleeper(t, current);

然后,通过一个do/while循环内:启动定时器,挂起当前进程,等待定时器或其它事件唤醒进程。这里的循环体实现比较怪异,它使用hrtimer_active函数间接地判断定时器是否到期,如果hrtimer_active返回false,说明定时器已经过期,然后把hrtimer_sleeper结构的task字段设置为NULL,从而导致循环体的结束,另一个结束条件是当前进程收到了信号事件,所以,当因为是定时器到期而退出时,do_nanosleep返回true,否则返回false,上述的hrtimer_nanosleep正是利用了这一特性来决定它的返回值。以下是do_nanosleep循环体的代码:

	do {
		set_current_state(TASK_INTERRUPTIBLE);
		hrtimer_start_expires(&t->timer, mode);
		if (!hrtimer_active(&t->timer))
			t->task = NULL;
 
		if (likely(t->task))
			schedule();
 
		hrtimer_cancel(&t->timer);
		mode = HRTIMER_MODE_ABS;
 
	} while (t->task && !signal_pending(current));
 
	__set_current_state(TASK_RUNNING);
 
	return t->task == NULL;
}

除了hrtimer_nanosleep,高精度定时器系统还提供了几种用于延时/挂起进程的api:

    schedule_hrtimeout    使得当前进程休眠指定的时间,使用CLOCK_MONOTONIC计时系统;
    schedule_hrtimeout_range    使得当前进程休眠指定的时间范围,使用CLOCK_MONOTONIC计时系统;
    schedule_hrtimeout_range_clock    使得当前进程休眠指定的时间范围,可以自行指定计时系统;
    usleep_range 使得当前进程休眠指定的微妙数,使用CLOCK_MONOTONIC计时系统;

它们之间的调用关系如下:

FluxBB bbcode 测试

最终,所有的实现都会进入到schedule_hrtimeout_range_clock函数。需要注意的是schedule_hrtimeout_xxxx系列函数在调用前,最好利用set_current_state函数先设置进程的状态,在这些函数返回前,进城的状态会再次被设置为TASK_RUNNING。如果事先把状态设置为TASK_UNINTERRUPTIBLE,它们会保证函数返回前一定已经经过了所需的延时时间,如果事先把状态设置为TASK_INTERRUPTIBLE,则有可能在尚未到期时由其它信号唤醒进程从而导致函数返回。主要实现该功能的函数schedule_hrtimeout_range_clock和前面的do_nanosleep函数实现原理基本一致。大家可以自行参考内核的代码,它们位于:kernel/hrtimer.c。

#16 内核模块 » Gentoo时间子系统之六:高精度定时器(HRTIMER)的原理和实现 » 2024-04-23 21:55:19

batsom
回复: 0

上一篇文章,我介绍了传统的低分辨率定时器的实现原理。而随着内核的不断演进,大牛们已经对这种低分辨率定时器的精度不再满足,而且,硬件也在不断地发展,系统中的定时器硬件的精度也越来越高,这也给高分辨率定时器的出现创造了条件。内核从2.6.16开始加入了高精度定时器架构。在实现方式上,内核的高分辨率定时器的实现代码几乎没有借用低分辨率定时器的数据结构和代码,内核文档给出的解释主要有以下几点:

>低分辨率定时器的代码和jiffies的关系太过紧密,并且默认按32位进行设计,并且它的代码已经经过长时间的优化,目前的使用也是没有任何错误,如果硬要基于它来实现高分辨率定时器,势必会打破原有的时间轮概念,并且会引入一大堆#if--#else判断;
>虽然大部分时间里,时间轮可以实现O(1)时间复杂度,但是当有进位发生时,不可预测的O(N)定时器级联迁移时间,这对于低分辨率定时器来说问题不大,可是它大大地影响了定时器的精度;
>低分辨率定时器几乎是为“超时”而设计的,并为此对它进行了大量的优化,对于这些以“超时”未目的而使用定时器,它们大多数期望在超时到来之前获得正确的结果,然后删除定时器,精确时间并不是它们主要的目的,例如网络通信、设备IO等等。

为此,内核为高精度定时器重新设计了一套软件架构,它可以为我们提供纳秒级的定时精度,以满足对精确时间有迫切需求的应用程序或内核驱动,例如多媒体应用,音频设备的驱动程序等等。以下的讨论用hrtimer(high resolution timer)表示高精度定时器。
/*****************************************************************************************************/
声明:本博内容均由http://blog.csdn.net/droidphone原创,转载请注明出处,谢谢!
/*****************************************************************************************************/
1.  如何组织hrtimer?

我们知道,低分辨率定时器使用5个链表数组来组织timer_list结构,形成了著名的时间轮概念,对于高分辨率定时器,我们期望组织它们的数据结构至少具备以下条件:

>稳定而且快速的查找能力;
>快速地插入和删除定时器的能力;
>排序功能;

内核的开发者考察了多种数据结构,例如基数树、哈希表等等,最终他们选择了红黑树(rbtree)来组织hrtimer,红黑树已经以库的形式存在于内核中,并被成功地使用在内存管理子系统和文件系统中,随着系统的运行,hrtimer不停地被创建和销毁,新的hrtimer按顺序被插入到红黑树中,树的最左边的节点就是最快到期的定时器,内核用一个hrtimer结构来表示一个高精度定时器:

struct hrtimer {
	struct timerqueue_node		node;
	ktime_t				_softexpires;
	enum hrtimer_restart		(*function)(struct hrtimer *);
	struct hrtimer_clock_base	*base;
	unsigned long			state;
        ......
};

定时器的到期时间用ktime_t来表示,_softexpires字段记录了时间,定时器一旦到期,function字段指定的回调函数会被调用,该函数的返回值为一个枚举值,它决定了该hrtimer是否需要被重新激活:

enum hrtimer_restart {
	HRTIMER_NORESTART,	/* Timer is not restarted */
	HRTIMER_RESTART,	/* Timer must be restarted */
};

state字段用于表示hrtimer当前的状态,有几下几种位组合:

#define HRTIMER_STATE_INACTIVE	0x00  // 定时器未激活
#define HRTIMER_STATE_ENQUEUED	0x01  // 定时器已经被排入红黑树中
#define HRTIMER_STATE_CALLBACK	0x02  // 定时器的回调函数正在被调用
#define HRTIMER_STATE_MIGRATE	0x04  // 定时器正在CPU之间做迁移

hrtimer的到期时间可以基于以下几种时间基准系统:

enum  hrtimer_base_type {
	HRTIMER_BASE_MONOTONIC,  // 单调递增的monotonic时间,不包含休眠时间
	HRTIMER_BASE_REALTIME,   // 平常使用的墙上真实时间
	HRTIMER_BASE_BOOTTIME,   // 单调递增的boottime,包含休眠时间
	HRTIMER_MAX_CLOCK_BASES, // 用于后续数组的定义
};

和低分辨率定时器一样,处于效率和上锁的考虑,每个cpu单独管理属于自己的hrtimer,为此,专门定义了一个结构hrtimer_cpu_base:

struct hrtimer_cpu_base {
        ......
	struct hrtimer_clock_base	clock_base[HRTIMER_MAX_CLOCK_BASES];
};

其中,clock_base数组为每种时间基准系统都定义了一个hrtimer_clock_base结构,它的定义如下:

struct hrtimer_clock_base {
	struct hrtimer_cpu_base	*cpu_base;  // 指向所属cpu的hrtimer_cpu_base结构
        ......
	struct timerqueue_head	active;     // 红黑树,包含了所有使用该时间基准系统的hrtimer
	ktime_t			resolution; // 时间基准系统的分辨率
	ktime_t			(*get_time)(void); // 获取该基准系统的时间函数
	ktime_t			softirq_time;// 当用jiffies
	ktime_t			offset;      // 
};

active字段是一个timerqueue_head结构,它实际上是对rbtree的进一步封装:

struct timerqueue_node {
	struct rb_node node;  // 红黑树的节点
	ktime_t expires;      // 该节点代表队hrtimer的到期时间,与hrtimer结构中的_softexpires稍有不同
};
 
struct timerqueue_head {
	struct rb_root head;          // 红黑树的根节点
	struct timerqueue_node *next; // 该红黑树中最早到期的节点,也就是最左下的节点
};

timerqueue_head结构在红黑树的基础上,增加了一个next字段,用于保存树中最先到期的定时器节点,实际上就是树的最左下方的节点,有了next字段,当到期事件到来时,系统不必遍历整个红黑树,只要取出next字段对应的节点进行处理即可。timerqueue_node用于表示一个hrtimer节点,它在标准红黑树节点rb_node的基础上增加了expires字段,该字段和hrtimer中的_softexpires字段一起,设定了hrtimer的到期时间的一个范围,hrtimer可以在hrtimer._softexpires至timerqueue_node.expires之间的任何时刻到期,我们也称timerqueue_node.expires为硬过期时间(hard),意思很明显:到了此时刻,定时器一定会到期,有了这个范围可以选择,定时器系统可以让范围接近的多个定时器在同一时刻同时到期,这种设计可以降低进程频繁地被hrtimer进行唤醒。经过以上的讨论,我们可以得出以下的图示,它表明了每个cpu上的hrtimer是如何被组织在一起的:

FluxBB bbcode 测试

总结一下:

>每个cpu有一个hrtimer_cpu_base结构;
>hrtimer_cpu_base结构管理着3种不同的时间基准系统的hrtimer,分别是:实时时间,启动时间和单调时间;
>每种时间基准系统通过它的active字段(timerqueue_head结构指针),指向它们各自的红黑树;
>红黑树上,按到期时间进行排序,最先到期的hrtimer位于最左下的节点,并被记录在active.next字段中;
>3中时间基准的最先到期时间可能不同,所以,它们之中最先到期的时间被记录在hrtimer_cpu_base的expires_next字段中。

2.  hrtimer如何运转

hrtimer的实现需要一定的硬件基础,它的实现依赖于我们前几章介绍的timekeeper和clock_event_device,如果你对timekeeper和clock_event_device不了解请参考以下文章:Linux时间子系统之三:时间的维护者:timekeeper,Linux时间子系统之四:定时器的引擎:clock_event_device。hrtimer系统需要通过timekeeper获取当前的时间,计算与到期时间的差值,并根据该差值,设定该cpu的tick_device(clock_event_device)的下一次的到期时间,时间一到,在clock_event_device的事件回调函数中处理到期的hrtimer。现在你或许有疑问:前面在介绍clock_event_device时,我们知道,每个cpu有自己的tick_device,通常用于周期性地产生进程调度和时间统计的tick事件,这里又说要用tick_device调度hrtimer系统,通常cpu只有一个tick_device,那他们如何协调工作?这个问题也一度困扰着我,如果再加上NO_HZ配置带来tickless特性,你可能会更晕。这里我们先把这个疑问放下,我将在后面的章节中来讨论这个问题,现在我们只要先知道,一旦开启了hrtimer,tick_device所关联的clock_event_device的事件回调函数会被修改为:hrtimer_interrupt,并且会被设置成工作于CLOCK_EVT_MODE_ONESHOT单触发模式。
2.1  添加一个hrtimer

要添加一个hrtimer,系统提供了一些api供我们使用,首先我们需要定义一个hrtimer结构的实例,然后用hrtimer_init函数对它进行初始化,它的原型如下:

void hrtimer_init(struct hrtimer *timer, clockid_t which_clock,
			 enum hrtimer_mode mode);

which_clock可以是CLOCK_REALTIME、CLOCK_MONOTONIC、CLOCK_BOOTTIME中的一种,mode则可以是相对时间HRTIMER_MODE_REL,也可以是绝对时间HRTIMER_MODE_ABS。设定回调函数:

timer.function = hr_callback;

如果定时器无需指定一个到期范围,可以在设定回调函数后直接使用hrtimer_start激活该定时器:

int hrtimer_start(struct hrtimer *timer, ktime_t tim,
			 const enum hrtimer_mode mode);

如果需要指定到期范围,则可以使用hrtimer_start_range_ns激活定时器:

hrtimer_start_range_ns(struct hrtimer *timer, ktime_t tim,
			unsigned long range_ns, const enum hrtimer_mode mode);

要取消一个hrtimer,使用hrtimer_cancel:

int hrtimer_cancel(struct hrtimer *timer);

以下两个函数用于推后定时器的到期时间:

extern u64
hrtimer_forward(struct hrtimer *timer, ktime_t now, ktime_t interval);
 
/* Forward a hrtimer so it expires after the hrtimer's current now */
static inline u64 hrtimer_forward_now(struct hrtimer *timer,
				      ktime_t interval)
{
	return hrtimer_forward(timer, timer->base->get_time(), interval);
}

以下几个函数用于获取定时器的当前状态:

static inline int hrtimer_active(const struct hrtimer *timer)
{
	return timer->state != HRTIMER_STATE_INACTIVE;
}
 
static inline int hrtimer_is_queued(struct hrtimer *timer)
{
	return timer->state & HRTIMER_STATE_ENQUEUED;
}
 
static inline int hrtimer_callback_running(struct hrtimer *timer)
{
	return timer->state & HRTIMER_STATE_CALLBACK;
}

hrtimer_init最终会进入__hrtimer_init函数,该函数的主要目的是初始化hrtimer的base字段,同时初始化作为红黑树的节点的node字段:

static void __hrtimer_init(struct hrtimer *timer, clockid_t clock_id,
			   enum hrtimer_mode mode)
{
	struct hrtimer_cpu_base *cpu_base;
	int base;
 
	memset(timer, 0, sizeof(struct hrtimer));
 
	cpu_base = &__raw_get_cpu_var(hrtimer_bases);
 
	if (clock_id == CLOCK_REALTIME && mode != HRTIMER_MODE_ABS)
		clock_id = CLOCK_MONOTONIC;
 
	base = hrtimer_clockid_to_base(clock_id);
	timer->base = &cpu_base->clock_base[base];
	timerqueue_init(&timer->node);
        ......
}

hrtimer_start和hrtimer_start_range_ns最终会把实际的工作交由__hrtimer_start_range_ns来完成:

int __hrtimer_start_range_ns(struct hrtimer *timer, ktime_t tim,
		unsigned long delta_ns, const enum hrtimer_mode mode,
		int wakeup)
{
        ......        
        /* 取得hrtimer_clock_base指针 */
        base = lock_hrtimer_base(timer, &flags); 
        /* 如果已经在红黑树中,先移除它: */
        ret = remove_hrtimer(timer, base); ......
        /* 如果是相对时间,则需要加上当前时间,因为内部是使用绝对时间 */
        if (mode & HRTIMER_MODE_REL) {
                tim = ktime_add_safe(tim, new_base->get_time());
                ......
        } 
        /* 设置到期的时间范围 */
        hrtimer_set_expires_range_ns(timer, tim, delta_ns);
        ...... 
        /* 把hrtime按到期时间排序,加入到对应时间基准系统的红黑树中 */
        /* 如果该定时器的是最早到期的,将会返回true */
        leftmost = enqueue_hrtimer(timer, new_base);
        /* 
        * Only allow reprogramming if the new base is on this CPU. 
        * (it might still be on another CPU if the timer was pending) 
        * 
        * XXX send_remote_softirq() ?
        * 定时器比之前的到期时间要早,所以需要重新对tick_device进行编程,重新设定的的到期时间
        */
        if (leftmost && new_base->cpu_base == &__get_cpu_var(hrtimer_bases))
                hrtimer_enqueue_reprogram(timer, new_base, wakeup);
        unlock_hrtimer_base(timer, &flags);
        return ret;
}
 
 

2.2  hrtimer的到期处理

高精度定时器系统有3个入口可以对到期定时器进行处理,它们分别是:
>没有切换到高精度模式时,在每个jiffie的tick事件中断中进行查询和处理;
>在HRTIMER_SOFTIRQ软中断中进行查询和处理;
>切换到高精度模式后,在每个clock_event_device的到期事件中断中进行查询和处理;

低精度模式  因为系统并不是一开始就会支持高精度模式,而是在系统启动后的某个阶段,等待所有的条件都满足后,才会切换到高精度模式,当系统还没有切换到高精度模式时,所有的高精度定时器运行在低精度模式下,在每个jiffie的tick事件中断中进行到期定时器的查询和处理,显然这时候的精度和低分辨率定时器是一样的(HZ级别)。低精度模式下,每个tick事件中断中,hrtimer_run_queues函数会被调用,由它完成定时器的到期处理。hrtimer_run_queues首先判断目前高精度模式是否已经启用,如果已经切换到了高精度模式,什么也不做,直接返回:

void hrtimer_run_queues(void)
{
 
	if (hrtimer_hres_active())
		return;

如果hrtimer_hres_active返回false,说明目前处于低精度模式下,则继续处理,它用一个for循环遍历各个时间基准系统,查询每个hrtimer_clock_base对应红黑树的左下节点,判断它的时间是否到期,如果到期,通过__run_hrtimer函数,对到期定时器进行处理,包括:调用定时器的回调函数、从红黑树中移除该定时器、根据回调函数的返回值决定是否重新启动该定时器等等:

	for (index = 0; index < HRTIMER_MAX_CLOCK_BASES; index++) {
		base = &cpu_base->clock_base[index];
		if (!timerqueue_getnext(&base->active))
			continue;
 
		if (gettime) {
			hrtimer_get_softirq_time(cpu_base);
			gettime = 0;
		}
 
		raw_spin_lock(&cpu_base->lock);
 
		while ((node = timerqueue_getnext(&base->active))) {
			struct hrtimer *timer;
 
			timer = container_of(node, struct hrtimer, node);
			if (base->softirq_time.tv64 <=
					hrtimer_get_expires_tv64(timer))
				break;
 
			__run_hrtimer(timer, &base->softirq_time);
		}
		raw_spin_unlock(&cpu_base->lock);
	}

上面的timerqueue_getnext函数返回红黑树中的左下节点,之所以可以在while循环中使用该函数,是因为__run_hrtimer会在移除旧的左下节点时,新的左下节点会被更新到base->active->next字段中,使得循环可以继续执行,直到没有新的到期定时器为止。

高精度模式  切换到高精度模式后,原来给cpu提供tick事件的tick_device(clock_event_device)会被高精度定时器系统接管,它的中断事件回调函数被设置为hrtimer_interrupt,红黑树中最左下的节点的定时器的到期时间被编程到该clock_event_device中,这样每次clock_event_device的中断意味着至少有一个高精度定时器到期。另外,当timekeeper系统中的时间需要修正,或者clock_event_device的到期事件时间被重新编程时,系统会发出HRTIMER_SOFTIRQ软中断,软中断的处理函数run_hrtimer_softirq最终也会调用hrtimer_interrupt函数对到期定时器进行处理,所以在这里我们只要讨论hrtimer_interrupt函数的实现即可。

hrtimer_interrupt函数的前半部分和低精度模式下的hrtimer_run_queues函数完成相同的事情:它用一个for循环遍历各个时间基准系统,查询每个hrtimer_clock_base对应红黑树的左下节点,判断它的时间是否到期,如果到期,通过__run_hrtimer函数,对到期定时器进行处理,所以我们只讨论后半部分,在处理完所有到期定时器后,下一个到期定时器的到期时间保存在变量expires_next中,接下来的工作就是把这个到期时间编程到tick_device中:

void hrtimer_interrupt(struct clock_event_device *dev)
{
        ......
	for (i = 0; i < HRTIMER_MAX_CLOCK_BASES; i++) {
                ......
		while ((node = timerqueue_getnext(&base->active))) {
                        ......
			if (basenow.tv64 < hrtimer_get_softexpires_tv64(timer)) {
				ktime_t expires;
 
				expires = ktime_sub(hrtimer_get_expires(timer),
						    base->offset);
				if (expires.tv64 < expires_next.tv64)
					expires_next = expires;
				break;
			}
 
			__run_hrtimer(timer, &basenow);
		}
	}
 
	/*
	 * Store the new expiry value so the migration code can verify
	 * against it.
	 */
	cpu_base->expires_next = expires_next;
	raw_spin_unlock(&cpu_base->lock);
 
	/* Reprogramming necessary ? */
	if (expires_next.tv64 == KTIME_MAX ||
	    !tick_program_event(expires_next, 0)) {
		cpu_base->hang_detected = 0;
		return;
	}

如果这时的tick_program_event返回了非0值,表示过期时间已经在当前时间的前面,这通常由以下原因造成:

>系统正在被调试跟踪,导致时间在走,程序不走;
>定时器的回调函数花了太长的时间;
>系统运行在虚拟机中,而虚拟机被调度导致停止运行;

为了避免这些情况的发生,接下来系统提供3次机会,重新执行前面的循环,处理到期的定时器:

	raw_spin_lock(&cpu_base->lock);
	now = hrtimer_update_base(cpu_base);
	cpu_base->nr_retries++;
	if (++retries < 3)
		goto retry;

如果3次循环后还无法完成到期处理,系统不再循环,转为计算本次总循环的时间,然后把tick_device的到期时间强制设置为当前时间加上本次的总循环时间,不过推后的时间被限制在100ms以内:

	delta = ktime_sub(now, entry_time);
	if (delta.tv64 > cpu_base->max_hang_time.tv64)
		cpu_base->max_hang_time = delta;
	/*
	 * Limit it to a sensible value as we enforce a longer
	 * delay. Give the CPU at least 100ms to catch up.
	 */
	if (delta.tv64 > 100 * NSEC_PER_MSEC)
		expires_next = ktime_add_ns(now, 100 * NSEC_PER_MSEC);
	else
		expires_next = ktime_add(now, delta);
	tick_program_event(expires_next, 1);
	printk_once(KERN_WARNING "hrtimer: interrupt took %llu ns\n",
		    ktime_to_ns(delta));
}

3.  切换到高精度模式

上面提到,尽管内核配置成支持高精度定时器,但并不是一开始就工作于高精度模式,系统在启动的开始阶段,还是按照传统的模式在运行:tick_device按HZ频率定期地产生tick事件,这时的hrtimer工作在低分辨率模式,到期事件在每个tick事件中断中由hrtimer_run_queues函数处理,同时,在低分辨率定时器(时间轮)的软件中断TIMER_SOFTIRQ中,hrtimer_run_pending会被调用,系统在这个函数中判断系统的条件是否满足切换到高精度模式,如果条件满足,则会切换至高分辨率模式,另外提一下,NO_HZ模式也是在该函数中判断并切换。

void hrtimer_run_pending(void)
{
	if (hrtimer_hres_active())
		return;
        ......
	if (tick_check_oneshot_change(!hrtimer_is_hres_enabled()))
		hrtimer_switch_to_hres();
}

因为不管系统是否工作于高精度模式,每个TIMER_SOFTIRQ期间,该函数都会被调用,所以函数一开始先用hrtimer_hres_active判断目前高精度模式是否已经激活,如果已经激活,则说明之前的调用中已经切换了工作模式,不必再次切换,直接返回。hrtimer_hres_active很简单:

DEFINE_PER_CPU(struct hrtimer_cpu_base, hrtimer_bases) = {
        ......
}
 
static inline int hrtimer_hres_active(void)
{
	return __this_cpu_read(hrtimer_bases.hres_active);
}

hrtimer_run_pending函数接着通过tick_check_oneshot_change判断系统是否可以切换到高精度模式,

int tick_check_oneshot_change(int allow_nohz)
{
	struct tick_sched *ts = &__get_cpu_var(tick_cpu_sched);
 
	if (!test_and_clear_bit(0, &ts->check_clocks))
		return 0;
 
	if (ts->nohz_mode != NOHZ_MODE_INACTIVE)
		return 0;
 
	if (!timekeeping_valid_for_hres() || !tick_is_oneshot_available())
		return 0;
 
	if (!allow_nohz)
		return 1;
 
	tick_nohz_switch_to_nohz();
	return 0;
}

函数的一开始先判断check_clock标志的第0位是否被置位,如果没有置位,说明系统中没有注册符合要求的时钟事件设备,函数直接返回,check_clock标志由clocksource和clock_event_device系统的notify系统置位,当系统中有更高精度的clocksource被注册和选择后,或者有更精确的支持CLOCK_EVT_MODE_ONESHOT模式的clock_event_device被注册时,通过它们的notify函数,check_clock标志的第0为会置位。

如果tick_sched结构中的nohz_mode字段不是NOHZ_MODE_INACTIVE,表明系统已经切换到其它模式,直接返回。nohz_mode的取值有3种:
>NOHZ_MODE_INACTIVE    // 未启用NO_HZ模式
>NOHZ_MODE_LOWRES    // 启用NO_HZ模式,hrtimer工作于低精度模式下
>NOHZ_MODE_HIGHRES   // 启用NO_HZ模式,hrtimer工作于高精度模式下

接下来的timerkeeping_valid_for_hres判断timekeeper系统是否支持高精度模式,tick_is_oneshot_available判断tick_device是否支持CLOCK_EVT_MODE_ONESHOT模式。如果都满足要求,则继续往下判断。allow_nohz是函数的参数,为true表明可以切换到NOHZ_MODE_LOWRES 模式,函数将进入tick_nohz_switch_to_nohz,切换至NOHZ_MODE_LOWRES 模式,这里我们传入的allow_nohz是表达式:

    (!hrtimer_is_hres_enabled())

所以当系统不允许高精度模式时,将会在tick_check_oneshot_change函数内,通过tick_nohz_switch_to_nohz切换至NOHZ_MODE_LOWRES 模式,如果系统允许高精度模式,传入的allow_nohz参数为false,tick_check_oneshot_change函数返回1,回到上面的hrtimer_run_pending函数,hrtimer_switch_to_hres函数将会被调用,已完成切换到NOHZ_MODE_HIGHRES高精度模式。好啦,真正的切换函数找到了,我们看一看它如何切换:

首先,它通过hrtimer_cpu_base中的hres_active字段判断该cpu是否已经切换至高精度模式,如果是则直接返回:

static int hrtimer_switch_to_hres(void)
{
	int i, cpu = smp_processor_id();
	struct hrtimer_cpu_base *base = &per_cpu(hrtimer_bases, cpu);
	unsigned long flags;
 
	if (base->hres_active)
		return 1;

接着,通过tick_init_highres函数接管tick_device关联的clock_event_device:

	local_irq_save(flags);
 
	if (tick_init_highres()) {
		local_irq_restore(flags);
		printk(KERN_WARNING "Could not switch to high resolution "
				    "mode on CPU %d\n", cpu);
		return 0;
	}

tick_init_highres函数把tick_device切换到CLOCK_EVT_FEAT_ONESHOT模式,同时把clock_event_device的回调handler设置为hrtimer_interrupt,这样设置以后,tick_device的中断回调将由hrtimer_interrupt接管,hrtimer_interrupt在上面已经讨论过,它将完成高精度定时器的调度和到期处理。

接着,设置hres_active标志,以表明高精度模式已经切换,然后把3个时间基准系统的resolution字段设为KTIME_HIGH_RES:

	base->hres_active = 1;
	for (i = 0; i < HRTIMER_MAX_CLOCK_BASES; i++)
		base->clock_base[i].resolution = KTIME_HIGH_RES;

最后,因为tick_device被高精度定时器接管,它将不会再提供原有的tick事件机制,所以需要由高精度定时器系统模拟一个tick事件设备,继续为系统提供tick事件能力,这个工作由tick_setup_sched_timer函数完成。因为刚刚完成切换,tick_device的到期时间并没有被正确地设置为下一个到期定时器的时间,这里使用retrigger_next_event函数,传入参数NULL,使得tick_device立刻产生到期中断,hrtimer_interrupt被调用一次,然后下一个到期的定时器的时间会编程到tick_device中,从而完成了到高精度模式的切换:

	tick_setup_sched_timer();
	/* "Retrigger" the interrupt to get things going */
	retrigger_next_event(NULL);
	local_irq_restore(flags);
	return 1;
}

整个切换过程可以用下图表示:

FluxBB bbcode 测试

4.  模拟tick事件

根据上一节的讨论,当系统切换到高精度模式后,tick_device被高精度定时器系统接管,不再定期地产生tick事件,我们知道,到目前的版本为止(V3.4),内核还没有彻底废除jiffies机制,系统还是依赖定期到来的tick事件,供进程调度系统和时间更新等操作,大量存在的低精度定时器也仍然依赖于jiffies的计数,所以,尽管tick_device被接管,高精度定时器系统还是要想办法继续提供定期的tick事件。为了达到这一目的,内核使用了一个取巧的办法:既然高精度模式已经启用,可以定义一个hrtimer,把它的到期时间设定为一个jiffy的时间,当这个hrtimer到期时,在这个hrtimer的到期回调函数中,进行和原来的tick_device同样的操作,然后把该hrtimer的到期时间顺延一个jiffy周期,如此反复循环,完美地模拟了原有tick_device的功能。下面我们看看具体点代码是如何实现的。

在kernel/time/tick-sched.c中,内核定义了一个per_cpu全局变量:tick_cpu_sched,从而为每个cpu提供了一个tick_sched结构, 该结构主要用于管理NO_HZ配置下的tickless处理,因为模拟tick事件与tickless有很强的相关性,所以高精度定时器系统也利用了该结构的以下字段,用于完成模拟tick事件的操作:

struct tick_sched {
	struct hrtimer			sched_timer;
	unsigned long			check_clocks;
	enum tick_nohz_mode		nohz_mode;
        ......
};

sched_timer就是要用于模拟tick事件的hrtimer,check_clock上面几节已经讨论过,用于notify系统通知hrtimer系统需要检查是否切换到高精度模式,nohz_mode则用于表示当前的工作模式。

上一节提到,用于切换至高精度模式的函数是hrtimer_switch_to_hres,在它的最后,调用了函数tick_setup_sched_timer,该函数的作用就是设置一个用于模拟tick事件的hrtimer:

void tick_setup_sched_timer(void)
{
	struct tick_sched *ts = &__get_cpu_var(tick_cpu_sched);
	ktime_t now = ktime_get();
 
	/*
	 * Emulate tick processing via per-CPU hrtimers:
	 */
	hrtimer_init(&ts->sched_timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS);
	ts->sched_timer.function = tick_sched_timer;
 
	/* Get the next period (per cpu) */
	hrtimer_set_expires(&ts->sched_timer, tick_init_jiffy_update());
 
	for (;;) {
		hrtimer_forward(&ts->sched_timer, now, tick_period);
		hrtimer_start_expires(&ts->sched_timer,
				      HRTIMER_MODE_ABS_PINNED);
		/* Check, if the timer was already in the past */
		if (hrtimer_active(&ts->sched_timer))
			break;
		now = ktime_get();
	}
 
#ifdef CONFIG_NO_HZ
	if (tick_nohz_enabled)
		ts->nohz_mode = NOHZ_MODE_HIGHRES;
#endif
}

该函数首先初始化该cpu所属的tick_sched结构中sched_timer字段,把该hrtimer的回调函数设置为tick_sched_timer,然后把它的到期时间设定为下一个jiffy时刻,返回前把工作模式设置为NOHZ_MODE_HIGHRES,表明是利用高精度模式实现NO_HZ。

接着我们关注一下hrtimer的回调函数tick_sched_timer,我们知道,系统中的jiffies计数,时间更新等是全局操作,在smp系统中,只有一个cpu负责该工作,所以在tick_sched_timer的一开始,先判断当前cpu是否负责更新jiffies和时间,如果是,则执行更新操作:

static enum hrtimer_restart tick_sched_timer(struct hrtimer *timer)
{
        ......
 
#ifdef CONFIG_NO_HZ
	if (unlikely(tick_do_timer_cpu == TICK_DO_TIMER_NONE))
		tick_do_timer_cpu = cpu;
#endif
 
	/* Check, if the jiffies need an update */
	if (tick_do_timer_cpu == cpu)
		tick_do_update_jiffies64(now);

然后,利用regs指针确保当前是在中断上下文中,然后调用update_process_timer:

	if (regs) {
                ......
		update_process_times(user_mode(regs));
		......
	}

最后,把hrtimer的到期时间推进一个tick周期,返回HRTIMER_RESTART表明该hrtimer需要再次启动,以便产生下一个tick事件。

	hrtimer_forward(timer, now, tick_period);
 
	return HRTIMER_RESTART;
}

关于update_process_times,如果你你感兴趣,回看一下本系列关于clock_event_device的那一章: Linux时间子系统之四:定时器的引擎:clock_event_device中的第5小节,对比一下模拟tick事件的hrtimer的回调函数tick_sched_timer和切换前tick_device的回调函数 tick_handle_periodic,它们是如此地相像,实际上,它们几乎完成了一样的工作。

#17 内核模块 » Gentoo时间子系统之五:低分辨率定时器的原理和实现 » 2024-04-23 21:47:50

batsom
回复: 0

利用定时器,我们可以设定在未来的某一时刻,触发一个特定的事件。所谓低分辨率定时器,是指这种定时器的计时单位基于jiffies值的计数,也就是说,它的精度只有1/HZ,假如你的内核配置的HZ是1000,那意味着系统中的低分辨率定时器的精度就是1ms。早期的内核版本中,内核并不支持高精度定时器,理所当然只能使用这种低分辨率定时器,我们有时候把这种基于HZ的定时器机制成为时间轮:time wheel。虽然后来出现了高分辨率定时器,但它只是内核的一个可选配置项,所以直到目前最新的内核版本,这种低分辨率定时器依然被大量地使用着。

/*****************************************************************************************************/
声明:本博内容均由http://blog.csdn.net/droidphone原创,转载请注明出处,谢谢!
/*****************************************************************************************************/

1.  定时器的使用方法

在讨论定时器的实现原理之前,我们先看看如何使用定时器。要在内核编程中使用定时器,首先我们要定义一个time_list结构,该结构在include/linux/timer.h中定义:

struct timer_list {
	/*
	 * All fields that change during normal runtime grouped to the
	 * same cacheline
	 */
	struct list_head entry;
	unsigned long expires;
	struct tvec_base *base;
 
	void (*function)(unsigned long);
	unsigned long data;
 
	int slack;
        ......
};

>entry  字段用于把一组定时器组成一个链表,至于内核如何对定时器进行分组,我们会在后面进行解释。
>expires  字段指出了该定时器的到期时刻,也就是期望定时器到期时刻的jiffies计数值。
>base  每个cpu拥有一个自己的用于管理定时器的tvec_base结构,该字段指向该定时器所属的cpu所对应tvec_base结构。
>function  字段是一个函数指针,定时器到期时,系统将会调用该回调函数,用于响应该定时器的到期事件。
>data  该字段用于上述回调函数的参数。
>slack  对有些对到期时间精度不太敏感的定时器,到期时刻允许适当地延迟一小段时间,该字段用于计算每次延迟的HZ数。

要定义一个timer_list,我们可以使用静态和动态两种办法,静态方法使用DEFINE_TIMER宏:
>#define DEFINE_TIMER(_name, _function, _expires, _data)

该宏将得到一个名字为_name,并分别用_function,_expires,_data参数填充timer_list的相关字段。

如果要使用动态的方法,则可以自己声明一个timer_list结构,然后手动初始化它的各个字段:

struct timer_list timer;
......
init_timer(&timer);
timer.function = _function;
timer.expires = _expires;
timer.data = _data;

要激活一个定时器,我们只要调用add_timer即可:

add_timer(&timer);

要修改定时器的到期时间,我们只要调用mod_timer即可:

mod_timer(&timer, jiffies+50);

要移除一个定时器,我们只要调用del_timer即可:

del_timer(&timer);

定时器系统还提供了以下这些API供我们使用:

>void add_timer_on(struct timer_list *timer, int cpu);  // 在指定的cpu上添加定时器
>int mod_timer_pending(struct timer_list *timer, unsigned long expires);  //  只有当timer已经处在激活状态时,才修改timer的到期时刻
>int mod_timer_pinned(struct timer_list *timer, unsigned long expires);  //  当
>void set_timer_slack(struct timer_list *time, int slack_hz);  //  设定timer允许的到期时刻的最大延迟,用于对精度不敏感的定时器
>int del_timer_sync(struct timer_list *timer);  //  如果该timer正在被处理中,则等待timer处理完成才移除该timer

2.  定时器的软件架构

低分辨率定时器是基于HZ来实现的,也就是说,每个tick周期,都有可能有定时器到期,关于tick如何产生,请参考:Linux时间子系统之四:定时器的引擎:clock_event_device。系统中有可能有成百上千个定时器,难道在每个tick中断中遍历一下所有的定时器,检查它们是否到期?内核当然不会使用这么笨的办法,它使用了一个更聪明的办法:按定时器的到期时间对定时器进行分组。因为目前的多核处理器使用越来越广泛,连智能手机的处理器动不动就是4核心,内核对多核处理器有较好的支持,低分辨率定时器在实现时也充分地考虑了多核处理器的支持和优化。为了较好地利用cache line,也为了避免cpu之间的互锁,内核为多核处理器中的每个cpu单独分配了管理定时器的相关数据结构和资源,每个cpu独立地管理属于自己的定时器。
2.1  定时器的分组

首先,内核为每个cpu定义了一个tvec_base结构指针:
static DEFINE_PER_CPU(struct tvec_base *, tvec_bases) = &boot_tvec_bases;

tvec_base结构的定义如下:

struct tvec_base {
	spinlock_t lock;
	struct timer_list *running_timer;
	unsigned long timer_jiffies;
	unsigned long next_timer;
	struct tvec_root tv1;
	struct tvec tv2;
	struct tvec tv3;
	struct tvec tv4;
	struct tvec tv5;
} ____cacheline_aligned;

running_timer  该字段指向当前cpu正在处理的定时器所对应的timer_list结构。

timer_jiffies  该字段表示当前cpu定时器所经历过的jiffies数,大多数情况下,该值和jiffies计数值相等,当cpu的idle状态连续持续了多个jiffies时间时,当退出idle状态时,jiffies计数值就会大于该字段,在接下来的tick中断后,定时器系统会让该字段的值追赶上jiffies值。

next_timer  该字段指向该cpu下一个即将到期的定时器。

tv1--tv5  这5个字段用于对定时器进行分组,实际上,tv1--tv5都是一个链表数组,其中tv1的数组大小为TVR_SIZE, tv2 tv3 tv4 tv5的数组大小为TVN_SIZE,根据CONFIG_BASE_SMALL配置项的不同,它们有不同的大小:

#define TVN_BITS (CONFIG_BASE_SMALL ? 4 : 6)
#define TVR_BITS (CONFIG_BASE_SMALL ? 6 : 8)
#define TVN_SIZE (1 << TVN_BITS)
#define TVR_SIZE (1 << TVR_BITS)
#define TVN_MASK (TVN_SIZE - 1)
#define TVR_MASK (TVR_SIZE - 1)
 
struct tvec {
	struct list_head vec[TVN_SIZE];
};
 
struct tvec_root {
	struct list_head vec[TVR_SIZE];
};

默认情况下,没有使能CONFIG_BASE_SMALL,TVR_SIZE的大小是256,TVN_SIZE的大小则是64,当需要节省内存空间时,也可以使能CONFIG_BASE_SMALL,这时TVR_SIZE的大小是64,TVN_SIZE的大小则是16,以下的讨论我都是基于没有使能CONFIG_BASE_SMALL的情况。当有一个新的定时器要加入时,系统根据定时器到期的jiffies值和timer_jiffies字段的差值来决定该定时器被放入tv1至tv5中的哪一个数组中,最终,系统中所有的定时器的组织结构如下图所示:

FluxBB bbcode 测试

2.2  定时器的添加

要加入一个新的定时器,我们可以通过api函数add_timer或mod_timer来完成,最终的工作会交由internal_add_timer函数来处理。该函数按以下步骤进行处理:

>计算定时器到期时间和所属cpu的tvec_base结构中的timer_jiffies字段的差值,记为idx;
>根据idx的值,选择该定时器应该被放到tv1--tv5中的哪一个链表数组中,可以认为tv1-tv5分别占据一个32位数的不同比特位,tv1占据最低的8位,tv2占据紧接着的6位,然后tv3再占位,以此类推,最高的6位分配给tv5。最终的选择规则如下表所示:

FluxBB bbcode 测试

确定链表数组后,接着要确定把该定时器放入数组中的哪一个链表中,如果时间差idx小于256,按规则要放入tv1中,因为tv1包含了256个链表,所以可以简单地使用timer_list.expires的低8位作为数组的索引下标,把定时器链接到tv1中相应的链表中即可。如果时间差idx的值在256--18383之间,则需要把定时器放入tv2中,同样的,使用timer_list.expires的8--14位作为数组的索引下标,把定时器链接到tv2中相应的链表中,。定时器要加入tv3 tv4 tv5使用同样的原理。经过这样分组后的定时器,在后续的tick事件中,系统可以很方便地定位并取出相应的到期定时器进行处理。以上的讨论都体现在internal_add_timer的代码中:

static void internal_add_timer(struct tvec_base *base, struct timer_list *timer)
{
	unsigned long expires = timer->expires;
	unsigned long idx = expires - base->timer_jiffies;
	struct list_head *vec;
 
	if (idx < TVR_SIZE) {
		int i = expires & TVR_MASK;
		vec = base->tv1.vec + i;
	} else if (idx < 1 << (TVR_BITS + TVN_BITS)) {
		int i = (expires >> TVR_BITS) & TVN_MASK;
		vec = base->tv2.vec + i;
	} else if (idx < 1 << (TVR_BITS + 2 * TVN_BITS)) {
		int i = (expires >> (TVR_BITS + TVN_BITS)) & TVN_MASK;
		vec = base->tv3.vec + i;
	} else if (idx < 1 << (TVR_BITS + 3 * TVN_BITS)) {
		int i = (expires >> (TVR_BITS + 2 * TVN_BITS)) & TVN_MASK;
		vec = base->tv4.vec + i;
	} else if ((signed long) idx < 0) {
                ......
	} else {
                ......
		i = (expires >> (TVR_BITS + 3 * TVN_BITS)) & TVN_MASK;
		vec = base->tv5.vec + i;
	}
	list_add_tail(&timer->entry, vec);
}

2.2  定时器的到期处理

经过2.1节的处理后,系统中的定时器按到期时间有规律地放置在tv1--tv5各个链表数组中,其中tv1中放置着在接下来的256个jiffies即将到期的定时器列表,需要注意的是,并不是tv1.vec[0]中放置着马上到期的定时器列表,tv1.vec[1]中放置着将在jiffies+1到期的定时器列表。因为base.timer_jiffies的值一直在随着系统的运行而动态地增加,原则上是每个tick事件会加1,base.timer_jiffies代表者该cpu定时器系统当前时刻,定时器也是动态地加入头256个链表tv1中,按2.1节的讨论,定时器加入tv1中使用的下标索引是定时器到期时间expires的低8位,所以假设当前的base.timer_jiffies值是0x34567826,则马上到期的定时器是在tv1.vec[0x26]中,如果这时候系统加入一个在jiffies值0x34567828到期的定时器,他将会加入到tv1.vec[0x28]中,运行两个tick后,base.timer_jiffies的值会变为0x34567828,很显然,在每次tick事件中,定时器系统只要以base.timer_jiffies的低8位作为索引,取出tv1中相应的链表,里面正好包含了所有在该jiffies值到期的定时器列表。

那什么时候处理tv2--tv5中的定时器?每当base.timer_jiffies的低8位为0值时,这表明base.timer_jiffies的第8-13位有进位发生,这6位正好代表着tv2,这时只要按base.timer_jiffies的第8-13位的值作为下标,移出tv2中对应的定时器链表,然后用internal_add_timer把它们从新加入到定时器系统中来,因为这些定时器一定会在接下来的256个tick期间到期,所以它们肯定会被加入到tv1数组中,这样就完成了tv2往tv1迁移的过程。同样地,当base.timer_jiffies的第8-13位为0时,这表明base.timer_jiffies的第14-19位有进位发生,这6位正好代表着tv3,按base.timer_jiffies的第14-19位的值作为下标,移出tv3中对应的定时器链表,然后用internal_add_timer把它们从新加入到定时器系统中来,显然它们会被加入到tv2中,从而完成tv3到tv2的迁移,tv4,tv5的处理可以以此作类推。具体迁移的代码如下,参数index为事先计算好的高一级tv的需要迁移的数组索引:

static int cascade(struct tvec_base *base, struct tvec *tv, int index)
{
	/* cascade all the timers from tv up one level */
	struct timer_list *timer, *tmp;
	struct list_head tv_list;
 
	list_replace_init(tv->vec + index, &tv_list);  //  移除需要迁移的链表
 
	/*
	 * We are removing _all_ timers from the list, so we
	 * don't have to detach them individually.
	 */
	list_for_each_entry_safe(timer, tmp, &tv_list, entry) {
		BUG_ON(tbase_get_base(timer->base) != base);
                //  重新加入到定时器系统中,实际上将会迁移到下一级的tv数组中
		internal_add_timer(base, timer);  
	}
 
	return index;
}

每个tick事件到来时,内核会在tick定时中断处理期间激活定时器软中断:TIMER_SOFTIRQ,关于软件中断,请参考另一篇博文: Linux中断(interrupt)子系统之五:软件中断(softIRQ。TIMER_SOFTIRQ的执行函数是__run_timers,它实现了本节讨论的逻辑,取出tv1中到期的定时器,执行定时器的回调函数,由此可见, 低分辨率定时器的回调函数是执行在软件中断上下文中的,这点在写定时器的回调函数时需要注意。__run_timers的代码如下:

static inline void __run_timers(struct tvec_base *base)
{
	struct timer_list *timer;
 
	spin_lock_irq(&base->lock);
        /* 同步jiffies,在NO_HZ情况下,base->timer_jiffies可能落后不止一个tick  */
	while (time_after_eq(jiffies, base->timer_jiffies)) {  
		struct list_head work_list;
		struct list_head *head = &work_list;
                /*  计算到期定时器链表在tv1中的索引  */
		int index = base->timer_jiffies & TVR_MASK;  
 
		/*
		 * /*  tv2--tv5定时器列表迁移处理  */
		 */
		if (!index &&
			(!cascade(base, &base->tv2, INDEX(0))) &&              
				(!cascade(base, &base->tv3, INDEX(1))) &&      
					!cascade(base, &base->tv4, INDEX(2)))  
			cascade(base, &base->tv5, INDEX(3));  
                /*  该cpu定时器系统运行时间递增一个tick  */                 
		++base->timer_jiffies;  
                /*  取出到期的定时器链表  */                                       
		list_replace_init(base->tv1.vec + index, &work_list);
                /*  遍历所有的到期定时器  */          
		while (!list_empty(head)) {                                    
			void (*fn)(unsigned long);
			unsigned long data;
 
			timer = list_first_entry(head, struct timer_list,entry);
			fn = timer->function;
			data = timer->data;
 
			timer_stats_account_timer(timer);
 
			base->running_timer = timer;    /*  标记正在处理的定时器  */
			detach_timer(timer, 1);
 
			spin_unlock_irq(&base->lock);
			call_timer_fn(timer, fn, data);  /*  调用定时器的回调函数  */
			spin_lock_irq(&base->lock);
		}
	}
	base->running_timer = NULL;
	spin_unlock_irq(&base->lock);
}

通过上面的讨论,我们可以发现,内核的低分辨率定时器的实现非常精妙,既实现了大量定时器的管理,又实现了快速的O(1)查找到期定时器的能力,利用巧妙的数组结构,使得只需在间隔256个tick时间才处理一次迁移操作,5个数组就好比是5个齿轮,它们随着base->timer_jifffies的增长而不停地转动,每次只需处理第一个齿轮的某一个齿节,低一级的齿轮转动一圈,高一级的齿轮转动一个齿,同时自动把即将到期的定时器迁移到上一个齿轮中,所以低分辨率定时器通常又被叫做时间轮:time wheel。事实上,它的实现是一个很好的空间换时间软件算法。

3.  定时器软件中断

系统初始化时,start_kernel会调用定时器系统的初始化函数init_timers:

void __init init_timers(void)
{      
	int err = timer_cpu_notify(&timers_nb, (unsigned long)CPU_UP_PREPARE, 
				(void *)(long)smp_processor_id());
 
	init_timer_stats();
 
	BUG_ON(err != NOTIFY_OK);
	register_cpu_notifier(&timers_nb);  /* 注册cpu notify,以便在hotplug时在cpu之间进行定时器的迁移 */
	open_softirq(TIMER_SOFTIRQ, run_timer_softirq);
}

可见,open_softirq把run_timer_softirq注册为TIMER_SOFTIRQ的处理函数,另外,当cpu的每个tick事件到来时,在事件处理中断中,update_process_times会被调用,该函数会进一步调用run_local_timers,run_local_timers会触发TIMER_SOFTIRQ软中断:

void run_local_timers(void)
{
	hrtimer_run_queues();
	raise_softirq(TIMER_SOFTIRQ);
}

TIMER_SOFTIRQ的处理函数是run_timer_softirq:

static void run_timer_softirq(struct softirq_action *h)
{
	struct tvec_base *base = __this_cpu_read(tvec_bases);
 
	hrtimer_run_pending();
 
	if (time_after_eq(jiffies, base->timer_jiffies))
		__run_timers(base);
}

好啦,终于看到__run_timers函数了,2.2节已经介绍过,正是这个函数完成了对到期定时器的处理工作,也完成了时间轮的不停转动。

#18 内核模块 » Gentoo时间子系统之四:定时器的引擎:clock_event_device » 2024-04-23 21:43:52

batsom
回复: 0

早期的内核版本中,进程的调度基于一个称之为tick的时钟滴答,通常使用时钟中断来定时地产生tick信号,每次tick定时中断都会进行进程的统计和调度,并对tick进行计数,记录在一个jiffies变量中,定时器的设计也是基于jiffies。这时候的内核代码中,几乎所有关于时钟的操作都是在machine级的代码中实现,很多公共的代码要在每个平台上重复实现。随后,随着通用时钟框架的引入,内核需要支持高精度的定时器,为此,通用时间框架为定时器硬件定义了一个标准的接口:clock_event_device,machine级的代码只要按这个标准接口实现相应的硬件控制功能,剩下的与平台无关的特性则统一由通用时间框架层来实现。

1.  时钟事件软件架构
本系列文章的第一节中,我们曾经讨论了时钟源设备:clocksource,现在又来一个时钟事件设备:clock_event_device,它们有何区别?看名字,好像都是给系统提供时钟的设备,实际上,clocksource不能被编程,没有产生事件的能力,它主要被用于timekeeper来实现对真实时间进行精确的统计,而clock_event_device则是可编程的,它可以工作在周期触发或单次触发模式,系统可以对它进行编程,以确定下一次事件触发的时间,clock_event_device主要用于实现普通定时器和高精度定时器,同时也用于产生tick事件,供给进程调度子系统使用。时钟事件设备与通用时间框架中的其他模块的关系如下图所示:

FluxBB bbcode 测试

>与clocksource一样,系统中可以存在多个clock_event_device,系统会根据它们的精度和能力,选择合适的clock_event_device对系统提供时钟事件服务。在smp系统中,为了减少处理器间的通信开销,基本上每个cpu都会具备一个属于自己的本地clock_event_device,独立地为该cpu提供时钟事件服务,smp中的每个cpu基于本地的clock_event_device,建立自己的tick_device,普通定时器和高精度定时器。
>在软件架构上看,clock_event_device被分为了两层,与硬件相关的被放在了machine层,而与硬件无关的通用代码则被集中到了通用时间框架层,这符合内核对软件的设计需求,平台的开发者只需实现平台相关的接口即可,无需关注复杂的上层时间框架。
>tick_device是基于clock_event_device的进一步封装,用于代替原有的时钟滴答中断,给内核提供tick事件,以完成进程的调度和进程信息统计,负载平衡和时间更新等操作。

2.  时钟事件设备相关数据结构
2.1  struct clock_event_device

时钟事件设备的核心数据结构是clock_event_device结构,它代表着一个时钟硬件设备,该设备就好像是一个具有事件触发能力(通常就是指中断)的clocksource,它不停地计数,当计数值达到预先编程设定的数值那一刻,会引发一个时钟事件中断,继而触发该设备的事件处理回调函数,以完成对时钟事件的处理。clock_event_device结构的定义如下:

struct clock_event_device {
	void			(*event_handler)(struct clock_event_device *);
	int			(*set_next_event)(unsigned long evt,
						  struct clock_event_device *);
	int			(*set_next_ktime)(ktime_t expires,
						  struct clock_event_device *);
	ktime_t			next_event;
	u64			max_delta_ns;
	u64			min_delta_ns;
	u32			mult;
	u32			shift;
	enum clock_event_mode	mode;
	unsigned int		features;
	unsigned long		retries;
 
	void			(*broadcast)(const struct cpumask *mask);
	void			(*set_mode)(enum clock_event_mode mode,
					    struct clock_event_device *);
	unsigned long		min_delta_ticks;
	unsigned long		max_delta_ticks;
 
	const char		*name;
	int			rating;
	int			irq;
	const struct cpumask	*cpumask;
	struct list_head	list;
} ____cacheline_aligned;

event_handler  该字段是一个回调函数指针,通常由通用框架层设置,在时间中断到来时,machine底层的的中断服务程序会调用该回调,框架层利用该回调实现对时钟事件的处理。

set_next_event  设置下一次时间触发的时间,使用类似于clocksource的cycle计数值(离现在的cycle差值)作为参数。

set_next_ktime  设置下一次时间触发的时间,直接使用ktime时间作为参数。

max_delta_ns  可设置的最大时间差,单位是纳秒。

min_delta_ns  可设置的最小时间差,单位是纳秒。

mult shift  与clocksource中的类似,只不过是用于把纳秒转换为cycle。

mode  该时钟事件设备的工作模式,两种主要的工作模式分别是:

>CLOCK_EVT_MODE_PERIODIC  周期触发模式,设置后按给定的周期不停地触发事件;
>CLOCK_EVT_MODE_ONESHOT  单次触发模式,只在设置好的触发时刻触发一次;

set_mode  函数指针,用于设置时钟事件设备的工作模式。

rating  表示该设备的精度等级。

list  系统中注册的时钟事件设备用该字段挂在全局链表变量clockevent_devices上。
2.2  全局变量clockevent_devices
系统中所有注册的clock_event_device都会挂在该链表下面,它在kernel/time/clockevents.c中定义:

>static LIST_HEAD(clockevent_devices);

2.3  全局变量clockevents_chain
通用时间框架初始化时会注册一个通知链(NOTIFIER),当系统中的时钟时间设备的状态发生变化时,利用该通知链通知系统的其它模块。

/* Notification for clock events */
static RAW_NOTIFIER_HEAD(clockevents_chain);

3.  clock_event_device的初始化和注册
每一个machine,都要定义一个自己的machine_desc结构,该结构定义了该machine的一些最基本的特性,其中需要设定一个sys_timer结构指针,machine级的代码负责定义sys_timer结构,sys_timer的声明很简单:

struct sys_timer {
	void			(*init)(void);
	void			(*suspend)(void);
	void			(*resume)(void);
#ifdef CONFIG_ARCH_USES_GETTIMEOFFSET
	unsigned long		(*offset)(void);
#endif
};

通常,我们至少要定义它的init字段,系统初始化阶段,该init回调会被调用,该init回调函数的主要作用就是完成系统中的clocksource和clock_event_device的硬件初始化工作,以samsung的exynos4为例,在V3.4内核的代码树中,machine_desc的定义如下:

MACHINE_START(SMDK4412, "SMDK4412")
	/* Maintainer: Kukjin Kim <[email protected]> */
	/* Maintainer: Changhwan Youn <[email protected]> */
	.atag_offset	= 0x100,
	.init_irq	= exynos4_init_irq,
	.map_io		= smdk4x12_map_io,
	.handle_irq	= gic_handle_irq,
	.init_machine	= smdk4x12_machine_init,
	.timer		= &exynos4_timer,
	.restart	= exynos4_restart,
MACHINE_END

定义的sys_timer是exynos4_timer,它的定义和init回调定义如下:

static void __init exynos4_timer_init(void)
{
	if (soc_is_exynos4210())
		mct_int_type = MCT_INT_SPI;
	else
		mct_int_type = MCT_INT_PPI;
 
	exynos4_timer_resources();
	exynos4_clocksource_init();
	exynos4_clockevent_init();
}
 
struct sys_timer exynos4_timer = {
	.init		= exynos4_timer_init,
};

exynos4_clockevent_init函数显然是初始化和注册clock_event_device的合适时机,在这里,它注册了一个rating为250的clock_event_device,并把它指定给cpu0:

static struct clock_event_device mct_comp_device = {
	.name		= "mct-comp",
	.features       = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT,
	.rating		= 250,
	.set_next_event	= exynos4_comp_set_next_event,
	.set_mode	= exynos4_comp_set_mode,
};
......
static void exynos4_clockevent_init(void)
{
	clockevents_calc_mult_shift(&mct_comp_device, clk_rate, 5);
        ......
	mct_comp_device.cpumask = cpumask_of(0);
	clockevents_register_device(&mct_comp_device);
 
	setup_irq(EXYNOS4_IRQ_MCT_G0, &mct_comp_event_irq);
}

因为这个阶段其它cpu核尚未开始工作,所以该clock_event_device也只是在启动阶段给系统提供服务,实际上,因为exynos4是一个smp系统,具备2-4个cpu核心,前面说过,smp系统中,通常会使用各个cpu的本地定时器来为每个cpu单独提供时钟事件服务,继续翻阅代码,在系统初始化的后段,kernel_init会被调用,它会调用smp_prepare_cpus,其中会调用percpu_timer_setup函数,在arch/arm/kernel/smp.c中,为每个cpu定义了一个clock_event_device:

/*
 * Timer (local or broadcast) support
 */
static DEFINE_PER_CPU(struct clock_event_device, percpu_clockevent);

percpu_timer_setup最终会调用exynos4_local_timer_setup函数完成对本地clock_event_device的初始化工作:

static int __cpuinit exynos4_local_timer_setup(struct clock_event_device *evt)
{
    ......
	evt->name = mevt->name;
	evt->cpumask = cpumask_of(cpu);
	evt->set_next_event = exynos4_tick_set_next_event;
	evt->set_mode = exynos4_tick_set_mode;
	evt->features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT;
	evt->rating = 450;
 
	clockevents_calc_mult_shift(evt, clk_rate / (TICK_BASE_CNT + 1), 5);
    ......
	clockevents_register_device(evt);
    ......
	enable_percpu_irq(EXYNOS_IRQ_MCT_LOCALTIMER, 0);
    ......
	return 0;
}

由此可见,每个cpu的本地clock_event_device的rating是450,比启动阶段的250要高,显然,之前注册给cpu0的精度要高,系统会用本地clock_event_device替换掉原来分配给cpu0的clock_event_device,至于怎么替换?我们先停一停,到这里我们一直在讨论machine级别的初始化和注册,让我们回过头来,看看框架层的初始化。在继续之前,让我们看看整个clock_event_device的初始化的调用序列图:

FluxBB bbcode 测试

由上面的图示可以看出,框架层的初始化步骤很简单,又start_kernel开始,调用tick_init,它位于kernel/time/tick-common.c中,也只是简单地调用clockevents_register_notifier,同时把类型为notifier_block的tick_notifier作为参数传入,回看2.3节,clockevents_register_notifier注册了一个通知链,这样,当系统中的clock_event_device状态发生变化时(新增,删除,挂起,唤醒等等),tick_notifier中的notifier_call字段中设定的回调函数tick_notify就会被调用。接下来start_kernel调用了time_init函数,该函数通常定义在体系相关的代码中,正如前面所讨论的一样,它主要完成machine级别对时钟系统的初始化工作,最终通过clockevents_register_device注册系统中的时钟事件设备,把每个时钟时间设备挂在clockevent_device全局链表上,最后通过clockevent_do_notify触发框架层事先注册好的通知链,其实就是调用了tick_notify函数,我们主要关注CLOCK_EVT_NOTIFY_ADD通知,其它通知请自行参考代码,下面是tick_notify的简化版本:

static int tick_notify(struct notifier_block *nb, unsigned long reason,
			       void *dev)
{
	switch (reason) {
 
	case CLOCK_EVT_NOTIFY_ADD:
		return tick_check_new_device(dev);
 
	case CLOCK_EVT_NOTIFY_BROADCAST_ON:
	case CLOCK_EVT_NOTIFY_BROADCAST_OFF:
	case CLOCK_EVT_NOTIFY_BROADCAST_FORCE:
            ......
	case CLOCK_EVT_NOTIFY_BROADCAST_ENTER:
	case CLOCK_EVT_NOTIFY_BROADCAST_EXIT:
            ......
	case CLOCK_EVT_NOTIFY_CPU_DYING:
            ......
	case CLOCK_EVT_NOTIFY_CPU_DEAD:
            ......
	case CLOCK_EVT_NOTIFY_SUSPEND:
            ......
	case CLOCK_EVT_NOTIFY_RESUME:
            ......
	}
 
	return NOTIFY_OK;
}

可见,对于新注册的clock_event_device,会发出CLOCK_EVT_NOTIFY_ADD通知,最终会进入函数:tick_check_new_device,这个函数比对当前cpu所使用的与新注册的clock_event_device之间的特性,如果认为新的clock_event_device更好,则会进行切换工作。下一节将会详细的讨论该函数。到这里,每个cpu已经有了自己的clock_event_device,在这以后,框架层的代码会根据内核的配置项(CONFIG_NO_HZ、CONFIG_HIGH_RES_TIMERS),对注册的clock_event_device进行不同的设置,从而为系统的tick和高精度定时器提供服务,这些内容我们留在本系列的后续文章进行讨论。

4.  tick_device
当内核没有配置成支持高精度定时器时,系统的tick由tick_device产生,tick_device其实是clock_event_device的简单封装,它内嵌了一个clock_event_device指针和它的工作模式:

struct tick_device {
	struct clock_event_device *evtdev;
	enum tick_device_mode mode;
};

在kernel/time/tick-common.c中,定义了一个per-cpu的tick_device全局变量,tick_cpu_device:

/*
 * Tick devices
 */
DEFINE_PER_CPU(struct tick_device, tick_cpu_device);

前面曾经说过,当machine的代码为每个cpu注册clock_event_device时,通知回调函数tick_notify会被调用,进而进入tick_check_new_device函数,下面让我们看看该函数如何工作,首先,该函数先判断注册的clock_event_device是否可用于本cpu,然后从per-cpu变量中取出本cpu的tick_device:

static int tick_check_new_device(struct clock_event_device *newdev)
{
        ......
	cpu = smp_processor_id();
	if (!cpumask_test_cpu(cpu, newdev->cpumask))
		goto out_bc;
 
	td = &per_cpu(tick_cpu_device, cpu);
	curdev = td->evtdev;

如果不是本地clock_event_device,会做进一步的判断:如果不能把irq绑定到本cpu,则放弃处理,如果本cpu已经有了一个本地clock_event_device,也放弃处理:

	if (!cpumask_equal(newdev->cpumask, cpumask_of(cpu))) {
                ......
		if (!irq_can_set_affinity(newdev->irq))
			goto out_bc;
                ......
		if (curdev && cpumask_equal(curdev->cpumask, cpumask_of(cpu)))
			goto out_bc;
	}

反之,如果本cpu已经有了一个clock_event_device,则根据是否支持单触发模式和它的rating值,决定是否替换原来旧的clock_event_device:

	if (curdev) {
		if ((curdev->features & CLOCK_EVT_FEAT_ONESHOT) &&
		    !(newdev->features & CLOCK_EVT_FEAT_ONESHOT))
			goto out_bc;  // 新的不支持单触发,但旧的支持,所以不能替换
		if (curdev->rating >= newdev->rating)
			goto out_bc;  // 旧的比新的精度高,不能替换
	}

在这些判断都通过之后,说明或者来cpu还没有绑定tick_device,或者是新的更好,需要替换:

	if (tick_is_broadcast_device(curdev)) {
		clockevents_shutdown(curdev);
		curdev = NULL;
	}
	clockevents_exchange_device(curdev, newdev);
	tick_setup_device(td, newdev, cpu, cpumask_of(cpu));

上面的tick_setup_device函数负责重新绑定当前cpu的tick_device和新注册的clock_event_device,如果发现是当前cpu第一次注册tick_device,就把它设置为TICKDEV_MODE_PERIODIC模式,如果是替换旧的tick_device,则根据新的tick_device的特性,设置为TICKDEV_MODE_PERIODIC或TICKDEV_MODE_ONESHOT模式。可见,在系统的启动阶段,tick_device是工作在周期触发模式的,直到框架层在合适的时机,才会开启单触发模式,以便支持NO_HZ和HRTIMER。
5.  tick事件的处理--最简单的情况
clock_event_device最基本的应用就是实现tick_device,然后给系统定期地产生tick事件,通用时间框架对clock_event_device和tick_device的处理相当复杂,因为涉及配置项:CONFIG_NO_HZ和CONFIG_HIGH_RES_TIMERS的组合,两个配置项就有4种组合,这四种组合的处理都有所不同,所以这里我先只讨论最简单的情况:

>CONFIG_NO_HZ == 0;
>CONFIG_HIGH_RES_TIMERS == 0;

在这种配置模式下,我们回到上一节的tick_setup_device函数的最后:

	if (td->mode == TICKDEV_MODE_PERIODIC)
		tick_setup_periodic(newdev, 0);
	else
		tick_setup_oneshot(newdev, handler, next_event);

因为启动期间,第一个注册的tick_device必然工作在TICKDEV_MODE_PERIODIC模式,所以tick_setup_periodic会设置clock_event_device的事件回调字段event_handler为tick_handle_periodic,工作一段时间后,就算有新的支持TICKDEV_MODE_ONESHOT模式的clock_event_device需要替换,再次进入tick_setup_device函数,tick_setup_oneshot的handler参数也是之前设置的tick_handle_periodic函数,所以我们考察tick_handle_periodic即可:

void tick_handle_periodic(struct clock_event_device *dev)
{
	int cpu = smp_processor_id();
	ktime_t next;
 
	tick_periodic(cpu);
 
	if (dev->mode != CLOCK_EVT_MODE_ONESHOT)
		return;
 
	next = ktime_add(dev->next_event, tick_period);
	for (;;) {
		if (!clockevents_program_event(dev, next, false))
			return;
		if (timekeeping_valid_for_hres())
			tick_periodic(cpu);
		next = ktime_add(next, tick_period);
	}
}

该函数首先调用tick_periodic函数,完成tick事件的所有处理,如果是周期触发模式,处理结束,如果工作在单触发模式,则计算并设置下一次的触发时刻,这里用了一个循环,是为了防止当该函数被调用时,clock_event_device中的计时实际上已经经过了不止一个tick周期,这时候,tick_periodic可能被多次调用,使得jiffies和时间可以被正确地更新。tick_periodic的代码如下:

static void tick_periodic(int cpu)
{
	if (tick_do_timer_cpu == cpu) {
		write_seqlock(&xtime_lock);
 
		/* Keep track of the next tick event */
		tick_next_period = ktime_add(tick_next_period, tick_period);
 
		do_timer(1);
		write_sequnlock(&xtime_lock);
	}
 
	update_process_times(user_mode(get_irq_regs()));
	profile_tick(CPU_PROFILING);
}

如果当前cpu负责更新时间,则通过do_timer进行以下操作:
>更新jiffies_64变量;
>更新墙上时钟;
>每10个tick,更新一次cpu的负载信息;

调用update_peocess_times,完成以下事情:
>更新进程的时间统计信息;
>触发TIMER_SOFTIRQ软件中断,以便系统处理传统的低分辨率定时器;
>检查rcu的callback;
>通过scheduler_tick触发调度系统进行进程统计和调度工作;

#19 内核模块 » Gentoo时间子系统之三:时间的维护者:timekeeper » 2024-04-23 21:41:20

batsom
回复: 0

本系列文章的前两节讨论了用于计时的时钟源:clocksource,以及内核内部时间的一些表示方法,但是对于真实的用户来说,我们感知的是真实世界的真实时间,也就是所谓的墙上时间,clocksource只能提供一个按给定频率不停递增的周期计数,如何把它和真实的墙上时间相关联?本节的内容正是要讨论这一点。
1.  时间的种类

内核管理着多种时间,它们分别是:
>RTC时间
>wall time:墙上时间
>monotonic time
>raw monotonic time
>boot time:总启动时间

RTC时间  在PC中,RTC时间又叫CMOS时间,它通常由一个专门的计时硬件来实现,软件可以读取该硬件来获得年月日、时分秒等时间信息,而在嵌入式系统中,有使用专门的RTC芯片,也有直接把RTC集成到Soc芯片中,读取Soc中的某个寄存器即可获取当前时间信息。一般来说,RTC是一种可持续计时的,也就是说,不管系统是否上电,RTC中的时间信息都不会丢失,计时会一直持续进行,硬件上通常使用一个后备电池对RTC硬件进行单独的供电。因为RTC硬件的多样性,开发者需要为每种RTC时钟硬件提供相应的驱动程序,内核和用户空间通过驱动程序访问RTC硬件来获取或设置时间信息。

xtime  xtime和RTC时间一样,都是人们日常所使用的墙上时间,只是RTC时间的精度通常比较低,大多数情况下只能达到毫秒级别的精度,如果是使用外部的RTC芯片,访问速度也比较慢,为此,内核维护了另外一个wall time时间:xtime,取决于用于对xtime计时的clocksource,它的精度甚至可以达到纳秒级别,因为xtime实际上是一个内存中的变量,它的访问速度非常快,内核大部分时间都是使用xtime来获得当前时间信息。xtime记录的是自1970年1月1日24时到当前时刻所经历的纳秒数。

monotonic time  该时间自系统开机后就一直单调地增加,它不像xtime可以因用户的调整时间而产生跳变,不过该时间不计算系统休眠的时间,也就是说,系统休眠时,monotoic时间不会递增。

raw monotonic time  该时间与monotonic时间类似,也是单调递增的时间,唯一的不同是:raw monotonic time“更纯净”,他不会受到NTP时间调整的影响,它代表着系统独立时钟硬件对时间的统计。

boot time  与monotonic时间相同,不过会累加上系统休眠的时间,它代表着系统上电后的总时间。

struct timekeeper {
	struct clocksource *clock;    /* Current clocksource used for timekeeping. */
	u32	mult;    /* NTP adjusted clock multiplier */
	int	shift;	/* The shift value of the current clocksource. */
	cycle_t cycle_interval;	/* Number of clock cycles in one NTP interval. */
	u64	xtime_interval;	/* Number of clock shifted nano seconds in one NTP interval. */
	s64	xtime_remainder;	/* shifted nano seconds left over when rounding cycle_interval */
	u32	raw_interval;	/* Raw nano seconds accumulated per NTP interval. */
 
	u64	xtime_nsec;	/* Clock shifted nano seconds remainder not stored in xtime.tv_nsec. */
	/* Difference between accumulated time and NTP time in ntp
	 * shifted nano seconds. */
	s64	ntp_error;
	/* Shift conversion between clock shifted nano seconds and
	 * ntp shifted nano seconds. */
	int	ntp_error_shift;
 
	struct timespec xtime;	/* The current time */
 
	struct timespec wall_to_monotonic;
	struct timespec total_sleep_time;	/* time spent in suspend */
	struct timespec raw_time;	/* The raw monotonic time for the CLOCK_MONOTONIC_RAW posix clock. */
 
	ktime_t offs_real;	/* Offset clock monotonic -> clock realtime */
 
	ktime_t offs_boot;	/* Offset clock monotonic -> clock boottime */
 
	seqlock_t lock;	/* Seqlock for all timekeeper values */
};

其中的xtime字段就是上面所说的墙上时间,它是一个timespec结构的变量,它记录了自1970年1月1日以来所经过的时间,因为是timespec结构,所以它的精度可以达到纳秒级,当然那要取决于系统的硬件是否支持这一精度。

内核除了用xtime表示墙上的真实时间外,还维护了另外一个时间:monotonic time,可以把它理解为自系统启动以来所经过的时间,该时间只能单调递增,可以理解为xtime虽然正常情况下也是递增的,但是毕竟用户可以主动向前或向后调整墙上时间,从而修改xtime值。但是monotonic时间不可以往后退,系统启动后只能不断递增。奇怪的是,内核并没有直接定义一个这样的变量来记录monotonic时间,而是定义了一个变量wall_to_monotonic,记录了墙上时间和monotonic时间之间的偏移量,当需要获得monotonic时间时,把xtime和wall_to_monotonic相加即可,因为默认启动时monotonic时间为0,所以实际上wall_to_monotonic的值是一个负数,它和xtime同一时间被初始化,请参考timekeeping_init函数。

计算monotonic时间要去除系统休眠期间花费的时间,内核用total_sleep_time记录休眠的时间,每次休眠醒来后重新累加该时间,并调整wall_to_monotonic的值,使其在系统休眠醒来后,monotonic时间不会发生跳变。因为wall_to_monotonic值被调整。所以如果想获取boot time,需要加入该变量的值:

void get_monotonic_boottime(struct timespec *ts)
{
        ......
	do {
		seq = read_seqbegin(&timekeeper.lock);
		*ts = timekeeper.xtime;
		tomono = timekeeper.wall_to_monotonic;
		sleep = timekeeper.total_sleep_time;
		nsecs = timekeeping_get_ns();
 
	} while (read_seqretry(&timekeeper.lock, seq));
 
	set_normalized_timespec(ts, ts->tv_sec + tomono.tv_sec + sleep.tv_sec,
			ts->tv_nsec + tomono.tv_nsec + sleep.tv_nsec + nsecs);
}

raw_time字段用来表示真正的硬件时间,也就是上面所说的raw monotonic time,它不受时间调整的影响,monotonic时间虽然也不受settimeofday的影响,但会受到ntp调整的影响,但是raw_time不受ntp的影响,他真的就是开完机后就单调地递增。xtime、monotonic-time和raw_time可以通过用户空间的clock_gettime函数获得,对应的ID参数分别是 CLOCK_REALTIME、CLOCK_MONOTONIC、CLOCK_MONOTONIC_RAW。

clock字段则指向了目前timekeeper所使用的时钟源,xtime,monotonic time和raw time都是基于该时钟源进行计时操作,当有新的精度更高的时钟源被注册时,通过timekeeping_notify函数,change_clocksource函数将会被调用,timekeeper.clock字段将会被更新,指向新的clocksource。

早期的内核版本中,xtime、wall_to_monotonic、raw_time其实是定义为全局静态变量,到我目前的版本(V3.4.10),这几个变量被移入到了timekeeper结构中,现在只需维护一个timekeeper全局静态变量即可:

>static struct timekeeper timekeeper;

3.  timekeeper的初始化

timekeeper的初始化由timekeeping_init完成,该函数在start_kernel的初始化序列中被调用,timekeeping_init首先从RTC中获取当前时间:

void __init timekeeping_init(void)
{
	struct clocksource *clock;
	unsigned long flags;
	struct timespec now, boot;
 
	read_persistent_clock(&now);
	read_boot_clock(&boot);

然后对锁和ntp进行必要的初始化:

	seqlock_init(&timekeeper.lock);
 
	ntp_init();

利用RTC的当前时间,初始化xtime,raw_time,wall_to_monotonic等字段:

	timekeeper.xtime.tv_sec = now.tv_sec;
	timekeeper.xtime.tv_nsec = now.tv_nsec;
	timekeeper.raw_time.tv_sec = 0;
	timekeeper.raw_time.tv_nsec = 0;
	if (boot.tv_sec == 0 && boot.tv_nsec == 0) {
		boot.tv_sec = timekeeper.xtime.tv_sec;
		boot.tv_nsec = timekeeper.xtime.tv_nsec;
	}
	set_normalized_timespec(&timekeeper.wall_to_monotonic,
				-boot.tv_sec, -boot.tv_nsec);

最后,初始化代表实时时间和monotonic时间之间偏移量的offs_real字段,total_sleep_time字段初始化为0:

	update_rt_offset();
	timekeeper.total_sleep_time.tv_sec = 0;
	timekeeper.total_sleep_time.tv_nsec = 0;
	write_sequnlock_irqrestore(&timekeeper.lock, flags);

xtime字段因为是保存在内存中,系统掉电后无法保存时间信息,所以每次启动时都要通过timekeeping_init从RTC中同步正确的时间信息。其中,read_persistent_clock和read_boot_clock是平台级的函数,分别用于获取RTC硬件时间和启动时的时间,不过值得注意到是,到目前为止(我的代码树基于3.4版本),ARM体系中,只有tegra和omap平台实现了read_persistent_clock函数。如果平台没有实现该函数,内核提供了一个默认的实现:

void __attribute__((weak)) read_persistent_clock(struct timespec *ts)
{
	ts->tv_sec = 0;
	ts->tv_nsec = 0;
}
void __attribute__((weak)) read_boot_clock(struct timespec *ts)
{
	ts->tv_sec = 0;
	ts->tv_nsec = 0;
}

那么,其他ARM平台是如何初始化xtime的?答案就是CONFIG_RTC_HCTOSYS这个内核配置项,打开该配置后,driver/rtc/hctosys.c将会编译到系统中,由rtc_hctosys函数通过do_settimeofday在系统初始化时完成xtime变量的初始化:

static int __init rtc_hctosys(void) 
{ 
        ...... 
        err = rtc_read_time(rtc, &tm); 
        ......
        rtc_tm_to_time(&tm, &tv.tv_sec); 
        do_settimeofday(&tv); 
        ...... 
        return err; 
} 
late_initcall(rtc_hctosys);

4.  时间的更新

xtime一旦初始化完成后,timekeeper就开始独立于RTC,利用自身关联的clocksource进行时间的更新操作,根据内核的配置项的不同,更新时间的操作发生的频度也不尽相同,如果没有配置NO_HZ选项,通常每个tick的定时中断周期,do_timer会被调用一次,相反,如果配置了NO_HZ选项,可能会在好几个tick后,do_timer才会被调用一次,当然传入的参数是本次更新离上一次更新时相隔了多少个tick周期,系统会保证在clocksource的max_idle_ns时间内调用do_timer,以防止clocksource的溢出:

void do_timer(unsigned long ticks)
{
	jiffies_64 += ticks;
	update_wall_time();
	calc_global_load(ticks);
}

在do_timer中,jiffies_64变量被相应地累加,然后在update_wall_time中完成xtime等时间的更新操作,更新时间的核心操作就是读取关联clocksource的计数值,累加到xtime等字段中,其中还设计ntp时间的调整等代码,详细的代码就不贴了。

5.  获取时间

timekeeper提供了一系列的接口用于获取各种时间信息。
>void getboottime(struct timespec *ts);    获取系统启动时刻的实时时间
>void get_monotonic_boottime(struct timespec *ts);     获取系统启动以来所经过的时间,包含休眠时间
>ktime_t ktime_get_boottime(void);   获取系统启动以来所经过的c时间,包含休眠时间,返回ktime类型
>ktime_t ktime_get(void);    获取系统启动以来所经过的c时间,不包含休眠时间,返回ktime类型
>void ktime_get_ts(struct timespec *ts) ;   获取系统启动以来所经过的c时间,不包含休眠时间,返回timespec结构
>unsigned long get_seconds(void);    返回xtime中的秒计数值
>struct timespec current_kernel_time(void);    返回内核最后一次更新的xtime时间,不累计最后一次更新至今clocksource的计数值
>void getnstimeofday(struct timespec *ts);    获取当前时间,返回timespec结构
>void do_gettimeofday(struct timeval *tv);    获取当前时间,返回timeval结构


FluxBB bbcode 测试

#20 内核模块 » Gentoo时间子系统之二:表示时间的单位和结构 » 2024-04-23 21:38:34

batsom
回复: 0

人们习惯用于表示时间的方法是:年、月、日、时、分、秒、毫秒、星期等等,但是在内核中,为了软件逻辑和代码的方便性,它使用了一些不同的时间表示方法,并为这些表示方法定义了相应的变量和数据结构,本节的内容就是阐述这些表示方法的意义和区别。


/*****************************************************************************************************/
声明:本博内容均由http://blog.csdn.net/droidphone原创,转载请注明出处,谢谢!

/*****************************************************************************************************/
1.  jiffies

内核用jiffies变量记录系统启动以来经过的时钟滴答数,它的声明如下:

extern u64 __jiffy_data jiffies_64;
extern unsigned long volatile __jiffy_data jiffies;

可见,在32位的系统上,jiffies是一个32位的无符号数,系统每过1/HZ秒,jiffies的值就会加1,最终该变量可能会溢出,所以内核同时又定义了一个64位的变量jiffies_64,链接的脚本保证jiffies变量和jiffies_64变量的内存地址是相同的,通常,我们可以直接访问jiffies变量,但是要获得jiffies_64变量,必须通过辅助函数get_jiffies_64来实现。jiffies是内核的低精度定时器的计时单位,所以内核配置的HZ数决定了低精度定时器的精度,如果HZ数被设定为1000,那么,低精度定时器(timer_list)的精度就是1ms=1/1000秒。因为jiffies变量可能存在溢出的问题,所以在用基于jiffies进行比较时,应该使用以下辅助宏来实现:

time_after(a,b)
time_before(a,b)
time_after_eq(a,b)
time_before_eq(a,b)
time_in_range(a,b,c)

同时,内核还提供了一些辅助函数用于jiffies和毫秒以及纳秒之间的转换:

unsigned int jiffies_to_msecs(const unsigned long j);
unsigned int jiffies_to_usecs(const unsigned long j);
unsigned long msecs_to_jiffies(const unsigned int m);
unsigned long usecs_to_jiffies(const unsigned int u);

2.  struct timeval
timeval由秒和微秒组成,它的定义如下:

struct timeval {
	__kernel_time_t		tv_sec;		/* seconds */
	__kernel_suseconds_t	tv_usec;	/* microseconds */
};

__kernel_time_t  和 __kernel_suseconds_t 实际上都是long型的整数。gettimeofday和settimeofday使用timeval作为时间单位。
3.  struct timespec
timespec由秒和纳秒组成,它的定义如下:

struct timespec {
	__kernel_time_t	tv_sec;			/* seconds */
	long		tv_nsec;		/* nanoseconds */
};

同样地,内核也提供了一些辅助函数用于jiffies、timeval、timespec之间的转换:

static inline int timespec_equal(const struct timespec *a, const struct timespec *b);
static inline int timespec_compare(const struct timespec *lhs, const struct timespec *rhs);
static inline int timeval_compare(const struct timeval *lhs, const struct timeval *rhs);
extern unsigned long mktime(const unsigned int year, const unsigned int mon,
			    const unsigned int day, const unsigned int hour,
			    const unsigned int min, const unsigned int sec);
extern void set_normalized_timespec(struct timespec *ts, time_t sec, s64 nsec);
static inline struct timespec timespec_add(struct timespec lhs,	struct timespec rhs);
static inline struct timespec timespec_sub(struct timespec lhs,	struct timespec rhs);
 
static inline s64 timespec_to_ns(const struct timespec *ts);
static inline s64 timeval_to_ns(const struct timeval *tv);
extern struct timespec ns_to_timespec(const s64 nsec);
extern struct timeval ns_to_timeval(const s64 nsec);
static __always_inline void timespec_add_ns(struct timespec *a, u64 ns);
unsigned long timespec_to_jiffies(const struct timespec *value);
void jiffies_to_timespec(const unsigned long jiffies, struct timespec *value);
unsigned long timeval_to_jiffies(const struct timeval *value);
void jiffies_to_timeval(const unsigned long jiffies, struct timeval *value);

timekeeper中的xtime字段用timespec作为时间单位。
4.  struct ktime
linux的通用时间架构用ktime来表示时间,为了兼容32位和64位以及big-little endian系统,ktime结构被定义如下:

union ktime {
	s64	tv64;
#if BITS_PER_LONG != 64 && !defined(CONFIG_KTIME_SCALAR)
	struct {
# ifdef __BIG_ENDIAN
	s32	sec, nsec;
# else
	s32	nsec, sec;
# endif
	} tv;
#endif
};

64位的系统可以直接访问tv64字段,单位是纳秒,32位的系统则被拆分为两个字段:sec和nsec,并且照顾了大小端的不同。高精度定时器通常用ktime作为计时单位。下面是一些辅助函数用于计算和转换:

ktime_t ktime_set(const long secs, const unsigned long nsecs); 
ktime_t ktime_sub(const ktime_t lhs, const ktime_t rhs); 
ktime_t ktime_add(const ktime_t add1, const ktime_t add2); 
ktime_t ktime_add_ns(const ktime_t kt, u64 nsec); 
ktime_t ktime_sub_ns(const ktime_t kt, u64 nsec); 
ktime_t timespec_to_ktime(const struct timespec ts); 
ktime_t timeval_to_ktime(const struct timeval tv); 
struct timespec ktime_to_timespec(const ktime_t kt); 
struct timeval ktime_to_timeval(const ktime_t kt); 
s64 ktime_to_ns(const ktime_t kt); 
int ktime_equal(const ktime_t cmp1, const ktime_t cmp2); 
s64 ktime_to_us(const ktime_t kt); 
s64 ktime_to_ms(const ktime_t kt); 
ktime_t ns_to_ktime(u64 ns);

#21 内核模块 » Gentoo时间子系统之一:clock source(时钟源) » 2024-04-23 21:35:39

batsom
回复: 0

clock source用于为linux内核提供一个时间基线,如果你用linux的date命令获取当前时间,内核会读取当前的clock source,转换并返回合适的时间单位给用户空间。在硬件层,它通常实现为一个由固定时钟频率驱动的计数器,计数器只能单调地增加,直到溢出为止。时钟源是内核计时的基础,系统启动时,内核通过硬件RTC获得当前时间,在这以后,在大多数情况下,内核通过选定的时钟源更新实时时间信息(墙上时间),而不再读取RTC的时间。本节的内核代码树基于V3.4.10。


struct clocksource {
	/*
	 * Hotpath data, fits in a single cache line when the
	 * clocksource itself is cacheline aligned.
	 */
	cycle_t (*read)(struct clocksource *cs);
	cycle_t cycle_last;
	cycle_t mask;
	u32 mult;
	u32 shift;
	u64 max_idle_ns;
	u32 maxadj;
#ifdef CONFIG_ARCH_CLOCKSOURCE_DATA
	struct arch_clocksource_data archdata;
#endif
 
	const char *name;
	struct list_head list;
	int rating;
	int (*enable)(struct clocksource *cs);
	void (*disable)(struct clocksource *cs);
	unsigned long flags;
	void (*suspend)(struct clocksource *cs);
	void (*resume)(struct clocksource *cs);
 
	/* private: */
#ifdef CONFIG_CLOCKSOURCE_WATCHDOG
	/* Watchdog related data, used by the framework */
	struct list_head wd_list;
	cycle_t cs_last;
	cycle_t wd_last;
#endif
} ____cacheline_aligned;

我们只关注clocksource中的几个重要的字段。

1.1  rating:时钟源的精度
同一个设备下,可以有多个时钟源,每个时钟源的精度由驱动它的时钟频率决定,比如一个由10MHz时钟驱动的时钟源,他的精度就是100nS。clocksource结构中有一个rating字段,代表着该时钟源的精度范围,它的取值范围如下:

>1--99: 不适合于用作实际的时钟源,只用于启动过程或用于测试;
>100--199:基本可用,可用作真实的时钟源,但不推荐;
>200--299:精度较好,可用作真实的时钟源;
>300--399:很好,精确的时钟源;
>400--499:理想的时钟源,如有可能就必须选择它作为时钟源;

1.2  read回调函数
时钟源本身不会产生中断,要获得时钟源的当前计数,只能通过主动调用它的read回调函数来获得当前的计数值,注意这里只能获得计数值,也就是所谓的cycle,要获得相应的时间,必须要借助clocksource的mult和shift字段进行转换计算。
1.3  mult和shift字段
因为从clocksource中读到的值是一个cycle计数值,要转换为时间,我们必须要知道驱动clocksource的时钟频率F,一个简单的计算就可以完成:

>t = cycle/F;

可是clocksource并没有保存时钟的频率F,因为使用上面的公式进行计算,需要使用浮点运算,这在内核中是不允许的,因此,内核使用了另外一个变通的办法,根据时钟的频率和期望的精度,事先计算出两个辅助常数mult和shift,然后使用以下公式进行cycle和t的转换:

>t = (cycle * mult) >> shift;

只要我们保证:

>F = (1 << shift) / mult;

内核内部使用64位进行该转换计算:

static inline s64 clocksource_cyc2ns(cycle_t cycles, u32 mult, u32 shift)
{
        return ((u64) cycles * mult) >> shift;
}

从转换精度考虑,mult的值是越大越好,但是为了计算过程不发生溢出,mult的值又不能取得过大。为此内核假设cycle计数值被转换后的最大时间值:10分钟(600秒),主要的考虑是CPU进入IDLE状态后,时间信息不会被更新,只要在10分钟内退出IDLE,clocksource的cycle计数值就可以被正确地转换为相应的时间,然后系统的时间信息可以被正确地更新。当然最后的结果不一定是10分钟,它由clocksource_max_deferment进行计算,并保存max_idle_ns字段中,tickless的代码要考虑这个值,以防止在NO_HZ配置环境下,系统保持IDLE状态的时间过长。在这样,由10分钟这个假设的时间值,我们可以推算出合适的mult和shift值。
2.  clocksource的注册和初始化
通常,clocksource要在初始化阶段通过clocksource_register_hz函数通知内核它的工作时钟的频率,调用的过程如下:

FluxBB bbcode 测试

由上图可见,最终大部分工作会转由__clocksource_register_scale完成,该函数首先完成对mult和shift值的计算,然后根据mult和shift值,最终通过clocksource_max_deferment获得该clocksource可接受的最大IDLE时间,并记录在clocksource的max_idle_ns字段中。clocksource_enqueue函数负责按clocksource的rating的大小,把该clocksource按顺序挂在全局链表clocksource_list上,rating值越大,在链表上的位置越靠前。
每次新的clocksource注册进来,都会触发clocksource_select函数被调用,它按照rating值选择最好的clocksource,并记录在全局变量curr_clocksource中,然后通过timekeeping_notify函数通知timekeeping,当前clocksource已经变更,关于timekeeping,我将会在后续的博文中阐述。
3.  clocksource watchdog

系统中可能同时会注册对个clocksource,各个clocksource的精度和稳定性各不相同,为了筛选这些注册的clocksource,内核启用了一个定时器用于监控这些clocksource的性能,定时器的周期设为0.5秒:

#define WATCHDOG_INTERVAL (HZ >> 1)
#define WATCHDOG_THRESHOLD (NSEC_PER_SEC >> 4)

当有新的clocksource被注册时,除了会挂在全局链表clocksource_list外,还会同时挂在一个watchdog链表上:watchdog_list。定时器周期性地(0.5秒)检查watchdog_list上的clocksource,WATCHDOG_THRESHOLD的值定义为0.0625秒,如果在0.5秒内,clocksource的偏差大于这个值就表示这个clocksource是不稳定的,定时器的回调函数通过clocksource_watchdog_kthread线程标记该clocksource,并把它的rate修改为0,表示精度极差。
4.  建立clocksource的简要过程

在系统的启动阶段,内核注册了一个基于jiffies的clocksource,代码位于kernel/time/jiffies.c:

struct clocksource clocksource_jiffies = {
	.name		= "jiffies",
	.rating		= 1, /* lowest valid rating*/
	.read		= jiffies_read,
	.mask		= 0xffffffff, /*32bits*/
	.mult		= NSEC_PER_JIFFY << JIFFIES_SHIFT, /* details above */
	.shift		= JIFFIES_SHIFT,
};
......
 
static int __init init_jiffies_clocksource(void)
{
	return clocksource_register(&clocksource_jiffies);
}
 
core_initcall(init_jiffies_clocksource);

它的精度只有1/HZ秒,rating值为1,如果平台的代码没有提供定制的clocksource_default_clock函数,它将返回该clocksource:

struct clocksource * __init __weak clocksource_default_clock(void)
{
	return &clocksource_jiffies;
}

然后,在初始化的后段,clocksource的代码会把全局变量curr_clocksource设置为上述的clocksource:

static int __init clocksource_done_booting(void)
{
        ......
	curr_clocksource = clocksource_default_clock();
        ......
	finished_booting = 1;
        ......
	clocksource_select();
        ......
	return 0;
}
fs_initcall(clocksource_done_booting);

当然,如果平台级的代码在初始化时也会注册真正的硬件clocksource,所以经过clocksource_select()函数后,curr_clocksource将会被设为最合适的clocksource。如果clocksource_select函数认为需要切换更好的时钟源,它会通过timekeeping_notify通知timekeeping系统,使用新的clocksource进行时间计数和更新操作。

#22 进程模块 » Gentoo6.6.13 内核配置选项--General setup--Timers subsystem(1) » 2024-04-10 07:57:20

batsom
回复: 0

一、前言

时钟或者钟表(clock)是一种计时工具,每个人都至少有一块,可能在你的手机里,也可能佩戴在你的手腕上。如果Linux也是一个普通人的话,那么她的手腕上应该有十几块手表,包括:CLOCK_REALTIME、CLOCK_MONOTONIC、CLOCK_PROCESS_CPUTIME_ID、CLOCK_THREAD_CPUTIME_ID、CLOCK_MONOTONIC_RAW、CLOCK_REALTIME_COARSE、CLOCK_MONOTONIC_COARSE、CLOCK_BOOTTIME、CLOCK_REALTIME_ALARM、CLOCK_BOOTTIME_ALARM、CLOCK_TAI。本文主要就是介绍Linux内核中的形形色色的“钟表”。

二、理解Linux中各种clock分类的基础

既然本文讲Linux中的计时工具,那么我们首先面对的就是“什么是时间?”,这个问题实在是太难回答了,因此我们这里就不正面回答了,我们只是从几个侧面来窥探时间的特性,而时间的本质就留给物理学家和哲学家思考吧。

1、如何度量时间

时间往往是和变化相关,因此人们往往喜欢使用有固定周期变化规律的运动行为来定义时间,于是人们把地球围自转一周的时间分成24份,每一份定义为一个小时,而一个小时被平均分成3600份,每一份就是1秒。然而,地球的运动周期不是那么稳定,怎么办?多测量几个,平均一下嘛。

虽然通过天体的运动定义了秒这样的基本的时间度量单位,但是,要想精确的表示时间,我们依赖一种有稳定的周期变化的现象。上一节我们说过了:地球围绕太阳运转不是一个稳定的周期现象,因此每次观察到的周期不是固定的(当然都大约是24小时的样子),用它来定义秒多少显得不是那么精准。科学家们发现铯133原子在能量跃迁时候辐射的电磁波的振荡频率非常的稳定(不要问我这是什么原理,我也不知道),因此被用来定义时间的基本单位:秒(或者称之为原子秒)。

2、Epoch

定义了时间单位,等于时间轴上有了刻度,虽然这条代表时间的直线我们不知道从何开始,最终去向何方,我们终归是可以把一个时间点映射到这条直线上了。甚至如果定义了原点,那么我们可以用一个数字(到原点的距离)来表示时间。

如果说定义时间的度量单位是技术活,那么定义时间轴的原点则完全是一个习惯问题。拿出你的手表,上面可以读出2017年5月10,23时17分28秒07毫秒……作为一个地球人,你选择了耶稣诞辰日做原点,讲真,这弱爆了。作为linuxer,你应该拥有这样的一块手表,从这个手表上只能看到一个从当前时间点到linux epoch的秒数和毫秒数。Linux epoch定义为1970-01-01 00:00:00 +0000 (UTC),后面的这个UTC非常非常重要,我们后面会描述。

除了wall time,linux系统中也需要了解系统自启动以来过去了多少的时间,这时候,我们可以把钟表的epoch调整成系统的启动时间点,这时候获取系统启动时间就很容易了,直接看这块钟表的读数即可。

3、时间调整

记得小的时候,每隔一段时间,老爸的手表总会慢上一分钟左右的时间,也是他总是在7点钟,新闻联播之前等待那校时的最后一响。一听到“刚才最后一响是北京时间7点整”中那最后“滴”的一声,老爸也把自己的手表调整成为7点整。对于linux系统,这个操作类似clock_set接口函数。

类似老爸机械表的时间调整,linux的时间也需要调整,机械表的发条和齿轮结构没有那么精准,计算机的晶振亦然。前面讲了,UTC的计时是基于原子钟的,但是来到Linux内核这个场景,我们难道要为我们的计算机安装一个原子钟来计时吗?当然可以,如果你足够有钱的话。我们一般人的计算机还是基于系统中的本地振荡器来计时的,虽然精度不理想,但是短时间内你也不会有太多的感觉。当然,人们往往是向往更精确的计时(有些场合也需要),因此就有了时间同步的概念(例如NTP(Network Time Protocol))。

所谓时间同步其实就是用一个精准的时间来调整本地的时间,具体的调整方式有两种,一种就是直接设定当前时间值,另外一种是采用了润物细无声的形式,对本地振荡器的输出进行矫正。第一种方法会导致时间轴上的时间会向前或者向后的跳跃,无法保证时间的连续性和单调性。第二种方法是对时间轴缓慢的调整(而不是直接设定),从而保证了连续性和单调性。

4、闰秒(leap second)

通过原子秒延展出来的时间轴就是TAI(International Atomic Time)clock。这块“表”不管日出、日落,机械的按照ce原子定义的那个秒在推进时间。冷冰冰的TAI clock虽然精准,但是对人类而言是不友好的,毕竟人还是生活在这颗蓝色星球上。而那些基于地球自转,公转周期的时间(例如GMT)虽然符合人类习惯,但是又不够精确。在这样的背景下,UTC(Coordinated Universal Time)被提出来了,它是TAI clock的基因(使用原子秒),但是又会适当的调整(leap second),满足人类生产和生活的需要。

OK,至此,我们了解了TAI和UTC两块表的情况,这两块表的发条是一样的,按照同样的时间滴答(tick,精准的根据原子频率定义的那个秒)来推动钟表的秒针的转动,唯一不同的是,UTC clock有一个调节器,在适当的时间,可以把秒针向前或者向后调整一秒。

TAI clock和UTC clock在1972年进行了对准(相差10秒),此后就各自独立运行了。在大部分的时间里,UTC clock跟随TAI clock,除了在适当的时间点,realtime clock会进行leap second的补偿。从1972年到2017年,已经有了27次leap second,因此TAI clock的读数已经比realtime clock(UTC时间)快了37秒。换句话说,TAI和UTC两块表其实可以抽象成一个时间轴,只不过它们之间有一个固定的偏移。在1972年,它们之间的offset是10秒,经过多年的运转,到了2017年,offset累计到37秒,让我静静等待下一个leap second到了的时刻吧。

5、计时范围

有一类特殊的clock称作秒表,启动后开始计时,中间可以暂停,可以恢复。我们可以通过这样的秒表来记录一个人睡眠的时间,当进入睡眠状态的时候,按下start按键开始计时,一旦醒来则按下stop,暂停计时。linux中也有这样的计时工具,用来计算一个进程或者线程的执行时间。

6、时间精度

时间是连续的吗?你眼中的世界是连续的吗?看到窗外清风吹拂的树叶的时候,你感觉每一个树叶的形态都被你捕捉到了。然而,未必,你看急速前进的汽车的轮胎的时候,感觉车轮是倒转的。为什么?其实这仅仅是因为我们的眼睛大约是每秒15~20帧的速度在采样这个世界,你看到的世界是离散的。算了,扯远了,我们姑且认为时间的连续的,但是Linux中的时间记录却不是连续的,我们可以用下面的图片表示:

FluxBB bbcode 测试

系统在每个tick到来的时候都会更新系统时间(到linux epoch的秒以及纳秒值记录),当然,也有其他场景进行系统时间的更新,这里就不赘述了。因此,对于linux的时间而言,它是一些离散值,是一些时间采样点的值而已。当用户请求时间服务的时候,例如获取当前时间(上图中的红线),那么最近的那个Tick对应的时间采样点值再加上一个当前时间点到上一个tick的delta值就精准的定位了当前时间。不过,有些场合下,时间精度没有那么重要,直接获取上一个tick的时间值也基本是OK的,不需要校准那个delta也能满足需求。而且粗粒度的clock会带来performance的优势。

7、睡觉的时候时间会停止运作吗?

在现实世界提出这个问题会稍显可笑,鲁迅同学有一句名言:时间永是流逝,街市依旧太平。但是对于Linux系统中的clock,这个就有现实的意义了。比如说clock的一个重要的派生功能是创建timer(也就是说timer总是基于一个特定的clock运作)。在一个5秒的timer超期之前,系统先进入了suspend或者关机状态,这时候,5秒时间到达的时候,一般的timer都不会触发,因为底层的clock可能是基于一个free running counter的,在suspend或者关机状态的时候,这个HW counter都不再运作了,你如何期盼它能唤醒系统,来执行timer expired handler?但是用户还是有这方面的实际需求的,最简单的就是关机闹铃。怎么办?这就需要一个特别的clock,能够在suspend或者关机的时候,仍然可以运作,推动timer到期触发。

三、Linux下的各种clock总结

在linux系统中定义了如下的clock id:

>#define CLOCK_REALTIME            0
>#define CLOCK_MONOTONIC            1
>#define CLOCK_PROCESS_CPUTIME_ID    2
>#define CLOCK_THREAD_CPUTIME_ID        3
>#define CLOCK_MONOTONIC_RAW        4
>#define CLOCK_REALTIME_COARSE        5
>#define CLOCK_MONOTONIC_COARSE        6
>#define CLOCK_BOOTTIME            7
>#define CLOCK_REALTIME_ALARM        8
>#define CLOCK_BOOTTIME_ALARM        9
>#define CLOCK_SGI_CYCLE            10    /* Hardware specific */
>#define CLOCK_TAI            11

CLOCK_PROCESS_CPUTIME_ID和CLOCK_THREAD_CPUTIME_ID这两个clock是专门用来计算进程或者线程的执行时间的(用于性能剖析),一旦进程(线程)被切换出去,那么该进程(线程)的clock就会停下来。因此,这两种的clock都是per-process或者per-thread的,而其他的clock都是系统级别的。

根据上面一章的各种分类因素,我们可以将其他clock总结整理如下:

FluxBB bbcode 测试

#23 进程模块 » Gentoo 之 Core Scheduling for SMT » 2024-04-06 23:25:50

batsom
回复: 0

说超线程之前,首先要搞清楚什么是cpu,在之前的有一篇文档中对cpu做了简单介绍。

建立在cpu 础之上的内核-聊聊cpu


超线程是针对cpu提出的一种概念与实现,那么超线程的定义是什么?从某文档中摘抄的定义如下:

超线程(hyper-theading)其实就是同时多线程(simultaneous multi-theading),是一项允许一个CPU执行多个控制流的技术。它的原理很简单,就是把一颗CPU当成两颗来用,将一颗具有超线程功能的物理CPU变成两颗逻辑CPU,而逻辑CPU对操作系统来说,跟物理CPU并没有什么区别。因此,操作系统会把工作线程分派给这两颗(逻辑)CPU上去执行,让(多个或单个)应用程序的多个线程,能够同时在同一颗CPU上被执行。注意:两颗逻辑CPU共享单颗物理CPU的所有执行资源。因此,我们可以认为,超线程技术就是对CPU的虚拟化。

比如上述描述,说超线程是让多个线程能同时在同一颗cpu上被执行,其实我觉得这种描述都不够准确,精确的定义应该是:

超线程是同一个时钟周期内一个物理核心上可以执行两个线程或者进的技术。

超线程的定义主要在三个点上,第一个就是同一个时钟周期内,第二个是同一个物理核心,第三个就是两个线程同时执行。

正常情况下,没有超线程技术,以上三个条件是绝对无法满足的。

现在开始去分析超线程的实现过程。

首先,为了让单核cpu发挥更大的作,超线程只是其中一种技术,相关的技术还有很多,比如超标量技术等。

指令的基本执行过程包括:
>取指Fetch)::从存储器取指令,并更新PC
>译码(Decode):指令译码,从寄存器堆读出寄存器的值
>执行(Execute):运算指令:进行算术逻辑运算,访存指令:计算存储器的地址
>访存(Memory):Load指令:从存储器读指令,Store指令:将数据写入寄存器
>回写(Write Back):将数据写入寄存器堆

FluxBB bbcode 测试

更具体而言,在具体执行过程中,这几个步骤还会区分前端和后端,而且还会有一些相关的技术。
再具体而言,

前端

>前端按顺序取指令和译码,将X86指令翻译成uop。通过分支预测来提前执行最可能的程序路径。
>带有超标量功能的执行引擎每时钟周期最多执行6条uop。带有乱序功能的执行引擎能够重排列uop执行顺序,只要源数据准备好了,即可执行uop。
>顺序提交功能确保最后执行结果,包括碰到的异常,跟源程序顺序一致。

后端

The Out-of-Order Engine

当一个执行流程再等待资源时,比如l2 cache数据,乱序引擎可以把另一个执行流程的uop发射给执行核心。

> Renamer:每时钟周期最多发射4条uop(包括unfused, micro-fused, or macro-fused)。它的工作为:1 重命名uop里的寄存器,解决false dependencies问题。2 分配资源给给uop,例如load or store buffers。3 绑定uop到合适的dispatch port。
>某些uop可以在rename阶段完成,从而不占用之后的执行带宽。
>Micro-fused load 和store操作此时会分解为2条uop,这样就会占用2个发射槽(总共4个)。(没明白为啥之前2条uop融合为一条了现在又分解回2条)
>Scheduler:当uop需要的资源就绪时,即可调度给下一步执行。根据执行单元可用的ports,writeback buses,就绪uop的优先级, 调度器来选择被发射的uop。
>The Execution Core:具有6个ports,每时钟周期最多发射6条uop。指令发射给port执行完成后,需要把数据通过writeback bus写回。每个port有多个不同运算器,这意味着可以有多个不同uop在同一个port里执行,不同uop的写回延时并不相同,但是writeback bus只能独享,这就会造成uop的等待。Sandy Bridge架构尽可能消除改延时,通过把不同类型数据写回到不同的execution stack中来避免。

FluxBB bbcode 测试

而超线程的实现就是基于以上前端和后端过程的改造与实现。

首先从物理cpu层面上:

从因特尔的cpu开发手册上,我们可以找到超线程的相关实现部分,架构图如下:

FluxBB bbcode 测试

从该架构图上,我们可以看到一个物理核心上有两个逻辑核心,他们有共享的部分也有独立的部分,比如APIC,这个叫做可编程中断控制器,也就是说逻辑核心也是可以自己独立接收中断信号的。

通过该手册,我们可以清楚的了解到超线程中的逻辑核与物理核之间的区别。

The following features are part of he architectural state of logical processors within Intel 64 or IA-32 processors supporting Intel Hyper-Threading Technology. The features can be subdivided into three groups:【以下相关寄存器的作用在文章建立在cpu 基础之上的内核-聊聊cpu中有介绍,但是通过该手册可以了解到,逻辑核心中的大部分寄存器都是独立的,换句话说,在cpu核心中存在双份】

>Duplicated for each logical processor
>Shared by logical processors in a physical processor
>Shared or duplicated, depending on the implementation
>The following features are duplicated for each logical processor:
>General purpose registers (EAX, EBX, ECX, EDX, ESI, EDI, ESP, and EBP)
>Segment registers (CS, DS, SS, ES, FS, and GS)
>EFLAGS and EIP registers. Note that the CS and EIP/RIP registers for each logical processor point to the instruction stream for the thread being executed by the logical processor.
>x87 FPU registers (ST0 through ST7, status word, control word, tag word, data operand pointer, and instruction pointer)
>MMX registers (MM0 through MM7)
>XMM registers (XMM0 through XMM7) and the MXCSR register
>Control registers and system table pointer registers (GDTR, LDTR, IDTR, task register)
>Debug registers (DR0, DR1, DR2, DR3, DR6, DR7) and the debug control MSRs
>Machine check global status (IA32_MCG_STATUS) and machine check capability (IA32_MCG_CAP) MSRs
>Thermal clock modulation and ACPI Power management control MSRs
>Time stamp counter MSRs
>Most of the other MSR registers, including the page attribute table (PAT). See the exceptions below.
>Local APIC registers.
>Additional general purpose registers (R8-R15), XMM registers (XMM8-XMM15), control register,IA32_EFER on Intel 64 processors.
The following features are shared by logical processors:
>Memory type range registers (MTRRs)
Whether the following features are shared or duplicated is implementation-specific:
>IA32_MISC_ENABLE MSR (MSR address 1A0H)
>Machine check architecture (MCA) MSRs (except for the IA32_MCG_STATUS and IA32_MCG_CAP MSRs)
>Performance monitoring control and counter MSRs


其次从指令处理流程上:

整体流程如下

从指令处理过程中,两个逻辑核心都是单独的处理流

前端处理部分

FluxBB bbcode 测试

红和黄分属不同的逻辑核心,在有些步骤不作区分,比如解码

FluxBB bbcode 测试

后端部分,在某些流程共享,某些流程独立。

更加具体的可以阅读相关论文

https://www.moreno.marzolla.name/teachi … _art01.pdf

简而言之,超线程的实现是基于物理层面cpu的支持,在一个物理核心中通过改造寄存器的数量以及共享其他资源,从而实现近似于两个物理核心的能力,在操作系统层面可以把线程和进程向上调度,从而更充分的利用资源,提升cpu性能。

#24 进程模块 » Getnoo 之 process_vm_readv/writev syscalls » 2024-04-06 22:32:12

batsom
回复: 0

多进程之间需要传输大量数据的时候,比如多进程 RPC 框架的进程之间通信,常用共享内存队列。

但是共享内存队列难免会有 入队+出队 2次 memcpy 。

而且要变长共享内存队列,如果支持多生产者进程+多消费者进程 ,就要处理线程安全方面的问题, 比较麻烦。

process_vm_readv() ,  process_vm_writev() 是 Linux 3.2 新增的 syscall,用于在多个进程的地址空间之间,高效传输大块数据。

https://www.man7.org/linux/man-pages/ma … adv.2.html

https://github.com/open-mpi/ompi/blob/m … _get.c#L96

在此, 我提个设想,可以用  process_vm_readv 实现一个多进程内存队列,相比之下,优势是:
>在处理 多线程/多进程 并发时,更简单
>省掉一次 memcpy。

函数声明

#include <sys/uio.h>
ssize_t process_vm_readv(pid_t pid,
                         const struct iovec *local_iov,
                         unsigned long liovcnt,
                         const struct iovec *remote_iov,
                         unsigned long riovcnt,
                         unsigned long flags);
ssize_t process_vm_writev(pid_t pid,
                          const struct iovec *local_iov,
                          unsigned long liovcnt,
                          const struct iovec *remote_iov,
                          unsigned long riovcnt,
                          unsigned long flags);

参数说明
>pid                    进程pid号
>struct iovec *local_iov        结构体local进程指向一个数组基地址
>liovcnt                    local进程数组大小
>struct iovec *remote_iov    结构体remote进程指向一个数组基地址
>riovcnt                remote进程数组大小
>flags                    默认0

介绍

这些系统调用在不同进程地址空间之间传输数据。调用进程:“local进程”以及“remote进程”。数据直接在两个进程的地址空间传输,无需通过内核空间。前提是必须知道传输数据的大小。

process_vm_readv()从remote进程传送数据到local进程。要传输的数据由remote_iov和riovcnt标识:remote_iov指向一个数组,用于描述remote进程的地址范围,而riovcnt指定remote_iov中的元素数。数据传输到由local_iov和liovcnt指定的位置:local_iov是指向描述地址范围的数组的指针。并且liovcnt指定local_iov中的元素数。

process_vm_writev()系统调用是process_vm_readv()的逆过程。它从local进程传送数据到remote进程。除了转移的方向,参数liovcnt,local_iov,riovcnt和remote_iov具有相同的参数含义,与process_vm_readv()相同。

local_iov和remote_iov参数指向iovec结构的数组,在<sys / uio.h>中定义为:

<sys/uio.h>
   struct iovec {
               void  *iov_base;    /* 地址基址 */
               size_t iov_len;     /* 数据传输字节数 */
           };

缓冲区以数组顺序处理。 这意味着process_vm_readv()在进行到local_iov [1]之前会完全填充local_iov [0],依此类推。 同样,在进行remote_iov [1]之前,将完全读取remote_iov[0],依此类推。

同样,process_vm_writev()在local_iov [1]之前写出local_iov [0]的全部内容,并在remote_iov [1]之前完全填充remote_iov [0]。

remote_iov[i].iov_len

local_iov[i].iov_len

的长度不必相同。 因此,可以将单个本地缓冲区拆分为多个远程缓冲区,反之亦然。

flags参数当前未使用,必须设置为0。
返回值

成功后,process_vm_readv()返回读取的字节数,process_vm_writev()返回写入的字节数。 如果发生部分读/写,则此返回值可能小于请求的字节总数。 调用方应检查返回值以确定是否发生了部分读/写。

错误时,返回-1并正确设置errno。

示例

以下代码示例演示了process_vm_readv()的用法,它从具有PID的进程中读取地址上的19个字节,并将前10个字节写入buf1,并将后10个字节写入buf2。

#include <sys/uio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <errno.h>
#include <iostream>

using namespace std;

int main(void) {
    struct iovec local[2];
    struct iovec remote[1];
    char buf1[10];
    char buf2[10];
    char remote_addr[]={"abc1234567890defABC"};
    long data_len = strlen(remote_addr);

    ssize_t nread;
    pid_t pid = getpid();             //PID of remote process

//读remotedata_len个字节,buf1 :10 ; buf2 :10
    local[0].iov_base = buf1;
    local[0].iov_len = 10;
    local[1].iov_base = buf2;
    local[1].iov_len = 10;
    remote[0].iov_base = remote_addr;
    remote[0].iov_len = data_len;


    nread = process_vm_readv(pid, local, 2, remote, 1, 0);
    cout<<"cout nread:"<<nread<<endl;
    fprintf(stderr,"read in CreateProcess %s, Process ID %d \n",strerror(errno),pid);

    printf("buf1: %s\n",buf1);
    printf("buf2: %s\n",buf2);

}

相关的系统调用还有readv,writev,preadv,pwritev,preadv2,pwrite2

#include <sys/uio.h>

       ssize_t readv(int fd, const struct iovec *iov, int iovcnt);

       ssize_t writev(int fd, const struct iovec *iov, int iovcnt);

       ssize_t preadv(int fd, const struct iovec *iov, int iovcnt,
                      off_t offset);

       ssize_t pwritev(int fd, const struct iovec *iov, int iovcnt,
                       off_t offset);

       ssize_t preadv2(int fd, const struct iovec *iov, int iovcnt,
                       off_t offset, int flags);

       ssize_t pwritev2(int fd, const struct iovec *iov, int iovcnt,
                        off_t offset, int flags);

示例如下:

int main(){
    char *str0 = "hello ";
    char *str1 = "world\n";
    struct iovec iov[2];
    ssize_t nwritten;

    iov[0].iov_base = str0;
    iov[0].iov_len = strlen(str0);
    iov[1].iov_base = str1;
    iov[1].iov_len = strlen(str1);

    nwritten = writev(STDOUT_FILENO, iov, 2);

    printf("nwritten: %d\n",nwritten);
}

#25 引导模块和保护模式 » U-Boot启动过程--详细版的完全分析 » 2024-04-03 23:04:17

batsom
回复: 0

在PC机上引导程序一般由BIOS开始执行,然后读取硬盘中位于MBR(Main Boot Record,主引导记录)中的Bootloader(例如LILO或GRUB),并进一步引导操作系统的启动。

然而在嵌入式系统中通常没有像BIOS那样的固件程序,因此整个系统的加载启动就完全由bootloader来完成。它主要的功能是加载与引导内核映像

一个嵌入式的存储设备通过通常包括四个分区:

>第一分区:存放的当然是u-boot
>第二个分区:存放着u-boot要传给系统内核的参数
>第三个分区:是系统内核(kernel)
>第四个分区:则是根文件系统

如下图所示:
FluxBB bbcode 测试

Bootloader介绍

u-boot是一种普遍用于嵌入式系统中的Bootloader。

Bootloader是进行嵌入式开发必然会接触的一个概念

Bootloader的定义:Bootloader是在操作系统运行之前执行的一小段程序,通过这一小段程序,我们可以初始化硬件设备、建立内存空间的映射表,从而建立适当的系统软硬件环境,为最终调用操作系统内核做好准备。意思就是说如果我们要想让一个操作系统在我们的板子上运转起来,我们就必须首先对我们的板子进行一些基本配置和初始化,然后才可以将操作系统引导进来运行。具体在Bootloader中完成了哪些操作我们会在后面分析到,这里我们先来回忆一下PC的体系结构:PC机中的引导加载程序是由BIOS和位于硬盘MBR中的OS Boot Loader(比如LILO和GRUB等)一起组成的,BIOS在完成硬件检测和资源分配后,将硬盘MBR中的Boot Loader读到系统的RAM中,然后将控制权交给OS Boot Loader。Boot Loader的主要运行任务就是将内核映象从硬盘上读到RAM中,然后跳转到内核的入口点去运行,即开始启动操作系统。在嵌入式系统中,通常并没有像BIOS那样的固件程序(注:有的嵌入式cpu也会内嵌一段短小的启动程序),因此整个系统的加载启动任务就完全由Boot Loader来完成。比如在一个基于ARM7TDMI core的嵌入式系统中,系统在上电或复位时通常都从地址0x00000000处开始执行,而在这个地址处安排的通常就是系统的Boot Loader程序。(先想一下,通用PC和嵌入式系统为何会在此处存在如此的差异呢?)

Bootloader是基于特定硬件平台来实现的,因此几乎不可能为所有的嵌入式系统建立一个通用的Bootloader,不同的处理器架构都有不同的Bootloader,Bootloader不但依赖于cpu的体系结构,还依赖于嵌入式系统板级设备的配置。对于2块不同的板子而言,即使他们使用的是相同的处理器,要想让运行在一块板子上的Bootloader程序也能运行在另一块板子上,一般也需要修改Bootloader的源程序。

Bootloader的启动方式

Bootloader的启动方式主要有网络启动方式、磁盘启动方式和Flash启动方式。

1、网络启动方式

FluxBB bbcode 测试

Bootloader网络启动方式示意图

如图1所示,里面主机和目标板,他们中间通过网络来连接,首先目标板的DHCP/BIOS通过BOOTP服务来为Bootloader分配IP地址,配置网络参数,这样才能支持网络传输功能。我们使用的u-boot可以直接设置网络参数,因此这里就不用使用DHCP的方式动态分配IP了。接下来目标板的Bootloader通过TFTP服务将内核映像下载到目标板上,然后通过网络文件系统来建立主机与目标板之间的文件通信过程,之后的系统更新通常也是使用Boot Loader的这种工作模式。工作于这种模式下的Boot Loader通常都会向它的终端用户提供一个简单的命令行接口。

2、磁盘启动方式

这种方式主要是用在台式机和服务器上的,这些计算机都使用BIOS引导,并且使用磁盘作为存储介质,这里面两个重要的用来启动linux的有LILO和GRUB,这里就不再具体说明了。

3、Flash启动方式

这是我们最常用的方式。Flash有NOR Flash和NAND Flash两种。NOR Flash可以支持随机访问,所以代码可以直接在Flash上执行,Bootloader一般是存储在Flash芯片上的。另外Flash上还存储着参数、内核映像和文件系统。这种启动方式与网络启动方式之间的不同之处就在于,在网络启动方式中,内核映像和文件系统首先是放在主机上的,然后经过网络传输下载进目标板的,而这种启动方式中内核映像和文件系统则直接是放在Flash中的,这两点在我们u-boot的使用过程中都用到了。

U-boot的定义

U-boot,全称Universal Boot Loader,是由DENX小组的开发的遵循GPL条款的开放源码项目,它的主要功能是完成硬件设备初始化、操作系统代码搬运,并提供一个控制台及一个指令集在操作系统运行前操控硬件设备。U-boot之所以这么通用,原因是他具有很多特点:开放源代码、支持多种嵌入式操作系统内核、支持多种处理器系列、较高的稳定性、高度灵活的功能设置、丰富的设备驱动源码以及较为丰富的开发调试文档与强大的网络技术支持。另外u-boot对操作系统和产品研发提供了灵活丰富的支持,主要表现在:可以引导压缩或非压缩系统内核,可以灵活设置/传递多个关键参数给操作系统,适合系统在不同开发阶段的调试要求与产品发布,支持多种文件系统,支持多种目标板环境参数存储介质,采用CRC32校验,可校验内核及镜像文件是否完好,提供多种控制台接口,使用户可以在不需要ICE的情况下通过串口/以太网/USB等接口下载数据并烧录到存储设备中去(这个功能在实际的产品中是很实用的,尤其是在软件现场升级的时候),以及提供丰富的设备驱动等。

u-boot源代码的目录结构

>1、board中存放于开发板相关的配置文件,每一个开发板都以子文件夹的形式出现。
>2、Commom文件夹实现u-boot行下支持的命令,每一个命令对应一个文件。
>3、cpu中存放特定cpu架构相关的目录,每一款cpu架构都对应了一个子目录。
>4、Doc是文档目录,有u-boot非常完善的文档。
>5、Drivers中是u-boot支持的各种设备的驱动程序。
>6、Fs是支持的文件系统,其中最常用的是JFFS2文件系统。
>7、Include文件夹是u-boot使用的头文件,还有各种硬件平台支持的汇编文件,系统配置文件和文件系统支持的文件。
>8、Net是与网络协议相关的代码,bootp协议、TFTP协议、NFS文件系统得实现。
>9、Tooles是生成U-boot的工具。

对u-boot的目录有了一些了解后,分析启动代码的过程就方便多了,其中比较重要的目录就是/board、/cpu、/drivers和/include目录,如果想实现u-boot在一个平台上的移植,就要对这些目录进行深入的分析。

什么是《编译地址》?什么是《运行地址》?

(一)编译地址: 32位的处理器,它的每一条指令是4个字节,以4个字节存储顺序,进行顺序执行,CPU是顺序执行的,只要没发生什么跳转,它会顺序进行执行行, 编译器会对每一条指令分配一个编译地址,这是编译器分配的,在编译过程中分配的地址,我们称之为编译地址。
(二)运行地址:是指程序指令真正运行的地址,是由用户指定,用户将运行地址烧录到哪里,哪里就是运行的地址。

比如有一个指令的编译地址是0x5,实际运行的地址是0x200,如果用户将指令烧到0x200上,那么这条指令的运行地址就是0x200,当编译地址和运行地址不同的时候会出现什么结果?结果是不能跳转,编译后会产生跳转地址,如果实际地址和编译后产生的地址不相等,那么就不能跳转。

C语言编译地址:都希望把编译地址和实际运行地址放在一起的,但是汇编代码因为不需要做C语言到汇编的转换,可以认为的去写地址,所以直接写的就是他的运行地址,这就是为什么任何bootloader刚开始会有一段汇编代码,因为起始代码编译地址和实际地址不相等,这段代码和汇编无关,跳转用的运行地址。                                                   

编译地址和运行地址如何来算呢?

1.假如有两个编译地址a=0x10,b=0x7,b的运行地址是0x300,那么a的运行地址就是b的运行地址加上两者编译地址的差值,a-b=0x10-0x7=0x9, a的运行地址就是0x300+0x9=0x309。

2.假设uboot上两条指令的编译地址为a=0x33000007和b=0x33000001,这两条指令都落在bank6上,现在要计算出他们对应的运行地址,要找出运行地址的始地址,这个是由用户烧录进去的,假设运行地址的首地址是0x0,则a的运行地址为0x7,b为0x1,就是这样算出来的。

为什么要分配编译地址?这样做有什么好处,有什么作用?

比如在函数a中定义了函数b,当执行到函数b时要进行指令跳转,要跳转到b函数所对应的起始地址上去,编译时,编译器给每条指令都分配了编译地址,如果编译器已经给分配了地址就可以直接进行跳转,查找b函数跳转指令所对应的表,进行直接跳转,因为有个编译地址和指令对应的一个表,如果没有分配,编译器就查找不到这个跳转地址,要进行计算,非常麻烦。

什么是《相对地址》?

以NOR Flash为例,NOR Falsh是映射到bank0上面,SDRAM是映射到bank6上面,uboot和内核最终是在SDRAM上面运行,最开始我们是从Nor Flash的零地址开始往后烧录,uboot中至少有一段代码编译地址和运行地址是不一样的,编译uboot或内核时,都会将编译地址放入到SDRAM中,他们最终都会在SDRAM中执行,刚开始uboot在Nor Flash中运行,运行地址是一个低端地址,是bank0中的一个地址,但编译地址是bank6中的地址,这样就会导致绝对跳转指令执行的失败,所以就引出了相对地址的概念。

那么什么是相对地址呢?

至少在bank0中uboot这段代码要知道不能用b+编译地址这样的方法去跳转指令,因为这段代码的编译地址和运行地址不一样,那如何去做呢?要去计算这个指令运行的真实地址,计算出来后再做跳转,应该是b+运行地址,不能出现b+编译地址,而是b+运行地址,而运行地址是算出来的。

   _TEXT_BASE:
  .word TEXT_BASE //0x33F80000,  // 在board/config.mk中

这段话表示,用户告诉编译器编译地址的起始地址

uboot 工作过程

大多数 Boot Loader 都包含两种不同的操作模式:"启动加载"模式和"下载"模式,这种区别仅对于开发人员才有意义。

但从最终用户的角度看,Boot Loader 的作用就是:用来加载操作系统,而并不存在所谓的启动加载模式与下载工作模式的区别。

(一)启动加载(Boot loading)模式:这种模式也称为"自主"(Autonomous)模式。
也即 Boot Loader 从目标机上的某个固态存储设备上将操作系统加载到 RAM 中运行,整个过程并没有用户的介入。这种模式是 Boot Loader 的正常工作模式,因此在嵌入式产品发布的时侯,Boot Loader 显然必须工作在这种模式下。


(二)下载(Downloading)模式:
在这种模式下,目标机上的 Boot Loader 将通过串口连接或网络连接等通信手段从主机(Host)下载文件,比如:下载内核映像和根文件系统映像等。从主机下载的文件通常首先被 Boot Loader保存到目标机的RAM 中,然后再被 BootLoader写到目标机上的FLASH类固态存储设备中。Boot Loader 的这种模式通常在第一次安装内核与根文件系统时被使用;此外,以后的系统更新也会使用 Boot Loader 的这种工作模式。工作于这种模式下的 Boot Loader 通常都会向它的终端用户提供一个简单的命令行接口。这种工作模式通常在第一次安装内核与跟文件系统时使用。或者在系统更新时使用。进行嵌入式系统调试时一般也让bootloader工作在这一模式下。

U­Boot 这样功能强大的 Boot Loader 同时支持这两种工作模式,而且允许用户在这两种工作模式之间进行切换。

大多数 bootloader 都分为阶段 1(stage1)和阶段 2(stage2)两大部分,u­boot 也不例外。依赖于 CPU 体系结构的代码(如 CPU 初始化代码等)通常都放在阶段 1 中且通常用汇编语言实现,而阶段 2 则通常用 C 语言来实现,这样可以实现复杂的功能,而且有更好的可读性和移植性。

第一、大概总结性得的分析

系统启动的入口点。既然我们现在要分析u-boot的启动过程,就必须先找到u-boot最先实现的是哪些代码,最先完成的是哪些任务。

另一方面一个可执行的image必须有一个入口点,并且只能有一个全局入口点,所以要通知编译器这个入口在哪里。由此我们可以找到程序的入口点是在/board/lpc2210/u-boot.lds中指定的,其中ENTRY(_start)说明程序从_start开始运行,而他指向的是cpu/arm7tdmi/start.o文件。

因为我们用的是ARM7TDMI的cpu架构,在复位后从地址0x00000000取它的第一条指令,所以我们将Flash映射到这个地址上,

这样在系统加电后,cpu将首先执行u-boot程序。u-boot的启动过程是多阶段实现的,分了两个阶段。

依赖于cpu体系结构的代码(如设备初始化代码等)通常都放在stage1中,而且通常都是用汇编语言来实现,以达到短小精悍的目的。

而stage2则通常是用C语言来实现的,这样可以实现复杂的功能,而且代码具有更好的可读性和可移植性。

下面我们先详细分析下stage1中的代码,如图2所示:

FluxBB bbcode 测试

代码真正开始是在_start,设置异常向量表,这样在cpu发生异常时就跳转到/cpu/arm7tdmi/interrupts中去执行相应得中断代码。

在interrupts文件中大部分的异常代码都没有实现具体的功能,只是打印一些异常消息,其中关键的是reset中断代码,跳到reset入口地址。

reset复位入口之前有一些段的声明。

>1.在reset中,首先是将cpu设置为svc32模式下,并屏蔽所有irq和fiq。
>2.在u-boot中除了定时器使用了中断外,其他的基本上都不需要使用中断,比如串口通信和网络等通信等,在u-boot中只要完成一些简单的通信就可以了,所以在这里屏蔽掉了所有的中断响应。
>3.初始化外部总线。这部分首先设置了I/O口功能,包括串口、网络接口等的设置,其他I/O口都设置为GPIO。然后设置BCFG0~BCFG3,即外部总线控制器。这里bank0对应Flash,设置为16位宽度,总线速度设为最慢,以实现稳定的操作;Bank1对应DRAM,设置和Flash相同;Bank2对应RTL8019。
>4.接下来是cpu关键设置,包括系统重映射(告诉处理器在系统发生中断的时候到外部存储器中去读取中断向量表)和系统频率。
>5.lowlevel_init,设定RAM的时序,并将中断控制器清零。这些部分和特定的平台有关,但大致的流程都是一样的。

下面就是代码的搬移阶段了。为了获得更快的执行速度,通常把stage2加载到RAM空间中来执行,因此必须为加载Boot Loader的stage2准备好一段可用的RAM空间范围。空间大小最好是memory page大小(通常是4KB)的倍数一般而言,1M的RAM空间已经足够了。

flash中存储的u-boot可执行文件中,代码段、数据段以及BSS段都是首尾相连存储的,所以在计算搬移大小的时候就是利用了用BSS段的首地址减去代码的首地址,这样算出来的就是实际使用的空间。

程序用一个循环将代码搬移到0x81180000,即RAM底端1M空间用来存储代码。

然后程序继续将中断向量表搬到RAM的顶端。由于stage2通常是C语言执行代码,所以还要建立堆栈去。

在堆栈区之前还要将malloc分配的空间以及全局数据所需的空间空下来,他们的大小是由宏定义给出的,可以在相应位置修改。

基本内存分布图:

FluxBB bbcode 测试

下来是u-boot启动的第二个阶段,是用c代码写的,这部分是一些相对变化不大的部分,我们针对不同的板子改变它调用的一些初始化函数,并且通过设置一些宏定义来改变初始化的流程,所以这些代码在移植的过程中并不需要修改,也是错误相对较少出现的文件。在文件的开始先是定义了一个函数指针数组,通过这个数组,程序通过一个循环来按顺序进行常规的初始化,并在其后通过一些宏定义来初始化一些特定的设备。在最后程序进入一个循环,main_loop。这个循环接收用户输入的命令,以设置参数或者进行启动引导。

本篇文章将分析重点放在了前面的start.s上,是因为这部分无论在移植还是在调试过程中都是最容易出问题的地方,要解决问题就需要程序员对代码进行修改,所以在这里简单介绍了一下start.s的基本流程,希望能对大家有所帮助

第二、代码分析

u­boot 的 stage1 代码通常放在 start.s 文件中,它用汇编语言写成

由于一个可执行的 Image 必须有一个入口点,并且只能有一个全局入口,通常这个入口放在 ROM(Flash)的 0x0地址,因此,必须通知编译器以使其知道这个入口,该工作可通过修改连接器脚本来完成。

1. board/crane2410/u­boot.lds:  ENTRY(_start)   ==> cpu/arm920t/start.S: .globl _start
2. uboot 代码区(TEXT_BASE = 0x33F80000)定义在 board/crane2410/config.mk

U-Boot启动内核的过程可以分为两个阶段,两个阶段的功能如下:

(1)第一阶段的功能
>Ø  硬件设备初始化
>Ø  加载U-Boot第二阶段代码到RAM空间
>Ø  设置好栈
>Ø  跳转到第二阶段代码入口

(2)第二阶段的功能
>Ø  初始化本阶段使用的硬件设备
>Ø  检测系统内存映射
>Ø  将内核从Flash读取到RAM中
>Ø  为内核设置启动参数
>Ø  调用内核

Uboot启动第一阶段代码分析

第一阶段对应的文件是cpu/arm920t/start.S和board/samsung/mini2440/lowlevel_init.S。

U-Boot启动第一阶段流程如下:

FluxBB bbcode 测试

详细分析

FluxBB bbcode 测试

根据cpu/arm920t/u-boot.lds中指定的连接方式:

看一下uboot.lds文件,在board/smdk2410目录下面,uboot.lds是告诉编译器这些段改怎么划分,GUN编译过的段,最基本的三个段是RO,RW,ZI,RO表示只读,对应于具体的指代码段,RW是数据段,ZI是归零段,就是全局变量的那段,Uboot代码这么多,如何保证start.s会第一个执行,编译在最开始呢?就是通过uboot.lds链接文件进行


OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
/*OUTPUT_FORMAT("elf32-arm", "elf32-arm", "elf32-arm")*/
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
. = 0x00000000; //起始地址
 
. = ALIGN(4); //4字节对齐
.text : //test指代码段,上面3行标识是不占用任何空间的
{
cpu/arm920t/start.o (.text) //这里把start.o放在第一位就表示把start.s编
译时放到最开始,这就是为什么把uboot烧到起始地址上它肯定运行的是start.s
*(.text)
}
 
. = ALIGN(4); //前面的 “.” 代表当前值,是计算一个当前的值,是计算上
面占用的整个空间,再加一个单元就表示它现在的位置
.rodata : { *(.rodata) }
 
. = ALIGN(4);
.data : { *(.data) }
 
. = ALIGN(4);
.got : { *(.got) }
 
. = .;
__u_boot_cmd_start = .;
.u_boot_cmd : { *(.u_boot_cmd) }
__u_boot_cmd_end = .;
 
. = ALIGN(4);
__bss_start = .; //bss表示归零段
.bss : { *(.bss) }
_end = .;
}

第一个链接的是cpu/arm920t/start.o,因此u-boot.bin的入口代码在cpu/arm920t/start.o中,其源代码在cpu/arm920t/start.S中。下面我们来分析cpu/arm920t/start.S的执行。

1.硬件设备初始化

(1)设置异常向量

下面代码是系统启动后U-boot上电后运行的第一段代码,它是什么意思?

u-boot对应的第一阶段代码放在cpu/arm920t/start.S文件中,入口代码如下:


globl _startglobal   /*声明一个符号可被其它文件引用,相当于声明了一个全局变量,.globl与.global相同*/
_start: b start_code /* 复位 */ //b是不带返回的跳转(bl是带返回的跳转),意思是无条件直接跳转到start_code标号出执行程序
 
ldr pc, _undefined_instruction /*未定义指令向量 l---dr相当于mov操作*/
ldr pc, _software_interrupt /* 软件中断向量 */
ldr pc, _prefetch_abort /* 预取指令异常向量 */
ldr pc, _data_abort /* 数据操作异常向量 */
ldr pc, _not_used /* 未使用 */
ldr pc, _irq /* irq中断向量 */
ldr pc, _fiq /* fiq中断向量 */
 
/* 中断向量表入口地址 */
 
_undefined_instruction: .word undefined_instruction /*就是在当前地址,_undefined_instruction 处存放 undefined_instruction*/
_software_interrupt: .word software_interrupt
_prefetch_abort: .word prefetch_abort
_data_abort: .word data_abort
_not_used: .word not_used
_irq: .word irq
_fiq: .word fiq
 
 
// word伪操作用于分配一段字内存单元(分配的单元都是字对齐的),并用伪操作中的expr初始化
.balignl 16,0xdeadbeef

它们是系统定义的异常,一上电程序跳转到start_code异常处执行相应的汇编指令,下面定义出的都是不同的异常,比如软件发生软中断时,CPU就会去执行软中断的指令,这些异常中断在CUP中地址是从0开始,每个异常占4个字节

ldr pc, _undefined_instruction表示把_undefined_instruction存放的数值存放到pc指针上

_undefined_instruction: .word undefined_instruction表示未定义的这个异常是由.word来定义的,它表示定义一个字,一个32位的数

. word后面的数:表示把该标识的编译地址写入当前地址,标识是不占用任何指令的。把标识存放的数值copy到指针pc上面,那么标识上存放的值是什么?

是由.word undefined_instruction来指定的,pc就代表你运行代码的地址,实现了CPU要做一次跳转时的工作。

以上代码设置了ARM异常向量表,各个异常向量介绍如下:

表 2.1 ARM异常向量表

FluxBB bbcode 测试

在cpu/arm920t/start.S中还有这些异常对应的异常处理程序。当一个异常产生时,CPU根据异常号在异常向量表中找到对应的异常向量,然后执行异常向量处的跳转指令,CPU就跳转到对应的异常处理程序执行。

其中复位异常向量的指令“b start_code”决定了U-Boot启动后将自动跳转到标号“start_code”处执行。

(2)CPU进入SVC模式


start_code:
 
/*
* set the cpu to SVC32 mode
*/
 
 mrs r0, cpsr
 
 bic  r0, r0, #0x1f   /*工作模式位清零 */
 
 orr   r0, r0, #0xd3  /*工作模式位设置为“10011”(管理模式),并将中断禁止位和快中断禁止位置1 */
 
 msr cpsr, r0

以上代码将CPU的工作模式位设置为管理模式,即设置相应的CPSR程序状态字,并将中断禁止位和快中断禁止位置一,从而屏蔽了IRQ和FIQ中断。

操作系统先注册一个总的中断,然后去查是由哪个中断源产生的中断,再去查用户注册的中断表,查出来后就去执行用户定义的用户中断处理函数。

(3)设置控制寄存器地址


#if defined(CONFIG_S3C2400)       /* 关闭看门狗 */
 
#define pWTCON 0x15300000         /* 看门狗寄存器 */
 
#define INTMSK  0x14400008        /* 中断屏蔽寄存器 */
 
#define CLKDIVN      0x14800014   /* 时钟分频寄存器 */
 
#else      /* s3c2410与s3c2440下面4个寄存器地址相同 */
 
#define pWTCON 0x53000000         /* WATCHDOG控制寄存器地址 */
 
#define INTMSK  0x4A000008        /* INTMSK寄存器地址  */
 
#define INTSUBMSK 0x4A00001C      /* INTSUBMSK寄存器地址 次级中断屏蔽寄存器*/
 
#define CLKDIVN  0x4C000014       /* CLKDIVN寄存器地址 ;时钟分频寄存器*/
 
#endif

对与s3c2440开发板,以上代码完成了WATCHDOG,INTMSK,INTSUBMSK,CLKDIVN四个寄存器的地址的设置。各个寄存器地址参见参考文献

(4)关闭看门狗


ldr   r0, =pWTCON   /* 将pwtcon寄存器地址赋给R0 */
 
mov   r1, #0x0      /* r1的内容为0 */
 
str   r1, [r0]      /* 看门狗控制器的最低位为0时,看门狗不输出复位信号 */

以上代码向看门狗控制寄存器写入0,关闭看门狗。否则在U-Boot启动过程中,CPU将不断重启。

为什么要关看门狗?

就是防止,不同得两个以上得CPU,进行喂狗的时间间隔问题:说白了,就是你运行的代码如果超出喂狗时间,而你不关狗,就会导致,你代码还没运行完又得去喂狗,就这样反复得重启CPU,那你代码永远也运行不完,所以,得先关看门狗得原因,就是这样。

关狗---详细的原因:

关闭看门狗,关闭中断,所谓的喂狗是每隔一段时间给某个寄存器置位而已,在实际中会专门启动一个线程或进程会专门喂狗,当上层软件出现故障时就会停止喂狗,停止喂狗之后,cpu会自动复位,一般都在外部专门有一个看门狗,做一个外部的电路,不在cpu内部使用看门狗,cpu内部的看门狗是复位的cpu,当开发板很复杂时,有好几个cpu时,就不能完全让板子复位,但我们通常都让整个板子复位。看门狗每隔短时间就会喂狗,问题是在两次喂狗之间的时间间隔内,运行的代码的时间是否够用,两次喂狗之间的代码是否在两次喂狗的时间延迟之内,如果在延迟之外的话,代码还没运行完就又进行喂狗,代码永远也运行不完

(5)屏蔽中断


/*
 * mask all IRQs by setting all bits in the INTMR - default
 */
 
 mov       r1, #0xffffffff    /*屏蔽所有中断, 某位被置1则对应的中断被屏蔽 */ /*寄存器中的值*/
 
 ldr   r0, =INTMSK            /*将管理中断的寄存器地址赋给ro*/
 
 str   r1, [r0]               /*将全r1的值赋给ro地址中的内容*/

INTMSK是主中断屏蔽寄存器,每一位对应SRCPND(中断源引脚寄存器)中的一位,表明SRCPND相应位代表的中断请求是否被CPU所处理。

INTMSK寄存器是一个32位的寄存器,每位对应一个中断,向其中写入0xffffffff就将INTMSK寄存器全部位置一,从而屏蔽对应的中断。


# if defined(CONFIG_S3C2440)
 
  ldr  r1, =0x7fff                  
 
  ldr  r0, =INTSUBMSK  
 
  str  r1, [r0]            
 
 # endif

INTSUBMSK每一位对应SUBSRCPND中的一位,表明SUBSRCPND相应位代表的中断请求是否被CPU所处理。

INTSUBMSK寄存器是一个32位的寄存器,但是只使用了低15位。向其中写入0x7fff就是将INTSUBMSK寄存器全部有效位(低15位)置一,从而屏蔽对应的中断。

屏蔽所有中断,为什么要关中断?

中断处理中ldr pc是将代码的编译地址放在了指针上,而这段时间还没有搬移代码,所以编译地址上面没有这个代码,如果进行跳转就会跳转到空指针上面

(6)设置MPLLCON,UPLLCON, CLKDIVN


# if defined(CONFIG_S3C2440) 
 
#define MPLLCON   0x4C000004
 
#define UPLLCON   0x4C000008  
 
  ldr  r0, =CLKDIVN   ;设置时钟
 
  mov  r1, #5
 
  str  r1, [r0]
 
 
  ldr  r0, =MPLLCON
 
  ldr  r1, =0x7F021 
 
  str  r1, [r0]
 
 
 
  ldr  r0, =UPLLCON 
 
  ldr  r1, =0x38022
 
  str  r1, [r0]
 
# else
 
   /* FCLK:HCLK:PCLK = 1:2:4 */
 
   /* default FCLK is 120 MHz ! */
 
   ldr   r0, =CLKDIVN
 
   mov       r1, #3
 
   str   r1, [r0]
 
#endif

CPU上电几毫秒后,晶振输出稳定,FCLK=Fin(晶振频率),CPU开始执行指令。但实际上,FCLK可以高于Fin,为了提高系统时钟,需要用软件来启用PLL。这就需要设置CLKDIVN,MPLLCON,UPLLCON这3个寄存器。

CLKDIVN寄存器用于设置FCLK,HCLK,PCLK三者间的比例,可以根据表2.2来设置。

表 2.2 S3C2440 的CLKDIVN寄存器格式

FluxBB bbcode 测试

设置CLKDIVN为5,就将HDIVN设置为二进制的10,由于CAMDIVN[9]没有被改变过,取默认值0,因此HCLK = FCLK/4。PDIVN被设置为1,因此PCLK= HCLK/2。因此分频比FCLK:HCLK:PCLK = 1:4:8 。

MPLLCON寄存器用于设置FCLK与Fin的倍数。MPLLCON的位[19:12]称为MDIV,位[9:4]称为PDIV,位[1:0]称为SDIV。

对于S3C2440,FCLK与Fin的关系如下面公式:

       MPLL(FCLK) = (2×m×Fin)/(p× )

       其中: m=MDIC+8,p=PDIV+2,s=SDIV

MPLLCON与UPLLCON的值可以根据“PLL VALUE SELECTION TABLE”设置。部分摘录如下:

表 2.3 推荐PLL值

FluxBB bbcode 测试

当mini2440系统主频设置为405MHZ,USB时钟频率设置为48MHZ时,系统可以稳定运行,因此设置MPLLCON与UPLLCON为:

       MPLLCON=(0x7f<<12) | (0x02<<4) | (0x01) = 0x7f021

       UPLLCON=(0x38<<12) | (0x02<<4) | (0x02) = 0x38022

默认频率为      FCLK:HCLK:PCLK = 1:2:4,默认 FCLK 的值为 120 MHz,该值为 S3C2410 手册的推荐值。

设置时钟分频,为什么要设置时钟?

起始可以不设,系统能不能跑起来和频率没有任何关系,频率的设置是要让外围的设备能承受所设置的频率,如果频率过高则会导致cpu操作外围设备失败

说白了:设置频率,就为了CPU能去操作外围设备

(7)关闭MMU,cache(也就是做bank的设置)


#ifndef CONFIG_SKIP_LOWLEVEL_INIT
 
bl   cpu_init_crit  /* ;跳转并把转移后面紧接的一条指令地址保存到链接寄存器LR(R14)中,以此来完成子程序的调用*/
 
#endif

cpu_init_crit 这段代码在U-Boot正常启动时才需要执行,若将U-Boot从RAM中启动则应该注释掉这段代码。

下面分析一下cpu_init_crit到底做了什么:


#ifndef CONFIG_SKIP_LOWLEVEL_INIT
 
cpu_init_crit:
 
 /*
 
 * 使数据cache与指令cache无效 */
 
 */
 
 mov r0, #0
 
 mcr p15, 0, r0, c7, c7, 0 /* 向c7写入0将使ICache与DCache无效*/
 
 mcr p15, 0, r0, c8, c7, 0 /* 向c8写入0将使TLB失效 ,协处理器*/
 
 
 
 /*
 
 * disable MMU stuff and caches
 
 */
 
 mrc p15, 0, r0, c1, c0, 0 /* 读出控制寄存器到r0中 */
 
 bic r0, r0, #0x00002300 @ clear bits 13, 9:8 (--V- --RS)
 
 bic r0, r0, #0x00000087 @ clear bits 7, 2:0 (B--- -CAM)
 
 orr r0, r0, #0x00000002 @ set bit 2 (A) Align
 
 orr r0, r0, #0x00001000 @ set bit 12 (I) I-Cache
 
 mcr p15, 0, r0, c1, c0, 0 /* 保存r0到控制寄存器 */
 
 /*
 
 * before relocating, we have to setup RAM timing
 
 * because memory timing is board-dependend, you will
 
 * find a lowlevel_init.S in your board directory.
 
 */
 
 mov ip, lr
 
 bl lowlevel_init
 
 mov lr, ip
 
 mov pc, lr
 
#endif /* CONFIG_SKIP_LOWLEVEL_INIT */

代码中的c0,c1,c7,c8都是ARM920T的协处理器CP15的寄存器。其中c7是cache控制寄存器,c8是TLB控制寄存器。325~327行代码将0写入c7、c8,使Cache,TLB内容无效。

disable MMU stuff and caches 代码关闭了MMU。这是通过修改CP15的c1寄存器来实现的,先看CP15的c1寄存器的格式(仅列出代码中用到的位):

表 2.3 CP15的c1寄存器格式(部分)

FluxBB bbcode 测试

各个位的意义如下:

>V :  表示异常向量表所在的位置,0:异常向量在0x00000000;1:异常向量在 0xFFFF0000
>I :  0 :关闭ICaches;1 :开启ICaches
>R、S : 用来与页表中的描述符一起确定内存的访问权限
>B :  0 :CPU为小字节序;1 : CPU为大字节序
>C :  0:关闭DCaches;1:开启DCaches
>A :  0:数据访问时不进行地址对齐检查;1:数据访问时进行地址对齐检查
>M :  0:关闭MMU;1:开启MMU

代码将c1的 M位置零,关闭了MMU。

为什么要关闭catch和MMU呢?catch和MMU是做什么用的?

MMU是Memory Management Unit的缩写,中文名是内存管理单元,它是中央处理器(CPU)中用来管理虚拟存储器、物理存储器的控制线路,同时也负责虚拟地址映射为物理地址,以及提供硬件机制的内存访问授权     

概述:

一,关catch

catch和MMU是通过CP15管理的,刚上电的时候,CPU还不能管理它们,上电的时候MMU必须关闭,指令catch可关闭,可不关闭,但数据catch一定要关闭。否则可能导致刚开始的代码里面,去取数据的时候,从catch里面取,而这时候RAM中数据还没有catch过来,导致数据预取异常

二:关MMU

因为MMU是;把虚拟地址转化为物理地址得作用,而目的是设置控制寄存器,而控制寄存器本来就是实地址(物理地址),再使能MMU,不就是多此一举了吗?

详细分析

Catch是cpu内部的一个2级缓存,它的作用是将常用的数据和指令放在cpu内部,MMU是用来把虚实地址转换为物理地址用的

我们的目的:是设置控制的寄存器,寄存器都是实地址(物理地址),如果既要开启MMU又要做虚实地址转换的话,中间还多一步,多此一举了嘛?

先要把实地址转换成虚地址,然后再做设置,但对uboot而言就是起到一个简单的初始化的作用和引导操作系统,如果开启MMU的话,很麻烦,也没必要,所以关闭MMU.

说到catch就必须提到一个关键字 Volatile,以后在设置寄存器时会经常遇到,他的本质:是告诉编译器不要对我的代码进行优化,作用是让编写者感觉不到变量的变化情况(也就是说,让它执行速度加快吧)

优化的过程:是将常用的代码取出来放到catch中,它没有从实际的物理地址去取,它直接从cpu的缓存中去取,但常用的代码就是为了感觉一些常用变量的变化

优化原因:如果正在取数据的时候发生跳变,那么就感觉不到变量的变化了,所以在这种情况下要用Volatile关键字告诉编译器不要做优化,每次从实际的物理地址中去取指令,这就是为什么关闭catch关闭MMU。

但在C语言中是不会关闭catch和MMU的,会打开,如果编写者要感觉外界变化,或变化太快,从catch中取数据会有误差,就加一个关键字Volatile。

(8)初始化RAM控制寄存器

bl lowlevel_init下来初始化各个bank,把各个bank设置必须搞清楚,对以后移植复杂的uboot有很大帮助,设置完毕后拷贝uboot代码到4k空间,拷贝完毕后执行内存中的uboot代码

其中的lowlevel_init就完成了内存初始化的工作,由于内存初始化是依赖于开发板的,因此lowlevel_init的代码一般放在board下面相应的目录中。对于mini2440,lowlevel_init在board/samsung/mini2440/lowlevel_init.S中定义如下:


#define BWSCON 0x48000000 /* 13个存储控制器的开始地址 */
 
 _TEXT_BASE:
 
  .word TEXT_BASE0x33F80000, board/config.mk中这段话表示,用户告诉编译器编译地址的起始地址
 
 
 
 .globl lowlevel_init
 
 lowlevel_init:
 
  /* memory control configuration */
 
  /* make r0 relative the current location so that it */
 
  /* reads SMRDATA out of FLASH rather than memory ! */
 
  ldr r0, =SMRDATA
 
  ldr r1, _TEXT_BASE
 
  sub r0, r0, r1 /* SMRDATA减 _TEXT_BASE就是13个寄存器的偏移地址 */
 
  ldr r1, =BWSCON /* Bus Width Status Controller */
 
  add r2, r0, #13*4
 
 0:
 
  ldr r3, [r0], #4 /*将13个寄存器的值逐一赋值给对应的寄存器*/
 
  str r3, [r1], #4
 
  cmp r2, r0
 
  bne 0b
 
  /* everything is fine now */
 
  mov pc, lr
 
  .ltorg
 
 /* the literal pools origin */
 
 
 SMRDATA: /* 下面是13个寄存器的值 */
 
  .word ...
 
  .word ...
 
...
 
 
 lowlevel_init初始化了13个寄存器来实现RAM时钟的初始化。lowlevel_init函数对于U-Boot从NAND Flash或NOR Flash启动的情况都是有效的。
 
 U-Boot.lds链接脚本有如下代码:
 
 .text :
 {
 
   cpu/arm920t/start.o (.text)
   board/samsung/mini2440/lowlevel_init.o (.text)
   board/samsung/mini2440/nand_read.o (.text)
 
   ...
 }

board/samsung/mini2440/lowlevel_init.o将被链接到cpu/arm920t/start.o后面,因此board/samsung/mini2440/lowlevel_init.o也在U-Boot的前4KB的代码中。

U-Boot在NAND Flash启动时,lowlevel_init.o将自动被读取到CPU内部4KB的内部RAM中。因此/* reads SMRDATA out of FLASH rather than memory ! */ 开始行的代码将从CPU内部RAM中复制寄存器的值到相应的寄存器中。

对于U-Boot在NOR Flash启动的情况,由于U-Boot连接时确定的地址是U-Boot在内存中的地址,而此时U-Boot还在NOR Flash中,因此还需要在NOR Flash中读取数据到RAM中。

由于NOR Flash的开始地址是0,而U-Boot的加载到内存的起始地址是TEXT_BASE,SMRDATA标号在Flash的地址就是SMRDATA-TEXT_BASE。

综上所述,lowlevel_init的作用就是将SMRDATA开始的13个值复制给开始地址[BWSCON]的13个寄存器,从而完成了存储控制器的设置。

问题一:如果换一块开发板有可能改哪些东西?

首先,cpu的运行模式,如果需要对cpu进行设置那就设置,管看门狗,关中断不用改,时钟有可能要改,如果能正常使用则不用改,关闭catch和MMU不用改,设置bank有可能要改。最后一步拷贝时看地址会不会变,如果变化也要改,执行内存中代码,地址有可能要改。


问题二:Nor Flash和Nand Flash本质区别:

就在于是否进行代码拷贝,也就是下面代码所表述:无论是Nor Flash还是Nand Flash,核心思想就是将uboot代码搬运到内存中去运行,但是没有拷贝bss后面这段代码,只拷贝bss前面的代码,bss代码是放置全局变量的。Bss段代码是为了清零,拷贝过去再清零重复操作

(9)复制U-Boot第二阶段代码到RAM

cpu/arm920t/start.S原来的代码是只支持从NOR Flash启动的,经过修改现在U-Boot在NOR Flash和NAND Flash上都能启动了,实现的思路是这样的:


 bl bBootFrmNORFlash /* 判断U-Boot是在NAND Flash还是NOR Flash启动 */
 
 cmp r0, #0 /* r0存放bBootFrmNORFlash函数返回值,若返回0表示NAND Flash启动,否则表示在NOR Flash启动 */
 
 beq nand_boot /* 跳转到NAND Flash启动代码 */
 
 
 /* NOR Flash启动的代码 */
 
 b stack_setup /* 跳过NAND Flash启动的代码 */
 
 
nand_boot:
 
/* NAND Flash启动的代码 */
 
 
stack_setup:
 
 /* 其他代码 */

其中bBootFrmNORFlash函数作用是判断U-Boot是在NAND Flash启动还是NOR Flash启动,若在NOR Flash启动则返回1,否则返回0。根据ATPCS规则,函数返回值会被存放在r0寄存器中,因此调用bBootFrmNORFlash函数后根据r0的值就可以判断U-Boot在NAND Flash启动还是NOR Flash启动。bBootFrmNORFlash函数在board/samsung/mini2440/nand_read.c中定义如下:


int bBootFrmNORFlash(void)
{
    volatile unsigned int *pdw = (volatile unsigned int *)0;
    unsigned int dwVal;
 
 
    dwVal = *pdw;         /* 先记录下原来的数据 */
    *pdw = 0x12345678;
 
    if (*pdw != 0x12345678) /* 写入失败,说明是在NOR Flash启动 */
    {
        return 1;     
    }
    else                   /* 写入成功,说明是在NAND Flash启动 */
    {
        *pdw = dwVal;      /* 恢复原来的数据 */
        return 0;
    }
}

无论是从NOR Flash还是从NAND Flash启动,地址0处为U-Boot的第一条指令“ b    start_code”。

对于从NAND Flash启动的情况,其开始4KB的代码会被自动复制到CPU内部4K内存中,因此可以通过直接赋值的方法来修改。

对于从NOR Flash启动的情况,NOR Flash的开始地址即为0,必须通过一定的命令序列才能向NOR Flash中写数据,所以可以根据这点差别来分辨是从NAND Flash还是NOR Flash启动:向地址0写入一个数据,然后读出来,如果发现写入失败的就是NOR Flash,否则就是NAND Flash。

下面来分析NOR Flash启动部分代码:


 adr r0, _start /* r0 <- current position of code */
 
 ldr r1, _TEXT_BASE /* test if we run from flash or RAM */
 
/* 判断U-Boot是否是下载到RAM中运行,若是,则不用再复制到RAM中了,这种情况通常在调试U-Boot时才发生 */
 
 cmp  r0, r1 /*_start等于_TEXT_BASE说明是下载到RAM中运行 */
 
 beq stack_setup
 
/* 以下直到nand_boot标号前都是NOR Flash启动的代码 */
 
 ldr r2, _armboot_start /*flash中armboot_start的起始地址*/
 
 ldr r3, _bss_start /*uboot_bss的起始地址*/
 
 sub r2, r3, r2 /* r2 <- size of armbootuboot实际程序代码的大小 */
 
 add r2, r0, r2 /* r2 <- source end address */
 
/*搬运U-Boot自身到RAM中*/
 
copy_loop:
 
 ldmia r0!, {r3-r10} /* 从地址为[r0]的NOR Flash中读入8个字的数据 */
 
 stmia r1!, {r3-r10} /* 将r3至r10寄存器的数据复制给地址为[r1]的内存 */
 
 cmp r0, r2 /* until source end addreee [r2] */
 
 ble copy_loop
 
 b stack_setup /* 跳过NAND Flash启动的代码 */

下面再来分析NAND Flash启动部分代码:


nand_boot:
 
 mov r1, #NAND_CTL_BASE
 
 ldr r2, =( (7<<12)|(7<<8)|(7<<4)|(0<<0) )
 str r2, [r1, #oNFCONF] /* 设置NFCONF寄存器 */
 /* 设置NFCONT,初始化ECC编/解码器,禁止NAND Flash片选 */
 ldr r2, =( (1<<4)|(0<<1)|(1<<0) )
 str r2, [r1, #oNFCONT]
 ldr r2, =(0x6) /* 设置NFSTAT */
 str r2, [r1, #oNFSTAT]
 /* 复位命令,第一次使用NAND Flash前复位 */
 mov r2, #0xff
 strb r2, [r1, #oNFCMD]
 mov r3, #0
 /* 为调用C函数nand_read_ll准备堆栈 */
 ldr sp, DW_STACK_START
 mov fp, #0
 /* 下面先设置r0至r2,然后调用nand_read_ll函数将U-Boot读入RAM */
 ldr r0, =TEXT_BASE /* 目的地址:U-Boot在RAM的开始地址 */
 mov r1, #0x0  /* 源地址:U-Boot在NAND Flash中的开始地址 */
 mov r2, #0x30000  /* 复制的大小,必须比u-boot.bin文件大,并且必须是NAND Flash块大小的整数倍,这里设置为0x30000(192KB) */
 bl nand_read_ll  /* 跳转到nand_read_ll函数,开始复制U-Boot到RAM */
 tst r0, #0x0 /* 检查返回值是否正确 */
 beq stack_setup
 bad_nand_read:
 loop2: b loop2 //infinite loop
.align 2
 DW_STACK_START: .word STACK_BASE+STACK_SIZE-4

其中NAND_CTL_BASE,oNFCONF等在include/configs/mini2440.h中定义如下


#define NAND_CTL_BASE 0x4E000000 // NAND Flash控制寄存器基址
 
#define STACK_BASE 0x33F00000 //base address of stack
#define STACK_SIZE 0x8000 //size of stack
#define oNFCONF 0x00 /* NFCONF相对于NAND_CTL_BASE偏移地址 */
#define oNFCONT 0x04 /* NFCONT相对于NAND_CTL_BASE偏移地址*/
#define oNFADDR 0x0c /* NFADDR相对于NAND_CTL_BASE偏移地址*/
#define oNFDATA 0x10 /* NFDATA相对于NAND_CTL_BASE偏移地址*/
#define oNFCMD 0x08 /* NFCMD相对于NAND_CTL_BASE偏移地址*/
#define oNFSTAT 0x20 /* NFSTAT相对于NAND_CTL_BASE偏移地址*/
#define oNFECC 0x2c /* NFECC相对于NAND_CTL_BASE偏移地址*/

NAND Flash各个控制寄存器的设置在S3C2440的数据手册有详细说明,这里就不介绍了。

代码中nand_read_ll函数的作用是在NAND Flash中搬运U-Boot到RAM,该函数在board/samsung/mini2440/nand_read.c中定义。

NAND Flash根据page大小可分为2种: 512B/page和2048B/page的。这两种NAND Flash的读操作是不同的。因此就需要U-Boot识别到NAND Flash的类型,然后采用相应的读操作,也就是说nand_read_ll函数要能自动适应两种NAND Flash。

参考S3C2440的数据手册可以知道:根据NFCONF寄存器的Bit3(AdvFlash (Read only))和Bit2 (PageSize (Read only))可以判断NAND Flash的类型。Bit2、Bit3与NAND Flash的block类型的关系如下表所示:

表 2.4 NFCONF的Bit3、Bit2与NAND Flash的关系

FluxBB bbcode 测试

由于的NAND Flash只有512B/page和2048 B/page这两种,因此根据NFCONF寄存器的Bit3即可区分这两种NAND Flash了。

完整代码见board/samsung/mini2440/nand_read.c中的nand_read_ll函数,这里给出伪代码:


int nand_read_ll(unsigned char *buf, unsigned long start_addr, int size)
{
	//根据NFCONF寄存器的Bit3来区分2种NAND Flash
 
	if( NFCONF & 0x8 )  /* Bit是1,表示是2KB/page的NAND Flash */
	{
		
		读取2K block 的NAND Flash
		
	
	}
	else /* Bit是0,表示是512B/page的NAND Flash */
	{
	
		/
		读取512B block 的NAND Flash
		/
	
	}
 
	return 0;
}

(10)设置堆栈


stack_setup:
 
 ldr r0, _TEXT_BASE /* upper 128 KiB: relocated uboot */
 
 sub r0, r0, #CONFIG_SYS_MALLOC_LEN /* malloc area */
 
 sub r0, r0, #CONFIG_SYS_GBL_DATA_SIZE /* 跳过全局数据区 */
 
#ifdef CONFIG_USE_IRQ
 
 sub r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)
 
#endif
 
 sub sp, r0, #12 /* leave 3 words for abort-stack */

只要将sp指针指向一段没有被使用的内存就完成栈的设置了。根据上面的代码可以知道U-Boot内存使用情况了,如下图所示:

FluxBB bbcode 测试

(11)清除BSS段


clear_bss:
 
 ldr r0, _bss_start /* BSS段开始地址,在u-boot.lds中指定*/
 
 ldr r1, _bss_end /* BSS段结束地址,在u-boot.lds中指定*/
 
 mov r2, #0x00000000
 
clbss_l:str r2, [r0] /* 将bss段清零*/
 
 add r0, r0, #4
 
 cmp  r0, r1
 
 ble clbss_l

初始值为0,无初始值的全局变量,静态变量将自动被放在BSS段。应该将这些变量的初始值赋为0,否则这些变量的初始值将是一个随机的值,若有些程序直接使用这些没有初始化的变量将引起未知的后果。

(12)跳转到第二阶段代码入口


ldr   pc, _start_armboot
 
_start_armboot:   .word  start_armboot  //跳转到第二阶段代码入口start_armboot处

UBOOT 启动第二阶段代码分析

start_armboot函数在lib_arm/board.c中定义,是U-Boot第二阶段代码的入口。U-Boot启动第二阶段流程如下:

FluxBB bbcode 测试

分析start_armboot函数前先来看看一些重要的数据结构:

(1)gd_t结构体

U-Boot使用了一个结构体gd_t来存储全局数据区的数据,这个结构体在include/asm-arm/global_data.h中定义如下:


typedef struct global_data {
 
 bd_t *bd;
 unsigned long flags;
 unsigned long baudrate;
 unsigned long have_console; /* serial_init() was called */
 unsigned long env_addr; /* Address of Environment struct */
 unsigned long env_valid; /* Checksum of Environment valid */
 unsigned long fb_base; /* base address of frame buffer */
 void **jt; /* jump table */
 
} gd_t;

U-Boot使用了一个存储在寄存器中的指针gd来记录全局数据区的地址:


#define DECLARE_GLOBAL_DATA_PTR     register volatile gd_t *gd asm ("r8")

DECLARE_GLOBAL_DATA_PTR定义一个gd_t全局数据结构的指针,这个指针存放在指定的寄存器r8中。这个声明也避免编译器把r8分配给其它的变量。任何想要访问全局数据区的代码,只要代码开头加入“DECLARE_GLOBAL_DATA_PTR”一行代码,然后就可以使用gd指针来访问全局数据区了。

根据U-Boot内存使用图中可以计算gd的值:


gd = TEXT_BASE - CONFIG_SYS_MALLOC_LEN - sizeof(gd_t)

(2)bd_t结构体

bd_t在include/asm-arm.u/u-boot.h中定义如下:


typedef struct bd_info {
 
	int bi_baudrate;  /* 串口通讯波特率 */
	unsigned long bi_ip_addr;  /* IP 地址*/
	struct environment_s  *bi_env; /* 环境变量开始地址 */
	ulong  bi_arch_number; /* 开发板的机器码 */
	ulong  bi_boot_params; /* 内核参数的开始地址 */
 
	struct /* RAM配置信息 */
	{
		ulong start;
		ulong size;
	}bi_dram[CONFIG_NR_DRAM_BANKS];
 
} bd_t;

U-Boot启动内核时要给内核传递参数,这时就要使用gd_t,bd_t结构体中的信息来设置标记列表。

第一阶段调用start_armboot指向C语言执行代码区,首先它要从内存上的重定位数据获得不完全配置的全局数据表格和板级信息表格,即获得gd_t和bd_t,

这两个类型变量记录了刚启动时的信息,并将要记录作为引导内核和文件系统的参数,如bootargs等等,并且将来还会在启动内核时,由uboot交由kernel时会有所用。

(3)init_sequence数组

U-Boot使用一个数组init_sequence来存储对于大多数开发板都要执行的初始化函数的函数指针。init_sequence数组中有较多的编译选项,去掉编译选项后init_sequence数组如下所示:


typedef int (init_fnc_t) (void);
 
init_fnc_t *init_sequence[] = {
 
 board_init,   /*开发板相关的配置--board/samsung/mini2440/mini2440.c */
 timer_init, /* 时钟初始化-- cpu/arm920t/s3c24x0/timer.c */
 env_init,  /*初始化环境变量--common/env_flash.c 或common/env_nand.c*/
 init_baudrate, /*初始化波特率-- lib_arm/board.c */
 serial_init, /* 串口初始化-- drivers/serial/serial_s3c24x0.c */
 console_init_f, /* 控制通讯台初始化阶段1-- common/console.c */
 display_banner, /*打印U-Boot版本、编译的时间-- gedit lib_arm/board.c */
 dram_init, /*配置可用的RAM-- board/samsung/mini2440/mini2440.c */
 display_dram_config, /* 显示RAM大小-- lib_arm/board.c */
 NULL,
 
};

其中的board_init函数在board/samsung/mini2440/mini2440.c中定义,该函数设置了MPLLCOM,UPLLCON,以及一些GPIO寄存器的值,还设置了U-Boot机器码和内核启动参数地址 :


/* MINI2440开发板的机器码 */
 
gd->bd->bi_arch_number = MACH_TYPE_MINI2440;
 
/* 内核启动参数地址 */
 
gd->bd->bi_boot_params = 0x30000100;  

其中的dram_init函数在board/samsung/mini2440/mini2440.c中定义如下:


int dram_init (void)
{
 
 /* 由于mini2440只有 */
 
 gd->bd->bi_dram[0].start = PHYS_SDRAM_1;
 gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE;
 
 return 0;
}

mini2440使用2片32MB的SDRAM组成了64MB的内存,接在存储控制器的BANK6,地址空间是0x30000000~0x34000000。

在include/configs/mini2440.h中 PHYS_SDRAM_1和PHYS_SDRAM_1_SIZE 分别被定义为0x30000000和0x04000000(64M)

分析完上述的数据结构,下面来分析start_armboot函数:


void start_armboot (void)
{
	init_fnc_t **init_fnc_ptr;
	char *s;
	
	… …
	
	/* 计算全局数据结构的地址gd */
	gd = (gd_t*)(_armboot_start - CONFIG_SYS_MALLOC_LEN - sizeof(gd_t));
	
	… …
	
	memset ((void*)gd, 0, sizeof (gd_t));
	gd->bd = (bd_t*)((char*)gd - sizeof(bd_t));
	memset (gd->bd, 0, sizeof (bd_t));
	gd->flags |= GD_FLG_RELOC;
	
	monitor_flash_len = _bss_start - _armboot_start;
	
	/* 逐个调用init_sequence数组中的初始化函数 */
	for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
	
		if ((*init_fnc_ptr)() != 0) {
		
			hang ();
		}
	}
 
 
	/* armboot_start 在cpu/arm920t/start.S 中被初始化为u-boot.lds连接脚本中的_start */
	mem_malloc_init (_armboot_start - CONFIG_SYS_MALLOC_LEN,CONFIG_SYS_MALLOC_LEN);
 
 
 
	/* NOR Flash初始化 */
	
	#ifndef CONFIG_SYS_NO_FLASH
		/* configure available FLASH banks */
		display_flash_config (flash_init ());
	#endif /* CONFIG_SYS_NO_FLASH */
 
	… …
	
	/* NAND Flash 初始化*/
	
	#if defined(CONFIG_CMD_NAND)
		puts ("NAND: ");
		nand_init(); /* go init the NAND */
	#endif
 
	… …
	
	/*配置环境变量,重新定位 */
	env_relocate ();
	
	… …
 
	/* 从环境变量中获取IP地址 */
	gd->bd->bi_ip_addr = getenv_IPaddr ("ipaddr");
	stdio_init (); /* get the devices list going. */
	jumptable_init ();
	
	… …
	
	/* fully init console as a device */
	console_init_r (); 
	
	… …
	
	/* enable exceptions */
	enable_interrupts ();
 
  
  // USB 初始化
	#ifdef CONFIG_USB_DEVICE
		usb_init_slave();
	#endif
 
	/* Initialize from environment */
	
	if ((s = getenv ("loadaddr")) != NULL) {
		load_addr = simple_strtoul (s, NULL, 16);
	}
 
	#if defined(CONFIG_CMD_NET)
	
	if ((s = getenv ("bootfile")) != NULL) {
		copy_filename (BootFile, s, sizeof (BootFile));
	}
	
	#endif
 
	… …
	
	/* 网卡初始化 */
	
	#if defined(CONFIG_CMD_NET)
	
	#if defined(CONFIG_NET_MULTI)
	
		puts ("Net: ");
	
	#endif
	
	eth_initialize(gd->bd);
 
	… …
 
	#endif
 
 
	/* main_loop() can return to retry autoboot, if so just run it again. */
	
	for (;;) {
	
		main_loop ();
	
	}
 
	/* NOTREACHED - no way out of command loop except booting */
 
}

main_loop函数在common/main.c中定义。一般情况下,进入main_loop函数若干秒内没有按键触发就进入kernel 执行流程

UBOOT启动Linux过程

U-Boot使用标记列表(tagged list)的方式向Linux传递参数。标记的数据结构式是tag,在U-Boot源代码目录include/asm-arm/setup.h中定义如下:


struct tag_header {
 
	u32 size; /* 表示tag数据结构的联合u实质存放的数据的大小*/
	u32 tag;  /* 表示标记的类型 */
 
};
 
struct tag {
 
	struct tag_header hdr;
	
	union {
	
		struct tag_core core;
		struct tag_mem32 mem;
		struct tag_videotext videotext;
		struct tag_ramdisk ramdisk;
		struct tag_initrd initrd;
		struct tag_serialnr serialnr;
		struct tag_revision revision;
		struct tag_videolfb videolfb;
		struct tag_cmdline cmdline;
		
		 /*
		 * Acorn specific
		 */
		
		 struct tag_acorn acorn;
		
		 /*
		 * DC21285 specific
		 */
		
		 struct tag_memclk memclk;
	
	 } u;
 
};

U-Boot使用命令bootm来启动已经加载到内存中的内核。而bootm命令实际上调用的是do_bootm函数。对于Linux内核,do_bootm函数会调用do_bootm_linux函数来设置标记列表和启动内核。do_bootm_linux函数在lib_arm/bootm.c 中定义如下:


int do_bootm_linux(int flag, int argc, char *argv[], bootm_headers_t *images)
{
 
	bd_t *bd = gd->bd;
	char *s;
	int machid = bd->bi_arch_number;
	void (*theKernel)(int zero, int arch, uint params);
 
#ifdef CONFIG_CMDLINE_TAG
 
	char *commandline = getenv ("bootargs"); /* U-Boot环境变量bootargs */
 
#endif
 
	…
	
	theKernel = (void (*)(int, int, uint))images->ep; /* 获取内核入口地址 */
	
	…
 
	#if defined (CONFIG_SETUP_MEMORY_TAGS) || \
	
	defined (CONFIG_CMDLINE_TAG) || \
	
	defined (CONFIG_INITRD_TAG) || \
	
	defined (CONFIG_SERIAL_TAG) || \
	
	defined (CONFIG_REVISION_TAG) || \
	
	defined (CONFIG_LCD) || \
	
	defined (CONFIG_VFD)
	
	setup_start_tag (bd); /* 设置ATAG_CORE标志 */
	
	…
	
	#ifdef CONFIG_SETUP_MEMORY_TAGS
		setup_memory_tags (bd);  /* 设置内存标记 */
	#endif
	
	#ifdef CONFIG_CMDLINE_TAG
		setup_commandline_tag (bd, commandline); /* 设置命令行标记 */
	#endif
	
	…
	
	setup_end_tag (bd); /* 设置ATAG_NONE标志 */
	
	#endif
	
	
	/* we assume that the kernel is in place */
	
	printf ("\nStarting kernel ...\n\n");
	
	…
	
	cleanup_before_linux (); /* 启动内核前对CPU作最后的设置 */
	
	theKernel (0, machid, bd->bi_boot_params); /* 调用内核 */
	
	/* does not return */
	
	return 1;
 
}

其中的setup_start_tag,setup_memory_tags,setup_end_tag函数在lib_arm/bootm.c中定义如下:

(1)setup_start_tag函数


static void setup_start_tag (bd_t *bd)
{
	params = (struct tag *) bd->bi_boot_params; /* 内核的参数的开始地址 */
	
	params->hdr.tag = ATAG_CORE;
	params->hdr.size = tag_size (tag_core);
	params->u.core.flags = 0;
	params->u.core.pagesize = 0;
	params->u.core.rootdev = 0;
	params = tag_next (params);
}

标记列表必须以ATAG_CORE开始,setup_start_tag函数在内核的参数的开始地址设置了一个ATAG_CORE标记

(2)setup_memory_tags函数


static void setup_memory_tags (bd_t *bd)
{
	int i;
 
	/*设置一个内存标记 */
 
	for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) {
 
		params->hdr.tag = ATAG_MEM;
		params->hdr.size = tag_size (tag_mem32);
		params->u.mem.start = bd->bi_dram[i].start;
		params->u.mem.size = bd->bi_dram[i].size;
		params = tag_next (params);
 
	}
}

setup_memory_tags函数设置了一个ATAG_MEM标记,该标记包含内存起始地址,内存大小这两个参数。

(3)setup_end_tag函数


static void setup_end_tag (bd_t *bd)
{
	params->hdr.tag = ATAG_NONE;
	params->hdr.size = 0;
}

标记列表必须以标记ATAG_NONE结束,setup_end_tag函数设置了一个ATAG_NONE标记,表示标记列表的结束。

U-Boot设置好标记列表后就要调用内核了。但调用内核前,CPU必须满足下面的条件:

(1) CPU寄存器的设置
>Ø  r0=0
>Ø  r1=机器码
>Ø  r2=内核参数标记列表在RAM中的起始地址

(2)CPU工作模式
>Ø  禁止IRQ与FIQ中断
>Ø  CPU为SVC模式

(3) 使数据Cache与指令Cache失效

do_bootm_linux中调用的cleanup_before_linux函数完成了禁止中断和使Cache失效的功能。cleanup_before_linux函数在cpu/arm920t/cpu.中定义:


int cleanup_before_linux (void)
{
	/*
	* this function is called just before we call linux
	* it prepares the processor for linux
	*
	* we turn off caches etc ...
	*/
	
	disable_interrupts (); /* 禁止FIQ/IRQ中断 */
	
	/* turn off I/D-cache */
	
	icache_disable(); /* 使指令Cache失效 */
	
	dcache_disable(); /* 使数据Cache失效 */
	
	/* flush I/D-cache */
	
	cache_flush(); /* 刷新Cache */
	
	return 0;
}

由于U-Boot启动以来就一直工作在SVC模式,因此CPU的工作模式就无需设置了。


do_bootm_linux中:
 
void (*theKernel)(int zero, int arch, uint params);
 
… …
 
theKernel = (void (*)(int, int, uint))images->ep;
 
… …
 
theKernel (0, machid, bd->bi_boot_params);

第73行代码将内核的入口地址“images->ep”强制类型转换为函数指针。根据ATPCS规则,函数的参数个数不超过4个时,使用r0~r3这4个寄存器来传递参数。因此第128行的函数调用则会将0放入r0,机器码machid放入r1,内核参数地址bd->bi_boot_params放入r2,从而完成了寄存器的设置,最后转到内核的入口地址。

到这里,U-Boot的工作就结束了,系统跳转到Linux内核代码执行。

UBOOT 添加命令的方法及U-Boot命令执行过程

下面以添加menu命令(启动菜单)为例讲解U-Boot添加命令的方法。

(1)建立common/cmd_menu.c

习惯上通用命令源代码放在common目录下,与开发板专有命令源代码则放在board/<board_dir>目录下,并且习惯以“cmd_<命令名>.c”为文件名。

(2)定义“menu”命令

在cmd_menu.c中使用如下的代码定义“menu”命令:


_BOOT_CMD(
 
       menu,    3,    0,    do_menu,
       "menu - display a menu, to select the items to do something\n",
       " - display a menu, to select the items to do something"
 
);

其中U_BOOT_CMD命令格式如下:

U_BOOT_CMD(name,maxargs,rep,cmd,usage,help) 各个参数的意义如下:
>name:命令名,非字符串,但在U_BOOT_CMD中用“#”符号转化为字符串
>maxargs:命令的最大参数个数
>rep:是否自动重复(按Enter键是否会重复执行)
>cmd:该命令对应的响应函数
>usage:简短的使用说明(字符串)
>help:较详细的使用说明(字符串)

在内存中保存命令的help字段会占用一定的内存,通过配置U-Boot可以选择是否保存help字段。若在include/configs/mini2440.h中定义了CONFIG_SYS_LONGHELP宏,则在U-Boot中使用help命令查看某个命令的帮助信息时将显示usage和help字段的内容,否则就只显示usage字段的内容。

U_BOOT_CMD宏在include/command.h中定义:


#define U_BOOT_CMD(name,maxargs,rep,cmd,usage,help) \
cmd_tbl_t __u_boot_cmd_##name Struct_Section = {#name, maxargs, rep, cmd, usage, help}
 
 “##”与“#”都是预编译操作符,“##”有字符串连接的功能,“#”表示后面紧接着的是一个字符串。
 
//其中的cmd_tbl_t在include/command.h中定义如下:
 
struct cmd_tbl_s {
 
 char *name; /* 命令名 */
 int maxargs; /* 最大参数个数 */
 int repeatable; /* 是否自动重复 */
 int (*cmd)(struct cmd_tbl_s *, int, int, char *[]); /* 响应函数 */
 char *usage; /* 简短的帮助信息 */
 
#ifdef CONFIG_SYS_LONGHELP
 char *help; /* 较详细的帮助信息 */
#endif
 
#ifdef CONFIG_AUTO_COMPLETE
 
 /* 自动补全参数 */
 int (*complete)(int argc, char *argv[], char last_char, int maxv, char *cmdv[]);
 
#endif
 
};
typedef struct cmd_tbl_s  cmd_tbl_t;
 
一个cmd_tbl_t结构体变量包含了调用一条命令的所需要的信息。
 
其中Struct_Section在include/command.h中定义如下:
 
#define Struct_Section  __attribute__ ((unused,section (".u_boot_cmd")))
 
凡是带有__attribute__ ((unused,section (".u_boot_cmd"))属性声明的变量都将被存放在".u_boot_cmd"段中,
并且即使该变量没有在代码中显式的使用编译器也不产生警告信息。
 
在U-Boot连接脚本u-boot.lds中定义了".u_boot_cmd"段:
 
  . = .;
  __u_boot_cmd_start = .;          /*将 __u_boot_cmd_start指定为当前地址 */
  .u_boot_cmd : { *(.u_boot_cmd) }
  __u_boot_cmd_end = .;           /*  将__u_boot_cmd_end指定为当前地址  */

这表明带有“.u_boot_cmd”声明的函数或变量将存储在“u_boot_cmd”段。这样只要将U-Boot所有命令对应的cmd_tbl_t变量加上“.u_boot_cmd”声明,编译器就会自动将其放在“u_boot_cmd”段,查找cmd_tbl_t变量时只要在__u_boot_cmd_start与__u_boot_cmd_end之间查找就可以了。

因此“menu”命令的定义经过宏展开后如下:

cmd_tbl_t __u_boot_cmd_menu __attribute__ ((unused,section (".u_boot_cmd"))) = {menu, 3, 0, do_menu, "menu - display a menu, to select the items to do something\n", " - display a menu, to select the items to do something"}

实质上就是用U_BOOT_CMD宏定义的信息构造了一个cmd_tbl_t类型的结构体。编译器将该结构体放在“u_boot_cmd”段,执行命令时就可以在“u_boot_cmd”段查找到对应的 cmd_tbl_t类型结构体。

(3)实现命令的函数

在cmd_menu.c中添加“menu”命令的响应函数的实现。具体的实现代码略:


int do_menu (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
    /* 实现代码略 */
}

(4)将common/cmd_menu.c编译进u-boot.bin

在common/Makefile中加入如下代码:

COBJS-$(CONFIG_BOOT_MENU) += cmd_menu.o

在include/configs/mini2440.h加入如代码:

#define CONFIG_BOOT_MENU 1

重新编译下载U-Boot就可以使用menu命令了

(5)menu命令执行的过程

在U-Boot中输入“menu”命令执行时,U-Boot接收输入的字符串“menu”,传递给run_command函数。run_command函数调用common/command.c中实现的find_cmd函数在__u_boot_cmd_start与__u_boot_cmd_end间查找命令,并返回menu命令的cmd_tbl_t结构。然后run_command函数使用返回的cmd_tbl_t结构中的函数指针调用menu命令的响应函数do_menu,从而完成了命令的执行。

页脚

Powered by FluxBB

本站由XREA提供空间支持