提交 e9a34f0e 编写于 作者: A Alex James 提交者: vit9696

OcCpuLib: Introduce OcCpuGetGeneration

Add a general function for detecting the CPU's generation, replacing
OcIsSandyOrIvy.
上级 86839a83
......@@ -118,6 +118,22 @@ typedef struct {
UINT64 FSBFrequency;
} OC_CPU_INFO;
typedef enum {
OcCpuGenerationUnknown,
OcCpuGenerationPenryn,
OcCpuGenerationNehalem,
OcCpuGenerationWestmere,
OcCpuGenerationSandyBridge,
OcCpuGenerationIvyBridge,
OcCpuGenerationHaswell,
OcCpuGenerationBroadwell,
OcCpuGenerationSkylake,
OcCpuGenerationKabyLake,
OcCpuGenerationCoffeeLake,
OcCpuGenerationCannonLake,
OcCpuGenerationMaxGeneration
} OC_CPU_GENERATION;
/**
Scan the processor and fill the cpu info structure with results.
......@@ -154,12 +170,12 @@ OcCpuModelToAppleFamily (
);
/**
Special Intel Sandy Bridge and Ivy Bridge detection code.
Obtain CPU's generation.
@retval TRUE when running with Sandy Bridge or Ivy Bridge CPU.
**/
BOOLEAN
OcIsSandyOrIvy (
@retval CPU's generation (e.g. OcCpuGenerationUnknown).
*/
OC_CPU_GENERATION
OcCpuGetGeneration (
VOID
);
......
......@@ -240,6 +240,7 @@ ShouldUseCustomSlideOffset (
EFI_STATUS Status;
UINTN DescriptorSize;
UINT32 DescriptorVersion;
OC_CPU_GENERATION CpuGeneration;
UINTN Index;
UINTN Slide;
UINTN NumEntries;
......@@ -279,7 +280,10 @@ ShouldUseCustomSlideOffset (
FilterMap (FilterMapContext, MemoryMapSize, MemoryMap, DescriptorSize);
}
SlideSupport->HasSandyOrIvy = OcIsSandyOrIvy ();
CpuGeneration = OcCpuGetGeneration ();
SlideSupport->HasSandyOrIvy = CpuGeneration == OcCpuGenerationSandyBridge ||
CpuGeneration == OcCpuGenerationIvyBridge;
SlideSupport->EstimatedKernelArea = (UINTN) EFI_PAGES_TO_SIZE (
CountRuntimePages (MemoryMapSize, MemoryMap, DescriptorSize, NULL)
) + ESTIMATED_KERNEL_SIZE;
......@@ -824,6 +828,7 @@ AppleSlideHandleBalloonState (
UINTN StartAddrTmp;
UINTN EndAddr;
UINT32 DescriptorVersion;
OC_CPU_GENERATION CpuGeneration;
BOOLEAN HasSandyOrIvy;
UINTN EstimatedKernelArea;
......@@ -864,7 +869,10 @@ AppleSlideHandleBalloonState (
return EFI_OUT_OF_RESOURCES;
}
HasSandyOrIvy = OcIsSandyOrIvy ();
CpuGeneration = OcCpuGetGeneration ();
HasSandyOrIvy = CpuGeneration == OcCpuGenerationSandyBridge ||
CpuGeneration == OcCpuGenerationIvyBridge;
EstimatedKernelArea = (UINTN) EFI_PAGES_TO_SIZE (
CountRuntimePages (MemoryMapSize, MemoryMap, DescriptorSize, NULL)
) + ESTIMATED_KERNEL_SIZE;
......
......@@ -846,15 +846,15 @@ OcCpuCorrectFlexRatio (
}
}
BOOLEAN
OcIsSandyOrIvy (
OC_CPU_GENERATION
OcCpuGetGeneration (
VOID
)
{
CPU_MICROCODE_PROCESSOR_SIGNATURE Sig;
BOOLEAN SandyOrIvy;
UINT32 CpuFamily;
UINT32 CpuModel;
OC_CPU_GENERATION CpuGeneration;
Sig.Uint32 = 0;
......@@ -870,15 +870,72 @@ OcIsSandyOrIvy (
CpuModel |= Sig.Bits.ExtendedModel << 4;
}
SandyOrIvy = CpuFamily == 6 && (CpuModel == 0x2A || CpuModel == 0x3A);
CpuGeneration = OcCpuGenerationUnknown;
if (CpuFamily == 6) {
switch (CpuModel) {
case CPU_MODEL_PENRYN:
CpuGeneration = OcCpuGenerationPenryn;
break;
case CPU_MODEL_NEHALEM:
case CPU_MODEL_FIELDS:
case CPU_MODEL_DALES:
case CPU_MODEL_NEHALEM_EX:
CpuGeneration = OcCpuGenerationNehalem;
break;
case CPU_MODEL_DALES_32NM:
case CPU_MODEL_WESTMERE:
case CPU_MODEL_WESTMERE_EX:
CpuGeneration = OcCpuGenerationWestmere;
break;
case CPU_MODEL_SANDYBRIDGE:
case CPU_MODEL_JAKETOWN:
CpuGeneration = OcCpuGenerationSandyBridge;
break;
case CPU_MODEL_IVYBRIDGE:
case CPU_MODEL_IVYBRIDGE_EP:
CpuGeneration = OcCpuGenerationIvyBridge;
break;
case CPU_MODEL_HASWELL:
case CPU_MODEL_HASWELL_EP:
case CPU_MODEL_HASWELL_ULT:
case CPU_MODEL_CRYSTALWELL:
CpuGeneration = OcCpuGenerationHaswell;
break;
case CPU_MODEL_BROADWELL:
case CPU_MODEL_BROADWELL_EP:
case CPU_MODEL_BRYSTALWELL:
CpuGeneration = OcCpuGenerationBroadwell;
break;
case CPU_MODEL_SKYLAKE:
case CPU_MODEL_SKYLAKE_DT:
case CPU_MODEL_SKYLAKE_W:
CpuGeneration = OcCpuGenerationSkylake;
break;
case CPU_MODEL_KABYLAKE:
case CPU_MODEL_KABYLAKE_DT:
//
// Kaby has 0x9 stepping, and Coffee use 0xA / 0xB stepping.
//
if (Sig.Bits.Stepping == 9) {
CpuGeneration = OcCpuGenerationKabyLake;
} else {
CpuGeneration = OcCpuGenerationCoffeeLake;
}
break;
case CPU_MODEL_CANNONLAKE:
CpuGeneration = OcCpuGenerationCannonLake;
break;
}
}
DEBUG ((
DEBUG_VERBOSE,
"OCCPU: Discovered CpuFamily %d CpuModel %d SandyOrIvy %a\n",
"OCCPU: Discovered CpuFamily %d CpuModel %d CpuStepping %d CpuGeneration %d\n",
CpuFamily,
CpuModel,
SandyOrIvy ? "YES" : "NO"
Sig.Bits.Stepping,
CpuGeneration
));
return SandyOrIvy;
return CpuGeneration;
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册