summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMatt Ploetz <maploetz@us.ibm.com>2015-07-19 15:38:27 -0500
committerA. Patrick Williams III <iawillia@us.ibm.com>2015-09-11 13:18:00 -0500
commit2b0eccd26fe5e8f9516b14f4af689bbb085a43c0 (patch)
tree9e0f293a0031140ff3d9b331a1fa0b2b5440ef3a /src
parent2512b458dc679c86538f366126d2dab6c722fb75 (diff)
downloadtalos-hostboot-2b0eccd26fe5e8f9516b14f4af689bbb085a43c0.tar.gz
talos-hostboot-2b0eccd26fe5e8f9516b14f4af689bbb085a43c0.zip
Add support for Naples PCIE/IOP configs
Change-Id: Ifa545d748324bf1a4feadd13e5d855439da4c1ca RTC:109249 Reviewed-on: http://gfw160.aus.stglabs.ibm.com:8080/gerrit/19160 Tested-by: Jenkins Server Tested-by: Jenkins OP Build CI Tested-by: Jenkins OP HW Tested-by: FSP CI Jenkins Reviewed-by: WILLIAM G. HOFFA <wghoffa@us.ibm.com> Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
Diffstat (limited to 'src')
-rw-r--r--src/include/usr/hwpf/istepreasoncodes.H3
-rw-r--r--src/usr/devtree/bld_devtree.C2
-rw-r--r--src/usr/hwpf/hwp/nest_chiplets/nest_chiplets.C247
-rw-r--r--src/usr/hwpf/hwp/nest_chiplets/nest_chiplets.H22
-rw-r--r--src/usr/hwpf/plat/fapiPlatAttributeService.C7
-rw-r--r--src/usr/hwpf/plat/plat.mk3
-rw-r--r--src/usr/targeting/common/xmltohb/attribute_types.xml20
7 files changed, 237 insertions, 67 deletions
diff --git a/src/include/usr/hwpf/istepreasoncodes.H b/src/include/usr/hwpf/istepreasoncodes.H
index b433701cb..8dfe568ce 100644
--- a/src/include/usr/hwpf/istepreasoncodes.H
+++ b/src/include/usr/hwpf/istepreasoncodes.H
@@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* Contributors Listed Below - COPYRIGHT 2012,2014 */
+/* Contributors Listed Below - COPYRIGHT 2012,2015 */
/* [+] International Business Machines Corp. */
/* */
/* */
@@ -81,6 +81,7 @@ enum istepReasonCode
ISTEP_INVALID_TARGET_TYPE = ISTEP_COMP_ID | 0x0A,
ISTEP_INVALID_ATTR_VALUE = ISTEP_COMP_ID | 0x0B,
ISTEP_INVALID_CONFIGURATION = ISTEP_COMP_ID | 0x0C,
+ ISTEP_INVALID_PCIE_IOP_LANE_CONFIG = ISTEP_COMP_ID | 0x0D,
}; // end ISTEP
}
diff --git a/src/usr/devtree/bld_devtree.C b/src/usr/devtree/bld_devtree.C
index f094238d9..f5523ca4c 100644
--- a/src/usr/devtree/bld_devtree.C
+++ b/src/usr/devtree/bld_devtree.C
@@ -74,7 +74,7 @@ enum BuildConstants
CHIPID_NODE_SHIFT =3, /*CHIPID is NNNCCC, shift 3*/
CHIPID_PROC_MASK =0x7, /*CHIPID is NNNCCC, shift 3*/
PHB0_MASK =0x80,
- MAX_PHBs =3, /*Max PHBs per chip is 3*/
+ MAX_PHBs =4, /*Max PHBs per chip is 4*/
THREADPERCORE =8, /*8 threads per core*/
MHZ =1000000,
diff --git a/src/usr/hwpf/hwp/nest_chiplets/nest_chiplets.C b/src/usr/hwpf/hwp/nest_chiplets/nest_chiplets.C
index d02902071..c69c50a52 100644
--- a/src/usr/hwpf/hwp/nest_chiplets/nest_chiplets.C
+++ b/src/usr/hwpf/hwp/nest_chiplets/nest_chiplets.C
@@ -1011,10 +1011,11 @@ void _deconfigPhbsBasedOnPciState(
// PCI-0 => PHB0
// PCI-1 => PHB1
// PCI-2 => PHB2
+ // PCI-3 => PHB3
//
// Further, io_phbActiveMask and activePciMask are bitmasks whose
- // leftmost bit corresponds to PHB0, followed by bits for PHB1 and PHB2.
- // The remaining bits are ignored.
+ // leftmost bit corresponds to PHB0, followed by bits for PHB1, PHB2
+ // and PHB3. The remaining bits are ignored.
// Compensate for the fact that PHB mask bits start on left side of the
// mask
@@ -1133,110 +1134,138 @@ errlHndl_t computeProcPcieConfigAttrs(
i_pProcChipTarget ?
i_pProcChipTarget->getAttr<TARGETING::ATTR_HUID>() : 0);
- // TODO:
- // RTC 109249: Update comments for 40 lanes in Naples
-
- // Currently there are two IOP config tables, one for procs with 24 usable
- // PCIE lanes and one for proces with 32 usable PCIE lanes. In general, the
- // code accumulates the current configuration of the IOPs from the MRW and
- // other dynamic information (such as bifurcation, etc.), then matches that
- // config to one of the rows in the table. Once a match is discovered, the
- // IOP config value is pulled from the matching row and set in the
- // attributes.
+ // Currently there are three IOP config tables, one for procs with 24, 32
+ // or 40 usable PCIE lanes. In general, the code accumulates the current
+ // configuration of the IOPs from the MRW and other dynamic information
+ // (such as bifurcation, etc.), then matches that config to one of the
+ // rows in the table. Once a match is discovered, the IOP config value is
+ // pulled from the matching row and set in the attributes.
const laneConfigRow x24_laneConfigTable[] =
{{{{{LANE_WIDTH_16X,DSMP_DISABLE},
{LANE_WIDTH_NC,DSMP_DISABLE}},
{{LANE_WIDTH_8X,DSMP_DISABLE},
+ {LANE_WIDTH_NC,DSMP_DISABLE}},
+ {{LANE_WIDTH_NC,DSMP_DISABLE},
{LANE_WIDTH_NC,DSMP_DISABLE}}},
0x0,PHB0_MASK|PHB1_MASK},
{{{{LANE_WIDTH_16X,DSMP_DISABLE},
{LANE_WIDTH_NC,DSMP_DISABLE}},
{{LANE_WIDTH_NC,DSMP_DISABLE},
+ {LANE_WIDTH_NC,DSMP_DISABLE}},
+ {{LANE_WIDTH_NC,DSMP_DISABLE},
{LANE_WIDTH_NC,DSMP_DISABLE}}},
0x0,PHB0_MASK},
{{{{LANE_WIDTH_16X,DSMP_DISABLE},
{LANE_WIDTH_NC,DSMP_DISABLE}},
{{LANE_WIDTH_8X,DSMP_DISABLE},
+ {LANE_WIDTH_NC,DSMP_DISABLE}},
+ {{LANE_WIDTH_NC,DSMP_DISABLE},
{LANE_WIDTH_NC,DSMP_DISABLE}}},
0x1,PHB0_MASK|PHB1_MASK},
{{{{LANE_WIDTH_16X,DSMP_DISABLE},
{LANE_WIDTH_NC,DSMP_DISABLE}},
{{LANE_WIDTH_NC,DSMP_DISABLE},
+ {LANE_WIDTH_NC,DSMP_DISABLE}},
+ {{LANE_WIDTH_NC,DSMP_DISABLE},
{LANE_WIDTH_NC,DSMP_DISABLE}}},
0x1,PHB0_MASK},
{{{{LANE_WIDTH_8X,DSMP_DISABLE},
{LANE_WIDTH_NC,DSMP_DISABLE}},
{{LANE_WIDTH_8X,DSMP_DISABLE},
+ {LANE_WIDTH_NC,DSMP_DISABLE}},
+ {{LANE_WIDTH_NC,DSMP_DISABLE},
{LANE_WIDTH_NC,DSMP_DISABLE}}},
0x2,PHB0_MASK|PHB1_MASK},
{{{{LANE_WIDTH_8X,DSMP_DISABLE},
{LANE_WIDTH_8X,DSMP_DISABLE}},
{{LANE_WIDTH_8X,DSMP_DISABLE},
+ {LANE_WIDTH_NC,DSMP_DISABLE}},
+ {{LANE_WIDTH_NC,DSMP_DISABLE},
{LANE_WIDTH_NC,DSMP_DISABLE}}},
0x3,PHB0_MASK|PHB1_MASK|PHB2_MASK},
{{{{LANE_WIDTH_8X,DSMP_DISABLE},
{LANE_WIDTH_8X,DSMP_DISABLE}},
{{LANE_WIDTH_NC,DSMP_DISABLE},
+ {LANE_WIDTH_NC,DSMP_DISABLE}},
+ {{LANE_WIDTH_NC,DSMP_DISABLE},
{LANE_WIDTH_NC,DSMP_DISABLE}}},
0x3,PHB0_MASK|PHB2_MASK},
{{{{LANE_WIDTH_8X,DSMP_DISABLE},
{LANE_WIDTH_8X,DSMP_ENABLE}},
{{LANE_WIDTH_8X,DSMP_DISABLE},
+ {LANE_WIDTH_NC,DSMP_DISABLE}},
+ {{LANE_WIDTH_NC,DSMP_DISABLE},
{LANE_WIDTH_NC,DSMP_DISABLE}}},
0x4,PHB0_MASK|PHB1_MASK},
{{{{LANE_WIDTH_8X,DSMP_DISABLE},
{LANE_WIDTH_8X,DSMP_ENABLE}},
{{LANE_WIDTH_8X,DSMP_DISABLE},
+ {LANE_WIDTH_NC,DSMP_DISABLE}},
+ {{LANE_WIDTH_NC,DSMP_DISABLE},
{LANE_WIDTH_NC,DSMP_DISABLE}}},
0x5,PHB0_MASK|PHB1_MASK},
{{{{LANE_WIDTH_16X,DSMP_DISABLE},
{LANE_WIDTH_NC,DSMP_DISABLE}},
{{LANE_WIDTH_8X,DSMP_ENABLE},
+ {LANE_WIDTH_NC,DSMP_DISABLE}},
+ {{LANE_WIDTH_NC,DSMP_DISABLE},
{LANE_WIDTH_NC,DSMP_DISABLE}}},
0x6,PHB1_MASK},
{{{{LANE_WIDTH_8X,DSMP_DISABLE},
{LANE_WIDTH_8X,DSMP_DISABLE}},
{{LANE_WIDTH_8X,DSMP_ENABLE},
+ {LANE_WIDTH_NC,DSMP_DISABLE}},
+ {{LANE_WIDTH_NC,DSMP_DISABLE},
{LANE_WIDTH_NC,DSMP_DISABLE}}},
0x7,PHB1_MASK|PHB2_MASK},
{{{{LANE_WIDTH_8X,DSMP_ENABLE},
{LANE_WIDTH_8X,DSMP_ENABLE}},
{{LANE_WIDTH_8X,DSMP_DISABLE},
+ {LANE_WIDTH_NC,DSMP_DISABLE}},
+ {{LANE_WIDTH_NC,DSMP_DISABLE},
{LANE_WIDTH_NC,DSMP_DISABLE}}},
0x8,PHB1_MASK},
{{{{LANE_WIDTH_8X,DSMP_ENABLE},
{LANE_WIDTH_8X,DSMP_ENABLE}},
{{LANE_WIDTH_8X,DSMP_DISABLE},
+ {LANE_WIDTH_NC,DSMP_DISABLE}},
+ {{LANE_WIDTH_NC,DSMP_DISABLE},
{LANE_WIDTH_NC,DSMP_DISABLE}}},
0x9,PHB1_MASK},
{{{{LANE_WIDTH_8X,DSMP_ENABLE},
{LANE_WIDTH_8X,DSMP_DISABLE}},
{{LANE_WIDTH_8X,DSMP_ENABLE},
+ {LANE_WIDTH_NC,DSMP_DISABLE}},
+ {{LANE_WIDTH_NC,DSMP_DISABLE},
{LANE_WIDTH_NC,DSMP_DISABLE}}},
0xA,PHB2_MASK},
{{{{LANE_WIDTH_8X,DSMP_DISABLE},
{LANE_WIDTH_8X,DSMP_ENABLE}},
{{LANE_WIDTH_8X,DSMP_ENABLE},
+ {LANE_WIDTH_NC,DSMP_DISABLE}},
+ {{LANE_WIDTH_NC,DSMP_DISABLE},
{LANE_WIDTH_NC,DSMP_DISABLE}}},
0xB,PHB1_MASK},
{{{{LANE_WIDTH_8X,DSMP_ENABLE},
{LANE_WIDTH_8X,DSMP_DISABLE}},
{{LANE_WIDTH_8X,DSMP_DISABLE},
+ {LANE_WIDTH_NC,DSMP_DISABLE}},
+ {{LANE_WIDTH_NC,DSMP_DISABLE},
{LANE_WIDTH_NC,DSMP_DISABLE}}},
0xC,PHB1_MASK|PHB2_MASK},
};
@@ -1249,61 +1278,81 @@ errlHndl_t computeProcPcieConfigAttrs(
{{{{{LANE_WIDTH_16X,DSMP_DISABLE},
{LANE_WIDTH_NC,DSMP_DISABLE}},
{{LANE_WIDTH_16X,DSMP_DISABLE},
+ {LANE_WIDTH_NC,DSMP_DISABLE}},
+ {{LANE_WIDTH_NC,DSMP_DISABLE},
{LANE_WIDTH_NC,DSMP_DISABLE}}},
0x0,PHB0_MASK|PHB1_MASK},
{{{{LANE_WIDTH_16X,DSMP_DISABLE},
{LANE_WIDTH_NC,DSMP_DISABLE}},
{{LANE_WIDTH_8X,DSMP_DISABLE},
- {LANE_WIDTH_8X,DSMP_DISABLE}}},
+ {LANE_WIDTH_8X,DSMP_DISABLE}},
+ {{LANE_WIDTH_NC,DSMP_DISABLE},
+ {LANE_WIDTH_NC,DSMP_DISABLE}}},
0x1,PHB0_MASK|PHB1_MASK|PHB2_MASK},
{{{{LANE_WIDTH_8X,DSMP_DISABLE},
{LANE_WIDTH_NC,DSMP_DISABLE}},
{{LANE_WIDTH_16X,DSMP_DISABLE},
+ {LANE_WIDTH_NC,DSMP_DISABLE}},
+ {{LANE_WIDTH_NC,DSMP_DISABLE},
{LANE_WIDTH_NC,DSMP_DISABLE}}},
0x2,PHB0_MASK|PHB1_MASK},
{{{{LANE_WIDTH_8X,DSMP_DISABLE},
{LANE_WIDTH_NC,DSMP_DISABLE}},
{{LANE_WIDTH_8X,DSMP_DISABLE},
- {LANE_WIDTH_8X,DSMP_DISABLE}}},
+ {LANE_WIDTH_8X,DSMP_DISABLE}},
+ {{LANE_WIDTH_NC,DSMP_DISABLE},
+ {LANE_WIDTH_NC,DSMP_DISABLE}}},
0x3,PHB0_MASK|PHB1_MASK|PHB2_MASK},
{{{{LANE_WIDTH_8X,DSMP_DISABLE},
{LANE_WIDTH_8X,DSMP_ENABLE}},
{{LANE_WIDTH_16X,DSMP_DISABLE},
+ {LANE_WIDTH_NC,DSMP_DISABLE}},
+ {{LANE_WIDTH_NC,DSMP_DISABLE},
{LANE_WIDTH_NC,DSMP_DISABLE}}},
0x4,PHB0_MASK|PHB1_MASK},
{{{{LANE_WIDTH_8X,DSMP_DISABLE},
{LANE_WIDTH_8X,DSMP_ENABLE}},
{{LANE_WIDTH_8X,DSMP_DISABLE},
- {LANE_WIDTH_8X,DSMP_DISABLE}}},
+ {LANE_WIDTH_8X,DSMP_DISABLE}},
+ {{LANE_WIDTH_NC,DSMP_DISABLE},
+ {LANE_WIDTH_NC,DSMP_DISABLE}}},
0x5,PHB0_MASK|PHB1_MASK|PHB2_MASK},
{{{{LANE_WIDTH_8X,DSMP_ENABLE},
{LANE_WIDTH_8X,DSMP_DISABLE}},
{{LANE_WIDTH_16X,DSMP_DISABLE},
+ {LANE_WIDTH_NC,DSMP_DISABLE}},
+ {{LANE_WIDTH_NC,DSMP_DISABLE},
{LANE_WIDTH_NC,DSMP_DISABLE}}},
0x6,PHB0_MASK|PHB1_MASK},
{{{{LANE_WIDTH_8X,DSMP_ENABLE},
{LANE_WIDTH_8X,DSMP_DISABLE}},
{{LANE_WIDTH_8X,DSMP_DISABLE},
- {LANE_WIDTH_8X,DSMP_DISABLE}}},
+ {LANE_WIDTH_8X,DSMP_DISABLE}},
+ {{LANE_WIDTH_NC,DSMP_DISABLE},
+ {LANE_WIDTH_NC,DSMP_DISABLE}}},
0x7,PHB0_MASK|PHB1_MASK|PHB2_MASK},
{{{{LANE_WIDTH_8X,DSMP_ENABLE},
{LANE_WIDTH_8X,DSMP_ENABLE}},
{{LANE_WIDTH_16X,DSMP_DISABLE},
+ {LANE_WIDTH_NC,DSMP_DISABLE}},
+ {{LANE_WIDTH_NC,DSMP_DISABLE},
{LANE_WIDTH_NC,DSMP_DISABLE}}},
0x8,PHB1_MASK},
{{{{LANE_WIDTH_8X,DSMP_ENABLE},
{LANE_WIDTH_8X,DSMP_ENABLE}},
{{LANE_WIDTH_8X,DSMP_DISABLE},
- {LANE_WIDTH_8X,DSMP_DISABLE}}},
+ {LANE_WIDTH_8X,DSMP_DISABLE}},
+ {{LANE_WIDTH_NC,DSMP_DISABLE},
+ {LANE_WIDTH_NC,DSMP_DISABLE}}},
0x9,PHB1_MASK|PHB2_MASK},
};
@@ -1311,6 +1360,60 @@ errlHndl_t computeProcPcieConfigAttrs(
( sizeof(x32_laneConfigTable)
/ sizeof(x32_laneConfigTable[0]));
+ const laneConfigRow x40_laneConfigTable[] =
+ {{{{{LANE_WIDTH_16X,DSMP_DISABLE},
+ {LANE_WIDTH_NC,DSMP_DISABLE}},
+ {{LANE_WIDTH_16X,DSMP_DISABLE},
+ {LANE_WIDTH_NC,DSMP_DISABLE}},
+ {{LANE_WIDTH_8X,DSMP_DISABLE},
+ {LANE_WIDTH_NC,DSMP_DISABLE}}},
+ 0x0,PHB0_MASK|PHB1_MASK|PHB3_MASK},
+
+ {{{{LANE_WIDTH_16X,DSMP_DISABLE},
+ {LANE_WIDTH_NC,DSMP_DISABLE}},
+ {{LANE_WIDTH_8X,DSMP_DISABLE},
+ {LANE_WIDTH_8X,DSMP_DISABLE}},
+ {{LANE_WIDTH_8X,DSMP_DISABLE},
+ {LANE_WIDTH_NC,DSMP_DISABLE}}},
+ 0x1,PHB0_MASK|PHB1_MASK|PHB2_MASK|PHB3_MASK},
+
+ {{{{LANE_WIDTH_8X,DSMP_DISABLE},
+ {LANE_WIDTH_NC,DSMP_DISABLE}},
+ {{LANE_WIDTH_16X,DSMP_DISABLE},
+ {LANE_WIDTH_NC,DSMP_DISABLE}},
+ {{LANE_WIDTH_8X,DSMP_DISABLE},
+ {LANE_WIDTH_NC,DSMP_DISABLE}}},
+ 0x2,PHB0_MASK|PHB1_MASK|PHB3_MASK},
+
+ {{{{LANE_WIDTH_8X,DSMP_DISABLE},
+ {LANE_WIDTH_NC,DSMP_DISABLE}},
+ {{LANE_WIDTH_8X,DSMP_DISABLE},
+ {LANE_WIDTH_8X,DSMP_DISABLE}},
+ {{LANE_WIDTH_8X,DSMP_DISABLE},
+ {LANE_WIDTH_NC,DSMP_DISABLE}}},
+ 0x3,PHB0_MASK|PHB1_MASK|PHB2_MASK|PHB3_MASK},
+
+ {{{{LANE_WIDTH_NC,DSMP_DISABLE},
+ {LANE_WIDTH_8X,DSMP_DISABLE}},
+ {{LANE_WIDTH_16X,DSMP_DISABLE},
+ {LANE_WIDTH_NC,DSMP_DISABLE}},
+ {{LANE_WIDTH_8X,DSMP_DISABLE},
+ {LANE_WIDTH_NC,DSMP_DISABLE}}},
+ 0x6,PHB0_MASK|PHB1_MASK|PHB3_MASK},
+
+ {{{{LANE_WIDTH_NC,DSMP_DISABLE},
+ {LANE_WIDTH_8X,DSMP_DISABLE}},
+ {{LANE_WIDTH_8X,DSMP_DISABLE},
+ {LANE_WIDTH_8X,DSMP_DISABLE}},
+ {{LANE_WIDTH_8X,DSMP_DISABLE},
+ {LANE_WIDTH_NC,DSMP_DISABLE}}},
+ 0x7,PHB0_MASK|PHB1_MASK|PHB2_MASK|PHB3_MASK},
+ };
+
+ const laneConfigRow* x40_end = x40_laneConfigTable +
+ ( sizeof(x40_laneConfigTable)
+ / sizeof(x40_laneConfigTable[0]));
+
errlHndl_t pError = NULL;
const laneConfigRow* pLaneConfigTableBegin = NULL;
const laneConfigRow* pLaneConfigTableEnd = NULL;
@@ -1408,17 +1511,66 @@ errlHndl_t computeProcPcieConfigAttrs(
pLaneConfigTableBegin = x24_laneConfigTable;
pLaneConfigTableEnd = x24_end;
}
-
- // TODO:
- // RTC 109249: Support Naples with 40 lanes
-
+ else if( i_pProcChipTarget->getAttr<
+ TARGETING::ATTR_PROC_PCIE_NUM_LANES>()
+ == IOP_LANES_PER_PROC_40X)
+ {
+ // Only certain IOP lane configs are supported for 40 lanes
+ // Error out if they are selected
+ uint8_t mrwIopConfig = i_pProcChipTarget->getAttr<
+ TARGETING::ATTR_PROC_PCIE_IOP_CONFIG>();
+ for (uint8_t i=0; i<sizeof(UnsupportedLanesx40); i++)
+ {
+ if (mrwIopConfig == UnsupportedLanesx40[i])
+ {
+ TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
+ ERR_MRK "computeProcPcieConfigAttrs> Code bug!"
+ "Input IOP lane config is not supported. "
+ "IOP config = 0x%08X, HUID = 0x%08X",
+ i_pProcChipTarget->getAttr<
+ TARGETING::ATTR_PROC_PCIE_IOP_CONFIG>(),
+ i_pProcChipTarget->getAttr<TARGETING::ATTR_HUID>());
+
+ /*@
+ * @errortype
+ * @moduleid ISTEP_COMPUTE_PCIE_CONFIG_ATTRS
+ * @reasoncode ISTEP_INVALID_PCIE_IOP_LANE_CONFIG
+ * @userdata1[0:31] Target's HUID
+ * @userdata1[32:63] ATTR_PROC_PCIE_IOP_CONFIG attribute
+ * value
+ * @devdesc Illegal ATTR_PROC_PCIE_IOP_CONFIG attr
+ * read from a processor chip target.
+ * @custdesc A problem isolated to firmware or
+ * firmware customization occurred during
+ * the IPL of the system.
+ */
+ pError = new ERRORLOG::ErrlEntry(
+ ERRORLOG::ERRL_SEV_UNRECOVERABLE,
+ ISTEP_COMPUTE_PCIE_CONFIG_ATTRS,
+ ISTEP_INVALID_PCIE_IOP_LANE_CONFIG,
+ TWO_UINT32_TO_UINT64(
+ i_pProcChipTarget->getAttr<TARGETING::ATTR_HUID>(),
+ i_pProcChipTarget->getAttr<
+ TARGETING::ATTR_PROC_PCIE_IOP_CONFIG>()),
+ 0,
+ true);
+ ERRORLOG::ErrlUserDetailsTarget
+ (i_pProcChipTarget).addToLog(pError);
+ pError->collectTrace(ISTEP_COMP_NAME);
+ break;
+ }
+
+ pLaneConfigTableBegin = x40_laneConfigTable;
+ pLaneConfigTableEnd = x40_end;
+ }
+ }
else
{
TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
ERR_MRK "computeProcPcieConfigAttrs> "
"Code bug! Unsupported ATTR_PROC_PCIE_NUM_LANES attribute for "
- "processor with HUID of 0x%08X. Expected 24 or 32, but read "
- "value of %d.",
+ "processor with HUID of 0x%08X. Expected 24, 32 or 40, but "
+ "read a value of %d.",
i_pProcChipTarget->getAttr<TARGETING::ATTR_HUID>(),
i_pProcChipTarget->getAttr<
TARGETING::ATTR_PROC_PCIE_NUM_LANES>());
@@ -1506,8 +1658,12 @@ errlHndl_t computeProcPcieConfigAttrs(
TARGETING::ATTR_PROC_PCIE_IOP_SWAP_type
effectiveLaneSwap = {0};
+ // Get the actual number of IOPs for this proc
+ size_t iopsPerProc = (i_pProcChipTarget->getAttr<
+ TARGETING::ATTR_PROC_PCIE_NUM_IOP>());
+
// Apply the non-bifurcated lane swap
- for(size_t iop = 0; iop<MAX_IOPS_PER_PROC; ++iop)
+ for(size_t iop = 0; iop<iopsPerProc; ++iop)
{
uint8_t laneSwap = 0;
for(size_t laneGroup = 0;
@@ -1555,12 +1711,12 @@ errlHndl_t computeProcPcieConfigAttrs(
memcpy(
&effectiveLaneReversal[iop][0],
&laneReversalBifurcated[iop][0],
- sizeof(effectiveLaneReversal)/MAX_IOPS_PER_PROC);
+ sizeof(effectiveLaneReversal)/iopsPerProc);
memcpy(
&effectiveLaneMask[iop][0],
&laneMaskBifurcated[iop][0],
- sizeof(effectiveLaneMask)/MAX_IOPS_PER_PROC);
+ sizeof(effectiveLaneMask)/iopsPerProc);
uint8_t laneSwap = 0;
for(size_t laneGroup=0;
@@ -1601,12 +1757,14 @@ errlHndl_t computeProcPcieConfigAttrs(
{{{{LANE_WIDTH_NC,DSMP_DISABLE},
{LANE_WIDTH_NC,DSMP_DISABLE}},
{{LANE_WIDTH_NC,DSMP_DISABLE},
+ {LANE_WIDTH_NC,DSMP_DISABLE}},
+ {{LANE_WIDTH_NC,DSMP_DISABLE},
{LANE_WIDTH_NC,DSMP_DISABLE}}},
0x0,PHB_MASK_NA};
// Transform effective config to match lane config table format
for(size_t iop = 0;
- iop < MAX_IOPS_PER_PROC;
+ iop < iopsPerProc;
++iop)
{
for(size_t laneGroup = 0;
@@ -1642,7 +1800,7 @@ errlHndl_t computeProcPcieConfigAttrs(
TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
ERR_MRK "computeProcPcieConfigAttrs> "
"Code bug! Proc PCIE IOP configuration not found. Continuing "
- "with no PHBs active. "
+ "with no PHBs active. "
"IOP0 Lane set 0: Lane mask = 0x%04X, DSMP enable = 0x%02X. "
"IOP0 Lane set 1: Lane mask = 0x%04X, DSMP enable = 0x%02X. ",
effectiveLaneMask[0][0],dsmpCapable[0][0],
@@ -1653,6 +1811,11 @@ errlHndl_t computeProcPcieConfigAttrs(
effectiveLaneMask[1][0],dsmpCapable[1][0],
effectiveLaneMask[1][1],dsmpCapable[1][1]);
TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
+ "IOP2 Lane set 0: Lane mask = 0x%04X, DSMP enable = 0x%02X. "
+ "IOP2 Lane set 1: Lane mask = 0x%04X, DSMP enable = 0x%02X. ",
+ effectiveLaneMask[2][0],dsmpCapable[2][0],
+ effectiveLaneMask[2][1],dsmpCapable[2][1]);
+ TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
"Proc chip target HUID = 0x%08X.",
i_pProcChipTarget->getAttr<TARGETING::ATTR_HUID>());
/*@
@@ -1660,14 +1823,12 @@ errlHndl_t computeProcPcieConfigAttrs(
* @moduleid ISTEP_COMPUTE_PCIE_CONFIG_ATTRS
* @reasoncode ISTEP_INVALID_CONFIGURATION
* @userdata1[0:31] Target processor chip's HUID
- * @userdata1[32:39] IOP 0 lane set 0 DSMP enable
- * @userdata1[40:47] IOP 0 lane set 1 DSMP enable
- * @userdata1[48:55] IOP 1 lane set 0 DSMP enable
- * @userdata1[56:63] IOP 1 lane set 1 DSMP enable
- * @userdata2[0:15] IOP 0 lane set 0 lane mask
- * @userdata2[16:31] IOP 0 lane set 1 lane mask
- * @userdata2[32:47] IOP 1 lane set 0 lane mask
- * @userdata2[48:63] IOP 1 lane set 1 lane mask
+ * @userdata1[32:47] IOP 0 lane set 0 lane mask
+ * @userdata1[48:63] IOP 0 lane set 1 lane mask
+ * @userdata2[0:15] IOP 1 lane set 0 lane mask
+ * @userdata2[16:31] IOP 1 lane set 1 lane mask
+ * @userdata2[32:47] IOP 2 lane set 0 lane mask
+ * @userdata2[48:63] IOP 2 lane set 1 lane mask
* @devdesc No valid PCIE IOP configuration found. All
* PHBs on the processor will be disabled.
* @custdesc A problem isolated to firmware or firmware
@@ -1680,16 +1841,14 @@ errlHndl_t computeProcPcieConfigAttrs(
ISTEP_INVALID_CONFIGURATION,
TWO_UINT32_TO_UINT64(
i_pProcChipTarget->getAttr<TARGETING::ATTR_HUID>(),
- FOUR_UINT8_TO_UINT32(
- dsmpCapable[0][0],
- dsmpCapable[0][1],
- dsmpCapable[1][0],
- dsmpCapable[1][1])),
+ TWO_UINT16_TO_UINT32(
+ effectiveLaneMask[0][0],
+ effectiveLaneMask[0][1])),
FOUR_UINT16_TO_UINT64(
- effectiveLaneMask[0][0],
- effectiveLaneMask[0][1],
effectiveLaneMask[1][0],
- effectiveLaneMask[1][1]),
+ effectiveLaneMask[1][1],
+ effectiveLaneMask[2][0],
+ effectiveLaneMask[2][1]),
true);
ERRORLOG::ErrlUserDetailsTarget(i_pProcChipTarget).addToLog(pError);
pError->collectTrace(ISTEP_COMP_NAME);
diff --git a/src/usr/hwpf/hwp/nest_chiplets/nest_chiplets.H b/src/usr/hwpf/hwp/nest_chiplets/nest_chiplets.H
index 7907ae321..01246b53e 100644
--- a/src/usr/hwpf/hwp/nest_chiplets/nest_chiplets.H
+++ b/src/usr/hwpf/hwp/nest_chiplets/nest_chiplets.H
@@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* Contributors Listed Below - COPYRIGHT 2012,2014 */
+/* Contributors Listed Below - COPYRIGHT 2012,2015 */
/* [+] International Business Machines Corp. */
/* */
/* */
@@ -97,7 +97,7 @@
* @target_sched serial
* @}
*
- */
+ */
/******************************************************************************/
// Includes
@@ -123,7 +123,8 @@ typedef std::list<uint32_t> BifurcatedIopsContainer;
enum IopLanesPerProc
{
IOP_LANES_PER_PROC_24X = 24,// 24 Lanes per proc
- IOP_LANES_PER_PROC_32X = 32 // 32 Lanes per proc
+ IOP_LANES_PER_PROC_32X = 32,// 32 Lanes per proc
+ IOP_LANES_PER_PROC_40X = 40,// 40 Lanes per proc
};
/**
@@ -136,10 +137,10 @@ struct LaneSet
};
/**
- * @brief Max possible IOPs per processor; invarient across all POWER8
- * processors
+ * @brief Max possible IOPs per processor; P8+ has 3
+ * P8 has 2
*/
-static const size_t MAX_IOPS_PER_PROC = 2;
+static const size_t MAX_IOPS_PER_PROC = 3;
/**
* @brief Lane groups per IOP; invarient across all POWER8 processors
@@ -161,7 +162,8 @@ struct laneConfigRow
// PHB active mask (see PhbActiveMask enum)
// PHB0 = 0x80
// PHB1 = 0x40
- // PHB1 = 0x20
+ // PHB2 = 0x20
+ // PHB3 = 0x10
uint8_t phbActive;
};
@@ -203,9 +205,15 @@ enum PhbActiveMask
PHB0_MASK = 0x80, ///< PHB0 enabled
PHB1_MASK = 0x40, ///< PHB1 enabled
PHB2_MASK = 0x20, ///< PHB2 enabled
+ PHB3_MASK = 0x10, ///< PHB3 enabled
};
/**
+ * @brief Array of unsupported lanes configs for x40 lanes
+ */
+uint8_t UnsupportedLanesx40[] = {0x4,0x5,0x8,0x9,0xA,0xB,0xC};
+
+/**
* @brief call_proc_attr_update
*
* Stub to enable platforms to override attributes
diff --git a/src/usr/hwpf/plat/fapiPlatAttributeService.C b/src/usr/hwpf/plat/fapiPlatAttributeService.C
index 5c2bf00f6..9f2e85714 100644
--- a/src/usr/hwpf/plat/fapiPlatAttributeService.C
+++ b/src/usr/hwpf/plat/fapiPlatAttributeService.C
@@ -60,6 +60,7 @@
#include <hwpf/hwp/tp_dbg_data_accessors/getTpDbgDataAttr.H>
#include <fapiAttributeIds.H>
#include <hwas/common/hwasCommon.H>
+#include <proc_setup_bars_defs.H>
// The following file checks at compile time that all HWPF attributes are
// handled by Hostboot. This is done to ensure that the HTML file listing
@@ -949,7 +950,7 @@ fapi::ReturnCode fapiPlatGetProcPcieBarEnable (
// BAR # 0 are the PCIE Mem 64
// BAR # 1 are the PCIE Mem 32
// BAR # 2 are the PHB REGS
- for( uint8_t u=0; u<3; u++ )
+ for( uint8_t u=0; u< PROC_SETUP_BARS_PCIE_NUM_UNITS; u++ )
{
if( phyp_mode )
{
@@ -1030,7 +1031,7 @@ fapi::ReturnCode fapiPlatGetProcPcieBarBaseAddr (
//We will change the base addr down 4 bits, but need to keep
//the proc/node offsets the same
- for ( uint8_t u=0; u < 3; u++ )
+ for ( uint8_t u=0; u < PROC_SETUP_BARS_PCIE_NUM_UNITS; u++ )
{
if(TARGETING::is_sapphire_load())
{
@@ -1077,7 +1078,7 @@ fapi::ReturnCode fapiPlatGetProcPcieBarSize (
{
// NOTE: supported BAR0/1 sizes are from 64KB-1PB
// NOTE: only supported BAR2 size is 4KB
- for ( uint8_t u=0; u < 3; u++ )
+ for ( uint8_t u=0; u < PROC_SETUP_BARS_PCIE_NUM_UNITS; u++ )
{
o_pcieBarSize[u][0] = PCIE_BAR0_SIZE ;
o_pcieBarSize[u][1] = PCIE_BAR1_SIZE ;
diff --git a/src/usr/hwpf/plat/plat.mk b/src/usr/hwpf/plat/plat.mk
index 4a6e3e098..063796055 100644
--- a/src/usr/hwpf/plat/plat.mk
+++ b/src/usr/hwpf/plat/plat.mk
@@ -5,7 +5,7 @@
#
# OpenPOWER HostBoot Project
#
-# Contributors Listed Below - COPYRIGHT 2014
+# Contributors Listed Below - COPYRIGHT 2014,2015
# [+] International Business Machines Corp.
#
#
@@ -29,6 +29,7 @@ EXTRAINCDIR += ${ROOTPATH}/src/include/usr/hwpf/fapi
EXTRAINCDIR += ${ROOTPATH}/src/include/usr/hwpf/hwp
EXTRAINCDIR += ${ROOTPATH}/src/usr/hwpf/hwp/include
EXTRAINCDIR += ${ROOTPATH}/src/usr/hwpf/hwp/pstates/pstates
+EXTRAINCDIR += ${ROOTPATH}/src/usr/hwpf/hwp/dram_initialization/proc_setup_bars
OBJS += fapiPlatHwAccess.o
OBJS += fapiPlatHwpInvoker.o
diff --git a/src/usr/targeting/common/xmltohb/attribute_types.xml b/src/usr/targeting/common/xmltohb/attribute_types.xml
index 833f27821..bd2f53d36 100644
--- a/src/usr/targeting/common/xmltohb/attribute_types.xml
+++ b/src/usr/targeting/common/xmltohb/attribute_types.xml
@@ -14792,7 +14792,7 @@ firmware notes: Platforms should initialize this attribute to AUTO (0)</descript
<simpleType>
<uint16_t>
</uint16_t>
- <array>2,2</array>
+ <array>3,2</array>
</simpleType>
<persistency>non-volatile</persistency>
<readable/>
@@ -14813,7 +14813,7 @@ firmware notes: Platforms should initialize this attribute to AUTO (0)</descript
<simpleType>
<uint8_t>
</uint8_t>
- <array>2,2</array>
+ <array>3,2</array>
</simpleType>
<persistency>non-volatile</persistency>
<readable/>
@@ -14836,7 +14836,7 @@ firmware notes: Platforms should initialize this attribute to AUTO (0)</descript
<simpleType>
<uint8_t>
</uint8_t>
- <array>2,2</array>
+ <array>3,2</array>
</simpleType>
<persistency>non-volatile</persistency>
<readable/>
@@ -14858,7 +14858,7 @@ firmware notes: Platforms should initialize this attribute to AUTO (0)</descript
<simpleType>
<uint8_t>
</uint8_t>
- <array>2,2</array>
+ <array>3,2</array>
</simpleType>
<persistency>non-volatile</persistency>
<readable/>
@@ -14880,7 +14880,7 @@ firmware notes: Platforms should initialize this attribute to AUTO (0)</descript
</description>
<simpleType>
<uint8_t></uint8_t>
- <array>2,2</array>
+ <array>3,2</array>
</simpleType>
<persistency>non-volatile</persistency>
<readable/>
@@ -14904,7 +14904,7 @@ firmware notes: Platforms should initialize this attribute to AUTO (0)</descript
<simpleType>
<uint16_t>
</uint16_t>
- <array>2,2</array>
+ <array>3,2</array>
</simpleType>
<persistency>non-volatile</persistency>
<readable/>
@@ -14925,7 +14925,7 @@ firmware notes: Platforms should initialize this attribute to AUTO (0)</descript
<simpleType>
<uint8_t>
</uint8_t>
- <array>2,2</array>
+ <array>3,2</array>
</simpleType>
<persistency>non-volatile</persistency>
<readable/>
@@ -14947,7 +14947,7 @@ firmware notes: Platforms should initialize this attribute to AUTO (0)</descript
</description>
<simpleType>
<uint8_t></uint8_t>
- <array>2,2</array>
+ <array>3,2</array>
</simpleType>
<persistency>non-volatile</persistency>
<readable/>
@@ -14969,7 +14969,7 @@ firmware notes: Platforms should initialize this attribute to AUTO (0)</descript
<simpleType>
<uint16_t>
</uint16_t>
- <array>2,2</array>
+ <array>3,2</array>
</simpleType>
<persistency>non-volatile</persistency>
<readable/>
@@ -15015,7 +15015,7 @@ firmware notes: Platforms should initialize this attribute to AUTO (0)</descript
<simpleType>
<uint8_t>
</uint8_t>
- <array>2,2</array>
+ <array>3,2</array>
</simpleType>
<persistency>non-volatile</persistency>
<readable/>
OpenPOWER on IntegriCloud