blob: 912df01e7d70cfd992c80330fabb9d60be2b3137 [file] [log] [blame]
/*
*
* Copyright (C) 2019 by Amlogic, Inc.
*
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
*/
#ifndef __VPU_MULTI_DRV_H__
#define __VPU_MULTI_DRV_H__
#include <linux/fs.h>
#include <linux/types.h>
#include <linux/compat.h>
#include <linux/dma-buf.h>
#define SUPPORT_SOURCE_RELEASE_INTERRUPT
/* DO NOT CHANGE THIS VALUE */
#define MAX_INST_HANDLE_SIZE 48
#define MAX_NUM_INSTANCE 6
#define MAX_NUM_VPU_CORE 1
#ifdef CONFIG_COMPAT
struct compat_vpudrv_buffer_t {
u32 size;
u32 cached;
compat_ulong_t phys_addr;
compat_ulong_t base; /* kernel logical address in use kernel */
compat_ulong_t virt_addr; /* virtual user space address */
};
#endif
struct vpudrv_buffer_t {
u32 size;
u32 cached;
ulong phys_addr;
ulong base; /* kernel logical address in use kernel */
ulong virt_addr; /* virtual user space address */
};
struct vpu_bit_firmware_info_t {
u32 size; /* size of this structure*/
u32 core_idx;
u32 reg_base_offset;
u16 bit_code[512];
};
struct vpudrv_inst_info_t {
u32 core_idx;
u32 inst_idx;
s32 inst_open_count; /* for output only*/
};
struct vpudrv_intr_info_t {
u32 timeout;
s32 intr_reason;
s32 intr_inst_index;
};
struct vpu_drv_context_t {
struct fasync_struct *async_queue;
ulong interrupt_reason[MAX_NUM_INSTANCE];
u32 interrupt_flag[MAX_NUM_INSTANCE];
u32 open_count; /*!<< device reference count. Not instance count */
};
/* To track the allocated memory buffer */
struct vpudrv_buffer_pool_t {
struct list_head list;
struct vpudrv_buffer_t vb;
struct file *filp;
};
/* To track the instance index and buffer in instance pool */
struct vpudrv_instanace_list_t {
struct list_head list;
ulong inst_idx;
ulong core_idx;
struct file *filp;
};
struct vpudrv_instance_pool_t {
u8 codecInstPool[MAX_NUM_INSTANCE][MAX_INST_HANDLE_SIZE];
};
struct vpudrv_dma_buf_info_t {
u32 num_planes;
int fd[3];
ulong phys_addr[3]; /* phys address for DMA buffer */
};
//hoan add for canvas
struct vpudrv_dma_buf_canvas_info_t {
u32 num_planes;
u32 canvas_index;
int fd[3];
ulong phys_addr[3]; /* phys address for DMA buffer */
};
//end
#ifdef CONFIG_COMPAT
struct compat_vpudrv_dma_buf_info_t {
u32 num_planes;
compat_int_t fd[3];
compat_ulong_t phys_addr[3]; /* phys address for DMA buffer */
};
struct compat_vpudrv_dma_buf_canvas_info_t {
u32 num_planes;
u32 canvas_index;
compat_int_t fd[3];
compat_ulong_t phys_addr[3]; /* phys address for DMA buffer */
};
#endif
struct vpu_dma_cfg {
int fd;
void *dev;
void *vaddr;
unsigned long paddr;
struct dma_buf *dbuf;
struct dma_buf_attachment *attach;
struct sg_table *sg;
enum dma_data_direction dir;
};
/* To track the occupied dma_buf */
struct vpudrv_dma_buf_pool_t {
struct list_head list;
struct vpu_dma_cfg dma_cfg;
struct file *filp;
};
#define VPUDRV_BUF_LEN struct vpudrv_buffer_t
#define VPUDRV_INST_LEN struct vpudrv_inst_info_t
#define VPUDRV_DMABUF_LEN struct vpudrv_dma_buf_info_t
//hoan add for canvas
#define VPUDRV_DMABUF_CANVAS_LEN struct vpudrv_dma_buf_canvas_info_t
//end
#ifdef CONFIG_COMPAT
#define VPUDRV_BUF_LEN32 struct compat_vpudrv_buffer_t
#define VPUDRV_DMABUF_LEN32 struct compat_vpudrv_dma_buf_info_t
//hoan add for canvas
#define VPUDRV_DMABUF_CANVAS_LEN32 struct compat_vpudrv_dma_buf_canvas_info_t
//end
#endif
#define VDI_MAGIC 'V'
#define VDI_IOCTL_ALLOCATE_PHYSICAL_MEMORY \
_IOW(VDI_MAGIC, 0, VPUDRV_BUF_LEN)
#define VDI_IOCTL_FREE_PHYSICALMEMORY \
_IOW(VDI_MAGIC, 1, VPUDRV_BUF_LEN)
#define VDI_IOCTL_WAIT_INTERRUPT \
_IOW(VDI_MAGIC, 2, struct vpudrv_intr_info_t)
#define VDI_IOCTL_SET_CLOCK_GATE \
_IOW(VDI_MAGIC, 3, u32)
#define VDI_IOCTL_RESET \
_IOW(VDI_MAGIC, 4, u32)
#define VDI_IOCTL_GET_INSTANCE_POOL \
_IOW(VDI_MAGIC, 5, VPUDRV_BUF_LEN)
#define VDI_IOCTL_GET_COMMON_MEMORY \
_IOW(VDI_MAGIC, 6, VPUDRV_BUF_LEN)
#define VDI_IOCTL_GET_RESERVED_VIDEO_MEMORY_INFO \
_IOW(VDI_MAGIC, 8, VPUDRV_BUF_LEN)
#define VDI_IOCTL_OPEN_INSTANCE \
_IOW(VDI_MAGIC, 9, VPUDRV_INST_LEN)
#define VDI_IOCTL_CLOSE_INSTANCE \
_IOW(VDI_MAGIC, 10, VPUDRV_INST_LEN)
#define VDI_IOCTL_GET_INSTANCE_NUM \
_IOW(VDI_MAGIC, 11, VPUDRV_INST_LEN)
#define VDI_IOCTL_GET_REGISTER_INFO \
_IOW(VDI_MAGIC, 12, VPUDRV_BUF_LEN)
#define VDI_IOCTL_GET_FREE_MEM_SIZE \
_IOW(VDI_MAGIC, 13, u32)
#define VDI_IOCTL_FLUSH_BUFFER \
_IOW(VDI_MAGIC, 14, VPUDRV_BUF_LEN)
#define VDI_IOCTL_CACHE_INV_BUFFER \
_IOW(VDI_MAGIC, 15, VPUDRV_BUF_LEN)
#define VDI_IOCTL_CONFIG_DMA \
_IOW(VDI_MAGIC, 16, VPUDRV_DMABUF_LEN)
#define VDI_IOCTL_UNMAP_DMA \
_IOW(VDI_MAGIC, 17, VPUDRV_DMABUF_LEN)
//hoan add for canvas
#define VDI_IOCTL_READ_CANVAS \
_IOW(VDI_MAGIC, 20, VPUDRV_DMABUF_CANVAS_LEN)
//end
#ifdef CONFIG_COMPAT
#define VDI_IOCTL_ALLOCATE_PHYSICAL_MEMORY32 \
_IOW(VDI_MAGIC, 0, VPUDRV_BUF_LEN32)
#define VDI_IOCTL_FREE_PHYSICALMEMORY32 \
_IOW(VDI_MAGIC, 1, VPUDRV_BUF_LEN32)
#define VDI_IOCTL_GET_INSTANCE_POOL32 \
_IOW(VDI_MAGIC, 5, VPUDRV_BUF_LEN32)
#define VDI_IOCTL_GET_COMMON_MEMORY32 \
_IOW(VDI_MAGIC, 6, VPUDRV_BUF_LEN32)
#define VDI_IOCTL_GET_RESERVED_VIDEO_MEMORY_INFO32 \
_IOW(VDI_MAGIC, 8, VPUDRV_BUF_LEN32)
#define VDI_IOCTL_GET_REGISTER_INFO32 \
_IOW(VDI_MAGIC, 12, VPUDRV_BUF_LEN32)
#define VDI_IOCTL_FLUSH_BUFFER32 \
_IOW(VDI_MAGIC, 14, VPUDRV_BUF_LEN32)
#define VDI_IOCTL_CACHE_INV_BUFFER32 \
_IOW(VDI_MAGIC, 15, VPUDRV_BUF_LEN32)
#define VDI_IOCTL_CONFIG_DMA32 \
_IOW(VDI_MAGIC, 16, VPUDRV_DMABUF_LEN32)
#define VDI_IOCTL_UNMAP_DMA32 \
_IOW(VDI_MAGIC, 17, VPUDRV_DMABUF_LEN32)
//hoan add for canvas
#define VDI_IOCTL_READ_CANVAS32 \
_IOW(VDI_MAGIC, 20, VPUDRV_DMABUF_CANVAS_LEN32)
//end
#endif
/* implement to power management functions */
#define BIT_BASE 0x0000
#define BIT_CODE_RUN (BIT_BASE + 0x000)
#define BIT_CODE_DOWN (BIT_BASE + 0x004)
#define BIT_INT_CLEAR (BIT_BASE + 0x00C)
#define BIT_INT_STS (BIT_BASE + 0x010)
#define BIT_CODE_RESET (BIT_BASE + 0x014)
#define BIT_INT_REASON (BIT_BASE + 0x174)
#define BIT_BUSY_FLAG (BIT_BASE + 0x160)
#define BIT_RUN_COMMAND (BIT_BASE + 0x164)
#define BIT_RUN_INDEX (BIT_BASE + 0x168)
#define BIT_RUN_COD_STD (BIT_BASE + 0x16C)
#define VPU_REG_BASE_ADDR 0xFE070000
#define VPU_REG_SIZE (0x4000*MAX_NUM_VPU_CORE)
/* registers */
#define VP5_REG_BASE 0x0000
#define VP5_VPU_BUSY_STATUS (VP5_REG_BASE + 0x0070)
#define VP5_VPU_INT_REASON_CLEAR (VP5_REG_BASE + 0x0034)
#define VP5_VPU_VINT_CLEAR (VP5_REG_BASE + 0x003C)
#define VP5_VPU_VPU_INT_STS (VP5_REG_BASE + 0x0044)
#define VP5_VPU_INT_REASON (VP5_REG_BASE + 0x004c)
#define VP5_RET_FAIL_REASON (VP5_REG_BASE + 0x010C)
#define VP5_RET_BS_EMPTY_INST (VP5_REG_BASE + 0x01E4)
#define VP5_RET_QUEUE_CMD_DONE_INST (VP5_REG_BASE + 0x01E8)
#define VP5_RET_SEQ_DONE_INSTANCE_INFO (VP5_REG_BASE + 0x01FC)
/* interrrupt bits */
enum {
INT_INIT_VPU = 0,
INT_WAKEUP_VPU = 1,
INT_SLEEP_VPU = 2,
INT_CREATE_INSTANCE = 3,
INT_FLUSH_INSTANCE = 4,
INT_DESTORY_INSTANCE = 5,
INT_INIT_SEQ = 6,
INT_SET_FRAMEBUF = 7,
INT_DEC_PIC = 8,
INT_ENC_PIC = 8,
INT_ENC_SET_PARAM = 9,
#ifdef SUPPORT_SOURCE_RELEASE_INTERRUPT
INT_ENC_SRC_RELEASE = 10,
#endif
INT_ENC_LOW_LATENCY = 13,
INT_DEC_QUERY = 14,
INT_BSBUF_EMPTY = 15,
INT_BSBUF_FULL = 15,
};
/* INIT, WAKEUP */
#define VP5_PO_CONF (VP5_REG_BASE + 0x0000)
#define VP5_VPU_VINT_ENABLE (VP5_REG_BASE + 0x0048)
#define VP5_VPU_RESET_REQ (VP5_REG_BASE + 0x0050)
#define VP5_VPU_RESET_STATUS (VP5_REG_BASE + 0x0054)
#define VP5_VPU_REMAP_CTRL (VP5_REG_BASE + 0x0060)
#define VP5_VPU_REMAP_VADDR (VP5_REG_BASE + 0x0064)
#define VP5_VPU_REMAP_PADDR (VP5_REG_BASE + 0x0068)
#define VP5_VPU_REMAP_CORE_START (VP5_REG_BASE + 0x006C)
#define VP5_REMAP_CODE_INDEX 0
/*VPU registers */
#define VP5_ADDR_CODE_BASE (VP5_REG_BASE + 0x0110)
#define VP5_CODE_SIZE (VP5_REG_BASE + 0x0114)
#define VP5_CODE_PARAM (VP5_REG_BASE + 0x0118)
#define VP5_INIT_VPU_TIME_OUT_CNT (VP5_REG_BASE + 0x0130)
#define VP5_HW_OPTION (VP5_REG_BASE + 0x012C)
#define VP5_RET_SUCCESS (VP5_REG_BASE + 0x0108)
#define VP5_COMMAND (VP5_REG_BASE + 0x0100)
#define VP5_VPU_HOST_INT_REQ (VP5_REG_BASE + 0x0038)
/* Product register */
#define VPU_PRODUCT_CODE_REGISTER (BIT_BASE + 0x1044)
#define ReadVpuRegister(addr) \
readl((void __iomem *)(s_vpu_register.virt_addr \
+ s_bit_firmware_info[core].reg_base_offset + addr))
#define WriteVpuRegister(addr, val) \
writel((u32)val, (void __iomem *)(s_vpu_register.virt_addr \
+ s_bit_firmware_info[core].reg_base_offset + addr))
#define WriteVpu(addr, val) writel((u32)val, (void __iomem *)addr)
#endif