/* * 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 #include #include /* * 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 * @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_ */