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