summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/include/usr/pnor/pnorif.H5
-rw-r--r--src/usr/devtree/bld_devtree.C110
-rw-r--r--src/usr/pnor/pnor_common.H1
-rw-r--r--src/usr/pnor/pnordd.C3
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 =
OpenPOWER on IntegriCloud