diff options
author | Van Lee <vanlee@us.ibm.com> | 2012-01-13 09:57:41 -0600 |
---|---|---|
committer | A. Patrick Williams III <iawillia@us.ibm.com> | 2012-02-09 09:57:37 -0600 |
commit | 8802f986037017ba5a2e3efa2cb7c054b8bcea7a (patch) | |
tree | 7cbeaa363dac607b7c9cc7b3d865e5b90f385066 /src/usr/hwpf/plat/fapiPlatAttributeService.C | |
parent | 5b9f174f56e2dbb77178b767f7cb92668ec78e43 (diff) | |
download | talos-hostboot-8802f986037017ba5a2e3efa2cb7c054b8bcea7a.tar.gz talos-hostboot-8802f986037017ba5a2e3efa2cb7c054b8bcea7a.zip |
HWPF Attribute Support: DIMM SPD Attributes - RTC4590
Change-Id: I4557a6a67ea73f13e2bcca6e05af57cba8d5a9e1
Reviewed-on: http://gfw160.austin.ibm.com:8080/gerrit/613
Tested-by: Jenkins Server
Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
Diffstat (limited to 'src/usr/hwpf/plat/fapiPlatAttributeService.C')
-rw-r--r-- | src/usr/hwpf/plat/fapiPlatAttributeService.C | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/src/usr/hwpf/plat/fapiPlatAttributeService.C b/src/usr/hwpf/plat/fapiPlatAttributeService.C index b106cbb6e..916e11b5e 100644 --- a/src/usr/hwpf/plat/fapiPlatAttributeService.C +++ b/src/usr/hwpf/plat/fapiPlatAttributeService.C @@ -33,10 +33,13 @@ // Includes //****************************************************************************** +#include <hwpf/fapi/fapiTarget.H> #include <targeting/targetservice.H> #include <errl/errlentry.H> #include <hwpf/plat/fapiPlatAttributeService.H> #include <hwpf/plat/fapiPlatReasonCodes.H> +#include <spd/spdenums.H> +#include <devicefw/driverif.H> // The following file checks at compile time that all HWPF attributes are // handled by Hostboot. This is done to ensure that the HTML file listing @@ -99,6 +102,99 @@ fapi::ReturnCode createAttrAccessError( return l_rc; } +//****************************************************************************** +// platUpdateAttrValue function reformats the Attribute value if needed based +// on the format documented in the HWPF attributei xml file. +//****************************************************************************** +static void platUpdateAttrValue( const uint16_t i_keyword, void * o_data ) +{ + FAPI_DBG(ENTER_MRK "platUpdateAttrValue"); + + uint32_t l_word = 0; + uint8_t *l_byte = static_cast<uint8_t *>(o_data); + bool l_update = true; + + switch( i_keyword ) + { + // These attributes are 4-byte uint32_t values. The DD returns 2-byte + // left-aligned value. Need to move it to right-aligned format. + case SPD::CAS_LATENCIES_SUPPORTED: + case SPD::TRAS_MIN: + case SPD::TRC_MIN: + case SPD::TRFC_MIN: + case SPD::TFAW_MIN: + case SPD::MODULE_MANUFACTURING_DATE: + case SPD::MODULE_MANUFACTURER_ID: + l_word |= (*l_byte++ << 8); + l_word |= (*l_byte); + break; + // These attributes are 4-bytes uint32_t values. The DD returns 2-byte + // left-aligned and byte-swapped value. Need to move it to right-aligned + // and reverse the bytes + case SPD::MODULE_CRC: + case SPD::MODULE_REVISION_CODE: + case SPD::DRAM_MANUFACTURER_ID: + l_word |= (*l_byte++); + l_word |= (*l_byte << 8); + break; + // This attribute are 4-bytes uint32_t. The DD returns in big-endian + // format. Need to change to little endian + case SPD::MODULE_SERIAL_NUMBER: + l_word |= (*l_byte++); + l_word |= (*l_byte++ << 8); + l_word |= (*l_byte++ << 16); + l_word |= (*l_byte << 24); + break; + default: + l_update = false; + break; + } + + if (l_update) + { + memcpy( o_data, &l_word, sizeof(l_word) ); + } + + FAPI_DBG(EXIT_MRK "platUpdateAttrValue"); + +} + +//****************************************************************************** +// fapiPlatGetSpdAttr function. +// Call SPD device driver to retrieve the SPD attribute +//****************************************************************************** +fapi::ReturnCode fapiPlatGetSpdAttr(const fapi::Target * i_target, + const uint16_t i_keyword, + void * o_data, const size_t i_len) +{ + FAPI_DBG(ENTER_MRK "fapiPlatGetSpdAttr"); + + fapi::ReturnCode l_rc; + + // Extract the component pointer + TARGETING::Target* l_target = + reinterpret_cast<TARGETING::Target*>(i_target->get()); + + errlHndl_t l_err = NULL; + size_t l_len = i_len; + l_err = deviceRead( l_target, o_data, l_len, DEVICE_SPD_ADDRESS(i_keyword)); + + if (l_err) + { + // Add the error log pointer as data to the ReturnCode + FAPI_ERR("platGetSpdAttr: deviceOp() returns error"); + l_rc.setPlatError(reinterpret_cast<void *> (l_err)); + } + else + { + platUpdateAttrValue( i_keyword, o_data ); + } + + FAPI_DBG(EXIT_MRK "fapiPlatGetSpdAttr"); + return l_rc; + +} + } // End platAttrSvc namespace } // End fapi namespace |