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