• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "display_gralloc_gbm.h"
17 #include <cstdio>
18 #include <unistd.h>
19 #include <cerrno>
20 #include <cinttypes>
21 #include <climits>
22 #include <cstring>
23 #include <fcntl.h>
24 #include <pthread.h>
25 #include <sys/mman.h>
26 #include <sys/ioctl.h>
27 #include <xf86drm.h>
28 #include <securec.h>
29 #include <linux/dma-buf.h>
30 #include "drm_fourcc.h"
31 #include "hi_gbm.h"
32 #include "hdf_dlist.h"
33 #include "display_gralloc_private.h"
34 #include "display_log.h"
35 #include "v1_0/display_composer_type.h"
36 
37 namespace OHOS {
38 namespace HDI {
39 namespace DISPLAY {
40 using namespace OHOS::HDI::Display::Composer::V1_0;
41 using namespace OHOS::HDI::Display::Buffer::V1_0;
42 
43 const char *g_drmFileNode = "/dev/dri/card0";
44 static GrallocManager *g_grallocManager = nullptr;
45 static pthread_mutex_t g_lock;
46 
47 using PixelFormatConvertTbl = struct {
48     uint32_t drmFormat;
49     PixelFormat pixFormat;
50 };
51 
52 using ValueStrMap = struct {
53     uint32_t value;
54     const char *str;
55 };
56 
GetGrallocManager(void)57 static GrallocManager *GetGrallocManager(void)
58 {
59     if (g_grallocManager == nullptr) {
60         g_grallocManager = (GrallocManager *)malloc(sizeof(GrallocManager));
61         errno_t eok = memset_s(g_grallocManager, sizeof(GrallocManager), 0, sizeof(GrallocManager));
62         if (eok != EOK) {
63             DISPLAY_LOGE("memset_s failed");
64         }
65         if (g_grallocManager == nullptr) {
66             DISPLAY_LOGE("gralloc manager malloc failed");
67         }
68     }
69     return g_grallocManager;
70 }
71 
GetPixelFmtStr(PixelFormat format)72 const char *GetPixelFmtStr(PixelFormat format)
73 {
74     static const ValueStrMap pixelStrMaps[] = {
75         {PIXEL_FMT_CLUT8, "PIXEL_FMT_CLUT8"}, {PIXEL_FMT_CLUT1, "PIXEL_FMT_CLUT1"},
76         {PIXEL_FMT_CLUT4, "PIXEL_FMT_CLUT4"}, {PIXEL_FMT_RGB_565, "PIXEL_FMT_RGB_565"},
77         {PIXEL_FMT_RGBA_5658, "IXEL_FMT_RGBA_5658"}, {PIXEL_FMT_RGBX_4444, "PIXEL_FMT_RGBX_4444"},
78         {PIXEL_FMT_RGBA_4444, "PIXEL_FMT_RGBA_4444"}, {PIXEL_FMT_RGB_444, "PIXEL_FMT_RGB_444"},
79         {PIXEL_FMT_RGBX_5551, "PIXEL_FMT_RGBX_5551"}, {PIXEL_FMT_RGBA_5551, "PIXEL_FMT_RGBA_5551"},
80         {PIXEL_FMT_RGB_555, "PIXEL_FMT_RGB_555"}, {PIXEL_FMT_RGBX_8888, "PIXEL_FMT_RGBX_8888"},
81         {PIXEL_FMT_RGBA_8888, "PIXEL_FMT_RGBA_8888"}, {PIXEL_FMT_RGB_888, "PIXEL_FMT_RGB_888"},
82         {PIXEL_FMT_BGR_565, "PIXEL_FMT_BGR_565"}, {PIXEL_FMT_BGRX_4444, "PIXEL_FMT_BGRX_4444"},
83         {PIXEL_FMT_BGRA_4444, "PIXEL_FMT_BGRA_4444"}, {PIXEL_FMT_BGRX_5551, "PIXEL_FMT_BGRX_5551"},
84         {PIXEL_FMT_BGRA_5551, "PIXEL_FMT_BGRA_5551"}, {PIXEL_FMT_BGRX_8888, "PIXEL_FMT_BGRX_8888"},
85         {PIXEL_FMT_BGRA_8888, "PIXEL_FMT_BGRA_8888"}, {PIXEL_FMT_YUV_422_I, "PIXEL_FMT_YUV_422_I"},
86         {PIXEL_FMT_YUV_422_I, "PIXEL_FMT_YUV_422_I"}, {PIXEL_FMT_YCBCR_422_SP, "PIXEL_FMT_YCBCR_422_SP"},
87         {PIXEL_FMT_YCRCB_422_SP, "PIXEL_FMT_YCRCB_422_SP"}, {PIXEL_FMT_YCBCR_420_SP, "PIXEL_FMT_YCBCR_420_SP"},
88         {PIXEL_FMT_YCRCB_420_SP, "PIXEL_FMT_YCRCB_420_SP"}, {PIXEL_FMT_YCBCR_422_P, "PIXEL_FMT_YCBCR_422_P"},
89         {PIXEL_FMT_YCRCB_422_P, "PIXEL_FMT_YCRCB_422_P"}, {PIXEL_FMT_YCBCR_420_P, "PIXEL_FMT_YCBCR_420_P"},
90         {PIXEL_FMT_YCRCB_420_P, "PIXEL_FMT_YCRCB_420_P"}, {PIXEL_FMT_YUYV_422_PKG, "PIXEL_FMT_YUYV_422_PKG"},
91         {PIXEL_FMT_UYVY_422_PKG, "PIXEL_FMT_UYVY_422_PKG"}, {PIXEL_FMT_YVYU_422_PKG, "PIXEL_FMT_YVYU_422_PKG"},
92         {PIXEL_FMT_VYUY_422_PKG, "PIXEL_FMT_VYUY_422_PKG"}, {PIXEL_FMT_BUTT, "PIXEL_FMT_BUTT"},
93     };
94     static const char *unknown = "unknown format";
95     for (uint32_t i = 0; i < sizeof(pixelStrMaps) / sizeof(pixelStrMaps[0]); i++) {
96         if (pixelStrMaps[i].value == format) {
97             return pixelStrMaps[i].str;
98         }
99     }
100     DISPLAY_LOGE("GetPixelFmtStr unknown format %{public}d", format);
101     return unknown;
102 }
103 
GetDrmFmtStr(uint32_t format)104 const char *GetDrmFmtStr(uint32_t format)
105 {
106     static const ValueStrMap formatStrMaps[] = {
107         {DRM_FORMAT_C8, "DRM_FORMAT_C8" }, {DRM_FORMAT_R8, "DRM_FORMAT_R8" },
108         {DRM_FORMAT_R16, "DRM_FORMAT_R16"}, {DRM_FORMAT_RG88, "DRM_FORMAT_RG88"},
109         {DRM_FORMAT_GR88, "DRM_FORMAT_GR88"}, {DRM_FORMAT_RG1616, "DRM_FORMAT_RG1616"},
110         {DRM_FORMAT_GR1616, "DRM_FORMAT_GR1616"}, {DRM_FORMAT_RGB332, "DRM_FORMAT_RGB332"},
111         {DRM_FORMAT_BGR233, "DRM_FORMAT_BGR233"}, {DRM_FORMAT_XRGB4444, "DRM_FORMAT_XRGB4444"},
112         {DRM_FORMAT_XBGR4444, "DRM_FORMAT_XBGR4444"}, {DRM_FORMAT_RGBX4444, "DRM_FORMAT_RGBX4444"},
113         {DRM_FORMAT_BGRX4444, "DRM_FORMAT_BGRX4444"}, {DRM_FORMAT_ARGB4444, "DRM_FORMAT_ARGB4444"},
114         {DRM_FORMAT_ABGR4444, "DRM_FORMAT_ABGR4444"}, {DRM_FORMAT_RGBA4444, "DRM_FORMAT_RGBA4444"},
115         {DRM_FORMAT_BGRA4444, "DRM_FORMAT_BGRA4444"}, {DRM_FORMAT_XRGB1555, "DRM_FORMAT_XRGB1555"},
116         {DRM_FORMAT_XBGR1555, "DRM_FORMAT_XBGR1555"}, {DRM_FORMAT_RGBX5551, "DRM_FORMAT_RGBX5551"},
117         {DRM_FORMAT_BGRX5551, "DRM_FORMAT_BGRX5551"}, {DRM_FORMAT_ARGB1555, "DRM_FORMAT_ARGB1555"},
118         {DRM_FORMAT_ABGR1555, "DRM_FORMAT_ABGR1555"}, {DRM_FORMAT_RGBA5551, "DRM_FORMAT_RGBA5551"},
119         {DRM_FORMAT_BGRA5551, "DRM_FORMAT_BGRA5551"}, {DRM_FORMAT_RGB565, "DRM_FORMAT_RGB565"},
120         {DRM_FORMAT_BGR565, "DRM_FORMAT_BGR565"}, {DRM_FORMAT_RGB888, "DRM_FORMAT_RGB888"},
121         {DRM_FORMAT_BGR888, "DRM_FORMAT_BGR888"}, {DRM_FORMAT_XRGB8888, "DRM_FORMAT_XRGB8888"},
122         {DRM_FORMAT_XBGR8888, "DRM_FORMAT_XBGR8888"}, {DRM_FORMAT_RGBX8888, "DRM_FORMAT_RGBX8888"},
123         {DRM_FORMAT_BGRX8888, "DRM_FORMAT_BGRX8888"}, {DRM_FORMAT_ARGB8888, "DRM_FORMAT_ARGB8888"},
124         {DRM_FORMAT_ABGR8888, "DRM_FORMAT_ABGR8888"}, {DRM_FORMAT_RGBA8888, "DRM_FORMAT_RGBA8888"},
125         {DRM_FORMAT_BGRA8888, "DRM_FORMAT_BGRA8888"}, {DRM_FORMAT_XRGB2101010, "DRM_FORMAT_XRGB2101010"},
126         {DRM_FORMAT_BGRX1010102, "DRM_FORMAT_BGRX1010102"}, {DRM_FORMAT_ARGB2101010, "DRM_FORMAT_ARGB2101010"},
127         {DRM_FORMAT_ABGR2101010, "DRM_FORMAT_ABGR2101010"}, {DRM_FORMAT_RGBA1010102, "DRM_FORMAT_RGBA1010102"},
128         {DRM_FORMAT_YVYU, "DRM_FORMAT_YVYU"}, {DRM_FORMAT_UYVY, "DRM_FORMAT_UYVY"},
129         {DRM_FORMAT_VYUY, "DRM_FORMAT_VYUY"}, {DRM_FORMAT_AYUV, "DRM_FORMAT_AYUV"},
130         {DRM_FORMAT_NV12, "DRM_FORMAT_NV12"}, {DRM_FORMAT_NV21, "DRM_FORMAT_NV21"},
131         {DRM_FORMAT_NV16, "DRM_FORMAT_NV16"}, {DRM_FORMAT_NV61, "DRM_FORMAT_NV61"},
132         {DRM_FORMAT_NV24, "DRM_FORMAT_NV24"}, {DRM_FORMAT_NV42, "DRM_FORMAT_NV42"},
133         {DRM_FORMAT_YUV410, "DRM_FORMAT_YUV410"}, {DRM_FORMAT_YVU410, "DRM_FORMAT_YVU410"},
134         {DRM_FORMAT_YUV411, "DRM_FORMAT_YUV411"}, {DRM_FORMAT_YVU411, "DRM_FORMAT_YVU411"},
135         {DRM_FORMAT_YUV420, "DRM_FORMAT_YUV420"}, {DRM_FORMAT_YVU420, "DRM_FORMAT_YVU420"},
136         {DRM_FORMAT_YUV422, "DRM_FORMAT_YUV422"}, {DRM_FORMAT_YVU422, "DRM_FORMAT_YVU422"},
137         {DRM_FORMAT_YUV444, "DRM_FORMAT_YUV444"}, {DRM_FORMAT_YVU444, "DRM_FORMAT_YVU444"},
138     };
139 
140     static const char *unknown = "unknown drm format";
141     for (uint32_t i = 0; i < sizeof(formatStrMaps) / sizeof(formatStrMaps[0]); i++) {
142         if (formatStrMaps[i].value == format) {
143             return formatStrMaps[i].str;
144         }
145     }
146     DISPLAY_LOGE("GetDrmFmtStr unknown format %{public}d", format);
147     return unknown;
148 }
149 
ConvertFormatToDrm(PixelFormat fmtIn)150 static uint32_t ConvertFormatToDrm(PixelFormat fmtIn)
151 {
152     static const PixelFormatConvertTbl convertTable[] = {
153         {DRM_FORMAT_RGBX8888, PIXEL_FMT_RGBX_8888}, {DRM_FORMAT_RGBA8888, PIXEL_FMT_RGBA_8888},
154         {DRM_FORMAT_RGB888, PIXEL_FMT_RGB_888}, {DRM_FORMAT_RGB565, PIXEL_FMT_BGR_565},
155         {DRM_FORMAT_BGRX4444, PIXEL_FMT_BGRX_4444}, {DRM_FORMAT_BGRA4444, PIXEL_FMT_BGRA_4444},
156         {DRM_FORMAT_RGBA4444, PIXEL_FMT_RGBA_4444}, {DRM_FORMAT_RGBX4444, PIXEL_FMT_RGBX_4444},
157         {DRM_FORMAT_BGRX5551, PIXEL_FMT_BGRX_5551}, {DRM_FORMAT_BGRA5551, PIXEL_FMT_BGRA_5551},
158         {DRM_FORMAT_BGRX8888, PIXEL_FMT_BGRX_8888}, {DRM_FORMAT_BGRA8888, PIXEL_FMT_BGRA_8888},
159         {DRM_FORMAT_NV12, PIXEL_FMT_YCBCR_420_SP}, {DRM_FORMAT_NV21, PIXEL_FMT_YCRCB_420_SP},
160         {DRM_FORMAT_YUV420, PIXEL_FMT_YCBCR_420_P}, {DRM_FORMAT_YVU420, PIXEL_FMT_YCRCB_420_P},
161         {DRM_FORMAT_NV16, PIXEL_FMT_YCBCR_422_SP}, {DRM_FORMAT_NV61, PIXEL_FMT_YCRCB_422_SP},
162         {DRM_FORMAT_YUV422, PIXEL_FMT_YCBCR_422_P}, {DRM_FORMAT_YVU422, PIXEL_FMT_YCRCB_422_P},
163     };
164     uint32_t fmtOut = 0;
165     for (uint32_t i = 0; i < sizeof(convertTable) / sizeof(convertTable[0]); i++) {
166         if (convertTable[i].pixFormat == fmtIn) {
167             fmtOut = convertTable[i].drmFormat;
168         }
169     }
170     DISPLAY_LOGD("fmtIn %{public}d : %{public}s, outFmt %{public}d : %{public}s", fmtIn,
171         GetPixelFmtStr(fmtIn), fmtOut, GetDrmFmtStr(fmtOut));
172     return fmtOut;
173 }
174 
ConvertUsageToGbm(uint64_t inUsage)175 static uint64_t ConvertUsageToGbm(uint64_t inUsage)
176 {
177     uint64_t outUsage = GBM_BO_USE_TEXTURING;
178     if (inUsage & HBM_USE_CPU_READ) {
179         outUsage |= GBM_BO_USE_SW_READ_OFTEN;
180     }
181     if (inUsage & HBM_USE_CPU_WRITE) {
182         outUsage |= GBM_BO_USE_SW_WRITE_OFTEN;
183     }
184     DISPLAY_LOGD("outUsage 0x%{public}" PRIx64 "", outUsage);
185     return outUsage;
186 }
187 
InitGbmDevice(const char * drmFile,GrallocManager * grallocManager)188 static int32_t InitGbmDevice(const char *drmFile, GrallocManager *grallocManager)
189 {
190     DISPLAY_LOGD();
191     char path[PATH_MAX] = {0};
192     if (grallocManager->gbmDevice == nullptr) {
193         if (realpath(drmFile, path) == nullptr) {
194             DISPLAY_LOGE(" drm File : %{public}s is not a realpath, errno: %{public}s", drmFile, strerror(errno));
195             return HDF_ERR_INVALID_PARAM;
196         }
197         int drmFd = open(path, O_RDWR);
198         if (drmFd < 0) {
199             DISPLAY_LOGE("drm file:%{public}s open failed %{public}s", drmFile, strerror(errno));
200             return HDF_ERR_BAD_FD;
201         }
202         drmDropMaster(drmFd);
203         struct gbm_device *gbmDevice = hdi_gbm_create_device(drmFd);
204         grallocManager->drmFd = drmFd;
205         if (gbmDevice == nullptr) {
206             close(drmFd);
207             grallocManager->drmFd = -1;
208             DISPLAY_LOGE("gbm device create failed");
209             return HDF_FAILURE;
210         }
211         grallocManager->gbmDevice = gbmDevice;
212         grallocManager->drmFd = drmFd;
213         DListHeadInit(&grallocManager->gbmBoHead);
214     }
215     return HDF_SUCCESS;
216 }
217 
DeInitGbmDevice(GrallocManager * grallocManager)218 static void DeInitGbmDevice(GrallocManager *grallocManager)
219 {
220     DISPLAY_LOGD();
221     hdi_gbm_device_destroy(grallocManager->gbmDevice);
222     if (grallocManager->drmFd > 0) {
223         close(grallocManager->drmFd);
224         grallocManager->drmFd = -1;
225     }
226     grallocManager->gbmDevice = nullptr;
227 }
228 
DmaBufferSync(const BufferHandle * handle,bool start)229 static int32_t DmaBufferSync(const BufferHandle *handle, bool start)
230 {
231     DISPLAY_LOGD();
232     struct dma_buf_sync syncPrm;
233     errno_t eok = memset_s(&syncPrm, sizeof(syncPrm), 0, sizeof(syncPrm));
234     DISPLAY_CHK_RETURN((eok != EOK), HDF_ERR_INVALID_PARAM, DISPLAY_LOGE("dma buffer sync memset_s failed"));
235 
236     if (handle->usage & HBM_USE_CPU_WRITE) {
237         syncPrm.flags |= DMA_BUF_SYNC_WRITE;
238     }
239 
240     if (handle->usage & HBM_USE_CPU_READ) {
241         syncPrm.flags |= DMA_BUF_SYNC_READ;
242     }
243 
244     if (start) {
245         syncPrm.flags |= DMA_BUF_SYNC_START;
246     } else {
247         syncPrm.flags |= DMA_BUF_SYNC_END;
248     }
249     int retry = 6;
250     int ret;
251     do {
252         ret = ioctl(handle->fd, DMA_BUF_IOCTL_SYNC, &syncPrm);
253     } while ((retry--) && (ret != -EAGAIN) && (ret != -EINTR));
254 
255     if (ret < 0) {
256         DISPLAY_LOGE("sync failed");
257         return HDF_ERR_DEVICE_BUSY;
258     }
259     return HDF_SUCCESS;
260 }
261 
InitBufferHandle(struct gbm_bo * bo,int fd,const AllocInfo * info,PriBufferHandle * buffer)262 static void InitBufferHandle(struct gbm_bo *bo, int fd, const AllocInfo *info, PriBufferHandle *buffer)
263 {
264     BufferHandle *bufferHandle = &(buffer->hdl);
265     bufferHandle->fd = fd;
266     bufferHandle->reserveFds = 0;
267     bufferHandle->reserveInts = 0;
268     bufferHandle->stride = hdi_gbm_bo_get_stride(bo);
269     bufferHandle->width = hdi_gbm_bo_get_width(bo);
270     bufferHandle->height = hdi_gbm_bo_get_height(bo);
271     bufferHandle->usage = info->usage;
272     bufferHandle->format = info->format;
273     bufferHandle->virAddr = nullptr;
274     bufferHandle->size = hdi_gbm_bo_get_size(bo);
275 }
276 
GbmAllocMem(const AllocInfo * info,BufferHandle ** buffer)277 int32_t GbmAllocMem(const AllocInfo *info, BufferHandle **buffer)
278 {
279     DISPLAY_CHK_RETURN((info == nullptr), HDF_FAILURE, DISPLAY_LOGE("info is null"));
280     DISPLAY_CHK_RETURN((buffer == nullptr), HDF_FAILURE, DISPLAY_LOGE("buffer is null"));
281     PriBufferHandle *priBuffer = nullptr;
282     uint32_t drmFmt = ConvertFormatToDrm(static_cast<PixelFormat>(info->format));
283     DISPLAY_CHK_RETURN((drmFmt == INVALID_PIXEL_FMT), HDF_ERR_NOT_SUPPORT,
284         DISPLAY_LOGE("format %{public}d can not support", info->format));
285     DISPLAY_LOGD("requeset width %{public}d, heigt %{public}d, format %{public}d",
286         info->width, info->height, drmFmt);
287 
288     GRALLOC_LOCK();
289     GrallocManager *grallocManager = GetGrallocManager();
290     DISPLAY_CHK_RETURN((grallocManager == nullptr), HDF_ERR_INVALID_PARAM, DISPLAY_LOGE("gralloc manager failed");
291         GRALLOC_UNLOCK());
292     struct gbm_bo *bo =
293         hdi_gbm_bo_create(grallocManager->gbmDevice, info->width, info->height, drmFmt, ConvertUsageToGbm(info->usage));
294     DISPLAY_CHK_RETURN((bo == nullptr), HDF_DEV_ERR_NO_MEMORY, DISPLAY_LOGE("gbm create bo failed"); \
295         GRALLOC_UNLOCK());
296 
297     int fd = hdi_gbm_bo_get_fd(bo);
298     DISPLAY_CHK_RETURN((fd < 0), HDF_ERR_BAD_FD, DISPLAY_LOGE("gbm can not get fd"); \
299         hdi_gbm_bo_destroy(bo); \
300         GRALLOC_UNLOCK());
301 
302     priBuffer = (PriBufferHandle *)malloc(sizeof(PriBufferHandle));
303     if (priBuffer == nullptr) {
304         DISPLAY_LOGE("bufferhandle malloc failed");
305         close(fd);
306         hdi_gbm_bo_destroy(bo);
307         GRALLOC_UNLOCK();
308         return HDF_FAILURE;
309     }
310 
311     errno_t eok = memset_s(priBuffer, sizeof(PriBufferHandle), 0, sizeof(PriBufferHandle));
312     if (eok != EOK) {
313         DISPLAY_LOGE("memset_s failed");
314         close(fd);
315         hdi_gbm_bo_destroy(bo);
316         if (priBuffer != nullptr) {
317             free(priBuffer);
318         }
319         GRALLOC_UNLOCK();
320         return HDF_FAILURE;
321     }
322 
323     InitBufferHandle(bo, fd, info, priBuffer);
324     *buffer = &priBuffer->hdl;
325     hdi_gbm_bo_destroy(bo);
326     GRALLOC_UNLOCK();
327     return HDF_SUCCESS;
328 }
329 
CloseBufferHandle(BufferHandle * handle)330 static void CloseBufferHandle(BufferHandle *handle)
331 {
332     DISPLAY_CHK_RETURN_NOT_VALUE((handle == nullptr), DISPLAY_LOGE("buffer is null"));
333     if (handle->fd >= 0) {
334         close(handle->fd);
335         handle->fd = -1;
336     }
337     const uint32_t reserveFds = handle->reserveFds;
338     for (uint32_t i = 0; i < reserveFds; i++) {
339         if (handle->reserve[i] >= 0) {
340             close(handle->reserve[i]);
341             handle->reserve[i] = -1;
342         }
343     }
344 }
345 
GbmFreeMem(BufferHandle * buffer)346 void GbmFreeMem(BufferHandle *buffer)
347 {
348     DISPLAY_LOGD();
349     DISPLAY_CHK_RETURN_NOT_VALUE((buffer == nullptr), DISPLAY_LOGE("buffer is null"));
350     if ((buffer->virAddr != nullptr) && (GbmUnmap(buffer) != HDF_SUCCESS)) {
351         DISPLAY_LOGE("freeMem unmap buffer failed");
352     }
353     CloseBufferHandle(buffer);
354     free(buffer);
355 }
356 
GbmMmap(BufferHandle * buffer)357 void *GbmMmap(BufferHandle *buffer)
358 {
359     void *virAddr = nullptr;
360     DISPLAY_LOGD();
361     if (buffer == nullptr) {
362         DISPLAY_LOGE("gbmmap the buffer handle is nullptr");
363         return nullptr;
364     }
365     if (buffer->virAddr != nullptr) {
366         DISPLAY_LOGD("the buffer has virtual addr");
367         return buffer->virAddr;
368     }
369     virAddr = mmap(nullptr, buffer->size, PROT_READ | PROT_WRITE, MAP_SHARED, buffer->fd, 0);
370     if (virAddr == reinterpret_cast<void *>(MAP_FAILED)) {
371         DISPLAY_LOGE("mmap failed errno %{public}s, fd : %{public}d", strerror(errno), buffer->fd);
372     }
373     buffer->virAddr = virAddr;
374     return virAddr;
375 }
376 
GbmUnmap(BufferHandle * buffer)377 int32_t GbmUnmap(BufferHandle *buffer)
378 {
379     DISPLAY_LOGD();
380     if (buffer == nullptr) {
381         DISPLAY_LOGE("gbmumap the buffer handle is null");
382         return HDF_FAILURE;
383     }
384 
385     if (buffer->virAddr == nullptr) {
386         DISPLAY_LOGE("virAddr is nullptr , has not map the buffer");
387         return HDF_ERR_INVALID_PARAM;
388     }
389     int ret = munmap(buffer->virAddr, buffer->size);
390     if (ret != 0) {
391         DISPLAY_LOGE("munmap failed err: %{public}s", strerror(errno));
392         return HDF_FAILURE;
393     }
394     buffer->virAddr = nullptr;
395     return HDF_SUCCESS;
396 }
397 
GbmInvalidateCache(BufferHandle * buffer)398 int32_t GbmInvalidateCache(BufferHandle *buffer)
399 {
400     DISPLAY_LOGD();
401     return DmaBufferSync(buffer, true);
402 }
403 
GbmFlushCache(BufferHandle * buffer)404 int32_t GbmFlushCache(BufferHandle *buffer)
405 {
406     DISPLAY_LOGD();
407     return DmaBufferSync(buffer, false);
408 }
409 
GbmGrallocUninitialize(void)410 int32_t GbmGrallocUninitialize(void)
411 {
412     DISPLAY_LOGD();
413     GRALLOC_LOCK();
414     GrallocManager *grallocManager = GetGrallocManager();
415     DISPLAY_CHK_RETURN((grallocManager == nullptr), HDF_ERR_INVALID_PARAM, DISPLAY_LOGE("gralloc manager failed"); \
416         GRALLOC_UNLOCK());
417     grallocManager->referCount--;
418     if (grallocManager->referCount < 0) {
419         DeInitGbmDevice(grallocManager);
420         free(g_grallocManager);
421         g_grallocManager = nullptr;
422     }
423     GRALLOC_UNLOCK();
424     return HDF_SUCCESS;
425 }
426 
GbmGrallocInitialize(void)427 int32_t GbmGrallocInitialize(void)
428 {
429     DISPLAY_LOGD();
430     GRALLOC_LOCK();
431     GrallocManager *grallocManager = GetGrallocManager();
432     DISPLAY_CHK_RETURN((grallocManager == nullptr), HDF_ERR_INVALID_PARAM, DISPLAY_LOGE("gralloc manager failed"); \
433         GRALLOC_UNLOCK());
434     int ret = InitGbmDevice(g_drmFileNode, grallocManager);
435     DISPLAY_CHK_RETURN((ret != HDF_SUCCESS), ret, DISPLAY_LOGE("gralloc manager failed"); \
436         GRALLOC_UNLOCK());
437     grallocManager->referCount++;
438     GRALLOC_UNLOCK();
439     return HDF_SUCCESS;
440 }
441 } // namespace DISPLAY
442 } // namespace HDI
443 } // namespace OHOS
444