blob: df07b4150ad107710443e2411184ab079dc16340 [file] [log] [blame]
/*
* M2M One-shot2 header file
* - Handling H/W accellerators for non-streaming media processing
*
* Copyright (C) 2015 Samsung Electronics Co., Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* 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.
*
* Alternatively you can redistribute this file under the terms of the
* BSD license as stated below:
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* 3. The names of its contributors may not be used to endorse or promote
* products derived from this software without specific prior written
* permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef _UAPI__M2M1SHOT2_H_
#define _UAPI__M2M1SHOT2_H_
#include <linux/ioctl.h>
#include <linux/types.h>
#include <linux/videodev2.h>
/*
* m2m1shot2_image.ext.transform
*
* NOTE that clock-wise rotation is assuemd.
*
* NOTE also that the rotation values are not flags. If ROT270 is set, ROT90 and
* ROT180 is also set. Therefore, to check the rotation in the value,
* use M2M1SHOT2_IMGTRFORM_ROTVAL() macro to get the rotation value.
* Use M2M1SHOT2_IMGTRFORM_SET_ROTVAL() macro to configure a rotation value.
* Do not use AND(&) or OR(|) operators to configure the rotation values
*/
#define M2M1SHOT2_IMGTRFORM_ROT90 (1 << 0)
#define M2M1SHOT2_IMGTRFORM_ROT270CCW M2M1SHOT2_IMGTRFORM_ROT90
#define M2M1SHOT2_IMGTRFORM_ROT180 (1 << 1)
#define M2M1SHOT2_IMGTRFORM_ROT270 \
(M2M1SHOT2_IMGTRFORM_ROT90 + M2M1SHOT2_IMGTRFORM_ROT180)
#define M2M1SHOT2_IMGTRFORM_ROT90CCW M2M1SHOT2_IMGTRFORM_ROT270
#define M2M1SHOT2_IMGTRFORM_XFLIP (1 << 4)
#define M2M1SHOT2_IMGTRFORM_YFLIP (1 << 5)
#define M2M1SHOT2_IMGTRFORM_ROTVAL(val) ((val) & 0xF)
#define M2M1SHOT2_IMGTRFORM_SET_ROTVAL(var, val) \
((var) = ((val) & 0xF) | ((val) & ~0xF))
/* m2m1shot2_image.ext.scaler_filter */
#define M2M1SHOT2_SCFILTER_DEFAULT 0
#define M2M1SHOT2_SCFILTER_NONE 1
#define M2M1SHOT2_SCFILTER_NEAREST 2
#define M2M1SHOT2_SCFILTER_BILINEAR 3
#define M2M1SHOT2_SCFILTER_BICUBIC 4
/* m2m1shot2_image.ext.x/yrepeat */
#define M2M1SHOT2_REPEAT_NONE 0
#define M2M1SHOT2_REPEAT_REPEAT 1
#define M2M1SHOT2_REPEAT_PAD 2
#define M2M1SHOT2_REPEAT_REFLECT 3
#define M2M1SHOT2_REPEAT_CLAMP 4
/* m2m1shot2_image.ext.composit_mode */
#define M2M1SHOT2_BLEND_NONE 0
#define M2M1SHOT2_BLEND_CLEAR 1
#define M2M1SHOT2_BLEND_SRC 2
#define M2M1SHOT2_BLEND_DST 3
#define M2M1SHOT2_BLEND_SRCOVER 4
#define M2M1SHOT2_BLEND_DSTOVER 5
#define M2M1SHOT2_BLEND_SRCIN 6
#define M2M1SHOT2_BLEND_DSTIN 7
#define M2M1SHOT2_BLEND_SRCOUT 8
#define M2M1SHOT2_BLEND_DSTOUT 9
#define M2M1SHOT2_BLEND_SRCATOP 10
#define M2M1SHOT2_BLEND_DSTATOP 11
#define M2M1SHOT2_BLEND_XOR 12
#define M2M1SHOT2_BLEND_PLUS 13
#define M2M1SHOT2_BLEND_MULTIPLY 14
#define M2M1SHOT2_BLEND_SCREEN 15
#define M2M1SHOT2_BLEND_DARKEN 16
#define M2M1SHOT2_BLEND_LIGHTEN 17
#define M2M1SHOT2_BLEND_SRCOVER_DISJ 18
#define M2M1SHOT2_BLEND_DSTOVER_DISJ 19
#define M2M1SHOT2_BLEND_SRCIN_DISJ 20
#define M2M1SHOT2_BLEND_DSTIN_DISJ 21
#define M2M1SHOT2_BLEND_SRCOUT_DISJ 22
#define M2M1SHOT2_BLEND_DSTOUT_DISJ 23
#define M2M1SHOT2_BLEND_SRCATOP_DISJ 24
#define M2M1SHOT2_BLEND_DSTATOP_DISJ 25
#define M2M1SHOT2_BLEND_XOR_DISJ 26
#define M2M1SHOT2_BLEND_SRCOVER_CONJ 27
#define M2M1SHOT2_BLEND_DSTOVER_CONJ 28
#define M2M1SHOT2_BLEND_SRCIN_CONJ 29
#define M2M1SHOT2_BLEND_DSTIN_CONJ 30
#define M2M1SHOT2_BLEND_SRCOUT_CONJ 31
#define M2M1SHOT2_BLEND_DSTOUT_CONJ 32
#define M2M1SHOT2_BLEND_SRCATOP_CONJ 33
#define M2M1SHOT2_BLEND_DSTATOP_CONJ 34
#define M2M1SHOT2_BLEND_XOR_CONJ 35
struct m2m1shot2_custom_data {
__u32 cmd;
__u32 arg;
};
/* struct m2m1shot2_extra - extra image processing attributes
*
* @horizontal_factor: horizontal scaling factor in fixed point form. The
* most significant 12 bits are integral part and the
* rest 20 bits are fractional part of the factor.
* @vertical_factor : vertical scaling factor in fixed point form. The format of
* the number is the same as @horizontal_factor.
* @fillcolor : the 32bit color value to fill to the destination area.
* @transform : a combination of the values defined by M2M1SHOT2_IMGTRFORM_XXX
* @composit_mode : alhpa compositing mode. It should be one of the values
* defined by M2M1SHOT2_BLEND_XXX. This value is only valid if
* M2M1SHOT2_IMGFLAG_ALPHABLEND is set in m2m1shot2_image.flags.
* @galpha : the transparent amount that overrides or modifies the value of
* the alpha channel
* @galpha_red : the transparent amount of the red channal that is applied to
* the entire image area. This value is only valid if
* M2M1SHOT2_IMGFLAG_GLOBAL_ALPHA is set in m2m1shot2_image.flags
* @galpha_green: the transparent abount of the green channel that is applied to
* the entire image area. This value is only valid if
* M2M1SHOT2_IMGFLAG_GLOBAL_ALPHA is set in m2m1shot2_image.flags
* @galpha_blue : the transparent abount of the blue channel that is applied to
* the entire image area. This value is only valid if
* M2M1SHOT2_IMGFLAG_GLOBAL_ALPHA is set in m2m1shot2_image.flags
* @xrepeat : the horizontal source image repeat pattern defined by
* M2M1SHOT2_REPEAT_XXX
* @yrepeat : the vertical source image repeat pattern defined by
* M2M1SHOT2_REPEAT_XXX
* @scaler_filter : interpolation filter used when image is rescaled. It should
* be one of the values defined as M2M1SHOT2_SCFILTER_XXX
*/
struct m2m1shot2_extra {
__u32 horizontal_factor;
__u32 vertical_factor;
__u32 fillcolor;
__u16 transform;
__u16 composit_mode;
__u8 galpha;
__u8 galpha_red;
__u8 galpha_green;
__u8 galpha_blue;
__u8 xrepeat;
__u8 yrepeat;
__u8 scaler_filter;
};
#define M2M1SHOT2_MAX_PLANES 4
#define M2M1SHOT2_MAX_IMAGES 8
/* The buffer type definition to select whether m2m1shot2_buffer.userptr or
* m2m1shot2_buffer.fd is valid. If neither of M2M1SHOT2_BUFTYPE_USERPTR nor
* M2M1SHOT2_BUFTYPE_DMABUF is set but M2M1SHOT2_BUFTYPE_VALID is set, the
* brightness of each pixel of the image is defined by
* m2m1shot2_extra.fillcolor.
*/
#define M2M1SHOT2_BUFTYPE_NONE 0
#define M2M1SHOT2_BUFTYPE_EMPTY 1 /* NO EFFECTIVE BUFFER */
#define M2M1SHOT2_BUFTYPE_USERPTR 2 /* USERPTR */
#define M2M1SHOT2_BUFTYPE_DMABUF 3 /* DMABUF */
#define M2M1SHOT2_BUFTYPE_VALID(type) (((type) > 0) && ((type) < 4))
/* struct m2m1shot2_buffer - buffer description
* @userptr : the buffer address in the address space of the user. It is
* only valid if M2M1SHOT2_BUFTYPE_USERPTR is set in
* m2m1shot2_image.memory.
* @fd : the open file descriptor of a buffer valid in the address
* space of the user. It is only valid if
* M2M1SHOT2_BUFTYPE_DMABUF is set in m2m1shot2_image.memory.
* @offset : the offset where the effective data starts from in the given
* buffer. It is only valid if m2m1shot2_image.memory is
* M2M1SHOT2_BUFTYPE_DMABUF.
* @payload : the length of the effective data stored in the buffer of the
* image. If the image is the source image, it should be
* initialized by the user. If the image is the target image,
* then it should be set by the client driver.
* @reserved : reserved for later use or for the purpose of the client
* driver's private use.
*/
struct m2m1shot2_buffer {
union {
unsigned long userptr;
__s32 fd;
};
__u32 offset;
__u32 length;
__u32 payload;
unsigned long reserved;
};
/* struct m2m1shot2_format - image format description
* @width : horizontal pixel count that defines the dimension of the image
* @height : vertical pixel count that defines the dimension of the image
* @pixelformat : defines how the pixels are arranged and the brightness of each
* pixels means. The values available for @pixelformat can be
* found in <linux/videodev2.h>
* @crop : The rectangle in the image dimension that participates in the
* image processing
* @window : The valid rectangle in the target image area. Whatever the
* result image dimension defined, the result image should be
* drawn on the area of @window
*/
struct m2m1shot2_format {
__u32 width;
__u32 height;
__u32 pixelformat; /* V4L2_FMT_XXX */
struct v4l2_rect crop;
struct v4l2_rect window;
};
/* informs the driver that should wait for the given fence to be signaled */
#define M2M1SHOT2_IMGFLAG_ACQUIRE_FENCE (1 << 1)
/* informs the driver to generate a fence to wait in userspace */
#define M2M1SHOT2_IMGFLAG_RELEASE_FENCE (1 << 2)
/* pixel values are multiplied with the alpha value */
#define M2M1SHOT2_IMGFLAG_PREMUL_ALPHA (1 << 4)
/* global alpha should be used instead of alpha channel */
#define M2M1SHOT2_IMGFLAG_GLOBAL_ALPHA (1 << 5)
/* use the u-order addressing for destination */
#define M2M1SHOT2_IMGFLAG_UORDER_ADDR (1 << 6)
/* image is stored in compressed form */
#define M2M1SHOT2_IMGFLAG_COMPRESSED (1 << 7)
/* do not rescale image although sizes of the src/dst image are different */
#define M2M1SHOT2_IMGFLAG_NO_RESCALING (1 << 8)
/* ext.horizontal_factor is valid. */
#define M2M1SHOT2_IMGFLAG_XSCALE_FACTOR (1 << 9)
/* ext.vertical_factor is valid. */
#define M2M1SHOT2_IMGFLAG_YSCALE_FACTOR (1 << 10)
/* ext.fillcolor is valid */
#define M2M1SHOT2_IMGFLAG_COLORFILL (1 << 11)
/* informs the driver that sholud protect the buffer */
#define M2M1SHOT2_IMGFLAG_SECURE (1 << 12)
/* cleaning of the CPU caches is unneccessary before processing */
#define M2M1SHOT2_IMGFLAG_NO_CACHECLEAN (1 << 16)
/* invalidation of the CPU caches is unneccessary after processing */
#define M2M1SHOT2_IMGFLAG_NO_CACHEINV (1 << 17)
/* struct m2m1shot2_image - description of an image
*
* @flags : flags to determine if an attribute of the image is valid or
* not. The valule in @flags is a combination of
* M2M1SHOT2_IMGFLAG_XXX.
* @fence : a open file descriptor of the acquire fence if
* M2M1SHOT2_IMGFLAG_ACQUIRE_FENCE is set in
* m2m1shot2_image.flags. On return of M2M1SHOT2_IOC_PROCESS
* ioctl, it is a valid open file descriptor of the release fence
* of the image if M2M1SHOT2_IMGFLAG_RELEASE_FENCE is set by the
* user.
* @memory : determines whether m2m1shot2_buffer.fd or
* m2m1shot2_buffer.userptr is valid. It should be one of
* M2M1SHOT2_BUFTYPE_USERPTR, M2M1SHOT2_BUFTYPE_DMABUF and
* M2M1SHOT2_BUFTYPE_EMPTY.
* @num_planes : the number of valid elements in @plane array.
* @plane : the description of the buffers that contains the color and
* brightness information of the image.
* @fmt : the description how to read the pixels in the buffers
* : described in @plane
* @ext : the detailed image processing attributes
* @reserved : reserved for later use or driver's private use.
*/
struct m2m1shot2_image {
__u32 flags;
__s32 fence;
__u8 memory;
__u8 num_planes;
struct m2m1shot2_buffer plane[M2M1SHOT2_MAX_PLANES];
struct m2m1shot2_format fmt;
struct m2m1shot2_extra ext;
__u32 colorspace;
__u32 reserved[3];
};
/* m2m1shot2.flags */
/* dithering required at the end of the image processing */
#define M2M1SHOT2_FLAG_DITHER (1 << 1)
/*
* M2M1SHOT2_IOC_PROCESS ioctl returns immediately after validation of the
* values in the parameters finishes. The user should call ioctl with
* M2M1SHOT2_IOC_WAIT_PROCESS command to get the result
*/
#define M2M1SHOT2_FLAG_NONBLOCK (1 << 2)
/*
* indicate that an error occurred during image processing. Configured by the
* framework. The users should check if an error occurred on return of ioctl.
*/
#define M2M1SHOT2_FLAG_ERROR (1 << 4)
/* struct m2m1shot2 - description of a image processing task
*
* @sources : the descriptions of source images.
* @target : the description of the target image that is the result of
* the image processing
* @num_sources : the number of valid source images.
* @flags : the flags to indicate the status or the attributes of the
* image processing. It should be the combination of the values
* defined by M2M1SHOT2_FLAG_XXX.
* @reserved1,2,4: reserved for the later user or the driver's private use
* @work_delay_in_nsec : delay in processing (nsec)
*/
struct m2m1shot2 {
struct m2m1shot2_image *sources;
struct m2m1shot2_image target;
__u8 num_sources;
__u32 flags;
__u32 reserved1;
__u32 reserved2;
unsigned long work_delay_in_nsec;
unsigned long reserved4;
};
#define M2M1SHOT2_IOC_PROCESS _IOWR('M', 4, struct m2m1shot2)
/* m2m1shot2.sources is not required for M2M1SHOT2_IOC_WAIT_PROCESS */
#define M2M1SHOT2_IOC_WAIT_PROCESS _IOR('M', 5, struct m2m1shot2)
enum m2m1shot2_priority {
M2M1SHOT2_LOW_PRIORITY,
M2M1SHOT2_MEDIUM_PRIORITY,
M2M1SHOT2_DEFAULT_PRIORITY = M2M1SHOT2_MEDIUM_PRIORITY,
M2M1SHOT2_HIGH_PRIORITY,
M2M1SHOT2_HIGHEST_PRIORITY,
M2M1SHOT2_PRIORITY_END
};
#define M2M1SHOT2_IOC_SET_PRIORITY _IOR('M', 6, int32_t)
#define M2M1SHOT2_PERF_MAX_FRAMES 4
/* flags of m2m1shot2_performance_layer_data.layer_attr */
#define M2M1SHOT2_PERF_LAYER_ROTATE 1
struct m2m1shot2_performance_layer_data {
__u32 pixelcount;
__u32 layer_attr;
};
/* flags of m2m1shot2_performance_frame_data.frame_attr */
#define M2M1SHOT2_PERF_FRAME_SOLIDCOLORFILL 1
struct m2m1shot2_performance_frame_data {
struct m2m1shot2_performance_layer_data layer[M2M1SHOT2_MAX_IMAGES];
__u32 bandwidth_read;
__u32 bandwidth_write;
__u32 target_pixelcount;
__u32 frame_rate;
__u32 frame_attr;
__u32 num_layers;
};
struct m2m1shot2_performance_data {
struct m2m1shot2_performance_frame_data frame[M2M1SHOT2_PERF_MAX_FRAMES];
__u32 num_frames;
__u32 reserved;
};
#define M2M1SHOT2_IOC_REQUEST_PERF _IOR('M', 7, struct m2m1shot2_performance_data)
#define M2M1SHOT2_IOC_CUSTOM _IOR('M', 8, struct m2m1shot2_custom_data)
#endif /* _UAPI__M2M1SHOT2_H_ */