summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rwxr-xr-xsrc/build/tools/listdeps.pl1
-rw-r--r--src/include/usr/isteps/istep09list.H1
-rw-r--r--src/include/usr/secureboot/secure_reasoncodes.H2
-rw-r--r--src/usr/secureboot/node_comm/node_comm.H21
-rw-r--r--src/usr/secureboot/node_comm/node_comm_dd.C156
-rw-r--r--src/usr/secureboot/node_comm/node_comm_dd.H11
-rw-r--r--src/usr/secureboot/node_comm/node_comm_test.C2
-rwxr-xr-xsrc/usr/targeting/common/xmltohb/attribute_types_hb.xml26
-rw-r--r--src/usr/targeting/common/xmltohb/target_types_hb.xml2
9 files changed, 203 insertions, 19 deletions
diff --git a/src/build/tools/listdeps.pl b/src/build/tools/listdeps.pl
index 3561bb2f5..6628c9fba 100755
--- a/src/build/tools/listdeps.pl
+++ b/src/build/tools/listdeps.pl
@@ -224,6 +224,7 @@ my $resident_modules = {
"libsecureboot_base.so" => '1',
"libscom.so" => '1',
"libxscom.so" => '1',
+ "libnode_comm.so" => '1',
};
# A list of the dependent libraries in each istep.
diff --git a/src/include/usr/isteps/istep09list.H b/src/include/usr/isteps/istep09list.H
index 6917499af..4adcc0810 100644
--- a/src/include/usr/isteps/istep09list.H
+++ b/src/include/usr/isteps/istep09list.H
@@ -232,7 +232,6 @@ const DepModInfo g_istep09Dependancies = {
DEP_LIB(libnestmemutils.so),
DEP_LIB(libfab_iovalid.so),
DEP_LIB(libimageprocs.so),
- DEP_LIB(libnode_comm.so),
NULL
}
};
diff --git a/src/include/usr/secureboot/secure_reasoncodes.H b/src/include/usr/secureboot/secure_reasoncodes.H
index 4dd2cddbb..c584ed107 100644
--- a/src/include/usr/secureboot/secure_reasoncodes.H
+++ b/src/include/usr/secureboot/secure_reasoncodes.H
@@ -55,6 +55,7 @@ namespace SECUREBOOT
MOD_NC_XBUS_TEST = 0x22,
MOD_NC_MAP_ATTN = 0x23,
MOD_NCDD_PERFORM_OP = 0x24,
+ MOD_NCDD_WRITE = 0x25,
};
enum SECUREReasonCode
@@ -87,6 +88,7 @@ namespace SECUREBOOT
RC_NC_NO_ATTN_FOUND = SECURE_COMP_ID | 0x23,
RC_NC_TOO_MANY_ATTNS_FOUND = SECURE_COMP_ID | 0x24,
RC_NCDD_INVALID_ARGS = SECURE_COMP_ID | 0x25,
+ RC_NCDD_DATA_NOT_SENT = SECURE_COMP_ID | 0x26,
// Reason codes 0xA0 - 0xEF reserved for trustedboot_reasoncodes.H
};
diff --git a/src/usr/secureboot/node_comm/node_comm.H b/src/usr/secureboot/node_comm/node_comm.H
index 4e8cc97a6..48dbf5892 100644
--- a/src/usr/secureboot/node_comm/node_comm.H
+++ b/src/usr/secureboot/node_comm/node_comm.H
@@ -40,7 +40,7 @@
extern trace_desc_t* g_trac_nc;
// Easy macro replace for unit testing - TRACD vs TRACF
-#define TRACUCOMP(args...) TRACFCOMP(args)
+#define TRACUCOMP(args...) TRACDCOMP(args)
namespace SECUREBOOT
{
@@ -69,6 +69,9 @@ enum node_comm_registers_t : uint64_t
// XBUS values are default values
// NCDD_ABUS_REG_OFFSET added if in ABUS mode
NCDD_REG_FIR = 0x5013400,
+ NCDD_REG_FIR_WOX_AND = 0x5013401,
+ NCDD_REG_FIR_WOX_OR = 0x5013402,
+
NCDD_REG_CTRL = 0x501342E,
NCDD_REG_DATA = 0x501342F,
@@ -133,6 +136,22 @@ enum node_comm_fir_reg_helpers_t : uint64_t
NCDD_START_OF_ATTN_BITS = 0x0000000008000000,
};
+
+/**
+ * @brief Calculate Link Mailbox FIR Register Attention Bit Mask
+ * based on linkId and mboxId
+ *
+ * @param[in] i_linkId - Link Id of the operation
+ * @param[in] i_mboxId - Mailbox Id of the operation
+ *
+ * @return uint64_t - Calculated FIR Register Attention Bit Mask
+ */
+inline uint64_t getLinkMboxFirAttnBit(uint8_t i_linkId, uint8_t i_mboxId)
+{
+ return (NCDD_START_OF_ATTN_BITS >> ((2*i_linkId) + i_mboxId));
+}
+
+
/**
* @brief Map Attention Bits in XBUS/ABUS FIR Register to specific Link Mailbox
*
diff --git a/src/usr/secureboot/node_comm/node_comm_dd.C b/src/usr/secureboot/node_comm/node_comm_dd.C
index f2eac3572..def2af449 100644
--- a/src/usr/secureboot/node_comm/node_comm_dd.C
+++ b/src/usr/secureboot/node_comm/node_comm_dd.C
@@ -89,6 +89,7 @@ errlHndl_t nodeCommPerformOp( DeviceFW::OperationType i_opType,
va_list i_args )
{
errlHndl_t err = nullptr;
+ bool unlock_mutex = false;
node_comm_args_t node_comm_args;
uint64_t mode = va_arg( i_args, uint64_t );
@@ -160,7 +161,12 @@ errlHndl_t nodeCommPerformOp( DeviceFW::OperationType i_opType,
node_comm_args.mboxId, (*node_comm_args.data_ptr));
// Mutex Lock
- // @TODO RTC:191008 Support mutex
+ (mode==NCDD_MODE_ABUS)
+ ? mutex_lock(node_comm_args.tgt->
+ getHbMutexAttr<TARGETING::ATTR_HB_NODE_COMM_ABUS_MUTEX>())
+ : mutex_lock(node_comm_args.tgt->
+ getHbMutexAttr<TARGETING::ATTR_HB_NODE_COMM_XBUS_MUTEX>());
+ unlock_mutex = true;
/***********************************************/
/* Node Comm Read */
@@ -190,9 +196,6 @@ errlHndl_t nodeCommPerformOp( DeviceFW::OperationType i_opType,
}
while (0);
- // Mutex Unlock
- // @TODO RTC:191008 Support mutex
-
// If err, add trace and FFDC to log
if (err)
{
@@ -214,6 +217,17 @@ errlHndl_t nodeCommPerformOp( DeviceFW::OperationType i_opType,
}
}
+ // Mutex unlock
+ if (unlock_mutex == true)
+ {
+ (mode==NCDD_MODE_ABUS)
+ ? mutex_unlock(node_comm_args.tgt->
+ getHbMutexAttr<TARGETING::ATTR_HB_NODE_COMM_ABUS_MUTEX>())
+ : mutex_unlock(node_comm_args.tgt->
+ getHbMutexAttr<TARGETING::ATTR_HB_NODE_COMM_XBUS_MUTEX>());
+ }
+
+
TRACFCOMP (g_trac_nc, EXIT_MRK"nodeCommPerformOp: %s: %s: "
"tgt=0x%X, LinkId=%d, MboxId=%d, data=0x%.16llX. "
TRACE_ERR_FMT,
@@ -255,6 +269,58 @@ errlHndl_t ncddRead(node_comm_args_t & i_args)
break;
}
+ // Since Read above was successful, clear the data register
+ uint64_t clear_data = 0x0;
+ err = ncddRegisterOp( DeviceFW::WRITE,
+ &clear_data,
+ link_mbox_reg,
+ i_args );
+
+ if(err)
+ {
+ TRACFCOMP(g_trac_nc,ERR_MRK"ncddRead: SCOM deviceWrite call "
+ "failed for Target HUID 0x%08X and address 0x%016llX. "
+ TRACE_ERR_FMT,
+ i_args.tgt_huid,
+ link_mbox_reg,
+ TRACE_ERR_ARGS(err));
+ break;
+ }
+
+
+ // Since Read above was successful, clear the FIR bit
+ uint64_t fir_attn_bit = getLinkMboxFirAttnBit(i_args.linkId, i_args.mboxId);
+
+ // Invert the fir bit and WOX_AND it into the register
+ uint64_t clear_fir_bit = ~fir_attn_bit;
+
+ uint64_t reg_addr = getLinkMboxRegAddr(NCDD_REG_FIR_WOX_AND, i_args.mode);
+
+ TRACUCOMP(g_trac_nc,"ncddRead: Clearing FIR bit 0x%.16llX based on "
+ "linkId=%d, mboxId=%d, mode=%s, by writing 0x%.16llX to FIR Reg "
+ "Addr 0x%.16llX on Target 0x%X",
+ fir_attn_bit, i_args.linkId, i_args.mboxId,
+ (i_args.mode == NCDD_MODE_ABUS)
+ ? NCDD_ABUS_STRING : NCDD_XBUS_STRING,
+ clear_fir_bit, reg_addr, i_args.tgt_huid);
+
+ err = ncddRegisterOp( DeviceFW::WRITE,
+ &clear_fir_bit,
+ NCDD_REG_FIR_WOX_AND,
+ i_args );
+
+ if(err)
+ {
+ TRACFCOMP(g_trac_nc,ERR_MRK"ncddRead: SCOM deviceWrite call "
+ "failed for Target HUID 0x%08X and address 0x%016llX. "
+ TRACE_ERR_FMT,
+ i_args.tgt_huid,
+ link_mbox_reg,
+ TRACE_ERR_ARGS(err));
+ break;
+ }
+
+
} while( 0 );
TRACUCOMP( g_trac_nc,EXIT_MRK"ncddRead: "
@@ -299,7 +365,7 @@ errlHndl_t ncddWrite (node_comm_args_t & i_args)
ctrl_reg_cmd.link_id = i_args.linkId;
- err = ncddRegisterOp( DeviceFW::WRITE,
+ err = ncddRegisterOp( DeviceFW::WRITE,
&ctrl_reg_cmd.value,
NCDD_REG_CTRL,
i_args );
@@ -316,7 +382,8 @@ errlHndl_t ncddWrite (node_comm_args_t & i_args)
}
// Wait for command to be complete
- err = ncddWaitForCmdComp(i_args);
+ ctrl_reg_cmd.value = 0;
+ err = ncddWaitForCmdComp(i_args, ctrl_reg_cmd);
if(err)
{
TRACFCOMP(g_trac_nc,ERR_MRK"ncddWrite: Wait For Cmd Complete "
@@ -327,8 +394,43 @@ errlHndl_t ncddWrite (node_comm_args_t & i_args)
break;
}
- // @TODO RTC 191008 - have ncddWaitForCmdComp return status to
- // check for 'write' bit being set
+ // Check for 'sent' bit being set
+ if (ctrl_reg_cmd.sent != 1)
+ {
+ TRACFCOMP( g_trac_nc,
+ ERR_MRK"ncddWrite: 'Sent' bit not set in status reg: "
+ "0x%.16llX (Target 0x%X)",
+ ctrl_reg_cmd.value, i_args.tgt_huid );
+
+ /*@
+ * @errortype
+ * @reasoncode RC_NCDD_DATA_NOT_SENT
+ * @moduleid MOD_NCDD_WRITE
+ * @userdata1 Status Register Value
+ * @userdata2 Target HUID
+ * @devdesc Sent bit not set in Node Comm status/ctrl register
+ * @custdesc Secure Boot failure
+ */
+ err = new ERRORLOG::ErrlEntry( ERRORLOG::ERRL_SEV_UNRECOVERABLE,
+ MOD_NCDD_WRITE,
+ RC_NCDD_DATA_NOT_SENT,
+ ctrl_reg_cmd.value,
+ i_args.tgt_huid);
+
+ // Likely an issue with Processor or its bus
+ err->addHwCallout( i_args.tgt,
+ HWAS::SRCI_PRIORITY_HIGH,
+ HWAS::DELAYED_DECONFIG,
+ HWAS::GARD_NULL );
+
+ // Or HB code failed to do the procedure correctly
+ err->addProcedureCallout(HWAS::EPUB_PRC_HB_CODE,
+ HWAS::SRCI_PRIORITY_MED);
+
+ // @TODO RTC 184518 - Look into bus callouts
+
+ break;
+ }
} while( 0 );
@@ -342,7 +444,7 @@ errlHndl_t ncddWrite (node_comm_args_t & i_args)
errlHndl_t ncddCheckStatus (node_comm_args_t & i_args,
- const ctrl_reg_t i_statusVal )
+ const ctrl_reg_t & i_statusVal )
{
errlHndl_t err = nullptr;
bool errorFound = false;
@@ -436,14 +538,14 @@ errlHndl_t ncddCheckStatus (node_comm_args_t & i_args,
} // end ncddCheckStatus
-errlHndl_t ncddWaitForCmdComp (node_comm_args_t & i_args)
+errlHndl_t ncddWaitForCmdComp (node_comm_args_t & i_args,
+ ctrl_reg_t & o_statusVal )
{
errlHndl_t err = nullptr;
uint64_t interval_ns = NODE_COMM_POLL_DELAY_NS;
int timeout_ns = NODE_COMM_POLL_DELAY_TOTAL_NS;
ctrl_reg_t ctrl_reg_status;
-
TRACUCOMP(g_trac_nc, "ncddWaitForCmdComp(): timeout_ns=%d, "
"interval_ns=%d", timeout_ns, interval_ns);
@@ -537,6 +639,8 @@ errlHndl_t ncddWaitForCmdComp (node_comm_args_t & i_args)
} while (0);
+ o_statusVal = ctrl_reg_status;
+
TRACUCOMP( g_trac_nc,EXIT_MRK"ncddWaitForCmdComp: "
TRACE_ERR_FMT,
TRACE_ERR_ARGS(err));
@@ -553,9 +657,37 @@ void ncddHandleError( errlHndl_t & io_err,
TRACE_ERR_FMT,
TRACE_ERR_ARGS(io_err));
+ errlHndl_t l_err = nullptr;
+
do
{
-// @TODO RTC:191008 Implement simple reset functionality
+ // On a fail issue a cmd to the control reg with just the 'reset' bit set
+ ctrl_reg_t ctrl_reg_cmd;
+ ctrl_reg_cmd.value = 0x0;
+ ctrl_reg_cmd.reset = 1;
+
+
+ l_err = ncddRegisterOp( DeviceFW::WRITE,
+ &ctrl_reg_cmd.value,
+ NCDD_REG_CTRL,
+ i_args );
+
+ if(l_err)
+ {
+ TRACFCOMP(g_trac_nc,ERR_MRK"ncddHandleError: SCOM deviceWrite call "
+ "failed for Target HUID 0x%08X and address 0x%016llX: "
+ TRACE_ERR_FMT
+ " . Committing after chaining to existing error: "
+ TRACE_ERR_FMT,
+ i_args.tgt_huid,
+ NCDD_REG_CTRL,
+ TRACE_ERR_ARGS(l_err),
+ TRACE_ERR_ARGS(io_err));
+
+ l_err->plid(io_err->plid());
+ errlCommit( l_err, SECURE_COMP_ID );
+ break;
+ }
} while (0);
diff --git a/src/usr/secureboot/node_comm/node_comm_dd.H b/src/usr/secureboot/node_comm/node_comm_dd.H
index 10b6be99e..212ab24df 100644
--- a/src/usr/secureboot/node_comm/node_comm_dd.H
+++ b/src/usr/secureboot/node_comm/node_comm_dd.H
@@ -155,13 +155,13 @@ errlHndl_t ncddWrite (node_comm_args_t & i_args);
* @param[in] i_args - Structure containing arguments needed for a command
* transaction.
*
- * @param[in] i_statusVal - Control Register value to be checked
+ * @param[in] i_statusVal - Control/Status Register value to be checked
*
* @return errlHndl_t - nullptr if successful and the command is complete;
* otherwise a pointer to the error log.
*/
-errlHndl_t ncddCheckForErrors (node_comm_args_t & i_args,
- ctrl_reg_t i_statusVal );
+errlHndl_t ncddCheckStatus (node_comm_args_t & i_args,
+ const ctrl_reg_t & i_statusVal );
/**
* @brief Waits for the operation to complete or timeout while
@@ -170,10 +170,13 @@ errlHndl_t ncddCheckForErrors (node_comm_args_t & i_args,
* @param[in] i_args - Structure containing arguments needed for a command
* transaction.
*
+ * @param[in] o_statusVal - Last Control/Status Register value that was checked
+ *
* @return errlHndl_t - nullptr if successful and the command is complete;
* otherwise a pointer to the error log.
*/
-errlHndl_t ncddWaitForCmdComp (node_comm_args_t & i_args);
+errlHndl_t ncddWaitForCmdComp (node_comm_args_t & i_args,
+ ctrl_reg_t & o_statusVal);
/**
* @brief Analyzes an error handle object and performs any
diff --git a/src/usr/secureboot/node_comm/node_comm_test.C b/src/usr/secureboot/node_comm/node_comm_test.C
index 3c9842138..cd2a931c9 100644
--- a/src/usr/secureboot/node_comm/node_comm_test.C
+++ b/src/usr/secureboot/node_comm/node_comm_test.C
@@ -198,7 +198,7 @@ errlHndl_t nodeCommXbus2ProcTest(void)
// 3) Read message on proc with Link Mailbox found above
- TRACFCOMP(g_trac_nc,"nodeCommXbus2ProcTest: Attention Found on"
+ TRACFCOMP(g_trac_nc,"nodeCommXbus2ProcTest: Attention Found on "
"proc=0x%X for L%d/M%d ",
TARGETING::get_huid(read_tgt), linkId, mboxId);
diff --git a/src/usr/targeting/common/xmltohb/attribute_types_hb.xml b/src/usr/targeting/common/xmltohb/attribute_types_hb.xml
index cdf325fb8..7d4b64e1c 100755
--- a/src/usr/targeting/common/xmltohb/attribute_types_hb.xml
+++ b/src/usr/targeting/common/xmltohb/attribute_types_hb.xml
@@ -1155,4 +1155,30 @@
<writeable />
</attribute>
+<attribute>
+ <id>HB_NODE_COMM_XBUS_MUTEX</id>
+ <description>Mutex to guard Node Comm XBUS register access</description>
+ <simpleType>
+ <hbmutex>
+ </hbmutex>
+ </simpleType>
+ <persistency>volatile-zeroed</persistency>
+ <readable/>
+ <writeable/>
+ <hbOnly/>
+</attribute>
+
+<attribute>
+ <id>HB_NODE_COMM_ABUS_MUTEX</id>
+ <description>Mutex to guard Node Comm ABUS register access</description>
+ <simpleType>
+ <hbmutex>
+ </hbmutex>
+ </simpleType>
+ <persistency>volatile-zeroed</persistency>
+ <readable/>
+ <writeable/>
+ <hbOnly/>
+</attribute>
+
</attributes>
diff --git a/src/usr/targeting/common/xmltohb/target_types_hb.xml b/src/usr/targeting/common/xmltohb/target_types_hb.xml
index d7d9569b5..6ef511abd 100644
--- a/src/usr/targeting/common/xmltohb/target_types_hb.xml
+++ b/src/usr/targeting/common/xmltohb/target_types_hb.xml
@@ -142,6 +142,8 @@
<id>XSCOM_VIRTUAL_ADDR</id>
</attribute>
<attribute><id>HB_TARGET_SCOMABLE</id></attribute>
+ <attribute><id>HB_NODE_COMM_XBUS_MUTEX</id></attribute>
+ <attribute><id>HB_NODE_COMM_ABUS_MUTEX</id></attribute>
</targetTypeExtension>
<!-- Centaur chip/DMI -->
OpenPOWER on IntegriCloud