blob: 7eb11666708739f3fa7f8aaa995aab3f54326a1e [file] [log] [blame]
/* SPDX-License-Identifier: GPL-2.0-only WITH Linux-syscall-note */
/*
* Copyright (c) 2018-2019, The Linux Foundation. All rights reserved.
*/
#ifndef __MSM_CVP_PRIVATE_H__
#define __MSM_CVP_PRIVATE_H__
#include <linux/videodev2.h>
#define MAX_DFS_HFI_PARAMS 20
#define HFI_MAX_PLANES 4
/* VIDIOC private cvp command */
#define VIDIOC_CVP_CMD \
_IOWR('V', BASE_VIDIOC_PRIVATE_CVP, struct msm_cvp_arg)
/* Commands type */
#define MSM_VIDC_CMD_START 0x10000000
#define MSM_CVP_CMD_START (MSM_VIDC_CMD_START + 0x1000)
/*
* userspace clients pass one of the below arguments type
* in struct msm_cvp_arg (@type field).
*/
/*
* MSM_CVP_GET_SESSION_INFO - this argument type is used to
* get the session information from driver. it passes
* struct msm_cvp_session_info {}
*/
#define MSM_CVP_GET_SESSION_INFO (MSM_CVP_CMD_START + 1)
/*
* MSM_CVP_REQUEST_POWER - this argument type is used to
* set the power required to driver. it passes
* struct msm_cvp_request_power {}
*/
#define MSM_CVP_REQUEST_POWER (MSM_CVP_CMD_START + 2)
/*
* MSM_CVP_REGISTER_BUFFER - this argument type is used to
* register the buffer to driver. it passes
* struct msm_cvp_buffer {}
*/
#define MSM_CVP_REGISTER_BUFFER (MSM_CVP_CMD_START + 3)
/*
* MSM_CVP_REGISTER_BUFFER - this argument type is used to
* unregister the buffer to driver. it passes
* struct msm_cvp_buffer {}
*/
#define MSM_CVP_UNREGISTER_BUFFER (MSM_CVP_CMD_START + 4)
#define MSM_CVP_HFI_SEND_CMD (MSM_CVP_CMD_START + 5)
#define MSM_CVP_HFI_DFS_CONFIG_CMD (MSM_CVP_CMD_START + 6)
#define MSM_CVP_HFI_DFS_FRAME_CMD (MSM_CVP_CMD_START + 7)
#define MSM_CVP_HFI_DFS_FRAME_CMD_RESPONSE (MSM_CVP_CMD_START + 8)
#define MSM_CVP_HFI_DME_CONFIG_CMD (MSM_CVP_CMD_START + 9)
#define MSM_CVP_HFI_DME_FRAME_CMD (MSM_CVP_CMD_START + 10)
#define MSM_CVP_HFI_DME_FRAME_CMD_RESPONSE (MSM_CVP_CMD_START + 11)
#define MSM_CVP_HFI_PERSIST_CMD (MSM_CVP_CMD_START + 12)
#define MSM_CVP_HFI_PERSIST_CMD_RESPONSE (MSM_CVP_CMD_START + 13)
/* flags */
#define MSM_CVP_FLAG_UNSECURE 0x00000000
#define MSM_CVP_FLAG_SECURE 0x00000001
/* buffer type */
#define MSM_CVP_BUFTYPE_INPUT 0x00000001
#define MSM_CVP_BUFTYPE_OUTPUT 0x00000002
#define MSM_CVP_BUFTYPE_INTERNAL_1 0x00000003
#define MSM_CVP_BUFTYPE_INTERNAL_2 0x00000004
/**
* struct msm_cvp_session_info - session information
* @session_id: current session id
*/
struct msm_cvp_session_info {
unsigned int session_id;
unsigned int reserved[10];
};
/**
* struct msm_cvp_request_power - power / clock data information
* @clock_cycles_a: clock cycles per second required for hardware_a
* @clock_cycles_b: clock cycles per second required for hardware_b
* @ddr_bw: bandwidth required for ddr in bps
* @sys_cache_bw: bandwidth required for system cache in bps
*/
struct msm_cvp_request_power {
unsigned int clock_cycles_a;
unsigned int clock_cycles_b;
unsigned int ddr_bw;
unsigned int sys_cache_bw;
unsigned int reserved[8];
};
/**
* struct msm_cvp_buffer - buffer information to be registered
* @index: index of buffer
* @type: buffer type
* @fd: file descriptor of buffer
* @size: allocated size of buffer
* @offset: offset in fd from where usable data starts
* @pixelformat: fourcc format
* @flags: buffer flags
*/
struct msm_cvp_buffer {
unsigned int index;
unsigned int type;
unsigned int fd;
unsigned int size;
unsigned int offset;
unsigned int pixelformat;
unsigned int flags;
unsigned int reserved[5];
};
/**
* struct msm_cvp_send_cmd - sending generic HFI command
* @cmd_address_fd: file descriptor of cmd_address
* @cmd_size: allocated size of buffer
*/
struct msm_cvp_send_cmd {
unsigned int cmd_address_fd;
unsigned int cmd_size;
unsigned int reserved[10];
};
/**
* struct msm_cvp_color_plane_info - color plane info
* @stride: stride of plane
* @buf_size: size of plane
*/
struct msm_cvp_color_plane_info {
int stride[HFI_MAX_PLANES];
unsigned int buf_size[HFI_MAX_PLANES];
};
/**
* struct msm_cvp_client_data - store generic client
* data
* @transactionid: transaction id
* @client_data1: client data to be used during callback
* @client_data2: client data to be used during callback
*/
struct msm_cvp_client_data {
unsigned int transactionid;
unsigned int client_data1;
unsigned int client_data2;
};
#define CVP_COLOR_PLANE_INFO_SIZE \
sizeof(struct msm_cvp_color_plane_info)
#define CVP_CLIENT_DATA_SIZE sizeof(struct msm_cvp_client_data)
#define CVP_DFS_CONFIG_CMD_SIZE 38
#define CVP_DFS_FRAME_CMD_SIZE 16
#define CVP_DFS_FRAME_BUFFERS_OFFSET 8
#define CVP_DME_CONFIG_CMD_SIZE 194
#define CVP_DME_FRAME_CMD_SIZE 28
#define CVP_DME_FRAME_BUFFERS_OFFSET 12
#define CVP_DME_BUF_NUM 8
#define CVP_PERSIST_CMD_SIZE 11
#define CVP_PERSIST_BUFFERS_OFFSET 7
#define CVP_PSRSIST_BUF_NUM 2
struct msm_cvp_dfs_config {
unsigned int cvp_dfs_config[CVP_DFS_CONFIG_CMD_SIZE];
};
struct msm_cvp_dfs_frame {
unsigned int frame_data[CVP_DFS_FRAME_CMD_SIZE];
};
struct msm_cvp_dme_config {
unsigned int cvp_dme_config[CVP_DME_CONFIG_CMD_SIZE];
};
struct msm_cvp_dme_frame {
unsigned int frame_data[CVP_DME_FRAME_CMD_SIZE];
};
struct msm_cvp_persist_buf {
unsigned int persist_data[CVP_PERSIST_CMD_SIZE];
};
/**
* struct msm_cvp_arg - argument passed with VIDIOC_CVP_CMD
* @type: command type
* @session: session information
* @req_power: power information
* @regbuf: buffer to be registered
* @unregbuf: buffer to be unregistered
* @send_cmd: sending generic HFI command
* @dfs_config: sending DFS config command
* @dfs_frame: sending DFS frame command
*/
struct msm_cvp_arg {
unsigned int type;
union data_t {
struct msm_cvp_session_info session;
struct msm_cvp_request_power req_power;
struct msm_cvp_buffer regbuf;
struct msm_cvp_buffer unregbuf;
struct msm_cvp_send_cmd send_cmd;
struct msm_cvp_dfs_config dfs_config;
struct msm_cvp_dfs_frame dfs_frame;
struct msm_cvp_dme_config dme_config;
struct msm_cvp_dme_frame dme_frame;
struct msm_cvp_persist_buf pbuf_cmd;
} data;
unsigned int reserved[12];
};
#endif