diff options
Diffstat (limited to 'src/import/chips/ocmb')
5 files changed, 0 insertions, 2419 deletions
diff --git a/src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/i2c/exp_i2c.H b/src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/i2c/exp_i2c.H deleted file mode 100644 index 8e30c3f3..00000000 --- a/src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/i2c/exp_i2c.H +++ /dev/null @@ -1,608 +0,0 @@ -/* IBM_PROLOG_BEGIN_TAG */ -/* This is an automatically generated prolog. */ -/* */ -/* $Source: src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/i2c/exp_i2c.H $ */ -/* */ -/* OpenPOWER sbe Project */ -/* */ -/* Contributors Listed Below - COPYRIGHT 2018,2019 */ -/* [+] 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 exp_i2c.H -/// @brief explorer I2C utility function declarations -/// -// *HWP HWP Owner: Andre A. Marin <aamarin@us.ibm.com> -// *HWP HWP Backup: Louis Stermole <stermole@us.ibm.com> -// *HWP Team: Memory -// *HWP Level: 2 -// *HWP Consumed by: HB:FSP - -#ifndef _MSS_EXP_I2C_H_ -#define _MSS_EXP_I2C_H_ - -#include <fapi2.H> -#include <i2c_access.H> - -#include <vector> -#include <lib/i2c/exp_i2c_fields.H> -#include <generic/memory/lib/utils/pos.H> -#include <generic/memory/lib/utils/endian_utils.H> -#include <generic/memory/lib/utils/poll.H> - -namespace mss -{ -namespace exp -{ -namespace i2c -{ -namespace check -{ - -/// -/// @brief Checks the I2c explorer status codes -/// @param[in] i_target the OCMB target -/// @param[in] i_cmd_id the command ID -/// @param[in] i_data data to check from EXP_FW_STATUS -/// @param[out] o_busy true if explorer returns FW_BUSY status, false otherwise -/// @return FAPI2_RC_SUCCESS iff okay -/// -inline fapi2::ReturnCode status_code( const fapi2::Target<fapi2::TARGET_TYPE_OCMB_CHIP>& i_target, - const uint8_t i_cmd_id, - const std::vector<uint8_t>& i_data, - bool& o_busy ) -{ - // Set o_busy to false just in case we don't make it to where we check it - o_busy = false; - - // Set to a high number to make sure check for SUCCESS (== 0) isn't a fluke - uint8_t l_status = ~(0); - FAPI_TRY( status::get_status_code(i_target, i_data, l_status) ); - - // We need to try again if we get a FW_BUSY status, so set the flag - if (l_status == status_codes::FW_BUSY) - { - o_busy = true; - return fapi2::FAPI2_RC_SUCCESS; - } - - // Technically many cmds have their own status code decoding..but SUCCESS is always 0. - // If it's anything else we can just look up the status code - FAPI_ASSERT( l_status == status_codes::SUCCESS, - fapi2::MSS_EXP_I2C_FW_STATUS_CODE_FAILED(). - set_TARGET(i_target). - set_STATUS_CODE(l_status). - set_CMD_ID(i_cmd_id), - "Status code did not return SUCCESS (%d), received (%d) for %s", - status_codes::SUCCESS, l_status, mss::c_str(i_target) ); - - return fapi2::FAPI2_RC_SUCCESS; - -fapi_try_exit: - return fapi2::current_err; -} - -}// check - -/// -/// @brief EXP_FW_STATUS setup helper function - useful for testing -/// @param[out] o_size the size of data -/// @param[out] o_cmd_id the explorer command ID -/// -inline void fw_status_setup(size_t& o_size, - std::vector<uint8_t>& o_cmd_id) -{ - o_size = FW_STATUS_BYTE_LEN; - o_cmd_id.clear(); - o_cmd_id.push_back(FW_STATUS); -} - -/// -/// @brief EXP_FW_BYPASS_4SEC_TIMEOUT setup helper function -/// @param[out] o_cmd_id the explorer command ID -/// -inline void fw_bypass_download_window_setup(std::vector<uint8_t>& o_cmd_id) -{ - o_cmd_id.clear(); - o_cmd_id.push_back(FW_BYPASS_4SEC_TIMEOUT); -} - -/// -/// @brief get EXP_FW_STATUS bytes -/// @param[in] i_target the OCMB target -/// @param[out] o_data the return data from FW_STATUS command -/// @return FAPI2_RC_SUCCESS iff okay -/// -inline fapi2::ReturnCode get_fw_status(const fapi2::Target<fapi2::TARGET_TYPE_OCMB_CHIP>& i_target, - std::vector<uint8_t>& o_data) -{ - // Retrieve setup data - size_t l_size = 0; - std::vector<uint8_t> l_cmd_id; - fw_status_setup(l_size, l_cmd_id); - - // Get data and check for errors - FAPI_TRY(fapi2::getI2c(i_target, l_size, l_cmd_id, o_data)); - FAPI_DBG( "status returned ( 5 bytes ) : 0x%.02X 0x%.02X 0x%.02X 0x%.02X 0x%.02X", - o_data[0], o_data[1] , o_data[2], o_data[3], o_data[4]); -fapi_try_exit: - return fapi2::current_err; -} - -/// -/// @brief Helper function to check FW_STATUS loop termination, for unit testing -/// @param[in] i_target the OCMB target -/// @param[in] i_busy busy flag from check::status_code -/// @param[in] i_boot_stage boot_stage output from status::get_boot_stage -/// @return true if we should break out of the loop, false otherwise -/// -inline bool fw_status_loop_done(const fapi2::Target<fapi2::TARGET_TYPE_OCMB_CHIP>& i_target, - const bool i_busy, - const uint8_t i_boot_stage) -{ - constexpr uint8_t EXPECTED_BOOT_STAGE = boot_stages::RUNTIME_FW; - - if (i_busy) - { - FAPI_DBG( "%s reutrned FW_BUSY status. Retrying...", mss::c_str(i_target) ); - return false; - } - - if (i_boot_stage != EXPECTED_BOOT_STAGE) - { - FAPI_DBG( "%s reutrned non-RUNTIME boot stage (0x%02x). Retrying...", - mss::c_str(i_target), i_boot_stage ); - return false; - } - - return true; -} - -/// -/// @brief EXP_FW_STATUS -/// @param[in] i_target the OCMB target -/// @param[in] i_delay delay between polls -/// @param[in] i_loops number of polling loops to perform -/// @return FAPI2_RC_SUCCESS iff okay -/// -inline fapi2::ReturnCode fw_status(const fapi2::Target<fapi2::TARGET_TYPE_OCMB_CHIP>& i_target, - const uint64_t i_delay, - const uint64_t i_loops) -{ - constexpr uint8_t EXPECTED_BOOT_STAGE = boot_stages::RUNTIME_FW; - - // So, why aren't we using the memory team's polling API? - // This is a base function that will be utilized by the platform code - // As such, we don't want to pull in more libraries than we need to: it would cause extra dependencies - // So, we're decomposing the polling library below - fapi2::ReturnCode l_rc = fapi2::FAPI2_RC_SUCCESS; - bool l_busy = true; - uint8_t l_boot_stage = 0; - uint64_t l_loop = 0; - - // Loop until we max our our loop count or get a non-busy response - for(; l_loop < i_loops; ++l_loop) - { - std::vector<uint8_t> l_data; - FAPI_TRY( get_fw_status(i_target, l_data) ); - FAPI_TRY( check::status_code(i_target, FW_STATUS, l_data, l_busy) ); - FAPI_TRY( status::get_boot_stage(i_target, l_data, l_boot_stage) ); - - if (fw_status_loop_done(i_target, l_busy, l_boot_stage)) - { - break; - } - - FAPI_TRY( fapi2::delay( i_delay, 200) ); - } - - FAPI_DBG("%s stopped on loop %u/%u", mss::c_str(i_target), l_loop, i_loops); - - // Check that Explorer is not still in FW_BUSY state - FAPI_ASSERT( !l_busy, - fapi2::MSS_EXP_I2C_FW_STATUS_BUSY(). - set_TARGET(i_target), - "Polling timeout on FW_STATUS command (still FW_BUSY) for %s", - mss::c_str(i_target) ); - - // Check that Explorer is in RUNTIME_FW boot stage - FAPI_ASSERT( (l_boot_stage == EXPECTED_BOOT_STAGE), - fapi2::MSS_EXP_I2C_WRONG_BOOT_STAGE(). - set_TARGET(i_target). - set_BOOT_STAGE(l_boot_stage). - set_EXPECTED_BOOT_STAGE(EXPECTED_BOOT_STAGE), - "Polling timeout on FW_STATUS command (wrong boot stage: 0x%01x, expected 0x%01x) for %s", - l_boot_stage, EXPECTED_BOOT_STAGE, mss::c_str(i_target) ); - -fapi_try_exit: - return fapi2::current_err; -} - -/// -/// @brief EXP_FW_BOOT_CONFIG setup -/// @param[in,out] io_data the data to go to boot config -/// -inline void boot_config_setup(std::vector<uint8_t>& io_data) - -{ - - // Need data length as well - boot config can only ever be written - io_data.insert(io_data.begin(), FW_BOOT_CONFIG_BYTE_LEN); - - // Then add the command - io_data.insert(io_data.begin(), FW_BOOT_CONFIG); - - // Written commands need to be in the form of (MSB first). Confirmed by hardware characterization team. - // CMD - // DATA LEN - // DATA3 - // DATA2 - // DATA1 - // DATA0 -} - -/// -/// @brief EXP_FW_BOOT_CONFIG -/// @param[in] i_target the OCMB target -/// @param[in] i_data the data to write -/// @return FAPI2_RC_SUCCESS iff okay -/// -inline fapi2::ReturnCode boot_config(const fapi2::Target<fapi2::TARGET_TYPE_OCMB_CHIP>& i_target, - const std::vector<uint8_t>& i_data) -{ - // Retrieve setup data - std::vector<uint8_t> l_configured_data(i_data); - boot_config_setup(l_configured_data); - - // Send the command - FAPI_TRY(fapi2::putI2c(i_target, l_configured_data)); - - // Wait a bit for the command (DLL lock and OMI training) to complete - // Value based on initial Explorer hardware. - // The command takes ~300ms and we poll for around 100ms, so wait 250ms here - FAPI_TRY( fapi2::delay( (mss::DELAY_1MS * 250), 200) ); - - // Poll for status response - // Note: the EXP_FW_BOOT_CONFIG command trains the OMI, which takes a - // significant amount of time. We're waiting 1ms between polls, and poll for 100 loops, - // which totals at least 100ms - FAPI_TRY(fw_status(i_target, DELAY_1MS, 100)); - -fapi_try_exit: - return fapi2::current_err; -} - -/// -/// @brief Checks if the I2C interface returns an ACK -/// @param[in] i_target the OCMB target -/// @return FAPI2_RC_SUCCESS iff okay -/// -inline fapi2::ReturnCode is_ready(const fapi2::Target<fapi2::TARGET_TYPE_OCMB_CHIP>& i_target) -{ - // We send a simple but valid command to poll the I2C - // Arbitrarily send an EXP_FW_STATUS command id - size_t l_size = 0; - std::vector<uint8_t> l_cmd_id; - fw_status_setup(l_size, l_cmd_id); - - // We'll see FAPI2_RC_SUCCESS if the I2C returns an ACK. - // We just ignore the data - std::vector<uint8_t> l_data; - return fapi2::getI2c(i_target, l_size, l_cmd_id, l_data); -} - -/// -/// @brief EXP_FW_BYPASS_4SEC_TIMEOUT -/// @param[in] i_target the OCMB target -/// @return FAPI2_RC_SUCCESS iff okay -/// -inline fapi2::ReturnCode fw_bypass_download_window(const fapi2::Target<fapi2::TARGET_TYPE_OCMB_CHIP>& i_target) -{ - std::vector<uint8_t> l_cmd_id; - fw_bypass_download_window_setup(l_cmd_id); - - // We'll see FAPI2_RC_SUCCESS if the I2C returns an ACK. - return fapi2::putI2c(i_target, l_cmd_id); -} - -/// -/// @brief Helper function for exp_check_for_ready -/// @param[in] i_target the controller -/// @param[in] i_poll_count the number of times to run the fw_status command (default = 200) -/// @param[in] i_delay delay in ns between fw_status command attempts (default = 1ms) -/// @return FAPI2_RC_SUCCESS iff ok -/// -inline fapi2::ReturnCode exp_check_for_ready_helper(const fapi2::Target<fapi2::TARGET_TYPE_OCMB_CHIP>& i_target, - const uint64_t i_poll_count = 200, - const uint64_t i_delay = DELAY_1MS) -{ - std::vector<uint8_t> l_data; - uint8_t l_boot_stage = 0; - - // Using using default parameters from class, with overrides for delay and poll_count - mss::poll_parameters l_poll_params(DELAY_10NS, - 200, - i_delay, - 200, - i_poll_count); - - // From MSCC explorer firmware arch spec - // 4.1.5: After power-up, the Explorer Chip will respond with NACK to all incoming I2C requests - // from the HOST until the I2C slave interface is ready to receive commands. - FAPI_ASSERT( mss::poll(i_target, l_poll_params, [i_target]()->bool - { - return mss::exp::i2c::is_ready(i_target) == fapi2::FAPI2_RC_SUCCESS; - }), - fapi2::MSS_EXP_I2C_POLLING_TIMEOUT(). - set_TARGET(i_target), - "Failed to see an ACK from I2C -- polling timeout on %s", - mss::c_str(i_target) ); - - // If we're already in RUNTIME_FW stage, due to fuse settings or running procedures manually, - // we can (and should) skip the bypass and polling here - FAPI_TRY( get_fw_status(i_target, l_data) ); - FAPI_TRY( status::get_boot_stage(i_target, l_data, l_boot_stage) ); - - if (l_boot_stage == boot_stages::RUNTIME_FW) - { - return fapi2::FAPI2_RC_SUCCESS; - } - - // MSCC explorer firmware arch spec 4.1.6.5 - // Boot ROM will wait 4 secs and will proceed for normal boot operation. During this time, - // I2C channel will be disabled and Host will see NACK on the bus for subsequent EXP_FW_STATUS - // command. - // Sending FW_BYPASS_4SEC_TIMEOUT command will bypass the 4 secs - // and immediately load the runtime firmware. - FAPI_TRY(fw_bypass_download_window(i_target)); - - // Loop again until we get an ACK from i2c - FAPI_ASSERT( mss::poll(i_target, l_poll_params, [i_target]()->bool - { - return mss::exp::i2c::is_ready(i_target) == fapi2::FAPI2_RC_SUCCESS; - }), - fapi2::MSS_EXP_I2C_POLLING_TIMEOUT(). - set_TARGET(i_target), - "Failed to see an ACK from I2C -- polling timeout on %s", - mss::c_str(i_target) ); - - // Now poll the EXP_FW_STATUS command until it returns SUCCESS and RUNTIME_FW - FAPI_TRY(fw_status(i_target, i_delay, i_poll_count)); - - return fapi2::FAPI2_RC_SUCCESS; - -fapi_try_exit: - return fapi2::current_err; -} - -/// -/// @brief Perform a register write operation on the given OCMB chip -/// @param[in] i_target the OCMB target -/// @param[in] i_addr The translated address on the OCMB chip -/// @param[in] i_data_buffer buffer of data we want to write to the register -/// @return FAPI2_RC_SUCCESS iff okay -/// -inline fapi2::ReturnCode fw_reg_write(const fapi2::Target<fapi2::TARGET_TYPE_OCMB_CHIP>& i_target, - const uint32_t i_addr, - const fapi2::buffer<uint32_t>& i_data_buffer) -{ - // create byte vector that will hold command bytes in sequence that will do the scom - std::vector<uint8_t> l_cmd_vector; - std::vector<uint8_t> l_be_vector; - - uint32_t l_input_data = static_cast<uint32_t>(i_data_buffer); - - // Start building the cmd vector for the write operation - l_cmd_vector.push_back(FW_REG_WRITE); // Byte 0 = 0x05 (FW_REG_WRITE) - l_cmd_vector.push_back(FW_WRITE_REG_DATA_SIZE); // Byte 1 = 0x08 (FW_SCOM_DATA_SIZE) - - // i_addr and i_data_buffer were converted to LE above so we can - // write them directly to the cmd_vector in the same order they - // currently are - // Byte 2:5 = Address - forceBE(i_addr, l_be_vector); - l_cmd_vector.insert(l_cmd_vector.end(), l_be_vector.begin(), l_be_vector.end()); - - l_be_vector.clear(); - forceBE(l_input_data, l_be_vector); - - // Byte 6:9 = Data - l_cmd_vector.insert(l_cmd_vector.end(), l_be_vector.begin(), l_be_vector.end()); - - // Use fapi2 putI2c interface to execute command - FAPI_TRY(fapi2::putI2c(i_target, l_cmd_vector), - "I2C FW_REG_WRITE op failed to write to 0x%.8X on OCMB w/ fapiPos = 0x%.8X", - i_addr, mss::fapi_pos(i_target)); - - // Check status of operation - FAPI_TRY(fw_status(i_target, DELAY_1MS, 100), - "Invalid Status after FW_REG_WRITE operation to 0x%.8X on OCMB w/ fapiPos = 0x%.8X", - i_addr, mss::fapi_pos(i_target)); - - -fapi_try_exit: - return fapi2::current_err; -} - -/// -/// @brief Perform a register write operation on the given OCMB chip -/// @param[in] i_target the OCMB target -/// @param[in] i_addr The translated address on the OCMB chip -/// @param[in] o_data_buffer buffer of data we will write the contents of the register to -/// @return FAPI2_RC_SUCCESS iff okay -/// -inline fapi2::ReturnCode fw_reg_read(const fapi2::Target<fapi2::TARGET_TYPE_OCMB_CHIP>& i_target, - const uint32_t i_addr, - fapi2::buffer<uint32_t>& o_data_buffer) -{ - // create byte vector that will hold command bytes in sequence that will do the scom - std::vector<uint8_t> l_cmd_vector; - std::vector<uint8_t> l_tmp_vector; - - // Flush o_data_buffer w/ all 0's to avoid stale data - o_data_buffer.flush<0>(); - - // Force the address to be BE - forceBE(i_addr, l_tmp_vector); - - // Build the cmd vector for the Read - l_cmd_vector.push_back(FW_REG_ADDR_LATCH); // Byte 0 = 0x03 (FW_REG_ADDR_LATCH) - l_cmd_vector.push_back(FW_REG_ADDR_LATCH_SIZE); // Byte 1 = 0x04 (FW_REG_ADDR_LATCH_SIZE) - - // i_addr was converted to BE above so we can write it - // directly to the cmd_vector in the same order it - // currently is in - // Byte 2:5 = Address - l_cmd_vector.insert(l_cmd_vector.end(), l_tmp_vector.begin(), l_tmp_vector.end()); - - // Use fapi2 putI2c interface to execute command - FAPI_TRY(fapi2::putI2c(i_target, l_cmd_vector), - "putI2c returned error for FW_REG_ADDR_LATCH operation to 0x%.8X on OCMB w/ fapiPos = 0x%.8X", - i_addr, mss::fapi_pos(i_target)); - - // Check i2c status after operation - FAPI_TRY(fw_status(i_target, DELAY_1MS, 100), - "Invalid Status after FW_REG_ADDR_LATCH operation to 0x%.8X on OCMB w/ fapiPos = 0x%.8X", - i_addr, mss::fapi_pos(i_target)); - - // Clear out the tmp_vector because we will re-use as the read buffer - l_tmp_vector.clear(); - - // Clear out cmd vector as i2c op is complete and we must prepare for next - l_cmd_vector.clear(); - - // Cmd vector is a single byte with FW_REG_READ code - l_cmd_vector.push_back(FW_REG_READ); // Byte 0 = 0x04 (FW_REG_READ) - l_cmd_vector.push_back(0x4); // Remaining bytes dont matter to HB firmware - l_cmd_vector.push_back(0x0); // but the hw is expecting something there so - l_cmd_vector.push_back(0x0); // we should write something - l_cmd_vector.push_back(0x0); - l_cmd_vector.push_back(0x0); - - // Use fapi2 getI2c interface to execute command - FAPI_TRY(fapi2::getI2c(i_target, FW_I2C_SCOM_READ_SIZE, l_cmd_vector, l_tmp_vector), - "getI2c returned error for FW_REG_READ operation to 0x%.8X on OCMB w/ fapiPos = 0x%.8X", - i_addr, mss::fapi_pos(i_target)); - - // The first byte returned should be the size of the remaining data - // We requested FW_REG_ADDR_LATCH_SIZE bytes so that is what we - // expect to see as the first byte. - FAPI_ASSERT( (l_tmp_vector.front() == FW_REG_ADDR_LATCH_SIZE), - fapi2::I2C_GET_SCOM_INVALID_READ_SIZE() - .set_TARGET(i_target) - .set_ADDRESS(i_addr) - .set_SIZE_RETURNED(l_tmp_vector[0]) - .set_SIZE_REQUESTED(FW_REG_ADDR_LATCH_SIZE), - "First byte of read data was expected to be 0x%lx but byte read = 0x%x", - FW_REG_ADDR_LATCH_SIZE, l_tmp_vector[0] ); - - // Check i2c status after operation - FAPI_TRY(fw_status(i_target, DELAY_1MS, 100), - "Invalid Status after FW_REG_READ operation to 0x%.8X on OCMB w/ fapiPos = 0x%.8X", - i_addr, mss::fapi_pos(i_target)); - - // Build uint32_t from bytes 1-4 of the returned data. Bytes are - // returned in BE so no translation neccesary. Faster to just access - // the 4 bytes and shift than to perform vector operations to pop off front - // entry and convert vector to uint32. - o_data_buffer = ( l_tmp_vector[1] << 24 | - l_tmp_vector[2] << 16 | - l_tmp_vector[3] << 8 | - l_tmp_vector[4]); -fapi_try_exit: - return fapi2::current_err; -} - -/// -/// @brief Perform a register write operation on the given OCMB chip -/// @param[in] i_addr The raw address that needs to be translated to IBM scom addr -/// @param[in] i_side LHS or RHS of the IBM i2c scom. IBM addresses expect 64 bits of -/// data returned from them so we must have a LHS and a RHS which is offset -/// by 4 bytes. This is because the OCMB is a 32 bit architecture -/// @return uint32 of translated address -/// -inline uint32_t trans_ibm_i2c_scom_addr(const uint32_t i_addr, - const addrSide i_side) -{ - return (i_side == LHS) ? - ((LAST_THREE_BYTES_MASK & i_addr) << OCMB_ADDR_SHIFT) | IBM_SCOM_OFFSET_LHS | OCMB_UNCACHED_OFFSET : - ((LAST_THREE_BYTES_MASK & i_addr) << OCMB_ADDR_SHIFT) | IBM_SCOM_OFFSET_RHS | OCMB_UNCACHED_OFFSET ; -} - -/// -/// @brief Perform a register write operation on the given OCMB chip -/// @param[in] i_addr The raw address that needs to be translated to Microchip scom addr -/// @return uint32 of translated address -/// -inline uint32_t trans_micro_i2c_scom_addr(const uint32_t i_addr) -{ - return (i_addr | OCMB_UNCACHED_OFFSET) ; -} - -/// -/// @brief Issue the DOWNLOAD command to the given OCMB chip -/// @param[in] i_target the OCMB target -/// @return FAPI2_RC_SUCCESS iff okay -/// -inline fapi2::ReturnCode fw_download(const fapi2::Target<fapi2::TARGET_TYPE_OCMB_CHIP>& i_target) -{ - // create byte vector that will hold command bytes in sequence that will do the scom - std::vector<uint8_t> l_download_cmd; - std::vector<uint8_t> l_status_data; - uint8_t l_boot_stage = 0; - - // Read status to get the current boot_stage - FAPI_TRY(get_fw_status(i_target, l_status_data)); - - // Extract the boot_stage value - FAPI_TRY(status::get_boot_stage(i_target, l_status_data, l_boot_stage)); - - // Check that we are in the BOOT_ROM or FW_UPGRADE stage of booting. - // The FW_DOWNLOAD command can only be sent in one of these modes - // (see table 13-1, pboot flowchart in FW arch doc for more info) - FAPI_ASSERT(((l_boot_stage == BOOT_ROM_STAGE) || - (l_boot_stage == FW_UPGRADE_MODE)), - fapi2::MSS_EXP_I2C_FW_DOWNLOAD_INVALID_STATE(). - set_TARGET(i_target). - set_BOOT_STAGE(l_boot_stage). - set_STATUS_DATA(l_status_data), - "Invalid boot stage[0x%02x] for FW_DOWNLOAD command on %s", - l_boot_stage, mss::c_str(i_target)); - - // Start building the cmd vector for the write operation - // Byte 0 = 0x06 (FW_DOWNLOAD) - l_download_cmd.push_back(FW_DOWNLOAD); - - // Use fapi2 putI2c interface to execute command - FAPI_TRY(fapi2::putI2c(i_target, l_download_cmd), - "I2C FW_DOWNLOAD op failed to send FW_DOWNLOAD cmd to %s", - mss::c_str(i_target)); - - // NOTE: The EXP_FW_STATUS command will not work after sending the - // EXP_FW_DOWNLOAD because we will be in TWI mode from this point on. - -fapi_try_exit: - return fapi2::current_err; -} - - -}// i2c -}// exp -}// mss - -#endif diff --git a/src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/i2c/exp_i2c_fields.H b/src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/i2c/exp_i2c_fields.H deleted file mode 100644 index 41d83cc9..00000000 --- a/src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/i2c/exp_i2c_fields.H +++ /dev/null @@ -1,525 +0,0 @@ -/* IBM_PROLOG_BEGIN_TAG */ -/* This is an automatically generated prolog. */ -/* */ -/* $Source: src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/i2c/exp_i2c_fields.H $ */ -/* */ -/* OpenPOWER sbe Project */ -/* */ -/* Contributors Listed Below - COPYRIGHT 2018,2019 */ -/* [+] 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 exp_i2c_fields.H -/// @brief explorer I2C field definition and operations -/// -// *HWP HWP Owner: Andre A. Marin <aamarin@us.ibm.com> -// *HWP HWP Backup: Louis Stermole <stermole@us.ibm.com> -// *HWP Team: Memory -// *HWP Level: 2 -// *HWP Consumed by: HB:FSP - -#ifndef _MSS_EXP_I2C_FIELDS_H_ -#define _MSS_EXP_I2C_FIELDS_H_ - -#include <functional> -#ifdef __PPE__ - #include <mss_field.H> - #include <exp_consts.H> -#else - #include <generic/memory/lib/utils/mss_field.H> - #include <lib/shared/exp_consts.H> -#endif - -namespace mss -{ -namespace exp -{ -namespace i2c -{ - -/// -/// @class fields -/// @brief Explorer I2C command fields -/// @tparam E Endian type -/// -struct fields -{ - // First value is byte index, then buffer extract start bit, and extract data length - - // Part of EXP_FW_BOOT_CONFIG - static constexpr mss::field_t<mss::endian::BIG> DFE_DISABLE{0, 0, 1}; - static constexpr mss::field_t<mss::endian::BIG> LANE_MODE{0, 1, 3}; - static constexpr mss::field_t<mss::endian::BIG> SERDES_FREQ{0, 4, 4}; - static constexpr mss::field_t<mss::endian::BIG> FW_MODE{1, 1, 2}; - static constexpr mss::field_t<mss::endian::BIG> LOOPBACK_TEST{1, 3, 1}; - static constexpr mss::field_t<mss::endian::BIG> TRANSPORT_LAYER{1, 4, 2}; - static constexpr mss::field_t<mss::endian::BIG> DL_LAYER_BOOT_MODE{1, 6, 2}; - - // Part of EXP_FW_STATUS - static constexpr mss::field_t<mss::endian::BIG> CMD_ID{0, 0, 8}; - static constexpr mss::field_t<mss::endian::BIG> STATUS_CODE{1, 0, 8}; - static constexpr mss::field_t<mss::endian::BIG> BOOT_STAGE{2, 6, 2}; -}; - -/// -/// @class fieldTraits -/// @brief Traits assoiated with the Explorer I2C commands -/// @tparam F the Explorer I2C field -/// -template < const mss::field_t<endian::BIG>& F > -struct fieldTraits; - -/// -/// @class fieldTraits - SERDES_FREQ specialization -/// @brief Traits assoiated with the Explorer I2C commands -/// -template <> -struct fieldTraits<fields::SERDES_FREQ> -{ - static constexpr uint8_t COMPARISON_VAL = 0x0F; - static constexpr const char* FIELD_STR = "SerDes Frequency"; - - template <typename T> - using COMPARISON_OP = std::less_equal<T>; -}; - -/// -/// @class fieldTraits - LANE_MODE specialization -/// @brief Traits assoiated with the Explorer I2C commands -/// -template <> -struct fieldTraits<fields::LANE_MODE> -{ - static constexpr uint8_t COMPARISON_VAL = 0x02; - static constexpr const char* FIELD_STR = "Lane mode"; - - template <typename T> - using COMPARISON_OP = std::less_equal<T>; -}; - -/// -/// @class fieldTraits - DFE_DISABLE specialization -/// @brief Traits assoiated with the Explorer I2C commands -/// -template <> -struct fieldTraits<fields::DFE_DISABLE> -{ - static constexpr uint8_t COMPARISON_VAL = 0x01; - static constexpr const char* FIELD_STR = "DFE Disable"; - - template <typename T> - using COMPARISON_OP = std::less_equal<T>; -}; - -/// -/// @class fieldTraits - DL_LAYER_BOOT_MODE specialization -/// @brief Traits assoiated with the Explorer I2C commands -/// -template <> -struct fieldTraits<fields::DL_LAYER_BOOT_MODE> -{ - static constexpr uint8_t COMPARISON_VAL = 0x01; - static constexpr const char* FIELD_STR = "DL Layer Boot mode"; - - template <typename T> - using COMPARISON_OP = std::less_equal<T>; -}; - -/// -/// @class fieldTraits - TRANSPORT_LAYER specialization -/// @brief Traits assoiated with the Explorer I2C commands -/// -template <> -struct fieldTraits<fields::TRANSPORT_LAYER> -{ - static constexpr uint8_t COMPARISON_VAL = 0x02; - static constexpr const char* FIELD_STR = "Transport Layer"; - - template <typename T> - using COMPARISON_OP = std::less_equal<T>; -}; - -/// -/// @class fieldTraits - LOOPBACK_TEST specialization -/// @brief Traits assoiated with the Explorer I2C commands -/// -template <> -struct fieldTraits<fields::LOOPBACK_TEST> -{ - static constexpr uint8_t COMPARISON_VAL = 0x01; - static constexpr const char* FIELD_STR = "OpenCapi looptest test"; - - template <typename T> - using COMPARISON_OP = std::less_equal<T>; -}; - -/// -/// @class fieldTraits - FW_MODE specialization -/// @brief Traits assoiated with the Explorer I2C commands -/// -template <> -struct fieldTraits<fields::FW_MODE> -{ - static constexpr uint8_t COMPARISON_VAL = 0x02; - static constexpr const char* FIELD_STR = "FW Mode"; - - template <typename T> - using COMPARISON_OP = std::less_equal<T>; -}; - -/// -/// @class fieldTraits - CMD_ID specialization -/// @brief Traits assoiated with the Explorer I2C commands -/// -template<> -struct fieldTraits<fields::CMD_ID> -{ - static constexpr uint8_t COMPARISON_VAL = 0xFF; - static constexpr const char* FIELD_STR = "Command ID"; - - template <typename T> - using COMPARISON_OP = std::less_equal<T>; -}; - -/// -/// @class fieldTraits - STATUS_CODE specialization -/// @brief Traits assoiated with the Explorer I2C commands -/// -template<> -struct fieldTraits<fields::STATUS_CODE> -{ - static constexpr uint8_t COMPARISON_VAL = 0xFF; - static constexpr const char* FIELD_STR = "Status Code"; - - template <typename T> - using COMPARISON_OP = std::less_equal<T>; -}; - -/// -/// @class fieldTraits - BOOT_STAGE specialization -/// @brief Traits assoiated with the Explorer I2C commands -/// -template<> -struct fieldTraits<fields::BOOT_STAGE> -{ - static constexpr uint8_t COMPARISON_VAL = 0x03; - static constexpr const char* FIELD_STR = "Boot Stage"; - - template <typename T> - using COMPARISON_OP = std::less_equal<T>; -}; - -/// -/// @brief Explorer I2C field getter -/// @tparam F the explorer I2C field -/// @tparam IT Input type -/// @tparam OT Output type -/// @tparam TT Traits associated with exp I2C - defaults to fieldTraits<F> -/// @param[in] i_target the OCMB target -/// @param[in] i_data the buffer as a reference to a vector -/// @param[out] o_value the output value received -/// @return FAPI2_RC_SUCCESS iff okay -/// -template< const mss::field_t<endian::BIG>& F, - typename IT, - typename OT, - typename TT = fieldTraits<F> > -inline fapi2::ReturnCode get_field(const fapi2::Target<fapi2::TARGET_TYPE_OCMB_CHIP>& i_target, - const std::vector<IT>& i_data, - OT& o_value) -{ - return mss::get_field<endian::BIG, F, TT>(i_target, i_data, EXP_I2C_GET_FIELD, o_value); -} - -#ifndef __PPE__ -/// -/// @brief Explorer I2C field setter -/// @tparam IT Input type -/// @tparam OT Output type -/// @tparam TT Traits associated with exp I2C - defaults to fieldTraits<F> -/// @param[in] i_target the OCMB target -/// @param[in] i_value the input value to set -/// @param[in,out] io_data the buffer as a reference to a vector -/// @return FAPI2_RC_SUCCESS iff okay -/// -template< const mss::field_t<endian::BIG>& F, - typename IT, - typename OT, - typename TT = fieldTraits<F> > -inline fapi2::ReturnCode set_field(const fapi2::Target<fapi2::TARGET_TYPE_OCMB_CHIP>& i_target, - std::vector<OT>& io_data, - const IT i_value) - -{ - return mss::set_field<endian::BIG, F, TT>(i_target, i_value, EXP_I2C_SET_FIELD, io_data); -} - -namespace boot_cfg -{ - -/// -/// @brief SERDES_FREQ getter -/// @param[in] i_target the OCMB target -/// @param[in] i_data the buffer as a reference to a vector -/// @param[out] o_setting -/// @return FAPI2_RC_SUCCESS iff okay -/// -inline fapi2::ReturnCode get_serdes_freq(const fapi2::Target<fapi2::TARGET_TYPE_OCMB_CHIP>& i_target, - const std::vector<uint8_t>& i_data, - uint8_t& o_setting) -{ - return get_field<fields::SERDES_FREQ>(i_target, i_data, o_setting); -} - -/// -/// @brief SERDES_FREQ setter -/// @param[in] i_target the OCMB target -/// @param[in,out] io_data the buffer as a reference to a vector -/// @param[in] i_freq frequency to set -/// @return FAPI2_RC_SUCCESS iff okay -/// -fapi2::ReturnCode set_serdes_freq(const fapi2::Target<fapi2::TARGET_TYPE_OCMB_CHIP>& i_target, - std::vector<uint8_t>& io_data, - const uint32_t i_freq); - -/// -/// @brief LANE_MODE getter -/// @param[in] i_target the OCMB target -/// @param[in] i_data the buffer as a reference to a vector -/// @param[out] o_setting -/// @return FAPI2_RC_SUCCESS iff okay -/// -inline fapi2::ReturnCode get_lane_mode(const fapi2::Target<fapi2::TARGET_TYPE_OCMB_CHIP>& i_target, - const std::vector<uint8_t>& i_data, - uint8_t& o_setting) -{ - return get_field<fields::LANE_MODE>(i_target, i_data, o_setting); -} - -/// -/// @brief LANE_MODE setter -/// @param[in] i_target the OCMB target -/// @param[in,out] io_data the buffer as a reference to a vector -/// @param[in] i_setting the value to set -/// @return FAPI2_RC_SUCCESS iff okay -/// -inline fapi2::ReturnCode set_lane_mode(const fapi2::Target<fapi2::TARGET_TYPE_OCMB_CHIP>& i_target, - std::vector<uint8_t>& io_data, - const uint8_t i_setting) -{ - return set_field<fields::LANE_MODE>(i_target, io_data, i_setting); -} - -/// -/// @brief DFE_DISABLE getter -/// @param[in] i_target the OCMB target -/// @param[in] i_data the buffer as a reference to a vector -/// @param[out] o_setting -/// @return FAPI2_RC_SUCCESS iff okay -/// -inline fapi2::ReturnCode get_dfe_disable(const fapi2::Target<fapi2::TARGET_TYPE_OCMB_CHIP>& i_target, - const std::vector<uint8_t>& i_data, - uint8_t& o_setting) -{ - return get_field<fields::DFE_DISABLE>(i_target, i_data, o_setting); -} - -/// -/// @brief DFE_DISABLE setter -/// @param[in] i_target the OCMB target -/// @param[in,out] io_data the buffer as a reference to a vector -/// @param[in] i_setting the value to set -/// @return FAPI2_RC_SUCCESS iff okay -/// -inline fapi2::ReturnCode set_dfe_disable(const fapi2::Target<fapi2::TARGET_TYPE_OCMB_CHIP>& i_target, - std::vector<uint8_t>& io_data, - const uint8_t i_setting) -{ - return set_field<fields::DFE_DISABLE>(i_target, io_data, i_setting); -} - -/// @brief DL_LAYER_BOOT_MODE getter -/// @param[in] i_target the OCMB target -/// @param[in] i_data the buffer as a reference to a vector -/// @param[out] o_setting -/// @return FAPI2_RC_SUCCESS iff okay -/// -inline fapi2::ReturnCode get_dl_layer_boot_mode(const fapi2::Target<fapi2::TARGET_TYPE_OCMB_CHIP>& i_target, - const std::vector<uint8_t>& i_data, - uint8_t& o_setting) -{ - return get_field<fields::DL_LAYER_BOOT_MODE>(i_target, i_data, o_setting); -} - -/// -/// @brief DL_LAYER_BOOT_MODE setter -/// @param[in] i_target the OCMB target -/// @param[in,out] io_data the buffer as a reference to a vector -/// @param[in] i_setting the value to set -/// @return FAPI2_RC_SUCCESS iff okay -/// -inline fapi2::ReturnCode set_dl_layer_boot_mode(const fapi2::Target<fapi2::TARGET_TYPE_OCMB_CHIP>& i_target, - std::vector<uint8_t>& io_data, - const uint8_t i_setting) -{ - return set_field<fields::DL_LAYER_BOOT_MODE>(i_target, io_data, i_setting); -} - -/// -/// @brief DL_LAYER_BOOT_MODE getter -/// @param[in] i_target the OCMB target -/// @param[in] i_data the buffer as a reference to a vector -/// @param[out] o_setting -/// @return FAPI2_RC_SUCCESS iff okay -/// -inline fapi2::ReturnCode get_transport_layer(const fapi2::Target<fapi2::TARGET_TYPE_OCMB_CHIP>& i_target, - const std::vector<uint8_t>& i_data, - uint8_t& o_setting) -{ - return get_field<fields::TRANSPORT_LAYER>(i_target, i_data, o_setting); -} - - -/// -/// @brief TRANSPORT_LAYER setter -/// @param[in] i_target the OCMB target -/// @param[in,out] io_data the buffer as a reference to a vector -/// @param[in] i_setting the value to set -/// @return FAPI2_RC_SUCCESS iff okay -/// -inline fapi2::ReturnCode set_transport_layer(const fapi2::Target<fapi2::TARGET_TYPE_OCMB_CHIP>& i_target, - std::vector<uint8_t>& io_data, - const uint8_t i_setting) -{ - return set_field<fields::TRANSPORT_LAYER>(i_target, io_data, i_setting); -} - -/// -/// @brief LOOPBACK_TEST getter -/// @param[in] i_target the OCMB target -/// @param[in] i_data the buffer as a reference to a vector -/// @param[out] o_setting -/// @return FAPI2_RC_SUCCESS iff okay -/// -inline fapi2::ReturnCode get_loopback_test(const fapi2::Target<fapi2::TARGET_TYPE_OCMB_CHIP>& i_target, - const std::vector<uint8_t>& i_data, - uint8_t& o_setting) -{ - return get_field<fields::LOOPBACK_TEST>(i_target, i_data, o_setting); -} - -/// -/// @brief LOOPBACK_TEST setter -/// @param[in] i_target the OCMB target -/// @param[in,out] io_data the buffer as a reference to a vector -/// @param[in] i_setting the value to set -/// @return FAPI2_RC_SUCCESS iff okay -/// -inline fapi2::ReturnCode set_loopback_test(const fapi2::Target<fapi2::TARGET_TYPE_OCMB_CHIP>& i_target, - std::vector<uint8_t>& io_data, - const uint8_t i_setting) -{ - return set_field<fields::LOOPBACK_TEST>(i_target, io_data, i_setting); -} - -/// -/// @brief FW_MODE getter -/// @param[in] i_target the OCMB target -/// @param[in] i_data the buffer as a reference to a vector -/// @param[out] o_setting -/// @return FAPI2_RC_SUCCESS iff okay -/// -inline fapi2::ReturnCode get_fw_mode(const fapi2::Target<fapi2::TARGET_TYPE_OCMB_CHIP>& i_target, - const std::vector<uint8_t>& i_data, - uint8_t& o_setting) -{ - return get_field<fields::FW_MODE>(i_target, i_data, o_setting); -} - -/// -/// @brief FW_MODE setter -/// @param[in] i_target the OCMB target -/// @param[in] i_setting the value to set -/// @param[in,out] io_data the buffer as a reference to a vector -/// @return FAPI2_RC_SUCCESS iff okay -/// -inline fapi2::ReturnCode set_fw_mode(const fapi2::Target<fapi2::TARGET_TYPE_OCMB_CHIP>& i_target, - std::vector<uint8_t>& io_data, - const uint8_t i_setting) -{ - return set_field<fields::FW_MODE>(i_target, io_data, i_setting); -} - -}// boot_cfg - -#endif - -namespace status -{ - -/// -/// @brief BOOT_STAGE getter -/// @param[in] i_target the OCMB target -/// @param[in] i_data the buffer as a reference to a vector -/// @param[out] o_setting -/// @return FAPI2_RC_SUCCESS iff okay -/// -inline fapi2::ReturnCode get_boot_stage(const fapi2::Target<fapi2::TARGET_TYPE_OCMB_CHIP>& i_target, - const std::vector<uint8_t>& i_data, - uint8_t& o_setting) -{ - return get_field<fields::BOOT_STAGE>(i_target, i_data, o_setting); -} - - -/// -/// @brief STATUS_CODE getter -/// @param[in] i_target the OCMB target -/// @param[in] i_data the buffer as a reference to a vector -/// @param[out] o_setting -/// @return FAPI2_RC_SUCCESS iff okay -/// -inline fapi2::ReturnCode get_status_code(const fapi2::Target<fapi2::TARGET_TYPE_OCMB_CHIP>& i_target, - const std::vector<uint8_t>& i_data, - uint8_t& o_setting) -{ - return get_field<fields::STATUS_CODE>(i_target, i_data, o_setting); -} - -#ifndef __PPE__ -/// -/// @brief CMD_ID getter -/// @param[in] i_target the OCMB target -/// @param[in] i_data the buffer as a reference to a vector -/// @param[out] o_setting -/// @return FAPI2_RC_SUCCESS iff okay -/// -inline fapi2::ReturnCode get_cmd_id(const fapi2::Target<fapi2::TARGET_TYPE_OCMB_CHIP>& i_target, - const std::vector<uint8_t>& i_data, - uint8_t& o_setting) -{ - return get_field<fields::CMD_ID>(i_target, i_data, o_setting); -} -#endif - -}// status -}// i2c -}// exp -}// mss - -#endif diff --git a/src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/i2c/exp_i2c_scom.H b/src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/i2c/exp_i2c_scom.H deleted file mode 100644 index ae25f408..00000000 --- a/src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/i2c/exp_i2c_scom.H +++ /dev/null @@ -1,221 +0,0 @@ -/* IBM_PROLOG_BEGIN_TAG */ -/* This is an automatically generated prolog. */ -/* */ -/* $Source: src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/i2c/exp_i2c_scom.H $ */ -/* */ -/* OpenPOWER sbe 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 exp_i2c_scom.H -/// @brief explorer I2C scom function declarations -/// -// *HWP HWP Owner: Christian Geddes <crgeddes@us.ibm.com> -// *HWP HWP Backup: Louis Stermole <stermole@us.ibm.com> -// *HWP Team: Memory -// *HWP Level: 2 -// *HWP Consumed by: HB:SBE - -#ifndef _MSS_EXP_I2C_SCOM_H_ -#define _MSS_EXP_I2C_SCOM_H_ - -#include <lib/i2c/exp_i2c.H> - - -namespace mss -{ -namespace exp -{ -namespace i2c -{ - -/// -/// @brief Perform a put scom operation over i2c to OCMB explorer chip -/// @note OCMB chip is little-endian and Host is likely running big-endian -/// -/// @param[in] i_addr 32 bit IBM scom address we want to write on the OCMB -/// @param[in] i_target the OCMB target -/// @param[in] i_data_buffer Contains data which will be written to i_addr on i_target -/// -/// @return FAPI2_RC_SUCCESS iff okay -/// -/// @note this is the IBM scom version the overloaded function i2c_put_scom -/// IBM i2c scoms to the explorer chips are 64 bits of data -fapi2::ReturnCode i2c_put_scom( const fapi2::Target<fapi2::TARGET_TYPE_OCMB_CHIP>& i_target, - const uint32_t i_addr, - const fapi2::buffer<uint64_t>& i_data_buffer) -{ - // We need to separate 64 bit input buffer into two 32-bit halves, - // use this 32-bit buffer to pull out 32 bits at a time - fapi2::buffer<uint32_t> l_side_specific_buffer; - - // check if this is an IBM address - FAPI_ASSERT( ((i_addr & FIRST_BYTE_MASK) == IBM_SCOM_INDICATOR), - fapi2::I2C_SCOM_EXPECTED_IBM_INDICATOR() - .set_TARGET(i_target) - .set_ADDRESS(i_addr), - "First byte of 0x%lx does not = 0x%lx, address is not valid for IBM I2C scom", - i_addr, IBM_SCOM_INDICATOR); - - // The LHS is the bits 0-31 of the input buffer - i_data_buffer.extractToRight<0, 32>(l_side_specific_buffer); - - // Perform the write operation to complete the LHS of the write - FAPI_TRY(fw_reg_write(i_target, trans_ibm_i2c_scom_addr(i_addr, LHS), l_side_specific_buffer), - "(LHS) Failed i2c scom register write to ibm scom addr 0x%lx on OCMB w/ fapi_pos = %d", - i_addr, mss::fapi_pos(i_target)); - - // The RHS is the bits 32-63 of the input buffer - i_data_buffer.extractToRight<32, 32>(l_side_specific_buffer); - - // Perform the write operation to complete the RHS of the write - FAPI_TRY(fw_reg_write(i_target, trans_ibm_i2c_scom_addr(i_addr, RHS), l_side_specific_buffer), - "(RHS) Failed i2c scom register write to ibm scom addr 0x%lx on OCMB w/ fapi_pos = %d", - i_addr, mss::fapi_pos(i_target) ); - -fapi_try_exit: - return fapi2::current_err; - -} - -/// -/// @brief Perform a put scom operation over i2c to OCMB explorer chip -/// @note OCMB chip is little-endian and Host is likely running big-endian -/// @param[in] i_target the OCMB target -/// @param[in] i_addr 32 bit Microchip scom address we want to write on the OCMB -/// @param[in] i_data_buffer Contains data which will be written to i_addr on i_target -/// -/// @return FAPI2_RC_SUCCESS iff okay -/// -/// @note this is the Microchip scom version the overloaded function i2c_put_scom -/// Microchip i2c scoms to the explorer chips are 32 bits of data -fapi2::ReturnCode i2c_put_scom( const fapi2::Target<fapi2::TARGET_TYPE_OCMB_CHIP>& i_target, - const uint32_t i_addr, - const fapi2::buffer<uint32_t>& i_data_buffer) -{ - // The micro-semi addresses should not have the IBM indicator - FAPI_ASSERT( ((i_addr & FIRST_BYTE_MASK) != IBM_SCOM_INDICATOR), - fapi2::I2C_SCOM_UNEXPECTED_IBM_INDICATOR() - .set_TARGET(i_target) - .set_ADDRESS(i_addr), - "First byte of 0x%lx == 0x%lx, address is not valid for microchip I2C scom", - i_addr, IBM_SCOM_INDICATOR); - - // Perform the write operation, note we must apply the UNCACHED_OFFSET to the - // address before performing the write - // Also note that we pass i_data_buffer directly to the fw_reg_read function - FAPI_TRY(fw_reg_write(i_target, trans_micro_i2c_scom_addr(i_addr) , i_data_buffer), - "Failed i2c scom register write to microchip scom addr 0x%lx on OCMB w/ fapi_pos = %d", - i_addr, mss::fapi_pos(i_target)); - -fapi_try_exit: - return fapi2::current_err; - -} - - - - -/// -/// @brief Perform a get scom operation over i2c to OCMB explorer chip -/// @note OCMB chip is little-endian and Host is likely running big-endian -/// @param[in] i_target the OCMB target -/// @param[in] i_addr 32 bit IBM scom address we want to read from on the OCMB -/// @param[out] o_data_buffer Buffer where data found at i_addr will be written to -/// -/// @return FAPI2_RC_SUCCESS iff okay -/// -/// @note this is the IBM scom version the overloaded function i2c_get_scom -/// IBM i2c scoms to the explorer chips are 64 bits of data -fapi2:: ReturnCode i2c_get_scom(const fapi2::Target<fapi2::TARGET_TYPE_OCMB_CHIP>& i_target, - const uint32_t i_addr, - fapi2::buffer<uint64_t>& o_data_buffer) -{ - // IBM get scom expects 64 bits of data returned but we can only - // read 32 bits of data per command so we will do 2 reads in this getscom step. - fapi2::buffer<uint32_t> l_read_buffer; - - // check if this is an IBM address - FAPI_ASSERT( ((i_addr & FIRST_BYTE_MASK) == IBM_SCOM_INDICATOR), - fapi2::I2C_SCOM_EXPECTED_IBM_INDICATOR() - .set_TARGET(i_target) - .set_ADDRESS(i_addr), - "First byte of 0x%lx does not = 0x%lx, address is not valid for IBM I2C scom", - i_addr, IBM_SCOM_INDICATOR); - - FAPI_TRY(fw_reg_read(i_target, trans_ibm_i2c_scom_addr(i_addr, LHS), l_read_buffer), - "(LHS) Failed i2c scom register read from ibm scom addr 0x%.8X on OCMB w/ fapiPos = 0x%.8X", - i_addr, mss::fapi_pos(i_target)); - - // Data was put in correct order by fw_reg_read, copy data to LHS of out buffer - o_data_buffer.insertFromRight<0, 32>(l_read_buffer); - - FAPI_TRY(fw_reg_read(i_target, trans_ibm_i2c_scom_addr(i_addr, RHS), l_read_buffer), - "(RHS) Failed i2c scom register read from ibm scom addr 0x%.8X on OCMB w/ fapiPos = 0x%.8X", - i_addr, mss::fapi_pos(i_target)); - - // Data was put in correct order by fw_reg_read, copy data to RHS of out buffer - o_data_buffer.insertFromRight<32, 32>(l_read_buffer); - - -fapi_try_exit: - return fapi2::current_err; -} - -/// -/// @brief Perform a get scom operation over i2c to OCMB explorer chip -/// @note OCMB chip is little-endian and Host is likely running big-endian -/// @param[in] i_target the OCMB target -/// @param[in] i_addr 32 bit Microchip scom address we want to read from on the OCMB -/// @param[out] o_data_buffer Buffer where data found at i_addr will be written to -/// -/// @return FAPI2_RC_SUCCESS iff okay -/// -/// @note this is the Microchip scom version the overloaded function i2c_get_scom -/// Microchip i2c scoms to the explorer chips are 32 bits of data -fapi2:: ReturnCode i2c_get_scom(const fapi2::Target<fapi2::TARGET_TYPE_OCMB_CHIP>& i_target, - const uint32_t i_addr, - fapi2::buffer<uint32_t>& o_data_buffer) -{ - // The micro-semi addresses should not have the IBM indicator - FAPI_ASSERT( ((i_addr & FIRST_BYTE_MASK) != IBM_SCOM_INDICATOR), - fapi2::I2C_SCOM_UNEXPECTED_IBM_INDICATOR() - .set_TARGET(i_target) - .set_ADDRESS(i_addr), - "First byte of 0x%lx == 0x%lx, address is not valid for microchip I2C scom", - i_addr, IBM_SCOM_INDICATOR); - - // Perform the read operation, note we must apply the UNCACHED_OFFSET to the - // address before performing the read. - // Also note that we pass o_data_buffer directly to the fw_reg_read function - FAPI_TRY(fw_reg_read(i_target, trans_micro_i2c_scom_addr(i_addr) , o_data_buffer), - "Failed i2c scom register read from microchip scom addr 0x%.8X on OCMB w/ fapiPos = 0x%.8X", - i_addr, mss::fapi_pos(i_target)); - - -fapi_try_exit: - return fapi2::current_err; -} - -} // end i2c namespace -} // end exp namespace -} // end mss namespace - -#endif diff --git a/src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/shared/exp_consts.H b/src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/shared/exp_consts.H deleted file mode 100644 index 8aef80e4..00000000 --- a/src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/shared/exp_consts.H +++ /dev/null @@ -1,386 +0,0 @@ -/* IBM_PROLOG_BEGIN_TAG */ -/* This is an automatically generated prolog. */ -/* */ -/* $Source: src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/shared/exp_consts.H $ */ -/* */ -/* OpenPOWER sbe Project */ -/* */ -/* Contributors Listed Below - COPYRIGHT 2018,2019 */ -/* [+] 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 explorer_check_for_ready.H -/// @brief explorer_check_for_ready HWP declaration -/// -// *HWP HWP Owner: Andre A. Marin <aamarin@us.ibm.com> -// *HWP HWP Backup: Louis Stermole <stermole@us.ibm.com> -// *HWP Team: Memory -// *HWP Level: 2 -// *HWP Consumed by: CI - -#ifndef MSS_EXP_CONSTS_H -#define MSS_EXP_CONSTS_H - -#ifndef __PPE__ - #include <generic/memory/lib/utils/shared/mss_generic_consts.H> -#endif - -namespace mss -{ - -namespace exp -{ - -constexpr uint32_t OCMB_ADDR_SHIFT = 3; - -#ifndef __PPE__ -/// -/// @brief enum list for the indexes for the address delays -/// @note Taken from 07-MAY-19 firwmare document -/// -enum attr_delay_index -{ - ODT1 = 0, - ODT0 = 0, - CS_N0 = 0, - CS_N1 = 0, - ADDR13 = 1, - ADDR5 = 1, - BG0 = 1, - CKE1 = 1, - ADDR17 = 2, - ADDR7 = 2, - BA0 = 2, - ADDR16 = 2, - ADDR8 = 3, - BG1 = 3, - CID1 = 3, - CID0 = 3, - ADDR1 = 4, - ADDR9 = 4, - ADDR2 = 4, - CAPARITY = 4, - ADDR12 = 5, - ADDR3 = 5, - ADDR4 = 5, - ADDR0 = 5, - CKE0 = 6, - ADDR15 = 6, - ACT_N = 6, - ADDR10 = 6, - ADDR11 = 7, - ADDR6 = 7, - BA1 = 7, - ADDR14 = 7, -}; - -/// -/// @brief enum list of explorer SPD derived attributes to set -/// @note these attrs are strictly derived from SPD -/// @warning wrapped in exp namesapce to be distinguished from -/// the exp::attr_eff_engine_fields -/// -enum class attr_eff_engine_fields -{ - // Template recursive base case - ATTR_EFF_BASE_CASE = 0, - - // Attrs to set - BYTE_ENABLES = 1, - NIBBLE_ENABLES = 2, - SPD_TAA_MIN = 3, - FOUR_RANK_MODE = 4, - DDP_COMPATIBILITY = 5, - TSV_8H_SUPPORT = 6, - PSTATES = 7, - MRAM_SUPPORT = 8, - SPD_CL_SUPPORTED = 9, - ADDRESS_MIRROR = 10, - - // Dispatcher set to last enum value - DISPATCHER = ADDRESS_MIRROR, -}; - -/// -/// @brief common explorer sizes -/// -enum sizes -{ - MAX_PORT_PER_OCMB = 1, - MAX_DIMM_PER_PORT = 2, - MAX_RANK_PER_DIMM = 4, - MAX_DQ_BITS_PER_PORT = 80, - MAX_SYMBOLS_PER_PORT = 72, - MAX_RANKS_DIMM1 = 2, - MAX_MRANK_PER_PORT = MAX_DIMM_PER_PORT * MAX_RANK_PER_DIMM, -}; - -#endif - -/// -/// @brief explorer ffdc codes -/// -enum ffdc_codes -{ - EXP_I2C_GET_FIELD = 0x0000, - EXP_I2C_SET_FIELD = 0x0001, - READ_HOST_FW_RESPONSE_STRUCT = 0x0003, - READ_SENSOR_CACHE_STRUCT = 0x0004, - READ_CRCT_ENDIAN = 0x0005, - READ_TRAINING_RESPONSE_STRUCT = 0x0006, - - SET_EXP_DRAM_ADDRESS_MIRRORING = 0x1040, - SET_BYTE_ENABLES = 0x1041, - SET_NIBBLE_ENABLES = 0x1042, - SET_TAA_MIN = 0x1043, - SET_FOUR_RANK_MODE = 0x1044, - SET_DDP_COMPATIBILITY = 0x1045, - SET_TSV_8H_SUPPORT = 0x1046, - SET_VREF_DQ_TRAIN_RANGE = 0x1047, - SET_PSTATES = 0x1048, - SET_MRAM_SUPPORT = 0x1049, - SET_SPD_CL_SUPPORTED = 0x1050, - SET_SERDES_FREQ = 0x1051, -}; - -/// -/// @brief constants for getecid procedure -/// -enum ecid_consts -{ - FUSE_ARRAY_SIZE = 14, - DATA_IN_SIZE = 16, - // TK - Will need to be changed once ATTR_ECID is made larger - ATTR_ECID_SIZE = 2, -}; - -/// -/// @brief generic explorer constants -/// -enum generic_consts -{ - // Number of DRAM for x4 vs x8 - EXP_NUM_DRAM_X4 = 20, - EXP_NUM_DRAM_X8 = 10, -}; - -namespace i2c -{ - -/// -/// @brief List of explorer I2C commands -/// -enum cmd_id : uint8_t -{ - FW_BOOT_CONFIG = 0x01, - FW_STATUS = 0x02, - FW_REG_ADDR_LATCH = 0x03, - FW_REG_READ = 0x04, - FW_REG_WRITE = 0x05, - FW_DOWNLOAD = 0x06, - FW_CONT_REG_READ = 0x07, - FW_CONT_REG_WRITE = 0x08, - FW_BYPASS_4SEC_TIMEOUT = 0x09, - FW_PQM_LANE_SET = 0x0A, - FW_PQM_LANE_GET = 0x0B, - FW_PQM_FREQ_SET = 0x0C, - FW_PQM_FREQ_GET = 0x0D, - FW_PQM_LANE_TRAINING = 0x0E, - FW_PQM_TRAINING_RESET = 0x0F, - FW_PQM_RX_ADAPTATION_OBJ_READ = 0x10, - FW_PQM_RX_CALIBRATION_VALUE_READ = 0x11, - FW_PQM_CSU_CALIBRATION_VALUE_STATUS_READ = 0x12, - FW_PQM_PRBS_PATTERN_MODE_SET = 0x13, - FW_PQM_PRBS_USER_DEFINED_PATTERN_SET = 0x14, - FW_PQM_PRBS_MONITOR_CONTROL = 0x15, - FW_PQM_PRBS_GENERATOR_CONTROL = 0x16, - FW_PQM_PRBS_ERR_COUNT_READ = 0x17, - FW_PQM_HORIZONTAL_BATHTUB_GET = 0x18, - FW_PQM_VERTICAL_BATHTUB_GET = 0x19, - FW_PQM_2D_BATHTUB_GET = 0x1A, -}; - -/// -/// @brief common explorer sizes -/// -enum sizes -{ - // 32-bit commands - FW_BOOT_CONFIG_BYTE_LEN = 4, - FW_STATUS_BYTE_LEN = 5, - - FW_WRITE_REG_DATA_SIZE = 0x08, - FW_REG_ADDR_LATCH_SIZE = 0x04, - FW_I2C_SCOM_READ_SIZE = 0x05, - - // Largest R/W length for bytes of data - MIN_DATA_BYTES_LEN = 1, - MAX_DATA_BYTES_LEN = 32, -}; - -/// -/// @brief General I2C status codes -/// @note Shared I2C status codes for EXP_FW_REG_READ, EXP_FW_REG_WRITE, -/// EXP_FW_CONT_REG_READ, and EXP_FW_CONT_REG_WRITE -/// -enum status_codes -{ - SUCCESS = 0x00, - ADDRESS_OUT_OF_RANGE = 0x01, - ADDRESS_PROHIBITED = 0x02, - FW_BUSY = 0xFE, -}; - -#ifndef __PPE__ -/// -/// @brief status codes for FW_BOOT_CONFIG -/// -enum fw_boot_cfg_status -{ - FW_BOOT_CFG_SUCCESS = status_codes::SUCCESS, - - // Loopback fail - FW_BOOT_CFG_LB_FAIL = 0x01, - // Transport layer fail - FW_BOOT_CFG_UNSUPPORTED_TL = 0x02, - // DL (data link) layer fail - FW_BOOT_CFG_UNSUPPORTED_DL = 0x03, - // SERDES (serializer/deserializer) FREQ fail - FW_BOOT_CFG_UNSUPPORTED_SERDES_FREQ = 0x04, -}; - -#endif -/// -/// @brief I2C boot stage options -/// @note certain cmds work in certain boot stages -/// -enum boot_stages -{ - BOOT_ROM_STAGE = 0x01, - FW_UPGRADE_MODE = 0x02, - RUNTIME_FW = 0x03, -}; - -/// -/// @brief Useful constants for i2c scom functionality -/// -/// @note FIRST_BYTE_MASK = allows us to mask off first by of -/// an address to check if its an IBM SCOM -/// LAST_THREE_BYTES_MASK = used as part of formula to translate -/// a given address to an IBM scom address -/// OCBM_UNCACHED_OFFSET = Also used as part of formula for translating -/// a given address to the correct IBM or microchip form -/// IBM_SCOM_OFFSET_LHS and IBM_SCOM_OFFSET_RHS are used in formula -/// for calculating IBM scom address for left and right side of addr -/// IBM_SCOM_INDICATOR is the indicator bit in the first byte of an -/// address that tells us if it is a IBM scom or not -/// -enum i2c_scom_consts : uint32_t -{ - FIRST_BYTE_MASK = 0xFF000000, - LAST_THREE_BYTES_MASK = 0x00FFFFFF, - OCMB_UNCACHED_OFFSET = 0xA0000000, - IBM_SCOM_OFFSET_LHS = 0x08000000, - IBM_SCOM_OFFSET_RHS = 0x08000004, - IBM_SCOM_INDICATOR = IBM_SCOM_OFFSET_LHS, -}; - -/// -/// @brief Simple enum allows code to pick between left and right -/// -/// This is used when deciding if we are writing/reading from left -/// side of IBM address or right side. This is needed because IBM -/// scoms are 64 bits while the OCMB only has 32 bit regs. -enum addrSide -{ - LHS = 0x00, - RHS = 0x01 -}; - -}// i2c - -#ifndef __PPE__ -namespace omi -{ - -/// -/// @brief HOST-FW Commands and Responses -/// -enum cmd_and_response_id -{ - // initialize the DDR PHY controller when Step-by-Step BOOT mode - // is selected - EXP_FW_PHY_STEP_BY_STEP_INIT = 0x01, - - // sent by the Host along with PHY initialization data copied - // into data buffer for FW to use for configuring DDR PHY interface. - EXP_FW_DDR_PHY_INIT = 0x02, - - // read temperature sensor - EXP_FW_TEMP_SENSOR_PASS_THROUGH_READ = 0x03, - - // configure temperature sensor - EXP_FW_TEMP_SENSOR_PASS_THROUGH_WRITE = 0x04, - - // configure interval read mechanism - EXP_FW_TEMP_SENSOR_CONFIG_INTERVAL_READ = 0x05, - - // transition the FW into runtime mode when Step-by-Step BOOT mode - // is selected - EXP_FW_GO_COMMAND = 0x06, - - // determine various configurations related to controller - EXP_FW_ADAPTER_PROPERTIES_GET = 0x07, - - // sent by Host along with latest FW executable code, which is - // copied into data buffer location so that existing FW can - // upgrade the FW image - EXP_FW_BINARY_UPGRADE = 0x08, - - // find the flash loader version information - EXP_FW_FLASH_LOADER_VERSION_INFO = 0x09, - - // read the error logs from various modules of Explorer block - EXP_FW_ERROR_LOG_GET = 0x0A, -}; - -/// -/// @brief Command flag definitions -/// -enum cmd_flags -{ - NO_FLAGS = 0, - ADDITIONAL_DATA = 1, -}; - -/// -/// @brief Response argument parameters -/// -enum response_arg -{ - SUCCESS = 0, - ERROR_CODE = 1, -}; - -}// omi -#endif - -}// exp -}// mss - -#endif diff --git a/src/import/chips/ocmb/explorer/procedures/xml/error_info/mss_exp_errors.xml b/src/import/chips/ocmb/explorer/procedures/xml/error_info/mss_exp_errors.xml deleted file mode 100644 index 9f29367b..00000000 --- a/src/import/chips/ocmb/explorer/procedures/xml/error_info/mss_exp_errors.xml +++ /dev/null @@ -1,679 +0,0 @@ -<!-- IBM_PROLOG_BEGIN_TAG --> -<!-- This is an automatically generated prolog. --> -<!-- --> -<!-- $Source: src/import/chips/ocmb/explorer/procedures/xml/error_info/mss_exp_errors.xml $ --> -<!-- --> -<!-- OpenPOWER sbe Project --> -<!-- --> -<!-- Contributors Listed Below - COPYRIGHT 2018,2019 --> -<!-- [+] 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 --> -<hwpErrors> - - <registerFfdc> - <id>REG_FFDC_EXP_MEMDIAGS_FAILURE</id> - <scomRegister>EXPLR_MCBIST_MCBMR0Q</scomRegister> - <scomRegister>EXPLR_MCBIST_MCBCFGQ</scomRegister> - <scomRegister>EXPLR_MCBIST_MCB_CNTLQ</scomRegister> - <scomRegister>EXPLR_MCBIST_MCB_CNTLSTATQ</scomRegister> - <scomRegister>EXPLR_MCBIST_MCBSTATQ</scomRegister> - <scomRegister>EXPLR_MCBIST_MCBMCATQ</scomRegister> - <scomRegister>EXPLR_MCBIST_MCBPARMQ</scomRegister> - <scomRegister>EXPLR_MCBIST_MCBAGRAQ</scomRegister> - <scomRegister>EXPLR_MCBIST_MBSEC1Q</scomRegister> - <scomRegister>EXPLR_MCBIST_MBSTRQ</scomRegister> - <scomRegister>EXPLR_MCBIST_MCBISTFIRQ</scomRegister> - <scomRegister>EXPLR_MCBIST_MCBAMR0A0Q</scomRegister> - <scomRegister>EXPLR_MCBIST_MCBAMR1A0Q</scomRegister> - <scomRegister>EXPLR_MCBIST_MCBAMR2A0Q</scomRegister> - <scomRegister>EXPLR_MCBIST_MCBAMR3A0Q</scomRegister> - - <scomRegister>EXPLR_MCBIST_MCBFD0Q</scomRegister> - <scomRegister>EXPLR_MCBIST_MCBFD1Q</scomRegister> - <scomRegister>EXPLR_MCBIST_MCBFD2Q</scomRegister> - <scomRegister>EXPLR_MCBIST_MCBFD3Q</scomRegister> - <scomRegister>EXPLR_MCBIST_MCBFD4Q</scomRegister> - <scomRegister>EXPLR_MCBIST_MCBFD5Q</scomRegister> - <scomRegister>EXPLR_MCBIST_MCBFD6Q</scomRegister> - <scomRegister>EXPLR_MCBIST_MCBFD7Q</scomRegister> - - <scomRegister>EXPLR_MCBIST_MCBSA0Q</scomRegister> - <scomRegister>EXPLR_MCBIST_MCBSA1Q</scomRegister> - <scomRegister>EXPLR_MCBIST_MCBSA2Q</scomRegister> - <scomRegister>EXPLR_MCBIST_MCBSA3Q</scomRegister> - <scomRegister>EXPLR_MCBIST_MCBEA0Q</scomRegister> - <scomRegister>EXPLR_MCBIST_MCBEA1Q</scomRegister> - <scomRegister>EXPLR_MCBIST_MCBEA2Q</scomRegister> - <scomRegister>EXPLR_MCBIST_MCBEA3Q</scomRegister> - </registerFfdc> - - <hwpError> - <rc>RC_EXP_MEMDIAGS_COMPARE_ERROR_IN_LAST_PATTERN</rc> - <description>A miscompare error was caused by the last MCBIST pattern</description> - <ffdc>PORT</ffdc> - <ffdc>SUBTEST</ffdc> - <collectRegisterFfdc> - <id>REG_FFDC_EXP_MEMDIAGS_FAILURE</id> - <target>MC_TARGET</target> - <targetType>TARGET_TYPE_OCMB_CHIP</targetType> - </collectRegisterFfdc> - <callout> - <target>MC_TARGET</target> - <priority>HIGH</priority> - </callout> - </hwpError> - - <hwpError> - <rc>RC_EXP_MEMDIAGS_ERROR_IN_LAST_PATTERN</rc> - <description>An error was caused by the last MCBIST pattern</description> - <ffdc>STATUS0</ffdc> - <ffdc>STATUS1</ffdc> - <collectRegisterFfdc> - <id>REG_FFDC_EXP_MEMDIAGS_FAILURE</id> - <target>MC_TARGET</target> - <targetType>TARGET_TYPE_OCMB_CHIP</targetType> - </collectRegisterFfdc> - <callout> - <target>MC_TARGET</target> - <priority>HIGH</priority> - </callout> - </hwpError> - - <hwpError> - <rc>RC_EXP_MEMDIAGS_MCBIST_FAILED_TO_START</rc> - <description>The MCBIST engine failed to start its program</description> - <collectRegisterFfdc> - <id>REG_FFDC_EXP_MEMDIAGS_FAILURE</id> - <target>MC_TARGET</target> - <targetType>TARGET_TYPE_OCMB_CHIP</targetType> - </collectRegisterFfdc> - <callout> - <target>MC_TARGET</target> - <priority>HIGH</priority> - </callout> - </hwpError> - - <hwpError> - <rc>RC_EXP_MEMDIAGS_PORT_NOT_FUNCTIONAL</rc> - <description>The port used in an MCBIST program is not functional</description> - <ffdc>RELATIVE_PORT_POSITION</ffdc> - <ffdc>ADDRESS</ffdc> - <ffdc>MC_TARGET</ffdc> - <collectRegisterFfdc> - <id>REG_FFDC_EXP_MEMDIAGS_FAILURE</id> - <target>MC_TARGET</target> - <targetType>TARGET_TYPE_OCMB_CHIP</targetType> - </collectRegisterFfdc> - <callout> - <procedure>CODE</procedure> - <priority>HIGH</priority> - </callout> - </hwpError> - - <hwpError> - <rc>RC_EXP_MEMDIAGS_SUPERFAST_INIT_FAILED_TO_INIT</rc> - <description>A superfast init operation failed initialization</description> - <collectRegisterFfdc> - <id>REG_FFDC_EXP_MEMDIAGS_FAILURE</id> - <target>MC_TARGET</target> - <targetType>TARGET_TYPE_OCMB_CHIP</targetType> - </collectRegisterFfdc> - <callout> - <target>MC_TARGET</target> - <priority>HIGH</priority> - </callout> - </hwpError> - - <hwpError> - <rc>RC_EXP_MEMDIAGS_SUPERFAST_READ_FAILED_TO_INIT</rc> - <description>A superfast read operation failed initialization</description> - <collectRegisterFfdc> - <id>REG_FFDC_EXP_MEMDIAGS_FAILURE</id> - <target>MC_TARGET</target> - <targetType>TARGET_TYPE_OCMB_CHIP</targetType> - </collectRegisterFfdc> - <callout> - <target>MC_TARGET</target> - <priority>HIGH</priority> - </callout> - </hwpError> - - <hwpError> - <rc>RC_EXP_MEMDIAGS_MCBIST_FAILED_TO_STOP</rc> - <description>The MCBIST engine failed to stop its program</description> - <collectRegisterFfdc> - <id>REG_FFDC_EXP_MEMDIAGS_FAILURE</id> - <target>MC_TARGET</target> - <targetType>TARGET_TYPE_OCMB_CHIP</targetType> - </collectRegisterFfdc> - <ffdc>POLL_COUNT</ffdc> - <callout> - <target>MC_TARGET</target> - <priority>HIGH</priority> - </callout> - </hwpError> - - <hwpError> - <rc>RC_EXP_MEMDIAGS_CONTINUOUS_SCRUB_FAILED_TO_INIT</rc> - <description>A continuous scrub operation failed initialization</description> - <collectRegisterFfdc> - <id>REG_FFDC_EXP_MEMDIAGS_FAILURE</id> - <target>MC_TARGET</target> - <targetType>TARGET_TYPE_OCMB_CHIP</targetType> - </collectRegisterFfdc> - <callout> - <target>MC_TARGET</target> - <priority>HIGH</priority> - </callout> - </hwpError> - - <hwpError> - <rc>RC_EXP_MEMDIAGS_TARGETED_SCRUB_FAILED_TO_INIT</rc> - <description>A continuous scrub operation failed initialization</description> - <collectRegisterFfdc> - <id>REG_FFDC_EXP_MEMDIAGS_FAILURE</id> - <target>MC_TARGET</target> - <targetType>TARGET_TYPE_OCMB_CHIP</targetType> - </collectRegisterFfdc> - <callout> - <target>MC_TARGET</target> - <priority>HIGH</priority> - </callout> - </hwpError> - - <hwpError> - <rc>RC_EXP_MEMDIAGS_ALREADY_AT_BOUNDARY</rc> - <description>A continue request asked to stop at a boundary, but we are there already</description> - <ffdc>MC_TARGET</ffdc> - <ffdc>BOUNDARY</ffdc> - <collectRegisterFfdc> - <id>REG_FFDC_EXP_MEMDIAGS_FAILURE</id> - <target>MC_TARGET</target> - <targetType>TARGET_TYPE_OCMB_CHIP</targetType> - </collectRegisterFfdc> - <callout> - <procedure>CODE</procedure> - <priority>HIGH</priority> - </callout> - </hwpError> - - <hwpError> - <rc>RC_EXP_MCBIST_TIMEOUT</rc> - <description> - MCBIST program failed to return in the time allowed - Software timer, MCBIST has not finished in the time allowed - </description> - <collectRegisterFfdc> - <id>REG_FFDC_EXP_MEMDIAGS_FAILURE</id> - <target>MC_TARGET</target> - <targetType>TARGET_TYPE_OCMB_CHIP</targetType> - </collectRegisterFfdc> - <callout> - <target>MC_TARGET</target> - <priority>HIGH</priority> - </callout> - <deconfigure> - <target>MC_TARGET</target> - </deconfigure> - <gard> - <target>MC_TARGET</target> - </gard> - </hwpError> - - <hwpError> - <rc>RC_EXP_MCBIST_DATA_FAIL</rc> - <description> - MCBIST program appeared to have failed, but set conflicting bits in the status register - </description> - <ffdc>STATUS_REGISTER</ffdc> - <collectRegisterFfdc> - <id>REG_FFDC_EXP_MEMDIAGS_FAILURE</id> - <target>MC_TARGET</target> - <targetType>TARGET_TYPE_OCMB_CHIP</targetType> - </collectRegisterFfdc> - <callout> - <target>MC_TARGET</target> - <priority>HIGH</priority> - </callout> - <deconfigure> - <target>MC_TARGET</target> - </deconfigure> - <gard> - <target>MC_TARGET</target> - </gard> - </hwpError> - - <hwpError> - <rc>RC_EXP_MCBIST_UNKNOWN_FAILURE</rc> - <description>MCBIST program reported a failure but no error status was found</description> - <ffdc>STATUS_REGISTER</ffdc> - <collectRegisterFfdc> - <id>REG_FFDC_EXP_MEMDIAGS_FAILURE</id> - <target>MC_TARGET</target> - <targetType>TARGET_TYPE_OCMB_CHIP</targetType> - </collectRegisterFfdc> - <callout> - <target>MC_TARGET</target> - <priority>HIGH</priority> - </callout> - <deconfigure> - <target>MC_TARGET</target> - </deconfigure> - <gard> - <target>MC_TARGET</target> - </gard> - </hwpError> - - <hwpError> - <rc>RC_MSS_EXP_DRAMINIT_BAD_NUM_RANKS</rc> - <description>Bad number of ranks were passed in the bad bits functionality</description> - <ffdc>TARGET</ffdc> - <ffdc>NUM_RANKS</ffdc> - <ffdc>MAX_RANKS</ffdc> - <callout> - <target>CODE</target> - <priority>HIGH</priority> - </callout> - </hwpError> - - <hwpError> - <rc>RC_MSS_EXP_DRAMINIT_UNSUPPORTED_DIMM_TYPE</rc> - <description>Unsupported DIMM type encountered in draminit_training procedure</description> - <ffdc>OCMB_TARGET</ffdc> - <ffdc>PORT</ffdc> - <ffdc>TYPE</ffdc> - <callout> - <target>OCMB_TARGET</target> - <priority>HIGH</priority> - </callout> - <deconfigure> - <target>OCMB_TARGET</target> - </deconfigure> - </hwpError> - - <hwpError> - <rc>RC_MSS_EXP_DRAMINIT_UNSUPPORTED_DRAM_WIDTH</rc> - <description>Unsupported DRAM width encountered in draminit_training procedure</description> - <ffdc>OCMB_TARGET</ffdc> - <ffdc>PORT</ffdc> - <ffdc>DATA_WIDTH</ffdc> - <callout> - <target>OCMB_TARGET</target> - <priority>HIGH</priority> - </callout> - <deconfigure> - <target>OCMB_TARGET</target> - </deconfigure> - </hwpError> - - <hwpError> - <rc>RC_MSS_EXP_DRAMINIT_UNSUPPORTED_3DS_HEIGHT</rc> - <description>Unsupported 3DS height encountered in draminit_training procedure</description> - <ffdc>OCMB_TARGET</ffdc> - <ffdc>PORT</ffdc> - <ffdc>HEIGHT</ffdc> - <callout> - <target>OCMB_TARGET</target> - <priority>HIGH</priority> - </callout> - <deconfigure> - <target>OCMB_TARGET</target> - </deconfigure> - </hwpError> - - <hwpError> - <rc>RC_MSS_EXP_ENTERPRISE_SETUP_ERROR</rc> - <description>The enterprise mode bit is in the incorrect state</description> - <ffdc>EXPECTED</ffdc> - <ffdc>ACTUAL</ffdc> - <ffdc>REGISTER_DATA</ffdc> - <callout> - <target>OCMB_TARGET</target> - <priority>HIGH</priority> - </callout> - <deconfigure> - <target>OCMB_TARGET</target> - </deconfigure> - </hwpError> - - <hwpError> - <rc>RC_MSS_EXP_I2C_FW_STATUS_CODE_FAILED</rc> - <description> - Explorer status code for command ID EXP_FW_STATUS - did not return SUCCESS - </description> - <ffdc>TARGET</ffdc> - <ffdc>STATUS_CODE</ffdc> - <ffdc>CMD_ID</ffdc> - <callout> - <procedure>CODE</procedure> - <priority>MEDIUM</priority> - </callout> - <callout> - <target>TARGET</target> - <priority>HIGH</priority> - </callout> - <deconfigure> - <target>TARGET</target> - </deconfigure> - </hwpError> - - <hwpError> - <rc>RC_MSS_EXP_I2C_FW_STATUS_BUSY</rc> - <description> - Received FW_BUSY status after polling timeout for - command ID EXP_FW_STATUS - </description> - <ffdc>TARGET</ffdc> - <ffdc>STATUS_CODE</ffdc> - <callout> - <procedure>CODE</procedure> - <priority>MEDIUM</priority> - </callout> - <callout> - <target>TARGET</target> - <priority>HIGH</priority> - </callout> - <deconfigure> - <target>TARGET</target> - </deconfigure> - </hwpError> - - <hwpError> - <rc>RC_MSS_EXP_I2C_WRONG_BOOT_STAGE</rc> - <description> - Received incorrect boot stage from - command ID EXP_FW_STATUS - </description> - <ffdc>TARGET</ffdc> - <ffdc>BOOT_STAGE</ffdc> - <ffdc>EXPECTED_BOOT_STAGE</ffdc> - <callout> - <procedure>CODE</procedure> - <priority>MEDIUM</priority> - </callout> - <callout> - <target>TARGET</target> - <priority>HIGH</priority> - </callout> - <deconfigure> - <target>TARGET</target> - </deconfigure> - </hwpError> - - <hwpError> - <rc>RC_MSS_EXP_I2C_POLLING_TIMEOUT</rc> - <description> - Polling the explorer I2C slave interface for an ACK - timed out. - </description> - <callout> - <procedure>CODE</procedure> - <priority>MEDIUM</priority> - </callout> - <callout> - <target>TARGET</target> - <priority>HIGH</priority> - </callout> - <deconfigure> - <target>TARGET</target> - </deconfigure> - </hwpError> - - <hwpError> - <rc>RC_MSS_EXP_STATUS_POLLING_TIMEOUT</rc> - <description> - Polling the explorer for successful return code - timed out. - </description> - <callout> - <procedure>CODE</procedure> - <priority>MEDIUM</priority> - </callout> - <callout> - <target>TARGET</target> - <priority>HIGH</priority> - </callout> - <deconfigure> - <target>TARGET</target> - </deconfigure> - </hwpError> - - <hwpError> - <rc>RC_MSS_EXP_RSP_ARG_FAILED</rc> - <description> - The response_argument field of the host_fw_response_struct returned a FAILURE - </description> - <ffdc>RSP_ID</ffdc> - <ffdc>ERROR_CODE</ffdc> - <callout> - <procedure>CODE</procedure> - <priority>MEDIUM</priority> - </callout> - <callout> - <target>TARGET</target> - <priority>HIGH</priority> - </callout> - <deconfigure> - <target>TARGET</target> - </deconfigure> - </hwpError> - - <hwpError> - <rc>RC_MSS_EXP_SENSOR_CACHE_ENABLE_FAILED</rc> - <description> - The response_argument field of the host_fw_response_struct returned - a FAILURE for enabling sensor cache - </description> - <ffdc>RSP_ID</ffdc> - <ffdc>ERROR_CODE</ffdc> - <callout> - <procedure>CODE</procedure> - <priority>MEDIUM</priority> - </callout> - <callout> - <target>TARGET</target> - <priority>HIGH</priority> - </callout> - <deconfigure> - <target>TARGET</target> - </deconfigure> - </hwpError> - - <registerFfdc> - <id>REG_FFDC_EXP_CCS_FAILURE</id> - <scomRegister>EXPLR_MCBIST_CCS_MODEQ</scomRegister> - <scomRegister>EXPLR_MCBIST_CCS_STATQ</scomRegister> - <scomRegister>EXPLR_MCBIST_CCS_CNTLQ</scomRegister> - <scomRegister>EXPLR_MCBIST_MCBMCATQ</scomRegister> - - <!-- Instructions --> - <scomRegister>EXPLR_MCBIST_CCS_INST_ARR0_00</scomRegister> - <scomRegister>EXPLR_MCBIST_CCS_INST_ARR0_01</scomRegister> - <scomRegister>EXPLR_MCBIST_CCS_INST_ARR0_02</scomRegister> - <scomRegister>EXPLR_MCBIST_CCS_INST_ARR0_03</scomRegister> - <scomRegister>EXPLR_MCBIST_CCS_INST_ARR0_04</scomRegister> - <scomRegister>EXPLR_MCBIST_CCS_INST_ARR0_05</scomRegister> - <scomRegister>EXPLR_MCBIST_CCS_INST_ARR0_06</scomRegister> - <scomRegister>EXPLR_MCBIST_CCS_INST_ARR0_07</scomRegister> - <scomRegister>EXPLR_MCBIST_CCS_INST_ARR0_08</scomRegister> - <scomRegister>EXPLR_MCBIST_CCS_INST_ARR0_09</scomRegister> - - <scomRegister>EXPLR_MCBIST_CCS_INST_ARR0_10</scomRegister> - <scomRegister>EXPLR_MCBIST_CCS_INST_ARR0_11</scomRegister> - <scomRegister>EXPLR_MCBIST_CCS_INST_ARR0_12</scomRegister> - <scomRegister>EXPLR_MCBIST_CCS_INST_ARR0_13</scomRegister> - <scomRegister>EXPLR_MCBIST_CCS_INST_ARR0_14</scomRegister> - <scomRegister>EXPLR_MCBIST_CCS_INST_ARR0_15</scomRegister> - <scomRegister>EXPLR_MCBIST_CCS_INST_ARR0_16</scomRegister> - <scomRegister>EXPLR_MCBIST_CCS_INST_ARR0_17</scomRegister> - <scomRegister>EXPLR_MCBIST_CCS_INST_ARR0_18</scomRegister> - <scomRegister>EXPLR_MCBIST_CCS_INST_ARR0_19</scomRegister> - - <scomRegister>EXPLR_MCBIST_CCS_INST_ARR0_20</scomRegister> - <scomRegister>EXPLR_MCBIST_CCS_INST_ARR0_21</scomRegister> - <scomRegister>EXPLR_MCBIST_CCS_INST_ARR0_22</scomRegister> - <scomRegister>EXPLR_MCBIST_CCS_INST_ARR0_23</scomRegister> - <scomRegister>EXPLR_MCBIST_CCS_INST_ARR0_24</scomRegister> - <scomRegister>EXPLR_MCBIST_CCS_INST_ARR0_25</scomRegister> - <scomRegister>EXPLR_MCBIST_CCS_INST_ARR0_26</scomRegister> - <scomRegister>EXPLR_MCBIST_CCS_INST_ARR0_27</scomRegister> - <scomRegister>EXPLR_MCBIST_CCS_INST_ARR0_28</scomRegister> - <scomRegister>EXPLR_MCBIST_CCS_INST_ARR0_29</scomRegister> - - <scomRegister>EXPLR_MCBIST_CCS_INST_ARR0_30</scomRegister> - <scomRegister>EXPLR_MCBIST_CCS_INST_ARR0_31</scomRegister> - - <!-- Control array --> - <scomRegister>EXPLR_MCBIST_CCS_INST_ARR1_00</scomRegister> - <scomRegister>EXPLR_MCBIST_CCS_INST_ARR1_01</scomRegister> - <scomRegister>EXPLR_MCBIST_CCS_INST_ARR1_02</scomRegister> - <scomRegister>EXPLR_MCBIST_CCS_INST_ARR1_03</scomRegister> - <scomRegister>EXPLR_MCBIST_CCS_INST_ARR1_04</scomRegister> - <scomRegister>EXPLR_MCBIST_CCS_INST_ARR1_05</scomRegister> - <scomRegister>EXPLR_MCBIST_CCS_INST_ARR1_06</scomRegister> - <scomRegister>EXPLR_MCBIST_CCS_INST_ARR1_07</scomRegister> - <scomRegister>EXPLR_MCBIST_CCS_INST_ARR1_08</scomRegister> - <scomRegister>EXPLR_MCBIST_CCS_INST_ARR1_09</scomRegister> - - <scomRegister>EXPLR_MCBIST_CCS_INST_ARR1_10</scomRegister> - <scomRegister>EXPLR_MCBIST_CCS_INST_ARR1_11</scomRegister> - <scomRegister>EXPLR_MCBIST_CCS_INST_ARR1_12</scomRegister> - <scomRegister>EXPLR_MCBIST_CCS_INST_ARR1_13</scomRegister> - <scomRegister>EXPLR_MCBIST_CCS_INST_ARR1_14</scomRegister> - <scomRegister>EXPLR_MCBIST_CCS_INST_ARR1_15</scomRegister> - <scomRegister>EXPLR_MCBIST_CCS_INST_ARR1_16</scomRegister> - <scomRegister>EXPLR_MCBIST_CCS_INST_ARR1_17</scomRegister> - <scomRegister>EXPLR_MCBIST_CCS_INST_ARR1_18</scomRegister> - <scomRegister>EXPLR_MCBIST_CCS_INST_ARR1_19</scomRegister> - - <scomRegister>EXPLR_MCBIST_CCS_INST_ARR1_20</scomRegister> - <scomRegister>EXPLR_MCBIST_CCS_INST_ARR1_21</scomRegister> - <scomRegister>EXPLR_MCBIST_CCS_INST_ARR1_22</scomRegister> - <scomRegister>EXPLR_MCBIST_CCS_INST_ARR1_23</scomRegister> - <scomRegister>EXPLR_MCBIST_CCS_INST_ARR1_24</scomRegister> - <scomRegister>EXPLR_MCBIST_CCS_INST_ARR1_25</scomRegister> - <scomRegister>EXPLR_MCBIST_CCS_INST_ARR1_26</scomRegister> - <scomRegister>EXPLR_MCBIST_CCS_INST_ARR1_27</scomRegister> - <scomRegister>EXPLR_MCBIST_CCS_INST_ARR1_28</scomRegister> - <scomRegister>EXPLR_MCBIST_CCS_INST_ARR1_29</scomRegister> - - <scomRegister>EXPLR_MCBIST_CCS_INST_ARR1_30</scomRegister> - <scomRegister>EXPLR_MCBIST_CCS_INST_ARR1_31</scomRegister> - - <!-- to get the CCS state machine hung state --> - <scomRegister>EXPLR_MCBIST_MBA_MCBERRPT0Q</scomRegister> - <scomRegister>EXPLR_MCBIST_MBA_MCBERRPT1Q</scomRegister> - </registerFfdc> - - <hwpError> - <rc>RC_MSS_EXP_CCS_READ_MISCOMPARE</rc> - <description> - CCS reports a read miscompare. - </description> - <ffdc>FAIL_TYPE</ffdc> - <collectRegisterFfdc> - <id>REG_FFDC_EXP_CCS_FAILURE</id> - <target>MC_TARGET</target> - <targetType>TARGET_TYPE_OCMB_CHIP</targetType> - </collectRegisterFfdc> - <callout> - <target>PORT_TARGET</target> - <priority>HIGH</priority> - </callout> - <deconfigure> - <target>PORT_TARGET</target> - </deconfigure> - <gard> - <target>PORT_TARGET</target> - </gard> - </hwpError> - - <hwpError> - <rc>RC_MSS_EXP_CCS_UE_SUE</rc> - <description> - CCS reports a UE or SUE in the CCS program array - Chould be an indicator of corruption in the CCS program - </description> - <ffdc>FAIL_TYPE</ffdc> - <collectRegisterFfdc> - <id>REG_FFDC_EXP_CCS_FAILURE</id> - <target>MC_TARGET</target> - <targetType>TARGET_TYPE_OCMB_CHIP</targetType> - </collectRegisterFfdc> - <callout> - <target>MC_TARGET</target> - <priority>HIGH</priority> - </callout> - <deconfigure> - <target>MC_TARGET</target> - </deconfigure> - <gard> - <target>MC_TARGET</target> - </gard> - </hwpError> - - <hwpError> - <rc>RC_MSS_EXP_CCS_HUNG</rc> - <description> - Software reported that the machine is not seeing the CCS finish in the alloted time - </description> - <collectRegisterFfdc> - <id>REG_FFDC_EXP_CCS_FAILURE</id> - <target>MC_TARGET</target> - <targetType>TARGET_TYPE_OCMB_CHIP</targetType> - </collectRegisterFfdc> - <callout> - <target>MC_TARGET</target> - <priority>HIGH</priority> - </callout> - <deconfigure> - <target>MC_TARGET</target> - </deconfigure> - <gard> - <target>MC_TARGET</target> - </gard> - <callout> - <procedure>CODE</procedure> - <priority>MEDIUM</priority> - </callout> - </hwpError> - - <hwpError> - <rc>RC_EXP_CCS_HUNG_TRYING_TO_STOP</rc> - <description> - CCS failed to return from in-progress status while trying to stop a previous program - Software reported that CCS did not finish in alloted time after manually triggering stop - </description> - <collectRegisterFfdc> - <id>REG_FFDC_EXP_CCS_FAILURE</id> - <target>MC_TARGET</target> - <targetType>TARGET_TYPE_OCMB_CHIP</targetType> - </collectRegisterFfdc> - <callout> - <target>MC_TARGET</target> - <priority>HIGH</priority> - </callout> - <deconfigure> - <target>MC_TARGET</target> - </deconfigure> - <gard> - <target>MC_TARGET</target> - </gard> - </hwpError> - -</hwpErrors> |