summaryrefslogtreecommitdiffstats
path: root/src/occ_405/wof
diff options
context:
space:
mode:
authorAndres Lugo-Reyes <aalugore@us.ibm.com>2017-01-10 08:52:34 -0600
committerWilliam A. Bryan <wilbryan@us.ibm.com>2017-02-01 16:45:08 -0500
commit0ee0cf11ed50cf9c43d05a1ba2aa4f25801b6d97 (patch)
tree64c8e2f6f33033495335fa952f51edb0f3ba07ae /src/occ_405/wof
parent4d6a99902a2a377a12dbef720fea81873fb920cc (diff)
downloadtalos-occ-0ee0cf11ed50cf9c43d05a1ba2aa4f25801b6d97.tar.gz
talos-occ-0ee0cf11ed50cf9c43d05a1ba2aa4f25801b6d97.zip
WOF: Function to calculate the desired VFRT Mainstore address
Function also copies VFRT from Mainstore to SRAM and then sends the WOF VFRT IPC command to the PGPE Change-Id: I94c7d4bcc9179fce3f17c1b974a12186c67547c1 RTC: 130216 Depends-on: I2249777134608d9f79bdc85692a3acbf7907c3f5 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/34658 Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com> Reviewed-by: William A. Bryan <wilbryan@us.ibm.com>
Diffstat (limited to 'src/occ_405/wof')
-rw-r--r--src/occ_405/wof/wof.c262
-rw-r--r--src/occ_405/wof/wof.h21
-rw-r--r--src/occ_405/wof/wof_service_codes.h41
3 files changed, 322 insertions, 2 deletions
diff --git a/src/occ_405/wof/wof.c b/src/occ_405/wof/wof.c
index bad31b6..4815213 100644
--- a/src/occ_405/wof/wof.c
+++ b/src/occ_405/wof/wof.c
@@ -26,6 +26,10 @@
#include <trac.h>
#include <sensor.h>
#include <occhw_async.h>
+#include <pgpe_shared.h>
+#include <pstate_pgpe_occ_api.h>
+#include <occ_service_codes.h>
+#include <wof_service_codes.h>
#include "wof.h"
@@ -37,7 +41,16 @@ uint32_t G_wof_tables_main_mem_addr;
uint32_t G_wof_tables_len;
bool G_run_wof_main;
+uint8_t G_sram_vfrt_ping_buffer[MIN_BCE_REQ_SIZE] __attribute__ ((section(".vfrt_ping_buffer")));
+uint8_t G_sram_vfrt_pong_buffer[MIN_BCE_REQ_SIZE] __attribute__ ((section(".vfrt_pong_buffer")));
wof_header_data_t G_wof_header __attribute__ ((section (".global_data")));
+uint32_t G_current_vfrt_addr = 0;
+
+//******************************************************************************
+// External Globals
+//******************************************************************************
+extern GPE_BUFFER(ipcmsg_wof_vfrt_t G_wof_vfrt_parms);
+extern GpeRequest G_wof_vfrt_req;
@@ -152,3 +165,252 @@ uint8_t calc_quad_step_from_start( uint8_t i_num_active_quads )
return (G_wof_header.active_quads_size == ACTIVE_QUAD_SZ_MIN) ? 0 :
(i_num_active_quads - 1);
}
+
+/**
+ * calc_vfrt_address
+ *
+ * Description: Calculates the VFRT address based on the Ceff vdd/vdn and quad
+ * steps.
+ *
+ * Param[in]: i_vdd_step_from_start
+ * Param[in]: i_vdn_step_from_start
+ * Param[in]: i_quad_step_from_start
+ *
+ * Return: The desired VFRT address
+ */
+uint32_t calc_vfrt_mainstore_addr( uint16_t i_vdd_step_from_start,
+ uint16_t i_vdn_step_from_start,
+ uint8_t i_quad_step_from_start )
+{
+
+ // Wof tables address calculation
+ // (Base_addr + (sizeof VFRT * (total active quads * ( (i_vdn_step_from_start * vdd_size) + (i_vdd_step_from_start) ) + (i_quad_step_from_start))))
+ uint32_t offset = G_wof_header.size_of_vfrt *
+ (( G_wof_header.active_quads_size *
+ ((i_vdn_step_from_start * G_wof_header.vdd_size) +
+ i_vdd_step_from_start) ) + i_quad_step_from_start);
+
+ // Skip the wof header at the beginning of wof tables
+ uint32_t wof_tables_base = G_wof_tables_main_mem_addr + WOF_HEADER_SIZE;
+
+ return wof_tables_base + offset;
+}
+
+
+/**
+ * copy_vfrt_to_sram
+ *
+ * Description: Call back function to copy VFRT into SRAM ping/pong buffer
+ * This call will also tell the PGPE that a new VFRT is available
+ *
+ * Param[in]: i_parms - pointer to a struct that will hold data necessary to
+ * the calculation.
+ * -Pointer to vfrt table temp buffer
+ * -Padding if the address needed to be 128-byte aligned
+ */
+void copy_vfrt_to_sram( copy_vfrt_to_sram_parms_t * i_parms)
+{
+/*
+ *
+ * find out which ping pong buffer to use
+ * copy the vfrt to said ping pong buffer
+ * save current vfrt address to global
+ * send IPC command to pgpe to notify of new ping/pong vfrt address
+ */
+ // Static variable to trac which buffer is open for use
+ // 0 = PING; 1 = PONG;
+ int l_gperc; // gpe schedule return code
+ static uint8_t L_pingpong = 0;
+ uint8_t * l_buffer_address;
+
+ if( L_pingpong == 0 )
+ {
+ // Use ping buffer
+ l_buffer_address = G_sram_vfrt_ping_buffer;
+ // Set next access to pong buffer
+ }
+ else
+ {
+ // Use pong buffer
+ l_buffer_address = G_sram_vfrt_pong_buffer;
+ // Set next access to ping buffer
+ }
+
+ // Copy the vfrt data into the buffer
+ memcpy( l_buffer_address,
+ &(i_parms->vfrt_table->data[i_parms->pad]),
+ G_wof_header.size_of_vfrt );
+
+ // Set the parameters for the GpeRequest
+ G_wof_vfrt_parms.vfrt_ptr = l_buffer_address;
+ // TODO set this to Global amec field once we read shared sram
+ G_wof_vfrt_parms.active_quads = 1;
+
+ // Send IPC command to PGPE with new vfrt address and active quads
+ // Should not need to check if request is idle as wof_main does before
+ // the WOF calculations begin.
+ l_gperc = gpe_request_schedule( &G_wof_vfrt_req );
+
+ // Confirm Successfull completion of WOF VFRT task
+ if(l_gperc != 0)
+ {
+ //Error in scheduling pgpe clip update task
+ TRAC_ERR("copy_vfrt_to_sram: Failed to schedule WOF VFRT task rc=%x",
+ l_gperc);
+
+ /* @
+ * @errortype
+ * @moduleid COPY_VFRT_TO_SRAM
+ * @reasoncode GPE_REQUEST_SCHEDULE_FAILURE
+ * @userdata1 rc - gpe_request_schedule return code
+ * @userdata2 0
+ * @userdata4 OCC_NO_EXTENDED_RC
+ * @devdesc OCC Failed to schedule a GPE job for clip update
+ */
+ errlHndl_t l_errl = createErrl(
+ COPY_VFRT_TO_SRAM, // modId
+ GPE_REQUEST_SCHEDULE_FAILURE, // reasoncode
+ OCC_NO_EXTENDED_RC, // Extended reason code
+ ERRL_SEV_UNRECOVERABLE, // Severity
+ NULL, // Trace Buf
+ DEFAULT_TRACE_SIZE, // Trace Size
+ l_gperc, // userdata1
+ 0 // userdata2
+ );
+
+ // Callout firmware
+ addCalloutToErrl(l_errl,
+ ERRL_CALLOUT_TYPE_COMPONENT_ID,
+ ERRL_COMPONENT_ID_FIRMWARE,
+ ERRL_CALLOUT_PRIORITY_HIGH);
+
+ // Commit error log
+ commitErrl(&l_errl);
+ }
+ else
+ {
+ // Sent the IPC command successfully, update which buffer we should look
+ // at next time.
+ L_pingpong = ~L_pingpong;
+ }
+
+}
+
+
+/**
+ * send_vfrt_to_pgpe
+ *
+ * Description: Function to copy new VFRT from Mainstore to local SRAM buffer
+ * and calls copy_vfrt_to_sram callback function to send new VFRT
+ * to the PGPE
+ * Note: If desired VFRT is the same as previous, skip.
+ *
+ * Param[in]: i_vfrt_address - Address of the desired vfrt table.
+ */
+void send_vfrt_to_pgpe( uint32_t i_vfrt_address )
+{
+ int l_ssxrc = SSX_OK;
+ uint32_t l_reasonCode = 0;
+ uint32_t l_extReasonCode = 0;
+
+ do
+ {
+ if(i_vfrt_address == G_current_vfrt_addr)
+ {
+ // VFRT is unchanged. Skip
+ break;
+ }
+ else
+ {
+ // New VFRT needed from Mainstore, create BCE request to get it.
+ BceRequest l_vfrt_req;
+
+ // 128-byte aligned temp buffer to hold data
+ temp_bce_request_buffer_t l_temp_bce_buff = {{0}};
+
+
+ uint8_t l_pad = i_vfrt_address%128;
+ uint32_t l_vfrt_addr_128_aligned = i_vfrt_address - l_pad;
+
+ // Create structure to hold parameters for callback function
+ copy_vfrt_to_sram_parms_t l_callback_parms;
+ l_callback_parms.vfrt_table = &l_temp_bce_buff;
+ l_callback_parms.pad = l_pad;
+
+
+ // Create request
+ l_ssxrc = bce_request_create(
+ &l_vfrt_req, // block copy object
+ &G_pba_bcde_queue, // main to sram copy engine
+ l_vfrt_addr_128_aligned, //mainstore address
+ (uint32_t) &l_temp_bce_buff, // SRAM start address
+ MIN_BCE_REQ_SIZE, // size of copy
+ SSX_WAIT_FOREVER, // no timeout
+ (AsyncRequestCallback)copy_vfrt_to_sram,
+ (void *)&l_callback_parms,
+ ASYNC_CALLBACK_IMMEDIATE );
+
+ if(l_ssxrc != SSX_OK)
+ {
+ CMDH_TRAC_ERR("read_wof_header: BCDE request create failure rc=[%08X]", -l_ssxrc);
+ /*
+ * @errortype
+ * @moduleid SEND_VFRT_TO_PGPE
+ * @reasoncode SSX_GENERIC_FAILURE
+ * @userdata1 RC for BCE block-copy engine
+ * @userdata2 Internal function checkpoint
+ * @userdata4 ERC_BCE_REQUEST_CREATE_FAILURE
+ * @devdesc Failed to create BCDE request
+ */
+ l_reasonCode = SSX_GENERIC_FAILURE;
+ l_extReasonCode = ERC_BCE_REQUEST_CREATE_FAILURE;
+ break;
+ }
+
+ // Do the actual copy
+ l_ssxrc = bce_request_schedule( &l_vfrt_req );
+
+ if(l_ssxrc != SSX_OK)
+ {
+ CMDH_TRAC_ERR("read_wof_header: BCE request schedule failure rc=[%08X]", -l_ssxrc);
+ /*
+ * @errortype
+ * @moduleid SEND_VFRT_TO_PGPE
+ * @reasoncode SSX_GENERIC_FAILURE
+ * @userdata1 RC for BCE block-copy engine
+ * @userdata4 ERC_BCE_REQUEST_SCHEDULE_FAILURE
+ * @devdesc Failed to read PPMR data by using BCDE
+ */
+ l_reasonCode = SSX_GENERIC_FAILURE;
+ l_extReasonCode = ERC_BCE_REQUEST_SCHEDULE_FAILURE;
+ break;
+ }
+
+ }
+ }while( 0 );
+
+ // Check for errors and log, if any
+ if( l_ssxrc != SSX_OK )
+ {
+ errlHndl_t l_errl = createErrl(SEND_VFRT_TO_PGPE, //modId
+ l_reasonCode, //reasoncode
+ l_extReasonCode, //Extended reason code
+ ERRL_SEV_UNRECOVERABLE, //Severity
+ NULL, //Trace Buf
+ 0, //Trace Size
+ -l_ssxrc, //userdata1
+ 0); //userdata2
+
+ // Callout firmware
+ addCalloutToErrl(l_errl,
+ ERRL_CALLOUT_TYPE_COMPONENT_ID,
+ ERRL_COMPONENT_ID_FIRMWARE,
+ ERRL_CALLOUT_PRIORITY_HIGH);
+
+ // Commit error log
+ commitErrl(&l_errl);
+
+ return;
+ }
+
+}
diff --git a/src/occ_405/wof/wof.h b/src/occ_405/wof/wof.h
index 52a5ff0..210e3cc 100644
--- a/src/occ_405/wof/wof.h
+++ b/src/occ_405/wof/wof.h
@@ -33,6 +33,8 @@
#define MIN_BCE_REQ_SIZE 256
#define ACTIVE_QUAD_SZ_MIN 1
#define ACTIVE_QUAD_SZ_MAX 6
+#define WOF_HEADER_SIZE 32
+
typedef struct __attribute__ ((packed))
{
@@ -50,7 +52,6 @@ typedef struct __attribute__ ((packed))
} wof_header_data_t;
-
typedef struct
{
// There is no guarantee that we can fit everything into the min BceRequest
@@ -60,11 +61,17 @@ typedef struct
uint8_t data[MIN_BCE_REQ_SIZE];
} temp_bce_request_buffer_t __attribute ((aligned(128)));
+typedef struct
+{
+ temp_bce_request_buffer_t * vfrt_table;
+ uint8_t pad;
+} copy_vfrt_to_sram_parms_t;
+
+
//******************************************************************************
// Function Prototypes
//******************************************************************************
-
void wof_main( void );
uint16_t calculate_step_from_start( uint16_t i_ceff_vdx,
@@ -76,4 +83,14 @@ uint8_t calc_quad_step_from_start( uint8_t i_num_active_quads );
+uint32_t calc_vfrt_mainstore_addr( uint16_t i_vdd_step_from_start,
+ uint16_t i_vdn_step_from_start,
+ uint8_t i_quad_step_from_start );
+
+void copy_vfrt_to_sram( copy_vfrt_to_sram_parms_t * i_parms );
+
+void send_vfrt_to_pgpe( uint32_t i_vfrt_address );
+
+
+
#endif
diff --git a/src/occ_405/wof/wof_service_codes.h b/src/occ_405/wof/wof_service_codes.h
new file mode 100644
index 0000000..8967580
--- /dev/null
+++ b/src/occ_405/wof/wof_service_codes.h
@@ -0,0 +1,41 @@
+/* IBM_PROLOG_BEGIN_TAG */
+/* This is an automatically generated prolog. */
+/* */
+/* $Source: src/occ_405/wof/wof_service_codes.h $ */
+/* */
+/* OpenPOWER OnChipController Project */
+/* */
+/* Contributors Listed Below - COPYRIGHT 2017 */
+/* [+] 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 */
+#ifndef _WOF_SERVICE_CODES_H_
+#define _WOF_SERVICE_CODES_H_
+
+#include <comp_ids.h>
+
+enum wofModuleId
+{
+ WOF_MAIN = WOF_COMP_ID | 0x01,
+ SEND_VFRT_TO_PGPE = WOF_COMP_ID | 0x02,
+ COPY_VFRT_TO_SRAM = WOF_COMP_ID | 0x03,
+};
+
+
+
+
+
+#endif /* #ifndef _WOF_SERVICE_CODES_H_ */
OpenPOWER on IntegriCloud