in prov/bgq/src/fi_bgq_ep.c [441:969]
static int fi_bgq_ep_tx_init (struct fi_bgq_ep *bgq_ep,
struct fi_bgq_domain *bgq_domain)
{
assert(bgq_ep);
assert(bgq_domain);
assert(bgq_ep->tx.state == FI_BGQ_EP_UNINITIALIZED);
if (bgq_ep->tx.stx) {
#ifdef FI_BGQ_TRACE
fprintf(stderr,"fi_bgq_ep_tx_init - using tx shared on node not picking new fifos\n");
fflush(stderr);
#endif
assert(bgq_domain == bgq_ep->tx.stx->domain);
} else {
/*
* A shared transmit context was not provided; create an
* "exclusive" shared transmit context for use by only this
* endpoint transmit context
*/
#ifdef FI_BGQ_TRACE
fprintf(stderr,"fi_bgq_ep_tx_init - picking new fifos for new tx\n");
fflush(stderr);
#endif
if (fi_bgq_stx_init(bgq_domain, 0, &bgq_ep->tx.exclusive_stx, NULL)) {
return -1;
}
bgq_ep->tx.stx = &bgq_ep->tx.exclusive_stx;
fi_bgq_ref_inc(&bgq_ep->tx.stx->ref_cnt, "exclusive shared context");
}
bgq_ep->threading = (uint32_t) bgq_domain->threading;
bgq_ep->av_type = (uint32_t) bgq_ep->av->type;
bgq_ep->mr_mode = (uint32_t) bgq_domain->mr_mode;
/* copy the 'shared tx' resources and information */
fi_bgq_spi_injfifo_clone(&bgq_ep->tx.injfifo, &bgq_ep->tx.stx->injfifo);
BG_CoordinateMapping_t my_coords = bgq_domain->my_coords;
const uint32_t fifo_map =
fi_bgq_mu_calculate_fifo_map_single(my_coords, my_coords);
const MUHWI_Destination_t destination =
fi_bgq_spi_coordinates_to_destination(my_coords);
const uint32_t base_rx =
fi_bgq_addr_calculate_base_rx(my_coords.t, Kernel_ProcessCount());
const union fi_bgq_addr self = {.fi=fi_bgq_addr_create(destination, fifo_map, base_rx)};
#ifdef FI_BGQ_TRACE
fprintf(stderr,"fi_bgq_ep_tx_init created addr:\n");
FI_BGQ_ADDR_DUMP((fi_addr_t *)&self.fi);
#endif
/*
* fi_[t]send*() descriptor models
*/
{ /* send model */
MUHWI_Descriptor_t * desc = &bgq_ep->tx.send.send_model;
MUSPI_DescriptorZeroOut(desc);
desc->Half_Word0.Prefetch_Only =
MUHWI_DESCRIPTOR_PRE_FETCH_ONLY_NO;
desc->Half_Word1.Interrupt =
MUHWI_DESCRIPTOR_DO_NOT_INTERRUPT_ON_PACKET_ARRIVAL;
desc->PacketHeader.NetworkHeader.pt2pt.Data_Packet_Type =
MUHWI_PT2PT_DATA_PACKET_TYPE;
desc->PacketHeader.NetworkHeader.pt2pt.Byte3.Byte3 =
MUHWI_PACKET_VIRTUAL_CHANNEL_DETERMINISTIC;
desc->PacketHeader.NetworkHeader.pt2pt.Byte8.Byte8 =
MUHWI_PACKET_TYPE_FIFO;
desc->PacketHeader.NetworkHeader.pt2pt.Byte8.Size = 16;
union fi_bgq_mu_packet_hdr * hdr = (union fi_bgq_mu_packet_hdr *) &desc->PacketHeader;
fi_bgq_mu_packet_type_set(hdr, FI_BGQ_MU_PACKET_TYPE_TAG|FI_BGQ_MU_PACKET_TYPE_EAGER);
hdr->pt2pt.uid.fi = self.uid.fi;
hdr->pt2pt.immediate_data = 0;
hdr->pt2pt.ofi_tag = (uint64_t)-1;
/* specified at injection time */
desc->Pa_Payload = 0;
desc->Message_Length = 0;
desc->Torus_FIFO_Map = 0;
desc->PacketHeader.NetworkHeader.pt2pt.Destination.Destination.Destination = -1;
desc->PacketHeader.messageUnitHeader.Packet_Types.Memory_FIFO.Rec_FIFO_Id = -1;
/* send rendezvous models */
desc = &bgq_ep->tx.send.rzv_model[0]; /* "internode" */ /* TODO - use an enum */
*desc = bgq_ep->tx.send.send_model;
desc->Message_Length = sizeof(struct fi_bgq_mu_iov) + offsetof(union fi_bgq_mu_packet_payload, rendezvous.mu_iov);
hdr = (union fi_bgq_mu_packet_hdr *) &desc->PacketHeader;
fi_bgq_mu_packet_type_set(hdr, FI_BGQ_MU_PACKET_TYPE_TAG|FI_BGQ_MU_PACKET_TYPE_RENDEZVOUS);
hdr->pt2pt.rendezvous.is_local = 0;
hdr->pt2pt.rendezvous.niov_minus_1 = 0;
hdr->pt2pt.rendezvous.rget_inj_fifo_id = bgq_ep->tx.stx->rgetfifo.node_scoped_fifo_id;
desc = &bgq_ep->tx.send.rzv_model[1]; /* "intranode" */ /* TODO - use an enum */
*desc = bgq_ep->tx.send.rzv_model[0];
hdr = (union fi_bgq_mu_packet_hdr *) &desc->PacketHeader;
hdr->pt2pt.rendezvous.is_local = 1;
#ifdef FI_BGQ_REMOTE_COMPLETION
/* remote completion model - used for FI_DELIVERY_COMPLETE */
desc = &bgq_ep->tx.send.remote_completion_model;
*desc = bgq_ep->tx.send.send_model;
hdr = (union fi_bgq_mu_packet_hdr *) &desc->PacketHeader;
fi_bgq_mu_packet_type_set(hdr, FI_BGQ_MU_PACKET_TYPE_EAGER|FI_BGQ_MU_PACKET_TYPE_ACK);
hdr->completion.origin = fi_bgq_uid_get_destination(self.uid.fi);
/* specified at injection time */
hdr->completion.is_local = 0;
hdr->completion.cntr_paddr_rsh3b = 0;
#endif
}
/*
* fi_write*() descriptor models
*/
{ /*
* "direct" model(s) for FI_MR_BASIC
*/
/* direct-put model */
MUHWI_Descriptor_t * desc = &bgq_ep->tx.write.direct.dput_model;
MUSPI_DescriptorZeroOut(desc);
desc->Half_Word0.Prefetch_Only =
MUHWI_DESCRIPTOR_PRE_FETCH_ONLY_NO;
desc->Half_Word1.Interrupt =
MUHWI_DESCRIPTOR_DO_NOT_INTERRUPT_ON_PACKET_ARRIVAL;
desc->PacketHeader.NetworkHeader.pt2pt.Data_Packet_Type =
MUHWI_PT2PT_DATA_PACKET_TYPE;
desc->PacketHeader.NetworkHeader.pt2pt.Byte3.Byte3 =
MUHWI_PACKET_VIRTUAL_CHANNEL_DETERMINISTIC;
desc->PacketHeader.NetworkHeader.pt2pt.Byte8.Byte8 =
MUHWI_PACKET_TYPE_PUT;
desc->PacketHeader.NetworkHeader.pt2pt.Byte8.Size = 16;
desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Rec_Payload_Base_Address_Id =
FI_BGQ_MU_BAT_ID_GLOBAL;
desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Pacing =
MUHWI_PACKET_DIRECT_PUT_IS_NOT_PACED;
desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Rec_Counter_Base_Address_Id =
FI_BGQ_MU_BAT_ID_COUNTER;
desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Counter_Offset = 0;
/* specified at injection time */
desc->Pa_Payload = 0;
desc->Message_Length = 0;
desc->Torus_FIFO_Map = 0;
desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Put_Offset_MSB = 0;
desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Put_Offset_LSB = 0;
/*
* "emulation" model(s) for FI_MR_SCALABLE
*/
/* memory-fifo model */
desc = &bgq_ep->tx.write.emulation.mfifo_model;
MUSPI_DescriptorZeroOut(desc);
desc->Half_Word0.Prefetch_Only =
MUHWI_DESCRIPTOR_PRE_FETCH_ONLY_NO;
desc->Half_Word1.Interrupt =
MUHWI_DESCRIPTOR_DO_NOT_INTERRUPT_ON_PACKET_ARRIVAL;
desc->Pa_Payload = 0;
desc->Message_Length = 0;
desc->PacketHeader.NetworkHeader.pt2pt.Data_Packet_Type =
MUHWI_PT2PT_DATA_PACKET_TYPE;
desc->PacketHeader.NetworkHeader.pt2pt.Byte3.Byte3 =
MUHWI_PACKET_VIRTUAL_CHANNEL_DETERMINISTIC;
desc->PacketHeader.NetworkHeader.pt2pt.Byte8.Byte8 =
MUHWI_PACKET_TYPE_FIFO;
desc->PacketHeader.NetworkHeader.pt2pt.Byte8.Size = 16;
/* specified at injection time */
desc->Torus_FIFO_Map = -1;
desc->PacketHeader.NetworkHeader.pt2pt.Destination.Destination.Destination = -1;
desc->PacketHeader.messageUnitHeader.Packet_Types.Memory_FIFO.Rec_FIFO_Id = -1;
union fi_bgq_mu_packet_hdr * hdr = (union fi_bgq_mu_packet_hdr *) &desc->PacketHeader;
fi_bgq_mu_packet_type_set(hdr, FI_BGQ_MU_PACKET_TYPE_RMA);
/* remote-get model */
desc = &bgq_ep->tx.write.emulation.rget_model;
MUSPI_DescriptorZeroOut(desc);
desc->Half_Word0.Prefetch_Only =
MUHWI_DESCRIPTOR_PRE_FETCH_ONLY_NO;
desc->Half_Word1.Interrupt =
MUHWI_DESCRIPTOR_DO_NOT_INTERRUPT_ON_PACKET_ARRIVAL;
desc->PacketHeader.NetworkHeader.pt2pt.Data_Packet_Type =
MUHWI_PT2PT_DATA_PACKET_TYPE;
desc->PacketHeader.NetworkHeader.pt2pt.Byte3.Byte3 =
MUHWI_PACKET_VIRTUAL_CHANNEL_DETERMINISTIC;
desc->PacketHeader.NetworkHeader.pt2pt.Byte8.Byte8 =
MUHWI_PACKET_TYPE_GET;
desc->PacketHeader.NetworkHeader.pt2pt.Byte8.Size = 16;
desc->PacketHeader.NetworkHeader.pt2pt.Destination =
fi_bgq_uid_get_destination(self.uid.fi);
desc->PacketHeader.messageUnitHeader.Packet_Types.Remote_Get.Rget_Inj_FIFO_Id =
bgq_ep->tx.stx->rgetfifo.node_scoped_fifo_id;
/* specified at injection time */
desc->Pa_Payload = 0;
desc->Message_Length = 0;
desc->Torus_FIFO_Map = -1;
/* direct-put model */
desc = &bgq_ep->tx.write.emulation.dput_model;
MUSPI_DescriptorZeroOut(desc);
desc->Half_Word0.Prefetch_Only =
MUHWI_DESCRIPTOR_PRE_FETCH_ONLY_NO;
desc->Half_Word1.Interrupt =
MUHWI_DESCRIPTOR_DO_NOT_INTERRUPT_ON_PACKET_ARRIVAL;
desc->PacketHeader.NetworkHeader.pt2pt.Data_Packet_Type =
MUHWI_PT2PT_DATA_PACKET_TYPE;
desc->PacketHeader.NetworkHeader.pt2pt.Byte3.Byte3 =
MUHWI_PACKET_VIRTUAL_CHANNEL_DETERMINISTIC;
desc->PacketHeader.NetworkHeader.pt2pt.Byte8.Byte8 =
MUHWI_PACKET_TYPE_PUT;
desc->PacketHeader.NetworkHeader.pt2pt.Byte8.Size = 16;
desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Rec_Payload_Base_Address_Id =
FI_BGQ_MU_BAT_ID_GLOBAL;
desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Pacing =
MUHWI_PACKET_DIRECT_PUT_IS_NOT_PACED;
desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Rec_Counter_Base_Address_Id =
FI_BGQ_MU_BAT_ID_COUNTER;
desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Counter_Offset = 0;
union fi_bgq_mu_descriptor * fi_desc = (union fi_bgq_mu_descriptor *)desc;
fi_desc->rma.update_type = FI_BGQ_MU_DESCRIPTOR_UPDATE_BAT_TYPE_DST;
/* specified at injection time */
desc->Pa_Payload = 0;
desc->Message_Length = 0;
desc->Torus_FIFO_Map = -1;
desc->PacketHeader.NetworkHeader.pt2pt.Destination.Destination.Destination = -1;
/* TODO counter update model */
}
/*
* fi_read*() descriptor models
*/
{
bgq_ep->tx.read.global_one_paddr =
fi_bgq_node_bat_read(&bgq_domain->fabric->node,
FI_BGQ_MU_BAT_ID_ONE);
bgq_ep->tx.read.global_zero_paddr =
fi_bgq_node_bat_read(&bgq_domain->fabric->node,
FI_BGQ_MU_BAT_ID_ZERO);
MUHWI_Descriptor_t * desc = NULL;
union fi_bgq_mu_packet_hdr * hdr = NULL;
/* memory-fifo model */
desc = &bgq_ep->tx.read.emulation.mfifo_model;
MUSPI_DescriptorZeroOut(desc);
desc->Half_Word0.Prefetch_Only =
MUHWI_DESCRIPTOR_PRE_FETCH_ONLY_NO;
desc->Half_Word1.Interrupt =
MUHWI_DESCRIPTOR_DO_NOT_INTERRUPT_ON_PACKET_ARRIVAL;
desc->PacketHeader.NetworkHeader.pt2pt.Destination =
fi_bgq_uid_get_destination(self.uid.fi);
desc->PacketHeader.NetworkHeader.pt2pt.Data_Packet_Type =
MUHWI_PT2PT_DATA_PACKET_TYPE;
desc->PacketHeader.NetworkHeader.pt2pt.Byte3.Byte3 =
MUHWI_PACKET_VIRTUAL_CHANNEL_DETERMINISTIC;
desc->PacketHeader.NetworkHeader.pt2pt.Byte8.Byte8 =
MUHWI_PACKET_TYPE_FIFO;
desc->PacketHeader.NetworkHeader.pt2pt.Byte8.Size = 16;
hdr = (union fi_bgq_mu_packet_hdr *) &desc->PacketHeader;
fi_bgq_mu_packet_type_set(hdr, FI_BGQ_MU_PACKET_TYPE_RMA);
hdr->rma.nbytes = 0; /* no immediate bytes to 'put' for a read operation */
hdr->rma.key = (uint64_t)-1; /* not used when nbytes == 0 */
hdr->rma.offset = 0; /* not used when nbytes == 0 */
/* ==== specified at injection time ==== */
desc->Torus_FIFO_Map = -1;
desc->PacketHeader.NetworkHeader.pt2pt.Destination.Destination.Destination = -1;
desc->Pa_Payload = 0;
desc->Message_Length = 0;
desc->PacketHeader.messageUnitHeader.Packet_Types.Memory_FIFO.Rec_FIFO_Id = -1;
/* ==== specified at injection time ==== */
/* direct-put model */
desc = &bgq_ep->tx.read.emulation.dput_model;
MUSPI_DescriptorZeroOut(desc);
desc->Half_Word0.Prefetch_Only =
MUHWI_DESCRIPTOR_PRE_FETCH_ONLY_NO;
desc->Half_Word1.Interrupt =
MUHWI_DESCRIPTOR_DO_NOT_INTERRUPT_ON_PACKET_ARRIVAL;
desc->PacketHeader.NetworkHeader.pt2pt.Data_Packet_Type =
MUHWI_PT2PT_DATA_PACKET_TYPE;
desc->PacketHeader.NetworkHeader.pt2pt.Byte3.Byte3 =
MUHWI_PACKET_VIRTUAL_CHANNEL_DETERMINISTIC;
desc->PacketHeader.NetworkHeader.pt2pt.Byte8.Byte8 =
MUHWI_PACKET_TYPE_PUT;
desc->PacketHeader.NetworkHeader.pt2pt.Byte8.Size = 16;
desc->PacketHeader.NetworkHeader.pt2pt.Destination =
fi_bgq_uid_get_destination(self.uid.fi);
desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Rec_Payload_Base_Address_Id =
FI_BGQ_MU_BAT_ID_GLOBAL;
desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Pacing =
MUHWI_PACKET_DIRECT_PUT_IS_NOT_PACED;
desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Rec_Counter_Base_Address_Id =
FI_BGQ_MU_BAT_ID_COUNTER;
desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Counter_Offset = 0;
union fi_bgq_mu_descriptor * fi_desc = (union fi_bgq_mu_descriptor *)desc;
fi_desc->rma.update_type = FI_BGQ_MU_DESCRIPTOR_UPDATE_BAT_TYPE_SRC;
/* ==== specified at injection time ==== */
desc->Torus_FIFO_Map = -1;
desc->Message_Length = 0;
desc->Pa_Payload = 0;
fi_desc->rma.key_msb = 0; /* TODO - change this when key size > 48b */
fi_desc->rma.key_lsb = -1;
/* ==== specified at injection time ==== */
/* "counter" completion direct-put model */
desc = &bgq_ep->tx.read.cntr_model;
MUSPI_DescriptorZeroOut(desc);
desc->Half_Word0.Prefetch_Only =
MUHWI_DESCRIPTOR_PRE_FETCH_ONLY_NO;
desc->Half_Word1.Interrupt =
MUHWI_DESCRIPTOR_DO_NOT_INTERRUPT_ON_PACKET_ARRIVAL;
desc->PacketHeader.NetworkHeader.pt2pt.Data_Packet_Type =
MUHWI_PT2PT_DATA_PACKET_TYPE;
desc->PacketHeader.NetworkHeader.pt2pt.Byte3.Byte3 =
MUHWI_PACKET_VIRTUAL_CHANNEL_DETERMINISTIC;
desc->PacketHeader.NetworkHeader.pt2pt.Byte8.Byte8 =
MUHWI_PACKET_TYPE_PUT;
desc->PacketHeader.NetworkHeader.pt2pt.Byte8.Size = 16;
desc->PacketHeader.NetworkHeader.pt2pt.Destination =
fi_bgq_uid_get_destination(self.uid.fi);
desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Pacing =
MUHWI_PACKET_DIRECT_PUT_IS_NOT_PACED;
desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Counter_Offset = 0;
desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Rec_Counter_Base_Address_Id =
FI_BGQ_MU_BAT_ID_COUNTER;
desc->Pa_Payload = bgq_ep->tx.read.global_one_paddr;
desc->Message_Length = 8;
/* ==== specified at injection time ==== */
desc->Torus_FIFO_Map = -1;
MUSPI_SetRecPayloadBaseAddressInfo(desc, FI_BGQ_MU_BAT_ID_GLOBAL, 0); /* offset will add atomic-ness at runtime */
/* ==== specified at injection time ==== */
/* "cq" completion direct-put model */
desc = &bgq_ep->tx.read.cq_model;
MUSPI_DescriptorZeroOut(desc);
desc->Half_Word0.Prefetch_Only =
MUHWI_DESCRIPTOR_PRE_FETCH_ONLY_NO;
desc->Half_Word1.Interrupt =
MUHWI_DESCRIPTOR_DO_NOT_INTERRUPT_ON_PACKET_ARRIVAL;
desc->PacketHeader.NetworkHeader.pt2pt.Data_Packet_Type =
MUHWI_PT2PT_DATA_PACKET_TYPE;
desc->PacketHeader.NetworkHeader.pt2pt.Byte3.Byte3 =
MUHWI_PACKET_VIRTUAL_CHANNEL_DETERMINISTIC;
desc->PacketHeader.NetworkHeader.pt2pt.Byte8.Byte8 =
MUHWI_PACKET_TYPE_PUT;
desc->PacketHeader.NetworkHeader.pt2pt.Byte8.Size = 16;
desc->PacketHeader.NetworkHeader.pt2pt.Destination =
fi_bgq_uid_get_destination(self.uid.fi);
desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Pacing =
MUHWI_PACKET_DIRECT_PUT_IS_NOT_PACED;
desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Counter_Offset = 0;
desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Rec_Counter_Base_Address_Id =
FI_BGQ_MU_BAT_ID_COUNTER;
desc->Pa_Payload = bgq_ep->tx.read.global_zero_paddr;
desc->Message_Length = 8;
/* ==== specified at injection time ==== */
desc->Torus_FIFO_Map = -1;
MUSPI_SetRecPayloadBaseAddressInfo(desc, FI_BGQ_MU_BAT_ID_GLOBAL, 0);
/* ==== specified at injection time ==== */
}
/*
* fi_atomic*() descriptor models
*/
{
MUHWI_Descriptor_t * desc = NULL;
union fi_bgq_mu_packet_hdr * hdr = NULL;
/*
* emulation memory-fifo model
*/
desc = &bgq_ep->tx.atomic.emulation.mfifo_model;
MUSPI_DescriptorZeroOut(desc);
desc->Half_Word0.Prefetch_Only =
MUHWI_DESCRIPTOR_PRE_FETCH_ONLY_NO;
desc->Half_Word1.Interrupt =
MUHWI_DESCRIPTOR_DO_NOT_INTERRUPT_ON_PACKET_ARRIVAL;
desc->PacketHeader.NetworkHeader.pt2pt.Destination =
fi_bgq_uid_get_destination(self.uid.fi);
desc->PacketHeader.NetworkHeader.pt2pt.Data_Packet_Type =
MUHWI_PT2PT_DATA_PACKET_TYPE;
desc->PacketHeader.NetworkHeader.pt2pt.Byte3.Byte3 =
MUHWI_PACKET_VIRTUAL_CHANNEL_DETERMINISTIC;
desc->PacketHeader.NetworkHeader.pt2pt.Byte8.Byte8 =
MUHWI_PACKET_TYPE_FIFO;
desc->PacketHeader.NetworkHeader.pt2pt.Byte8.Size = 16;
desc->Message_Length = sizeof(MUHWI_Descriptor_t);
hdr = (union fi_bgq_mu_packet_hdr *) &desc->PacketHeader;
fi_bgq_mu_packet_type_set(hdr, FI_BGQ_MU_PACKET_TYPE_ATOMIC);
hdr->atomic.origin = fi_bgq_uid_get_destination(self.uid.fi);
/* ==== specified at injection time ==== */
desc->Torus_FIFO_Map = -1;
desc->PacketHeader.NetworkHeader.pt2pt.Destination.Destination.Destination = -1;
desc->Pa_Payload = 0;
/* emulation memory-fifo fence model */
desc = &bgq_ep->tx.atomic.emulation.fence.mfifo_model;
MUSPI_DescriptorZeroOut(desc);
desc->Half_Word0.Prefetch_Only =
MUHWI_DESCRIPTOR_PRE_FETCH_ONLY_NO;
desc->Half_Word1.Interrupt =
MUHWI_DESCRIPTOR_DO_NOT_INTERRUPT_ON_PACKET_ARRIVAL;
desc->PacketHeader.NetworkHeader.pt2pt.Destination =
fi_bgq_uid_get_destination(self.uid.fi);
desc->PacketHeader.NetworkHeader.pt2pt.Data_Packet_Type =
MUHWI_PT2PT_DATA_PACKET_TYPE;
desc->PacketHeader.NetworkHeader.pt2pt.Byte3.Byte3 =
MUHWI_PACKET_VIRTUAL_CHANNEL_DETERMINISTIC;
desc->PacketHeader.NetworkHeader.pt2pt.Byte8.Byte8 =
MUHWI_PACKET_TYPE_FIFO;
desc->PacketHeader.NetworkHeader.pt2pt.Byte8.Size = 16;
desc->Message_Length = sizeof(MUHWI_Descriptor_t);
hdr = (union fi_bgq_mu_packet_hdr *) &desc->PacketHeader;
fi_bgq_mu_packet_type_set(hdr, FI_BGQ_MU_PACKET_TYPE_RMA);
hdr->rma.nbytes = 0; /* no immediate bytes to 'put' for a fence operation */
hdr->rma.key = (uint64_t)-1; /* not used when nbytes == 0 */
hdr->rma.offset = 0; /* not used when nbytes == 0 */
hdr->rma.ndesc = 1;
/* ==== specified at injection time ==== */
desc->Torus_FIFO_Map = -1;
desc->PacketHeader.NetworkHeader.pt2pt.Destination.Destination.Destination = -1;
desc->Pa_Payload = 0;
/* emulation direct-put fi_cntr increment model */
desc = &bgq_ep->tx.atomic.emulation.fence.cntr_model;
MUSPI_DescriptorZeroOut(desc);
desc->Half_Word0.Prefetch_Only =
MUHWI_DESCRIPTOR_PRE_FETCH_ONLY_NO;
desc->Half_Word1.Interrupt =
MUHWI_DESCRIPTOR_DO_NOT_INTERRUPT_ON_PACKET_ARRIVAL;
desc->PacketHeader.NetworkHeader.pt2pt.Data_Packet_Type =
MUHWI_PT2PT_DATA_PACKET_TYPE;
desc->PacketHeader.NetworkHeader.pt2pt.Byte3.Byte3 =
MUHWI_PACKET_VIRTUAL_CHANNEL_DETERMINISTIC;
desc->PacketHeader.NetworkHeader.pt2pt.Byte8.Byte8 =
MUHWI_PACKET_TYPE_PUT;
desc->PacketHeader.NetworkHeader.pt2pt.Byte8.Size = 16;
desc->PacketHeader.NetworkHeader.pt2pt.Destination =
fi_bgq_uid_get_destination(self.uid.fi);
desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Pacing =
MUHWI_PACKET_DIRECT_PUT_IS_NOT_PACED;
desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Counter_Offset = 0;
desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Rec_Counter_Base_Address_Id =
FI_BGQ_MU_BAT_ID_COUNTER;
desc->Pa_Payload = bgq_ep->tx.read.global_one_paddr;
desc->Message_Length = 8;
/* ==== specified at fi_cntr bind time ==== */
// MUSPI_SetRecPayloadBaseAddressInfo(desc, write_cntr->std.batid,
// MUSPI_GetAtomicAddress(0, MUHWI_ATOMIC_OPCODE_STORE_ADD));
/* ==== specified at injection time ==== */
desc->Torus_FIFO_Map = -1;
MUSPI_SetRecPayloadBaseAddressInfo(desc, FI_BGQ_MU_BAT_ID_GLOBAL, 0);
/* emulation direct-put cq byte counter clear model */
desc = &bgq_ep->tx.atomic.emulation.fence.cq_model;
MUSPI_DescriptorZeroOut(desc);
desc->Half_Word0.Prefetch_Only =
MUHWI_DESCRIPTOR_PRE_FETCH_ONLY_NO;
desc->Half_Word1.Interrupt =
MUHWI_DESCRIPTOR_DO_NOT_INTERRUPT_ON_PACKET_ARRIVAL;
desc->PacketHeader.NetworkHeader.pt2pt.Data_Packet_Type =
MUHWI_PT2PT_DATA_PACKET_TYPE;
desc->PacketHeader.NetworkHeader.pt2pt.Byte3.Byte3 =
MUHWI_PACKET_VIRTUAL_CHANNEL_DETERMINISTIC;
desc->PacketHeader.NetworkHeader.pt2pt.Byte8.Byte8 =
MUHWI_PACKET_TYPE_PUT;
desc->PacketHeader.NetworkHeader.pt2pt.Byte8.Size = 16;
desc->PacketHeader.NetworkHeader.pt2pt.Destination =
fi_bgq_uid_get_destination(self.uid.fi);
desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Pacing =
MUHWI_PACKET_DIRECT_PUT_IS_NOT_PACED;
desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Counter_Offset = 0;
desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Rec_Counter_Base_Address_Id =
FI_BGQ_MU_BAT_ID_COUNTER;
desc->Pa_Payload = bgq_ep->tx.read.global_zero_paddr;
desc->Message_Length = 8;
/* ==== specified at injection time ==== */
desc->Torus_FIFO_Map = -1;
MUSPI_SetRecPayloadBaseAddressInfo(desc, FI_BGQ_MU_BAT_ID_GLOBAL, 0);
}
bgq_ep->tx.state = FI_BGQ_EP_INITITALIZED_ENABLED;
return 0;
}