/*
 * 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 transferred by the DPDMA
 *         or 0 if an error occurred.
 *
 * @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 */
