Skip to content

Commit

Permalink
Support fapi2 i2c functions
Browse files Browse the repository at this point in the history
New interface in fapi2 to perform i2c operations directly.
This is needed for OCMB access before we get OMI bus running,
specifically as part of a cmd/rsp protocol.

Change-Id: I8b778f12f8c0c6820ceb51146f1e21d30891c964
RTC:197029
Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/63919
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: Christian R. Geddes <crgeddes@us.ibm.com>
Reviewed-by: Corey V. Swenson <cswenson@us.ibm.com>
Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com>
  • Loading branch information
mderkse1 authored and dcrowell77 committed Sep 20, 2018
1 parent 5abc57b commit 165bb46
Show file tree
Hide file tree
Showing 11 changed files with 1,152 additions and 168 deletions.
22 changes: 21 additions & 1 deletion src/include/usr/devicefw/userif.H
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ namespace DeviceFW
DEPRECATED_MEMD_VPD,
NODECOMM,
NVDIMM,

FAPI_I2C,
LAST_ACCESS_TYPE,
};

Expand Down Expand Up @@ -366,13 +366,33 @@ namespace DeviceFW
static_cast<uint64_t>(( i_mode )),\
static_cast<uint64_t>(( i_link_id )),\
static_cast<uint64_t>(( i_mailbox_id ))

/**
* Construct the device addressing parameters for the NVDIMM device ops.
* @param[i] i_address - NVDIMM address to internal register
*/
#define DEVICE_NVDIMM_ADDRESS(i_address)\
DeviceFW::NVDIMM, static_cast<uint64_t>((i_address))


/**
* Construct the device addressing parameters for the FAPI I2C operation
* with an initial configuration needed
*
* @param[in] i_cfg_buf_size - cfg buffer size
* @param[in] i_cfg_buf - buffer that holds data to write to the HW target.
*/
#define DEVICE_FAPI_I2C_ADDRESS_WCONFIG(i_cfg_buf_size, i_cfg_buf) \
DeviceFW::FAPI_I2C,\
static_cast<size_t>(( i_cfg_buf_size )),\
static_cast<uint8_t*>(( i_cfg_buf ))

/**
* Construct the device addressing parameters for the FAPI I2C operation
*/
#define DEVICE_FAPI_I2C_ADDRESS()\
DEVICE_FAPI_I2C_ADDRESS_WCONFIG( 0, NULL )

/**
* @brief Perform a hardware read operation.
*
Expand Down
80 changes: 80 additions & 0 deletions src/include/usr/fapi2/i2c_access.H
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
/* IBM_PROLOG_BEGIN_TAG */
/* This is an automatically generated prolog. */
/* */
/* $Source: src/include/usr/fapi2/i2c_access.H $ */
/* */
/* OpenPOWER HostBoot Project */
/* */
/* Contributors Listed Below - COPYRIGHT 2018 */
/* [+] 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 */
/// @file i2c_access.H
///
/// @brief Hardware access functions that needs to be specialized for
/// platform implementation.
///

#ifndef _FAPI2_I2CACCESS_H_
#define _FAPI2_I2CACCESS_H_

#include <fapi2_i2c_access.H>
#include <plat_i2c_access.H>

namespace fapi2
{

//------------------------------------------------------------------------------
// HW Communication Functions to be implemented at the platform layer.
//------------------------------------------------------------------------------
/**
* @brief Platform-level implementation of getI2c()
* @tparam K the type (Kind) of target, from i_target
* @param[in] i_target HW target to operate on.
* @param[in] i_get_size Size that getI2c will read from the HW target.
* @param[in] i_data Buffer that holds data to write to the HW target.
* May be empty if no address/command is required
* before the read.
* @param[out] o_data Buffer that holds data read from HW target.
* @return fapi2::ReturnCode. FAPI2_RC_SUCCESS if success, else error code.
*/
template< TargetType K >
inline ReturnCode getI2c(const Target<K>& i_target,
const size_t i_get_size,
const std::vector<uint8_t>& i_data,
std::vector<uint8_t>& o_data)
{
return platGetI2c(i_target, i_get_size, i_data, o_data);
}


/**
* @brief Platform-level implementation of putI2c()
* @tparam K the type (Kind) of target, from i_target
* @param[in] i_target HW target to operate on.
* @param[in] i_data Buffer that holds data to write to the HW target.
* @return fapi2::ReturnCode. FAPI2_RC_SUCCESS if success, else error code.
*/
template< TargetType K >
inline ReturnCode putI2c(const Target<K>& i_target,
const std::vector<uint8_t>& i_data)
{
return platPutI2c(i_target, i_data);
}

};

#endif // _FAPI2_I2CACCESS_H_
61 changes: 61 additions & 0 deletions src/include/usr/fapi2/plat_i2c_access.H
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
/* IBM_PROLOG_BEGIN_TAG */
/* This is an automatically generated prolog. */
/* */
/* $Source: src/include/usr/fapi2/plat_i2c_access.H $ */
/* */
/* OpenPOWER HostBoot Project */
/* */
/* Contributors Listed Below - COPYRIGHT 2018 */
/* [+] 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 */
/// @file plat_i2c_access.H
///
/// @brief Platform i2c-access definitions
///

#ifndef _FAPI2_PLAT_I2CACCESS_H_
#define _FAPI2_PLAT_I2CACCESS_H_

namespace fapi2
{

/**
* @brief Platform-level implementation of getI2c()
* @param[in] i_target FAPI HW target to operate on.
* @param[in] i_get_size Size that getI2c will read from the HW target.
* @param[in] i_cfgData Buffer that holds data to write to the HW target.
* May be empty if no address/command is required
* before the read.
* @param[out] o_data Buffer that holds data read from HW target.
* @return fapi2::ReturnCode. FAPI2_RC_SUCCESS if success, else error code.
*/
ReturnCode platGetI2c( const Target<TARGET_TYPE_ALL>& i_target,
const size_t i_get_size,
const std::vector<uint8_t>& i_cfgData,
std::vector<uint8_t>& o_data );

/**
* @brief Platform-level implementation of putI2c()
* @param[in] i_target FAPI HW target to operate on.
* @param[in] i_data Buffer that holds data to write to the HW target.
* @return fapi2::ReturnCode. FAPI2_RC_SUCCESS if success, else error code.
*/
ReturnCode platPutI2c( const Target<TARGET_TYPE_ALL>& i_target,
const std::vector<uint8_t>& i_data );

};
#endif // _FAPI2_PLAT_I2CACCESS_H_
43 changes: 23 additions & 20 deletions src/include/usr/i2c/i2creasoncodes.H
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
/* Contributors Listed Below - COPYRIGHT 2011,2016 */
/* Contributors Listed Below - COPYRIGHT 2011,2018 */
/* [+] International Business Machines Corp. */
/* */
/* */
Expand Down Expand Up @@ -62,6 +62,8 @@ enum i2cModuleId
I2C_PAGE_SWITCH_OP = 0x0C,
I2C_PAGE_UNLOCK_OP = 0x0D,
I2C_CHOOSE_EEPROM_PAGE = 0x0E,
FAPI_I2C_PERFORM_OP = 0x0F,
READ_I2C_ATTRIBUTES = 0x10,
};


Expand All @@ -73,25 +75,26 @@ enum i2cModuleId
*/
enum i2cReasonCode
{
I2C_INVALID_REASONCODE = I2C_COMP_ID | 0x00, // Invalid Reasoncode
I2C_INVALID_DATA_BUFFER = I2C_COMP_ID | 0x01, // Invalid Data Buffer pointer
I2C_INVALID_OP_TYPE = I2C_COMP_ID | 0x02, // Invalid Operation type
I2C_FIFO_TIMEOUT = I2C_COMP_ID | 0x03, // Timed out waiting on FIFO
I2C_BUS_NOT_READY = I2C_COMP_ID | 0x04, // Bus Not ready
I2C_CMD_COMP_TIMEOUT = I2C_COMP_ID | 0x05, // Timeout waiting for Cmd Complete
I2C_HW_ERROR_FOUND = I2C_COMP_ID | 0x06, // Error found in status register
I2C_MASTER_SENTINEL_TARGET = I2C_COMP_ID | 0x07, // Master Sentinel used as target
I2C_NO_CENTAUR_FOUND = I2C_COMP_ID | 0x08, // No Centaur chip found
I2C_NO_PROC_FOUND = I2C_COMP_ID | 0x09, // No Processor chip found
I2C_ATTRIBUTE_NOT_FOUND = I2C_COMP_ID | 0x0A, // Needed I2C-related Attribute not found
I2C_NACK_ONLY_FOUND = I2C_COMP_ID | 0x0B, // Only NACK found in status register
I2C_ARBITRATION_LOST_ONLY_FOUND = I2C_COMP_ID | 0x0C, // Bus Arbi lost found in status reg
I2C_RUNTIME_INTERFACE_ERR = I2C_COMP_ID | 0x0D, // Read/write unavailable at runtime
I2C_RUNTIME_ERR = I2C_COMP_ID | 0x0E, // Failed run-time operation
I2C_RUNTIME_INVALID_OFFSET_LENGTH = I2C_COMP_ID | 0x0F, // Offset length of invalid size
I2C_INVALID_EEPROM_PAGE_MUTEX = I2C_COMP_ID | 0x10, // Error getting page mutex for i2c engine.
I2C_INVALID_EEPROM_PAGE_REQUEST = I2C_COMP_ID | 0x11, // Invalid EEPROM page request
I2C_FAILURE_UNLOCKING_EEPROM_PAGE = I2C_COMP_ID | 0x12 // Error while attempting to unlock the eeprom page
I2C_INVALID_REASONCODE = I2C_COMP_ID | 0x00, // Invalid Reasoncode
I2C_INVALID_DATA_BUFFER = I2C_COMP_ID | 0x01, // Invalid Data Buffer pointer
I2C_INVALID_OP_TYPE = I2C_COMP_ID | 0x02, // Invalid Operation type
I2C_FIFO_TIMEOUT = I2C_COMP_ID | 0x03, // Timed out waiting on FIFO
I2C_BUS_NOT_READY = I2C_COMP_ID | 0x04, // Bus Not ready
I2C_CMD_COMP_TIMEOUT = I2C_COMP_ID | 0x05, // Timeout waiting for Cmd Complete
I2C_HW_ERROR_FOUND = I2C_COMP_ID | 0x06, // Error found in status register
I2C_MASTER_SENTINEL_TARGET = I2C_COMP_ID | 0x07, // Master Sentinel used as target
I2C_NO_CENTAUR_FOUND = I2C_COMP_ID | 0x08, // No Centaur chip found
I2C_NO_PROC_FOUND = I2C_COMP_ID | 0x09, // No Processor chip found
I2C_ATTRIBUTE_NOT_FOUND = I2C_COMP_ID | 0x0A, // Needed I2C-related Attribute not found
I2C_NACK_ONLY_FOUND = I2C_COMP_ID | 0x0B, // Only NACK found in status register
I2C_ARBITRATION_LOST_ONLY_FOUND = I2C_COMP_ID | 0x0C, // Bus Arbi lost found in status reg
I2C_RUNTIME_INTERFACE_ERR = I2C_COMP_ID | 0x0D, // Read/write unavailable at runtime
I2C_RUNTIME_ERR = I2C_COMP_ID | 0x0E, // Failed run-time operation
I2C_RUNTIME_INVALID_OFFSET_LENGTH = I2C_COMP_ID | 0x0F, // Offset length of invalid size
I2C_INVALID_EEPROM_PAGE_MUTEX = I2C_COMP_ID | 0x10, // Error getting page mutex for i2c engine.
I2C_INVALID_EEPROM_PAGE_REQUEST = I2C_COMP_ID | 0x11, // Invalid EEPROM page request
I2C_FAILURE_UNLOCKING_EEPROM_PAGE = I2C_COMP_ID | 0x12, // Error while attempting to unlock the eeprom page
INVALID_MASTER_TARGET = I2C_COMP_ID | 0x13, // Master I2C target not valid
};


Expand Down
1 change: 1 addition & 0 deletions src/usr/fapi2/fapi2.mk
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ OBJS += plat_vpd_access.o
OBJS += plat_wof_access.o
OBJS += dimmBadDqBitmapFuncs.o
OBJS += rowRepairsFuncs.o
OBJS += plat_i2c_access.o

#Required include before all the procedure.mk are included
include ${ROOTPATH}/procedure.rules.mk
Expand Down

0 comments on commit 165bb46

Please sign in to comment.