diff options
author | Ilya Smirnov <ismirno@us.ibm.com> | 2019-08-13 11:25:34 -0500 |
---|---|---|
committer | Daniel M Crowell <dcrowell@us.ibm.com> | 2019-09-10 10:24:42 -0500 |
commit | fc0e2ceeeb8132eaf5652eb420d984c2c3b8fe23 (patch) | |
tree | 711b5a2f39c6120087d32f08dc0b183c97490721 /src/usr/hdat/hdatmsvpd.C | |
parent | cd820b6626a1af1e272e5d6457e233c1841db47f (diff) | |
download | talos-hostboot-fc0e2ceeeb8132eaf5652eb420d984c2c3b8fe23.tar.gz talos-hostboot-fc0e2ceeeb8132eaf5652eb420d984c2c3b8fe23.zip |
HDAT: Add SMF Memory Region
The SMF memory region was not being populated in HDAT, causing
skiboot to not find any secure memory. This commit adds changes
to include the SMF memory range into HDAT.
Change-Id: I67cfc2787d90604e3da0f61844776c8704ea2640
Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/82180
Reviewed-by: Nicholas E Bofferding <bofferdn@us.ibm.com>
Reviewed-by: Jayashankar Padath <jayashankar.padath@in.ibm.com>
Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com>
Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com>
Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com>
Tested-by: Jenkins OP HW <op-hw-jenkins+hostboot@us.ibm.com>
Reviewed-by: Daniel M Crowell <dcrowell@us.ibm.com>
Diffstat (limited to 'src/usr/hdat/hdatmsvpd.C')
-rwxr-xr-x | src/usr/hdat/hdatmsvpd.C | 143 |
1 files changed, 140 insertions, 3 deletions
diff --git a/src/usr/hdat/hdatmsvpd.C b/src/usr/hdat/hdatmsvpd.C index def8a37e8..2a7ba42e1 100755 --- a/src/usr/hdat/hdatmsvpd.C +++ b/src/usr/hdat/hdatmsvpd.C @@ -609,7 +609,8 @@ errlHndl_t HdatMsVpd::addMsAreaAddr(uint16_t i_msAreaId, bool i_rangeIsMirrorable, uint8_t i_mirroringAlgorithm, uint64_t i_startMirrAddr, - uint32_t i_hdatMemCntrlID) + uint32_t i_hdatMemCntrlID, + bool i_hdatSmf) { errlHndl_t l_errlHndl = NULL; HdatMsArea *l_obj; @@ -620,8 +621,14 @@ errlHndl_t HdatMsVpd::addMsAreaAddr(uint16_t i_msAreaId, if (i_msAreaId < iv_actMsAreaCnt) { l_obj = HDAT_MS_AREA(i_msAreaId); - l_errlHndl = l_obj->addAddrRange(i_start, i_end, i_procChipId, - i_rangeIsMirrorable, i_mirroringAlgorithm, l_startMirrAddr, i_hdatMemCntrlID); + l_errlHndl = l_obj->addAddrRange(i_start, + i_end, + i_procChipId, + i_rangeIsMirrorable, + i_mirroringAlgorithm, + l_startMirrAddr, + i_hdatMemCntrlID, + i_hdatSmf); } else { @@ -1094,6 +1101,8 @@ errlHndl_t HdatMsVpd::hdatLoadMsData(uint32_t &o_size, uint32_t &o_count) for(;l_procs;++l_procs) { + bool l_smfAdded = false; + TARGETING::Target *l_pProcTarget = *(l_procs); TARGETING::ATTR_ORDINAL_ID_type l_procChipId = l_pProcTarget->getAttr<TARGETING::ATTR_ORDINAL_ID>(); @@ -1639,9 +1648,69 @@ errlHndl_t HdatMsVpd::hdatLoadMsData(uint32_t &o_size, uint32_t &o_count) l_nhtmSize=0; //only add 1 entry } l_addr_range = l_end; + + auto l_smfStartAddr = l_pProcTarget-> + getAttr<TARGETING::ATTR_PROC_SMF_BAR_BASE_ADDR>(); + auto l_smfSize = l_pProcTarget-> + getAttr<TARGETING::ATTR_PROC_SMF_BAR_SIZE>(); + + if(l_smfSize && !l_smfAdded) + { + hdatMsAddr_t l_hdatSmfStartAddr{}; + hdatMsAddr_t l_hdatSmfEndAddr{}; + l_hdatSmfStartAddr.hi = + (l_smfStartAddr & 0xFFFFFFFF00000000ull) >> 32; + l_hdatSmfStartAddr.lo = + l_smfStartAddr & 0x00000000FFFFFFFFull; + l_hdatSmfStartAddr.hi |= HDAT_REAL_ADDRESS_MASK; + + l_hdatSmfEndAddr.hi = + ((l_smfStartAddr + l_smfSize) & + 0xFFFFFFFF00000000ull) >>32; + l_hdatSmfEndAddr.lo = + (l_smfStartAddr + l_smfSize) & + 0x00000000FFFFFFFFull; + l_hdatSmfEndAddr.hi |= HDAT_REAL_ADDRESS_MASK; + + l_err = addMsAreaAddr(l_index, + l_hdatSmfStartAddr, + l_hdatSmfEndAddr, + l_procChipId, + false, //rangeIsMirrorable + 0, // i_mirroringAlgorithm + 0, // i_startMirrAddr + l_hdatMemcntrlID, + true); // i_hdatsmf + l_smfAdded = true; + } + + if(l_err) + { + HDAT_ERR("Could not add SMF memory range to " + "HDAT at index[%d]", l_index); + break; + } + else + { + HDAT_INF("Added SMF memory range to HDAT at " + "index[%d]; start addr: 0x%08x; end addr: 0x%08x" + "; size: 0x%08x", + l_smfStartAddr, + l_smfStartAddr + l_smfSize, + l_smfSize); + } + l_index++; } //end of mca list + if(l_err) + { + break; + } } //end of MCS list + if(l_err) + { + break; + } } //end of MCBIST list } else //if model is Axone @@ -2231,11 +2300,79 @@ errlHndl_t HdatMsVpd::hdatLoadMsData(uint32_t &o_size, uint32_t &o_count) l_nhtmSize=0; //only add 1 entry } l_addr_range = l_end; + + // Add SMF memory addr range + auto l_smfStartAddr = l_pProcTarget-> + getAttr<TARGETING::ATTR_PROC_SMF_BAR_BASE_ADDR>(); + auto l_smfSize = l_pProcTarget-> + getAttr<TARGETING::ATTR_PROC_SMF_BAR_SIZE>(); + + if(l_smfSize && !l_smfAdded) + { + hdatMsAddr_t l_hdatSmfStartAddr{}; + hdatMsAddr_t l_hdatSmfEndAddr{}; + l_hdatSmfStartAddr.hi = + (l_smfStartAddr & 0xFFFFFFFF00000000ull) >> 32; + l_hdatSmfStartAddr.lo = + l_smfStartAddr & 0x00000000FFFFFFFFull; + l_hdatSmfStartAddr.hi |= HDAT_REAL_ADDRESS_MASK; + + l_hdatSmfEndAddr.hi = + ((l_smfStartAddr + l_smfSize) & + 0xFFFFFFFF00000000ull) >>32; + l_hdatSmfEndAddr.lo = + (l_smfStartAddr + l_smfSize) & + 0x00000000FFFFFFFFull; + l_hdatSmfEndAddr.hi |= HDAT_REAL_ADDRESS_MASK; + + l_err = addMsAreaAddr(l_index, + l_hdatSmfStartAddr, + l_hdatSmfEndAddr, + l_procChipId, + false, //rangeIsMirrorable + 0, // i_mirroringAlgorithm + 0, // i_startMirrAddr + l_hdatMemcntrlID, + true); // i_hdatsmf + l_smfAdded = true; + } + + if(l_err) + { + HDAT_ERR("Could not add SMF memory range to " + "HDAT at index[%d]", l_index); + break; + } + else + { + HDAT_INF("Added SMF memory range to HDAT at " + "index[%d]; start addr: 0x%08x; end addr: 0x%08x" + "; size: 0x%08x", + l_smfStartAddr, + l_smfStartAddr + l_smfSize, + l_smfSize); + } l_index++; } // end of OCMB_CHIP list + if(l_err) + { + break; + } } //end of OMI list + if(l_err) + { + break; + } } //end of MCC list + if(l_err) + { + break; + } } //end of MI list + if(l_err) + { + break; + } } //end of MC list } if(l_err) |