1 /*
2 * Copyright (C) 2020 Arm Limited. All rights reserved.
3 *
4 * Copyright 2016 The Android Open Source Project
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18 #include "GrallocMapper.h"
19 #include "hidl_common/BufferDescriptor.h"
20 #include "hidl_common/MapperMetadata.h"
21
22 #include "allocator/mali_gralloc_ion.h"
23
24 namespace arm
25 {
26 namespace mapper
27 {
28
29 using android::hardware::graphics::mapper::V4_0::Error;
30 using android::hardware::graphics::mapper::V4_0::BufferDescriptor;
31 using android::hardware::graphics::mapper::V4_0::IMapper;
32 using android::hardware::Return;
33 using android::hardware::hidl_handle;
34 using android::hardware::hidl_vec;
35 using android::hardware::Void;
36
37
GrallocMapper()38 GrallocMapper::GrallocMapper()
39 {
40 }
41
~GrallocMapper()42 GrallocMapper::~GrallocMapper()
43 {
44 mali_gralloc_ion_close();
45 }
46
createDescriptor(const BufferDescriptorInfo & descriptorInfo,createDescriptor_cb hidl_cb)47 Return<void> GrallocMapper::createDescriptor(const BufferDescriptorInfo &descriptorInfo, createDescriptor_cb hidl_cb)
48 {
49 if (common::validateDescriptorInfo(descriptorInfo))
50 {
51 hidl_cb(Error::NONE, common::grallocEncodeBufferDescriptor<uint8_t>(descriptorInfo));
52 }
53 else
54 {
55 MALI_GRALLOC_LOGE("Invalid attributes to create descriptor for Mapper 3.0");
56 hidl_cb(Error::BAD_VALUE, BufferDescriptor());
57 }
58
59 return Void();
60 }
61
importBuffer(const hidl_handle & rawHandle,importBuffer_cb hidl_cb)62 Return<void> GrallocMapper::importBuffer(const hidl_handle &rawHandle, importBuffer_cb hidl_cb)
63 {
64 common::importBuffer(rawHandle, hidl_cb);
65 return Void();
66 }
67
freeBuffer(void * buffer)68 Return<Error> GrallocMapper::freeBuffer(void *buffer)
69 {
70 return common::freeBuffer(buffer);
71 }
72
validateBufferSize(void * buffer,const BufferDescriptorInfo & descriptorInfo,uint32_t in_stride)73 Return<Error> GrallocMapper::validateBufferSize(void *buffer, const BufferDescriptorInfo &descriptorInfo,
74 uint32_t in_stride)
75 {
76 /* All Gralloc allocated buffers must be conform to local descriptor validation */
77 if (!common::validateDescriptorInfo<BufferDescriptorInfo>(descriptorInfo))
78 {
79 MALI_GRALLOC_LOGE("Invalid descriptor attributes for validating buffer size");
80 return Error::BAD_VALUE;
81 }
82 return common::validateBufferSize(buffer, descriptorInfo, in_stride);
83 }
84
lock(void * buffer,uint64_t cpuUsage,const IMapper::Rect & accessRegion,const hidl_handle & acquireFence,lock_cb hidl_cb)85 Return<void> GrallocMapper::lock(void *buffer, uint64_t cpuUsage, const IMapper::Rect &accessRegion,
86 const hidl_handle &acquireFence, lock_cb hidl_cb)
87 {
88 common::lock(buffer, cpuUsage, accessRegion, acquireFence, hidl_cb);
89 return Void();
90 }
91
unlock(void * buffer,unlock_cb hidl_cb)92 Return<void> GrallocMapper::unlock(void *buffer, unlock_cb hidl_cb)
93 {
94 common::unlock(buffer, hidl_cb);
95 return Void();
96 }
97
flushLockedBuffer(void * buffer,flushLockedBuffer_cb hidl_cb)98 Return<void> GrallocMapper::flushLockedBuffer(void *buffer, flushLockedBuffer_cb hidl_cb)
99 {
100 common::flushLockedBuffer(buffer, hidl_cb);
101 return Void();
102 }
103
rereadLockedBuffer(void * buffer)104 Return<Error> GrallocMapper::rereadLockedBuffer(void *buffer)
105 {
106 return common::rereadLockedBuffer(buffer);
107 }
108
get(void * buffer,const MetadataType & metadataType,IMapper::get_cb hidl_cb)109 Return<void> GrallocMapper::get(void *buffer, const MetadataType &metadataType, IMapper::get_cb hidl_cb)
110 {
111 common::get(buffer, metadataType, hidl_cb);
112 return Void();
113 }
114
set(void * buffer,const MetadataType & metadataType,const hidl_vec<uint8_t> & metadata)115 Return<Error> GrallocMapper::set(void *buffer, const MetadataType &metadataType, const hidl_vec<uint8_t> &metadata)
116 {
117 return common::set(buffer, metadataType, metadata);
118 }
119
getFromBufferDescriptorInfo(const BufferDescriptorInfo & description,const MetadataType & metadataType,getFromBufferDescriptorInfo_cb hidl_cb)120 Return<void> GrallocMapper::getFromBufferDescriptorInfo(const BufferDescriptorInfo &description,
121 const MetadataType &metadataType,
122 getFromBufferDescriptorInfo_cb hidl_cb)
123 {
124 common::getFromBufferDescriptorInfo(description, metadataType, hidl_cb);
125 return Void();
126 }
127
getTransportSize(void * buffer,getTransportSize_cb hidl_cb)128 Return<void> GrallocMapper::getTransportSize(void *buffer, getTransportSize_cb hidl_cb)
129 {
130 common::getTransportSize(buffer, hidl_cb);
131 return Void();
132 }
133
isSupported(const IMapper::BufferDescriptorInfo & description,isSupported_cb hidl_cb)134 Return<void> GrallocMapper::isSupported(const IMapper::BufferDescriptorInfo &description, isSupported_cb hidl_cb)
135 {
136 if (!common::validateDescriptorInfo<BufferDescriptorInfo>(description))
137 {
138 MALI_GRALLOC_LOGE("Invalid descriptor attributes for validating buffer size");
139 hidl_cb(Error::BAD_VALUE, false);
140 }
141 common::isSupported(description, hidl_cb);
142 return Void();
143 }
144
listSupportedMetadataTypes(listSupportedMetadataTypes_cb hidl_cb)145 Return<void> GrallocMapper::listSupportedMetadataTypes(listSupportedMetadataTypes_cb hidl_cb)
146 {
147 common::listSupportedMetadataTypes(hidl_cb);
148 return Void();
149 }
150
dumpBuffer(void * buffer,dumpBuffer_cb hidl_cb)151 Return<void> GrallocMapper::dumpBuffer(void *buffer, dumpBuffer_cb hidl_cb)
152 {
153 common::dumpBuffer(buffer, hidl_cb);
154 return Void();
155 }
156
dumpBuffers(dumpBuffers_cb hidl_cb)157 Return<void> GrallocMapper::dumpBuffers(dumpBuffers_cb hidl_cb)
158 {
159 common::dumpBuffers(hidl_cb);
160 return Void();
161 }
162
getReservedRegion(void * buffer,getReservedRegion_cb hidl_cb)163 Return<void> GrallocMapper::getReservedRegion(void *buffer, getReservedRegion_cb hidl_cb)
164 {
165 common::getReservedRegion(buffer, hidl_cb);
166 return Void();
167 }
168
169 } // namespace mapper
170 } // namespace arm
171
HIDL_FETCH_IMapper(const char *)172 extern "C" IMapper *HIDL_FETCH_IMapper(const char * /* name */)
173 {
174 MALI_GRALLOC_LOGV("Arm Module IMapper %d.%d , pid = %d", GRALLOC_VERSION_MAJOR,
175 (HIDL_MAPPER_VERSION_SCALED - (GRALLOC_VERSION_MAJOR * 100)) / 10, getpid());
176
177 return new arm::mapper::GrallocMapper();
178 }
179