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