diff options
author | Terry J. Opie <opiet@us.ibm.com> | 2012-01-03 15:06:17 -0600 |
---|---|---|
committer | A. Patrick Williams III <iawillia@us.ibm.com> | 2012-02-16 13:41:54 -0600 |
commit | 4690f9cb99f289dd88b1f1047145841d8386b0d3 (patch) | |
tree | 6a08e8c640ace271b0019bef5a542646d0969807 /src/usr/spd/dimmPres.C | |
parent | 5f6568a59e35570f149d148f0cb24e068e70efcf (diff) | |
download | talos-hostboot-4690f9cb99f289dd88b1f1047145841d8386b0d3.tar.gz talos-hostboot-4690f9cb99f289dd88b1f1047145841d8386b0d3.zip |
DIMM Presence Detect
- Detect DIMMs by reading BASIC_MEMORY_TYPE
- Testcases to test DIMM Presence Detect
- Added new SPD Keyword Enumeration
- Modified table lookup for DRAM_MANUFACTURER_ID
- New DIMM SPD data from Hardware team
Change-Id: I11a0b8ad4b13d6200a58efc7459396f0a12695f2
Reviewed-on: http://gfw160.austin.ibm.com:8080/gerrit/646
Tested-by: Jenkins Server
Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
Diffstat (limited to 'src/usr/spd/dimmPres.C')
-rwxr-xr-x | src/usr/spd/dimmPres.C | 158 |
1 files changed, 158 insertions, 0 deletions
diff --git a/src/usr/spd/dimmPres.C b/src/usr/spd/dimmPres.C new file mode 100755 index 000000000..57183f650 --- /dev/null +++ b/src/usr/spd/dimmPres.C @@ -0,0 +1,158 @@ +// IBM_PROLOG_BEGIN_TAG +// This is an automatically generated prolog. +// +// $Source: src/usr/spd/dimmPres.C $ +// +// IBM CONFIDENTIAL +// +// COPYRIGHT International Business Machines Corp. 2012 +// +// p1 +// +// Object Code Only (OCO) source materials +// Licensed Internal Code Source Materials +// IBM HostBoot Licensed Internal Code +// +// The source code for this program is not published or other- +// wise divested of its trade secrets, irrespective of what has +// been deposited with the U.S. Copyright Office. +// +// Origin: 30 +// +// IBM_PROLOG_END +/** + * @file dimmPres.C + * + * @brief Implementation of the DIMM Presence detect. + * + */ + +// ---------------------------------------------- +// Includes +// ---------------------------------------------- +#include <trace/interface.H> +#include <errl/errlentry.H> +#include <errl/errlmanager.H> +#include <targeting/targetservice.H> +#include <devicefw/driverif.H> +#include <spd/spdreasoncodes.H> +#include <spd/spdenums.H> + +#include "spd.H" + +// ---------------------------------------------- +// Globals +// ---------------------------------------------- + +// ---------------------------------------------- +// Trace definitions +// ---------------------------------------------- +extern trace_desc_t * g_trac_spd; + +// ------------------------ +// Macros for unit testing +//#define TRACUCOMP(args...) TRACFCOMP(args) +#define TRACUCOMP(args...) +//#define TRACSSCOMP(args...) TRACFCOMP(args) +#define TRACSSCOMP(args...) + +// ---------------------------------------------- +// Defines +// ---------------------------------------------- + + +namespace SPD +{ + +// Register the Presence detect code with the framework. +DEVICE_REGISTER_ROUTE( DeviceFW::READ, + DeviceFW::PRESENT, + TARGETING::TYPE_DIMM, + dimmPresenceDetect ); + +// ------------------------------------------------------------------ +// dimmPresenceDetect +// ------------------------------------------------------------------ +errlHndl_t dimmPresenceDetect( DeviceFW::OperationType i_opType, + TARGETING::Target * i_target, + void * io_buffer, + size_t & io_buflen, + int64_t i_accessType, + va_list i_args ) +{ + errlHndl_t err = NULL; + bool present = false; + size_t presentSz = sizeof(present); + + TRACSSCOMP( g_trac_spd, + ENTER_MRK"spdPresenceDetect()" ); + + do + { + // Check to be sure that the buffer is big enough. + if( !(io_buflen >= sizeof(bool)) ) + { + TRACFCOMP( g_trac_spd, + ERR_MRK"spdPresenceDetect() - Invalid Data Length: %d", + io_buflen ); + + /*@ + * @errortype + * @reasoncode SPD_INSUFFICIENT_BUFFER_SIZE + * @severity ERRORLOG::ERRL_SEV_UNRECOVERABLE + * @moduleid SPD_PRESENCE_DETECT + * @userdata1 Buffer Length + * @userdata2 <UNUSED> + * @devdesc Buffer for checking Presence Detect was not the correct size. + */ + err = new ERRORLOG::ErrlEntry( ERRORLOG::ERRL_SEV_UNRECOVERABLE, + SPD_PRESENCE_DETECT, + SPD_INSUFFICIENT_BUFFER_SIZE, + TO_UINT64(io_buflen), + 0x0 ); + + break; + } + + // Read Byte 2 (BASIC_MEMORY_TYPE) for the target passed in. + uint16_t data = 0x0; + size_t dataSz = sizeof(data); + err = spdGetKeywordValue( BASIC_MEMORY_TYPE, + &data, + dataSz, + i_target ); + + if( err ) + { + // If an error is returned, the DIMM is not present. + present = false; + TRACUCOMP( g_trac_spd, + INFO_MRK"Dimm was found to be NOT present." ); + + memcpy( io_buffer, &present, presentSz ); + io_buflen = 0; + + // Delete the error + delete err; + err = NULL; + } + else + { + // DIMM is present... + present = true; + TRACUCOMP( g_trac_spd, + INFO_MRK"Dimm was found to be present." ); + + memcpy( io_buffer, &present, presentSz ); + io_buflen = presentSz; + } + } while( 0 ); + + TRACSSCOMP( g_trac_spd, + EXIT_MRK"spdPresenceDetect()" ); + + return err; +} // end dimmPresenceDetect + + +}; // end namespace SPD |