From: Frederic Konrad <fred.konrad@greensocs.com>
To: Alistair Francis <alistair23@gmail.com>
Cc: Peter Maydell <peter.maydell@linaro.org>,
Peter Crosthwaite <peter.crosthwaite@xilinx.com>,
hyunk@xilinx.com, Mark Burton <mark.burton@greensocs.com>,
"qemu-devel@nongnu.org Developers" <qemu-devel@nongnu.org>,
Guillaume Delbergue <guillaume.delbergue@greensocs.com>
Subject: Re: [Qemu-devel] [PATCH V4 6/8] Introduce xilinx dpdma.
Date: Fri, 04 Sep 2015 11:01:51 +0200 [thread overview]
Message-ID: <55E95DFF.6040106@greensocs.com> (raw)
In-Reply-To: <CAKmqyKPAOSJwQz1p3jTne93yv7kqkhu=W7tPJVPuZDB2=CyNcQ@mail.gmail.com>
On 04/09/2015 01:34, Alistair Francis wrote:
> On Thu, Sep 3, 2015 at 12:28 AM, Frederic Konrad
> <fred.konrad@greensocs.com> wrote:
>> On 02/09/2015 23:39, Alistair Francis wrote:
>>> On Tue, Jul 21, 2015 at 10:17 AM, <fred.konrad@greensocs.com> wrote:
>>>> From: KONRAD Frederic <fred.konrad@greensocs.com>
>>>>
>>>> This is the implementation of the DPDMA.
>>>>
>>>> Signed-off-by: KONRAD Frederic <fred.konrad@greensocs.com>
>>>> ---
>>>> hw/dma/Makefile.objs | 1 +
>>>> hw/dma/xlnx_dpdma.c | 790
>>>> +++++++++++++++++++++++++++++++++++++++++++++++++++
>>>> hw/dma/xlnx_dpdma.h | 85 ++++++
>>>> 3 files changed, 876 insertions(+)
>>>> create mode 100644 hw/dma/xlnx_dpdma.c
>>>> create mode 100644 hw/dma/xlnx_dpdma.h
>>> What are the rules with the placement of the header files? Should the
>>> header be in the include directory instead of being here?
>> Probably moving headers to include/hw makes sense here..
>> I will change it.
> Hey Fred,
>
> Great, thanks
>
>> [...]
>>>> +
>>>> + if (xlnx_dpdma_desc_is_already_done(&desc)
>>>> + && !xlnx_dpdma_desc_ignore_done_bit(&desc)) {
>>> The second line of the if should be indented across.
>>>
>>> Also, I generally think the operator should go on the first line, but
>>> that doesn't seem worth changing throughout.
>> Ok I can do that.
>>
>>>> + /* We are trying to process an already processed descriptor.
>>>> */
>>>> + s->registers[DPDMA_EISR] |= ((1 << 25) << channel);
>>>> + xlnx_dpdma_update_irq(s);
>>>> + s->operation_finished[channel] = true;
>>>> + DPRINTF("Already processed descriptor..\n");
>>>> + break;
>>>> + }
>>>> +
>>>> + done = xlnx_dpdma_desc_is_last(&desc)
>>>> + || xlnx_dpdma_desc_is_last_of_frame(&desc);
>>>> +
>>>> + s->operation_finished[channel] = done;
>>>> + if (s->data[channel]) {
>>>> + int64_t transfer_len =
>>>> +
>>>> xlnx_dpdma_desc_get_transfer_size(&desc);
>>> Why is this over two lines?
>>
>> Probably because of the 79~80 columns limitation.
> It looks like it is less then 80 columns though.
Oh yes missed that when I replaced xilinx by xlnx in functions..
I fixed that.
Thanks,
Fred
>
> Thanks,
>
> Alistair
>
>> Thanks,
>> Fred
>>
>>> Functioanlly it looks fine.
>>>
>>> Besides the header file location, which someone else will need to comment
>>> on:
>>>
>>> Reviewed-by: Alistair Francis <alistair.francis@xilinx.com>
>>> Tested-By: Hyun Kwon <hyun.kwon@xilinx.com>
>>>
>>> Thanks,
>>>
>>> Alistair
>>>
>>>> + uint32_t line_size = xlnx_dpdma_desc_get_line_size(&desc);
>>>> + uint32_t line_stride =
>>>> xlnx_dpdma_desc_get_line_stride(&desc);
>>>> + if (xlnx_dpdma_desc_is_contiguous(&desc)) {
>>>> + source_addr[0] =
>>>> + xlnx_dpdma_desc_get_source_address(&desc,
>>>> 0);
>>>> + while (transfer_len != 0) {
>>>> + if (dma_memory_read(&address_space_memory,
>>>> + source_addr[0],
>>>> + &s->data[channel][ptr],
>>>> + line_size)) {
>>>> + s->registers[DPDMA_ISR] |= ((1 << 12) <<
>>>> channel);
>>>> + xlnx_dpdma_update_irq(s);
>>>> + DPRINTF("Can't get data.\n");
>>>> + break;
>>>> + }
>>>> + ptr += line_size;
>>>> + transfer_len -= line_size;
>>>> + source_addr[0] += line_stride;
>>>> + }
>>>> + } else {
>>>> + DPRINTF("Source address:\n");
>>>> + int frag;
>>>> + for (frag = 0; frag < 5; frag++) {
>>>> + source_addr[frag] =
>>>> + xlnx_dpdma_desc_get_source_address(&desc,
>>>> frag);
>>>> + DPRINTF("Fragment %u: %" PRIx64 "\n", frag + 1,
>>>> + source_addr[frag]);
>>>> + }
>>>> +
>>>> + frag = 0;
>>>> + while ((transfer_len < 0) && (frag < 5)) {
>>>> + size_t fragment_len = DPDMA_FRAG_MAX_SZ
>>>> + - (source_addr[frag] %
>>>> DPDMA_FRAG_MAX_SZ);
>>>> +
>>>> + if (dma_memory_read(&address_space_memory,
>>>> + source_addr[frag],
>>>> + &(s->data[channel][ptr]),
>>>> + fragment_len)) {
>>>> + s->registers[DPDMA_ISR] |= ((1 << 12) <<
>>>> channel);
>>>> + xlnx_dpdma_update_irq(s);
>>>> + DPRINTF("Can't get data.\n");
>>>> + break;
>>>> + }
>>>> + ptr += fragment_len;
>>>> + transfer_len -= fragment_len;
>>>> + frag += 1;
>>>> + }
>>>> + }
>>>> + }
>>>> +
>>>> + if (xlnx_dpdma_desc_update_enabled(&desc)) {
>>>> + /* The descriptor need to be updated when it's completed. */
>>>> + DPRINTF("update the descriptor with the done flag set.\n");
>>>> + xlnx_dpdma_desc_set_done(&desc);
>>>> + dma_memory_write(&address_space_memory, desc_addr, &desc,
>>>> + sizeof(DPDMADescriptor));
>>>> + }
>>>> +
>>>> + if (xlnx_dpdma_desc_completion_interrupt(&desc)) {
>>>> + DPRINTF("completion interrupt enabled!\n");
>>>> + s->registers[DPDMA_ISR] |= (1 << channel);
>>>> + xlnx_dpdma_update_irq(s);
>>>> + }
>>>> +
>>>> + } while (!done && !one_desc);
>>>> +
>>>> + return ptr;
>>>> +}
>>>> +
>>>> +void xlnx_dpdma_set_host_data_location(XlnxDPDMAState *s, uint8_t
>>>> channel,
>>>> + void *p)
>>>> +{
>>>> + if (!s) {
>>>> + qemu_log_mask(LOG_UNIMP, "DPDMA client not attached to valid
>>>> DPDMA"
>>>> + " instance\n");
>>>> + return;
>>>> + }
>>>> +
>>>> + assert(channel <= 5);
>>>> + s->data[channel] = p;
>>>> +}
>>>> +
>>>> +void xlnx_dpdma_trigger_vsync_irq(XlnxDPDMAState *s)
>>>> +{
>>>> + s->registers[DPDMA_ISR] |= (1 << 27);
>>>> + xlnx_dpdma_update_irq(s);
>>>> +}
>>>> +
>>>> +type_init(xlnx_dpdma_register_types)
>>>> diff --git a/hw/dma/xlnx_dpdma.h b/hw/dma/xlnx_dpdma.h
>>>> new file mode 100644
>>>> index 0000000..ae571a0
>>>> --- /dev/null
>>>> +++ b/hw/dma/xlnx_dpdma.h
>>>> @@ -0,0 +1,85 @@
>>>> +/*
>>>> + * xlnx_dpdma.h
>>>> + *
>>>> + * Copyright (C) 2015 : GreenSocs Ltd
>>>> + * http://www.greensocs.com/ , email: info@greensocs.com
>>>> + *
>>>> + * Developed by :
>>>> + * Frederic Konrad <fred.konrad@greensocs.com>
>>>> + *
>>>> + * This program is free software; you can redistribute it and/or modify
>>>> + * it under the terms of the GNU General Public License as published by
>>>> + * the Free Software Foundation, either version 2 of the License, or
>>>> + * (at your option) any later version.
>>>> + *
>>>> + * This program is distributed in the hope that it will be useful,
>>>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>>>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
>>>> + * GNU General Public License for more details.
>>>> + *
>>>> + * You should have received a copy of the GNU General Public License
>>>> along
>>>> + * with this program; if not, see <http://www.gnu.org/licenses/>.
>>>> + *
>>>> + */
>>>> +
>>>> +#ifndef XLNX_DPDMA_H
>>>> +#define XLNX_DPDMA_H
>>>> +
>>>> +#include "hw/sysbus.h"
>>>> +#include "ui/console.h"
>>>> +#include "sysemu/dma.h"
>>>> +
>>>> +#define XLNX_DPDMA_REG_ARRAY_SIZE (0x1000 >> 2)
>>>> +
>>>> +struct XlnxDPDMAState {
>>>> + /*< private >*/
>>>> + SysBusDevice parent_obj;
>>>> + /*< public >*/
>>>> + MemoryRegion iomem;
>>>> + uint32_t registers[XLNX_DPDMA_REG_ARRAY_SIZE];
>>>> + uint8_t *data[6];
>>>> + bool operation_finished[6];
>>>> + qemu_irq irq;
>>>> +};
>>>> +
>>>> +typedef struct XlnxDPDMAState XlnxDPDMAState;
>>>> +
>>>> +#define TYPE_XLNX_DPDMA "xlnx.dpdma"
>>>> +#define XLNX_DPDMA(obj) OBJECT_CHECK(XlnxDPDMAState, (obj),
>>>> TYPE_XLNX_DPDMA)
>>>> +
>>>> +/*
>>>> + * xlnx_dpdma_start_operation: Start the operation on the specified
>>>> channel. The
>>>> + * DPDMA gets the current descriptor and
>>>> retrieves
>>>> + * data to the buffer specified by
>>>> + * dpdma_set_host_data_location().
>>>> + *
>>>> + * Returns The number of bytes transfered by the DPDMA or 0 if an error
>>>> occured.
>>>> + *
>>>> + * @s The DPDMA state.
>>>> + * @channel The channel to start.
>>>> + */
>>>> +size_t xlnx_dpdma_start_operation(XlnxDPDMAState *s, uint8_t channel,
>>>> + bool one_desc);
>>>> +
>>>> +/*
>>>> + * xlnx_dpdma_set_host_data_location: Set the location in the host
>>>> memory where
>>>> + * to store the data out from the dma
>>>> + * channel.
>>>> + *
>>>> + * @s The DPDMA state.
>>>> + * @channel The channel associated to the pointer.
>>>> + * @p The buffer where to store the data.
>>>> + */
>>>> +/* XXX: add a maximum size arg and send an interrupt in case of
>>>> overflow. */
>>>> +void xlnx_dpdma_set_host_data_location(XlnxDPDMAState *s, uint8_t
>>>> channel,
>>>> + void *p);
>>>> +
>>>> +/*
>>>> + * xlnx_dpdma_trigger_vsync_irq: Trigger a VSYNC IRQ when the display is
>>>> + * updated.
>>>> + *
>>>> + * @s The DPDMA state.
>>>> + */
>>>> +void xlnx_dpdma_trigger_vsync_irq(XlnxDPDMAState *s);
>>>> +
>>>> +#endif /* !XLNX_DPDMA_H */
>>>> --
>>>> 1.9.0
>>>>
>>>>
next prev parent reply other threads:[~2015-09-04 9:11 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-07-21 17:17 [Qemu-devel] [PATCH V4 0/8] Xilinx DisplayPort fred.konrad
2015-07-21 17:17 ` [Qemu-devel] [PATCH V4 1/8] i2cbus: remove unused dev field fred.konrad
2015-09-01 20:58 ` Alistair Francis
2015-09-01 22:52 ` Alistair Francis
2015-09-04 22:50 ` Frederic Konrad
2015-09-04 23:43 ` Alistair Francis
2015-09-05 19:44 ` Peter Crosthwaite
2015-07-21 17:17 ` [Qemu-devel] [PATCH V4 2/8] Introduce AUX bus fred.konrad
2015-09-01 21:48 ` Alistair Francis
2015-09-02 0:00 ` Alistair Francis
2015-09-04 22:51 ` Frederic Konrad
2015-07-21 17:17 ` [Qemu-devel] [PATCH V4 3/8] i2c: implement broadcast write fred.konrad
2015-09-01 22:53 ` Alistair Francis
2015-07-21 17:17 ` [Qemu-devel] [PATCH V4 4/8] introduce dpcd module fred.konrad
2015-09-01 23:19 ` Alistair Francis
2015-09-04 22:54 ` Frederic Konrad
2015-07-21 17:17 ` [Qemu-devel] [PATCH V4 5/8] hw/i2c-ddc.c: Implement DDC I2C slave fred.konrad
2015-09-01 23:55 ` Alistair Francis
2015-07-21 17:17 ` [Qemu-devel] [PATCH V4 6/8] Introduce xilinx dpdma fred.konrad
2015-09-02 21:39 ` Alistair Francis
2015-09-03 7:28 ` Frederic Konrad
2015-09-03 23:34 ` Alistair Francis
2015-09-04 9:01 ` Frederic Konrad [this message]
2015-09-04 18:21 ` Alistair Francis
2015-07-21 17:17 ` [Qemu-devel] [PATCH V4 7/8] Introduce xilinx dp fred.konrad
2015-07-21 17:17 ` [Qemu-devel] [PATCH V4 8/8] arm: xlnx-zynqmp: Add DisplayPort and DPDMA fred.konrad
2015-09-01 17:24 ` [Qemu-devel] [PATCH V4 0/8] Xilinx DisplayPort Peter Maydell
2015-09-01 21:08 ` Alistair Francis
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=55E95DFF.6040106@greensocs.com \
--to=fred.konrad@greensocs.com \
--cc=alistair23@gmail.com \
--cc=guillaume.delbergue@greensocs.com \
--cc=hyunk@xilinx.com \
--cc=mark.burton@greensocs.com \
--cc=peter.crosthwaite@xilinx.com \
--cc=peter.maydell@linaro.org \
--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).