blob: d8dcf844152b2a62b974ddcad84e16ab825deda8 [file] [log] [blame]
#ifndef __JPEG_ENC_H_
#define __JPEG_ENC_H_
#include <linux/dma-buf.h>
#define JPEGENC_DEVINFO_M8 "AML-M8"
#define JPEGENC_DEVINFO_G9 "AML-G9"
#define JPEGENC_DEVINFO_GXBB "AML-GXBB"
#define JPEGENC_DEVINFO_GXTVBB "AML-GXTVBB"
#define JPEGENC_DEVINFO_GXL "AML-GXL"
/* M8: 2550/10 = 255M GX: 2000/10 = 200M */
#define JPEGENC_HDEC_L0() WRITE_HHI_REG(HHI_VDEC_CLK_CNTL, \
(2 << 25) | (1 << 16) | (1 << 24) | \
(0xffff & READ_HHI_REG(HHI_VDEC_CLK_CNTL)))
/* M8: 2550/8 = 319M GX: 2000/8 = 250M */
#define JPEGENC_HDEC_L1() WRITE_HHI_REG(HHI_VDEC_CLK_CNTL, \
(0 << 25) | (1 << 16) | (1 << 24) | \
(0xffff & READ_HHI_REG(HHI_VDEC_CLK_CNTL)))
/* M8: 2550/7 = 364M GX: 2000/7 = 285M */
#define JPEGENC_HDEC_L2() WRITE_HHI_REG(HHI_VDEC_CLK_CNTL, \
(3 << 25) | (0 << 16) | (1 << 24) | \
(0xffff & READ_HHI_REG(HHI_VDEC_CLK_CNTL)))
/* M8: 2550/6 = 425M GX: 2000/6 = 333M */
#define JPEGENC_HDEC_L3() WRITE_HHI_REG(HHI_VDEC_CLK_CNTL, \
(1 << 25) | (1 << 16) | (1 << 24) | \
(0xffff & READ_HHI_REG(HHI_VDEC_CLK_CNTL)))
/* M8: 2550/5 = 510M GX: 2000/5 = 400M */
#define JPEGENC_HDEC_L4() WRITE_HHI_REG(HHI_VDEC_CLK_CNTL, \
(2 << 25) | (0 << 16) | (1 << 24) | \
(0xffff & READ_HHI_REG(HHI_VDEC_CLK_CNTL)))
/* M8: 2550/4 = 638M GX: 2000/4 = 500M */
#define JPEGENC_HDEC_L5() WRITE_HHI_REG(HHI_VDEC_CLK_CNTL, \
(0 << 25) | (0 << 16) | (1 << 24) | \
(0xffff & READ_HHI_REG(HHI_VDEC_CLK_CNTL)))
/* M8: 2550/3 = 850M GX: 2000/3 = 667M */
#define JPEGENC_HDEC_L6() WRITE_HHI_REG(HHI_VDEC_CLK_CNTL, \
(1 << 25) | (0 << 16) | (1 << 24) | \
(0xffff & READ_HHI_REG(HHI_VDEC_CLK_CNTL)))
#define jpegenc_clock_enable(level) \
do { \
if (level == 0) \
JPEGENC_HDEC_L0(); \
else if (level == 1) \
JPEGENC_HDEC_L1(); \
else if (level == 2) \
JPEGENC_HDEC_L2(); \
else if (level == 3) \
JPEGENC_HDEC_L3(); \
else if (level == 4) \
JPEGENC_HDEC_L4(); \
else if (level == 5) \
JPEGENC_HDEC_L5(); \
else if (level == 6) \
JPEGENC_HDEC_L6(); \
WRITE_VREG_BITS(DOS_GCLK_EN0, 0x7fff, 12, 15); \
} while (0)
#define jpegenc_clock_disable() \
do { \
WRITE_VREG_BITS(DOS_GCLK_EN0, 0, 12, 15); \
WRITE_HHI_REG_BITS(HHI_VDEC_CLK_CNTL, 0, 24, 1); \
} while (0)
#define JPEGENC_IOC_MAGIC 'J'
#define JPEGENC_IOC_GET_DEVINFO _IOW(JPEGENC_IOC_MAGIC, 0xf0, u32)
#define JPEGENC_IOC_GET_BUFFINFO _IOW(JPEGENC_IOC_MAGIC, 0x00, u32)
#define JPEGENC_IOC_CONFIG_INIT _IOW(JPEGENC_IOC_MAGIC, 0x01, u32)
#define JPEGENC_IOC_NEW_CMD _IOW(JPEGENC_IOC_MAGIC, 0x02, u32)
#define JPEGENC_IOC_GET_STAGE _IOW(JPEGENC_IOC_MAGIC, 0x03, u32)
#define JPEGENC_IOC_GET_OUTPUT_SIZE _IOW(JPEGENC_IOC_MAGIC, 0x04, u32)
#define JPEGENC_IOC_SET_EXT_QUANT_TABLE _IOW(JPEGENC_IOC_MAGIC, 0x05, u32)
#define JPEGENC_IOC_QUERY_DMA_SUPPORT _IOW(JPEGENC_IOC_MAGIC, 0x06, u32)
#define JPEGENC_IOC_CONFIG_DMA_INPUT _IOW(JPEGENC_IOC_MAGIC, 0x07, s32)
#define JPEGENC_IOC_RELEASE_DMA_INPUT _IOW(JPEGENC_IOC_MAGIC, 0x08, u32)
#define DCTSIZE2 64
#define JPEGENC_FLUSH_FLAG_INPUT 0x1
#define JPEGENC_FLUSH_FLAG_OUTPUT 0x2
/* Define Quantization table: Max two tables */
#define QUANT_SEL_COMP0 0
#define QUANT_SEL_COMP1 1
#define QUANT_SEL_COMP2 1
/* Define Huffman table selection: Max two tables per DC/AC */
#define DC_HUFF_SEL_COMP0 0
#define DC_HUFF_SEL_COMP1 1
#define DC_HUFF_SEL_COMP2 1
#define AC_HUFF_SEL_COMP0 0
#define AC_HUFF_SEL_COMP1 1
#define AC_HUFF_SEL_COMP2 1
/* DCT interrupt select:0=Disable intr;
1=Intr at end of each 8x8 block of DCT input;
2=Intr at end of each MCU of DCT input;
3=Intr at end of a scan of DCT input;
4=Intr at end of each 8x8 block of DCT output;
5=Intr at end of each MCU of DCT output;
6=Intr at end of a scan of DCT output; */
#define JDCT_INTR_SEL 0
/* 0=Mark last coeff at the end of an 8x8 block,
1=Mark last coeff at the end of an MCU
2=Mark last coeff at the end of a scan */
#define JDCT_LASTCOEFF_SEL 1
enum jpegenc_mem_type_e {
JPEGENC_LOCAL_BUFF = 0,
JPEGENC_CANVAS_BUFF,
JPEGENC_PHYSICAL_BUFF,
JPEGENC_DMA_BUFF,
JPEGENC_MAX_BUFF_TYPE
};
enum jpegenc_frame_fmt_e {
JPEGENC_FMT_YUV422_SINGLE = 0,
JPEGENC_FMT_YUV444_SINGLE,
JPEGENC_FMT_NV21,
JPEGENC_FMT_NV12,
JPEGENC_FMT_YUV420,
JPEGENC_FMT_YUV444_PLANE,
JPEGENC_FMT_RGB888,
JPEGENC_FMT_RGB888_PLANE,
JPEGENC_FMT_RGB565,
JPEGENC_FMT_RGBA8888,
JPEGENC_FMT_YUV422_12BIT,
JPEGENC_FMT_YUV444_10BIT,
JPEGENC_FMT_YUV422_10BIT,
JPEGENC_MAX_FRAME_FMT
};
struct Jpegenc_Buff_s {
u32 buf_start;
u32 buf_size;
};
struct Jpegenc_BuffInfo_s {
u32 lev_id;
u32 max_width;
u32 max_height;
u32 min_buffsize;
struct Jpegenc_Buff_s input;
struct Jpegenc_Buff_s assit;
struct Jpegenc_Buff_s bitstream;
};
struct jpegenc_request_s {
u32 src;
u32 encoder_width;
u32 encoder_height;
u32 framesize;
u32 jpeg_quality;
u32 QuantTable_id;
u32 flush_flag;
u32 block_mode;
enum jpegenc_mem_type_e type;
enum jpegenc_frame_fmt_e input_fmt;
enum jpegenc_frame_fmt_e output_fmt;
u32 y_off;
u32 u_off;
u32 v_off;
u32 y_stride;
u32 u_stride;
u32 v_stride;
u32 h_stride;
};
struct jpegenc_meminfo_s {
u32 buf_start;
u32 buf_size;
u8 cur_buf_lev;
#ifdef CONFIG_CMA
ulong cma_pool_size;
#endif
struct Jpegenc_Buff_s reserve_mem;
struct Jpegenc_BuffInfo_s *bufspec;
};
struct jpegenc_wq_s {
u32 hw_status;
u32 headbytes;
u32 output_size;
u32 buf_start;
u32 buf_size;
u32 InputBuffStart;
u32 InputBuffEnd;
u32 AssitStart;
u32 AssitEnd;
u32 BitstreamStart;
u32 BitstreamEnd;
void __iomem *AssitstreamStartVirtAddr;
u32 max_width;
u32 max_height;
struct jpegenc_request_s cmd;
atomic_t ready;
wait_queue_head_t complete;
#ifdef CONFIG_CMA
struct page *venc_pages;
#endif
struct enc_dma_cfg *dma_input;
};
struct jpegenc_manager_s {
u32 encode_hw_status;
s32 irq_num;
bool irq_requested;
bool process_irq;
bool inited;
bool use_reserve;
bool use_cma;
u8 opened;
spinlock_t sem_lock;
struct platform_device *this_pdev;
struct jpegenc_meminfo_s mem;
struct jpegenc_wq_s wq;
struct tasklet_struct tasklet;
};
struct enc_dma_cfg {
int fd;
size_t size;
void *dev;
void *vaddr;
void *paddr;
struct dma_buf *dbuf;
struct dma_buf_attachment *attach;
struct sg_table *sg;
enum dma_data_direction dir;
};
/********************************************
* AV Scratch Register Re-Define
********************************************/
#define JPEGENC_ENCODER_STATUS HCODEC_HENC_SCRATCH_0
#define JPEGENC_BITSTREAM_OFFSET HCODEC_HENC_SCRATCH_1
/*********************************************
* ENCODER_STATUS define
********************************************/
#define JPEGENC_ENCODER_IDLE 0
#define JPEGENC_ENCODER_START 1
/* #define JPEGENC_ENCODER_SOS_HEADER 2 */
#define JPEGENC_ENCODER_MCU 3
#define JPEGENC_ENCODER_DONE 4
extern bool jpegenc_on(void);
#define JPEGENC_IOC_NEW_CMD2 _IOW(JPEGENC_IOC_MAGIC, 0x09, struct jpegenc_request_s)
#endif