diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/include/usr/pnor/pnorif.H | 5 | ||||
-rw-r--r-- | src/usr/devtree/bld_devtree.C | 110 | ||||
-rw-r--r-- | src/usr/pnor/pnor_common.H | 1 | ||||
-rw-r--r-- | src/usr/pnor/pnordd.C | 3 |
4 files changed, 117 insertions, 2 deletions
diff --git a/src/include/usr/pnor/pnorif.H b/src/include/usr/pnor/pnorif.H index e12ccf122..0fc5a83dc 100644 --- a/src/include/usr/pnor/pnorif.H +++ b/src/include/usr/pnor/pnorif.H @@ -120,6 +120,11 @@ struct SideInfo_t uint64_t hbbMmioOffset; /**< HBB MMIO Offset associated with hbbAddress*/ }; +enum +{ + INVALID_OFFSET = 0xFFFFFFF, // Invalid primary or alternate TOC +}; + /** * @brief Returns information about a given side of pnor * diff --git a/src/usr/devtree/bld_devtree.C b/src/usr/devtree/bld_devtree.C index 221d7db0e..f2e9438aa 100644 --- a/src/usr/devtree/bld_devtree.C +++ b/src/usr/devtree/bld_devtree.C @@ -405,6 +405,113 @@ void add_i2c_info( const TARGETING::Target* i_targ, } +void bld_getSideInfo(PNOR::SideId i_side, + uint32_t o_TOCaddress[2], + uint8_t & o_count, + bool & o_isGolden) +{ + errlHndl_t errhdl = NULL; + PNOR::SideInfo_t l_info; + + o_count = 0; + o_isGolden = false; + + errhdl = getSideInfo (i_side, l_info); + if (!errhdl) + { + // return the valid TOC offsets & count of valid TOCs + if (PNOR::INVALID_OFFSET != l_info.primaryTOC) + { + o_TOCaddress[o_count++] = l_info.primaryTOC; + } + if (PNOR::INVALID_OFFSET != l_info.backupTOC) + { + o_TOCaddress[o_count++] = l_info.backupTOC; + } + o_isGolden = l_info.isGolden; + } + else + { + // commit error and return 0 TOC offsets + errlCommit(errhdl, DEVTREE_COMP_ID); + } + + return; +} + +void bld_fdt_pnor(devTree * i_dt, + dtOffset_t i_parentNode) +{ + do + { + uint32_t l_active[2] = {PNOR::INVALID_OFFSET,PNOR::INVALID_OFFSET}; + uint32_t l_golden[2] = {PNOR::INVALID_OFFSET,PNOR::INVALID_OFFSET}; + uint8_t l_count = 0; + bool l_isGolden = false; + bool l_goldenFound = false; + uint8_t l_goldenCount = 0; + PNOR::PnorInfo_t l_pnorInfo; + + //Get pnor address and size + getPnorInfo (l_pnorInfo); + + dtOffset_t l_pnorNode = i_dt->addNode(i_parentNode, + "pnor", + l_pnorInfo.mmioOffset); + + const uint8_t l_isaLinkage = 0; // 0==Mem + uint32_t pnor_prop[3] = {l_isaLinkage, + l_pnorInfo.mmioOffset, + l_pnorInfo.flashSize}; + i_dt->addPropertyCells32(l_pnorNode, "reg", pnor_prop, 3); + + //Add Working/Active parition + bld_getSideInfo(PNOR::WORKING,l_active,l_count,l_isGolden); + if (l_count) // valid TOCs present + { + i_dt->addPropertyCells32(l_pnorNode, + "active-image-tocs", l_active, l_count); + // capture golden + if (l_isGolden) + { + l_golden[0] = l_active[0]; + l_golden[1] = l_active[1]; + l_goldenCount = l_count; + l_goldenFound = true; + } + } + +#if CONFIG_PNOR_TWO_SIDE_SUPPORT + //Add Alternate parition + uint32_t l_alternate[2] = {PNOR::INVALID_OFFSET,PNOR::INVALID_OFFSET}; + + bld_getSideInfo(PNOR::ALTERNATE,l_alternate,l_count,l_isGolden); + if (l_count) // valid TOCs present + { + i_dt->addPropertyCells32(l_pnorNode, + "alternate-image-tocs",l_alternate,l_count); + // capture golden + if (l_isGolden) + { + l_golden[0] = l_alternate[0]; + l_golden[1] = l_alternate[1]; + l_goldenCount = l_count; + l_goldenFound = true; + } + } +#endif + + //Include golden if there is one + if (l_goldenFound) + { + i_dt->addPropertyCells32(l_pnorNode, + "golden-image-tocs",l_golden,l_goldenCount); + } + + } while (0); + + return; +} void bld_xscom_node(devTree * i_dt, dtOffset_t & i_parentNode, const TARGETING::Target * i_pProc, uint32_t i_chipid) @@ -488,6 +595,8 @@ void bld_xscom_node(devTree * i_dt, dtOffset_t & i_parentNode, i_dt->addPropertyCell32(lpcNode, "#address-cells", 2); i_dt->addPropertyCell32(lpcNode, "#size-cells", 1); + bld_fdt_pnor (i_dt, lpcNode); + } /*NX*/ @@ -908,6 +1017,7 @@ void load_hbrt_image(uint64_t& io_address) } } + errlHndl_t bld_fdt_system(devTree * i_dt, bool i_smallTree) { errlHndl_t errhdl = NULL; diff --git a/src/usr/pnor/pnor_common.H b/src/usr/pnor/pnor_common.H index dd7ab2ea1..7213add40 100644 --- a/src/usr/pnor/pnor_common.H +++ b/src/usr/pnor/pnor_common.H @@ -61,7 +61,6 @@ namespace PNOR { SUPPORTED_FFS_VERSION = 0x1, /**< Supported FFS Version */ FFS_TABLE_BASE_ADDR = 0x0, /**< Currently only have FFS table */ TOC_SIZE = 0x8000, - INVALID_OFFSET = 0xFFFFFFF, }; /** diff --git a/src/usr/pnor/pnordd.C b/src/usr/pnor/pnordd.C index 13667ce3a..c0c7b0ebf 100644 --- a/src/usr/pnor/pnordd.C +++ b/src/usr/pnor/pnordd.C @@ -46,6 +46,7 @@ #include <errl/errludstring.H> #include <targeting/common/targetservice.H> #include "pnordd.H" +#include "pnor_common.H" #include <pnor/pnorif.H> #include <pnor/pnor_reasoncodes.H> #include <sys/time.h> @@ -196,7 +197,7 @@ bool usingL3Cache() */ void getPnorInfo( PnorInfo_t& o_pnorInfo ) { - o_pnorInfo.mmioOffset = 0; //LPC_SFC_MMIO_OFFSET;//@fixme-need Prachi's code for this + o_pnorInfo.mmioOffset = LPC_SFC_MMIO_OFFSET|LPC_FW_SPACE; o_pnorInfo.norWorkarounds = Singleton<PnorDD>::instance().getNorWorkarounds(); o_pnorInfo.flashSize = |