diff options
Diffstat (limited to 'src/occ_405/dcom')
-rwxr-xr-x | src/occ_405/dcom/dcom.c | 4 | ||||
-rwxr-xr-x | src/occ_405/dcom/dcom.h | 53 | ||||
-rw-r--r-- | src/occ_405/dcom/dcomSlaveRx.c | 14 | ||||
-rwxr-xr-x | src/occ_405/dcom/dcomSlaveTx.c | 6 |
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; } |