lkml.org 
[lkml]   [2024]   [Apr]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[tip: x86/cpu] x86/cpu/vfm: Add new macros to work with (vendor/family/model) values
    The following commit has been merged into the x86/cpu branch of tip:

    Commit-ID: e6dfdc2e89a0adedf455814c91b977d6a584cc88
    Gitweb: https://git.kernel.org/tip/e6dfdc2e89a0adedf455814c91b977d6a584cc88
    Author: Tony Luck <tony.luck@intel.com>
    AuthorDate: Tue, 16 Apr 2024 14:19:04 -07:00
    Committer: Borislav Petkov (AMD) <bp@alien8.de>
    CommitterDate: Mon, 22 Apr 2024 11:43:55 +02:00

    x86/cpu/vfm: Add new macros to work with (vendor/family/model) values

    To avoid adding a slew of new macros for each new Intel CPU family
    switch over from providing CPU model number #defines to a new
    scheme that encodes vendor, family, and model in a single number.

    [ bp: s/casted/cast/g ]

    Signed-off-by: Tony Luck <tony.luck@intel.com>
    Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
    Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
    Link: https://lore.kernel.org/r/20240416211941.9369-3-tony.luck@intel.com
    ---
    arch/x86/include/asm/cpu_device_id.h | 93 +++++++++++++++++++++++++++-
    1 file changed, 93 insertions(+)

    diff --git a/arch/x86/include/asm/cpu_device_id.h b/arch/x86/include/asm/cpu_device_id.h
    index bf4e065..970a232 100644
    --- a/arch/x86/include/asm/cpu_device_id.h
    +++ b/arch/x86/include/asm/cpu_device_id.h
    @@ -3,6 +3,39 @@
    #define _ASM_X86_CPU_DEVICE_ID

    /*
    + * Can't use <linux/bitfield.h> because it generates expressions that
    + * cannot be used in structure initializers. Bitfield construction
    + * here must match the union in struct cpuinfo_86:
    + * union {
    + * struct {
    + * __u8 x86_model;
    + * __u8 x86;
    + * __u8 x86_vendor;
    + * __u8 x86_reserved;
    + * };
    + * __u32 x86_vfm;
    + * };
    + */
    +#define VFM_MODEL_BIT 0
    +#define VFM_FAMILY_BIT 8
    +#define VFM_VENDOR_BIT 16
    +#define VFM_RSVD_BIT 24
    +
    +#define VFM_MODEL_MASK GENMASK(VFM_FAMILY_BIT - 1, VFM_MODEL_BIT)
    +#define VFM_FAMILY_MASK GENMASK(VFM_VENDOR_BIT - 1, VFM_FAMILY_BIT)
    +#define VFM_VENDOR_MASK GENMASK(VFM_RSVD_BIT - 1, VFM_VENDOR_BIT)
    +
    +#define VFM_MODEL(vfm) (((vfm) & VFM_MODEL_MASK) >> VFM_MODEL_BIT)
    +#define VFM_FAMILY(vfm) (((vfm) & VFM_FAMILY_MASK) >> VFM_FAMILY_BIT)
    +#define VFM_VENDOR(vfm) (((vfm) & VFM_VENDOR_MASK) >> VFM_VENDOR_BIT)
    +
    +#define VFM_MAKE(_vendor, _family, _model) ( \
    + ((_model) << VFM_MODEL_BIT) | \
    + ((_family) << VFM_FAMILY_BIT) | \
    + ((_vendor) << VFM_VENDOR_BIT) \
    +)
    +
    +/*
    * Declare drivers belonging to specific x86 CPUs
    * Similar in spirit to pci_device_id and related PCI functions
    *
    @@ -49,6 +82,16 @@
    .driver_data = (unsigned long) _data \
    }

    +#define X86_MATCH_VENDORID_FAM_MODEL_STEPPINGS_FEATURE(_vendor, _family, _model, \
    + _steppings, _feature, _data) { \
    + .vendor = _vendor, \
    + .family = _family, \
    + .model = _model, \
    + .steppings = _steppings, \
    + .feature = _feature, \
    + .driver_data = (unsigned long) _data \
    +}
    +
    /**
    * X86_MATCH_VENDOR_FAM_MODEL_FEATURE - Macro for CPU matching
    * @_vendor: The vendor name, e.g. INTEL, AMD, HYGON, ..., ANY
    @@ -164,6 +207,56 @@
    X86_MATCH_VENDOR_FAM_MODEL_STEPPINGS_FEATURE(INTEL, 6, INTEL_FAM6_##model, \
    steppings, X86_FEATURE_ANY, data)

    +/**
    + * X86_MATCH_VFM - Match encoded vendor/family/model
    + * @vfm: Encoded 8-bits each for vendor, family, model
    + * @data: Driver specific data or NULL. The internal storage
    + * format is unsigned long. The supplied value, pointer
    + * etc. is cast to unsigned long internally.
    + *
    + * Stepping and feature are set to wildcards
    + */
    +#define X86_MATCH_VFM(vfm, data) \
    + X86_MATCH_VENDORID_FAM_MODEL_STEPPINGS_FEATURE( \
    + VFM_VENDOR(vfm), \
    + VFM_FAMILY(vfm), \
    + VFM_MODEL(vfm), \
    + X86_STEPPING_ANY, X86_FEATURE_ANY, data)
    +
    +/**
    + * X86_MATCH_VFM_STEPPINGS - Match encoded vendor/family/model/stepping
    + * @vfm: Encoded 8-bits each for vendor, family, model
    + * @steppings: Bitmask of steppings to match
    + * @data: Driver specific data or NULL. The internal storage
    + * format is unsigned long. The supplied value, pointer
    + * etc. is cast to unsigned long internally.
    + *
    + * feature is set to wildcard
    + */
    +#define X86_MATCH_VFM_STEPPINGS(vfm, steppings, data) \
    + X86_MATCH_VENDORID_FAM_MODEL_STEPPINGS_FEATURE( \
    + VFM_VENDOR(vfm), \
    + VFM_FAMILY(vfm), \
    + VFM_MODEL(vfm), \
    + steppings, X86_FEATURE_ANY, data)
    +
    +/**
    + * X86_MATCH_VFM_FEATURE - Match encoded vendor/family/model/feature
    + * @vfm: Encoded 8-bits each for vendor, family, model
    + * @feature: A X86_FEATURE bit
    + * @data: Driver specific data or NULL. The internal storage
    + * format is unsigned long. The supplied value, pointer
    + * etc. is cast to unsigned long internally.
    + *
    + * Steppings is set to wildcard
    + */
    +#define X86_MATCH_VFM_FEATURE(vfm, feature, data) \
    + X86_MATCH_VENDORID_FAM_MODEL_STEPPINGS_FEATURE( \
    + VFM_VENDOR(vfm), \
    + VFM_FAMILY(vfm), \
    + VFM_MODEL(vfm), \
    + X86_STEPPING_ANY, feature, data)
    +
    /*
    * Match specific microcode revisions.
    *
    \
     
     \ /
      Last update: 2024-04-22 12:01    [W:4.669 / U:0.040 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site