123 lines
4.5 KiB
C++
123 lines
4.5 KiB
C++
/* IBM_PROLOG_BEGIN_TAG */
|
|
/* This is an automatically generated prolog. */
|
|
/* */
|
|
/* $Source: src/import/chips/p10/procedures/hwp/lib/p10_stop_util.H $ */
|
|
/* */
|
|
/* OpenPOWER HostBoot Project */
|
|
/* */
|
|
/* Contributors Listed Below - COPYRIGHT 2016,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 */
|
|
#ifndef __P10_STOP_UTIL_
|
|
#define __P10_STOP_UTIL_
|
|
|
|
#include <stdint.h>
|
|
|
|
#ifdef _AIX
|
|
#define __BYTE_ORDER __BIG_ENDIAN
|
|
#elif __SKIBOOT__
|
|
#include <skiboot.h>
|
|
#else
|
|
#include <endian.h>
|
|
#endif
|
|
|
|
#ifndef __PPE_PLAT
|
|
#include "p10_stop_api.H"
|
|
#endif
|
|
|
|
#ifdef FAPI_2
|
|
#include <fapi2.H>
|
|
#endif
|
|
|
|
///
|
|
/// @file p10_stop_util.H
|
|
/// @brief describes some utilty functions for STOP API.
|
|
///
|
|
// *HWP HW Owner : Greg Still <stillgs@us.ibm.com>
|
|
// *HWP FW Owner : Prem Shanker Jha <premjha2@in.ibm.com>
|
|
// *HWP Team : PM
|
|
// *HWP Level : 2
|
|
// *HWP Consumed by : HB:HYP
|
|
#ifndef __PPE_PLAT
|
|
#ifdef __cplusplus
|
|
namespace stopImageSection
|
|
{
|
|
#endif
|
|
#endif //__PPE_PLAT
|
|
/**
|
|
* @brief helper function to swizzle given input data
|
|
* @note swizles bytes to handle endianess issue.
|
|
*/
|
|
#if( __BYTE_ORDER == __BIG_ENDIAN )
|
|
|
|
// NOP if it is a big endian system
|
|
#define SWIZZLE_2_BYTE(WORD) WORD
|
|
#define SWIZZLE_4_BYTE(WORD) WORD
|
|
#define SWIZZLE_8_BYTE(WORD) WORD
|
|
|
|
#else
|
|
#define SWIZZLE_2_BYTE(WORD) \
|
|
( (((WORD) >> 8) & 0x00FF) | (((WORD) << 8) & 0xFF00) )
|
|
|
|
#define SWIZZLE_4_BYTE(WORD) \
|
|
( { uint64_t l_tmp64 = WORD; \
|
|
(uint32_t)( (((l_tmp64) >> 24) & 0x000000FF) | (((l_tmp64) >> 8) & 0x0000FF00) | \
|
|
(((l_tmp64) << 8) & 0x00FF0000) | (((l_tmp64) << 24) & 0xFF000000) ) ;\
|
|
})
|
|
|
|
#define SWIZZLE_8_BYTE(WORD) \
|
|
( (((WORD) >> 56) & 0x00000000000000FF) | \
|
|
(((WORD) >> 40) & 0x000000000000FF00)| \
|
|
(((WORD) >> 24) & 0x0000000000FF0000) | \
|
|
(((WORD) >> 8) & 0x00000000FF000000) | \
|
|
(((WORD) << 8) & 0x000000FF00000000) | \
|
|
(((WORD) << 24) & 0x0000FF0000000000) | \
|
|
(((WORD) << 40) & 0x00FF000000000000) | \
|
|
(((WORD) << 56) & 0xFF00000000000000) )
|
|
#endif
|
|
|
|
/**
|
|
* @brief enumerates bit(s) positions of interest for PIR.
|
|
*/
|
|
enum
|
|
{
|
|
FUSED_CORE_BIT0 = 0x08,
|
|
FUSED_CORE_BIT1 = 0x04,
|
|
FUSED_CORE_BIT2 = 0x02,
|
|
FUSED_CORE_BIT3 = 0x01,
|
|
QUAD_BITS = 0x70,
|
|
};
|
|
|
|
#ifndef __PPE_PLAT
|
|
/**
|
|
* @brief returns core id and thread id by parsing a given PIR.
|
|
* @param i_pStopImage points to STOP image associated with a proc chip.
|
|
* @param i_pir PIR associated with a core's thread.
|
|
* @param o_coreId points to core id value obtained from PIR.
|
|
* @param o_threadId points to thread id value obtained from PIR.
|
|
* @return SUCCESS if function suceeds, error code otherwise.
|
|
*/
|
|
StopReturnCode_t getCoreAndThread_p10( void* const i_pStopImage,
|
|
const uint64_t i_pir,
|
|
uint32_t* o_coreId,
|
|
uint32_t* o_threadId );
|
|
#ifdef __cplusplus
|
|
} // namespace stopImageSection ends
|
|
|
|
#endif
|
|
#endif //__PPE_PLAT
|
|
#endif
|