summaryrefslogtreecommitdiffstats
path: root/src/occ_405/dcom
diff options
context:
space:
mode:
Diffstat (limited to 'src/occ_405/dcom')
-rwxr-xr-xsrc/occ_405/dcom/dcom.c4
-rwxr-xr-xsrc/occ_405/dcom/dcom.h53
-rw-r--r--src/occ_405/dcom/dcomSlaveRx.c14
-rwxr-xr-xsrc/occ_405/dcom/dcomSlaveTx.c6
4 files changed, 35 insertions, 42 deletions
diff --git a/src/occ_405/dcom/dcom.c b/src/occ_405/dcom/dcom.c
index 5cfea36..f6d2ac8 100755
--- a/src/occ_405/dcom/dcom.c
+++ b/src/occ_405/dcom/dcom.c
@@ -124,10 +124,8 @@ void dcom_initialize_roles(void)
pbax_cfg_reg.fields.rcv_chipid,
pbax_cfg_reg.fields.rcv_groupid);
- G_pbax_id.valid = 1;
G_pbax_id.node_id = pbax_cfg_reg.fields.rcv_groupid;
G_pbax_id.chip_id = pbax_cfg_reg.fields.rcv_chipid;
- G_pbax_id.module_id = G_pbax_id.chip_id;
// Always start as OCC Slave
G_occ_role = OCC_SLAVE;
rtl_set_run_mask(RTL_FLAG_NOTMSTR);
@@ -175,8 +173,6 @@ void dcom_initialize_roles(void)
G_sysConfigData.proc_huid,
ERRL_CALLOUT_PRIORITY_LOW);
- G_pbax_id.valid = 0; // Invalid Chip/Node ID
-
CHECKPOINT_FAIL_AND_HALT(l_errl);
}
diff --git a/src/occ_405/dcom/dcom.h b/src/occ_405/dcom/dcom.h
index 9eace60..24d3909 100755
--- a/src/occ_405/dcom/dcom.h
+++ b/src/occ_405/dcom/dcom.h
@@ -5,7 +5,7 @@
/* */
/* OpenPOWER OnChipController Project */
/* */
-/* Contributors Listed Below - COPYRIGHT 2011,2016 */
+/* Contributors Listed Below - COPYRIGHT 2011,2017 */
/* [+] International Business Machines Corp. */
/* */
/* */
@@ -111,14 +111,20 @@
#define DCOM_4MS_GAP 8
#define DCOM_1S_GAP 4000
+// Doorbell error flag bits
+#define DCOM_DOORBELL_TIMEOUT_ERR 0x80
+#define DCOM_DOORBELL_INCOMPLETE_ERR 0x40
+#define DCOM_DOORBELL_BAD_SEQ_ERR 0x20
+#define DCOM_DOORBELL_BAD_MAGIC_NUM_ERR 0x10
+#define DCOM_DOORBELL_PACKET_DROP_ERR 0x08
+#define DCOM_DOORBELL_HW_ERR 0x04
+#define DCOM_DOORBELL_RX_TIMEOUT_ERR 0x02
+
// POB Id structure
typedef struct
{
- uint8_t module_id :2;
- uint8_t valid :1; // Valid chip/node id?
- uint8_t node_id :2;
- uint8_t reserved :1;
- uint8_t chip_id :2;
+ uint8_t node_id;
+ uint8_t chip_id;
} pob_id_t;
// For now pbax structure is same as pob id structure
@@ -242,39 +248,39 @@ typedef struct
{
struct
{
- // PowerBus ID (= pbax_id) so that the slave knows who the master is
- pob_id_t pob_id; // 1 byte
// Magic Number denoting the start of the packet
- uint32_t magic1 :24; // 3 bytes
+ uint32_t magic1; // 4 bytes
+ // PowerBus ID (= pbax_id) so that the slave knows who the master is
+ pob_id_t pob_id; // 2 bytes
+ // PowerPreservingBoundry Fmax to throttle all OCCs the same
+ uint16_t ppb_fmax; // 2 bytes
// OCI Address where the Slave Inbox Buffer was placed
uint32_t addr_slv_inbox_buffer0; // 4 bytes
// PowerCap data sent from master to slaves
pcap_config_data_t pcap; // 14 bytes
- // PowerPreservingBoundry Fmax to throttle all OCCs the same
- uint16_t ppb_fmax; // 2 bytes
+ // Reserved
+ uint8_t _reserved0[2]; // 2 bytes
// GPIO pins from APSS
uint16_t gpio[2]; // 4 bytes
// Raw ADC Channels from APSS
uint16_t adc[MAX_APSS_ADC_CHANNELS]; // 32 bytes
- // Reserved
- uint8_t _reserved_0[4]; // 4 bytes
// Time of Day Clock from the last APSS reading
uint64_t tod; // 8 bytes
// Reserved
- uint8_t _reserved_1[52]; // 52 bytes
+ uint8_t _reserved_1[51]; // 51 bytes
// Counter in case we want to determine sequence errors
uint8_t magic_counter; // 1 byte
// Magic Number for denoting the end of the packet
- uint32_t magic2 :24; // 3 bytes
- }; // --------
+ uint32_t magic2; // 4 bytes
+ } __attribute__ ((packed)); // --------
uint64_t words[16]; // Total = 128 bytes
};
-} __attribute__ ((packed)) dcom_slv_inbox_doorbell_t;
+} dcom_slv_inbox_doorbell_t;
// Slave Outbox Doorbell
typedef struct
{
- pob_id_t pob_id;
+ uint8_t chip_id;
uint8_t pcap_valid;
uint16_t active_node_pcap;
uint32_t addr_slv_outbox_buffer;
@@ -357,16 +363,7 @@ typedef struct
// Most Recent Sequence number received from Master Doorbell
uint8_t doorbellSeq;
// Error Flags for receiving Master Doorbell (never cleared)
- struct
- {
- uint8_t timeout :1;
- uint8_t incomplete :1;
- uint8_t badSequence :1;
- uint8_t badMagicNumEnd :1;
- uint8_t dropPacket :1;
- uint8_t hwError :1;
- uint8_t timeoutRx :1;
- } doorbellErrorFlags;
+ uint8_t doorbellErrorFlags;
} slave;
// General Timing
diff --git a/src/occ_405/dcom/dcomSlaveRx.c b/src/occ_405/dcom/dcomSlaveRx.c
index a9e5ce8..43c9829 100644
--- a/src/occ_405/dcom/dcomSlaveRx.c
+++ b/src/occ_405/dcom/dcomSlaveRx.c
@@ -297,7 +297,7 @@ void task_dcom_rx_slv_inbox( task_t *i_self)
else
{
- G_dcomTime.slave.doorbellErrorFlags.timeoutRx = 1;
+ G_dcomTime.slave.doorbellErrorFlags |= DCOM_DOORBELL_RX_TIMEOUT_ERR;
G_dcomTime.slave.doorbellTimeoutWaitRx = ssx_timebase_get();
// Let's signal that master is not ready, and then
@@ -356,7 +356,7 @@ uint32_t dcom_rx_slv_inbox_doorbell( void )
// We got an error reading from the PBAX, return to caller
if ( l_pbarc != 0 )
{
- G_dcomTime.slave.doorbellErrorFlags.hwError = 1;
+ G_dcomTime.slave.doorbellErrorFlags |= DCOM_DOORBELL_HW_ERR;
// Failure occurred
TRAC_ERR("Slave PBAX Read Failure in receiving multicast doorbell from master - RC[%08X]", l_pbarc);
@@ -372,11 +372,11 @@ uint32_t dcom_rx_slv_inbox_doorbell( void )
if ((ssx_timebase_get() - l_start) > SSX_MICROSECONDS(3))
{
if(l_bytes_so_far){
- G_dcomTime.slave.doorbellErrorFlags.incomplete = 1;
+ G_dcomTime.slave.doorbellErrorFlags |= DCOM_DOORBELL_INCOMPLETE_ERR;
DCOM_DBG("dcom_rx_slv_inbox_doorbell: incomplete data");
}
else{
- G_dcomTime.slave.doorbellErrorFlags.timeout = 1;
+ G_dcomTime.slave.doorbellErrorFlags |= DCOM_DOORBELL_TIMEOUT_ERR;
DCOM_DBG("dcom_rx_slv_inbox_doorbell: timeout");
}
break;
@@ -398,7 +398,7 @@ uint32_t dcom_rx_slv_inbox_doorbell( void )
{
l_read = 0;
l_bytes_so_far = 0;
- G_dcomTime.slave.doorbellErrorFlags.dropPacket = 1;
+ G_dcomTime.slave.doorbellErrorFlags |= DCOM_DOORBELL_PACKET_DROP_ERR;
TRAC_INFO("Slave Inbox - Start Magic Number Mismatch [0x%08X]",
G_dcom_slv_inbox_doorbell_rx.magic1);
@@ -411,7 +411,7 @@ uint32_t dcom_rx_slv_inbox_doorbell( void )
{
TRAC_INFO("Slave Inbox - End Magic Number Mismatch [0x%08X]",
G_dcom_slv_inbox_doorbell_rx.magic2);
- G_dcomTime.slave.doorbellErrorFlags.badMagicNumEnd = 1;
+ G_dcomTime.slave.doorbellErrorFlags |= DCOM_DOORBELL_BAD_MAGIC_NUM_ERR;
// Decrement the number of bytes we return so it fails
// any valid length checks, but still indicates to us that
@@ -423,7 +423,7 @@ uint32_t dcom_rx_slv_inbox_doorbell( void )
{
if(G_dcom_slv_inbox_doorbell_rx.magic_counter != (G_dcomTime.slave.doorbellSeq + 1))
{
- G_dcomTime.slave.doorbellErrorFlags.badSequence = 1;
+ G_dcomTime.slave.doorbellErrorFlags |= DCOM_DOORBELL_BAD_SEQ_ERR;
}
G_dcomTime.slave.doorbellSeq = G_dcom_slv_inbox_doorbell_rx.magic_counter;
}
diff --git a/src/occ_405/dcom/dcomSlaveTx.c b/src/occ_405/dcom/dcomSlaveTx.c
index a92bb69..a7060cb 100755
--- a/src/occ_405/dcom/dcomSlaveTx.c
+++ b/src/occ_405/dcom/dcomSlaveTx.c
@@ -5,7 +5,7 @@
/* */
/* OpenPOWER OnChipController Project */
/* */
-/* Contributors Listed Below - COPYRIGHT 2011,2016 */
+/* Contributors Listed Below - COPYRIGHT 2011,2017 */
/* [+] International Business Machines Corp. */
/* */
/* */
@@ -84,7 +84,7 @@ uint32_t dcom_build_slv_outbox(void)
l_addr_of_slv_outbox_in_main_mem += G_pbax_id.chip_id*sizeof(dcom_slv_outbox_t);
- G_dcom_slv_outbox_doorbell_tx.pob_id = G_pbax_id;
+ G_dcom_slv_outbox_doorbell_tx.chip_id = G_pbax_id.chip_id;
G_dcom_slv_outbox_doorbell_tx.pcap_valid = g_amec->pcap_valid;
G_dcom_slv_outbox_doorbell_tx.active_node_pcap = g_amec->pcap.active_node_pcap;
G_dcom_slv_outbox_doorbell_tx.addr_slv_outbox_buffer = l_addr_of_slv_outbox_in_main_mem;
@@ -128,7 +128,7 @@ uint32_t dcom_which_buffer_slv_outbox(void)
// End Function Specification
uint32_t dcom_calc_slv_outbox_addr( const dcom_slv_outbox_doorbell_t * i_doorbell, uint8_t * o_occ_id )
{
- *o_occ_id = i_doorbell->pob_id.chip_id;
+ *o_occ_id = i_doorbell->chip_id;
return i_doorbell->addr_slv_outbox_buffer;
}
OpenPOWER on IntegriCloud