summaryrefslogtreecommitdiffstats
path: root/src/lib/gpsm_dcm.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/gpsm_dcm.h')
-rwxr-xr-xsrc/lib/gpsm_dcm.h192
1 files changed, 192 insertions, 0 deletions
diff --git a/src/lib/gpsm_dcm.h b/src/lib/gpsm_dcm.h
new file mode 100755
index 0000000..407ddbb
--- /dev/null
+++ b/src/lib/gpsm_dcm.h
@@ -0,0 +1,192 @@
+#ifndef __GPSM_DCM_H__
+#define __GPSM_DCM_H__
+
+// $Id: gpsm_dcm.h,v 1.2 2014/02/03 01:30:24 daviddu Exp $
+// $Source: /afs/awd/projects/eclipz/KnowledgeBase/.cvsroot/eclipz/chips/p8/working/procedures/lib/gpsm_dcm.h,v $
+//-----------------------------------------------------------------------------
+// *! (C) Copyright International Business Machines Corp. 2013
+// *! All Rights Reserved -- Property of IBM
+// *! *** IBM Confidential ***
+//-----------------------------------------------------------------------------
+
+/// \file gpsm_dcm.h
+/// \brief PgP Global PState Machine (Mechanism) in Dual Chip Model
+
+#include "pmc_dcm.h"
+
+/// GPSM-DCM Return Code
+#define GPSM_DCM_SUCCESS 0
+#define GPSM_DCM_ARG_INVALID_OBJ_SND 0x00326401 //ssx panic
+#define GPSM_DCM_ARG_INVALID_OBJ_RCV 0x00326402 //ssx panic
+#define GPSM_DCM_ARG_INVALID_OBJ_WRT 0x00326403 //ssx panic
+#define GPSM_DCM_ARG_INVALID_OBJ_RED 0x00326404 //ssx panic
+#define GPSM_DCM_PKT_INVALID_CMD_SND 0x00326405 //ssx panic
+#define GPSM_DCM_PKT_INVALID_CMD_RCV 0x00326406 //ssx panic
+#define GPSM_DCM_CMD_NOT_FROM_MASTER 0x00326407 //ssx panic
+#define GPSM_DCM_CMD_SHOULD_TO_SLAVE 0x00326408 //ssx panic
+#define GPSM_DCM_SEND_PACKET_TIMEOUT 0x00326409 //user handle
+#define GPSM_DCM_RECV_PACKET_TIMEOUT 0x0032640a //user handle
+#define GPSM_DCM_READ_RECV_NOT_WRITE 0x0032640b //ssx panic
+#define GPSM_DCM_READ_NOT_WRITE_DATA 0x0032640c //ssx panic
+#define GPSM_DCM_DAT_BIGGER_THAN_BUF 0x0032640d //user handle
+#define GPSM_DCM_CMD_REPLY_NOT_INT 0x0032640e //ssx panic
+#define GPSM_DCM_SLAVE_TIMEOUT 0x0032640f //user handle
+#define GPSM_DCM_SLAVE_ERROR 0x00326410 //user handle
+
+/// GPSM Interchip Command Code
+#define GPSM_IC_DATA 0 //0b0000
+#define GPSM_IC_WRITE 1 //0b0001
+#define GPSM_IC_ENABLE_PSTATES 2 //0b0010
+#define GPSM_IC_HW_PSTATE_MODE 3 //0b0011
+
+#define GPSM_DCM_NUMBER_OF_COMMANDS 4
+
+/// This is a special command return code returned by gpsm_dcm_slave() when it
+/// times out.
+#define GPSM_IC_NO_COMMAND GPSM_DCM_NUMBER_OF_COMMANDS
+
+
+/// Timeout Parameter
+#define GPSM_DCM_DEFAULT_TIMEOUT SSX_MICROSECONDS(15)
+
+#ifndef __ASSEMBLER__
+
+/// GPSM-DCM abstract packet
+
+typedef struct {
+ /// Firmware command
+ uint8_t command : 4;
+ union {
+ /// Used for Pstate-based protocols
+ Pstate pstate[2];
+ /// Generic byte data
+ uint8_t u8[2];
+ } payload;
+} GpsmDcmPacket;
+
+/// Data Structure for Fast Write/Read Handlers
+
+typedef struct {
+ void* buffer_pointer;
+ uint32_t remaining_size;
+ SsxSemaphore fast_semaphore;
+} GpsmDcmFastData;
+
+/// Data Structure for Sync Mehotds
+
+
+/// Abstract type of gpsm_dcm_slave() callbacks
+///
+/// The callback receives the (first) master packet of the exchange. The
+/// return code is passed back to the master.
+
+typedef int (*GpsmDcmSlaveCallback)(GpsmDcmPacket* fwPacket);
+
+
+/// Control structure for gpsm_dcm_slave()
+
+typedef struct {
+ /// Slave timeout when waiting for next packet to arrive in long commands.
+ SsxInterval timeout;
+
+ /// Callback called after "Enable Pstates" command
+ GpsmDcmSlaveCallback gpsm_dcm_callback_enable_pstates;
+
+ /// Callback called after "Enter HW Pstate Mode" command
+ GpsmDcmSlaveCallback gpsm_dcm_callback_hw_pstate_mode;
+
+ /// Callback for GPSM-DCM write command
+ ///
+ /// Will be called with the application-supplied buffer and the actual
+ /// size of the data transmission.
+ int (*write_handler)(void* buffer, uint16_t size, void* arg);
+
+ /// Application-supplied buffer for GPSM-DCM write commands
+ void* buffer;
+
+ /// Size of the application-supplied write buffer
+ uint16_t buffer_size;
+
+ /// Application-supplied generic argument to the write handler
+ void* write_arg;
+
+ /// Callback when slave detects timeout from master
+ GpsmDcmSlaveCallback timeout_handler;
+
+ /// The last command recieved by the slave.
+ int command;
+
+ /// Return code from gpsm_dcm protocol actions
+ int protocol_rc;
+
+ /// Return code from slave action in response to master command
+ int slave_rc;
+
+ /// Return code from the application specific callback, if any.
+ int callback_rc;
+
+} GpsmSlaveControl;
+
+////////////////////////////////////////////////////////////////////////////
+// High-level GPSM-DCM Interchip Communication Methods
+////////////////////////////////////////////////////////////////////////////
+
+int
+gpsm_dcm_send(GpsmDcmPacket* fwPacket);
+
+
+
+int
+gpsm_dcm_receive(GpsmDcmPacket* fwPacket,
+ SsxInterval timeout_period);
+
+
+////////////////////////////////////////////////////////////////////////////
+// Generic Data Communication using GPSM-DCM 'write' command
+////////////////////////////////////////////////////////////////////////////
+
+int
+gpsm_dcm_write(void* buf,
+ uint16_t size,
+ SsxInterval timeout_period);
+
+
+int
+gpsm_dcm_read(void* buf,
+ uint16_t buf_size,
+ uint16_t* data_size,
+ SsxInterval timeout_period);
+
+////////////////////////////////////////////////////////////////////////////
+// Fast Interrrupt Handlers for Data Transfer of GPSM-DCM 'write' command
+////////////////////////////////////////////////////////////////////////////
+
+SSX_IRQ_HANDLER(gpsm_dcm_fast_write);
+SSX_IRQ_HANDLER(gpsm_dcm_fast_read);
+
+////////////////////////////////////////////////////////////////////////////
+// Generic Synchronization Mechanism using GPSM-DCM 'write' command
+////////////////////////////////////////////////////////////////////////////
+
+int
+gpsm_dcm_sync(int state);
+
+////////////////////////////////////////////////////////////////////////////
+// The Control Method for Slave Thread
+////////////////////////////////////////////////////////////////////////////
+
+int
+gpsm_dcm_slave(GpsmSlaveControl *control,
+ SsxInterval wait);
+
+
+////////////////////////////////////////////////////////////////////////////
+// The Command Method for Master Thread
+////////////////////////////////////////////////////////////////////////////
+
+int
+gpsm_dcm_master(GpsmDcmPacket* fwPacket, int* slaveRc);
+
+#endif /* __ASSEMBLER__ */
+
+#endif /* __GPSM_DCM_H__ */
OpenPOWER on IntegriCloud