@@ -3829,6 +3829,7 @@ void HWP_Update(TGrid *grid, DATA_TYPE data[])
38293829
38303830void Refresh_HWP_Cap_Freq(TGrid *grid, DATA_TYPE data[])
38313831{
3832+ char *item;
38323833 ATTRIBUTE *HWP_Cap_Attr[2] = {
38333834 RSC(SYSINFO_PERFMON_HWP_CAP_COND0).ATTR(),
38343835 RSC(SYSINFO_PERFMON_HWP_CAP_COND1).ATTR()
@@ -3838,7 +3839,46 @@ void Refresh_HWP_Cap_Freq(TGrid *grid, DATA_TYPE data[])
38383839
38393840 memcpy(grid->cell.attr, HWP_Cap_Attr[bix], grid->cell.length);
38403841
3841- RefreshRatioFreq(grid, data);
3842+ if ((item = malloc(grid->cell.length + 1)) != NULL)
3843+ {
3844+ const unsigned int cpu = data[0].uint[0];
3845+ CPU_STRUCT *SProc = &RO(Shm)->Cpu[cpu];
3846+ struct FLIP_FLOP *CFlop = &SProc->FlipFlop[!RO(Shm)->Cpu[cpu].Toggle];
3847+
3848+ double Lowest_MHz = ABS_FREQ_MHz(double,
3849+ SProc->PowerThermal.HWP.Capabilities.Lowest,
3850+ CFlop->Clock
3851+ ),
3852+ Efficient_MHz = ABS_FREQ_MHz(double,
3853+ SProc->PowerThermal.HWP.Capabilities.Most_Efficient,
3854+ CFlop->Clock
3855+ ),
3856+ Guaranteed_MHz = ABS_FREQ_MHz(double,
3857+ SProc->PowerThermal.HWP.Capabilities.Guaranteed,
3858+ CFlop->Clock
3859+ ),
3860+ Highest_MHz = ABS_FREQ_MHz(double,
3861+ SProc->PowerThermal.HWP.Capabilities.Highest,
3862+ CFlop->Clock
3863+ );
3864+
3865+ size_t length;
3866+ if (StrLenFormat(length, item, grid->cell.length + 1,
3867+ "CPU #%-3u %7.2f (%3u) %7.2f (%3u) %7.2f (%3u) %7.2f (%3u)",
3868+ cpu,
3869+ Lowest_MHz,
3870+ SProc->PowerThermal.HWP.Capabilities.Lowest,
3871+ Efficient_MHz,
3872+ SProc->PowerThermal.HWP.Capabilities.Most_Efficient,
3873+ Guaranteed_MHz,
3874+ SProc->PowerThermal.HWP.Capabilities.Guaranteed,
3875+ Highest_MHz,
3876+ SProc->PowerThermal.HWP.Capabilities.Highest) > 0)
3877+ {
3878+ memcpy(&grid->cell.item[3], item, length);
3879+ }
3880+ free(item);
3881+ }
38423882}
38433883
38443884void HDC_Update(TGrid *grid, DATA_TYPE data[])
@@ -4098,111 +4138,6 @@ REASON_CODE SysInfoPerfMon(Window *win, CUINT width, CELL_FUNC OutFunc)
40984138 "%s%.*s%s [%3s]", RSC(PERF_MON_HWCF).CODE(),
40994139 width - 26 - RSZ(PERF_MON_HWCF), hSpace,
41004140 RSC(PERF_LABEL_HWCF).CODE(), ENABLED(bix) );
4101- /* Section Mark */
4102- if ( (RO(Shm)->Proc.Features.Info.Vendor.CRC == CRC_AMD)
4103- || (RO(Shm)->Proc.Features.Info.Vendor.CRC == CRC_HYGON) )
4104- {
4105- PUT(SCANKEY_NULL, attrib[RO(Shm)->Proc.Features.OSPM_CPC], width, 2,
4106- "%s%.*s%s [%3s]", RSC(PERF_MON_CPC).CODE(),
4107- width - 19 - RSZ(PERF_MON_CPC), hSpace,
4108- RSC(PERF_LABEL_CPC).CODE(),
4109- ENABLED(RO(Shm)->Proc.Features.OSPM_CPC));
4110- }
4111- bix = (RO(Shm)->Proc.Features.Power.EAX.HWP_Reg == 1) /* Intel:HWP */
4112- || (RO(Shm)->Proc.Features.leaf80000008.EBX.CPPC == 1) /* AMD:CPPC */
4113- || (RO(Shm)->Proc.Features.ACPI_CPPC == 1); /* ACPI:CPPC */
4114- if (bix)
4115- {
4116- CPU_STRUCT *SProc = &RO(Shm)->Cpu[RO(Shm)->Proc.Service.Core];
4117- struct FLIP_FLOP *CFlop = &SProc->FlipFlop[
4118- !RO(Shm)->Cpu[RO(Shm)->Proc.Service.Core].Toggle
4119- ];
4120- ATTRIBUTE *HWP_Cap_Attr[2] = {
4121- RSC(SYSINFO_PERFMON_HWP_CAP_COND0).ATTR(),
4122- RSC(SYSINFO_PERFMON_HWP_CAP_COND1).ATTR()
4123- };
4124- bix = RO(Shm)->Proc.Features.HWP_Enable == 1;
4125-
4126- if ( (RO(Shm)->Proc.Features.Info.Vendor.CRC == CRC_AMD)
4127- || (RO(Shm)->Proc.Features.Info.Vendor.CRC == CRC_HYGON) )
4128- {
4129- if (RO(Shm)->Proc.Features.ACPI_CPPC == 1)
4130- {
4131- GridHover( PUT( BOXKEY_FMW_CPPC,
4132- attrib[RO(Shm)->Proc.Features.ACPI_CPPC], width, 2,
4133- "%s%.*s%s <%3s>", RSC(PERF_MON_CPPC).CODE(),
4134- width - 19 - RSZ(PERF_MON_CPPC), hSpace,
4135- RSC(PERF_LABEL_CPPC).CODE(), RSC(FMW).CODE() ),
4136- (char *) RSC(PERF_MON_CPPC_COMM).CODE() );
4137- }
4138- else
4139- {
4140- GridCall( PUT( BOXKEY_HWP, attrib[bix], width, 2,
4141- "%s%.*s%s <%3s>", RSC(PERF_MON_CPPC).CODE(),
4142- width - 19 - RSZ(PERF_MON_CPPC), hSpace,
4143- RSC(PERF_LABEL_CPPC).CODE(), ENABLED(bix) ),
4144- HWP_Update);
4145- }
4146- } else {
4147- GridCall( PUT( BOXKEY_HWP, attrib[bix], width, 2,
4148- "%s%.*s%s <%3s>", RSC(PERF_MON_HWP).CODE(),
4149- width - 18 - RSZ(PERF_MON_HWP), hSpace,
4150- RSC(PERF_LABEL_HWP).CODE(), ENABLED(bix) ),
4151- HWP_Update);
4152- }
4153- PUT( SCANKEY_NULL, RSC(SYSINFO_PERFMON_HWP_CAP_COND1).ATTR(),
4154- width, 3, "%s""%.*s""%s""%.*s""%s", RSC(CAPABILITIES).CODE(),
4155- 21 - 3 * (OutFunc == NULL) - RSZ(CAPABILITIES), hSpace,
4156- RSC(PERF_MON_UNIT_HWP).CODE(), 22, hSpace, RSC(RATIO).CODE() );
4157-
4158- GridCall(PrintRatioFreq(win, CFlop,
4159- 1, (char*) RSC(LOWEST).CODE(),
4160- &SProc->PowerThermal.HWP.Capabilities.Lowest,
4161- 0, SCANKEY_NULL, width, OutFunc,
4162- HWP_Cap_Attr[bix]),
4163- Refresh_HWP_Cap_Freq,
4164- &SProc->PowerThermal.HWP.Capabilities.Lowest);
4165-
4166- GridCall(PrintRatioFreq(win, CFlop,
4167- 1, (char*) RSC(EFFICIENT).CODE(),
4168- &SProc->PowerThermal.HWP.Capabilities.Most_Efficient,
4169- 0, SCANKEY_NULL, width, OutFunc,
4170- HWP_Cap_Attr[bix]),
4171- Refresh_HWP_Cap_Freq,
4172- &SProc->PowerThermal.HWP.Capabilities.Most_Efficient);
4173-
4174- GridCall(PrintRatioFreq(win, CFlop,
4175- 1, (char*) RSC(GUARANTEED).CODE(),
4176- &SProc->PowerThermal.HWP.Capabilities.Guaranteed,
4177- 0, SCANKEY_NULL, width, OutFunc,
4178- HWP_Cap_Attr[bix]),
4179- Refresh_HWP_Cap_Freq,
4180- &SProc->PowerThermal.HWP.Capabilities.Guaranteed);
4181-
4182- GridCall(PrintRatioFreq(win, CFlop,
4183- 1, (char*) RSC(HIGHEST).CODE(),
4184- &SProc->PowerThermal.HWP.Capabilities.Highest,
4185- 0, SCANKEY_NULL, width, OutFunc,
4186- HWP_Cap_Attr[bix]),
4187- Refresh_HWP_Cap_Freq,
4188- &SProc->PowerThermal.HWP.Capabilities.Highest);
4189- }
4190- else if ( (RO(Shm)->Proc.Features.Info.Vendor.CRC == CRC_AMD)
4191- || (RO(Shm)->Proc.Features.Info.Vendor.CRC == CRC_HYGON) )
4192- {
4193- PUT( SCANKEY_NULL, attrib[4], width, 2,
4194- "%s%.*s%s [%3s]", RSC(PERF_MON_CPPC).CODE(),
4195- width - 19 - RSZ(PERF_MON_CPPC), hSpace,
4196- RSC(PERF_LABEL_CPPC).CODE(), RSC(NOT_AVAILABLE).CODE() );
4197- } else {
4198- const unsigned int cix = ((RO(Shm)->Proc.Features.HWP_Enable == 1)
4199- || (RO(Shm)->Proc.Features.ACPI_CPPC == 1));
4200-
4201- PUT( SCANKEY_NULL, attrib[bix], width, 2,
4202- "%s%.*s%s [%3s]", RSC(PERF_MON_HWP).CODE(),
4203- width - 18 - RSZ(PERF_MON_HWP), hSpace,
4204- RSC(PERF_LABEL_HWP).CODE(), ENABLED(cix) );
4205- }
42064141/* Section Mark */
42074142 if (RO(Shm)->Proc.Features.Info.Vendor.CRC == CRC_INTEL)
42084143 {
@@ -4392,6 +4327,116 @@ REASON_CODE SysInfoPerfMon(Window *win, CUINT width, CELL_FUNC OutFunc)
43924327 "%s%.*s[%7s]", RSC(PERF_MON_CORE).CODE(),
43934328 width - 12 - RSZ(PERF_MON_CORE), hSpace, POWERED(bix) );
43944329 }
4330+ /* Section Mark */
4331+ if ( (RO(Shm)->Proc.Features.Info.Vendor.CRC == CRC_AMD)
4332+ || (RO(Shm)->Proc.Features.Info.Vendor.CRC == CRC_HYGON) )
4333+ {
4334+ PUT(SCANKEY_NULL, attrib[RO(Shm)->Proc.Features.OSPM_CPC], width, 2,
4335+ "%s%.*s%s [%3s]", RSC(PERF_MON_CPC).CODE(),
4336+ width - 19 - RSZ(PERF_MON_CPC), hSpace,
4337+ RSC(PERF_LABEL_CPC).CODE(),
4338+ ENABLED(RO(Shm)->Proc.Features.OSPM_CPC));
4339+ }
4340+ bix = (RO(Shm)->Proc.Features.Power.EAX.HWP_Reg == 1) /* Intel:HWP */
4341+ || (RO(Shm)->Proc.Features.leaf80000008.EBX.CPPC == 1) /* AMD:CPPC */
4342+ || (RO(Shm)->Proc.Features.ACPI_CPPC == 1); /* ACPI:CPPC */
4343+ if (bix)
4344+ {
4345+ ATTRIBUTE *HWP_Cap_Attr[2] = {
4346+ RSC(SYSINFO_PERFMON_HWP_CAP_COND0).ATTR(),
4347+ RSC(SYSINFO_PERFMON_HWP_CAP_COND1).ATTR()
4348+ };
4349+ unsigned int cpu;
4350+
4351+ bix = RO(Shm)->Proc.Features.HWP_Enable == 1;
4352+
4353+ if ( (RO(Shm)->Proc.Features.Info.Vendor.CRC == CRC_AMD)
4354+ || (RO(Shm)->Proc.Features.Info.Vendor.CRC == CRC_HYGON) )
4355+ {
4356+ if (RO(Shm)->Proc.Features.ACPI_CPPC == 1)
4357+ {
4358+ GridHover( PUT( BOXKEY_FMW_CPPC,
4359+ attrib[RO(Shm)->Proc.Features.ACPI_CPPC], width, 2,
4360+ "%s%.*s%s <%3s>", RSC(PERF_MON_CPPC).CODE(),
4361+ width - 19 - RSZ(PERF_MON_CPPC), hSpace,
4362+ RSC(PERF_LABEL_CPPC).CODE(), RSC(FMW).CODE() ),
4363+ (char *) RSC(PERF_MON_CPPC_COMM).CODE() );
4364+ }
4365+ else
4366+ {
4367+ GridCall( PUT( BOXKEY_HWP, attrib[bix], width, 2,
4368+ "%s%.*s%s <%3s>", RSC(PERF_MON_CPPC).CODE(),
4369+ width - 19 - RSZ(PERF_MON_CPPC), hSpace,
4370+ RSC(PERF_LABEL_CPPC).CODE(), ENABLED(bix) ),
4371+ HWP_Update);
4372+ }
4373+ } else {
4374+ GridCall( PUT( BOXKEY_HWP, attrib[bix], width, 2,
4375+ "%s%.*s%s <%3s>", RSC(PERF_MON_HWP).CODE(),
4376+ width - 18 - RSZ(PERF_MON_HWP), hSpace,
4377+ RSC(PERF_LABEL_HWP).CODE(), ENABLED(bix) ),
4378+ HWP_Update);
4379+ }
4380+
4381+ PUT( SCANKEY_NULL, RSC(SYSINFO_PERFMON_HWP_CAP_COND1).ATTR(),
4382+ width, 3, "%s %s %s %s %s",
4383+ RSC(CAPABILITIES).CODE(),
4384+ RSC(LOWEST).CODE(), RSC(EFFICIENT).CODE(),
4385+ RSC(GUARANTEED).CODE(), RSC(HIGHEST).CODE());
4386+
4387+ for (cpu = 0; cpu < RO(Shm)->Proc.CPU.Count; cpu++)
4388+ {
4389+ CPU_STRUCT *SProc = &RO(Shm)->Cpu[cpu];
4390+ struct FLIP_FLOP *CFlop = &SProc->FlipFlop[!RO(Shm)->Cpu[cpu].Toggle];
4391+
4392+ double Lowest_MHz = ABS_FREQ_MHz(double,
4393+ SProc->PowerThermal.HWP.Capabilities.Lowest,
4394+ CFlop->Clock
4395+ ),
4396+ Efficient_MHz = ABS_FREQ_MHz(double,
4397+ SProc->PowerThermal.HWP.Capabilities.Most_Efficient,
4398+ CFlop->Clock
4399+ ),
4400+ Guaranteed_MHz = ABS_FREQ_MHz(double,
4401+ SProc->PowerThermal.HWP.Capabilities.Guaranteed,
4402+ CFlop->Clock
4403+ ),
4404+ Highest_MHz = ABS_FREQ_MHz(double,
4405+ SProc->PowerThermal.HWP.Capabilities.Highest,
4406+ CFlop->Clock
4407+ );
4408+
4409+ GridCall(
4410+ PUT(SCANKEY_NULL, HWP_Cap_Attr[bix], width, 3,
4411+ "CPU #%-3u %7.2f (%3u) %7.2f (%3u) %7.2f (%3u) %7.2f (%3u)",
4412+ cpu,
4413+ Lowest_MHz,
4414+ SProc->PowerThermal.HWP.Capabilities.Lowest,
4415+ Efficient_MHz,
4416+ SProc->PowerThermal.HWP.Capabilities.Most_Efficient,
4417+ Guaranteed_MHz,
4418+ SProc->PowerThermal.HWP.Capabilities.Guaranteed,
4419+ Highest_MHz,
4420+ SProc->PowerThermal.HWP.Capabilities.Highest),
4421+ Refresh_HWP_Cap_Freq, cpu);
4422+ }
4423+ }
4424+ else if ( (RO(Shm)->Proc.Features.Info.Vendor.CRC == CRC_AMD)
4425+ || (RO(Shm)->Proc.Features.Info.Vendor.CRC == CRC_HYGON) )
4426+ {
4427+ PUT( SCANKEY_NULL, attrib[4], width, 2,
4428+ "%s%.*s%s [%3s]", RSC(PERF_MON_CPPC).CODE(),
4429+ width - 19 - RSZ(PERF_MON_CPPC), hSpace,
4430+ RSC(PERF_LABEL_CPPC).CODE(), RSC(NOT_AVAILABLE).CODE() );
4431+ } else {
4432+ const unsigned int cix = ((RO(Shm)->Proc.Features.HWP_Enable == 1)
4433+ || (RO(Shm)->Proc.Features.ACPI_CPPC == 1));
4434+
4435+ PUT( SCANKEY_NULL, attrib[bix], width, 2,
4436+ "%s%.*s%s [%3s]", RSC(PERF_MON_HWP).CODE(),
4437+ width - 18 - RSZ(PERF_MON_HWP), hSpace,
4438+ RSC(PERF_LABEL_HWP).CODE(), ENABLED(cix) );
4439+ }
43954440 return reason;
43964441}
43974442
0 commit comments