diff options
-rw-r--r-- | src/include/usr/sbeio/sbeioif.H | 21 | ||||
-rw-r--r-- | src/usr/initservice/extinitsvc/extinitsvctasks.H | 27 | ||||
-rw-r--r-- | src/usr/isteps/istep21/call_host_runtime_setup.C | 9 | ||||
-rw-r--r-- | src/usr/mbox/mailboxsp.C | 13 | ||||
-rw-r--r-- | src/usr/runtime/populate_hbruntime.C | 14 | ||||
-rw-r--r-- | src/usr/sbeio/sbe_memRegionMgr.C | 117 | ||||
-rw-r--r-- | src/usr/sbeio/sbe_memRegionMgr.H | 17 |
7 files changed, 150 insertions, 68 deletions
diff --git a/src/include/usr/sbeio/sbeioif.H b/src/include/usr/sbeio/sbeioif.H index fc3fb347b..6bf1568ab 100644 --- a/src/include/usr/sbeio/sbeioif.H +++ b/src/include/usr/sbeio/sbeioif.H @@ -183,20 +183,26 @@ namespace SBEIO * Unsecure Memory Region to Open * * @param[in] i_size Size in bytes of the Unsecure Memory Region + * Assert if size = 0 * * @param[in] i_isWritable Specifies if the Unsecure Memory is Read-Only - * or Read-Write: If false then Read-only Region + * or Read-Write: If false then Read-Only Region * If true then Read-Write Region * + * @param[in] i_target Target associated with SBE command + * If nullptr, default to Master Processor + * * @return errlHndl_t Error log handle on failure. * * @note Function is not thread-safe. - * @note Read-Only/Read-Write settings are not considered when closing any - * existing regions that overlap with the requested region to open. + * @note Read-Only/Read-Write settings and Target associated with the + * region are not considered when closing any existing regions + * that overlap with the requested region to open. */ errlHndl_t openUnsecureMemRegion(const uint64_t i_start_addr, const uint32_t i_size, - const bool i_isWritable); + const bool i_isWritable, + TARGETING::Target* i_target=nullptr); /** * @brief Close Unsecure Memory Region @@ -204,12 +210,15 @@ namespace SBEIO * @param[in] i_start_addr Starting Physical Memory Address of the * Unsecure Memory Region to Close * + * @param[in] i_target Target associated with SBE command + * If nullptr, default to Master Processor + * * @return errlHndl_t Error log handle on failure. * * @note Function is not thread-safe. */ - errlHndl_t closeUnsecureMemRegion(const uint64_t i_start_addr); - + errlHndl_t closeUnsecureMemRegion(const uint64_t i_start_addr, + TARGETING::Target* i_target=nullptr); /** * @brief Close All Unsecure Memory Regions diff --git a/src/usr/initservice/extinitsvc/extinitsvctasks.H b/src/usr/initservice/extinitsvc/extinitsvctasks.H index 4b326e2fc..49c76400a 100644 --- a/src/usr/initservice/extinitsvc/extinitsvctasks.H +++ b/src/usr/initservice/extinitsvc/extinitsvctasks.H @@ -121,6 +121,20 @@ const TaskInfo g_exttaskinfolist[] = { EXT_IMAGE, // Extended Module } }, + + /** + * @brief SBE IO Device Driver + */ + { + "libsbeio.so", // taskname + NULL, // no ptr to fnct + { + + INIT_TASK, // init only + EXT_IMAGE, // Extended Module + } + }, + /** * @brief Mailbox service provider */ @@ -180,19 +194,6 @@ const TaskInfo g_exttaskinfolist[] = { #endif /** - * @brief SBE IO Device Driver - */ - { - "libsbeio.so", // taskname - NULL, // no ptr to fnct - { - - INIT_TASK, // init only - EXT_IMAGE, // Extended Module - } - }, - - /** * @brief FSI SCOM Device Driver */ { diff --git a/src/usr/isteps/istep21/call_host_runtime_setup.C b/src/usr/isteps/istep21/call_host_runtime_setup.C index bfc931224..774d1ac3f 100644 --- a/src/usr/isteps/istep21/call_host_runtime_setup.C +++ b/src/usr/isteps/istep21/call_host_runtime_setup.C @@ -126,6 +126,15 @@ void* call_host_runtime_setup (void *io_pArgs) "Successfully sent all system configs to procs via SBE chip op !!"); } + // Tell SBE to Close All Unsecure Memory Regions + l_err = SBEIO::closeAllUnsecureMemRegions(); + if ( l_err ) + { + TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, + "SBEIO::closeAllUnsecureMemRegions Failed" ); + // break from do loop if error occured + break; + } // Need to load up the runtime module if it isn't already loaded diff --git a/src/usr/mbox/mailboxsp.C b/src/usr/mbox/mailboxsp.C index e3a2c2dbf..4a968ed27 100644 --- a/src/usr/mbox/mailboxsp.C +++ b/src/usr/mbox/mailboxsp.C @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2012,2016 */ +/* Contributors Listed Below - COPYRIGHT 2012,2017 */ /* [+] Google Inc. */ /* [+] International Business Machines Corp. */ /* */ @@ -48,6 +48,7 @@ #include <errno.h> #include <kernel/console.H> #include <arch/pirformat.H> +#include <sbeio/sbeioif.H> // Local functions namespace MBOX @@ -152,6 +153,16 @@ errlHndl_t MailboxSp::_init() // provider task_create(MailboxSp::msg_handler, NULL); + // Tell SBE to create Read-Write Memory Region for the DMA Buffer + err = SBEIO::openUnsecureMemRegion( + iv_dmaBuffer.toPhysAddr(iv_dmaBuffer.getDmaBufferHead()), + VmmManager::MBOX_DMA_SIZE, + true); //true=Read-Write + if (err) + { + return err; + } + if(mbxComm) { //TODO RTC 150260 Move after init after mask issues resolved diff --git a/src/usr/runtime/populate_hbruntime.C b/src/usr/runtime/populate_hbruntime.C index e29363b2f..f5310d1a1 100644 --- a/src/usr/runtime/populate_hbruntime.C +++ b/src/usr/runtime/populate_hbruntime.C @@ -897,6 +897,20 @@ errlHndl_t populate_HbRsvMem(uint64_t i_nodeId) l_prevDataAddr = l_sbeffdcAddr; l_prevDataSize = l_sbeffdcSizeAligned; + // Open Unsecure Memory Region for SBE FFDC Section + l_elog = SBEIO::openUnsecureMemRegion(l_sbeffdcAddr, + l_sbeffdcSize, + false, //Read-Only + l_procChip); + + if(l_elog) + { + TRACFCOMP( g_trac_runtime, + "populate_HbRsvMem: openUnsecureMemRegion failed"); + + break; + } + // Send Set FFDC Address, tell SBE where to write FFDC and messages l_elog = SBEIO::sendSetFFDCAddr(l_sbeffdcSize, diff --git a/src/usr/sbeio/sbe_memRegionMgr.C b/src/usr/sbeio/sbe_memRegionMgr.C index 9cd4dbc34..b598b3cef 100644 --- a/src/usr/sbeio/sbe_memRegionMgr.C +++ b/src/usr/sbeio/sbe_memRegionMgr.C @@ -52,23 +52,28 @@ namespace SBEIO // External Function to Open an Unsecure Memory Region // - see sbeioif.H for details -errlHndl_t openUnsecureMemRegion(const uint64_t i_start_addr, - const uint32_t i_size, - const bool i_isWritable) +errlHndl_t openUnsecureMemRegion( + const uint64_t i_start_addr, + const uint32_t i_size, + const bool i_isWritable, + TARGETING::Target* i_target) { return Singleton<MemRegionMgr>::instance() .openUnsecureMemRegion(i_start_addr, i_size, - i_isWritable); + i_isWritable, + i_target); }; // External Function to Close an Unsecure Memory Region // - see sbeioif.H for details -errlHndl_t closeUnsecureMemRegion(const uint64_t i_start_addr) +errlHndl_t closeUnsecureMemRegion( + const uint64_t i_start_addr, + TARGETING::Target* i_target) { return Singleton<MemRegionMgr>::instance() - .closeUnsecureMemRegion(i_start_addr); + .closeUnsecureMemRegion(i_start_addr, i_target); }; @@ -117,9 +122,10 @@ MemRegionMgr::~MemRegionMgr() * - see sbe_unsecureMemRegionMgr.H for details */ errlHndl_t MemRegionMgr::openUnsecureMemRegion( - const uint64_t i_start_addr, - const uint32_t i_size, - const bool i_isWritable) + const uint64_t i_start_addr, + const uint32_t i_size, + const bool i_isWritable, + TARGETING::Target* i_target) { errlHndl_t errl = nullptr; @@ -129,9 +135,12 @@ errlHndl_t MemRegionMgr::openUnsecureMemRegion( SbePsu::SBE_MEM_REGION_OPEN_READ_WRITE : SbePsu::SBE_MEM_REGION_OPEN_READ_ONLY; - SBE_TRACF(ENTER_MRK"openUnsecureMemRegion: i_start_addr=0x%.16llX, " - "i_size=0x%.8X, i_isWritable=%d (flags=0x%.2X)", - i_start_addr, i_size, i_isWritable, input_flags); + SBE_TRACF(ENTER_MRK"openUnsecureMemRegion: i_tgt=0x%X: " + "i_start_addr=0x%.16llX, i_size=0x%.8X, i_isWritable=%d " + "(flags=0x%.2X)", + TARGETING::get_huid(i_target), i_start_addr, i_size, + i_isWritable, input_flags); + assert(i_size!=0, "openUnsecureMemRegion: i_size=0"); do { @@ -167,6 +176,7 @@ errlHndl_t MemRegionMgr::openUnsecureMemRegion( l_region.start_addr = itr->start_addr; l_region.size = itr->size; l_region.flags = SbePsu::SBE_MEM_REGION_CLOSE; + l_region.tgt = itr->tgt; errl = doUnsecureMemRegionOp(l_region); @@ -189,6 +199,7 @@ errlHndl_t MemRegionMgr::openUnsecureMemRegion( l_region.start_addr = itr->start_addr; l_region.size = i_start_addr - itr->start_addr; l_region.flags = itr->flags; + l_region.tgt = itr->tgt; errl = doUnsecureMemRegionOp(l_region); @@ -225,6 +236,7 @@ errlHndl_t MemRegionMgr::openUnsecureMemRegion( l_region.start_addr = itr->start_addr; l_region.size = itr->size; l_region.flags = SbePsu::SBE_MEM_REGION_CLOSE; + l_region.tgt = itr->tgt; errl = doUnsecureMemRegionOp(l_region); @@ -251,6 +263,7 @@ errlHndl_t MemRegionMgr::openUnsecureMemRegion( l_region.size = (itr->start_addr + itr->size) - (i_start_addr + i_size); l_region.flags = itr->flags; + l_region.tgt = itr->tgt; errl = doUnsecureMemRegionOp(l_region); @@ -289,6 +302,7 @@ errlHndl_t MemRegionMgr::openUnsecureMemRegion( l_region.start_addr = itr->start_addr; l_region.size = itr->size; l_region.flags = SbePsu::SBE_MEM_REGION_CLOSE; + l_region.tgt = itr->tgt; errl = doUnsecureMemRegionOp(l_region); @@ -331,6 +345,7 @@ errlHndl_t MemRegionMgr::openUnsecureMemRegion( l_region.start_addr = i_start_addr; l_region.size = i_size; l_region.flags = input_flags; + l_region.tgt = i_target; errl = doUnsecureMemRegionOp(l_region); if (errl) @@ -354,9 +369,9 @@ errlHndl_t MemRegionMgr::openUnsecureMemRegion( // TODO RTC 174970 remove when base support is working printIvMemRegions(); - SBE_TRACF(EXIT_MRK "openUnsecureMemRegion: i_start_addr=0x%.16llX: " - "err_rc=0x%.4X", - i_start_addr, + SBE_TRACF(EXIT_MRK "openUnsecureMemRegion: i_tgt=0x%X: " + "i_start_addr=0x%.16llX: err_rc=0x%.4X", + TARGETING::get_huid(i_target), i_start_addr, ERRL_GETRC_SAFE(errl)); return errl; @@ -366,15 +381,18 @@ errlHndl_t MemRegionMgr::openUnsecureMemRegion( * MemRegionMgr::closeUnsecureMemRegion * - see sbe_unsecureMemRegionMgr.H for details */ -errlHndl_t MemRegionMgr::closeUnsecureMemRegion(const uint64_t i_start_addr) +errlHndl_t MemRegionMgr::closeUnsecureMemRegion( + const uint64_t i_start_addr, + TARGETING::Target* i_target) { errlHndl_t errl = nullptr; bool region_found = false; regionData l_region; - SBE_TRACF(ENTER_MRK"closeUnsecureMemRegion: i_start_addr=0x%.16llX", - i_start_addr); + SBE_TRACF(ENTER_MRK"closeUnsecureMemRegion: i_tgt=0x%X: " + "i_start_addr=0x%.16llX", + TARGETING::get_huid(i_target), i_start_addr); do { @@ -389,6 +407,8 @@ errlHndl_t MemRegionMgr::closeUnsecureMemRegion(const uint64_t i_start_addr) l_region.start_addr = itr->start_addr; l_region.size = itr->size; l_region.flags = SbePsu::SBE_MEM_REGION_CLOSE; + l_region.tgt = itr->tgt; + errl = doUnsecureMemRegionOp(l_region); if (errl) { @@ -443,9 +463,9 @@ errlHndl_t MemRegionMgr::closeUnsecureMemRegion(const uint64_t i_start_addr) } while (0); - SBE_TRACF(EXIT_MRK "closeUnsecureMemRegion: i_start_addr0x%.16llX: " - "err_rc=0x%4X", - i_start_addr, + SBE_TRACF(EXIT_MRK "closeUnsecureMemRegion: i_tgt: 0x%X: " + "i_start_addr0x%.16llX: err_rc=0x%4X", + TARGETING::get_huid(i_target), i_start_addr, ERRL_GETRC_SAFE(errl)); return errl; @@ -535,30 +555,38 @@ errlHndl_t MemRegionMgr::closeAllUnsecureMemRegions() * MemRegionMgr::doUnsecureMemRegionOp * - see sbe_unsecureMemRegionMgr.H for details */ -errlHndl_t MemRegionMgr::doUnsecureMemRegionOp(const regionData & i_region) +errlHndl_t MemRegionMgr::doUnsecureMemRegionOp(regionData & i_region) { errlHndl_t errl = nullptr; + TARGETING::Target * l_tgt = i_region.tgt; // @TODO RTC 174970 - make TRACD when SBE support is tested - SBE_TRACF(ENTER_MRK"doUnsecureMemRegionOp: start_addr=0x%.16llX, " - "size=0x%.8X, controlFlags=0x%.2X", - i_region.start_addr, i_region.size, i_region.flags); + SBE_TRACF(ENTER_MRK"doUnsecureMemRegionOp: tgt=0x%.8X: " + "start_addr=0x%.16llX, size=0x%.8X, controlFlags=0x%.2X", + TARGETING::get_huid(l_tgt), i_region.start_addr, + i_region.size, i_region.flags); do { - // Find master proc for target of PSU command - TARGETING::TargetService& tS = TARGETING::targetService(); - TARGETING::Target * l_master = nullptr; - - errl = tS.queryMasterProcChipTargetHandle(l_master); - if (errl) + // Find master proc for target of PSU command, if necessary + if (l_tgt == nullptr) { - SBE_TRACF(ERR_MRK "doUnsecureMemRegionOp: Failed to get Master " - "Proc: err rc=0x%.4X plid=0x%.8X", - ERRL_GETRC_SAFE(errl), ERRL_GETPLID_SAFE(errl)); + TARGETING::TargetService& tS = TARGETING::targetService(); - break; + errl = tS.queryMasterProcChipTargetHandle(l_tgt); + if (errl) + { + SBE_TRACF(ERR_MRK "doUnsecureMemRegionOp: Failed to get Master " + "Proc: err rc=0x%.4X plid=0x%.8X", + ERRL_GETRC_SAFE(errl), ERRL_GETPLID_SAFE(errl)); + + break; + } + + // Set target for future operations + i_region.tgt = l_tgt; } + SbePsu::psuCommand l_psuCommand( i_region.flags | SbePsu::SBE_MEM_REGION_RESPONSE_REQUIRED, //control flags @@ -573,7 +601,7 @@ errlHndl_t MemRegionMgr::doUnsecureMemRegionOp(const regionData & i_region) // @TODO RTC 174970 - Activate code block when SBE support is tested #if 0 - errl = SBEIO::SbePsu::getTheInstance().performPsuChipOp(l_master, + errl = SBEIO::SbePsu::getTheInstance().performPsuChipOp(l_tgt, &l_psuCommand, &l_psuResponse, SbePsu::MAX_PSU_SHORT_TIMEOUT_NS, @@ -583,7 +611,7 @@ errlHndl_t MemRegionMgr::doUnsecureMemRegionOp(const regionData & i_region) if (errl) { SBE_TRACF(ERR_MRK "doUnsecureMemRegionOp: PSU Cmd Failed: " - "err rc=0x%.4X plid=0x%.4X (mbxReg0=0x%.16llX)", + "err rc=0x%.4X plid=0x%.8X (mbxReg0=0x%.16llX)", ERRL_GETRC_SAFE(errl), ERRL_GETPLID_SAFE(errl), l_psuCommand.mbxReg0); break; @@ -593,10 +621,12 @@ errlHndl_t MemRegionMgr::doUnsecureMemRegionOp(const regionData & i_region) while (0); // @TODO RTC 174970 - make TRACD when SBE support is tested - SBE_TRACF(EXIT_MRK "doUnsecureMemRegionOp: start_addr=0x%.16llX, " - "size=0x%.8X, controlFlags=0x%.2X: err_rc=0x%.4X", - i_region.start_addr, i_region.size, i_region.flags, - ERRL_GETRC_SAFE(errl)); + SBE_TRACF(EXIT_MRK "doUnsecureMemRegionOp: tgt=0x%.8X: " + "start_addr=0x%.16llX, size=0x%.8X, controlFlags=0x%.2X: " + "err_rc=0x%.4X", + TARGETING::get_huid(l_tgt), i_region.start_addr, i_region.size, + i_region.flags, ERRL_GETRC_SAFE(errl)); + return errl; } @@ -611,9 +641,10 @@ void MemRegionMgr::printIvMemRegions(void) const for ( const auto& itr : iv_memRegions ) { - SBE_TRACF("printIvMemRegions: start_addr=0x%.16llX, " + SBE_TRACF("printIvMemRegions: tgt=0x%.8X: start_addr=0x%.16llX, " "size=0x%.8X, flags=0x%.2X (%s)", - itr.start_addr, itr.size, itr.flags, + TARGETING::get_huid(itr.tgt), itr.start_addr, + itr.size, itr.flags, itr.flags == SbePsu::SBE_MEM_REGION_OPEN_READ_ONLY ? "Read-Only" : "Read-Write"); } diff --git a/src/usr/sbeio/sbe_memRegionMgr.H b/src/usr/sbeio/sbe_memRegionMgr.H index b2b10cf70..d0b3fc4b1 100644 --- a/src/usr/sbeio/sbe_memRegionMgr.H +++ b/src/usr/sbeio/sbe_memRegionMgr.H @@ -42,10 +42,14 @@ struct regionData uint32_t size; // Size of region in bytes // Control Flags for PSU command - - // see SbePsu::psuSetUnsecureMemoryRegionControlFlags + // - see SbePsu::psuSetUnsecureMemoryRegionControlFlags uint8_t flags; - regionData() : start_addr(0), size(0), flags(0) {} + // Target associated with the SBE + // - If tgt == nullptr it will eventually be updated to the Master Proc + TARGETING::Target* tgt; + + regionData() : start_addr(0), size(0), flags(0), tgt(nullptr) {} }; /** @class MemRegionMgr @@ -71,7 +75,7 @@ class MemRegionMgr * @return errlHndl_t Error log handle on failure. * */ - errlHndl_t doUnsecureMemRegionOp(const regionData & i_region); + errlHndl_t doUnsecureMemRegionOp(regionData & i_region); public: /** @@ -113,7 +117,8 @@ class MemRegionMgr errlHndl_t openUnsecureMemRegion( const uint64_t i_start_addr, const uint32_t i_size, - const bool i_isWritable); + const bool i_isWritable, + TARGETING::Target* i_target); /** * @brief Close Unsecure Memory Region @@ -121,7 +126,9 @@ class MemRegionMgr * @note: See closeUnsecureMemRegion() function in sbeioif.H for details * */ - errlHndl_t closeUnsecureMemRegion(const uint64_t i_start_addr); + errlHndl_t closeUnsecureMemRegion( + const uint64_t i_start_addr, + TARGETING::Target* i_target); /** |