@@ -2687,104 +2687,105 @@ static void Intel_FlexRatio(bool OC_ENABLED)
26872687 struct SIGNATURE Arch;
26882688 unsigned short grantFlex : 1-0,
26892689 experimental : 2-1,
2690- freeToUse : 16-2;
2690+ freeToUse : 8-2,
2691+ bitsLayout : 16-8;
26912692 } list[] = {
2692- {_Core_Yonah, 0, 1, 0},
2693- {_Core_Conroe, 0, 1, 0},
2694- {_Core_Kentsfield, 0, 1, 0},
2695- {_Core_Conroe_616, 0, 1, 0},
2696- {_Core_Penryn, 0 , 1, 0},
2697- {_Core_Dunnington, 0, 1, 0},
2698-
2699- {_Atom_Bonnell, 0, 1, 0}, /* 06_1C */
2700- {_Atom_Silvermont, 0, 1, 0}, /* 06_26 */
2701- {_Atom_Lincroft, 0, 1, 0}, /* 06_27 */
2702- {_Atom_Clover_Trail, 0, 1, 0}, /* 06_35 */
2703- {_Atom_Saltwell, 0, 1, 0}, /* 06_36 */
2704-
2705- {_Silvermont_Bay_Trail, 0, 1, 0}, /* 06_37 */
2706-
2707- {_Atom_Avoton, 0, 1, 0}, /* 06_4D */
2708- {_Atom_Airmont, 0, 1, 0}, /* 06_4C */
2709- {_Atom_Goldmont, 1, 1, 0}, /* 06_5C */
2710- {_Atom_Sofia, 1, 1, 0}, /* 06_5D */
2711- {_Atom_Merrifield, 1, 1, 0}, /* 06_4A */
2712- {_Atom_Moorefield, 1, 1, 0}, /* 06_5A */
2713-
2714- {_Nehalem_Bloomfield, 1, 1, 0}, /* 06_1A */
2715- {_Nehalem_Lynnfield, 1, 1, 0}, /* 06_1E */
2716- {_Nehalem_MB, 1, 1, 0}, /* 06_1F */
2717- {_Nehalem_EX, 1, 1, 0}, /* 06_2E */
2718-
2719- {_Westmere, 1, 1, 0}, /* 06_25 */
2720- {_Westmere_EP, 1, 1 , 0}, /* 06_2C */
2721- {_Westmere_EX, 1, 1, 0}, /* 06_2F */
2722-
2723- {_SandyBridge, 1, 1, 0}, /* 06_2A */
2724- {_SandyBridge_EP, 1, 1, 0}, /* 06_2D */
2725-
2726- {_IvyBridge, 1, 0, 0}, /* 06_3A */
2727- {_IvyBridge_EP, 1, 1, 0}, /* 06_3E */
2728-
2729- {_Haswell_DT, 1, 1, 0}, /* 06_3C */
2730- {_Haswell_EP, 1, 1, 0}, /* 06_3F */
2731- {_Haswell_ULT, 1, 1, 0}, /* 06_45 */
2732- {_Haswell_ULX, 1, 1, 0}, /* 06_46 */
2733-
2734- {_Broadwell, 1, 1, 0}, /* 06_3D */
2735- {_Broadwell_D, 1, 1, 0}, /* 06_56 */
2736- {_Broadwell_H, 1, 1, 0}, /* 06_47 */
2737- {_Broadwell_EP, 1, 1, 0}, /* 06_4F */
2738-
2739- {_Skylake_UY, 1, 1, 0}, /* 06_4E */
2740- {_Skylake_S, 1, 1, 0}, /* 06_5E */
2741- {_Skylake_X, 1, 1, 0}, /* 06_55 */
2742-
2743- {_Xeon_Phi, 0, 1, 0}, /* 06_57 */
2744-
2745- {_Kabylake, 1, 1, 0}, /* 06_9E */
2746- {_Kabylake_UY, 1, 1, 0}, /* 06_8E */
2747-
2748- {_Cannonlake_U, 1, 1, 0}, /* 06_66 */
2749- {_Cannonlake_H, 1, 1, 0},
2750- {_Geminilake, 1, 1, 0}, /* 06_7A */
2751- {_Icelake_UY, 1, 1, 0}, /* 06_7E */
2752-
2753- {_Icelake_X, 1, 1, 0},
2754- {_Icelake_D, 1, 1, 0},
2755- {_Sunny_Cove, 1, 1, 0},
2756- {_Tigerlake, 1, 1, 0},
2757- {_Tigerlake_U, 1, 1 , 0}, /* 06_8C */
2758- {_Cometlake, 1, 1, 0},
2759- {_Cometlake_UY, 1, 1, 0},
2760- {_Atom_Denverton, 1, 1, 0},
2761- {_Tremont_Jacobsville, 1, 1, 0},
2762- {_Tremont_Lakefield, 1, 1, 0},
2763- {_Tremont_Elkhartlake, 1, 1, 0},
2764- {_Tremont_Jasperlake, 1, 1, 0},
2765- {_Sapphire_Rapids, 1, 1, 0},
2766- {_Emerald_Rapids, 1, 1, 0},
2767- {_Granite_Rapids_X, 1, 1, 0},
2768- {_Granite_Rapids_D, 1, 1, 0},
2769- {_Sierra_Forest, 1, 1, 0},
2770- {_Grand_Ridge, 1, 1, 0},
2771- {_Rocketlake, 1, 1, 0},
2772- {_Rocketlake_U, 1, 1, 0},
2773- {_Alderlake_S, 1, 1 , 0}, /* 06_97 */
2774- {_Alderlake_H, 1, 1, 0},
2775- {_Alderlake_N, 1, 1, 0},
2776- {_Meteorlake_M, 1, 1, 0},
2777- {_Meteorlake_N, 1, 1, 0},
2778- {_Meteorlake_S, 1, 1, 0},
2779- {_Raptorlake, 1, 1, 0}, /* 06_B7 */
2780- {_Raptorlake_P, 1, 1, 0},
2781- {_Raptorlake_S, 1, 1, 0},
2782- {_Lunarlake, 1, 1, 0}, /* 06_BD */
2783- {_Arrowlake, 1, 1, 0}, /* 06_C6 */
2784- {_Arrowlake_H, 1, 1, 0}, /* 06_C5 */
2785- {_Arrowlake_U, 1, 1, 0}, /* 06_B5 */
2786- {_Pantherlake, 1, 1, 0}, /* 06_CC */
2787- {_Clearwater_Forest, 1, 1, 0} /* 06_DD */
2693+ {_Core_Yonah, 0, 1, 0, 1 },
2694+ {_Core_Conroe, 0, 1, 0, 1 },
2695+ {_Core_Kentsfield, 0, 1, 0, 1 },
2696+ {_Core_Conroe_616, 0, 1, 0, 1 },
2697+ {_Core_Penryn, 1 , 1, 0, 1}, /* 06_17 */
2698+ {_Core_Dunnington, 0, 1, 0, 1 },
2699+
2700+ {_Atom_Bonnell, 0, 1, 0, 0 }, /* 06_1C */
2701+ {_Atom_Silvermont, 0, 1, 0, 0 }, /* 06_26 */
2702+ {_Atom_Lincroft, 0, 1, 0, 0 }, /* 06_27 */
2703+ {_Atom_Clover_Trail, 0, 1, 0, 0 }, /* 06_35 */
2704+ {_Atom_Saltwell, 0, 1, 0, 0 }, /* 06_36 */
2705+
2706+ {_Silvermont_Bay_Trail, 0, 1, 0, 0 }, /* 06_37 */
2707+
2708+ {_Atom_Avoton, 0, 1, 0, 0 }, /* 06_4D */
2709+ {_Atom_Airmont, 0, 1, 0, 0 }, /* 06_4C */
2710+ {_Atom_Goldmont, 1, 1, 0, 0 }, /* 06_5C */
2711+ {_Atom_Sofia, 1, 1, 0, 0 }, /* 06_5D */
2712+ {_Atom_Merrifield, 1, 1, 0, 0 }, /* 06_4A */
2713+ {_Atom_Moorefield, 1, 1, 0, 0 }, /* 06_5A */
2714+
2715+ {_Nehalem_Bloomfield, 1, 1, 0, 1 }, /* 06_1A */
2716+ {_Nehalem_Lynnfield, 1, 1, 0, 1 }, /* 06_1E */
2717+ {_Nehalem_MB, 1, 1, 0, 1 }, /* 06_1F */
2718+ {_Nehalem_EX, 1, 1, 0, 1 }, /* 06_2E */
2719+
2720+ {_Westmere, 1, 1, 0, 1 }, /* 06_25 */
2721+ {_Westmere_EP, 1, 0 , 0, 1 }, /* 06_2C */
2722+ {_Westmere_EX, 1, 1, 0, 1 }, /* 06_2F */
2723+
2724+ {_SandyBridge, 1, 1, 0, 0 }, /* 06_2A */
2725+ {_SandyBridge_EP, 1, 1, 0, 0 }, /* 06_2D */
2726+
2727+ {_IvyBridge, 1, 0, 0, 0 }, /* 06_3A */
2728+ {_IvyBridge_EP, 1, 1, 0, 0 }, /* 06_3E */
2729+
2730+ {_Haswell_DT, 1, 1, 0, 0 }, /* 06_3C */
2731+ {_Haswell_EP, 1, 1, 0, 0 }, /* 06_3F */
2732+ {_Haswell_ULT, 1, 1, 0, 0 }, /* 06_45 */
2733+ {_Haswell_ULX, 1, 1, 0, 0 }, /* 06_46 */
2734+
2735+ {_Broadwell, 1, 1, 0, 0 }, /* 06_3D */
2736+ {_Broadwell_D, 1, 1, 0, 0 }, /* 06_56 */
2737+ {_Broadwell_H, 1, 1, 0, 0 }, /* 06_47 */
2738+ {_Broadwell_EP, 1, 1, 0, 0 }, /* 06_4F */
2739+
2740+ {_Skylake_UY, 1, 1, 0, 0 }, /* 06_4E */
2741+ {_Skylake_S, 1, 1, 0, 0 }, /* 06_5E */
2742+ {_Skylake_X, 1, 1, 0, 0 }, /* 06_55 */
2743+
2744+ {_Xeon_Phi, 0, 1, 0, 0 }, /* 06_57 */
2745+
2746+ {_Kabylake, 1, 1, 0, 0 }, /* 06_9E */
2747+ {_Kabylake_UY, 1, 1, 0, 0 }, /* 06_8E */
2748+
2749+ {_Cannonlake_U, 1, 1, 0, 0 }, /* 06_66 */
2750+ {_Cannonlake_H, 1, 1, 0, 0 },
2751+ {_Geminilake, 1, 1, 0, 0 }, /* 06_7A */
2752+ {_Icelake_UY, 1, 1, 0, 0 }, /* 06_7E */
2753+
2754+ {_Icelake_X, 1, 1, 0, 0 },
2755+ {_Icelake_D, 1, 1, 0, 0 },
2756+ {_Sunny_Cove, 1, 1, 0, 0 },
2757+ {_Tigerlake, 1, 1, 0, 0 },
2758+ {_Tigerlake_U, 1, 0, 0 , 0}, /* 06_8C */
2759+ {_Cometlake, 1, 1, 0, 0 },
2760+ {_Cometlake_UY, 1, 1, 0, 0 },
2761+ {_Atom_Denverton, 1, 1, 0, 0 },
2762+ {_Tremont_Jacobsville, 1, 1, 0, 0 },
2763+ {_Tremont_Lakefield, 1, 1, 0, 0 },
2764+ {_Tremont_Elkhartlake, 1, 1, 0, 0 },
2765+ {_Tremont_Jasperlake, 1, 1, 0, 0 },
2766+ {_Sapphire_Rapids, 1, 1, 0, 0 },
2767+ {_Emerald_Rapids, 1, 1, 0, 0 },
2768+ {_Granite_Rapids_X, 1, 1, 0, 0 },
2769+ {_Granite_Rapids_D, 1, 1, 0, 0 },
2770+ {_Sierra_Forest, 1, 1, 0, 0 },
2771+ {_Grand_Ridge, 1, 1, 0, 0 },
2772+ {_Rocketlake, 1, 1, 0, 0 },
2773+ {_Rocketlake_U, 1, 1, 0, 0 },
2774+ {_Alderlake_S, 1, 0, 0 , 0}, /* 06_97 */
2775+ {_Alderlake_H, 1, 1, 0, 0 },
2776+ {_Alderlake_N, 1, 1, 0, 0 },
2777+ {_Meteorlake_M, 1, 1, 0, 0 },
2778+ {_Meteorlake_N, 1, 1, 0, 0 },
2779+ {_Meteorlake_S, 1, 1, 0, 0 },
2780+ {_Raptorlake, 1, 1, 0, 0 }, /* 06_B7 */
2781+ {_Raptorlake_P, 1, 1, 0, 0 },
2782+ {_Raptorlake_S, 1, 1, 0, 0 },
2783+ {_Lunarlake, 1, 1, 0, 0 }, /* 06_BD */
2784+ {_Arrowlake, 1, 1, 0, 0 }, /* 06_C6 */
2785+ {_Arrowlake_H, 1, 1, 0, 0 }, /* 06_C5 */
2786+ {_Arrowlake_U, 1, 1, 0, 0 }, /* 06_B5 */
2787+ {_Pantherlake, 1, 1, 0, 0 }, /* 06_CC */
2788+ {_Clearwater_Forest, 1, 1, 0, 0 } /* 06_DD */
27882789 };
27892790 const unsigned int ids = sizeof(list) / sizeof(list[0]);
27902791 unsigned int id;
@@ -2798,17 +2799,27 @@ static void Intel_FlexRatio(bool OC_ENABLED)
27982799 if (!list[id].experimental
27992800 || (list[id].experimental
28002801 && PUBLIC(RO(Proc))->Registration.Experimental))
2801- {
2802- FLEX_RATIO flexRegister = {.value = 0};
2803- RDMSR(flexRegister, MSR_FLEX_RATIO);
2804- PUBLIC(RO(Proc))->Features.OC_Enable = flexRegister.OC_ENABLED;
2805- PUBLIC(RO(Proc))->Features.Factory.Bins = flexRegister.OC_BINS;
2806- PUBLIC(RO(Proc))->Features.OC_Lock = flexRegister.OC_LOCK;
2802+ {
2803+ FLEX_RATIO flexReg = {.value = 0};
2804+ RDMSR(flexReg, MSR_FLEX_RATIO);
2805+
2806+ switch (list[id].bitsLayout) {
2807+ default:
2808+ case 0:
2809+ PUBLIC(RO(Proc))->Features.OC_Enable = flexReg.OC_ENABLED;
2810+ PUBLIC(RO(Proc))->Features.Factory.Bins = flexReg.OC_BINS;
2811+ PUBLIC(RO(Proc))->Features.OC_Lock = flexReg.OC_LOCK;
2812+ break;
2813+ case 1:
2814+ PUBLIC(RO(Proc))->Features.OC_Enable = flexReg.OC_ENABLED;
2815+ PUBLIC(RO(Proc))->Features.Factory.Bins=flexReg.CLOCK_FLEX_MAX;
2816+ break;
2817+ }
28072818 PUBLIC(RO(Proc))->Features.Factory.Overclock = \
28082819 ABS_FREQ_MHz( signed int,
28092820 PUBLIC(RO(Proc))->Features.Factory.Bins,
28102821 PUBLIC(RO(Proc))->Features.Factory.Clock );
2811- }
2822+ }
28122823 }
28132824 break;
28142825 }
@@ -5993,6 +6004,8 @@ static PCI_CALLBACK X58_QPI(struct pci_dev *dev)
59936004 pci_read_config_dword(dev, 0xd0,
59946005 &PUBLIC(RO(Proc))->Uncore.Bus.QuickPath.value);
59956006
6007+ Intel_FlexRatio(true);
6008+
59966009 return (PCI_CALLBACK) 0;
59976010}
59986011
0 commit comments