From e9489e7f7bdf45edb5e274c6b771485532ea906c Mon Sep 17 00:00:00 2001 From: Dan Crowell Date: Tue, 30 May 2017 15:32:26 -0500 Subject: Use XSCOM BAR from Bootloader instead of hardcoded value The memory map can be modified by the SBE such that the XSCOM BAR is not in the default location. The BAR value is passed up through the bootloader into hostboot. Change-Id: I469b7534d384bce4bb8c72f7cd78d0075ac04632 RTC: 173519 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/41140 Reviewed-by: Martin Gloff Tested-by: Jenkins Server Tested-by: FSP CI Jenkins Tested-by: Jenkins OP Build CI Reviewed-by: Christian R. Geddes Reviewed-by: Daniel M. Crowell --- src/include/kernel/bltohbdatamgr.H | 1 - src/include/usr/xscom/xscomif.H | 40 ++++++++++++++++++++++++++++++++++ src/usr/targeting/targetservicestart.C | 10 ++++++++- src/usr/xscom/xscom.C | 25 +++++++++++++-------- src/usr/xscom/xscom.H | 5 ----- 5 files changed, 65 insertions(+), 16 deletions(-) create mode 100644 src/include/usr/xscom/xscomif.H diff --git a/src/include/kernel/bltohbdatamgr.H b/src/include/kernel/bltohbdatamgr.H index 6563ba9f1..87db201ab 100644 --- a/src/include/kernel/bltohbdatamgr.H +++ b/src/include/kernel/bltohbdatamgr.H @@ -27,7 +27,6 @@ #define __BLTOHBDATAMANAGER_H #include -#include #include // BlToHbDataManager class diff --git a/src/include/usr/xscom/xscomif.H b/src/include/usr/xscom/xscomif.H new file mode 100644 index 000000000..1afdfafcb --- /dev/null +++ b/src/include/usr/xscom/xscomif.H @@ -0,0 +1,40 @@ +/* IBM_PROLOG_BEGIN_TAG */ +/* This is an automatically generated prolog. */ +/* */ +/* $Source: src/include/usr/xscom/xscomif.H $ */ +/* */ +/* OpenPOWER HostBoot Project */ +/* */ +/* Contributors Listed Below - COPYRIGHT 2017 */ +/* [+] 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 __XSCOMIF_H +#define __XSCOMIF_H + +namespace XSCOM +{ + +/** + * @brief Return the value of the XSCOM BAR that the driver is using + * @return XSCOM BAR physical address + */ +uint64_t get_master_bar( void ); + + +}; // namespace XSCOM + +#endif // end __XSCOMIF_H diff --git a/src/usr/targeting/targetservicestart.C b/src/usr/targeting/targetservicestart.C index e1bab1a5a..65c213d97 100755 --- a/src/usr/targeting/targetservicestart.C +++ b/src/usr/targeting/targetservicestart.C @@ -62,6 +62,7 @@ #include #include #include +#include #ifdef CONFIG_DRTM #include @@ -597,7 +598,14 @@ static void adjustMemoryMap( TargetService& i_targetService ) LPC::get_lpc_bar() ); TARG_ASSERT( true, "LPC BARs are inconsistent" ); } - //@todo-RTC:173519-Add xscom cross-check + if( l_pMasterProcChip->getAttr() + != XSCOM::get_master_bar() ) + { + TARG_ERR( "XSCOM attribute=%.16llX, live=%.16llX", + l_pMasterProcChip->getAttr(), + XSCOM::get_master_bar() ); + TARG_ASSERT( true, "XSCOM BARs are inconsistent" ); + } } diff --git a/src/usr/xscom/xscom.C b/src/usr/xscom/xscom.C index d5e47511f..422063729 100644 --- a/src/usr/xscom/xscom.C +++ b/src/usr/xscom/xscom.C @@ -48,6 +48,9 @@ #include #include #include +#include +#include +#undef HMER // from securerom/ROM.H // Trace definition trace_desc_t* g_trac_xscom = NULL; @@ -321,8 +324,8 @@ errlHndl_t getTargetVirtualAddress(TARGETING::Target* i_target, // If the virtual address equals NULL(default) then this is the - // first XSCOM to this target so we need to calculate - // the virtual address and save it in the xscom address attribute. + // first XSCOM to this target so we need to map in the appropriate + // address if (o_virtAddr == NULL) { uint64_t xscomGroupId = 0; @@ -522,13 +525,8 @@ uint64_t* getCpuIdVirtualAddress( XSComBase_t& o_mmioAddr ) { uint64_t* o_virtAddr = 0; - // Get the CPU core this thread is running on - PIR_t cpuid = task_getcpuid(); - - // Target's XSCOM Base address - o_mmioAddr = MASTER_PROC_XSCOM_BASE_ADDR + - (MMIO_OFFSET_PER_GROUP * cpuid.groupId) + - (MMIO_OFFSET_PER_GROUP * cpuid.chipId); + // Read the MMIO setup by the SBE + o_mmioAddr = g_BlToHbDataManager.getXscomBAR(); // Target's virtual address o_virtAddr = static_cast @@ -843,4 +841,13 @@ errlHndl_t xscomPerformOp(DeviceFW::OperationType i_opType, return l_err; } +/** + * @brief Return the value of the XSCOM BAR that the driver is using + */ +uint64_t get_master_bar( void ) +{ + return mm_virt_to_phys(g_masterProcVirtAddr); +} + + } // end namespace diff --git a/src/usr/xscom/xscom.H b/src/usr/xscom/xscom.H index b1ceaab6a..6f5f87c13 100644 --- a/src/usr/xscom/xscom.H +++ b/src/usr/xscom/xscom.H @@ -33,11 +33,6 @@ #include #include -/** - * @brief The (fixed) base address value for master proc - */ -constexpr uint64_t MASTER_PROC_XSCOM_BASE_ADDR = 0x000603FC00000000; - /** * @brief Type definition for XSCom address and Base */ -- cgit v1.2.1