| /* |
| * |
| * 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 |