#ifndef VMF_VECTOR_DMA_H
#define VMF_VECTOR_DMA_H

#include <stdint.h>

/* Opaque DMA handles */
typedef struct VMF_DMA_HANDLE_S     VMF_DMA_HANDLE_T;
typedef struct VMF_DMA_DESCRIPTOR_S VMF_DMA_DESCRIPTOR_T;

/* MemBroker alignment type enum: ALIGN_TYPE_32_BYTE = 5 (not the byte value) */
#define VMF_ALIGN_TYPE_DEFAULT  5u

/* DMA descriptor type enum */
typedef enum {
    DMA_1D = 0,
    DMA_2D = 1,
} VMF_DMA_TYPE_E;

/* 2D copy filter init struct */
typedef struct {
    uint32_t  dwProcessCbCr;    /* 1 = process chroma plane */
    uint32_t  dwSrcFormatFlag;  /* source pixel format flag */
    uint32_t  dwReserved[6];
} VMF_DMA_2DCF_INIT_T;

/* DMA address / copy parameters */
typedef struct {
    uint32_t       dwCopyWidth;
    uint32_t       dwCopyHeight;
    unsigned char *pbySrcYPhysAddr;
    unsigned char *pbySrcCbPhysAddr;
    unsigned char *pbySrcCrPhysAddr;
    unsigned char *pbyDstYPhysAddr;
    unsigned char *pbyDstCbPhysAddr;
    unsigned char *pbyDstCrPhysAddr;
    uint32_t       dwSrcStride;
    uint32_t       dwDstStride;
    uint32_t       _pad[4];
} VMF_DMA_ADDR_T;

/* DMA API */
VMF_DMA_HANDLE_T    *VMF_DMA_Init(uint32_t ch_id, uint32_t queue_depth);
void                 VMF_DMA_Release(VMF_DMA_HANDLE_T *handle);
VMF_DMA_DESCRIPTOR_T *VMF_DMA_Descriptor_Create(VMF_DMA_TYPE_E type, void *init_param);
void                 VMF_DMA_Descriptor_Destroy(VMF_DMA_DESCRIPTOR_T *desc);
int                  VMF_DMA_Copy(VMF_DMA_HANDLE_T *handle, VMF_DMA_DESCRIPTOR_T *desc,
                                  void *dst, void *src, uint32_t size);
int                  VMF_DMA_Descriptor_Update_Addr(VMF_DMA_DESCRIPTOR_T *desc, VMF_DMA_ADDR_T *addr);
int                  VMF_DMA_Setup(VMF_DMA_HANDLE_T *handle, VMF_DMA_DESCRIPTOR_T **descs, uint32_t count);
int                  VMF_DMA_Process(VMF_DMA_HANDLE_T *handle);

#endif /* VMF_VECTOR_DMA_H */
