diff options
author | xli24 <xli24@6f19259b-4bc3-4df7-8a09-765794883524> | 2009-03-06 03:34:25 +0000 |
---|---|---|
committer | xli24 <xli24@6f19259b-4bc3-4df7-8a09-765794883524> | 2009-03-06 03:34:25 +0000 |
commit | b6ee92ecea373505b056379ce168b4627a5cb265 (patch) | |
tree | e972d924b050af89ef83366cd4f7d1eefa0b15b8 /MdeModulePkg/Library | |
parent | 9075e543711c9d7e44c7f89517367c77ea57d2d7 (diff) | |
download | edk2-platforms-b6ee92ecea373505b056379ce168b4627a5cb265.tar.xz |
Refine BaseMemoryTestLib and add instance with full functionality.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@7831 6f19259b-4bc3-4df7-8a09-765794883524
Diffstat (limited to 'MdeModulePkg/Library')
4 files changed, 306 insertions, 18 deletions
diff --git a/MdeModulePkg/Library/BaseMemoryTestLib/BaseMemoryTestLib.c b/MdeModulePkg/Library/BaseMemoryTestLib/BaseMemoryTestLib.c new file mode 100644 index 0000000000..0b89d5960f --- /dev/null +++ b/MdeModulePkg/Library/BaseMemoryTestLib/BaseMemoryTestLib.c @@ -0,0 +1,227 @@ +/** @file
+ Null instance of Memory Test Library.
+
+Copyright (c) 2009, Intel Corporation.<BR>
+All rights reserved. This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution. The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+**/
+
+#include <Base.h>
+#include <Library/BaseMemoryTestLib.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/CacheMaintenanceLib.h>
+#include <Library/DebugLib.h>
+#include <Library/PcdLib.h>
+#include <Library/ReportStatusCodeLib.h>
+
+
+UINT32 TestPattern[] = {
+ 0x5a5a5a5a,
+ 0xa5a5a5a5,
+ 0x5a5a5a5a,
+ 0xa5a5a5a5,
+ 0x5a5a5a5a,
+ 0xa5a5a5a5,
+ 0x5a5a5a5a,
+ 0xa5a5a5a5,
+ 0x5a5a5a5a,
+ 0xa5a5a5a5,
+ 0x5a5a5a5a,
+ 0xa5a5a5a5,
+ 0x5a5a5a5a,
+ 0xa5a5a5a5,
+ 0x5a5a5a5a,
+ 0xa5a5a5a5
+};
+
+/**
+ Internal worker function for system memory range test.
+
+ This function is the internal worker function for system memory range test.
+ It writes test pattern to memory range and then reads back to check if memory
+ works well.
+
+ @param StartAddress Start address of the memory range to test.
+ @param Length Length of the memory range to test.
+ @param ErrorAddress Address of the memory where error is encountered.
+
+ @retval RETURN_SUCCESS The memory range passes test.
+ @retval RETURN_DEVICE_ERROR The memory range does not pass test.
+
+**/
+RETURN_STATUS
+MemoryTestWorker (
+ IN VOID *StartAddress,
+ IN UINT64 Length,
+ IN UINTN SpanSize,
+ OUT VOID **ErrorAddress
+ )
+{
+ VOID *TempAddress;
+
+ //
+ // Make sure we don't try and test anything above the max physical address range
+ //
+ ASSERT ((UINTN) StartAddress + Length < MAX_ADDRESS);
+
+ REPORT_STATUS_CODE (EFI_PROGRESS_CODE, PcdGet32 (PcdStatusCodeValueMemoryTestStarted));
+
+ //
+ // Write the test pattern into memory range
+ //
+ TempAddress = StartAddress;
+ while ((UINTN) TempAddress < (UINTN) StartAddress + Length) {
+ CopyMem (TempAddress, TestPattern, sizeof (TestPattern));
+ TempAddress = (VOID *) ((UINTN) TempAddress + SpanSize);
+ }
+
+ //
+ // Write back and invalidate cache to make sure data is in memory
+ //
+ WriteBackInvalidateDataCacheRange (StartAddress, (UINTN) Length);
+
+ //
+ // Read pattern from memory and compare it
+ //
+ TempAddress = StartAddress;
+ while ((UINTN) TempAddress < (UINTN) StartAddress + Length) {
+ if (CompareMem (TempAddress, TestPattern, sizeof (TestPattern)) != 0) {
+ //
+ // Value read back does not equal to the value written, so error is detected.
+ //
+ *ErrorAddress = TempAddress;
+ REPORT_STATUS_CODE (EFI_ERROR_CODE | EFI_ERROR_UNRECOVERED, PcdGet32 (PcdStatusCodeValueUncorrectableMemoryError));
+
+ return RETURN_DEVICE_ERROR;
+ }
+
+ TempAddress = (VOID *) ((UINTN) TempAddress + SpanSize);
+ }
+
+ return RETURN_SUCCESS;
+}
+
+/**
+ Perform a quick system memory range test.
+
+ This function performs a quick system memory range test. It leads to quick performance
+ but least reliability.
+
+ @param StartAddress Start address of the memory range to test.
+ @param Length Length of the memory range to test.
+ @param ErrorAddress Address of the memory where error is encountered.
+
+ @retval RETURN_SUCCESS The memory range passes test.
+ @retval RETURN_DEVICE_ERROR The memory range does not pass test.
+
+**/
+RETURN_STATUS
+EFIAPI
+QuickMemoryTest (
+ IN VOID *StartAddress,
+ IN UINT64 Length,
+ OUT VOID **ErrorAddress
+ )
+{
+ RETURN_STATUS Status;
+
+ Status = MemoryTestWorker (
+ StartAddress,
+ Length,
+ sizeof (TestPattern) * 0x20000,
+ ErrorAddress
+ );
+
+ return Status;
+}
+
+/**
+ Test a system memory range with sparsely sampled memory units.
+
+ This function tests a system memory range, whose memory units
+ are sampled sparsely. It leads to relatively good performance
+ and partial reliability.
+
+ @param StartAddress Start address of the memory range to test.
+ @param Length Length of the memory range to test.
+ @param ErrorAddress Address of the memory where error is encountered.
+
+ @retval RETURN_SUCCESS The memory range passes test.
+ @retval RETURN_DEVICE_ERROR The memory range does not pass test.
+
+**/
+RETURN_STATUS
+EFIAPI
+SparseMemoryTest (
+ IN VOID *StartAddress,
+ IN UINT64 Length,
+ OUT VOID **ErrorAddress
+ )
+{
+ RETURN_STATUS Status;
+
+ Status = MemoryTestWorker (
+ StartAddress,
+ Length,
+ sizeof (TestPattern) * 0x8000,
+ ErrorAddress
+ );
+
+ return Status;
+}
+
+/**
+ Test a system memory range with extensively sampled memory units.
+
+ This function tests a system memory range, whose memory units
+ are sampled extensively. Compared with SparseMemoryTest, it achieves
+ more reliability and less performance.
+
+ @param StartAddress Start address of the memory range to test.
+ @param Length Length of the memory range to test.
+ @param ErrorAddress Address of the memory where error is encountered.
+
+ @retval RETURN_SUCCESS The memory range passes test.
+ @retval RETURN_DEVICE_ERROR The memory range does not pass test.
+
+**/
+RETURN_STATUS
+EFIAPI
+ExtensiveMemoryTest (
+ IN VOID *StartAddress,
+ IN UINT64 Length,
+ OUT VOID **ErrorAddress
+ )
+{
+ RETURN_STATUS Status;
+
+ Status = MemoryTestWorker (
+ StartAddress,
+ Length,
+ sizeof (TestPattern),
+ ErrorAddress
+ );
+
+ return Status;
+}
+
+/**
+ Check if soft ECC initialzation is needed for system
+
+ @retval TRUE Soft ECC initialzation is needed.
+ @retval FALSE Soft ECC initialzation is not needed.
+
+**/
+BOOLEAN
+EFIAPI
+IsSoftEccInitRequired (
+ VOID
+ )
+{
+ return FALSE;
+}
diff --git a/MdeModulePkg/Library/BaseMemoryTestLib/BaseMemoryTestLib.inf b/MdeModulePkg/Library/BaseMemoryTestLib/BaseMemoryTestLib.inf new file mode 100644 index 0000000000..f1bd88823f --- /dev/null +++ b/MdeModulePkg/Library/BaseMemoryTestLib/BaseMemoryTestLib.inf @@ -0,0 +1,46 @@ +/** @file
+ Instance of Memory Test Library.
+
+Copyright (c) 2009, Intel Corporation.<BR>
+All rights reserved. This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution. The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+[Defines]
+ INF_VERSION = 0x00010005
+ BASE_NAME = BaseMemoryTestLib
+ FILE_GUID = 216CAA56-AF75-4BBB-9D74-CC0960E92ECB
+ MODULE_TYPE = BASE
+ VERSION_STRING = 1.0
+ LIBRARY_CLASS = BaseMemoryTestLib
+
+#
+# The following information is for reference only and not required by the build tools.
+#
+# VALID_ARCHITECTURES = IA32 X64 IPF EBC
+#
+
+[Sources.common]
+ BaseMemoryTestLib.c
+
+[Packages]
+ MdePkg/MdePkg.dec
+ MdeModulePkg/MdeModulePkg.dec
+
+[LibraryClasses]
+ BaseMemoryTestLib
+ BaseMemoryLib
+ CacheMaintenanceLib
+ DebugLib
+ PcdLib
+ ReportStatusCodeLib
+
+[FixedPcd]
+ gEfiMdePkgTokenSpaceGuid.PcdStatusCodeValueMemoryTestStarted
+ gEfiMdePkgTokenSpaceGuid.PcdStatusCodeValueUncorrectableMemoryError
diff --git a/MdeModulePkg/Library/BaseMemoryTestLibNull/BaseMemoryTestLibNull.c b/MdeModulePkg/Library/BaseMemoryTestLibNull/BaseMemoryTestLibNull.c index 4163e61bb3..e88a22536a 100644 --- a/MdeModulePkg/Library/BaseMemoryTestLibNull/BaseMemoryTestLibNull.c +++ b/MdeModulePkg/Library/BaseMemoryTestLibNull/BaseMemoryTestLibNull.c @@ -15,23 +15,22 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #include <Library/BaseMemoryTestLib.h>
/**
- Test a system memory range with sparsely sampled memory units.
+ Perform a quick system memory range test.
- This function tests a system memory range, whose memory units
- are sampled sparsely. It leads to quick performance but less
- reliability.
+ This function performs a quick system memory range test. It leads to quick performance
+ but least reliability.
@param StartAddress Start address of the memory range to test.
@param Length Length of the memory range to test.
@param ErrorAddress Address of the memory where error is encountered.
@retval RETURN_SUCCESS The memory range passes test.
- @retval RETURNEFI_DEVICE_ERROR The memory range does not pass test.
+ @retval RETURN_DEVICE_ERROR The memory range does not pass test.
**/
RETURN_STATUS
EFIAPI
-SparseMemoryTest (
+QuickMemoryTest (
IN VOID *StartAddress,
IN UINT64 Length,
OUT VOID **ErrorAddress
@@ -41,23 +40,23 @@ SparseMemoryTest ( }
/**
- Test a system memory range with extensively sampled memory units.
+ Test a system memory range with sparsely sampled memory units.
This function tests a system memory range, whose memory units
- are sampled extensively. Compared with SparseMemoryTest, it achieves
- more reliability and less performance.
+ are sampled sparsely. It leads to relatively good performance
+ and partial reliability.
@param StartAddress Start address of the memory range to test.
@param Length Length of the memory range to test.
@param ErrorAddress Address of the memory where error is encountered.
@retval RETURN_SUCCESS The memory range passes test.
- @retval RETURNEFI_DEVICE_ERROR The memory range does not pass test.
+ @retval RETURN_DEVICE_ERROR The memory range does not pass test.
**/
RETURN_STATUS
EFIAPI
-ExtensiveMemoryTest (
+SparseMemoryTest (
IN VOID *StartAddress,
IN UINT64 Length,
OUT VOID **ErrorAddress
@@ -67,23 +66,23 @@ ExtensiveMemoryTest ( }
/**
- Test a system memory range with every memory unit checked.
+ Test a system memory range with extensively sampled memory units.
This function tests a system memory range, whose memory units
- are fully checked. It leads to complete reliability with the
- cost of performance.
+ are sampled extensively. Compared with SparseMemoryTest, it achieves
+ more reliability and less performance.
@param StartAddress Start address of the memory range to test.
@param Length Length of the memory range to test.
@param ErrorAddress Address of the memory where error is encountered.
@retval RETURN_SUCCESS The memory range passes test.
- @retval RETURNEFI_DEVICE_ERROR The memory range does not pass test.
+ @retval RETURN_DEVICE_ERROR The memory range does not pass test.
**/
RETURN_STATUS
EFIAPI
-FullMemoryTest (
+ExtensiveMemoryTest (
IN VOID *StartAddress,
IN UINT64 Length,
OUT VOID **ErrorAddress
@@ -91,3 +90,19 @@ FullMemoryTest ( {
return RETURN_SUCCESS;
}
+
+/**
+ Check if soft ECC initialzation is needed for system
+
+ @retval TRUE Soft ECC initialzation is needed.
+ @retval FALSE Soft ECC initialzation is not needed.
+
+**/
+BOOLEAN
+EFIAPI
+IsSoftEccInitRequired (
+ VOID
+ )
+{
+ return FALSE;
+}
diff --git a/MdeModulePkg/Library/BaseMemoryTestLibNull/BaseMemoryTestLibNull.inf b/MdeModulePkg/Library/BaseMemoryTestLibNull/BaseMemoryTestLibNull.inf index 3587516daf..79f1395f26 100644 --- a/MdeModulePkg/Library/BaseMemoryTestLibNull/BaseMemoryTestLibNull.inf +++ b/MdeModulePkg/Library/BaseMemoryTestLibNull/BaseMemoryTestLibNull.inf @@ -18,7 +18,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. FILE_GUID = D519E511-9C1C-47F5-AE01-FD216E779269
MODULE_TYPE = BASE
VERSION_STRING = 1.0
- LIBRARY_CLASS = MemoryTestLib
+ LIBRARY_CLASS = BaseMemoryTestLib
#
# The following information is for reference only and not required by the build tools.
@@ -34,4 +34,4 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. MdeModulePkg/MdeModulePkg.dec
[LibraryClasses]
- MemoryTestLib
+ BaseMemoryTestLib
|