1*437bfbebSnyanmisaka /* SPDX-License-Identifier: Apache-2.0 OR MIT */
2*437bfbebSnyanmisaka /*
3*437bfbebSnyanmisaka * Copyright (c) 2010 Rockchip Electronics Co., Ltd.
4*437bfbebSnyanmisaka */
5*437bfbebSnyanmisaka
6*437bfbebSnyanmisaka #define MODULE_TAG "mpp_drm"
7*437bfbebSnyanmisaka
8*437bfbebSnyanmisaka #include <unistd.h>
9*437bfbebSnyanmisaka #include <string.h>
10*437bfbebSnyanmisaka #include <errno.h>
11*437bfbebSnyanmisaka #include <sys/ioctl.h>
12*437bfbebSnyanmisaka #include <sys/mman.h>
13*437bfbebSnyanmisaka
14*437bfbebSnyanmisaka #include <linux/drm.h>
15*437bfbebSnyanmisaka #include <linux/drm_mode.h>
16*437bfbebSnyanmisaka
17*437bfbebSnyanmisaka #include "os_mem.h"
18*437bfbebSnyanmisaka #include "allocator_drm.h"
19*437bfbebSnyanmisaka
20*437bfbebSnyanmisaka #include "mpp_env.h"
21*437bfbebSnyanmisaka #include "mpp_mem.h"
22*437bfbebSnyanmisaka #include "mpp_debug.h"
23*437bfbebSnyanmisaka #include "mpp_common.h"
24*437bfbebSnyanmisaka #include "mpp_runtime.h"
25*437bfbebSnyanmisaka
26*437bfbebSnyanmisaka #define DRM_FUNCTION (0x00000001)
27*437bfbebSnyanmisaka #define DRM_DEVICE (0x00000002)
28*437bfbebSnyanmisaka #define DRM_IOCTL (0x00000004)
29*437bfbebSnyanmisaka
30*437bfbebSnyanmisaka #define drm_dbg(flag, fmt, ...) _mpp_dbg_f(drm_debug, flag, fmt, ## __VA_ARGS__)
31*437bfbebSnyanmisaka #define drm_dbg_func(fmt, ...) drm_dbg(DRM_FUNCTION, fmt, ## __VA_ARGS__)
32*437bfbebSnyanmisaka #define drm_dbg_dev(fmt, ...) drm_dbg(DRM_DEVICE, fmt, ## __VA_ARGS__)
33*437bfbebSnyanmisaka #define drm_dbg_ioctl(fmt, ...) drm_dbg(DRM_IOCTL, fmt, ## __VA_ARGS__)
34*437bfbebSnyanmisaka
35*437bfbebSnyanmisaka static RK_U32 drm_debug = 0;
36*437bfbebSnyanmisaka
37*437bfbebSnyanmisaka /* memory type definitions. */
38*437bfbebSnyanmisaka enum drm_rockchip_gem_mem_type {
39*437bfbebSnyanmisaka /* Physically Continuous memory. */
40*437bfbebSnyanmisaka ROCKCHIP_BO_CONTIG = 1 << 0,
41*437bfbebSnyanmisaka /* cachable mapping. */
42*437bfbebSnyanmisaka ROCKCHIP_BO_CACHABLE = 1 << 1,
43*437bfbebSnyanmisaka /* write-combine mapping. */
44*437bfbebSnyanmisaka ROCKCHIP_BO_WC = 1 << 2,
45*437bfbebSnyanmisaka ROCKCHIP_BO_SECURE = 1 << 3,
46*437bfbebSnyanmisaka /* keep kmap for cma buffer or alloc kmap for other type memory */
47*437bfbebSnyanmisaka ROCKCHIP_BO_ALLOC_KMAP = 1 << 4,
48*437bfbebSnyanmisaka /* alloc page with gfp_dma32 */
49*437bfbebSnyanmisaka ROCKCHIP_BO_DMA32 = 1 << 5,
50*437bfbebSnyanmisaka ROCKCHIP_BO_MASK = ROCKCHIP_BO_CONTIG | ROCKCHIP_BO_CACHABLE |
51*437bfbebSnyanmisaka ROCKCHIP_BO_WC | ROCKCHIP_BO_SECURE | ROCKCHIP_BO_ALLOC_KMAP |
52*437bfbebSnyanmisaka ROCKCHIP_BO_DMA32,
53*437bfbebSnyanmisaka };
54*437bfbebSnyanmisaka
55*437bfbebSnyanmisaka typedef struct {
56*437bfbebSnyanmisaka RK_U32 alignment;
57*437bfbebSnyanmisaka RK_S32 drm_device;
58*437bfbebSnyanmisaka RK_U32 flags;
59*437bfbebSnyanmisaka } allocator_ctx_drm;
60*437bfbebSnyanmisaka
61*437bfbebSnyanmisaka /* use renderD128 first to avoid GKI kernel permission issue */
62*437bfbebSnyanmisaka static const char *dev_drm[] = {
63*437bfbebSnyanmisaka "/dev/dri/renderD128",
64*437bfbebSnyanmisaka "/dev/dri/card0",
65*437bfbebSnyanmisaka };
66*437bfbebSnyanmisaka
to_rockchip_gem_mem_flag(RK_U32 flags)67*437bfbebSnyanmisaka static RK_U32 to_rockchip_gem_mem_flag(RK_U32 flags)
68*437bfbebSnyanmisaka {
69*437bfbebSnyanmisaka RK_U32 ret = 0;
70*437bfbebSnyanmisaka
71*437bfbebSnyanmisaka if (flags & MPP_ALLOC_FLAG_DMA32)
72*437bfbebSnyanmisaka ret |= ROCKCHIP_BO_DMA32;
73*437bfbebSnyanmisaka
74*437bfbebSnyanmisaka if (flags & MPP_ALLOC_FLAG_CACHABLE)
75*437bfbebSnyanmisaka ret |= ROCKCHIP_BO_CACHABLE;
76*437bfbebSnyanmisaka
77*437bfbebSnyanmisaka if (flags & MPP_ALLOC_FLAG_CMA)
78*437bfbebSnyanmisaka ret |= ROCKCHIP_BO_CONTIG;
79*437bfbebSnyanmisaka
80*437bfbebSnyanmisaka return ret;
81*437bfbebSnyanmisaka }
82*437bfbebSnyanmisaka
drm_ioctl(int fd,int req,void * arg)83*437bfbebSnyanmisaka static int drm_ioctl(int fd, int req, void *arg)
84*437bfbebSnyanmisaka {
85*437bfbebSnyanmisaka int ret;
86*437bfbebSnyanmisaka
87*437bfbebSnyanmisaka do {
88*437bfbebSnyanmisaka ret = ioctl(fd, req, arg);
89*437bfbebSnyanmisaka } while (ret == -1 && (errno == EINTR || errno == EAGAIN));
90*437bfbebSnyanmisaka
91*437bfbebSnyanmisaka drm_dbg_ioctl("%x ret %d: %s\n", req, ret, strerror(errno));
92*437bfbebSnyanmisaka
93*437bfbebSnyanmisaka return ret;
94*437bfbebSnyanmisaka }
95*437bfbebSnyanmisaka
drm_handle_to_fd(int fd,RK_U32 handle,int * map_fd,RK_U32 flags)96*437bfbebSnyanmisaka static int drm_handle_to_fd(int fd, RK_U32 handle, int *map_fd, RK_U32 flags)
97*437bfbebSnyanmisaka {
98*437bfbebSnyanmisaka int ret;
99*437bfbebSnyanmisaka struct drm_prime_handle dph;
100*437bfbebSnyanmisaka
101*437bfbebSnyanmisaka memset(&dph, 0, sizeof(struct drm_prime_handle));
102*437bfbebSnyanmisaka dph.handle = handle;
103*437bfbebSnyanmisaka dph.fd = -1;
104*437bfbebSnyanmisaka dph.flags = flags;
105*437bfbebSnyanmisaka
106*437bfbebSnyanmisaka if (map_fd == NULL)
107*437bfbebSnyanmisaka return -EINVAL;
108*437bfbebSnyanmisaka
109*437bfbebSnyanmisaka ret = drm_ioctl(fd, DRM_IOCTL_PRIME_HANDLE_TO_FD, &dph);
110*437bfbebSnyanmisaka if (ret < 0)
111*437bfbebSnyanmisaka return ret;
112*437bfbebSnyanmisaka
113*437bfbebSnyanmisaka *map_fd = dph.fd;
114*437bfbebSnyanmisaka
115*437bfbebSnyanmisaka drm_dbg_func("dev %d handle %d flags %x get fd %d\n", fd, handle, dph.flags, *map_fd);
116*437bfbebSnyanmisaka
117*437bfbebSnyanmisaka if (*map_fd < 0) {
118*437bfbebSnyanmisaka mpp_err_f("map ioctl returned negative fd\n");
119*437bfbebSnyanmisaka return -EINVAL;
120*437bfbebSnyanmisaka }
121*437bfbebSnyanmisaka
122*437bfbebSnyanmisaka return ret;
123*437bfbebSnyanmisaka }
124*437bfbebSnyanmisaka
drm_alloc(int fd,size_t len,size_t align,RK_U32 * handle,RK_U32 flags)125*437bfbebSnyanmisaka static int drm_alloc(int fd, size_t len, size_t align, RK_U32 *handle, RK_U32 flags)
126*437bfbebSnyanmisaka {
127*437bfbebSnyanmisaka int ret;
128*437bfbebSnyanmisaka struct drm_mode_create_dumb dmcb;
129*437bfbebSnyanmisaka
130*437bfbebSnyanmisaka memset(&dmcb, 0, sizeof(struct drm_mode_create_dumb));
131*437bfbebSnyanmisaka dmcb.bpp = 8;
132*437bfbebSnyanmisaka dmcb.width = (len + align - 1) & (~(align - 1));
133*437bfbebSnyanmisaka dmcb.height = 1;
134*437bfbebSnyanmisaka dmcb.flags = to_rockchip_gem_mem_flag(flags);
135*437bfbebSnyanmisaka
136*437bfbebSnyanmisaka if (handle == NULL)
137*437bfbebSnyanmisaka return -EINVAL;
138*437bfbebSnyanmisaka
139*437bfbebSnyanmisaka ret = drm_ioctl(fd, DRM_IOCTL_MODE_CREATE_DUMB, &dmcb);
140*437bfbebSnyanmisaka if (ret < 0)
141*437bfbebSnyanmisaka return ret;
142*437bfbebSnyanmisaka
143*437bfbebSnyanmisaka *handle = dmcb.handle;
144*437bfbebSnyanmisaka drm_dbg_func("dev %d alloc aligned %d flags %x|%x handle %d size %lld\n", fd,
145*437bfbebSnyanmisaka align, flags, dmcb.flags, dmcb.handle, dmcb.size);
146*437bfbebSnyanmisaka
147*437bfbebSnyanmisaka return ret;
148*437bfbebSnyanmisaka }
149*437bfbebSnyanmisaka
drm_free(int fd,RK_U32 handle)150*437bfbebSnyanmisaka static int drm_free(int fd, RK_U32 handle)
151*437bfbebSnyanmisaka {
152*437bfbebSnyanmisaka struct drm_mode_destroy_dumb data = {
153*437bfbebSnyanmisaka .handle = handle,
154*437bfbebSnyanmisaka };
155*437bfbebSnyanmisaka return drm_ioctl(fd, DRM_IOCTL_MODE_DESTROY_DUMB, &data);
156*437bfbebSnyanmisaka }
157*437bfbebSnyanmisaka
os_allocator_drm_open(void ** ctx,size_t alignment,MppAllocFlagType flags)158*437bfbebSnyanmisaka static MPP_RET os_allocator_drm_open(void **ctx, size_t alignment, MppAllocFlagType flags)
159*437bfbebSnyanmisaka {
160*437bfbebSnyanmisaka allocator_ctx_drm *p;
161*437bfbebSnyanmisaka RK_S32 fd;
162*437bfbebSnyanmisaka RK_S32 i;
163*437bfbebSnyanmisaka
164*437bfbebSnyanmisaka if (NULL == ctx) {
165*437bfbebSnyanmisaka mpp_err_f("does not accept NULL input\n");
166*437bfbebSnyanmisaka return MPP_ERR_NULL_PTR;
167*437bfbebSnyanmisaka }
168*437bfbebSnyanmisaka
169*437bfbebSnyanmisaka *ctx = NULL;
170*437bfbebSnyanmisaka
171*437bfbebSnyanmisaka mpp_env_get_u32("drm_debug", &drm_debug, 0);
172*437bfbebSnyanmisaka
173*437bfbebSnyanmisaka for (i = 0; i < (RK_S32)MPP_ARRAY_ELEMS(dev_drm); i++) {
174*437bfbebSnyanmisaka fd = open(dev_drm[i], O_RDWR | O_CLOEXEC);
175*437bfbebSnyanmisaka if (fd > 0)
176*437bfbebSnyanmisaka break;
177*437bfbebSnyanmisaka }
178*437bfbebSnyanmisaka
179*437bfbebSnyanmisaka if (fd < 0) {
180*437bfbebSnyanmisaka mpp_err_f("open all drm device failed.\n");
181*437bfbebSnyanmisaka mpp_err("Please check the following device path and access permission:\n");
182*437bfbebSnyanmisaka for (i = 0; i < (RK_S32)MPP_ARRAY_ELEMS(dev_drm); i++)
183*437bfbebSnyanmisaka mpp_err("%s\n", dev_drm[i]);
184*437bfbebSnyanmisaka return MPP_ERR_UNKNOW;
185*437bfbebSnyanmisaka } else {
186*437bfbebSnyanmisaka /* drop master by default to avoid becoming the drm master */
187*437bfbebSnyanmisaka drm_ioctl(fd, DRM_IOCTL_DROP_MASTER, 0);
188*437bfbebSnyanmisaka }
189*437bfbebSnyanmisaka
190*437bfbebSnyanmisaka drm_dbg_dev("open drm dev fd %d flags %x\n", fd, flags);
191*437bfbebSnyanmisaka
192*437bfbebSnyanmisaka p = mpp_malloc(allocator_ctx_drm, 1);
193*437bfbebSnyanmisaka if (NULL == p) {
194*437bfbebSnyanmisaka close(fd);
195*437bfbebSnyanmisaka mpp_err_f("failed to allocate context\n");
196*437bfbebSnyanmisaka return MPP_ERR_MALLOC;
197*437bfbebSnyanmisaka } else {
198*437bfbebSnyanmisaka /*
199*437bfbebSnyanmisaka * default drm use cma, do nothing here
200*437bfbebSnyanmisaka */
201*437bfbebSnyanmisaka p->alignment = alignment;
202*437bfbebSnyanmisaka p->flags = flags;
203*437bfbebSnyanmisaka p->drm_device = fd;
204*437bfbebSnyanmisaka *ctx = p;
205*437bfbebSnyanmisaka }
206*437bfbebSnyanmisaka
207*437bfbebSnyanmisaka return MPP_OK;
208*437bfbebSnyanmisaka }
209*437bfbebSnyanmisaka
os_allocator_drm_alloc(void * ctx,MppBufferInfo * info)210*437bfbebSnyanmisaka static MPP_RET os_allocator_drm_alloc(void *ctx, MppBufferInfo *info)
211*437bfbebSnyanmisaka {
212*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
213*437bfbebSnyanmisaka allocator_ctx_drm *p = NULL;
214*437bfbebSnyanmisaka
215*437bfbebSnyanmisaka if (NULL == ctx) {
216*437bfbebSnyanmisaka mpp_err_f("does not accept NULL input\n");
217*437bfbebSnyanmisaka return MPP_ERR_NULL_PTR;
218*437bfbebSnyanmisaka }
219*437bfbebSnyanmisaka
220*437bfbebSnyanmisaka p = (allocator_ctx_drm *)ctx;
221*437bfbebSnyanmisaka
222*437bfbebSnyanmisaka drm_dbg_func("dev %d alloc alignment %d size %d\n", p->drm_device,
223*437bfbebSnyanmisaka p->alignment, info->size);
224*437bfbebSnyanmisaka
225*437bfbebSnyanmisaka ret = drm_alloc(p->drm_device, info->size, p->alignment,
226*437bfbebSnyanmisaka (RK_U32 *)&info->hnd, p->flags);
227*437bfbebSnyanmisaka if (ret) {
228*437bfbebSnyanmisaka mpp_err_f("drm_alloc failed ret %d\n", ret);
229*437bfbebSnyanmisaka return ret;
230*437bfbebSnyanmisaka }
231*437bfbebSnyanmisaka
232*437bfbebSnyanmisaka ret = drm_handle_to_fd(p->drm_device, (RK_U32)((intptr_t)info->hnd),
233*437bfbebSnyanmisaka &info->fd, DRM_CLOEXEC | DRM_RDWR);
234*437bfbebSnyanmisaka
235*437bfbebSnyanmisaka if (ret) {
236*437bfbebSnyanmisaka mpp_err_f("handle_to_fd failed ret %d\n", ret);
237*437bfbebSnyanmisaka return ret;
238*437bfbebSnyanmisaka }
239*437bfbebSnyanmisaka
240*437bfbebSnyanmisaka drm_dbg_func("dev %d get handle %d with fd %d\n", p->drm_device,
241*437bfbebSnyanmisaka (RK_U32)((intptr_t)info->hnd), info->fd);
242*437bfbebSnyanmisaka
243*437bfbebSnyanmisaka /* release handle to reduce iova usage */
244*437bfbebSnyanmisaka drm_free(p->drm_device, (RK_U32)((intptr_t)info->hnd));
245*437bfbebSnyanmisaka info->hnd = NULL;
246*437bfbebSnyanmisaka info->ptr = NULL;
247*437bfbebSnyanmisaka
248*437bfbebSnyanmisaka return ret;
249*437bfbebSnyanmisaka }
250*437bfbebSnyanmisaka
os_allocator_drm_import(void * ctx,MppBufferInfo * data)251*437bfbebSnyanmisaka static MPP_RET os_allocator_drm_import(void *ctx, MppBufferInfo *data)
252*437bfbebSnyanmisaka {
253*437bfbebSnyanmisaka allocator_ctx_drm *p = (allocator_ctx_drm *)ctx;
254*437bfbebSnyanmisaka RK_S32 fd_ext = data->fd;
255*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
256*437bfbebSnyanmisaka
257*437bfbebSnyanmisaka drm_dbg_func("enter dev %d fd %d\n", p->drm_device, fd_ext);
258*437bfbebSnyanmisaka
259*437bfbebSnyanmisaka mpp_assert(fd_ext > 0);
260*437bfbebSnyanmisaka
261*437bfbebSnyanmisaka data->fd = mpp_dup(fd_ext);
262*437bfbebSnyanmisaka data->ptr = NULL;
263*437bfbebSnyanmisaka
264*437bfbebSnyanmisaka if (data->fd <= 0) {
265*437bfbebSnyanmisaka mpp_err_f(" fd dup return invalid fd %d\n", data->fd);
266*437bfbebSnyanmisaka ret = MPP_NOK;
267*437bfbebSnyanmisaka }
268*437bfbebSnyanmisaka
269*437bfbebSnyanmisaka drm_dbg_func("leave dev %d fd %d -> %d\n", p->drm_device, fd_ext, data->fd);
270*437bfbebSnyanmisaka
271*437bfbebSnyanmisaka return ret;
272*437bfbebSnyanmisaka }
273*437bfbebSnyanmisaka
os_allocator_drm_free(void * ctx,MppBufferInfo * data)274*437bfbebSnyanmisaka static MPP_RET os_allocator_drm_free(void *ctx, MppBufferInfo *data)
275*437bfbebSnyanmisaka {
276*437bfbebSnyanmisaka allocator_ctx_drm *p = NULL;
277*437bfbebSnyanmisaka
278*437bfbebSnyanmisaka if (NULL == ctx) {
279*437bfbebSnyanmisaka mpp_err_f("does not accept NULL input\n");
280*437bfbebSnyanmisaka return MPP_ERR_NULL_PTR;
281*437bfbebSnyanmisaka }
282*437bfbebSnyanmisaka
283*437bfbebSnyanmisaka p = (allocator_ctx_drm *)ctx;
284*437bfbebSnyanmisaka
285*437bfbebSnyanmisaka drm_dbg_func("dev %d handle %p unmap %p fd %d size %d\n", p->drm_device,
286*437bfbebSnyanmisaka data->hnd, data->ptr, data->fd, data->size);
287*437bfbebSnyanmisaka
288*437bfbebSnyanmisaka if (data->ptr) {
289*437bfbebSnyanmisaka munmap(data->ptr, data->size);
290*437bfbebSnyanmisaka data->ptr = NULL;
291*437bfbebSnyanmisaka }
292*437bfbebSnyanmisaka
293*437bfbebSnyanmisaka if (data->fd > 0) {
294*437bfbebSnyanmisaka close(data->fd);
295*437bfbebSnyanmisaka data->fd = -1;
296*437bfbebSnyanmisaka } else {
297*437bfbebSnyanmisaka mpp_err_f("can not close invalid fd %d\n", data->fd);
298*437bfbebSnyanmisaka }
299*437bfbebSnyanmisaka
300*437bfbebSnyanmisaka return MPP_OK;
301*437bfbebSnyanmisaka }
302*437bfbebSnyanmisaka
os_allocator_drm_close(void * ctx)303*437bfbebSnyanmisaka static MPP_RET os_allocator_drm_close(void *ctx)
304*437bfbebSnyanmisaka {
305*437bfbebSnyanmisaka int ret;
306*437bfbebSnyanmisaka allocator_ctx_drm *p;
307*437bfbebSnyanmisaka
308*437bfbebSnyanmisaka if (NULL == ctx) {
309*437bfbebSnyanmisaka mpp_err("os_allocator_close doesn't accept NULL input\n");
310*437bfbebSnyanmisaka return MPP_ERR_NULL_PTR;
311*437bfbebSnyanmisaka }
312*437bfbebSnyanmisaka
313*437bfbebSnyanmisaka p = (allocator_ctx_drm *)ctx;
314*437bfbebSnyanmisaka drm_dbg_func("dev %d", p->drm_device);
315*437bfbebSnyanmisaka
316*437bfbebSnyanmisaka ret = close(p->drm_device);
317*437bfbebSnyanmisaka mpp_free(p);
318*437bfbebSnyanmisaka if (ret < 0)
319*437bfbebSnyanmisaka return (MPP_RET) - errno;
320*437bfbebSnyanmisaka
321*437bfbebSnyanmisaka return MPP_OK;
322*437bfbebSnyanmisaka }
323*437bfbebSnyanmisaka
os_allocator_drm_mmap(void * ctx,MppBufferInfo * data)324*437bfbebSnyanmisaka static MPP_RET os_allocator_drm_mmap(void *ctx, MppBufferInfo *data)
325*437bfbebSnyanmisaka {
326*437bfbebSnyanmisaka allocator_ctx_drm *p;
327*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
328*437bfbebSnyanmisaka if (NULL == ctx) {
329*437bfbebSnyanmisaka mpp_err("os_allocator_close do not accept NULL input\n");
330*437bfbebSnyanmisaka return MPP_ERR_NULL_PTR;
331*437bfbebSnyanmisaka }
332*437bfbebSnyanmisaka p = (allocator_ctx_drm *)ctx;
333*437bfbebSnyanmisaka
334*437bfbebSnyanmisaka if (NULL == ctx)
335*437bfbebSnyanmisaka return MPP_ERR_NULL_PTR;
336*437bfbebSnyanmisaka
337*437bfbebSnyanmisaka if (NULL == data->ptr) {
338*437bfbebSnyanmisaka int flags = PROT_READ;
339*437bfbebSnyanmisaka
340*437bfbebSnyanmisaka if (fcntl(data->fd, F_GETFL) & O_RDWR)
341*437bfbebSnyanmisaka flags |= PROT_WRITE;
342*437bfbebSnyanmisaka
343*437bfbebSnyanmisaka data->ptr = mmap(NULL, data->size, flags, MAP_SHARED, data->fd, 0);
344*437bfbebSnyanmisaka if (data->ptr == MAP_FAILED) {
345*437bfbebSnyanmisaka mpp_err("mmap failed: %s\n", strerror(errno));
346*437bfbebSnyanmisaka data->ptr = NULL;
347*437bfbebSnyanmisaka return -errno;
348*437bfbebSnyanmisaka }
349*437bfbebSnyanmisaka
350*437bfbebSnyanmisaka drm_dbg_func("dev %d mmap fd %d to %p (%s)\n", p->drm_device,
351*437bfbebSnyanmisaka data->fd, data->ptr,
352*437bfbebSnyanmisaka flags & PROT_WRITE ? "RDWR" : "RDONLY");
353*437bfbebSnyanmisaka }
354*437bfbebSnyanmisaka
355*437bfbebSnyanmisaka return ret;
356*437bfbebSnyanmisaka }
357*437bfbebSnyanmisaka
os_allocator_drm_flags(void * ctx)358*437bfbebSnyanmisaka static MppAllocFlagType os_allocator_drm_flags(void *ctx)
359*437bfbebSnyanmisaka {
360*437bfbebSnyanmisaka allocator_ctx_drm *p = (allocator_ctx_drm *)ctx;
361*437bfbebSnyanmisaka
362*437bfbebSnyanmisaka return p ? (MppAllocFlagType)p->flags : MPP_ALLOC_FLAG_NONE;
363*437bfbebSnyanmisaka }
364*437bfbebSnyanmisaka
365*437bfbebSnyanmisaka os_allocator allocator_drm = {
366*437bfbebSnyanmisaka .type = MPP_BUFFER_TYPE_DRM,
367*437bfbebSnyanmisaka .name = "drm",
368*437bfbebSnyanmisaka .open = os_allocator_drm_open,
369*437bfbebSnyanmisaka .close = os_allocator_drm_close,
370*437bfbebSnyanmisaka .alloc = os_allocator_drm_alloc,
371*437bfbebSnyanmisaka .free = os_allocator_drm_free,
372*437bfbebSnyanmisaka .import = os_allocator_drm_import,
373*437bfbebSnyanmisaka .release = os_allocator_drm_free,
374*437bfbebSnyanmisaka .mmap = os_allocator_drm_mmap,
375*437bfbebSnyanmisaka .flags = os_allocator_drm_flags,
376*437bfbebSnyanmisaka };
377