blob: 0837c9908490a1d097594dcb729c6e9544f3dbcd [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 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 }
47 if (handle->fd_metadata == -1) {
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -040048 ALOGE("%s: Invalid metadata fd - handle:%p fd: %d",
49 __func__, handle, handle->fd_metadata);
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -080050 return -1;
51 }
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -040052
53 if (!handle->base_metadata) {
Naseer Ahmed2e6bee12017-04-13 22:45:54 -040054 auto size = getMetaDataSize();
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -040055 void *base = mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_SHARED,
56 handle->fd_metadata, 0);
57 if (base == reinterpret_cast<void*>(MAP_FAILED)) {
58 ALOGE("%s: metadata mmap failed - handle:%p fd: %d err: %s",
59 __func__, handle, handle->fd_metadata, strerror(errno));
60
61 return -1;
62 }
63 handle->base_metadata = (uintptr_t) base;
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -080064 }
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -040065 return 0;
66}
67
68int setMetaData(private_handle_t *handle, DispParamType paramType,
Naseer Ahmed2e6bee12017-04-13 22:45:54 -040069 void *param) {
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -040070 auto err = validateAndMap(handle);
71 if (err != 0)
72 return err;
Naseer Ahmed2e6bee12017-04-13 22:45:54 -040073 return setMetaDataVa(reinterpret_cast<MetaData_t*>(handle->base_metadata),
74 paramType, param);
75}
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -040076
Naseer Ahmed2e6bee12017-04-13 22:45:54 -040077int setMetaDataVa(MetaData_t *data, DispParamType paramType,
78 void *param) {
79 if (data == nullptr)
80 return -EINVAL;
Prabhanjan Kandula1ef8e6e2016-08-19 11:46:47 +053081 // If parameter is NULL reset the specific MetaData Key
82 if (!param) {
83 data->operation &= ~paramType;
Naseer Ahmed8d1434a2017-03-31 15:31:18 -040084 // param unset
85 return 0;
Prabhanjan Kandula1ef8e6e2016-08-19 11:46:47 +053086 }
87
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -080088 data->operation |= paramType;
89 switch (paramType) {
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -080090 case PP_PARAM_INTERLACED:
91 data->interlaced = *((int32_t *)param);
92 break;
Ramkumar Radhakrishnan92f3abe2013-06-05 13:52:40 -070093 case UPDATE_BUFFER_GEOMETRY:
Dileep Marchya2295fdd2015-08-12 17:04:14 -070094 data->bufferDim = *((BufferDim_t *)param);
Arun Kumar K.Ra727a882014-08-20 17:14:26 -070095 break;
96 case UPDATE_REFRESH_RATE:
feifanz9cc23032016-03-23 18:48:56 +080097 data->refreshrate = *((float *)param);
Arun Kumar K.Ra727a882014-08-20 17:14:26 -070098 break;
Shuzhen Wang0d113482014-01-28 16:10:22 -080099 case UPDATE_COLOR_SPACE:
100 data->colorSpace = *((ColorSpace_t *)param);
101 break;
Arun Kumar K.Rda2f69b2014-09-30 15:45:37 -0700102 case MAP_SECURE_BUFFER:
103 data->mapSecureBuffer = *((int32_t *)param);
104 break;
Naseer Ahmed3324ff72015-01-21 17:14:44 -0500105 case S3D_FORMAT:
106 data->s3dFormat = *((uint32_t *)param);
107 break;
Sushil Chauhane7acc3c2015-06-23 16:22:30 -0700108 case LINEAR_FORMAT:
109 data->linearFormat = *((uint32_t *)param);
110 break;
Dileep Marchya1a7e1f12015-09-25 19:11:57 -0700111 case SET_IGC:
112 data->igc = *((IGC_t *)param);
113 break;
Saurabh Shah95f83682015-10-16 10:30:04 -0700114 case SET_SINGLE_BUFFER_MODE:
Saurabh Shahb8067a42015-11-06 16:52:02 -0800115 data->isSingleBufferMode = *((uint32_t *)param);
Saurabh Shah95f83682015-10-16 10:30:04 -0700116 break;
Ray Zhang8ace84d2016-08-08 19:36:03 +0800117 case SET_S3D_COMP:
118 data->s3dComp = *((S3DGpuComp_t *)param);
119 break;
Naseer Ahmede8f254d2016-08-02 20:06:40 -0400120 case SET_VT_TIMESTAMP:
121 data->vtTimeStamp = *((uint64_t *)param);
122 break;
Arun Kumar K.Rb2771bf2016-10-03 21:38:23 -0700123 case COLOR_METADATA:
Uday Kiran Pichika5649e1c2017-07-11 12:04:30 +0530124#ifdef USE_COLOR_METADATA
Arun Kumar K.Rb2771bf2016-10-03 21:38:23 -0700125 data->color = *((ColorMetaData *)param);
126#endif
127 break;
Gurunath Ramaswamyb494c022017-07-04 13:47:46 -0700128 case SET_UBWC_CR_STATS_INFO: {
129 struct UBWCStats* stats = (struct UBWCStats*)param;
130 int numelems = sizeof(data->ubwcCRStats) / sizeof(struct UBWCStats);
131 for (int i = 0; i < numelems; i++) {
132 data->ubwcCRStats[i] = stats[i];
133 }
134 break;
135 }
Ray Zhang8ace84d2016-08-08 19:36:03 +0800136 default:
137 ALOGE("Unknown paramType %d", paramType);
138 break;
139 }
Ray Zhang8ace84d2016-08-08 19:36:03 +0800140 return 0;
141}
142
143int clearMetaData(private_handle_t *handle, DispParamType paramType) {
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -0400144 auto err = validateAndMap(handle);
145 if (err != 0)
146 return err;
Naseer Ahmed2e6bee12017-04-13 22:45:54 -0400147 return clearMetaDataVa(reinterpret_cast<MetaData_t *>(handle->base_metadata),
148 paramType);
149}
Ray Zhang8ace84d2016-08-08 19:36:03 +0800150
Naseer Ahmed2e6bee12017-04-13 22:45:54 -0400151int clearMetaDataVa(MetaData_t *data, DispParamType paramType) {
152 if (data == nullptr)
153 return -EINVAL;
Ray Zhang8ace84d2016-08-08 19:36:03 +0800154 data->operation &= ~paramType;
155 switch (paramType) {
156 case SET_S3D_COMP:
157 data->s3dComp.displayId = -1;
158 data->s3dComp.s3dMode = 0;
159 break;
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -0800160 default:
161 ALOGE("Unknown paramType %d", paramType);
162 break;
163 }
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -0800164 return 0;
165}
feifanz9cc23032016-03-23 18:48:56 +0800166
167int getMetaData(private_handle_t *handle, DispFetchParamType paramType,
168 void *param) {
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -0400169 int ret = validateAndMap(handle);
170 if (ret != 0)
171 return ret;
Naseer Ahmed2e6bee12017-04-13 22:45:54 -0400172 return getMetaDataVa(reinterpret_cast<MetaData_t *>(handle->base_metadata),
173 paramType, param);
174}
175
176int getMetaDataVa(MetaData_t *data, DispFetchParamType paramType,
177 void *param) {
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -0400178 // Make sure we send 0 only if the operation queried is present
Naseer Ahmed2e6bee12017-04-13 22:45:54 -0400179 int ret = -EINVAL;
180 if (data == nullptr)
181 return ret;
Gurunath Ramaswamyb494c022017-07-04 13:47:46 -0700182 if (param == nullptr)
183 return ret;
feifanz9cc23032016-03-23 18:48:56 +0800184
feifanz9cc23032016-03-23 18:48:56 +0800185 switch (paramType) {
186 case GET_PP_PARAM_INTERLACED:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800187 if (data->operation & PP_PARAM_INTERLACED) {
188 *((int32_t *)param) = data->interlaced;
189 ret = 0;
190 }
feifanz9cc23032016-03-23 18:48:56 +0800191 break;
192 case GET_BUFFER_GEOMETRY:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800193 if (data->operation & UPDATE_BUFFER_GEOMETRY) {
194 *((BufferDim_t *)param) = data->bufferDim;
195 ret = 0;
196 }
feifanz9cc23032016-03-23 18:48:56 +0800197 break;
198 case GET_REFRESH_RATE:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800199 if (data->operation & UPDATE_REFRESH_RATE) {
200 *((float *)param) = data->refreshrate;
201 ret = 0;
202 }
feifanz9cc23032016-03-23 18:48:56 +0800203 break;
204 case GET_COLOR_SPACE:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800205 if (data->operation & UPDATE_COLOR_SPACE) {
206 *((ColorSpace_t *)param) = data->colorSpace;
207 ret = 0;
208 }
feifanz9cc23032016-03-23 18:48:56 +0800209 break;
210 case GET_MAP_SECURE_BUFFER:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800211 if (data->operation & MAP_SECURE_BUFFER) {
212 *((int32_t *)param) = data->mapSecureBuffer;
213 ret = 0;
214 }
feifanz9cc23032016-03-23 18:48:56 +0800215 break;
216 case GET_S3D_FORMAT:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800217 if (data->operation & S3D_FORMAT) {
218 *((uint32_t *)param) = data->s3dFormat;
219 ret = 0;
220 }
feifanz9cc23032016-03-23 18:48:56 +0800221 break;
222 case GET_LINEAR_FORMAT:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800223 if (data->operation & LINEAR_FORMAT) {
224 *((uint32_t *)param) = data->linearFormat;
225 ret = 0;
226 }
feifanz9cc23032016-03-23 18:48:56 +0800227 break;
228 case GET_IGC:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800229 if (data->operation & SET_IGC) {
230 *((IGC_t *)param) = data->igc;
231 ret = 0;
232 }
feifanz9cc23032016-03-23 18:48:56 +0800233 break;
234 case GET_SINGLE_BUFFER_MODE:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800235 if (data->operation & SET_SINGLE_BUFFER_MODE) {
236 *((uint32_t *)param) = data->isSingleBufferMode;
237 ret = 0;
238 }
feifanz9cc23032016-03-23 18:48:56 +0800239 break;
Ray Zhang8ace84d2016-08-08 19:36:03 +0800240 case GET_S3D_COMP:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800241 if (data->operation & SET_S3D_COMP) {
242 *((S3DGpuComp_t *)param) = data->s3dComp;
243 ret = 0;
244 }
Ray Zhang8ace84d2016-08-08 19:36:03 +0800245 break;
Naseer Ahmede8f254d2016-08-02 20:06:40 -0400246 case GET_VT_TIMESTAMP:
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800247 if (data->operation & SET_VT_TIMESTAMP) {
248 *((uint64_t *)param) = data->vtTimeStamp;
249 ret = 0;
250 }
Naseer Ahmede8f254d2016-08-02 20:06:40 -0400251 break;
Arun Kumar K.Rb2771bf2016-10-03 21:38:23 -0700252 case GET_COLOR_METADATA:
Uday Kiran Pichika5649e1c2017-07-11 12:04:30 +0530253#ifdef USE_COLOR_METADATA
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800254 if (data->operation & COLOR_METADATA) {
255 *((ColorMetaData *)param) = data->color;
256 ret = 0;
257 }
Arun Kumar K.Rb2771bf2016-10-03 21:38:23 -0700258#endif
259 break;
Gurunath Ramaswamyb494c022017-07-04 13:47:46 -0700260 case GET_UBWC_CR_STATS_INFO:
261 if (data->operation & SET_UBWC_CR_STATS_INFO) {
262 struct UBWCStats* stats = (struct UBWCStats*)param;
263 int numelems = sizeof(data->ubwcCRStats) / sizeof(struct UBWCStats);
264 for (int i = 0; i < numelems; i++) {
265 stats[i] = data->ubwcCRStats[i];
266 }
267 ret = 0;
268 }
269 break;
feifanz9cc23032016-03-23 18:48:56 +0800270 default:
271 ALOGE("Unknown paramType %d", paramType);
272 break;
273 }
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800274 return ret;
feifanz9cc23032016-03-23 18:48:56 +0800275}
276
277int copyMetaData(struct private_handle_t *src, struct private_handle_t *dst) {
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -0400278 auto err = validateAndMap(src);
279 if (err != 0)
280 return err;
281
282 err = validateAndMap(dst);
283 if (err != 0)
284 return err;
feifanz9cc23032016-03-23 18:48:56 +0800285
Naseer Ahmed3b3a19c2017-03-28 15:17:27 -0400286 MetaData_t *src_data = reinterpret_cast <MetaData_t *>(src->base_metadata);
287 MetaData_t *dst_data = reinterpret_cast <MetaData_t *>(dst->base_metadata);
Naseer Ahmede9b87622017-07-06 12:53:15 -0400288 *dst_data = *src_data;
feifanz9cc23032016-03-23 18:48:56 +0800289 return 0;
290}
Naseer Ahmed2e6bee12017-04-13 22:45:54 -0400291
292int copyMetaDataVaToHandle(MetaData_t *src_data, struct private_handle_t *dst) {
293 int err = -EINVAL;
294 if (src_data == nullptr)
295 return err;
296
297 err = validateAndMap(dst);
298 if (err != 0)
299 return err;
300
301 MetaData_t *dst_data = reinterpret_cast <MetaData_t *>(dst->base_metadata);
Naseer Ahmede9b87622017-07-06 12:53:15 -0400302 *dst_data = *src_data;
Naseer Ahmed2e6bee12017-04-13 22:45:54 -0400303 return 0;
304}
305
306int copyMetaDataHandleToVa(struct private_handle_t *src, MetaData_t *dst_data) {
307 int err = -EINVAL;
308 if (dst_data == nullptr)
309 return err;
310
311 err = validateAndMap(src);
312 if (err != 0)
313 return err;
314
315 MetaData_t *src_data = reinterpret_cast <MetaData_t *>(src->base_metadata);
Naseer Ahmede9b87622017-07-06 12:53:15 -0400316 *dst_data = *src_data;
Naseer Ahmed2e6bee12017-04-13 22:45:54 -0400317 return 0;
318}
319
320int copyMetaDataVaToVa(MetaData_t *src_data, MetaData_t *dst_data) {
321 int err = -EINVAL;
322 if (src_data == nullptr)
323 return err;
324
325 if (dst_data == nullptr)
326 return err;
327
Naseer Ahmede9b87622017-07-06 12:53:15 -0400328 *dst_data = *src_data;
Naseer Ahmed2e6bee12017-04-13 22:45:54 -0400329 return 0;
330}
331