blob: 5d35e4e0b39f52cabedfdafce4b73710977764c4 [file] [log] [blame]
/* Copyright (c) 2012-2015, 2018, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
* only version 2 as published by the Free Software Foundation.
*
* 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.
*/
#ifndef MSM_JPEG_HW_H
#define MSM_JPEG_HW_H
#include <media/msm_jpeg.h>
#include "msm_jpeg_hw_reg.h"
#include <linux/ion.h>
struct msm_jpeg_hw_buf {
struct msm_jpeg_buf vbuf;
struct file *file;
uint32_t framedone_len;
uint32_t y_buffer_addr;
uint32_t y_len;
uint32_t cbcr_buffer_addr;
uint32_t cbcr_len;
uint32_t num_of_mcu_rows;
int ion_fd;
uint32_t pln2_addr;
uint32_t pln2_len;
};
struct msm_jpeg_hw_pingpong {
uint8_t is_fe; /* 1: fe; 0: we */
struct msm_jpeg_hw_buf buf[2];
int buf_status[2];
int buf_active_index;
};
int msm_jpeg_hw_pingpong_update(struct msm_jpeg_hw_pingpong *pingpong_hw,
struct msm_jpeg_hw_buf *buf, void *base);
int msm_jpegdma_hw_pingpong_update(struct msm_jpeg_hw_pingpong *pingpong_hw,
struct msm_jpeg_hw_buf *buf, void *base);
void *msm_jpeg_hw_pingpong_irq(struct msm_jpeg_hw_pingpong *pingpong_hw);
void *msm_jpeg_hw_pingpong_active_buffer(struct msm_jpeg_hw_pingpong
*pingpong_hw);
void msm_jpeg_hw_irq_clear(uint32_t mask, uint32_t data, void *base);
void msm_jpegdma_hw_irq_clear(uint32_t mask, uint32_t data, void *base);
int msm_jpeg_hw_irq_get_status(void *base);
int msm_jpegdma_hw_irq_get_status(void *base);
long msm_jpeg_hw_encode_output_size(void *base);
#define MSM_JPEG_HW_MASK_COMP_FRAMEDONE \
MSM_JPEG_HW_IRQ_STATUS_FRAMEDONE_MASK
#define MSM_JPEG_HW_MASK_COMP_FE \
MSM_JPEG_HW_IRQ_STATUS_FE_RD_DONE_MASK
#define MSM_JPEG_HW_MASK_COMP_WE \
(MSM_JPEG_HW_IRQ_STATUS_WE_Y_PINGPONG_MASK | \
MSM_JPEG_HW_IRQ_STATUS_WE_CBCR_PINGPONG_MASK)
#define MSM_JPEG_HW_MASK_COMP_RESET_ACK \
MSM_JPEG_HW_IRQ_STATUS_RESET_ACK_MASK
#define MSM_JPEG_HW_MASK_COMP_ERR \
(MSM_JPEG_HW_IRQ_STATUS_DCD_UNESCAPED_FF | \
MSM_JPEG_HW_IRQ_STATUS_DCD_HUFFMAN_ERROR | \
MSM_JPEG_HW_IRQ_STATUS_DCD_COEFFICIENT_ERR | \
MSM_JPEG_HW_IRQ_STATUS_DCD_MISSING_BIT_STUFF | \
MSM_JPEG_HW_IRQ_STATUS_DCD_SCAN_UNDERFLOW | \
MSM_JPEG_HW_IRQ_STATUS_DCD_INVALID_RSM | \
MSM_JPEG_HW_IRQ_STATUS_DCD_INVALID_RSM_SEQ | \
MSM_JPEG_HW_IRQ_STATUS_DCD_MISSING_RSM | \
MSM_JPEG_HW_IRQ_STATUS_VIOLATION_MASK)
#define msm_jpeg_hw_irq_is_frame_done(jpeg_irq_status) \
(jpeg_irq_status & MSM_JPEG_HW_MASK_COMP_FRAMEDONE)
#define msm_jpeg_hw_irq_is_fe_pingpong(jpeg_irq_status) \
(jpeg_irq_status & MSM_JPEG_HW_MASK_COMP_FE)
#define msm_jpeg_hw_irq_is_we_pingpong(jpeg_irq_status) \
(jpeg_irq_status & MSM_JPEG_HW_MASK_COMP_WE)
#define msm_jpeg_hw_irq_is_reset_ack(jpeg_irq_status) \
(jpeg_irq_status & MSM_JPEG_HW_MASK_COMP_RESET_ACK)
#define msm_jpeg_hw_irq_is_err(jpeg_irq_status) \
(jpeg_irq_status & MSM_JPEG_HW_MASK_COMP_ERR)
#define MSM_JPEGDMA_HW_MASK_COMP_FRAMEDONE \
MSM_JPEGDMA_HW_IRQ_STATUS_FRAMEDONE_MASK
#define MSM_JPEGDMA_HW_MASK_COMP_FE \
MSM_JPEGDMA_HW_IRQ_STATUS_FE_RD_DONE_MASK
#define MSM_JPEGDMA_HW_MASK_COMP_WE \
(MSM_JPEGDMA_HW_IRQ_STATUS_WE_WR_DONE_MASK)
#define MSM_JPEGDMA_HW_MASK_COMP_RESET_ACK \
MSM_JPEGDMA_HW_IRQ_STATUS_RESET_ACK_MASK
#define msm_jpegdma_hw_irq_is_frame_done(jpeg_irq_status) \
(jpeg_irq_status & MSM_JPEGDMA_HW_MASK_COMP_FRAMEDONE)
#define msm_jpegdma_hw_irq_is_fe_pingpong(jpeg_irq_status) \
(jpeg_irq_status & MSM_JPEGDMA_HW_MASK_COMP_FE)
#define msm_jpegdma_hw_irq_is_we_pingpong(jpeg_irq_status) \
(jpeg_irq_status & MSM_JPEGDMA_HW_MASK_COMP_WE)
#define msm_jpegdma_hw_irq_is_reset_ack(jpeg_irq_status) \
(jpeg_irq_status & MSM_JPEGDMA_HW_MASK_COMP_RESET_ACK)
void msm_jpeg_hw_fe_buffer_update(struct msm_jpeg_hw_buf *p_input,
uint8_t pingpong_index, void *base);
void msm_jpeg_hw_we_buffer_update(struct msm_jpeg_hw_buf *p_input,
uint8_t pingpong_index, void *base);
void msm_jpegdma_hw_fe_buffer_update(struct msm_jpeg_hw_buf *p_input,
uint8_t pingpong_index, void *base);
void msm_jpegdma_hw_we_buffer_update(struct msm_jpeg_hw_buf *p_input,
uint8_t pingpong_index, void *base);
void msm_jpeg_hw_we_buffer_cfg(uint8_t is_realtime);
void msm_jpeg_hw_fe_mmu_prefetch(struct msm_jpeg_hw_buf *buf, void *base,
uint8_t decode_flag);
void msm_jpeg_hw_we_mmu_prefetch(struct msm_jpeg_hw_buf *buf, void *base,
uint8_t decode_flag);
void msm_jpegdma_hw_fe_mmu_prefetch(struct msm_jpeg_hw_buf *buf, void *base);
void msm_jpegdma_hw_we_mmu_prefetch(struct msm_jpeg_hw_buf *buf, void *base);
void msm_jpeg_hw_fe_start(void *base);
void msm_jpeg_hw_clk_cfg(void);
void msm_jpeg_hw_reset(void *base, int size);
void msm_jpeg_hw_irq_cfg(void);
uint32_t msm_jpeg_hw_read(struct msm_jpeg_hw_cmd *hw_cmd_p, void *base);
void msm_jpeg_hw_write(struct msm_jpeg_hw_cmd *hw_cmd_p, void *base);
int msm_jpeg_hw_wait(struct msm_jpeg_hw_cmd *hw_cmd_p, int m_us, void *base);
void msm_jpeg_hw_delay(struct msm_jpeg_hw_cmd *hw_cmd_p, int m_us);
int msm_jpeg_hw_exec_cmds(struct msm_jpeg_hw_cmd *hw_cmd_p,
uint32_t m_cmds, uint32_t max_size, void *base);
void msm_jpeg_hw_region_dump(int size);
void msm_jpeg_io_dump(void *base, int size);
void msm_jpeg_decode_status(void *base);
void msm_jpeg_hw_reset_dma(void *base, int size);
#endif /* MSM_JPEG_HW_H */