summaryrefslogtreecommitdiffstats
path: root/src/include/usr
diff options
context:
space:
mode:
authorMatt Derksen <mderkse1@us.ibm.com>2018-08-30 08:10:40 -0500
committerDaniel M. Crowell <dcrowell@us.ibm.com>2018-09-20 17:06:38 -0500
commit165bb46bac36d2774b7fe36543024710053ec3d0 (patch)
treef21eb63d24214397c161e76641ee6ef4c1added0 /src/include/usr
parent5abc57bc8352ef13ab7aa23edfbc2d607f9cd5b2 (diff)
downloadtalos-hostboot-165bb46bac36d2774b7fe36543024710053ec3d0.tar.gz
talos-hostboot-165bb46bac36d2774b7fe36543024710053ec3d0.zip
Support fapi2 i2c functions
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>
Diffstat (limited to 'src/include/usr')
-rw-r--r--src/include/usr/devicefw/userif.H22
-rw-r--r--src/include/usr/fapi2/i2c_access.H80
-rw-r--r--src/include/usr/fapi2/plat_i2c_access.H61
-rw-r--r--src/include/usr/i2c/i2creasoncodes.H43
4 files changed, 185 insertions, 21 deletions
diff --git a/src/include/usr/devicefw/userif.H b/src/include/usr/devicefw/userif.H
index 5bdd3b238..25d355ccf 100644
--- a/src/include/usr/devicefw/userif.H
+++ b/src/include/usr/devicefw/userif.H
@@ -70,7 +70,7 @@ namespace DeviceFW
DEPRECATED_MEMD_VPD,
NODECOMM,
NVDIMM,
-
+ FAPI_I2C,
LAST_ACCESS_TYPE,
};
@@ -366,6 +366,7 @@ 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
@@ -373,6 +374,25 @@ namespace DeviceFW
#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.
*
diff --git a/src/include/usr/fapi2/i2c_access.H b/src/include/usr/fapi2/i2c_access.H
new file mode 100644
index 000000000..b615b5b3f
--- /dev/null
+++ b/src/include/usr/fapi2/i2c_access.H
@@ -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_
diff --git a/src/include/usr/fapi2/plat_i2c_access.H b/src/include/usr/fapi2/plat_i2c_access.H
new file mode 100644
index 000000000..b80aa9a1e
--- /dev/null
+++ b/src/include/usr/fapi2/plat_i2c_access.H
@@ -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_
diff --git a/src/include/usr/i2c/i2creasoncodes.H b/src/include/usr/i2c/i2creasoncodes.H
index 331c8d4fe..4ce6c3a81 100644
--- a/src/include/usr/i2c/i2creasoncodes.H
+++ b/src/include/usr/i2c/i2creasoncodes.H
@@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* Contributors Listed Below - COPYRIGHT 2011,2016 */
+/* Contributors Listed Below - COPYRIGHT 2011,2018 */
/* [+] International Business Machines Corp. */
/* */
/* */
@@ -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,
};
@@ -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
};
OpenPOWER on IntegriCloud