blob: 3259ee235c3412e5e0232ccff14daf118e322478 [file] [log] [blame]
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -08001/*
Saurabh Dubey5050dd22018-03-12 21:58:49 +05302 * Copyright (c) 2012-2018, 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>
Naseer Ahmedfcad05e2018-03-06 20:41:14 -050033#include <log/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 Ahmed2e6bee12017-04-13 22:45:54 -040038unsigned long getMetaDataSize() {
39 return static_cast<unsigned long>(ROUND_UP_PAGESIZE(sizeof(MetaData_t)));
40}
41
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -040042static int validateAndMap(private_handle_t* handle) {
Prabhanjan Kandula1ef8e6e2016-08-19 11:46:47 +053043 if (private_handle_t::validate(handle)) {
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -040044 ALOGE("%s: Private handle is invalid - handle:%p", __func__, handle);
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -080045 return -1;
46 }
Naseer Ahmed7aff2612017-10-05 20:39:05 -040047 if (handle->fd_metadata < 0) {
48 // Silently return, metadata cannot be used
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -080049 return -1;
50 }
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -040051
52 if (!handle->base_metadata) {
Naseer Ahmed2e6bee12017-04-13 22:45:54 -040053 auto size = getMetaDataSize();
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -040054 void *base = mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_SHARED,
55 handle->fd_metadata, 0);
56 if (base == reinterpret_cast<void*>(MAP_FAILED)) {
57 ALOGE("%s: metadata mmap failed - handle:%p fd: %d err: %s",
58 __func__, handle, handle->fd_metadata, strerror(errno));
59
60 return -1;
61 }
62 handle->base_metadata = (uintptr_t) base;
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -080063 }
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -040064 return 0;
65}
66
67int setMetaData(private_handle_t *handle, DispParamType paramType,
Naseer Ahmed2e6bee12017-04-13 22:45:54 -040068 void *param) {
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -040069 auto err = validateAndMap(handle);
70 if (err != 0)
71 return err;
Naseer Ahmed2e6bee12017-04-13 22:45:54 -040072 return setMetaDataVa(reinterpret_cast<MetaData_t*>(handle->base_metadata),
73 paramType, param);
74}
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -040075
Naseer Ahmed2e6bee12017-04-13 22:45:54 -040076int setMetaDataVa(MetaData_t *data, DispParamType paramType,
77 void *param) {
78 if (data == nullptr)
79 return -EINVAL;
Prabhanjan Kandula1ef8e6e2016-08-19 11:46:47 +053080 // If parameter is NULL reset the specific MetaData Key
81 if (!param) {
82 data->operation &= ~paramType;
Naseer Ahmed8d1434a2017-03-31 15:31:18 -040083 // param unset
84 return 0;
Prabhanjan Kandula1ef8e6e2016-08-19 11:46:47 +053085 }
86
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -080087 data->operation |= paramType;
88 switch (paramType) {
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -080089 case PP_PARAM_INTERLACED:
90 data->interlaced = *((int32_t *)param);
91 break;
Ramkumar Radhakrishnan92f3abe2013-06-05 13:52:40 -070092 case UPDATE_BUFFER_GEOMETRY:
Dileep Marchya2295fdd2015-08-12 17:04:14 -070093 data->bufferDim = *((BufferDim_t *)param);
Arun Kumar K.Ra727a882014-08-20 17:14:26 -070094 break;
95 case UPDATE_REFRESH_RATE:
feifanz9cc23032016-03-23 18:48:56 +080096 data->refreshrate = *((float *)param);
Arun Kumar K.Ra727a882014-08-20 17:14:26 -070097 break;
Shuzhen Wang0d113482014-01-28 16:10:22 -080098 case UPDATE_COLOR_SPACE:
99 data->colorSpace = *((ColorSpace_t *)param);
100 break;
Arun Kumar K.Rda2f69b2014-09-30 15:45:37 -0700101 case MAP_SECURE_BUFFER:
102 data->mapSecureBuffer = *((int32_t *)param);
103 break;
Naseer Ahmed3324ff72015-01-21 17:14:44 -0500104 case S3D_FORMAT:
105 data->s3dFormat = *((uint32_t *)param);
106 break;
Sushil Chauhane7acc3c2015-06-23 16:22:30 -0700107 case LINEAR_FORMAT:
108 data->linearFormat = *((uint32_t *)param);
109 break;
Dileep Marchya1a7e1f12015-09-25 19:11:57 -0700110 case SET_IGC:
111 data->igc = *((IGC_t *)param);
112 break;
Saurabh Shah95f83682015-10-16 10:30:04 -0700113 case SET_SINGLE_BUFFER_MODE:
Saurabh Shahb8067a42015-11-06 16:52:02 -0800114 data->isSingleBufferMode = *((uint32_t *)param);
Saurabh Shah95f83682015-10-16 10:30:04 -0700115 break;
Ray Zhang8ace84d2016-08-08 19:36:03 +0800116 case SET_S3D_COMP:
117 data->s3dComp = *((S3DGpuComp_t *)param);
118 break;
Naseer Ahmede8f254d2016-08-02 20:06:40 -0400119 case SET_VT_TIMESTAMP:
120 data->vtTimeStamp = *((uint64_t *)param);
121 break;
Arun Kumar K.Rb2771bf2016-10-03 21:38:23 -0700122 case COLOR_METADATA:
123 data->color = *((ColorMetaData *)param);
Arun Kumar K.Rb2771bf2016-10-03 21:38:23 -0700124 break;
Gurunath Ramaswamyb494c022017-07-04 13:47:46 -0700125 case SET_UBWC_CR_STATS_INFO: {
126 struct UBWCStats* stats = (struct UBWCStats*)param;
127 int numelems = sizeof(data->ubwcCRStats) / sizeof(struct UBWCStats);
128 for (int i = 0; i < numelems; i++) {
129 data->ubwcCRStats[i] = stats[i];
130 }
131 break;
132 }
Ashwini Rao6e616962017-11-28 12:12:46 -0800133 case SET_VIDEO_PERF_MODE:
134 data->isVideoPerfMode = *((uint32_t *)param);
135 break;
Saurabh Dubeyb28b82b2018-05-29 09:46:41 +0530136 case SET_GRAPHICS_METADATA: {
137 GraphicsMetadata payload = *((GraphicsMetadata*)(param));
138 data->graphics_metadata.size = payload.size;
139 memcpy(data->graphics_metadata.data, payload.data,
140 sizeof(data->graphics_metadata.data));
141 break;
142 }
Ray Zhang8ace84d2016-08-08 19:36:03 +0800143 default:
144 ALOGE("Unknown paramType %d", paramType);
145 break;
146 }
Ray Zhang8ace84d2016-08-08 19:36:03 +0800147 return 0;
148}
149
150int clearMetaData(private_handle_t *handle, DispParamType paramType) {
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -0400151 auto err = validateAndMap(handle);
152 if (err != 0)
153 return err;
Naseer Ahmed2e6bee12017-04-13 22:45:54 -0400154 return clearMetaDataVa(reinterpret_cast<MetaData_t *>(handle->base_metadata),
155 paramType);
156}
Ray Zhang8ace84d2016-08-08 19:36:03 +0800157
Naseer Ahmed2e6bee12017-04-13 22:45:54 -0400158int clearMetaDataVa(MetaData_t *data, DispParamType paramType) {
159 if (data == nullptr)
160 return -EINVAL;
Ray Zhang8ace84d2016-08-08 19:36:03 +0800161 data->operation &= ~paramType;
162 switch (paramType) {
163 case SET_S3D_COMP:
164 data->s3dComp.displayId = -1;
165 data->s3dComp.s3dMode = 0;
166 break;
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -0800167 default:
168 ALOGE("Unknown paramType %d", paramType);
169 break;
170 }
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -0800171 return 0;
172}
feifanz9cc23032016-03-23 18:48:56 +0800173
174int getMetaData(private_handle_t *handle, DispFetchParamType paramType,
175 void *param) {
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -0400176 int ret = validateAndMap(handle);
177 if (ret != 0)
178 return ret;
Naseer Ahmed2e6bee12017-04-13 22:45:54 -0400179 return getMetaDataVa(reinterpret_cast<MetaData_t *>(handle->base_metadata),
180 paramType, param);
181}
182
183int getMetaDataVa(MetaData_t *data, DispFetchParamType paramType,
184 void *param) {
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -0400185 // Make sure we send 0 only if the operation queried is present
Naseer Ahmed2e6bee12017-04-13 22:45:54 -0400186 int ret = -EINVAL;
187 if (data == nullptr)
188 return ret;
Gurunath Ramaswamyb494c022017-07-04 13:47:46 -0700189 if (param == nullptr)
190 return ret;
feifanz9cc23032016-03-23 18:48:56 +0800191
feifanz9cc23032016-03-23 18:48:56 +0800192 switch (paramType) {
193 case GET_PP_PARAM_INTERLACED:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800194 if (data->operation & PP_PARAM_INTERLACED) {
195 *((int32_t *)param) = data->interlaced;
196 ret = 0;
197 }
feifanz9cc23032016-03-23 18:48:56 +0800198 break;
199 case GET_BUFFER_GEOMETRY:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800200 if (data->operation & UPDATE_BUFFER_GEOMETRY) {
201 *((BufferDim_t *)param) = data->bufferDim;
202 ret = 0;
203 }
feifanz9cc23032016-03-23 18:48:56 +0800204 break;
205 case GET_REFRESH_RATE:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800206 if (data->operation & UPDATE_REFRESH_RATE) {
207 *((float *)param) = data->refreshrate;
208 ret = 0;
209 }
feifanz9cc23032016-03-23 18:48:56 +0800210 break;
211 case GET_COLOR_SPACE:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800212 if (data->operation & UPDATE_COLOR_SPACE) {
213 *((ColorSpace_t *)param) = data->colorSpace;
214 ret = 0;
215 }
feifanz9cc23032016-03-23 18:48:56 +0800216 break;
217 case GET_MAP_SECURE_BUFFER:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800218 if (data->operation & MAP_SECURE_BUFFER) {
219 *((int32_t *)param) = data->mapSecureBuffer;
220 ret = 0;
221 }
feifanz9cc23032016-03-23 18:48:56 +0800222 break;
223 case GET_S3D_FORMAT:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800224 if (data->operation & S3D_FORMAT) {
225 *((uint32_t *)param) = data->s3dFormat;
226 ret = 0;
227 }
feifanz9cc23032016-03-23 18:48:56 +0800228 break;
229 case GET_LINEAR_FORMAT:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800230 if (data->operation & LINEAR_FORMAT) {
231 *((uint32_t *)param) = data->linearFormat;
232 ret = 0;
233 }
feifanz9cc23032016-03-23 18:48:56 +0800234 break;
235 case GET_IGC:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800236 if (data->operation & SET_IGC) {
237 *((IGC_t *)param) = data->igc;
238 ret = 0;
239 }
feifanz9cc23032016-03-23 18:48:56 +0800240 break;
241 case GET_SINGLE_BUFFER_MODE:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800242 if (data->operation & SET_SINGLE_BUFFER_MODE) {
243 *((uint32_t *)param) = data->isSingleBufferMode;
244 ret = 0;
245 }
feifanz9cc23032016-03-23 18:48:56 +0800246 break;
Ray Zhang8ace84d2016-08-08 19:36:03 +0800247 case GET_S3D_COMP:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800248 if (data->operation & SET_S3D_COMP) {
249 *((S3DGpuComp_t *)param) = data->s3dComp;
250 ret = 0;
251 }
Ray Zhang8ace84d2016-08-08 19:36:03 +0800252 break;
Naseer Ahmede8f254d2016-08-02 20:06:40 -0400253 case GET_VT_TIMESTAMP:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800254 if (data->operation & SET_VT_TIMESTAMP) {
255 *((uint64_t *)param) = data->vtTimeStamp;
256 ret = 0;
257 }
Naseer Ahmede8f254d2016-08-02 20:06:40 -0400258 break;
Arun Kumar K.Rb2771bf2016-10-03 21:38:23 -0700259 case GET_COLOR_METADATA:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800260 if (data->operation & COLOR_METADATA) {
261 *((ColorMetaData *)param) = data->color;
262 ret = 0;
263 }
Arun Kumar K.Rb2771bf2016-10-03 21:38:23 -0700264 break;
Gurunath Ramaswamyb494c022017-07-04 13:47:46 -0700265 case GET_UBWC_CR_STATS_INFO:
266 if (data->operation & SET_UBWC_CR_STATS_INFO) {
267 struct UBWCStats* stats = (struct UBWCStats*)param;
268 int numelems = sizeof(data->ubwcCRStats) / sizeof(struct UBWCStats);
269 for (int i = 0; i < numelems; i++) {
270 stats[i] = data->ubwcCRStats[i];
271 }
272 ret = 0;
273 }
274 break;
Ashwini Rao6e616962017-11-28 12:12:46 -0800275 case GET_VIDEO_PERF_MODE:
276 if (data->operation & SET_VIDEO_PERF_MODE) {
277 *((uint32_t *)param) = data->isVideoPerfMode;
278 ret = 0;
279 }
280 break;
Saurabh Dubeyb28b82b2018-05-29 09:46:41 +0530281 case GET_GRAPHICS_METADATA:
282 if (data->operation & SET_GRAPHICS_METADATA) {
283 memcpy(param, data->graphics_metadata.data, sizeof(data->graphics_metadata.data));
284 ret = 0;
285 }
286 break;
feifanz9cc23032016-03-23 18:48:56 +0800287 default:
288 ALOGE("Unknown paramType %d", paramType);
289 break;
290 }
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800291 return ret;
feifanz9cc23032016-03-23 18:48:56 +0800292}
293
294int copyMetaData(struct private_handle_t *src, struct private_handle_t *dst) {
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -0400295 auto err = validateAndMap(src);
296 if (err != 0)
297 return err;
298
299 err = validateAndMap(dst);
300 if (err != 0)
301 return err;
feifanz9cc23032016-03-23 18:48:56 +0800302
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -0400303 MetaData_t *src_data = reinterpret_cast <MetaData_t *>(src->base_metadata);
304 MetaData_t *dst_data = reinterpret_cast <MetaData_t *>(dst->base_metadata);
Naseer Ahmede9b87622017-07-06 12:53:15 -0400305 *dst_data = *src_data;
feifanz9cc23032016-03-23 18:48:56 +0800306 return 0;
307}
Naseer Ahmed2e6bee12017-04-13 22:45:54 -0400308
309int copyMetaDataVaToHandle(MetaData_t *src_data, struct private_handle_t *dst) {
310 int err = -EINVAL;
311 if (src_data == nullptr)
312 return err;
313
314 err = validateAndMap(dst);
315 if (err != 0)
316 return err;
317
318 MetaData_t *dst_data = reinterpret_cast <MetaData_t *>(dst->base_metadata);
Naseer Ahmede9b87622017-07-06 12:53:15 -0400319 *dst_data = *src_data;
Naseer Ahmed2e6bee12017-04-13 22:45:54 -0400320 return 0;
321}
322
323int copyMetaDataHandleToVa(struct private_handle_t *src, MetaData_t *dst_data) {
324 int err = -EINVAL;
325 if (dst_data == nullptr)
326 return err;
327
328 err = validateAndMap(src);
329 if (err != 0)
330 return err;
331
332 MetaData_t *src_data = reinterpret_cast <MetaData_t *>(src->base_metadata);
Naseer Ahmede9b87622017-07-06 12:53:15 -0400333 *dst_data = *src_data;
Naseer Ahmed2e6bee12017-04-13 22:45:54 -0400334 return 0;
335}
336
337int copyMetaDataVaToVa(MetaData_t *src_data, MetaData_t *dst_data) {
338 int err = -EINVAL;
339 if (src_data == nullptr)
340 return err;
341
342 if (dst_data == nullptr)
343 return err;
344
Naseer Ahmede9b87622017-07-06 12:53:15 -0400345 *dst_data = *src_data;
Naseer Ahmed2e6bee12017-04-13 22:45:54 -0400346 return 0;
347}
348