diff options
| author | Elizabeth Liner <eliner@us.ibm.com> | 2017-07-12 16:11:39 -0500 |
|---|---|---|
| committer | Daniel M. Crowell <dcrowell@us.ibm.com> | 2017-08-04 09:52:27 -0400 |
| commit | 8a8925f6eeb973ebc46a1bac8ae1f3923cbee991 (patch) | |
| tree | 335a76b2808ce8f4ea1c908d8716b2e30115578f /src/usr/vpd | |
| parent | 842ef4363d9821d61803358c0f9f57e560728806 (diff) | |
| download | talos-hostboot-8a8925f6eeb973ebc46a1bac8ae1f3923cbee991.tar.gz talos-hostboot-8a8925f6eeb973ebc46a1bac8ae1f3923cbee991.zip | |
MEMD base commit - initial infrastructure for MEMD
Change-Id: Ib8f6b15bfef51ed29529eec957d5352f5f3295fd
RTC:175158
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/43507
Reviewed-by: Martin Gloff <mgloff@us.ibm.com>
Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com>
Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com>
Tested-by: Jenkins OP HW <op-hw-jenkins+hostboot@us.ibm.com>
Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com>
Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com>
Diffstat (limited to 'src/usr/vpd')
| -rw-r--r-- | src/usr/vpd/ipvpd.H | 22 | ||||
| -rw-r--r-- | src/usr/vpd/memd_vpd.C | 228 | ||||
| -rw-r--r-- | src/usr/vpd/memd_vpd.H | 227 | ||||
| -rw-r--r-- | src/usr/vpd/vpd.H | 3 | ||||
| -rw-r--r-- | src/usr/vpd/vpd.mk | 3 |
5 files changed, 479 insertions, 4 deletions
diff --git a/src/usr/vpd/ipvpd.H b/src/usr/vpd/ipvpd.H index e4c416238..299233eac 100644 --- a/src/usr/vpd/ipvpd.H +++ b/src/usr/vpd/ipvpd.H @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2013,2015 */ +/* Contributors Listed Below - COPYRIGHT 2013,2017 */ /* [+] Google Inc. */ /* [+] International Business Machines Corp. */ /* */ @@ -378,7 +378,7 @@ class IpVpdFacade * * @return bool - True if the record is found, False otherwise. */ - bool recordPresent( const char * i_record, + virtual bool recordPresent( const char * i_record, uint16_t & offset, TARGETING::Target * i_target, VPD::vpdCmdTarget i_location ); @@ -719,6 +719,24 @@ class IpVpdFacade const recordInfo* iv_vpdRecords; /** + * @brief Returns the cached pnor address + * + */ + inline static uint64_t getPnorAddr(const IpVpdFacade& x) + { + return x.iv_cachePnorAddr; + } + + /** + * @brief Set the cached pnor address to the given value + * + */ + inline void setPnorAddr(uint64_t i_pnorAddr) + { + this->iv_cachePnorAddr = i_pnorAddr; + } + + /** * @brief Number of VPD Records for current chip * */ diff --git a/src/usr/vpd/memd_vpd.C b/src/usr/vpd/memd_vpd.C new file mode 100644 index 000000000..22147100e --- /dev/null +++ b/src/usr/vpd/memd_vpd.C @@ -0,0 +1,228 @@ +/* IBM_PROLOG_BEGIN_TAG */ +/* This is an automatically generated prolog. */ +/* */ +/* $Source: src/usr/vpd/memd_vpd.C $ */ +/* */ +/* OpenPOWER HostBoot Project */ +/* */ +/* Contributors Listed Below - COPYRIGHT 2013,2017 */ +/* [+] International Business Machines Corp. */ +/* */ +/* */ +/* Licensed under the Apache License, Version 2.0 (the "License"); */ +/* you may not use this file except in compliance with the License. */ +/* You may obtain a copy of the License at */ +/* */ +/* http://www.apache.org/licenses/LICENSE-2.0 */ +/* */ +/* Unless required by applicable law or agreed to in writing, software */ +/* distributed under the License is distributed on an "AS IS" BASIS, */ +/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or */ +/* implied. See the License for the specific language governing */ +/* permissions and limitations under the License. */ +/* */ +/* IBM_PROLOG_END_TAG */ +// ---------------------------------------------- +// Includes +// ---------------------------------------------- +#include <string.h> +#include <endian.h> +#include <trace/interface.H> +#include <errl/errlentry.H> +#include <errl/errlmanager.H> +#include <targeting/common/targetservice.H> +#include <targeting/common/util.H> +#include <targeting/common/utilFilter.H> +#include <devicefw/driverif.H> +#include <vfs/vfs.H> +#include <vpd/vpdreasoncodes.H> +#include <vpd/memd_vpdenums.H> +#include <vpd/vpd_if.H> +#include <i2c/eepromif.H> +#include <config.h> +#include "memd_vpd.H" +#include "cvpd.H" +#include "vpd.H" +#include "pvpd.H" +#include <initservice/initserviceif.H> + +// ---------------------------------------------- +// Trace definitions +// ---------------------------------------------- +extern trace_desc_t* g_trac_vpd; + + +// ------------------------ +// Macros for unit testing +//#define TRACUCOMP(args...) TRACFCOMP(args) +#define TRACUCOMP(args...) +//#define TRACSSCOMP(args...) TRACFCOMP(args) +#define TRACSSCOMP(args...) + +namespace MEMD_VPD +{ + // ---------------------------------------------- + // Globals + // ---------------------------------------------- + mutex_t g_mutex = MUTEX_INITIALIZER; + + + /** + * @brief This function will perform the steps required to do a read from + * the Hostboot MEMD_VPD data. + * + * @param[in] i_opType - Operation Type - See DeviceFW::OperationType in + * driververif.H + * + * @param[in] i_target - Processor Target device + * + * @param [in/out] io_buffer - Pointer to the data that was read from + * the target device. This parameter, when set to NULL, will return + * the keyword size value in io_buflen. + * + * @param [in/out] io_buflen - Length of the buffer to be read or written + * to/from the target. This value should indicate the size of the + * io_buffer parameter that has been allocated. Being returned it + * will indicate the number of valid bytes in the buffer being + * returned. This parameter will contain the size of a keyword when + * the io_buffer parameter is passed in NULL. + * + * @param [in] i_accessType - Access Type - See DeviceFW::AccessType in + * usrif.H + * + * @param [in] i_args - This is an argument list for the device driver + * framework. + * + * @return errlHndl_t - NULL if successful, otherwise a pointer to the + * error log. + */ + errlHndl_t MEMD_VPDRead ( 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; + IpVpdFacade::input_args_t args; + args.record = ((MEMD_VPDRecord)va_arg( i_args, uint64_t )); + args.keyword = ((MEMD_VPDKeyword)va_arg( i_args, uint64_t )); + args.location = ((VPD::vpdCmdTarget)va_arg( i_args, uint64_t )); + + TRACSSCOMP( g_trac_vpd, + ENTER_MRK"MEMD_VPDRead()" ); + + err = Singleton<MEMD_VpdFacade>::instance().read(i_target, + io_buffer, + io_buflen, + args); + + return err; + } + + + /** + * @brief This function will perform the steps required to do a write to + * the Hostboot MEMD_VPD data. + * + * @param[in] i_opType - Operation Type - See DeviceFW::OperationType in + * driververif.H + * + * @param[in] i_target - Processor Target device + * + * @param [in/out] io_buffer - Pointer to the data that was read from + * the target device. It will also be used to contain data to + * be written to the device. + * + * @param [in/out] io_buflen - Length of the buffer to be read or written + * to/from the target. This value should indicate the size of the + * io_buffer parameter that has been allocated. Being returned it + * will indicate the number of valid bytes in the buffer being + * returned. + * + * @param [in] i_accessType - Access Type - See DeviceFW::AccessType in + * usrif.H + * + * @param [in] i_args - This is an argument list for the device driver + * framework. + * + * @return errlHndl_t - NULL if successful, otherwise a pointer to the + * error log. + */ + errlHndl_t MEMD_VPDWrite ( 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; + IpVpdFacade::input_args_t args; + args.record = ((MEMD_VPDRecord)va_arg( i_args, uint64_t )); + args.keyword = ((MEMD_VPDKeyword)va_arg( i_args, uint64_t )); + args.location = ((VPD::vpdCmdTarget)va_arg( i_args, uint64_t )); + + TRACSSCOMP( g_trac_vpd, + ENTER_MRK"MEMD_VPDWrite()" ); + + + err = Singleton<MEMD_VpdFacade>::instance().write(i_target, + io_buffer, + io_buflen, + args); + + return err; + } + + // Register with the routing code + DEVICE_REGISTER_ROUTE( DeviceFW::READ, + DeviceFW::MEMD_VPD, + TARGETING::TYPE_MCS, + MEMD_VPDRead ); + DEVICE_REGISTER_ROUTE( DeviceFW::WRITE, + DeviceFW::MEMD_VPD, + TARGETING::TYPE_MCS, + MEMD_VPDWrite ); + +}; // end namespace MEMD_VPD + + +//MEMD_VpdFacade Class Functions +/** + * @brief Constructor + * Planar VPD is included in the Centaur PNOR section. + * Including with Centaur vpd minimizes the number of PNOR sections. + */ +MEMD_VpdFacade::MEMD_VpdFacade() : +IpVpdFacade(MEMD_VPD::SECTION_SIZE, + MEMD_VPD::MAX_SECTIONS, + MEMD_VPD::MEMD_VPDRecords, + (sizeof(MEMD_VPD::MEMD_VPDRecords)/sizeof( + MEMD_VPD::MEMD_VPDRecords[0])), + MEMD_VPD::MEMD_VPDKeywords, + (sizeof(MEMD_VPD::MEMD_VPDKeywords)/sizeof( + MEMD_VPD::MEMD_VPDKeywords[0])), + PNOR::MEMD, // note use of MEMD + MEMD_VPD::g_mutex, + VPD::VPD_INVALID) // Direct access memory +{ + TRACUCOMP(g_trac_vpd, "MEMD_VpdFacade::MEMD_VpdFacade> " ); + + iv_configInfo.vpdReadPNOR = true; + iv_configInfo.vpdReadHW = false; + iv_configInfo.vpdWritePNOR = false; + iv_configInfo.vpdWriteHW = false; +} + +/** + * @brief returns true if the record is present in this facade. + * this will always return true in this function + */ +bool MEMD_VpdFacade::recordPresent( const char * i_record, + uint16_t & offset, + TARGETING::Target * i_target, + VPD::vpdCmdTarget i_location ) +{ + offset = 0; + return true; +} diff --git a/src/usr/vpd/memd_vpd.H b/src/usr/vpd/memd_vpd.H new file mode 100644 index 000000000..d94532b4a --- /dev/null +++ b/src/usr/vpd/memd_vpd.H @@ -0,0 +1,227 @@ +/* IBM_PROLOG_BEGIN_TAG */ +/* This is an automatically generated prolog. */ +/* */ +/* $Source: src/usr/vpd/memd_vpd.H $ */ +/* */ +/* OpenPOWER HostBoot Project */ +/* */ +/* Contributors Listed Below - COPYRIGHT 2013,2017 */ +/* [+] International Business Machines Corp. */ +/* */ +/* */ +/* Licensed under the Apache License, Version 2.0 (the "License"); */ +/* you may not use this file except in compliance with the License. */ +/* You may obtain a copy of the License at */ +/* */ +/* http://www.apache.org/licenses/LICENSE-2.0 */ +/* */ +/* Unless required by applicable law or agreed to in writing, software */ +/* distributed under the License is distributed on an "AS IS" BASIS, */ +/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or */ +/* implied. See the License for the specific language governing */ +/* permissions and limitations under the License. */ +/* */ +/* IBM_PROLOG_END_TAG */ +#ifndef __MEMD_VPD_H +#define __MEMD_VPD_H + + +/** + * @file MEMD_VPD.H + * + * @brief Provides the interfaces for the MEMD_VPD device driver + * + */ + +// ---------------------------------------------- +// Includes +// ---------------------------------------------- +#include <errl/errlentry.H> +#include <vpd/memd_vpdenums.H> + +#include "ipvpd.H" +#include <config.h> + +namespace MEMD_VPD +{ + + enum + { + MAX_SECTIONS = 1, + SECTION_SIZE = 0x6000, + }; + + + /** + * @brief Conversion of MEMD_VPD Records to corresponding character + * representation. + */ + const IpVpdFacade::recordInfo MEMD_VPDRecords[] = + { + // ------------------------------------------------------------------- + // NOTE: This list must remain an ordered list! There is a + // testcase that checks this. When adding new entries to the + // list, be sure that the keyword in each entry (value 0) + // are in ascending order. + // ------------------------------------------------------------------- + { MEMD, "MEMD" }, + + // ------------------------------------------------------------------- + // DO NOT USE!! This is for test purposes ONLY! + { MEMD_VPD_TEST_RECORD, "TEST" }, + // ------------------------------------------------------------------- + }; + + /** + * @brief Conversion of MEMD_VPD Keywords to corresponding character + * representation. + */ + const IpVpdFacade::keywordInfo MEMD_VPDKeywords[] = + { + // ------------------------------------------------------------------- + // NOTE: This list must remain an ordered list! There is a + // testcase that checks this. When adding new entries to + // the list, be sure that the keyword in each entry (value 0) + // are in ascending order. + // ------------------------------------------------------------------- + { B3, "B3" }, + { B4, "B4" }, + { B7, "B7" }, + { CC, "CC" }, + { CE, "CE" }, + { CT, "CT" }, + { DR, "DR" }, + { FC, "FC" }, + { FN, "FN" }, + { HE, "HE" }, + { HW, "HW" }, + { I2, "I2" }, + { IN, "IN" }, + { J0, "J0" }, + { J1, "J1" }, + { J2, "J2" }, + { J3, "J3" }, + { J4, "J4" }, + { J5, "J5" }, + { J6, "J6" }, + { J7, "J7" }, + { J8, "J8" }, + { J9, "J9" }, + { JA, "JA" }, + { JB, "JB" }, + { JC, "JC" }, + { JD, "JD" }, + { JE, "JE" }, + { JF, "JF" }, + { JG, "JG" }, + { JH, "JH" }, + { JI, "JI" }, + { JJ, "JJ" }, + { JK, "JK" }, + { JL, "JL" }, + { JM, "JM" }, + { JN, "JN" }, + { JO, "JO" }, + { JP, "JP" }, + { JQ, "JQ" }, + { JR, "JR" }, + { JS, "JS" }, + { JT, "JT" }, + { JU, "JU" }, + { JV, "JV" }, + { JW, "JW" }, + { JX, "JX" }, + { JY, "JY" }, + { JZ, "JZ" }, + { LX, "LX" }, + { MR, "MR" }, + { MT, "MT" }, + { PF, "PF" }, + { PN, "PN" }, + { PR, "PR" }, + { RB, "RB" }, + { RG, "RG" }, + { RT, "RT" }, + { SE, "SE" }, + { SN, "SN" }, + { SO, "SO" }, + { TM, "TM" }, + { VM, "VM" }, + { VZ, "VZ" }, + { X0, "X0" }, + { X1, "X1" }, + { X2, "X2" }, + { X3, "X3" }, + { X4, "X4" }, + { X5, "X5" }, + { X6, "X6" }, + { X7, "X7" }, + { X8, "X8" }, + { X9, "X9" }, + { XA, "XA" }, + { XB, "XB" }, + { XC, "XC" }, + { XD, "XD" }, + { XE, "XE" }, + { XF, "XF" }, + { XG, "XG" }, + { XH, "XH" }, + { XI, "XI" }, + { XJ, "XJ" }, + { XK, "XK" }, + { XL, "XL" }, + { XM, "XM" }, + { XN, "XN" }, + { XO, "XO" }, + { XP, "XP" }, + { XQ, "XQ" }, + { XR, "XR" }, + { XS, "XS" }, + { XT, "XT" }, + { XU, "XU" }, + { XV, "XV" }, + { XW, "XW" }, + { XX, "XX" }, + { XY, "XY" }, + { XZ, "XZ" }, + { Q0, "Q0" }, + { Q1, "Q1" }, + { Q2, "Q2" }, + { Q3, "Q3" }, + { Q4, "Q4" }, + { Q5, "Q5" }, + { Q6, "Q6" }, + { Q7, "Q7" }, + { Q8, "Q8" }, + { CK, "CK" }, + + // ------------------------------------------------------------------- + // DO NOT USE!! This is for test purposes ONLY! + { MEMD_VPD_TEST_KEYWORD, "ZZ" }, + // ------------------------------------------------------------------- + + //Common ipvpd + { FULL_RECORD, "FL"}, + }; + +}; // end MEMD_VPD namespace + +class MEMD_VpdFacade: public IpVpdFacade +{ + public: + + /** + * @brief Constructor + */ + MEMD_VpdFacade( ); + + + protected: + virtual bool recordPresent( const char * i_record, + uint16_t & offset, + TARGETING::Target * i_target, + VPD::vpdCmdTarget i_location ); + + +}; +#endif // __MEMD_VPD_H diff --git a/src/usr/vpd/vpd.H b/src/usr/vpd/vpd.H index 99340c0cd..c7fb329ae 100644 --- a/src/usr/vpd/vpd.H +++ b/src/usr/vpd/vpd.H @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2013,2016 */ +/* Contributors Listed Below - COPYRIGHT 2013,2017 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -47,6 +47,7 @@ struct pnorInformation */ enum VPD_MSG_TYPE { + VPD_INVALID = 0x0000, VPD_WRITE_DIMM = 0x00C1, //< DIMM SPD VPD_WRITE_PROC = 0x00C2, //< Processor MVPD VPD_WRITE_MEMBUF = 0x00C3, //< Centaur FRU VPD diff --git a/src/usr/vpd/vpd.mk b/src/usr/vpd/vpd.mk index 58702127e..d07a2bbea 100644 --- a/src/usr/vpd/vpd.mk +++ b/src/usr/vpd/vpd.mk @@ -5,7 +5,7 @@ # # OpenPOWER HostBoot Project # -# Contributors Listed Below - COPYRIGHT 2013,2016 +# Contributors Listed Below - COPYRIGHT 2013,2017 # [+] International Business Machines Corp. # # @@ -29,5 +29,6 @@ OBJS += mvpd.o OBJS += cvpd.o OBJS += pvpd.o OBJS += dvpd.o +OBJS += memd_vpd.o OBJS += spd.o OBJS += errlud_vpd.o |

