[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2 01/14] x86/cpu: Create Hygon Dhyana architecture support file
>>> On 15.03.19 at 11:17, <puwen@xxxxxxxx> wrote: > On 2019/3/15 1:11, Jan Beulich wrote: >>>>> On 21.02.19 at 10:48, <puwen@xxxxxxxx> wrote: >>> +static void __init noinline probe_masking_msrs(void) >>> +{ >>> + const struct cpuinfo_x86 *c = &boot_cpu_data; >>> + >>> + /* Work out which masking MSRs we should have. */ >>> + cpuidmask_defaults._1cd = >>> + _probe_mask_msr(MSR_K8_FEATURE_MASK, LCAP_1cd); >>> + cpuidmask_defaults.e1cd = >>> + _probe_mask_msr(MSR_K8_EXT_FEATURE_MASK, LCAP_e1cd); >>> + if (c->cpuid_level >= 7) >>> + cpuidmask_defaults._7ab0 = >>> + _probe_mask_msr(MSR_AMD_L7S0_FEATURE_MASK, LCAP_7ab0); >> >> There's more relevant code here in the original function. > > The code is used for family 15h. Hygon CPU do not need it. There's a single Fam15 conditional in the middle of the function. Everything beyond that is again family-independent. >>> + if (opt_cpu_info) { >>> + printk(XENLOG_INFO "Levelling caps: %#x\n", levelling_caps); >>> + printk(XENLOG_INFO >>> + "MSR defaults: 1d 0x%08x, 1c 0x%08x, e1d 0x%08x, " >>> + "e1c 0x%08x, 7a0 0x%08x, 7b0 0x%08x\n", >>> + (uint32_t)cpuidmask_defaults._1cd, >>> + (uint32_t)(cpuidmask_defaults._1cd >> 32), >>> + (uint32_t)cpuidmask_defaults.e1cd, >>> + (uint32_t)(cpuidmask_defaults.e1cd >> 32), >>> + (uint32_t)(cpuidmask_defaults._7ab0 >> 32), >>> + (uint32_t)cpuidmask_defaults._7ab0); >>> + } >>> + >>> + if (levelling_caps) >>> + ctxt_switch_masking = hygon_ctxt_switch_masking; >>> +} >> >> This is a lot of duplicated code with only minor differences. I think >> you would be better off calling into the AMD original functions. > > These functions and AMD original ones are static. So Hygon cannot directly > call into them. Or we can put them into the common cpu code, but I think > it's not good for future maintenance. Just make non-static what needs to be, add an amd_ prefix, and call it from your code. > There are many codes to support AMD's > different families, the family/model/stepping checking are deeply embedded > in codes. If we add Hygon family/model/stepping checking in future version, > it will make code interleaved together and hard to maintain. We can think about adding the duplication when it becomes unwieldy to maintain the shared variant. >>> +static void init_hygon(struct cpuinfo_x86 *c) >>> +{ >>> + u32 l, h; >>> + unsigned long long value; >>> + >>> + /* Attempt to set lfence to be Dispatch Serialising. */ >>> + if (rdmsr_safe(MSR_AMD64_DE_CFG, value)) >>> + /* Unable to read. Assume the safer default. */ >>> + __clear_bit(X86_FEATURE_LFENCE_DISPATCH, c->x86_capability); >>> + else if (value & AMD64_DE_CFG_LFENCE_SERIALISE) >>> + /* Already dispatch serialising. */ >>> + __set_bit(X86_FEATURE_LFENCE_DISPATCH, c->x86_capability); >> >> Didn't you cut off too much from the original code (which again >> may better be shared, by splitting out into a function)? > > The cut codes are used for other AMD families except family 17h. Hygon > Dhyana is derived from AMD Zen, so we only need the family 17h parts. > This also make the init flow minimal. How is else if (wrmsr_safe(MSR_AMD64_DE_CFG, value | AMD64_DE_CFG_LFENCE_SERIALISE) || rdmsr_safe(MSR_AMD64_DE_CFG, value) || !(value & AMD64_DE_CFG_LFENCE_SERIALISE)) /* Attempt to set failed. Assume the safer default. */ __clear_bit(X86_FEATURE_LFENCE_DISPATCH, c->x86_capability); else /* Successfully enabled! */ __set_bit(X86_FEATURE_LFENCE_DISPATCH, c->x86_capability); family dependent in any way? Jan _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |