diff options
-rw-r--r-- | Makefile | 10 | ||||
-rw-r--r-- | README.md | 34 | ||||
-rw-r--r-- | aarch64/corefreq-cli.c | 35 | ||||
-rw-r--r-- | aarch64/corefreq-ui.c | 18 | ||||
-rw-r--r-- | aarch64/corefreq-ui.h | 2 | ||||
-rw-r--r-- | aarch64/corefreqd.c | 2 | ||||
-rw-r--r-- | aarch64/corefreqk.c | 24 | ||||
-rw-r--r-- | aarch64/coretypes.h | 4 | ||||
-rw-r--r-- | ckms.ini | 2 | ||||
-rw-r--r-- | dkms.conf | 2 | ||||
-rw-r--r-- | x86_64/corefreq-api.h | 43 | ||||
-rw-r--r-- | x86_64/corefreq-cli-json.c | 31 | ||||
-rw-r--r-- | x86_64/corefreq-cli-rsc-en.h | 13 | ||||
-rw-r--r-- | x86_64/corefreq-cli-rsc-fr.h | 18 | ||||
-rw-r--r-- | x86_64/corefreq-cli-rsc.c | 11 | ||||
-rw-r--r-- | x86_64/corefreq-cli-rsc.h | 11 | ||||
-rw-r--r-- | x86_64/corefreq-cli.c | 142 | ||||
-rw-r--r-- | x86_64/corefreq-ui.c | 18 | ||||
-rw-r--r-- | x86_64/corefreq-ui.h | 2 | ||||
-rw-r--r-- | x86_64/corefreq.h | 12 | ||||
-rw-r--r-- | x86_64/corefreqd.c | 401 | ||||
-rw-r--r-- | x86_64/corefreqk.c | 332 | ||||
-rw-r--r-- | x86_64/corefreqk.h | 30 | ||||
-rw-r--r-- | x86_64/coretypes.h | 18 | ||||
-rw-r--r-- | x86_64/intel_reg.h | 311 |
25 files changed, 1425 insertions, 101 deletions
@@ -97,6 +97,14 @@ ifneq ($(UI_TRANSPARENCY),) LAYOUT += -D UI_TRANSPARENCY=$(UI_TRANSPARENCY) endif +ifneq ($(UI_RULER_MINIMUM),) +LAYOUT += -D UI_RULER_MINIMUM=$(UI_RULER_MINIMUM) +endif + +ifneq ($(UI_RULER_MAXIMUM),) +LAYOUT += -D UI_RULER_MAXIMUM=$(UI_RULER_MAXIMUM) +endif + .PHONY: all all: prepare corefreqd corefreq-cli | prepare @if [ -e $(BUILD)/Makefile ]; then \ @@ -332,6 +340,8 @@ help: "| when <F> is 1: don't build and display this area part |\n"\ "| UI_TRANSPARENCY=<F> |\n"\ "| when <F> is 1: build with background transparency |\n"\ + "| UI_RULER_MINIMUM=<N>, UI_RULER_MAXIMUM=<N> |\n"\ + "| set ruler left or right bound to <N> frequency ratio |\n"\ "| |\n"\ "| Example: |\n"\ "| make CC=gcc OPTIM_LVL=3 FEAT_DBG=1 ARCH_PMC=PCU |\n"\ @@ -71,6 +71,7 @@ Uncomment and set `draw_bold_text_with_bright_colors: true` in `<config-file>` * Linux Kernel Header files to build modules * Mandatory : `CONFIG_MODULES, CONFIG_SMP, CONFIG_X86_MSR` * Optionally: `CONFIG_HOTPLUG_CPU, CONFIG_CPU_IDLE, CONFIG_CPU_FREQ, CONFIG_PM_SLEEP, CONFIG_DMI, CONFIG_HAVE_NMI, CONFIG_XEN, CONFIG_AMD_NB, CONFIG_SCHED_MUQSS, CONFIG_SCHED_BMQ, CONFIG_SCHED_PDS, CONFIG_SCHED_ALT, CONFIG_SCHED_BORE, CONFIG_CACHY, CONFIG_ACPI, CONFIG_ACPI_CPPC_LIB` + * Forbidden : `CONFIG_TRIM_UNUSED_KSYMS` 2. Clone the source code into a working directory. ```sh @@ -255,13 +256,42 @@ apt install dkms apt list git build-essential gawk fakeroot linux-headers* ``` -## Red Hat, CentOS, AlmaLinux +## Red Hat, CentOS * Development packages prerequisites. ```sh yum install kernel-devel yum group install "Development Tools" ``` +## AlmaLinux +```sh +## as root, install kernel development package and dependencies +dnf --assumeyes install kernel-devel gcc make git bc +``` +```sh +## as a User, build CoreFreq +cd CoreFreq +make -j +``` +```sh +## as root, install the binaries +make install +## and start Driver and Daemon +modprobe corefreqk +corefreqd +``` +```sh +## as a User, start the Client +corefreq-cli +``` +```sh +## Terminate Client, Daemon and unload Driver as root +modprobe -r corefreqk +## Proceed to uninstallation as root +cd CoreFreq +make uninstall +``` + ## openSUSE * Packages 1. [CoreFreq](https://software.opensuse.org/package/CoreFreq) official release @@ -557,6 +587,8 @@ o---------------------------------------------------------------o | when <F> is 1: don't build and display this area part | | UI_TRANSPARENCY=<F> | | when <F> is 1: build with background transparency | +| UI_RULER_MINIMUM=<N>, UI_RULER_MAXIMUM=<N> | +| set ruler left or right bound to <N> frequency ratio | | | | Example: | | make CC=gcc OPTIM_LVL=3 FEAT_DBG=1 ARCH_PMC=PCU | diff --git a/aarch64/corefreq-cli.c b/aarch64/corefreq-cli.c index bd057aa..6450016 100644 --- a/aarch64/corefreq-cli.c +++ b/aarch64/corefreq-cli.c @@ -216,12 +216,33 @@ void AggregateRatio(void) } InsertionSortRuler(Ruler.Uniq, Ruler.Count, BOOST(MIN)); + #ifndef UI_RULER_MINIMUM Ruler.Minimum = (double) lowest; + #elif (UI_RULER_MINIMUM > 0) && (UI_RULER_MINIMUM <= MAX_WIDTH) + Ruler.Minimum = (double) UI_RULER_MINIMUM; + #else + Ruler.Minimum = 1.0; + #endif + #ifndef UI_RULER_MAXIMUM Ruler.Maximum = (double) highest; - Ruler.Median = (double) RO(Shm)->Cpu[ - Ruler.Top[BOOST(ACT)] - ].Boost[BOOST(ACT)]; + #elif (UI_RULER_MAXIMUM > 0) && (UI_RULER_MAXIMUM <= MAX_WIDTH) + Ruler.Maximum = (double) UI_RULER_MAXIMUM; + #else + Ruler.Maximum = (double) MIN_WIDTH; + #endif + #if !defined(UI_RULER_MINIMUM) && !defined(UI_RULER_MAXIMUM) + { + const double median = (double) RO(Shm)->Cpu[ + Ruler.Top[BOOST(ACT)] + ].Boost[BOOST(ACT)]; + if ((median > Ruler.Minimum) && (median < Ruler.Maximum)) { + Ruler.Median = median; + } + } + #else + Ruler.Median = 0.0; + #endif if (Ruler.Median == 0.0) { Ruler.Median = (Ruler.Minimum + Ruler.Maximum) / 2.0; } @@ -13143,8 +13164,10 @@ void Layout_Ruler_Load(Layer *layer, CUINT row) /* Alternate the color of the frequency ratios */ while (idx--) - { - double fPos = (Ruler.Uniq[idx] * Draw.Area.LoadWidth) / Ruler.Maximum; + if (Ruler.Uniq[idx] <= Ruler.Maximum) + { + const double fPos = (Ruler.Uniq[idx] * Draw.Area.LoadWidth) + / Ruler.Maximum; CUINT hPos = (CUINT) fPos; ASCII tabStop[10+1] = "00"; @@ -13161,7 +13184,7 @@ void Layout_Ruler_Load(Layer *layer, CUINT row) bright = !bright; } lPos = hPos >= margin ? hPos - margin : margin; - } + } LayerCopyAt(layer, hLoad1.origin.col, hLoad1.origin.row, hLoad1.length, hLoad1.attr[Draw.Load], hLoad1.code[Draw.Load]); } diff --git a/aarch64/corefreq-ui.c b/aarch64/corefreq-ui.c index 34e40c0..0d67fc4 100644 --- a/aarch64/corefreq-ui.c +++ b/aarch64/corefreq-ui.c @@ -608,13 +608,21 @@ int GetKey(SCANKEY *scan, struct timespec *tsec) SCREEN_SIZE GetScreenSize(void) { - SCREEN_SIZE _screenSize = {.width = 0, .height = 0}; - struct winsize ts; + SCREEN_SIZE _screenSize = {.width = MIN_WIDTH, .height = MIN_HEIGHT}; - ioctl(STDIN_FILENO, TIOCGWINSZ, &ts); - _screenSize.width = (int) ts.ws_col; - _screenSize.height = (int) ts.ws_row; +#if defined(TIOCGWINSZ) + struct winsize ts; + if (ioctl(STDIN_FILENO, TIOCGWINSZ, &ts) >= 0) { + const int _col = (int) ts.ws_col, _row = (int) ts.ws_row; + if (_col > 0) { + _screenSize.width = _col; + } + if (_row > 0) { + _screenSize.height = _row; + } + } +#endif return _screenSize; } diff --git a/aarch64/corefreq-ui.h b/aarch64/corefreq-ui.h index 0cc91e6..91dac2a 100644 --- a/aarch64/corefreq-ui.h +++ b/aarch64/corefreq-ui.h @@ -35,6 +35,8 @@ + 3 /* SEPARATOR */ \ + 2 /* FOOTER_ROW */) +#define MIN_HEIGHT 24 + #define MAX_WIDTH 320 #define MIN_WIDTH 80 diff --git a/aarch64/corefreqd.c b/aarch64/corefreqd.c index 3c739e6..95ab2fe 100644 --- a/aarch64/corefreqd.c +++ b/aarch64/corefreqd.c @@ -475,7 +475,7 @@ static void *Child_Thread(void *arg) CALL_FUNC CallSliceFunc = (CALL_FUNC[2]){ CallWith_RDTSC_No_RDPMC, CallWith_RDTSC_RDPMC - }[ RO(Shm)->Proc.Features.PerfMon.FixCtrs == 2 ]; + }[ RO(Shm)->Proc.Features.PerfMon.CoreCycles > 0 ]; pthread_t tid = pthread_self(); cpu_set_t cpuset; diff --git a/aarch64/corefreqk.c b/aarch64/corefreqk.c index 536b982..37dd210 100644 --- a/aarch64/corefreqk.c +++ b/aarch64/corefreqk.c @@ -586,7 +586,6 @@ static void Query_Features(void *pArg) iArg->Features->PerfMon.Version = dfr0.PMUVer; if (iArg->Features->PerfMon.Version > 0) { iArg->Features->PerfMon.FixCtrs++; /* Fixed Cycle Counter */ - iArg->Features->PerfMon.FixCtrs++; /* Instruction Counter */ } /*TODO(Memory-mapped PMU register at offset 0xe00): pmcfgr */ iArg->Features->PerfMon.MonWidth = \ @@ -2532,6 +2531,8 @@ static void PerCore_GenericMachine(void *arg) { volatile CPUPWRCTLR cpuPwrCtl; volatile PMUSERENR pmuser; + volatile PMCNTENSET enset; + volatile PMCNTENCLR enclr; volatile REVIDR revid; CORE_RO *Core = (CORE_RO *) arg; @@ -2548,15 +2549,23 @@ static void PerCore_GenericMachine(void *arg) } __asm__ __volatile__( "mrs %[pmuser], pmuserenr_el0" "\n\t" + "mrs %[enset], pmcntenset_el0" "\n\t" + "mrs %[enclr], pmcntenclr_el0" "\n\t" "isb" - : [pmuser] "=r" (pmuser) + : [pmuser] "=r" (pmuser), + [enset] "=r" (enset), + [enclr] "=r" (enclr) : : "memory" ); if (Core->Bind == PUBLIC(RO(Proc))->Service.Core) { - PUBLIC(RO(Proc))->Features.PerfMon.CoreCycles = pmuser.CR; - PUBLIC(RO(Proc))->Features.PerfMon.InstrRetired = pmuser.IR; + PUBLIC(RO(Proc))->Features.PerfMon.CoreCycles = pmuser.CR + | enset.C + | enclr.C; + PUBLIC(RO(Proc))->Features.PerfMon.InstrRetired = pmuser.IR + | enset.F0 + | enclr.F0; } __asm__ __volatile__( "mrs %[revid], revidr_el1" "\n\t" @@ -3896,7 +3905,8 @@ static int CoreFreqK_FreqDriver_UnInit(void) { int rc = -EINVAL; #ifdef CONFIG_CPU_FREQ -#if (LINUX_VERSION_CODE < KERNEL_VERSION(6, 3, 0)) && (!defined(CONFIG_CACHY)) +#if (LINUX_VERSION_CODE < KERNEL_VERSION(6, 3, 0)) && (!defined(CONFIG_CACHY)) \ + && (!defined(RHEL_MAJOR)) rc = #else rc = 0; @@ -5348,7 +5358,7 @@ inline void SMBIOS_Decoder(void) #endif /* CONFIG_DMI */ } -#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 2, 0) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 2, 0) || (RHEL_MAJOR >= 9) static char *CoreFreqK_DevNode(const struct device *dev, umode_t *mode) #else static char *CoreFreqK_DevNode(struct device *dev, umode_t *mode) @@ -5492,7 +5502,7 @@ static int CoreFreqK_Create_Device_Level_Up(INIT_ARG *pArg) struct device *tmpDev; UNUSED(pArg); -#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 4, 0) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 4, 0) || (RHEL_MAJOR >= 9) CoreFreqK.clsdev = class_create(DRV_DEVNAME); #else CoreFreqK.clsdev = class_create(THIS_MODULE, DRV_DEVNAME); diff --git a/aarch64/coretypes.h b/aarch64/coretypes.h index 3fcf0de..303fa28 100644 --- a/aarch64/coretypes.h +++ b/aarch64/coretypes.h @@ -5,8 +5,8 @@ */ #define COREFREQ_MAJOR 1 -#define COREFREQ_MINOR 97 -#define COREFREQ_REV 1 +#define COREFREQ_MINOR 98 +#define COREFREQ_REV 0 #if !defined(CORE_COUNT) #define CORE_COUNT 256 @@ -6,7 +6,7 @@ # [general] name = corefreqk -version = 1.97 +version = 1.98 strip = yes make = gmake initramfs = no @@ -5,7 +5,7 @@ AUTOINSTALL="yes" ## REMAKE_INITRD="no" DRV_PATH=/updates -DRV_VERSION=1.97 +DRV_VERSION=1.98 PACKAGE_NAME="corefreqk" PACKAGE_VERSION="$DRV_VERSION" BUILT_MODULE_NAME[0]="corefreqk" diff --git a/x86_64/corefreq-api.h b/x86_64/corefreq-api.h index 9502aff..bcceefd 100644 --- a/x86_64/corefreq-api.h +++ b/x86_64/corefreq-api.h @@ -599,6 +599,19 @@ typedef struct /* E4C0h */ ADL_IMC_SREXITTP SRExit; /* 64 bits */ } ADL; struct { + /* E000h */ MTL_IMC_CR_TC_PRE Timing; /* 64 bits */ + /* E138h */ MTL_IMC_CR_TC_ACT ACT; /* 64 bits */ + /* E00Ch */ MTL_IMC_CR_TC_RDRD RDRD; /* 32 bits */ + /* E010h */ MTL_IMC_CR_TC_RDWR RDWR; /* 32 bits */ + /* E014h */ MTL_IMC_CR_TC_WRRD WRRD; /* 32 bits */ + /* E018h */ MTL_IMC_CR_TC_WRWR WRWR; /* 32 bits */ + /* E050h */ MTL_IMC_TC_PWDEN PWDEN; /* 64-bits */ + /* E070h */ MTL_IMC_CR_TC_ODT ODT; /* 64 bits */ + /* E088h */ MTL_IMC_SC_GS_CFG Sched; /* 64 bits */ + /* E4A0h */ MTL_IMC_REFRESH_TC Refresh; /*64 bits */ + /* E4C0h */ MTL_IMC_SREXITTP SRExit; /* 64 bits */ + } MTL; + struct { /* 88h */ AMD_0F_DRAM_TIMING_LOW DTRL; /* 32 bits */ } AMD0Fh; struct @@ -730,6 +743,13 @@ typedef struct /* D810h */ MADD1; /* 32 bits */ } ADL; struct { + /* D800h */ MTL_IMC_MAD_MAPPING MADCH; /* 32 bits */ + /* D804h */ MTL_IMC_MAD_CHANNEL MADC0, /* 32 bits */ + /* D808h */ MADC1; /* 32 bits */ + /* D80Ch */ MTL_IMC_MAD_DIMM MADD0, /* 32 bits */ + /* D810h */ MADD1; /* 32 bits */ + } MTL; + struct { /* 90h */ AMD_0F_DRAM_CONFIG_LOW DCRL; /* 32 bits */ /* 94h */ AMD_0F_DRAM_CONFIG_HIGH DCRH; /* 32 bits */ } AMD0Fh; @@ -794,8 +814,15 @@ typedef struct ADL_SA_PERF_STATUS ADL_SA_Pll; }; struct { - GKL_CAPID_A GKL_Cap_A; - GKL_CAPID_B GKL_Cap_B; + GLK_CAPID_A GLK_Cap_A; + GLK_CAPID_B GLK_Cap_B; + }; + struct { + MTL_CAPID_A MTL_Cap_A; + MTL_CAPID_B MTL_Cap_B; + MTL_CAPID_C MTL_Cap_C; + MTL_CAPID_E MTL_Cap_E; + MTL_SA_PERF_STATUS MTL_SA_Pll; }; struct { AMD_0F_HTT_NODE_ID NodeID; @@ -1479,9 +1506,15 @@ typedef struct #define DID_INTEL_RAPTORLAKE_B760_PCH 0x7a06 /* Source: Intel(R) Pentium(R) Silver N5000 CPU @ 1.10GHz */ #define DID_INTEL_GEMINILAKE_HB 0x31f0 -/* Source: Meteor Lake kernel preview: Intel(R) Core(TM) Ultra 7 1003H */ -#define DID_INTEL_METEORLAKE_M_6_8_2_HB 0x7d01 -#define DID_INTEL_METEORLAKE_PCH 0x7e02 +/* Source: Meteor Lake: Intel Core Ultra Processor Datasheet, Vol 1 */ +#define DID_INTEL_METEORLAKE_UT4_2_8_2_HB 0x7d00 +#define DID_INTEL_METEORLAKE_H_6_8_2_HB 0x7d01 +#define DID_INTEL_METEORLAKE_U_2_8_2_HB 0x7d02 +#define DID_INTEL_METEORLAKE_H_4_8_2_HB 0x7d14 +#define DID_INTEL_METEORLAKE_U_2_4_2_HB 0x7d16 +#define DID_INTEL_METEORLAKE_H_PCH 0x7e02 +#define DID_INTEL_METEORLAKE_U_PCH 0x7e03 +#define DID_INTEL_METEORLAKE_UT4_PCH 0x7e07 /* Source: /include/linux/pci_ids.h */ #define DID_AMD_K8_NB_MEMCTL 0x1102 #define DID_AMD_K8_NB 0x1100 diff --git a/x86_64/corefreq-cli-json.c b/x86_64/corefreq-cli-json.c index f6a7de7..c7ebe1a 100644 --- a/x86_64/corefreq-cli-json.c +++ b/x86_64/corefreq-cli-json.c @@ -1400,9 +1400,20 @@ void JsonSysInfo(RO(SHM_STRUCT) *RO(Shm)) } json_end_object(&s); } - json_key(&s, "FactoryFreq"); - json_literal(&s, "%u", RO(Shm)->Proc.Features.Factory.Freq); + json_key(&s, "Factory"); + { + json_start_object(&s); + json_key(&s, "Freq"); + json_literal(&s, "%u", RO(Shm)->Proc.Features.Factory.Freq); + json_key(&s, "Ratio"); + json_literal(&s, "%u", RO(Shm)->Proc.Features.Factory.Ratio); + json_key(&s, "Bins"); + json_literal(&s, "%u", RO(Shm)->Proc.Features.Factory.Bins); + json_key(&s, "Overclock"); + json_literal(&s, "%u", RO(Shm)->Proc.Features.Factory.Overclock); + json_end_object(&s); + } json_key(&s, "InvariantTSC"); json_literal(&s, "%u", RO(Shm)->Proc.Features.InvariantTSC); json_key(&s, "HyperThreading"); @@ -1449,6 +1460,10 @@ void JsonSysInfo(RO(SHM_STRUCT) *RO(Shm)) json_literal(&s, "%u", RO(Shm)->Proc.Features.SpecTurboRatio); json_key(&s, "XtraCOF"); json_literal(&s, "%u", RO(Shm)->Proc.Features.XtraCOF); + json_key(&s, "OC_Enable"); + json_literal(&s, "%u", RO(Shm)->Proc.Features.OC_Enable); + json_key(&s, "OC_Lock"); + json_literal(&s, "%u", RO(Shm)->Proc.Features.OC_Lock); json_end_object(&s); } @@ -1531,6 +1546,18 @@ void JsonSysInfo(RO(SHM_STRUCT) *RO(Shm)) json_literal(&s, "%llu", RO(Shm)->Proc.Technology.L2_UpDown_Pf); json_key(&s, "LLC_Streamer"); json_literal(&s, "%llu", RO(Shm)->Proc.Technology.LLC_Streamer); + json_key(&s, "VMD"); + json_literal(&s, "%llu", RO(Shm)->Proc.Technology.VMD); + json_key(&s, "GNA"); + json_literal(&s, "%llu", RO(Shm)->Proc.Technology.GNA); + json_key(&s, "HDCP"); + json_literal(&s, "%llu", RO(Shm)->Proc.Technology.HDCP); + json_key(&s, "IPU"); + json_literal(&s, "%llu", RO(Shm)->Proc.Technology.IPU); + json_key(&s, "VPU"); + json_literal(&s, "%llu", RO(Shm)->Proc.Technology.VPU); + json_key(&s, "OC"); + json_literal(&s, "%llu", RO(Shm)->Proc.Technology.OC); json_end_object(&s); } diff --git a/x86_64/corefreq-cli-rsc-en.h b/x86_64/corefreq-cli-rsc-en.h index 81d107a..5561fdb 100644 --- a/x86_64/corefreq-cli-rsc-en.h +++ b/x86_64/corefreq-cli-rsc-en.h @@ -854,6 +854,8 @@ #define RSC_FREQUENCY_CODE_EN "Frequency" #define RSC_RATIO_CODE_EN "Ratio" #define RSC_FACTORY_CODE_EN "Factory" +#define RSC_OVERCLOCK_CODE_EN "Overclock" +#define RSC_OC_BINS_COMM_CODE_EN " OC_BINS [0:disabled ... 7:unlimited] " #define RSC_PERFORMANCE_CODE_EN "Performance" #define RSC_TARGET_CODE_EN "Target" #define RSC_LEVEL_CODE_EN "Level" @@ -1241,6 +1243,12 @@ #define RSC_TECHNOLOGIES_R2H_CODE_EN "Race To Halt Optimization" #define RSC_TECHNOLOGIES_HYPERV_CODE_EN "Hypervisor" #define RSC_TECHNOLOGIES_WDT_CODE_EN "Watchdog Timer" +#define RSC_TECHNOLOGIES_VMD_CODE_EN "Volume Management Device" +#define RSC_TECHNOLOGIES_GNA_CODE_EN "Gaussian & Neural Accelerator" +#define RSC_TECHNOLOGIES_HDCP_CODE_EN "Digital Content Protection" +#define RSC_TECHNOLOGIES_IPU_CODE_EN "Image Processing Unit" +#define RSC_TECHNOLOGIES_VPU_CODE_EN "Vision Processing Unit" +#define RSC_TECHNOLOGIES_OC_CODE_EN "Overclocking" #define RSC_TECH_AMD_CPB_COMM_CODE_EN " Hardware Configuration::CpbDis " #define RSC_TECH_INTEL_EEO_COMM_CODE_EN " Skylake::Power Control::EEO_Disable " @@ -1253,6 +1261,8 @@ #define RSC_TECH_INTEL_VMX_COMM_CODE_EN " Intel Virtual Machine Extensions " #define RSC_TECH_INTEL_VTD_COMM_CODE_EN " I/O MMU virtualization (Intel VT-d) " #define RSC_TECH_AMD_V_COMM_CODE_EN " I/O MMU virtualization (AMD-Vi) " +#define RSC_TECH_HDCP_COMM_CODE_EN " High-Bandwidth Digital Content Protection " +#define RSC_TECH_OC_COMM_CODE_EN " If OC_ENABLED then MSR FLEX_RATIO.OC_BINS " #define RSC_PERF_MON_TITLE_CODE_EN " Performance Monitoring " #define RSC_PERF_CAPS_TITLE_CODE_EN " Performance Capabilities " @@ -2327,11 +2337,12 @@ #define RSC_PPIN_CODE "PPIN#" #define RSC_PSTATE_CODE "P-State" #define RSC_UNCORE_CODE "Uncore" -#define RSC_BOOST_CODE "Turbo Boost" +#define RSC_BOOST_CODE "Boost" #define RSC_TURBO_CODE "Turbo" #define RSC_CPPC_CODE "CPPC" #define RSC_MAX_CODE "Max" #define RSC_MIN_CODE "Min" +#define RSC_BIN_CODE "Bin" #define RSC_UCLK_CODE "CLK" #define RSC_MCLK_CODE "MEM" #define RSC_TGT_CODE "TGT" diff --git a/x86_64/corefreq-cli-rsc-fr.h b/x86_64/corefreq-cli-rsc-fr.h index 3f30416..bc236e3 100644 --- a/x86_64/corefreq-cli-rsc-fr.h +++ b/x86_64/corefreq-cli-rsc-fr.h @@ -357,6 +357,10 @@ do echo -en "$h$l\t""\xc3""\x$h$l""\t"; done; done;echo #define RSC_FREQUENCY_CODE_FR "Fr""\xa9""quence" #define RSC_RATIO_CODE_FR "Ratio" #define RSC_FACTORY_CODE_FR "Usine" +#define RSC_OVERCLOCK_CODE_FR "Overclock" +#define RSC_OC_BINS_COMM_CODE_FR \ + " OC_BINS [0:d""\xa9""sactiv""\xa9"" ... 7:illimit""\xa9""] " + #define RSC_PERFORMANCE_CODE_FR "Performance" #define RSC_TARGET_CODE_FR "Cible" #define RSC_LEVEL_CODE_FR "Niveau" @@ -715,6 +719,18 @@ do echo -en "$h$l\t""\xc3""\x$h$l""\t"; done; done;echo #define RSC_TECHNOLOGIES_R2H_CODE_FR "Optimisation Race To Halt" #define RSC_TECHNOLOGIES_HYPERV_CODE_FR "Hyperviseur" #define RSC_TECHNOLOGIES_WDT_CODE_FR "Compteur Watchdog" +#define RSC_TECHNOLOGIES_VMD_CODE_FR \ + "P""\xa9""riph""\xa9""rique de gestion de volume" + +#define RSC_TECHNOLOGIES_GNA_CODE_FR \ + "Acc""\xa9""l""\xa9""rateur Gaussien & Neuronal" + +#define RSC_TECHNOLOGIES_HDCP_CODE_FR \ + "Protection des contenus num""\xa9""riques" + +#define RSC_TECHNOLOGIES_IPU_CODE_FR "Unit""\xa9"" de traitement d'images" +#define RSC_TECHNOLOGIES_VPU_CODE_FR "Unit""\xa9"" de traitement visuel" +#define RSC_TECHNOLOGIES_OC_CODE_FR "Surcaden""\xa7""age" #define RSC_TECH_AMD_CPB_COMM_CODE_FR RSC_TECH_AMD_CPB_COMM_CODE_EN #define RSC_TECH_INTEL_EEO_COMM_CODE_FR RSC_TECH_INTEL_EEO_COMM_CODE_EN @@ -727,6 +743,8 @@ do echo -en "$h$l\t""\xc3""\x$h$l""\t"; done; done;echo #define RSC_TECH_AMD_SVM_COMM_CODE_FR RSC_TECH_AMD_SVM_COMM_CODE_EN #define RSC_TECH_INTEL_VTD_COMM_CODE_FR RSC_TECH_INTEL_VTD_COMM_CODE_EN #define RSC_TECH_AMD_V_COMM_CODE_FR RSC_TECH_AMD_V_COMM_CODE_EN +#define RSC_TECH_HDCP_COMM_CODE_FR RSC_TECH_HDCP_COMM_CODE_EN +#define RSC_TECH_OC_COMM_CODE_FR " Si OC_ENABLED alors MSR FLEX_RATIO.OC_BINS " #define RSC_PERF_MON_TITLE_CODE_FR " Gestion de la performance " #define RSC_PERF_CAPS_TITLE_CODE_FR " Capacit""\xa9""s de performances " diff --git a/x86_64/corefreq-cli-rsc.c b/x86_64/corefreq-cli-rsc.c index 9eb95a2..07a0e78 100644 --- a/x86_64/corefreq-cli-rsc.c +++ b/x86_64/corefreq-cli-rsc.c @@ -553,6 +553,8 @@ RESOURCE_ST Resource[] = { LDT(RSC_FREQUENCY), LDT(RSC_RATIO), LDT(RSC_FACTORY), + LDT(RSC_OVERCLOCK), + LDT(RSC_OC_BINS_COMM), LDT(RSC_PERFORMANCE), LDT(RSC_TARGET), LDT(RSC_LEVEL), @@ -581,6 +583,7 @@ RESOURCE_ST Resource[] = { LDQ(RSC_CPPC), LDQ(RSC_MAX), LDQ(RSC_MIN), + LDQ(RSC_BIN), LDQ(RSC_UCLK), LDQ(RSC_MCLK), LDQ(RSC_TGT), @@ -1151,6 +1154,14 @@ RESOURCE_ST Resource[] = { LDQ(RSC_TECH_HYPERV_KBOX), LDQ(RSC_TECH_HYPERV_VMWARE), LDQ(RSC_TECH_HYPERV_HYPERV), + LDT(RSC_TECHNOLOGIES_VMD), + LDT(RSC_TECHNOLOGIES_GNA), + LDT(RSC_TECHNOLOGIES_HDCP), + LDT(RSC_TECH_HDCP_COMM), + LDT(RSC_TECHNOLOGIES_IPU), + LDT(RSC_TECHNOLOGIES_VPU), + LDT(RSC_TECHNOLOGIES_OC), + LDT(RSC_TECH_OC_COMM), LDT(RSC_PERF_MON_TITLE), LDT(RSC_PERF_CAPS_TITLE), LDT(RSC_VERSION), diff --git a/x86_64/corefreq-cli-rsc.h b/x86_64/corefreq-cli-rsc.h index f3fb00a..7a8efc1 100644 --- a/x86_64/corefreq-cli-rsc.h +++ b/x86_64/corefreq-cli-rsc.h @@ -356,6 +356,8 @@ enum { RSC_FREQUENCY, RSC_RATIO, RSC_FACTORY, + RSC_OVERCLOCK, + RSC_OC_BINS_COMM, RSC_PERFORMANCE, RSC_TARGET, RSC_LEVEL, @@ -384,6 +386,7 @@ enum { RSC_CPPC, RSC_MAX, RSC_MIN, + RSC_BIN, RSC_UCLK, RSC_MCLK, RSC_TGT, @@ -954,6 +957,14 @@ enum { RSC_TECH_HYPERV_KBOX, RSC_TECH_HYPERV_VMWARE, RSC_TECH_HYPERV_HYPERV, + RSC_TECHNOLOGIES_VMD, + RSC_TECHNOLOGIES_GNA, + RSC_TECHNOLOGIES_HDCP, + RSC_TECH_HDCP_COMM, + RSC_TECHNOLOGIES_IPU, + RSC_TECHNOLOGIES_VPU, + RSC_TECHNOLOGIES_OC, + RSC_TECH_OC_COMM, RSC_PERF_MON_TITLE, RSC_PERF_CAPS_TITLE, RSC_VERSION, diff --git a/x86_64/corefreq-cli.c b/x86_64/corefreq-cli.c index 626b090..a8d0464 100644 --- a/x86_64/corefreq-cli.c +++ b/x86_64/corefreq-cli.c @@ -216,12 +216,33 @@ void AggregateRatio(void) } InsertionSortRuler(Ruler.Uniq, Ruler.Count, BOOST(MIN)); + #ifndef UI_RULER_MINIMUM Ruler.Minimum = (double) lowest; + #elif (UI_RULER_MINIMUM > 0) && (UI_RULER_MINIMUM <= MAX_WIDTH) + Ruler.Minimum = (double) UI_RULER_MINIMUM; + #else + Ruler.Minimum = 1.0; + #endif + #ifndef UI_RULER_MAXIMUM Ruler.Maximum = (double) highest; - Ruler.Median = (double) RO(Shm)->Cpu[ - Ruler.Top[BOOST(ACT)] - ].Boost[BOOST(ACT)]; + #elif (UI_RULER_MAXIMUM > 0) && (UI_RULER_MAXIMUM <= MAX_WIDTH) + Ruler.Maximum = (double) UI_RULER_MAXIMUM; + #else + Ruler.Maximum = (double) MIN_WIDTH; + #endif + #if !defined(UI_RULER_MINIMUM) && !defined(UI_RULER_MAXIMUM) + { + const double median = (double) RO(Shm)->Cpu[ + Ruler.Top[BOOST(ACT)] + ].Boost[BOOST(ACT)]; + if ((median > Ruler.Minimum) && (median < Ruler.Maximum)) { + Ruler.Median = median; + } + } + #else + Ruler.Median = 0.0; + #endif if (Ruler.Median == 0.0) { Ruler.Median = (Ruler.Minimum + Ruler.Maximum) / 2.0; } @@ -1349,10 +1370,23 @@ REASON_CODE SysInfoProc(Window *win, 23, hSpace, RO(Shm)->Proc.Features.Factory.Ratio ), RefreshFactoryFreq ); + if (RO(Shm)->Proc.Features.OC_Enable) + { + PUT( SCANKEY_NULL, attrib[!RO(Shm)->Proc.Features.OC_Lock], + width, 2, "%s%.*s[%7.*s]", RSC(OVERCLOCK).CODE(), + width - 12 - RSZ(OVERCLOCK), hSpace, 6, + RO(Shm)->Proc.Features.OC_Lock ? + RSC(LOCK).CODE() : RSC(UNLOCK).CODE() ); + + GridHover( PUT( SCANKEY_NULL, attrib[3], width, 0, + "%.*s""%s""%.*s""%+5d""%.*s""[%+4d ]", + 17, hSpace, RSC(BIN).CODE(), + 2, hSpace, RO(Shm)->Proc.Features.Factory.Overclock, + 23, hSpace, RO(Shm)->Proc.Features.Factory.Bins ), + (char *) RSC(OC_BINS_COMM).CODE() ); + } PUT(SCANKEY_NULL, attrib[0], width, 2, "%s", RSC(PERFORMANCE).CODE()); - PUT(SCANKEY_NULL, attrib[0], width, 3, "%s", RSC(PSTATE).CODE()); - coreClock = (CLOCK_ARG) {.NC = 0, .Offset = 0}; coreClock.NC = BOXKEY_RATIO_CLOCK_OR | CLOCK_MOD_TGT; @@ -1436,15 +1470,17 @@ REASON_CODE SysInfoProc(Window *win, width, OutFunc, cellPadding, attrib[3] ), RefreshTopFreq, BOOST(HWP_TGT) ); } - PUT( SCANKEY_NULL, attrib[RO(Shm)->Proc.Features.Turbo_Unlock], - width, 2, "%s%.*s[%7.*s]", RSC(BOOST).CODE(), - width - 12 - RSZ(BOOST), hSpace, 6, - RO(Shm)->Proc.Features.Turbo_Unlock ? - RSC(UNLOCK).CODE() : RSC(LOCK).CODE() ); - if ((RO(Shm)->Proc.Features.Info.Vendor.CRC == CRC_AMD) || (RO(Shm)->Proc.Features.Info.Vendor.CRC == CRC_HYGON)) { + if (RO(Shm)->Proc.Technology.Turbo == 1) + { + PUT( SCANKEY_NULL, attrib[RO(Shm)->Proc.Features.Turbo_Unlock], + width, 3, "%s%.*s[%7.*s]", RSC(BOOST).CODE(), + width - (OutFunc == NULL ? 15 : 13) - RSZ(BOOST), hSpace, 6, + RO(Shm)->Proc.Features.Turbo_Unlock ? + RSC(UNLOCK).CODE() : RSC(LOCK).CODE() ); + } if (RO(Shm)->Proc.Features.XtraCOF >= 2) { CFlop = &RO(Shm)->Cpu[ @@ -1479,8 +1515,15 @@ REASON_CODE SysInfoProc(Window *win, width, OutFunc, cellPadding, attrib[3] ), RefreshTopFreq, BOOST(CPB) ); } + PUT(SCANKEY_NULL, attrib[0], width, 3, "%s", RSC(PSTATE).CODE()); + } else { + PUT( SCANKEY_NULL, attrib[RO(Shm)->Proc.Features.Turbo_Unlock], + width, 2, "%s %s%.*s[%7.*s]", + RSC(TURBO).CODE(), RSC(BOOST).CODE(), + width - 13 - RSZ(TURBO) - RSZ(BOOST), hSpace, 6, + RO(Shm)->Proc.Features.Turbo_Unlock ? + RSC(UNLOCK).CODE() : RSC(LOCK).CODE() ); } - for(boost = BOOST(1C), activeCores = 1; boost > BOOST(1C)-(enum RATIO_BOOST)RO(Shm)->Proc.Features.SpecTurboRatio; boost--, activeCores++) @@ -1491,8 +1534,13 @@ REASON_CODE SysInfoProc(Window *win, RO(Shm)->Proc.Service.Core : Ruler.Top[boost]; char pfx[10+1+1]; + if ((RO(Shm)->Proc.Features.Info.Vendor.CRC == CRC_AMD) + || (RO(Shm)->Proc.Features.Info.Vendor.CRC == CRC_HYGON)) + { + StrFormat(pfx, 10+1+1, "P%-2u", activeCores); + } else { StrFormat(pfx, 10+1+1, "%2uC", activeCores); - + } CFlop = &RO(Shm)->Cpu[primary].FlipFlop[!RO(Shm)->Cpu[primary].Toggle]; GridCall( PrintRatioFreq(win, CFlop, @@ -4389,6 +4437,66 @@ REASON_CODE SysInfoTech(Window *win, : (char*) RSC(NOT_AVAILABLE).CODE(), SCANKEY_NULL, NULL + }, + { + (unsigned int[]) { CRC_INTEL, 0 }, + RO(Shm)->Proc.Technology.VMD == 1, + 2, "%s%.*sVMD [%3s]", + RSC(TECHNOLOGIES_VMD).CODE(), NULL, + width - 14 - RSZ(TECHNOLOGIES_VMD), + NULL, + SCANKEY_NULL, + NULL + }, + { + (unsigned int[]) { CRC_INTEL, 0 }, + RO(Shm)->Proc.Technology.GNA == 1, + 2, "%s%.*sGNA [%3s]", + RSC(TECHNOLOGIES_GNA).CODE(), NULL, + width - 14 - RSZ(TECHNOLOGIES_GNA), + NULL, + SCANKEY_NULL, + NULL + }, + { + (unsigned int[]) { CRC_INTEL, 0 }, + RO(Shm)->Proc.Technology.HDCP == 1, + 2, "%s%.*sHDCP [%3s]", + RSC(TECHNOLOGIES_HDCP).CODE(), RSC(TECH_HDCP_COMM).CODE(), + width - 15 - RSZ(TECHNOLOGIES_HDCP), + NULL, + SCANKEY_NULL, + NULL + }, + { + (unsigned int[]) { CRC_INTEL, 0 }, + RO(Shm)->Proc.Technology.IPU == 1, + 2, "%s%.*sIPU [%3s]", + RSC(TECHNOLOGIES_IPU).CODE(), NULL, + width - 14 - RSZ(TECHNOLOGIES_IPU), + NULL, + SCANKEY_NULL, + NULL + }, + { + (unsigned int[]) { CRC_INTEL, 0 }, + RO(Shm)->Proc.Technology.VPU == 1, + 2, "%s%.*sVPU [%3s]", + RSC(TECHNOLOGIES_VPU).CODE(), NULL, + width - 14 - RSZ(TECHNOLOGIES_VPU), + NULL, + SCANKEY_NULL, + NULL + }, + { + (unsigned int[]) { CRC_INTEL, 0 }, + RO(Shm)->Proc.Technology.OC == 1, + 2, "%s%.*sOC [%3s]", + RSC(TECHNOLOGIES_OC).CODE(), RSC(TECH_OC_COMM).CODE(), + width - 13 - RSZ(TECHNOLOGIES_OC), + NULL, + SCANKEY_NULL, + NULL } }; size_t idx; @@ -17651,8 +17759,10 @@ void Layout_Ruler_Load(Layer *layer, CUINT row) /* Alternate the color of the frequency ratios */ while (idx--) - { - double fPos = (Ruler.Uniq[idx] * Draw.Area.LoadWidth) / Ruler.Maximum; + if (Ruler.Uniq[idx] <= Ruler.Maximum) + { + const double fPos = (Ruler.Uniq[idx] * Draw.Area.LoadWidth) + / Ruler.Maximum; CUINT hPos = (CUINT) fPos; ASCII tabStop[10+1] = "00"; @@ -17669,7 +17779,7 @@ void Layout_Ruler_Load(Layer *layer, CUINT row) bright = !bright; } lPos = hPos >= margin ? hPos - margin : margin; - } + } LayerCopyAt(layer, hLoad1.origin.col, hLoad1.origin.row, hLoad1.length, hLoad1.attr[Draw.Load], hLoad1.code[Draw.Load]); } diff --git a/x86_64/corefreq-ui.c b/x86_64/corefreq-ui.c index 34e40c0..0d67fc4 100644 --- a/x86_64/corefreq-ui.c +++ b/x86_64/corefreq-ui.c @@ -608,13 +608,21 @@ int GetKey(SCANKEY *scan, struct timespec *tsec) SCREEN_SIZE GetScreenSize(void) { - SCREEN_SIZE _screenSize = {.width = 0, .height = 0}; - struct winsize ts; + SCREEN_SIZE _screenSize = {.width = MIN_WIDTH, .height = MIN_HEIGHT}; - ioctl(STDIN_FILENO, TIOCGWINSZ, &ts); - _screenSize.width = (int) ts.ws_col; - _screenSize.height = (int) ts.ws_row; +#if defined(TIOCGWINSZ) + struct winsize ts; + if (ioctl(STDIN_FILENO, TIOCGWINSZ, &ts) >= 0) { + const int _col = (int) ts.ws_col, _row = (int) ts.ws_row; + if (_col > 0) { + _screenSize.width = _col; + } + if (_row > 0) { + _screenSize.height = _row; + } + } +#endif return _screenSize; } |