summaryrefslogtreecommitdiffstats
path: root/src/occ_405/proc/test/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/occ_405/proc/test/main.c')
-rwxr-xr-xsrc/occ_405/proc/test/main.c352
1 files changed, 352 insertions, 0 deletions
diff --git a/src/occ_405/proc/test/main.c b/src/occ_405/proc/test/main.c
new file mode 100755
index 0000000..314d87d
--- /dev/null
+++ b/src/occ_405/proc/test/main.c
@@ -0,0 +1,352 @@
+/* IBM_PROLOG_BEGIN_TAG */
+/* This is an automatically generated prolog. */
+/* */
+/* $Source: src/occ_405/proc/test/main.c $ */
+/* */
+/* OpenPOWER OnChipController Project */
+/* */
+/* Contributors Listed Below - COPYRIGHT 2011,2015 */
+/* [+] International Business Machines Corp. */
+/* */
+/* */
+/* Licensed under the Apache License, Version 2.0 (the "License"); */
+/* you may not use this file except in compliance with the License. */
+/* You may obtain a copy of the License at */
+/* */
+/* http://www.apache.org/licenses/LICENSE-2.0 */
+/* */
+/* Unless required by applicable law or agreed to in writing, software */
+/* distributed under the License is distributed on an "AS IS" BASIS, */
+/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or */
+/* implied. See the License for the specific language governing */
+/* permissions and limitations under the License. */
+/* */
+/* IBM_PROLOG_END_TAG */
+
+
+#include "ssx.h"
+#include "ssx_io.h"
+#include "simics_stdio.h"
+#include <thread.h>
+#include <threadSch.h>
+#include <errl.h>
+#include <apss.h>
+#include <appletManager.h>
+#include <trac.h>
+#include <occ_service_codes.h>
+#include <occ_sys_config.h>
+#include <proc_data.h>
+#include <timer.h>
+#include <dcom.h>
+#include <rtls.h>
+
+extern void __ssx_boot;
+
+IMAGE_HEADER (G_mainAppImageHdr,__ssx_boot,MAIN_APP_ID,OCC_APLT_TEST);
+
+// Period in which to run #timer_routine
+#define TIMER_INTERVAL (SsxInterval) SSX_MICROSECONDS(5000)
+
+int g_j = 0;
+int g_k = 0;
+
+SimicsStdio simics_stdout;
+SimicsStdio simics_stderr;
+
+uint8_t noncritical_stack[NONCRITICAL_STACK_SIZE];
+uint8_t critical_stack[CRITICAL_STACK_SIZE];
+
+// Function Specification
+//
+// Name: pgp_validation_ssx_main_hook
+//
+// Description:
+//
+// End Function Specification
+void pgp_validation_ssx_main_hook(void)
+{
+
+}
+
+// Function Specification
+//
+// Name: Cmd_Hndl_thread_routine
+//
+// Description:
+//
+// End Function Specification
+void Cmd_Hndl_thread_routine(void *arg)
+{
+ TRAC_INFO("Command Handler Thread Started ... " );
+}
+
+// Function Specification
+//
+// Name: Thermal_Monitor_thread_routine
+//
+// Description:
+//
+// End Function Specification
+void Thermal_Monitor_thread_routine(void *arg)
+{
+ TRAC_INFO("Thermal Monitor Thread Started ... " );
+}
+
+// Function Specification
+//
+// Name: Hlth_Monitor_thread_routine
+//
+// Description:
+//
+// End Function Specification
+void Hlth_Monitor_thread_routine(void *arg)
+{
+ TRAC_INFO("Health Monitor Thread Started ... " );
+}
+
+// Function Specification
+//
+// Name: FFDC_thread_routine
+//
+// Description:
+//
+// End Function Specification
+void FFDC_thread_routine(void *arg)
+{
+ TRAC_INFO("FFDC Thread Started ... " );
+}
+
+// Function Specification
+//
+// Name: get_core_info
+//
+// Description:
+//
+// End Function Specification
+void get_core_info()
+{
+ //uintt64_t l_deconfigured_cores;
+ uint32_t l_deconfigured_cores;
+ uint32_t l_configured_cores;
+
+ //rc = _getscom( PMC_CORE_DECONFIGURATION_REG, &l_deconfigured_cores, SCOM_TIMEOUT );
+
+ l_deconfigured_cores = in32(PMC_CORE_DECONFIGURATION_REG);
+ PROC_DEBUG( "Deconfigured cores in the chip [0x%x]\n", l_deconfigured_cores);
+
+
+ l_configured_cores = ~l_deconfigured_cores & ALL_CORES_MASK;
+ PROC_DEBUG( "Configured cores in the chip [0x%x]\n", l_configured_cores);
+
+ return;
+}
+
+// Function Specification
+//
+// Name: main_thread_routine
+//
+// Description: This thread currently just loops as the lowest priority thread, handling
+// the lowest priority tasks.
+//
+// End Function Specification
+void main_thread_routine(void *private)
+{
+
+ TRAC_INFO("Main Thread Started ... " );
+ errlHndl_t l_errl = NULL;
+ SsxSemaphore l_appletComplete;
+ uint8_t l_status = 0;
+ uint32_t l_rc = 0 ;
+ int l_ssxrc = 0;
+
+ // Start the critical 250uS timer
+ //ssx_timer_schedule(&timer, 1, TIMER_INTERVAL);
+
+ // Initialize applet semaphore
+ l_ssxrc = ssx_semaphore_create(&l_appletComplete, 0, 1);
+
+ // Initialize APSS
+#ifdef OCC_ALONE_SIMICS
+ l_rc = runApplet(OCC_APLT_APSS_INIT, // Applet enum Name
+ NULL, // Applet arguments
+ TRUE, // Blocking call?
+ &l_appletComplete, // Applet finished semaphore
+ &l_errl, // error log handle
+ &l_status); // status from applet manager
+#endif
+ if( NULL != l_errl )
+ {
+ TRAC_ERR("APSS Init failed! (retrying) ErrLog[%p]", l_errl );
+ setErrlSevToInfo(l_errl);
+ // commit & delete
+ commitErrl( &l_errl );
+
+ l_rc = runApplet(OCC_APLT_APSS_INIT, // Applet enum Name
+ NULL, // Applet arguments
+ TRUE, // Blocking call?
+ &l_appletComplete, // Applet finished semaphore
+ &l_errl, // error log handle
+ &l_status); // status from applet manager
+ if( NULL != l_errl )
+ {
+ TRAC_ERR("APSS Init failed again! (OCC will be reset)ErrLog[%p]",
+ l_errl );
+
+ // commit & delete
+ commitErrl( &l_errl );
+
+ //$TODO: Request OCC Reset
+ }
+ }
+
+ while(1)
+ {
+ // Only trace the first XX times that this function loops
+ if(g_k < 3)
+ {
+ g_k++;
+
+ }
+
+ // Sleep for 1000 before we run the loop again
+ ssx_sleep(SSX_SECONDS(5));
+ }
+}
+
+
+// Function Specification
+//
+// Name: main
+//
+// Description: Entry point for OCC execution
+// Currently initalizes our trace buffer along with creating threads
+// and timers for execution. Note that once main runs ssx_start_threads,
+// we never return as the SSX kernel takes over.
+//
+// End Function Specification
+int main(int argc, char **argv)
+{
+ // Initialize stdout so we can do printf from within simics env
+ simics_stdout_create(&simics_stdout);
+ simics_stderr_create(&simics_stderr);
+ stdout = (FILE *)(&simics_stdout);
+ stderr = (FILE *)(&simics_stderr);
+ ssxout = (FILE *)(&simics_stdout);
+
+ TRAC_INFO("Inside OCC Main");
+
+ // Initialize SSX Stacks (note that this also reinitializes the time base to 0)
+ ssx_initialize((SsxAddress)noncritical_stack, NONCRITICAL_STACK_SIZE,
+ (SsxAddress)critical_stack, CRITICAL_STACK_SIZE,
+ 0);
+
+ // Create Threads
+ ssx_thread_create(&main_thread,
+ main_thread_routine,
+ (void *)0,
+ (SsxAddress)main_thread_stack,
+ THREAD_STACK_SIZE,
+ 1);
+
+
+ // Make Threads runnable
+ ssx_thread_resume(&main_thread);
+
+ errlHndl_t l_errl = NULL;
+ //Initialize the thread scheduler
+ l_errl = initThreadScheduler();
+
+ if( l_errl )
+ {
+ // Trace and commit error
+ TRAC_ERR("init thread Scheduler failure");
+
+ // commit log
+ // NOTE: log should be deleted by reader mechanism
+ commitErrl( &l_errl );
+ }
+
+ // lets map mainstore to oci space only once
+ // NOTE: This will stay mapped for remainder of occ life
+ // TODO: This sounds like a temporary solution and may
+ // end up moving to simics environment setup
+ // TODO: This map needs to be unmapped after done accessing
+ // main memory for the OCC initialization.
+ Ppc405MmuMap pba_mmu_map;
+ int l_ssxrc1 = ppc405_mmu_map(
+ 0, //Mainstore address 0x0
+ 0, //OCI address 0x0
+ 1048576, //Max size = 1 Mb
+ 0, //
+ 0, //no TLBIE permissions only need to read
+ &pba_mmu_map
+ );
+
+ if ( l_ssxrc1 != SSX_OK )
+ {
+ tracDesc_t l_trace = NULL;
+
+ TRAC_ERR("mmu map failure SsxRc[0x%08X]", -l_ssxrc1 );
+
+ /*
+ * @errortype
+ * @moduleid MAIN_MID
+ * @reasoncode SSX_GENERIC_FAILURE
+ * @userdata1 pore_flex_schedule return code
+ * @userdata4 ERC_MMU_MAP_FAILURE
+ * @devdesc Failure mapping OCI space
+ */
+ l_errl = createErrl(
+ MAIN_MID, //modId
+ SSX_GENERIC_FAILURE, //reasoncode
+ ERC_MMU_MAP_FAILURE, //Extended reason code
+ ERRL_SEV_UNRECOVERABLE, //Severity
+ l_trace, //Trace Buf
+ DEFAULT_TRACE_SIZE, //Trace Size
+ l_ssxrc1, //userdata1
+ 0 //userdata2
+ );
+
+ // Callout firmware
+ addCalloutToErrl(l_errl,
+ ERRL_CALLOUT_TYPE_COMPONENT_ID,
+ ERRL_COMPONENT_ID_FIRMWARE,
+ ERRL_CALLOUT_PRIORITY_HIGH);
+
+ // commit log
+ commitErrl( &l_errl );
+
+ // TODO request a reset of OCC since applet manager will
+ // be toast without this working correctly
+ }
+
+ //Initialize the Applet Manager
+ l_errl = initAppletManager();
+
+ if( l_errl )
+ {
+ // Trace and commit error
+ TRAC_ERR("init Applet Manager failure");
+
+ // commit log
+ commitErrl( &l_errl );
+
+ // TODO: request a reset of OCC since applet manager will
+ // be toast without this working correctly
+ }
+
+ //Initialize structures for collecting core data.
+ //It needs to run before RTLoop start.
+ proc_core_init();
+
+ get_core_info();
+
+ // Initialize Realtime Loop Timer Interrupt
+ rtl_ocb_init();
+
+ // Enter SSX Kernel
+ ssx_start_threads();
+
+ return 0;
+}
+
OpenPOWER on IntegriCloud