summaryrefslogtreecommitdiffstats
path: root/src/usr/vpd/rtvpd_load.C
diff options
context:
space:
mode:
Diffstat (limited to 'src/usr/vpd/rtvpd_load.C')
-rw-r--r--src/usr/vpd/rtvpd_load.C148
1 files changed, 148 insertions, 0 deletions
diff --git a/src/usr/vpd/rtvpd_load.C b/src/usr/vpd/rtvpd_load.C
new file mode 100644
index 000000000..cb393e996
--- /dev/null
+++ b/src/usr/vpd/rtvpd_load.C
@@ -0,0 +1,148 @@
+/* IBM_PROLOG_BEGIN_TAG */
+/* This is an automatically generated prolog. */
+/* */
+/* $Source: src/usr/vpd/rtvpd_load.C $ */
+/* */
+/* IBM CONFIDENTIAL */
+/* */
+/* COPYRIGHT International Business Machines Corp. 2013 */
+/* */
+/* 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 otherwise */
+/* divested of its trade secrets, irrespective of what has been */
+/* deposited with the U.S. Copyright Office. */
+/* */
+/* Origin: 30 */
+/* */
+/* IBM_PROLOG_END_TAG */
+#include <errl/errlentry.H>
+#include <targeting/common/target.H>
+#include <targeting/common/targetservice.H>
+#include <targeting/common/utilFilter.H>
+#include <sys/mm.h>
+#include <vmmconst.h>
+#include <pnor/pnorif.H>
+#include <vpd/vpdreasoncodes.H>
+#include <vpd/vpd_if.H>
+
+// ----------------------------------------------
+// Trace definitions
+// ----------------------------------------------
+extern trace_desc_t* g_trac_vpd;
+
+
+/**
+ * Copy a VPD image from PNOR into MEMORY
+ * @param[in] vpd type (pnor section id)
+ * @param[in] destination memory location
+ * @param[in] Max size of image.
+ * @return error handle if error
+ */
+errlHndl_t bld_vpd_image(PNOR::SectionId vpd_type,
+ void * i_dest,
+ uint64_t i_size)
+{
+ errlHndl_t err = NULL;
+ PNOR::SectionInfo_t info;
+ err = PNOR::getSectionInfo( vpd_type,
+ PNOR::CURRENT_SIDE,
+ info );
+
+ if(!err)
+ {
+ if(info.size <= i_size)
+ {
+ memcpy(i_dest,
+ reinterpret_cast<void *>(info.vaddr),
+ info.size);
+ }
+ else
+ {
+ TRACFCOMP( g_trac_vpd, ERR_MRK
+ "bld_vpd_image: Reserved size in memory insufficient "
+ "for VPD type %d. Size provided: %d Size needed: %d",
+ (uint32_t)vpd_type,
+ i_size,
+ info.size );
+
+
+ /*@
+ * @errortype
+ * @reasoncode VPD::VPD_INSUFFICIENT_SPACE_FOR_IMAGE
+ * @severity ERRORLOG::ERRL_SEV_UNRECOVERABLE
+ * @moduleid VPD::VPD_BLD_RT_IMAGE
+ * @userdata1 Size provided
+ * @userdata2 vpd_type | Size required
+ * @devdesc Reserved size in memory insufficient
+ * for runtime VPD
+ */
+ err = new ERRORLOG::ErrlEntry
+ (ERRORLOG::ERRL_SEV_UNRECOVERABLE,
+ VPD::VPD_BLD_RT_IMAGE,
+ VPD::VPD_INSUFFICIENT_SPACE_FOR_IMAGE,
+ i_size,
+ (((uint64_t)vpd_type) << 32) + info.size );
+
+ err->addProcedureCallout(HWAS::EPUB_PRC_HB_CODE,
+ HWAS::SRCI_PRIORITY_HIGH);
+
+ }
+ }
+
+ return err;
+
+}
+
+// External function see vpd_if.H
+errlHndl_t VPD::vpd_load_rt_image(uint64_t & o_vpd_addr)
+{
+ errlHndl_t err = NULL;
+
+ uint64_t vpd_addr = TARGETING::get_top_mem_addr();
+
+ assert (vpd_addr != 0,
+ "bld_devtree: Top of memory was 0!");
+
+ vpd_addr -= VMM_RT_VPD_OFFSET;
+
+ o_vpd_addr = vpd_addr;
+
+ uint8_t * vpd_ptr = reinterpret_cast<uint8_t*>(vpd_addr);
+
+ void * vptr = mm_block_map(vpd_ptr, VMM_RT_VPD_SIZE);
+
+ assert(vptr != NULL,"bld_devtree: Could not map VPD memory");
+
+ vpd_ptr = static_cast<uint8_t*>(vptr);
+
+ err = bld_vpd_image(PNOR::DIMM_JEDEC_VPD,
+ vpd_ptr,
+ VMM_DIMM_JEDEC_VPD_SIZE);
+
+ vpd_ptr += VMM_DIMM_JEDEC_VPD_SIZE;
+
+ if(!err)
+ {
+ err = bld_vpd_image(PNOR::MODULE_VPD,
+ vpd_ptr,
+ VMM_MODULE_VPD_SIZE);
+
+ vpd_ptr += VMM_MODULE_VPD_SIZE;
+ }
+
+ if(!err)
+ {
+ err = bld_vpd_image(PNOR::CENTAUR_VPD,
+ vpd_ptr,
+ VMM_CENTAUR_VPD_SIZE);
+ }
+
+ mm_block_unmap(vptr);
+
+ return err;
+}
OpenPOWER on IntegriCloud