qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH] etraxfs-dma: Model metadata and eop


From: Edgar E. Iglesias
Subject: Re: [Qemu-devel] [PATCH] etraxfs-dma: Model metadata and eop
Date: Tue, 10 Jan 2012 16:16:28 +0100
User-agent: Mutt/1.5.21 (2010-09-15)

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 <address@hidden>
> 
> - Send EOP flags to the out channels.
> - Send data descriptor metadata to the out channels.
> 
> Signed-off-by: Lars Persson <address@hidden>
> Signed-off-by: Edgar E. Iglesias <address@hidden>
> ---
>  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
> 
> 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]