summaryrefslogtreecommitdiffstats
path: root/src/usr/hwpf/plat/fapiPlatAttributeService.C
diff options
context:
space:
mode:
authorVan Lee <vanlee@us.ibm.com>2012-01-13 09:57:41 -0600
committerA. Patrick Williams III <iawillia@us.ibm.com>2012-02-09 09:57:37 -0600
commit8802f986037017ba5a2e3efa2cb7c054b8bcea7a (patch)
tree7cbeaa363dac607b7c9cc7b3d865e5b90f385066 /src/usr/hwpf/plat/fapiPlatAttributeService.C
parent5b9f174f56e2dbb77178b767f7cb92668ec78e43 (diff)
downloadtalos-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.C96
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
OpenPOWER on IntegriCloud