Commit 73a511de authored by Lars Persson's avatar Lars Persson Committed by Edgar E. Iglesias
Browse files

etraxfs-dma: Model metadata and eop



- Send EOP flags to the out channels.
- Send data descriptor metadata to the out channels.

Signed-off-by: default avatarLars Persson <larper@axis.com>
Signed-off-by: default avatarEdgar E. Iglesias <edgar.iglesias@gmail.com>
parent 9f6113c7
Loading
Loading
Loading
Loading
+22 −6
Original line number Diff line number Diff line
@@ -401,15 +401,29 @@ static int channel_out_run(struct fs_dma_ctrl *ctrl, int c)
	uint32_t saved_data_buf;
	unsigned char buf[2 * 1024];

	struct dma_context_metadata meta;
	bool send_context = true;

	if (ctrl->channels[c].eol)
		return 0;

	do {
		bool out_eop;
		D(printf("ch=%d buf=%x after=%x\n",
			 c,
			 (uint32_t)ctrl->channels[c].current_d.buf,
			 (uint32_t)ctrl->channels[c].current_d.after));

		if (send_context) {
			if (ctrl->channels[c].client->client.metadata_push) {
				meta.metadata = ctrl->channels[c].current_d.md;
				ctrl->channels[c].client->client.metadata_push(
					ctrl->channels[c].client->client.opaque,
					&meta);
			}
			send_context = false;
		}

		channel_load_d(ctrl, c);
		saved_data_buf = channel_reg(ctrl, c, RW_SAVED_DATA_BUF);
		len = (uint32_t)(unsigned long)
@@ -420,13 +434,17 @@ static int channel_out_run(struct fs_dma_ctrl *ctrl, int c)
			len = sizeof buf;
		cpu_physical_memory_read (saved_data_buf, buf, len);

		D(printf("channel %d pushes %x %u bytes\n", c, 
			 saved_data_buf, len));
		out_eop = ((saved_data_buf + len) ==
		           ctrl->channels[c].current_d.after) &&
			ctrl->channels[c].current_d.out_eop;

		D(printf("channel %d pushes %x %u bytes eop=%u\n", c,
		         saved_data_buf, len, out_eop));

		if (ctrl->channels[c].client->client.push)
			ctrl->channels[c].client->client.push(
				ctrl->channels[c].client->client.opaque,
				buf, len);
				buf, len, out_eop);
		else
			printf("WARNING: DMA ch%d dataloss,"
			       " no attached client.\n", c);
@@ -437,11 +455,9 @@ static int channel_out_run(struct fs_dma_ctrl *ctrl, int c)
				ctrl->channels[c].current_d.after) {
			/* Done. Step to next.  */
			if (ctrl->channels[c].current_d.out_eop) {
				/* TODO: signal eop to the client.  */
				D(printf("signal eop\n"));
				send_context = true;
			}
			if (ctrl->channels[c].current_d.intr) {
				/* TODO: signal eop to the client.  */
				/* data intr.  */
				D(printf("signal intr %d eol=%d\n",
					len, ctrl->channels[c].current_d.eol));
+10 −3
Original line number Diff line number Diff line
struct dma_context_metadata {
	/* data descriptor md */
	uint16_t metadata;
};

struct etraxfs_dma_client
{
	/* DMA controller. */
@@ -5,10 +10,12 @@ struct etraxfs_dma_client
	void *ctrl;

	/* client.  */
	struct
	{
		int (*push)(void *opaque, unsigned char *buf, int len);
	struct {
		int (*push)(void *opaque, unsigned char *buf,
		            int len, bool eop);
		void (*pull)(void *opaque);
		void (*metadata_push)(void *opaque,
		                      const struct dma_context_metadata *md);
		void *opaque;
	} client;
};
+1 −1
Original line number Diff line number Diff line
@@ -540,7 +540,7 @@ static ssize_t eth_receive(VLANClientState *nc, const uint8_t *buf, size_t size)
        return size;
}

static int eth_tx_push(void *opaque, unsigned char *buf, int len)
static int eth_tx_push(void *opaque, unsigned char *buf, int len, bool eop)
{
	struct fs_eth *eth = opaque;