[PATCH v1] UefiCpuPkg/CpuCacheInfoLib: Sort CpuCacheInfo array


Jason Lou
 

From: Jason <yun.lou@intel.com>

REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3D3508

Sort the CpuCacheInfo array by the core type values from largest to
smallest.

Signed-off-by: Jason Lou <yun.lou@intel.com>
Cc: Ray Ni <ray.ni@intel.com>
Cc: Eric Dong <eric.dong@intel.com>
Cc: Laszlo Ersek <lersek@redhat.com>
Cc: Rahul Kumar <rahul1.kumar@intel.com>
---
UefiCpuPkg/Library/CpuCacheInfoLib/CpuCacheInfoLib.c | 67 ++++++++=
+++++++++++-
UefiCpuPkg/Include/Library/CpuCacheInfoLib.h | 3 +-
UefiCpuPkg/Library/CpuCacheInfoLib/DxeCpuCacheInfoLib.inf | 4 +-
UefiCpuPkg/Library/CpuCacheInfoLib/InternalCpuCacheInfoLib.h | 1 +
UefiCpuPkg/Library/CpuCacheInfoLib/PeiCpuCacheInfoLib.inf | 4 +-
5 files changed, 75 insertions(+), 4 deletions(-)

diff --git a/UefiCpuPkg/Library/CpuCacheInfoLib/CpuCacheInfoLib.c b/UefiCpu=
Pkg/Library/CpuCacheInfoLib/CpuCacheInfoLib.c
index 126ee0da86..fa4850c4fe 100644
--- a/UefiCpuPkg/Library/CpuCacheInfoLib/CpuCacheInfoLib.c
+++ b/UefiCpuPkg/Library/CpuCacheInfoLib/CpuCacheInfoLib.c
@@ -37,6 +37,69 @@ CpuCacheInfoPrintCpuCacheInfoTable (
DEBUG ((DEBUG_INFO, "+-------+------------------------------------------=
--------------------------------------------+\n"));=0D
}=0D
=0D
+/**=0D
+ Function to compare core type for use in QuickSort.=0D
+=0D
+ @param[in] Buffer1 pointer to core type poiner to compare=0D
+ @param[in] Buffer2 pointer to second core type pointer to c=
ompare=0D
+=0D
+ @retval 0 Buffer1 equal to Buffer2=0D
+ @retval 1 Buffer1 is less than Buffer2=0D
+ @retval -1 Buffer1 is greater than Buffer2=0D
+**/=0D
+INTN=0D
+EFIAPI=0D
+CpuCacheInfoCompareCoreType (=0D
+ IN CONST VOID *Buffer1,=0D
+ IN CONST VOID *Buffer2=0D
+ )=0D
+{=0D
+ if (((CPU_CACHE_INFO*)Buffer1)->CoreType =3D=3D ((CPU_CACHE_INFO*)Buffer=
2)->CoreType) {=0D
+ return 0;=0D
+ } else if (((CPU_CACHE_INFO*)Buffer1)->CoreType < ((CPU_CACHE_INFO*)Buff=
er2)->CoreType) {=0D
+ return 1;=0D
+ } else {=0D
+ return -1;=0D
+ }=0D
+}=0D
+=0D
+/**=0D
+ Sort CpuCacheInfo array by the core type values from largest to smallest=
.=0D
+=0D
+ @param[in, out] CpuCacheInfo Pointer to the CpuCacheInfo array.=0D
+ @param[in] CpuCacheInfoCount The length of CpuCacheInfo array.=0D
+=0D
+**/=0D
+VOID=0D
+CpuCacheInfoSort (=0D
+ IN OUT CPU_CACHE_INFO *CpuCacheInfo,=0D
+ IN UINTN CpuCacheInfoCount=0D
+ )=0D
+{=0D
+ UINTN Index;=0D
+ UINTN NextIndex;=0D
+ UINT32 CurrentPackage;=0D
+ UINT8 CacheInfoCountPerPackage;=0D
+=0D
+ for (Index =3D 0; Index < CpuCacheInfoCount; Index +=3D CacheInfoCountPe=
rPackage) {=0D
+ //=0D
+ // Calculate the number of CpuCacheInfo current processor has.=0D
+ //=0D
+ CurrentPackage =3D CpuCacheInfo[Index].Package;=0D
+ CacheInfoCountPerPackage =3D 1;=0D
+ for (NextIndex =3D Index + 1; NextIndex < CpuCacheInfoCount; NextIndex=
++) {=0D
+ if (CurrentPackage =3D=3D CpuCacheInfo[NextIndex].Package) {=0D
+ CacheInfoCountPerPackage++;=0D
+ }=0D
+ }=0D
+=0D
+ //=0D
+ // Sort CpuCacheInfo for current processor by the core type values fro=
m largest to smallest.=0D
+ //=0D
+ PerformQuickSort (&CpuCacheInfo[Index], CacheInfoCountPerPackage, size=
of (*CpuCacheInfo), (SORT_COMPARE) CpuCacheInfoCompareCoreType);=0D
+ }=0D
+}=0D
+=0D
/**=0D
Get the total number of package and package ID in the platform.=0D
=0D
@@ -325,6 +388,7 @@ CpuCacheInfoCollectCpuCacheInfoData (
if (*CacheInfoCount < LocalCacheInfoCount) {=0D
Status =3D EFI_BUFFER_TOO_SMALL;=0D
} else {=0D
+ CpuCacheInfoSort (LocalCacheInfo, LocalCacheInfoCount);=0D
CopyMem (CacheInfo, LocalCacheInfo, sizeof (*CacheInfo) * LocalCacheIn=
foCount);=0D
DEBUG_CODE (=0D
CpuCacheInfoPrintCpuCacheInfoTable (CacheInfo, LocalCacheInfoCount);=
=0D
@@ -340,7 +404,8 @@ CpuCacheInfoCollectCpuCacheInfoData (
}=0D
=0D
/**=0D
- Get CpuCacheInfo data array.=0D
+ Get CpuCacheInfo data array. The data array is sorted by CPU package ID =
from smallest to largest,=0D
+ by core type from largest to smallest and by cache level from smallest t=
o largest.=0D
=0D
@param[in, out] CpuCacheInfo Pointer to the CpuCacheInfo array.=0D
@param[in, out] CpuCacheInfoCount As input, point to the length of res=
ponse CpuCacheInfo array.=0D
diff --git a/UefiCpuPkg/Include/Library/CpuCacheInfoLib.h b/UefiCpuPkg/Incl=
ude/Library/CpuCacheInfoLib.h
index a66152bce0..d813f53bf7 100644
--- a/UefiCpuPkg/Include/Library/CpuCacheInfoLib.h
+++ b/UefiCpuPkg/Include/Library/CpuCacheInfoLib.h
@@ -59,7 +59,8 @@ typedef struct {
} CPU_CACHE_INFO;=0D
=0D
/**=0D
- Get CpuCacheInfo data array.=0D
+ Get CpuCacheInfo data array. The data array is sorted by CPU package ID =
from smallest to largest,=0D
+ by core type from largest to smallest and by cache level from smallest t=
o largest.=0D
=0D
@param[in, out] CpuCacheInfo Pointer to the CpuCacheInfo array.=0D
@param[in, out] CpuCacheInfoCount As input, point to the length of res=
ponse CpuCacheInfo array.=0D
diff --git a/UefiCpuPkg/Library/CpuCacheInfoLib/DxeCpuCacheInfoLib.inf b/Ue=
fiCpuPkg/Library/CpuCacheInfoLib/DxeCpuCacheInfoLib.inf
index c481080e49..c3d3f1e799 100644
--- a/UefiCpuPkg/Library/CpuCacheInfoLib/DxeCpuCacheInfoLib.inf
+++ b/UefiCpuPkg/Library/CpuCacheInfoLib/DxeCpuCacheInfoLib.inf
@@ -3,7 +3,7 @@
#=0D
# Provides cache info for each package, core type, cache level and cache =
type.=0D
#=0D
-# Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>=0D
+# Copyright (c) 2020 - 2021, Intel Corporation. All rights reserved.<BR>=
=0D
#=0D
# SPDX-License-Identifier: BSD-2-Clause-Patent=0D
#=0D
@@ -25,6 +25,7 @@
=0D
[Packages]=0D
MdePkg/MdePkg.dec=0D
+ MdeModulePkg/MdeModulePkg.dec=0D
UefiCpuPkg/UefiCpuPkg.dec=0D
=0D
[LibraryClasses]=0D
@@ -33,6 +34,7 @@
BaseMemoryLib=0D
MemoryAllocationLib=0D
UefiBootServicesTableLib=0D
+ SortLib=0D
=0D
[Protocols]=0D
gEfiMpServiceProtocolGuid=0D
diff --git a/UefiCpuPkg/Library/CpuCacheInfoLib/InternalCpuCacheInfoLib.h b=
/UefiCpuPkg/Library/CpuCacheInfoLib/InternalCpuCacheInfoLib.h
index b6e6ae5bc5..089d259b3f 100644
--- a/UefiCpuPkg/Library/CpuCacheInfoLib/InternalCpuCacheInfoLib.h
+++ b/UefiCpuPkg/Library/CpuCacheInfoLib/InternalCpuCacheInfoLib.h
@@ -17,6 +17,7 @@
#include <Library/DebugLib.h>=0D
#include <Library/BaseMemoryLib.h>=0D
#include <Library/MemoryAllocationLib.h>=0D
+#include <Library/SortLib.h>=0D
#include <Library/CpuCacheInfoLib.h>=0D
=0D
typedef struct {=0D
diff --git a/UefiCpuPkg/Library/CpuCacheInfoLib/PeiCpuCacheInfoLib.inf b/Ue=
fiCpuPkg/Library/CpuCacheInfoLib/PeiCpuCacheInfoLib.inf
index 0c73015cac..0864497849 100644
--- a/UefiCpuPkg/Library/CpuCacheInfoLib/PeiCpuCacheInfoLib.inf
+++ b/UefiCpuPkg/Library/CpuCacheInfoLib/PeiCpuCacheInfoLib.inf
@@ -3,7 +3,7 @@
#=0D
# Provides cache info for each package, core type, cache level and cache =
type.=0D
#=0D
-# Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>=0D
+# Copyright (c) 2020 - 2021, Intel Corporation. All rights reserved.<BR>=
=0D
#=0D
# SPDX-License-Identifier: BSD-2-Clause-Patent=0D
#=0D
@@ -25,6 +25,7 @@
=0D
[Packages]=0D
MdePkg/MdePkg.dec=0D
+ MdeModulePkg/MdeModulePkg.dec=0D
UefiCpuPkg/UefiCpuPkg.dec=0D
=0D
[LibraryClasses]=0D
@@ -33,6 +34,7 @@
BaseMemoryLib=0D
MemoryAllocationLib=0D
PeiServicesTablePointerLib=0D
+ SortLib=0D
=0D
[Ppis]=0D
gEdkiiPeiMpServices2PpiGuid=0D
--=20
2.28.0.windows.1


Ni, Ray
 

+ Get CpuCacheInfo data array. The data array is sorted by CPU package ID from smallest to largest,
+ by core type from largest to smallest and by cache level from smallest to largest.

Why is core type sorted from largest to smallest but the other twos are sorted from smallest to largest?

What's the issue when sorting the core type value from smallest to largest?

Thanks,
Ray


Jason Lou
 

Hi Ray,

According to the definitions in SDM, the value of "Core" core type(40H) is larger than that of "Atom"
core type(20H), if array is sorted by core type value from largest to smallest, “Core” CPU cache info
can be placed before "Atom" CPU cache info in the CpuCacheInfo array.

No matter how to sort the array by core type value, no issue will occur.
The consumer of the array just need use the same sort rule to process the data of the array.

[SDM definition]
1AH EAX Enumerates the native model ID and core type.
Bits 31-24: Core type
10H: Reserved
20H: Intel Atom®
30H: Reserved
40H: Intel® Core™