blob: f1eece96285767f9ffc775b2ab94ac184dfdd122 [file] [log] [blame]
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -08001/*
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -08002 * Copyright (c) 2012-2017, The Linux Foundation. All rights reserved.
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -08003 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are
6 * met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above
10 * copyright notice, this list of conditions and the following
11 * disclaimer in the documentation and/or other materials provided
12 * with the distribution.
13 * * Neither the name of The Linux Foundation nor the names of its
14 * contributors may be used to endorse or promote products derived
15 * from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
18 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
20 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
21 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
24 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
25 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
26 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 */
29
Ray Zhang566adac2014-04-14 15:32:04 +080030#include <errno.h>
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -080031#include <string.h>
32#include <sys/mman.h>
33#include <cutils/log.h>
Naseer Ahmed08c3e402017-03-16 15:51:54 -040034#include <cinttypes>
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -080035#include <gralloc_priv.h>
36#include "qdMetaData.h"
37
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -040038static int validateAndMap(private_handle_t* handle) {
Prabhanjan Kandula1ef8e6e2016-08-19 11:46:47 +053039 if (private_handle_t::validate(handle)) {
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -040040 ALOGE("%s: Private handle is invalid - handle:%p", __func__, handle);
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -080041 return -1;
42 }
43 if (handle->fd_metadata == -1) {
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -040044 ALOGE("%s: Invalid metadata fd - handle:%p fd: %d",
45 __func__, handle, handle->fd_metadata);
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -080046 return -1;
47 }
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -040048
49 if (!handle->base_metadata) {
50 unsigned long size = ROUND_UP_PAGESIZE(sizeof(MetaData_t));
51 void *base = mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_SHARED,
52 handle->fd_metadata, 0);
53 if (base == reinterpret_cast<void*>(MAP_FAILED)) {
54 ALOGE("%s: metadata mmap failed - handle:%p fd: %d err: %s",
55 __func__, handle, handle->fd_metadata, strerror(errno));
56
57 return -1;
58 }
59 handle->base_metadata = (uintptr_t) base;
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -080060 }
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -040061 return 0;
62}
63
64int setMetaData(private_handle_t *handle, DispParamType paramType,
65 void *param) {
66 auto err = validateAndMap(handle);
67 if (err != 0)
68 return err;
69
70 MetaData_t *data = reinterpret_cast <MetaData_t *>(handle->base_metadata);
Prabhanjan Kandula1ef8e6e2016-08-19 11:46:47 +053071 // If parameter is NULL reset the specific MetaData Key
72 if (!param) {
73 data->operation &= ~paramType;
Naseer Ahmed8d1434a2017-03-31 15:31:18 -040074 // param unset
75 return 0;
Prabhanjan Kandula1ef8e6e2016-08-19 11:46:47 +053076 }
77
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -080078 data->operation |= paramType;
79 switch (paramType) {
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -080080 case PP_PARAM_INTERLACED:
81 data->interlaced = *((int32_t *)param);
82 break;
Ramkumar Radhakrishnan92f3abe2013-06-05 13:52:40 -070083 case UPDATE_BUFFER_GEOMETRY:
Dileep Marchya2295fdd2015-08-12 17:04:14 -070084 data->bufferDim = *((BufferDim_t *)param);
Arun Kumar K.Ra727a882014-08-20 17:14:26 -070085 break;
86 case UPDATE_REFRESH_RATE:
feifanz9cc23032016-03-23 18:48:56 +080087 data->refreshrate = *((float *)param);
Arun Kumar K.Ra727a882014-08-20 17:14:26 -070088 break;
Shuzhen Wang0d113482014-01-28 16:10:22 -080089 case UPDATE_COLOR_SPACE:
90 data->colorSpace = *((ColorSpace_t *)param);
91 break;
Arun Kumar K.Rda2f69b2014-09-30 15:45:37 -070092 case MAP_SECURE_BUFFER:
93 data->mapSecureBuffer = *((int32_t *)param);
94 break;
Naseer Ahmed3324ff72015-01-21 17:14:44 -050095 case S3D_FORMAT:
96 data->s3dFormat = *((uint32_t *)param);
97 break;
Sushil Chauhane7acc3c2015-06-23 16:22:30 -070098 case LINEAR_FORMAT:
99 data->linearFormat = *((uint32_t *)param);
100 break;
Dileep Marchya1a7e1f12015-09-25 19:11:57 -0700101 case SET_IGC:
102 data->igc = *((IGC_t *)param);
103 break;
Saurabh Shah95f83682015-10-16 10:30:04 -0700104 case SET_SINGLE_BUFFER_MODE:
Saurabh Shahb8067a42015-11-06 16:52:02 -0800105 data->isSingleBufferMode = *((uint32_t *)param);
Saurabh Shah95f83682015-10-16 10:30:04 -0700106 break;
Ray Zhang8ace84d2016-08-08 19:36:03 +0800107 case SET_S3D_COMP:
108 data->s3dComp = *((S3DGpuComp_t *)param);
109 break;
Naseer Ahmede8f254d2016-08-02 20:06:40 -0400110 case SET_VT_TIMESTAMP:
111 data->vtTimeStamp = *((uint64_t *)param);
112 break;
Arun Kumar K.Rb2771bf2016-10-03 21:38:23 -0700113#ifdef USE_COLOR_METADATA
114 case COLOR_METADATA:
115 data->color = *((ColorMetaData *)param);
116#endif
117 break;
Ray Zhang8ace84d2016-08-08 19:36:03 +0800118 default:
119 ALOGE("Unknown paramType %d", paramType);
120 break;
121 }
Ray Zhang8ace84d2016-08-08 19:36:03 +0800122 return 0;
123}
124
125int clearMetaData(private_handle_t *handle, DispParamType paramType) {
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -0400126 auto err = validateAndMap(handle);
127 if (err != 0)
128 return err;
Ray Zhang8ace84d2016-08-08 19:36:03 +0800129
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -0400130 MetaData_t *data = reinterpret_cast <MetaData_t *>(handle->base_metadata);
Ray Zhang8ace84d2016-08-08 19:36:03 +0800131 data->operation &= ~paramType;
132 switch (paramType) {
133 case SET_S3D_COMP:
134 data->s3dComp.displayId = -1;
135 data->s3dComp.s3dMode = 0;
136 break;
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -0800137 default:
138 ALOGE("Unknown paramType %d", paramType);
139 break;
140 }
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -0800141 return 0;
142}
feifanz9cc23032016-03-23 18:48:56 +0800143
144int getMetaData(private_handle_t *handle, DispFetchParamType paramType,
145 void *param) {
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -0400146 int ret = validateAndMap(handle);
147 if (ret != 0)
148 return ret;
149 MetaData_t *data = reinterpret_cast <MetaData_t *>(handle->base_metadata);
150 // Make sure we send 0 only if the operation queried is present
151 ret = -EINVAL;
feifanz9cc23032016-03-23 18:48:56 +0800152
feifanz9cc23032016-03-23 18:48:56 +0800153 switch (paramType) {
154 case GET_PP_PARAM_INTERLACED:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800155 if (data->operation & PP_PARAM_INTERLACED) {
156 *((int32_t *)param) = data->interlaced;
157 ret = 0;
158 }
feifanz9cc23032016-03-23 18:48:56 +0800159 break;
160 case GET_BUFFER_GEOMETRY:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800161 if (data->operation & UPDATE_BUFFER_GEOMETRY) {
162 *((BufferDim_t *)param) = data->bufferDim;
163 ret = 0;
164 }
feifanz9cc23032016-03-23 18:48:56 +0800165 break;
166 case GET_REFRESH_RATE:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800167 if (data->operation & UPDATE_REFRESH_RATE) {
168 *((float *)param) = data->refreshrate;
169 ret = 0;
170 }
feifanz9cc23032016-03-23 18:48:56 +0800171 break;
172 case GET_COLOR_SPACE:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800173 if (data->operation & UPDATE_COLOR_SPACE) {
174 *((ColorSpace_t *)param) = data->colorSpace;
175 ret = 0;
176 }
feifanz9cc23032016-03-23 18:48:56 +0800177 break;
178 case GET_MAP_SECURE_BUFFER:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800179 if (data->operation & MAP_SECURE_BUFFER) {
180 *((int32_t *)param) = data->mapSecureBuffer;
181 ret = 0;
182 }
feifanz9cc23032016-03-23 18:48:56 +0800183 break;
184 case GET_S3D_FORMAT:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800185 if (data->operation & S3D_FORMAT) {
186 *((uint32_t *)param) = data->s3dFormat;
187 ret = 0;
188 }
feifanz9cc23032016-03-23 18:48:56 +0800189 break;
190 case GET_LINEAR_FORMAT:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800191 if (data->operation & LINEAR_FORMAT) {
192 *((uint32_t *)param) = data->linearFormat;
193 ret = 0;
194 }
feifanz9cc23032016-03-23 18:48:56 +0800195 break;
196 case GET_IGC:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800197 if (data->operation & SET_IGC) {
198 *((IGC_t *)param) = data->igc;
199 ret = 0;
200 }
feifanz9cc23032016-03-23 18:48:56 +0800201 break;
202 case GET_SINGLE_BUFFER_MODE:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800203 if (data->operation & SET_SINGLE_BUFFER_MODE) {
204 *((uint32_t *)param) = data->isSingleBufferMode;
205 ret = 0;
206 }
feifanz9cc23032016-03-23 18:48:56 +0800207 break;
Ray Zhang8ace84d2016-08-08 19:36:03 +0800208 case GET_S3D_COMP:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800209 if (data->operation & SET_S3D_COMP) {
210 *((S3DGpuComp_t *)param) = data->s3dComp;
211 ret = 0;
212 }
Ray Zhang8ace84d2016-08-08 19:36:03 +0800213 break;
Naseer Ahmede8f254d2016-08-02 20:06:40 -0400214 case GET_VT_TIMESTAMP:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800215 if (data->operation & SET_VT_TIMESTAMP) {
216 *((uint64_t *)param) = data->vtTimeStamp;
217 ret = 0;
218 }
Naseer Ahmede8f254d2016-08-02 20:06:40 -0400219 break;
Arun Kumar K.Rb2771bf2016-10-03 21:38:23 -0700220#ifdef USE_COLOR_METADATA
221 case GET_COLOR_METADATA:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800222 if (data->operation & COLOR_METADATA) {
223 *((ColorMetaData *)param) = data->color;
224 ret = 0;
225 }
Arun Kumar K.Rb2771bf2016-10-03 21:38:23 -0700226#endif
227 break;
feifanz9cc23032016-03-23 18:48:56 +0800228 default:
229 ALOGE("Unknown paramType %d", paramType);
230 break;
231 }
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800232 return ret;
feifanz9cc23032016-03-23 18:48:56 +0800233}
234
235int copyMetaData(struct private_handle_t *src, struct private_handle_t *dst) {
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -0400236 auto err = validateAndMap(src);
237 if (err != 0)
238 return err;
239
240 err = validateAndMap(dst);
241 if (err != 0)
242 return err;
feifanz9cc23032016-03-23 18:48:56 +0800243
244 unsigned long size = ROUND_UP_PAGESIZE(sizeof(MetaData_t));
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -0400245 MetaData_t *src_data = reinterpret_cast <MetaData_t *>(src->base_metadata);
246 MetaData_t *dst_data = reinterpret_cast <MetaData_t *>(dst->base_metadata);
247 memcpy(src_data, dst_data, size);
feifanz9cc23032016-03-23 18:48:56 +0800248 return 0;
249}