static int fi_bgq_ep_tx_init()

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;
}