|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH 6/6] x86/apic: Convert the TSC deadline errata table to X86_MATCH_*()
On 17/07/2025 9:31 am, Jan Beulich wrote:
> On 16.07.2025 19:31, Andrew Cooper wrote:
>> --- a/xen/arch/x86/apic.c
>> +++ b/xen/arch/x86/apic.c
>> @@ -1051,64 +1051,32 @@ static void setup_APIC_timer(void)
>> local_irq_restore(flags);
>> }
>>
>> -#define DEADLINE_MODEL_MATCH(m, fr) \
>> - { .vendor = X86_VENDOR_INTEL, .family = 6, .model = (m), \
>> - .feature = X86_FEATURE_TSC_DEADLINE, \
>> - .driver_data = (void *)(unsigned long)(fr) }
>> +static const struct x86_cpu_id __initconst deadline_match[] = {
>> + X86_MATCH_VFMS(INTEL_HASWELL_X, 0x2, 0x3a), /* EP */
>> + X86_MATCH_VFMS(INTEL_HASWELL_X, 0x4, 0x0f), /* EX */
>>
>> -static unsigned int __init hsx_deadline_rev(void)
>> -{
>> - switch ( boot_cpu_data.x86_mask )
>> - {
>> - case 0x02: return 0x3a; /* EP */
>> - case 0x04: return 0x0f; /* EX */
>> - }
>> + X86_MATCH_VFM (INTEL_BROADWELL_X, 0x0b000020),
>>
>> - return ~0U;
>> -}
>> + X86_MATCH_VFMS(INTEL_BROADWELL_D, 0x2, 0x00000011),
>> + X86_MATCH_VFMS(INTEL_BROADWELL_D, 0x3, 0x0700000e),
>> + X86_MATCH_VFMS(INTEL_BROADWELL_D, 0x4, 0x0f00000c),
>> + X86_MATCH_VFMS(INTEL_BROADWELL_D, 0x5, 0x0e000003),
> Hmm, actually - why are Broadwell and ...
>
>> -static unsigned int __init bdx_deadline_rev(void)
>> -{
>> - switch ( boot_cpu_data.x86_mask )
>> - {
>> - case 0x02: return 0x00000011;
>> - case 0x03: return 0x0700000e;
>> - case 0x04: return 0x0f00000c;
>> - case 0x05: return 0x0e000003;
>> - }
>> + X86_MATCH_VFMS(INTEL_SKYLAKE_X, 0x3, 0x01000136),
>> + X86_MATCH_VFMS(INTEL_SKYLAKE_X, 0x4, 0x02000014),
> ... Skylake each split ...
>
>> - return ~0U;
>> -}
>> + X86_MATCH_VFM (INTEL_HASWELL, 0x22),
>> + X86_MATCH_VFM (INTEL_HASWELL_L, 0x20),
>> + X86_MATCH_VFM (INTEL_HASWELL_G, 0x17),
>>
>> -static unsigned int __init skx_deadline_rev(void)
>> -{
>> - switch ( boot_cpu_data.x86_mask )
>> - {
>> - case 0x00 ... 0x02: return ~0U;
>> - case 0x03: return 0x01000136;
>> - case 0x04: return 0x02000014;
>> - }
>> -
>> - return 0;
>> -}
>> -
>> -static const struct x86_cpu_id __initconstrel deadline_match[] = {
>> - DEADLINE_MODEL_MATCH(0x3c, 0x22), /* Haswell */
>> - DEADLINE_MODEL_MATCH(0x3f, hsx_deadline_rev), /* Haswell EP/EX */
>> - DEADLINE_MODEL_MATCH(0x45, 0x20), /* Haswell D */
>> - DEADLINE_MODEL_MATCH(0x46, 0x17), /* Haswell H */
>> + X86_MATCH_VFM (INTEL_BROADWELL, 0x25),
>> + X86_MATCH_VFM (INTEL_BROADWELL_G, 0x17),
> ... into disjoint groups (continuing ...
>
>> - DEADLINE_MODEL_MATCH(0x3d, 0x25), /* Broadwell */
>> - DEADLINE_MODEL_MATCH(0x47, 0x17), /* Broadwell H */
>> - DEADLINE_MODEL_MATCH(0x4f, 0x0b000020), /* Broadwell EP/EX */
>> - DEADLINE_MODEL_MATCH(0x56, bdx_deadline_rev), /* Broadwell D */
>> + X86_MATCH_VFM (INTEL_SKYLAKE_L, 0xb2),
>> + X86_MATCH_VFM (INTEL_SKYLAKE, 0xb2),
> ... here)? The patch already isn't overly straightforward to review without
> that.
The layout comes from Linux (I was mostly checking that I hadn't broken
anything), although I took the opportunity to optimise the table by
dropping useless rows.
I can't find any way of getting the diff to read nicely. My normal
trick of reordering with a function doesn't work, although it turns out
that removing the blank lines and moving it into check_deadline_errata()
does render nicely. I'll do that in v2.
~Andrew
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |