I have a workload where I benefit from single core speed, so I got a system with an i9-9900K (not overclocked) 8C CPU that should go up to 5GHz single core speed. (I know it's not server hardware but that's important for this application). This works fine in Linux, but I would like to use, as always, FreeBSD. The system seems stuck at 800MHz, despite powerds efforts, but the frequency table also doesn't look right. kern.timecounter.hw defaults to TSC-low which precludes frequency scaling, but after changing it to HPET nothing really changes. sysctl: dev.cpu.0.freq_levels: 3601/95000 3600/95000 3400/87275 3200/79831 3000/73564 2800/66644 2600/60837 2400/54439 2200/49091 2000/43173 1800/38278 1600/32835 1400/27639 1200/23380 1000/18628 800/14778 dev.cpu.0.freq: 800 powerd -v: load 0%, current freq 800 MHz (15), wanted freq 800 MHz load 0%, current freq 800 MHz (15), wanted freq 800 MHz load 20%, current freq 800 MHz (15), wanted freq 800 MHz load 100%, current freq 800 MHz (15), wanted freq 3200 MHz changing clock speed from 800 MHz to 3200 MHz load 100%, current freq 800 MHz (15), wanted freq 7202 MHz changing clock speed from 800 MHz to 3601 MHz load 65%, current freq 800 MHz (15), wanted freq 7202 MHz changing clock speed from 800 MHz to 3601 MHz load 100%, current freq 800 MHz (15), wanted freq 7202 MHz changing clock speed from 800 MHz to 3601 MHz load 100%, current freq 800 MHz (15), wanted freq 7202 MHz changing clock speed from 800 MHz to 3601 MHz load 100%, current freq 800 MHz (15), wanted freq 7202 MHz changing clock speed from 800 MHz to 3601 MHz etc. Hardware: Handle 0x0047, DMI type 4, 48 bytes Processor Information Socket Designation: U3E1 Type: Central Processor Family: Core i9 Manufacturer: Intel(R) Corporation ID: EC 06 09 00 FF FB EB BF Signature: Type 0, Family 6, Model 158, Stepping 12 Flags: FPU (Floating-point unit on-chip) VME (Virtual mode extension) DE (Debugging extension) PSE (Page size extension) TSC (Time stamp counter) MSR (Model specific registers) PAE (Physical address extension) MCE (Machine check exception) CX8 (CMPXCHG8 instruction supported) APIC (On-chip APIC hardware supported) SEP (Fast system call) MTRR (Memory type range registers) PGE (Page global enable) MCA (Machine check architecture) CMOV (Conditional move instruction supported) PAT (Page attribute table) PSE-36 (36-bit page size extension) CLFSH (CLFLUSH instruction supported) DS (Debug store) ACPI (ACPI supported) MMX (MMX technology supported) FXSR (FXSAVE and FXSTOR instructions supported) SSE (Streaming SIMD extensions) SSE2 (Streaming SIMD extensions 2) SS (Self-snoop) HTT (Multi-threading) TM (Thermal monitor supported) PBE (Pending break enabled) Version: Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz Voltage: 1.3 V External Clock: 100 MHz Max Speed: 8300 MHz // What ? Current Speed: 4653 MHz // What? Seems fixed Status: Populated, Enabled Upgrade: Socket LGA1151 L1 Cache Handle: 0x0044 L2 Cache Handle: 0x0045 L3 Cache Handle: 0x0046 Serial Number: To Be Filled By O.E.M. Asset Tag: To Be Filled By O.E.M. Part Number: To Be Filled By O.E.M. Core Count: 8 Core Enabled: 8 Thread Count: 16 Characteristics: 64-bit capable Multi-Core Hardware Thread Execute Protection Enhanced Virtualization Power/Performance Control What should I do? I have been happily using FreeBSD for so long that I never considered something like this not working. 1) Can I lock the frequency somehow at boot? 2) Is there some alternative way to scale up the frequency? 3) Can it be locked from BIOS? Some BIOS setting changed? 4) Can it be fixed? Where should I start looking? What is new in coffee lake / the i9-9900 that is different from the usual Intel cpufreq approach?
After more testing: If I kldload cpuctl and run i7z it does appear frequency scaling is working for some default scaling setup (hover around 1200MHz-2000MHz but scale up to 5GHz under load). powerd does not seem to be able to tell the current frequency correctly (i7z can, and I have verified with basic benchmarks that performance matches i7z's output). when powerd is run with "-n maximum" it matches the above behaviour (~2GHz baseline and scale up under load, although it says it wants to go 7200MHz and IMO should be at 3600Mhz), then powerd -v drops to 800MHz under no load. this is "good enough" for me at the moment, as the default behaviour is what I'd like, but there seems be something wrong (scaling/multiplier?) with powerd/cpufreq.
Disable powerd and the system should turboboost just fine. powerd is functionally obsolescent / broken. The "3601/xxx" frequency level is "3.6GHz base clock + turboboost."
See also this work in progress: https://reviews.freebsd.org/D18028
Thank you for your comments Conrad. Despite the confusing feedback from powerd the system works fine as you said. I don't really need powerd functionality at the moment, but look forward to the work in progress making it into one of the next versions, as it would be nice to occasionally lock it to the max speed.