[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] RE: [PATCH v3 07/15] xen/cpufreq: fix core frequency calculation for AMD Family 1Ah CPUs
[Public] Hi, > -----Original Message----- > From: Jan Beulich <jbeulich@xxxxxxxx> > Sent: Monday, March 24, 2025 11:48 PM > To: Penny, Zheng <penny.zheng@xxxxxxx> > Cc: Huang, Ray <Ray.Huang@xxxxxxx>; Andrew Cooper > <andrew.cooper3@xxxxxxxxxx>; Roger Pau Monné <roger.pau@xxxxxxxxxx>; xen- > devel@xxxxxxxxxxxxxxxxxxxx; Nicola Vetrini <nicola.vetrini@xxxxxxxxxxx> > Subject: Re: [PATCH v3 07/15] xen/cpufreq: fix core frequency calculation for > AMD > Family 1Ah CPUs > > On 06.03.2025 09:39, Penny Zheng wrote: > > This commit fixes core frequency calculation for AMD Family 1Ah CPUs, > > due to a change in the PStateDef MSR layout in AMD Family 1Ah+. > > In AMD Family 1Ah+, Core current operating frequency in MHz is > > calculated as > > follows: > > Why 1Ah+? In the code you correctly limit to just 1Ah. > > > --- a/xen/arch/x86/cpu/amd.c > > +++ b/xen/arch/x86/cpu/amd.c > > @@ -572,12 +572,24 @@ static void amd_get_topology(struct cpuinfo_x86 *c) > > : > > c->cpu_core_id); } > > > > +static uint64_t amd_parse_freq(const struct cpuinfo_x86 *c, uint64_t > > +value) { > > + ASSERT(c->x86 <= 0x1A); > > + > > + if (c->x86 < 0x17) > > + return (((value & 0x3f) + 0x10) * 100) >> ((value >> 6) & 7); > > + else if (c->x86 <= 0x19) > > + return ((value & 0xff) * 25 * 8) / ((value >> 8) & 0x3f); > > + else > > + return (value & 0xfff) * 5; > > +} > > Could I talk you into omitting the unnecessary "else" in cases like this one? > (This may also make sense to express as switch().) > Sorry, bad habit... will change it to switch > > @@ -658,19 +670,20 @@ void amd_log_freq(const struct cpuinfo_x86 *c) > > if (!(lo >> 63)) > > return; > > > > -#define FREQ(v) (c->x86 < 0x17 ? ((((v) & 0x3f) + 0x10) * 100) >> (((v) >> > > 6) & > 7) \ > > - : (((v) & 0xff) * 25 * 8) / (((v) >> 8) & > > 0x3f)) > > if (idx && idx < h && > > !rdmsr_safe(0xC0010064 + idx, val) && (val >> 63) && > > !rdmsr_safe(0xC0010064, hi) && (hi >> 63)) > > printk("CPU%u: %lu (%lu ... %lu) MHz\n", > > - smp_processor_id(), FREQ(val), FREQ(lo), FREQ(hi)); > > + smp_processor_id(), > > + amd_parse_freq(c, val), > > + amd_parse_freq(c, lo), amd_parse_freq(c, hi)); > > I fear Misra won't like multiple function calls to evaluate the parameters to > pass to > another function. Iirc smp_process_id() has special exception, so that's okay > here. > This may be possible to alleviate by marking the new helper pure or even const > (see gcc doc as to caveats with passing pointers to const functions). Cc-ing > Nicola > for possible clarification or correction. > Maybe we shall declare the function __pure. Having checked the gcc doc, `` a function that has pointer arguments must not be declared const `` Otherwise we store the "c->x86" value to avoid using the pointer > Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |