From: "Edgar E. Iglesias" <edgar.iglesias@gmail.com>
To: qemu-devel@nongnu.org
Cc: larper@axis.com
Subject: Re: [Qemu-devel] [PATCH] etraxfs-dma: Model metadata and eop
Date: Tue, 10 Jan 2012 16:16:28 +0100 [thread overview]
Message-ID: <20120110151628.GE7565@edde.se.axis.com> (raw)
In-Reply-To: <1326191247-14880-4-git-send-email-edgar.iglesias@gmail.com>
Forgot to CC Lars on this one.
Also note that this patch has tab issues due to the ETRAX DMA model beeing
written prior to CodingStyle.
Cheers
On Tue, Jan 10, 2012 at 11:27:27AM +0100, Edgar E. Iglesias wrote:
> From: Lars Persson <larper@axis.com>
>
> - Send EOP flags to the out channels.
> - Send data descriptor metadata to the out channels.
>
> Signed-off-by: Lars Persson <larper@axis.com>
> Signed-off-by: Edgar E. Iglesias <edgar.iglesias@gmail.com>
> ---
> hw/etraxfs_dma.c | 28 ++++++++++++++++++++++------
> hw/etraxfs_dma.h | 13 ++++++++++---
> hw/etraxfs_eth.c | 2 +-
> 3 files changed, 33 insertions(+), 10 deletions(-)
>
> diff --git a/hw/etraxfs_dma.c b/hw/etraxfs_dma.c
> index d2bd584..332525c 100644
> --- a/hw/etraxfs_dma.c
> +++ b/hw/etraxfs_dma.c
> @@ -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));
> diff --git a/hw/etraxfs_dma.h b/hw/etraxfs_dma.h
> index 96408ab..021c52a 100644
> --- a/hw/etraxfs_dma.h
> +++ b/hw/etraxfs_dma.h
> @@ -1,3 +1,8 @@
> +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;
> };
> diff --git a/hw/etraxfs_eth.c b/hw/etraxfs_eth.c
> index b525258..5afa55f 100644
> --- a/hw/etraxfs_eth.c
> +++ b/hw/etraxfs_eth.c
> @@ -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;
>
> --
> 1.7.3.4
>
>
next prev parent reply other threads:[~2012-01-10 15:16 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-01-10 10:27 [Qemu-devel] [PATCH] microblaze: Add support for the clz insn Edgar E. Iglesias
2012-01-10 10:27 ` [Qemu-devel] [PATCH] microblaze: Emulate the hw stackprotector Edgar E. Iglesias
2012-01-10 10:27 ` [Qemu-devel] [PATCH] microblaze: Break the tb at memory barriers Edgar E. Iglesias
2012-01-10 10:27 ` [Qemu-devel] [PATCH] etraxfs-dma: Model metadata and eop Edgar E. Iglesias
2012-01-10 15:16 ` Edgar E. Iglesias [this message]
2012-01-10 15:37 ` [Qemu-devel] [PATCH] microblaze: Add support for the clz insn Peter Maydell
2012-01-10 15:41 ` Edgar E. Iglesias
2012-01-10 23:19 ` Richard Henderson
2012-01-10 23:20 ` Edgar E. Iglesias
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20120110151628.GE7565@edde.se.axis.com \
--to=edgar.iglesias@gmail.com \
--cc=larper@axis.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).