blob: c676098cbbbee916234ee1b6a3fed4dd452f18b9 [file] [log] [blame]
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -08001/*
feifanz9cc23032016-03-23 18:48:56 +08002 * Copyright (c) 2012-2016, 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>
34#include <gralloc_priv.h>
Arun Kumar K.Rf15adc02014-01-21 21:26:25 -080035#define __STDC_FORMAT_MACROS 1
36#include <inttypes.h>
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -080037#include "qdMetaData.h"
38
39int setMetaData(private_handle_t *handle, DispParamType paramType,
40 void *param) {
Prabhanjan Kandula1ef8e6e2016-08-19 11:46:47 +053041 if (private_handle_t::validate(handle)) {
42 ALOGE("%s: Private handle is invalid! handle=%p", __func__, handle);
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -080043 return -1;
44 }
45 if (handle->fd_metadata == -1) {
46 ALOGE("%s: Bad fd for extra data!", __func__);
47 return -1;
48 }
49 unsigned long size = ROUND_UP_PAGESIZE(sizeof(MetaData_t));
50 void *base = mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_SHARED,
51 handle->fd_metadata, 0);
Ray Zhang566adac2014-04-14 15:32:04 +080052 if (base == reinterpret_cast<void*>(MAP_FAILED)) {
53 ALOGE("%s: mmap() failed: error is %s!", __func__, strerror(errno));
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -080054 return -1;
55 }
56 MetaData_t *data = reinterpret_cast <MetaData_t *>(base);
Prabhanjan Kandula1ef8e6e2016-08-19 11:46:47 +053057 // If parameter is NULL reset the specific MetaData Key
58 if (!param) {
59 data->operation &= ~paramType;
60 return munmap(base, size);
61 }
62
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -080063 data->operation |= paramType;
64 switch (paramType) {
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -080065 case PP_PARAM_INTERLACED:
66 data->interlaced = *((int32_t *)param);
67 break;
Ramkumar Radhakrishnan92f3abe2013-06-05 13:52:40 -070068 case UPDATE_BUFFER_GEOMETRY:
Dileep Marchya2295fdd2015-08-12 17:04:14 -070069 data->bufferDim = *((BufferDim_t *)param);
Arun Kumar K.Ra727a882014-08-20 17:14:26 -070070 break;
71 case UPDATE_REFRESH_RATE:
feifanz9cc23032016-03-23 18:48:56 +080072 data->refreshrate = *((float *)param);
Arun Kumar K.Ra727a882014-08-20 17:14:26 -070073 break;
Shuzhen Wang0d113482014-01-28 16:10:22 -080074 case UPDATE_COLOR_SPACE:
75 data->colorSpace = *((ColorSpace_t *)param);
76 break;
Arun Kumar K.Rda2f69b2014-09-30 15:45:37 -070077 case MAP_SECURE_BUFFER:
78 data->mapSecureBuffer = *((int32_t *)param);
79 break;
Naseer Ahmed3324ff72015-01-21 17:14:44 -050080 case S3D_FORMAT:
81 data->s3dFormat = *((uint32_t *)param);
82 break;
Sushil Chauhane7acc3c2015-06-23 16:22:30 -070083 case LINEAR_FORMAT:
84 data->linearFormat = *((uint32_t *)param);
85 break;
Dileep Marchya1a7e1f12015-09-25 19:11:57 -070086 case SET_IGC:
87 data->igc = *((IGC_t *)param);
88 break;
Saurabh Shah95f83682015-10-16 10:30:04 -070089 case SET_SINGLE_BUFFER_MODE:
Saurabh Shahb8067a42015-11-06 16:52:02 -080090 data->isSingleBufferMode = *((uint32_t *)param);
Saurabh Shah95f83682015-10-16 10:30:04 -070091 break;
Ray Zhang8ace84d2016-08-08 19:36:03 +080092 case SET_S3D_COMP:
93 data->s3dComp = *((S3DGpuComp_t *)param);
94 break;
95 default:
96 ALOGE("Unknown paramType %d", paramType);
97 break;
98 }
99 if(munmap(base, size))
100 ALOGE("%s: failed to unmap ptr %p, err %d", __func__, (void*)base,
101 errno);
102 return 0;
103}
104
105int clearMetaData(private_handle_t *handle, DispParamType paramType) {
106 if (!handle) {
107 ALOGE("%s: Private handle is null!", __func__);
108 return -1;
109 }
110 if (handle->fd_metadata == -1) {
111 ALOGE("%s: Bad fd for extra data!", __func__);
112 return -1;
113 }
114
115 unsigned long size = ROUND_UP_PAGESIZE(sizeof(MetaData_t));
116 void *base = mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_SHARED,
117 handle->fd_metadata, 0);
118 if (base == reinterpret_cast<void*>(MAP_FAILED)) {
119 ALOGE("%s: mmap() failed: error is %s!", __func__, strerror(errno));
120 return -1;
121 }
122 MetaData_t *data = reinterpret_cast <MetaData_t *>(base);
123 data->operation &= ~paramType;
124 switch (paramType) {
125 case SET_S3D_COMP:
126 data->s3dComp.displayId = -1;
127 data->s3dComp.s3dMode = 0;
128 break;
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -0800129 default:
130 ALOGE("Unknown paramType %d", paramType);
131 break;
132 }
133 if(munmap(base, size))
Dileep Kumar Reddibf333c72014-02-25 14:32:51 +0530134 ALOGE("%s: failed to unmap ptr %p, err %d", __func__, (void*)base,
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -0800135 errno);
136 return 0;
137}
feifanz9cc23032016-03-23 18:48:56 +0800138
139int getMetaData(private_handle_t *handle, DispFetchParamType paramType,
140 void *param) {
141 if (!handle) {
142 ALOGE("%s: Private handle is null!", __func__);
143 return -1;
144 }
145 if (handle->fd_metadata == -1) {
146 ALOGE("%s: Bad fd for extra data!", __func__);
147 return -1;
148 }
149 if (!param) {
150 ALOGE("%s: input param is null!", __func__);
151 return -1;
152 }
153 unsigned long size = ROUND_UP_PAGESIZE(sizeof(MetaData_t));
154 void *base = mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_SHARED,
155 handle->fd_metadata, 0);
156 if (base == reinterpret_cast<void*>(MAP_FAILED)) {
157 ALOGE("%s: mmap() failed: error is %s!", __func__, strerror(errno));
158 return -1;
159 }
160
161 MetaData_t *data = reinterpret_cast <MetaData_t *>(base);
feifanz9cc23032016-03-23 18:48:56 +0800162 switch (paramType) {
163 case GET_PP_PARAM_INTERLACED:
164 *((int32_t *)param) = data->interlaced;
165 break;
166 case GET_BUFFER_GEOMETRY:
167 *((BufferDim_t *)param) = data->bufferDim;
168 break;
169 case GET_REFRESH_RATE:
170 *((float *)param) = data->refreshrate;
171 break;
172 case GET_COLOR_SPACE:
173 *((ColorSpace_t *)param) = data->colorSpace;
174 break;
175 case GET_MAP_SECURE_BUFFER:
176 *((int32_t *)param) = data->mapSecureBuffer;
177 break;
178 case GET_S3D_FORMAT:
179 *((uint32_t *)param) = data->s3dFormat;
180 break;
181 case GET_LINEAR_FORMAT:
182 *((uint32_t *)param) = data->linearFormat;
183 break;
184 case GET_IGC:
185 *((IGC_t *)param) = data->igc;
186 break;
187 case GET_SINGLE_BUFFER_MODE:
188 *((uint32_t *)param) = data->isSingleBufferMode ;
189 break;
Ray Zhang8ace84d2016-08-08 19:36:03 +0800190 case GET_S3D_COMP:
191 *((S3DGpuComp_t *)param) = data->s3dComp;
192 break;
feifanz9cc23032016-03-23 18:48:56 +0800193 default:
194 ALOGE("Unknown paramType %d", paramType);
195 break;
196 }
197 if(munmap(base, size))
198 ALOGE("%s: failed to unmap ptr %p, err %d", __func__, (void*)base,
199 errno);
200 return 0;
201}
202
203int copyMetaData(struct private_handle_t *src, struct private_handle_t *dst) {
204 if (!src || !dst) {
205 ALOGE("%s: Private handle is null!", __func__);
206 return -1;
207 }
208 if (src->fd_metadata == -1) {
209 ALOGE("%s: Bad fd for src extra data!", __func__);
210 return -1;
211 }
212 if (dst->fd_metadata == -1) {
213 ALOGE("%s: Bad fd for dst extra data!", __func__);
214 return -1;
215 }
216
217 unsigned long size = ROUND_UP_PAGESIZE(sizeof(MetaData_t));
218
219 void *base_src = mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_SHARED,
220 src->fd_metadata, 0);
221 if (base_src == reinterpret_cast<void*>(MAP_FAILED)) {
222 ALOGE("%s: src mmap() failed: error is %s!", __func__, strerror(errno));
223 return -1;
224 }
225
226 void *base_dst = mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_SHARED,
227 dst->fd_metadata, 0);
228 if (base_dst == reinterpret_cast<void*>(MAP_FAILED)) {
229 ALOGE("%s: dst mmap() failed: error is %s!", __func__, strerror(errno));
230 return -1;
231 }
232
233 memcpy(base_dst, base_src, size);
234
235 if(munmap(base_src, size))
236 ALOGE("%s: failed to unmap src ptr %p, err %d", __func__, (void*)base_src,
237 errno);
238 if(munmap(base_dst, size))
239 ALOGE("%s: failed to unmap src ptr %p, err %d", __func__, (void*)base_dst,
240 errno);
241 return 0;
242}