summaryrefslogtreecommitdiffstats
path: root/src/hwpf/src
diff options
context:
space:
mode:
authorPrasad Bg Ranganath <prasadbgr@in.ibm.com>2016-09-09 07:01:56 -0500
committerJennifer A. Stofer <stofer@us.ibm.com>2016-09-20 09:20:04 -0400
commitd7b92b5e575f7ed457ce63b6202c704284b676b3 (patch)
tree698a8f05d68eed334c86d2f910767c7f73ea84fb /src/hwpf/src
parent6193453f456e18325ccbde259f5f0d229a34fb02 (diff)
downloadtalos-sbe-d7b92b5e575f7ed457ce63b6202c704284b676b3.tar.gz
talos-sbe-d7b92b5e575f7ed457ce63b6202c704284b676b3.zip
SBE:getRing L2 support
Change-Id: Id0337c0b349b9a1150eb277c4b4cb5c0b59e36ca Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/29416 Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com> Reviewed-by: Gregory S. Still <stillgs@us.ibm.com> Reviewed-by: RAJA DAS <rajadas2@in.ibm.com> Reviewed-by: Jennifer A. Stofer <stofer@us.ibm.com>
Diffstat (limited to 'src/hwpf/src')
-rw-r--r--src/hwpf/src/plat/plat_hw_access.C142
1 files changed, 130 insertions, 12 deletions
diff --git a/src/hwpf/src/plat/plat_hw_access.C b/src/hwpf/src/plat/plat_hw_access.C
index 01fedc96..b460946f 100644
--- a/src/hwpf/src/plat/plat_hw_access.C
+++ b/src/hwpf/src/plat/plat_hw_access.C
@@ -24,31 +24,149 @@
/* IBM_PROLOG_END_TAG */
#include <fapi2.H>
+#include "hw_access.H"
#include "plat_hw_access.H"
#include "p9_perv_scom_addresses.H"
+#include <p9_putRingUtils.H>
namespace fapi2
{
- ReturnCode getRing_setup(const uint32_t i_ringAddress,
- const RingMode i_ringMode)
+struct restoreOpcgRegisters g_opcgData;
+
+uint64_t decodeScanRegionData(const uint32_t i_ringAddress)
+{
+ uint32_t l_scan_region = (i_ringAddress & 0x0000FFF0) << 13;
+
+ uint32_t l_scan_type = 0x00008000 >> (i_ringAddress & 0x0000000F);
+
+ // This is special case if encoded type is 0xF
+
+ if ( (i_ringAddress & 0x0000000F) == 0xF)
{
- return FAPI2_RC_SUCCESS;
+ l_scan_type = 0x00008000 | (l_scan_type << 12);
}
+ uint64_t l_value = l_scan_region;
+ l_value = (l_value << 32) | l_scan_type;
+
+ return l_value;
+}
+
+ReturnCode getRing_setup(const uint32_t i_ringAddress,
+ const RingMode i_ringMode)
+{
+ fapi2::ReturnCode l_rc = FAPI2_RC_SUCCESS;
+ uint64_t l_scanRegion = 0;
+ uint32_t l_chipletId = i_ringAddress >> 24;
- ReturnCode getRing_granule_data(const uint32_t i_ringAddress,
- uint64_t *o_data,
- const uint32_t i_bitShiftValue)
+ Target<fapi2::TARGET_TYPE_PROC_CHIP> l_proc = plat_getChipTarget();
+
+ do
{
- return FAPI2_RC_SUCCESS;
- }
+ l_scanRegion = decodeScanRegionData(i_ringAddress);
+
+ if (i_ringMode & fapi2::RING_MODE_SET_PULSE_SL)
+ {
+ l_rc = storeOPCGRegData (l_proc, g_opcgData, l_chipletId);
+ if(l_rc != fapi2::FAPI2_RC_SUCCESS)
+ {
+ break;
+ }
+ l_rc = setupScanRegionForSetPulse(l_proc, l_scanRegion,
+ i_ringMode,l_chipletId);
+ if(l_rc != fapi2::FAPI2_RC_SUCCESS)
+ {
+ break;
+ }
+ }
+ else
+ {
+ // Set up the scan region for the ring.
+ l_rc = setupScanRegion(l_proc, l_scanRegion, l_chipletId);
+ if(l_rc != fapi2::FAPI2_RC_SUCCESS)
+ {
+ break;
+ }
+ }
+ // Write a 64 bit value for header.
+ const uint64_t l_header = 0xa5a5a5a5a5a5a5a5;
+ uint32_t l_scomAddress = 0x0003E000 | (i_ringAddress & 0xFF000000);
+ l_rc = fapi2::putScom(l_proc, l_scomAddress, l_header);
+ if(l_rc != fapi2::FAPI2_RC_SUCCESS)
+ {
+ break;
+ }
+
+ }while(0);
+
+ return l_rc;
+}
- ReturnCode getRing_verifyAndcleanup(const uint32_t i_ringAddress,
- const RingMode i_ringMode)
+ReturnCode getRing_granule_data(const uint32_t i_ringAddress,
+ uint64_t *o_data,
+ const uint32_t i_bitShiftValue)
+{
+ fapi2::ReturnCode l_rc = FAPI2_RC_SUCCESS;
+ uint32_t l_chipletId = i_ringAddress & 0xFF000000;
+
+ fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP> l_proc;
+
+ uint32_t l_scomAddress = 0x00039000 | i_bitShiftValue;
+ l_scomAddress |= l_chipletId;
+
+ do
{
- return FAPI2_RC_SUCCESS;
- }
+ fapi2::buffer<uint64_t> l_ringData;
+ l_rc = fapi2::getScom(l_proc, l_scomAddress, l_ringData);
+ if(l_rc != fapi2::FAPI2_RC_SUCCESS)
+ {
+ break;
+ }
+ *o_data = l_ringData;
+ } while(0);
+
+ return l_rc;
+}
+
+
+ReturnCode getRing_verifyAndcleanup(const uint32_t i_ringAddress,
+ const RingMode i_ringMode)
+{
+ fapi2::ReturnCode l_rc = FAPI2_RC_SUCCESS;
+ uint32_t l_chipletId = i_ringAddress >> 24;
+
+ fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP> l_proc;
+
+ do
+ {
+ // Verify header
+ uint64_t l_header = 0xa5a5a5a5a5a5a5a5;
+ l_rc = verifyHeader(l_proc, l_header, l_chipletId,i_ringMode);
+ if(l_rc != fapi2::FAPI2_RC_SUCCESS)
+ {
+ break;
+ }
+
+ l_rc = cleanScanRegionandTypeData(l_proc, l_chipletId);
+ if(l_rc != fapi2::FAPI2_RC_SUCCESS)
+ {
+ break;
+ }
+
+ if (i_ringMode & fapi2::RING_MODE_SET_PULSE_SL)
+ {
+ l_rc = restoreOPCGRegData(l_proc, g_opcgData, l_chipletId);
+ if(l_rc != fapi2::FAPI2_RC_SUCCESS)
+ {
+ break;
+ }
+ }
+
+ }while(0);
+
+ return l_rc;
+}
uint32_t getscom_abs_wrap(const uint32_t i_addr, uint64_t *o_data)
{
OpenPOWER on IntegriCloud