xref: /rockchip-linux_mpp/mpp/legacy/vpu.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
1*437bfbebSnyanmisaka /*
2*437bfbebSnyanmisaka  * Copyright 2015 Rockchip Electronics Co. LTD
3*437bfbebSnyanmisaka  *
4*437bfbebSnyanmisaka  * Licensed under the Apache License, Version 2.0 (the "License");
5*437bfbebSnyanmisaka  * you may not use this file except in compliance with the License.
6*437bfbebSnyanmisaka  * You may obtain a copy of the License at
7*437bfbebSnyanmisaka  *
8*437bfbebSnyanmisaka  *      http://www.apache.org/licenses/LICENSE-2.0
9*437bfbebSnyanmisaka  *
10*437bfbebSnyanmisaka  * Unless required by applicable law or agreed to in writing, software
11*437bfbebSnyanmisaka  * distributed under the License is distributed on an "AS IS" BASIS,
12*437bfbebSnyanmisaka  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*437bfbebSnyanmisaka  * See the License for the specific language governing permissions and
14*437bfbebSnyanmisaka  * limitations under the License.
15*437bfbebSnyanmisaka  */
16*437bfbebSnyanmisaka 
17*437bfbebSnyanmisaka #define MODULE_TAG "vpu"
18*437bfbebSnyanmisaka 
19*437bfbebSnyanmisaka #include <sys/ioctl.h>
20*437bfbebSnyanmisaka #include <errno.h>
21*437bfbebSnyanmisaka #include <string.h>
22*437bfbebSnyanmisaka 
23*437bfbebSnyanmisaka #include "vpu.h"
24*437bfbebSnyanmisaka #include "rk_mpi.h"
25*437bfbebSnyanmisaka 
26*437bfbebSnyanmisaka #include "mpp_env.h"
27*437bfbebSnyanmisaka #include "mpp_debug.h"
28*437bfbebSnyanmisaka #include "mpp_common.h"
29*437bfbebSnyanmisaka #include "mpp_platform.h"
30*437bfbebSnyanmisaka 
31*437bfbebSnyanmisaka #include "mpp_service.h"
32*437bfbebSnyanmisaka #include "vcodec_service.h"
33*437bfbebSnyanmisaka 
34*437bfbebSnyanmisaka #define VPU_EXTRA_INFO_SIZE                 12
35*437bfbebSnyanmisaka #define VPU_EXTRA_INFO_MAGIC                (0x4C4A46)
36*437bfbebSnyanmisaka #define VPU_MPP_FLAGS_MULTI_MSG             (0x00000001)
37*437bfbebSnyanmisaka #define VPU_MPP_FLAGS_LAST_MSG              (0x00000002)
38*437bfbebSnyanmisaka 
39*437bfbebSnyanmisaka #define MPX_PATCH_NUM       16
40*437bfbebSnyanmisaka 
41*437bfbebSnyanmisaka typedef struct VpuPatchInfo_t {
42*437bfbebSnyanmisaka     RK_U32          reg_idx;
43*437bfbebSnyanmisaka     RK_U32          offset;
44*437bfbebSnyanmisaka } VpuPatchInfo;
45*437bfbebSnyanmisaka 
46*437bfbebSnyanmisaka typedef struct VpuExtraInfo_t {
47*437bfbebSnyanmisaka     RK_U32          magic;      // Fix magic value 0x4C4A46
48*437bfbebSnyanmisaka     RK_U32          count;      // valid patch info count
49*437bfbebSnyanmisaka     VpuPatchInfo    patchs[MPX_PATCH_NUM];
50*437bfbebSnyanmisaka } VpuExtraInfo;
51*437bfbebSnyanmisaka 
52*437bfbebSnyanmisaka typedef struct VPUReq {
53*437bfbebSnyanmisaka     RK_U32 *req;
54*437bfbebSnyanmisaka     RK_U32  size;
55*437bfbebSnyanmisaka } VPUReq_t;
56*437bfbebSnyanmisaka 
57*437bfbebSnyanmisaka static RK_U32 vpu_debug = 0;
58*437bfbebSnyanmisaka 
59*437bfbebSnyanmisaka /* 0 original version,  > 1 for others version */
60*437bfbebSnyanmisaka static RK_S32 ioctl_version = 0;
61*437bfbebSnyanmisaka 
vpu_api_set_client_type(int dev,RK_S32 client_type)62*437bfbebSnyanmisaka static RK_S32 vpu_api_set_client_type(int dev, RK_S32 client_type)
63*437bfbebSnyanmisaka {
64*437bfbebSnyanmisaka     static RK_S32 vpu_api_ioctl_version = -1;
65*437bfbebSnyanmisaka     RK_S32 ret;
66*437bfbebSnyanmisaka 
67*437bfbebSnyanmisaka     if (ioctl_version > 0) {
68*437bfbebSnyanmisaka         MppReqV1 mpp_req;
69*437bfbebSnyanmisaka         RK_U32 vcodec_type;
70*437bfbebSnyanmisaka         RK_U32 client_data;
71*437bfbebSnyanmisaka 
72*437bfbebSnyanmisaka         vcodec_type = mpp_get_vcodec_type();
73*437bfbebSnyanmisaka 
74*437bfbebSnyanmisaka         switch (client_type) {
75*437bfbebSnyanmisaka         case VPU_ENC:
76*437bfbebSnyanmisaka             if (vcodec_type & HAVE_VDPU1)
77*437bfbebSnyanmisaka                 client_data = VPU_CLIENT_VEPU1;
78*437bfbebSnyanmisaka             else if (vcodec_type & HAVE_VDPU2)
79*437bfbebSnyanmisaka                 client_data = VPU_CLIENT_VEPU2;
80*437bfbebSnyanmisaka             break;
81*437bfbebSnyanmisaka         default:
82*437bfbebSnyanmisaka             break;
83*437bfbebSnyanmisaka         }
84*437bfbebSnyanmisaka 
85*437bfbebSnyanmisaka         mpp_req.cmd = MPP_CMD_INIT_CLIENT_TYPE;
86*437bfbebSnyanmisaka         mpp_req.flag = 0;
87*437bfbebSnyanmisaka         mpp_req.size = sizeof(client_data);
88*437bfbebSnyanmisaka         mpp_req.offset = 0;
89*437bfbebSnyanmisaka         mpp_req.data_ptr = REQ_DATA_PTR(&client_data);
90*437bfbebSnyanmisaka         ret = (RK_S32)ioctl(dev, MPP_IOC_CFG_V1, &mpp_req);
91*437bfbebSnyanmisaka     } else {
92*437bfbebSnyanmisaka         if (vpu_api_ioctl_version < 0) {
93*437bfbebSnyanmisaka             ret = ioctl(dev, VPU_IOC_SET_CLIENT_TYPE, client_type);
94*437bfbebSnyanmisaka             if (!ret) {
95*437bfbebSnyanmisaka                 vpu_api_ioctl_version = 0;
96*437bfbebSnyanmisaka             } else {
97*437bfbebSnyanmisaka                 ret = ioctl(dev, VPU_IOC_SET_CLIENT_TYPE_U32, client_type);
98*437bfbebSnyanmisaka                 if (!ret)
99*437bfbebSnyanmisaka                     vpu_api_ioctl_version = 1;
100*437bfbebSnyanmisaka             }
101*437bfbebSnyanmisaka 
102*437bfbebSnyanmisaka             if (ret)
103*437bfbebSnyanmisaka                 mpp_err_f("can not find valid client type ioctl\n");
104*437bfbebSnyanmisaka 
105*437bfbebSnyanmisaka             mpp_assert(ret == 0);
106*437bfbebSnyanmisaka         } else {
107*437bfbebSnyanmisaka             RK_U32 cmd = (vpu_api_ioctl_version == 0) ?
108*437bfbebSnyanmisaka                          (VPU_IOC_SET_CLIENT_TYPE) :
109*437bfbebSnyanmisaka                          (VPU_IOC_SET_CLIENT_TYPE_U32);
110*437bfbebSnyanmisaka 
111*437bfbebSnyanmisaka             ret = ioctl(dev, cmd, client_type);
112*437bfbebSnyanmisaka         }
113*437bfbebSnyanmisaka     }
114*437bfbebSnyanmisaka 
115*437bfbebSnyanmisaka     if (ret)
116*437bfbebSnyanmisaka         mpp_err_f("set client type failed ret %d errno %d\n", ret, errno);
117*437bfbebSnyanmisaka 
118*437bfbebSnyanmisaka     return ret;
119*437bfbebSnyanmisaka }
120*437bfbebSnyanmisaka 
121*437bfbebSnyanmisaka 
VPUClientInit(VPU_CLIENT_TYPE type)122*437bfbebSnyanmisaka int VPUClientInit(VPU_CLIENT_TYPE type)
123*437bfbebSnyanmisaka {
124*437bfbebSnyanmisaka     int ret;
125*437bfbebSnyanmisaka     int fd;
126*437bfbebSnyanmisaka     const char *path;
127*437bfbebSnyanmisaka     MppCtxType ctx_type;
128*437bfbebSnyanmisaka     MppCodingType coding = MPP_VIDEO_CodingAutoDetect;
129*437bfbebSnyanmisaka 
130*437bfbebSnyanmisaka     switch (type) {
131*437bfbebSnyanmisaka     case VPU_DEC_HEVC:
132*437bfbebSnyanmisaka         coding = MPP_VIDEO_CodingHEVC;
133*437bfbebSnyanmisaka         ctx_type  = MPP_CTX_DEC;
134*437bfbebSnyanmisaka         type = VPU_DEC;
135*437bfbebSnyanmisaka         break;
136*437bfbebSnyanmisaka     case VPU_DEC_AVSPLUS:
137*437bfbebSnyanmisaka         coding = MPP_VIDEO_CodingAVSPLUS;
138*437bfbebSnyanmisaka         ctx_type  = MPP_CTX_DEC;
139*437bfbebSnyanmisaka         type = VPU_DEC;
140*437bfbebSnyanmisaka         break;
141*437bfbebSnyanmisaka     case VPU_DEC_RKV:
142*437bfbebSnyanmisaka         type = VPU_DEC;
143*437bfbebSnyanmisaka         ctx_type  = MPP_CTX_DEC;
144*437bfbebSnyanmisaka         break;
145*437bfbebSnyanmisaka     case VPU_DEC:
146*437bfbebSnyanmisaka     case VPU_DEC_PP:
147*437bfbebSnyanmisaka     case VPU_PP:
148*437bfbebSnyanmisaka         ctx_type  = MPP_CTX_DEC;
149*437bfbebSnyanmisaka         break;
150*437bfbebSnyanmisaka     case VPU_ENC:
151*437bfbebSnyanmisaka     case VPU_ENC_RKV:
152*437bfbebSnyanmisaka         ctx_type = MPP_CTX_ENC;
153*437bfbebSnyanmisaka         break;
154*437bfbebSnyanmisaka     default:
155*437bfbebSnyanmisaka         return -1;
156*437bfbebSnyanmisaka         break;
157*437bfbebSnyanmisaka     }
158*437bfbebSnyanmisaka 
159*437bfbebSnyanmisaka     path = mpp_get_vcodec_dev_name(ctx_type, coding);
160*437bfbebSnyanmisaka     fd = open(path, O_RDWR | O_CLOEXEC);
161*437bfbebSnyanmisaka 
162*437bfbebSnyanmisaka     mpp_env_get_u32("vpu_debug", &vpu_debug, 0);
163*437bfbebSnyanmisaka 
164*437bfbebSnyanmisaka     ioctl_version = mpp_get_ioctl_version();
165*437bfbebSnyanmisaka 
166*437bfbebSnyanmisaka     if (fd == -1) {
167*437bfbebSnyanmisaka         mpp_err_f("failed to open %s, errno = %d, error msg: %s\n",
168*437bfbebSnyanmisaka                   path, errno, strerror(errno));
169*437bfbebSnyanmisaka         return -1;
170*437bfbebSnyanmisaka     }
171*437bfbebSnyanmisaka 
172*437bfbebSnyanmisaka     ret = vpu_api_set_client_type(fd, type);
173*437bfbebSnyanmisaka     if (ret) {
174*437bfbebSnyanmisaka         return -2;
175*437bfbebSnyanmisaka     }
176*437bfbebSnyanmisaka 
177*437bfbebSnyanmisaka     return fd;
178*437bfbebSnyanmisaka }
179*437bfbebSnyanmisaka 
VPUClientRelease(int socket)180*437bfbebSnyanmisaka RK_S32 VPUClientRelease(int socket)
181*437bfbebSnyanmisaka {
182*437bfbebSnyanmisaka     int fd = socket;
183*437bfbebSnyanmisaka     if (fd > 0) {
184*437bfbebSnyanmisaka         close(fd);
185*437bfbebSnyanmisaka     }
186*437bfbebSnyanmisaka     return VPU_SUCCESS;
187*437bfbebSnyanmisaka }
188*437bfbebSnyanmisaka 
VPUClientSendReg(int socket,RK_U32 * regs,RK_U32 nregs)189*437bfbebSnyanmisaka RK_S32 VPUClientSendReg(int socket, RK_U32 *regs, RK_U32 nregs)
190*437bfbebSnyanmisaka {
191*437bfbebSnyanmisaka     int fd = socket;
192*437bfbebSnyanmisaka     RK_S32 ret;
193*437bfbebSnyanmisaka     VPUReq_t req;
194*437bfbebSnyanmisaka 
195*437bfbebSnyanmisaka     if (vpu_debug) {
196*437bfbebSnyanmisaka         RK_U32 i;
197*437bfbebSnyanmisaka 
198*437bfbebSnyanmisaka         for (i = 0; i < nregs; i++)
199*437bfbebSnyanmisaka             mpp_log("set reg[%03d]: %08x\n", i, regs[i]);
200*437bfbebSnyanmisaka     }
201*437bfbebSnyanmisaka 
202*437bfbebSnyanmisaka     if (ioctl_version > 0) {
203*437bfbebSnyanmisaka         MppReqV1 reqs[3];
204*437bfbebSnyanmisaka         RK_U32 reg_size = nregs;
205*437bfbebSnyanmisaka 
206*437bfbebSnyanmisaka         VpuExtraInfo *extra_info = (VpuExtraInfo*)(regs + (nregs - VPU_EXTRA_INFO_SIZE));
207*437bfbebSnyanmisaka 
208*437bfbebSnyanmisaka         reqs[0].cmd = MPP_CMD_SET_REG_WRITE;
209*437bfbebSnyanmisaka         reqs[0].flag = 0;
210*437bfbebSnyanmisaka         reqs[0].offset = 0;
211*437bfbebSnyanmisaka         reqs[0].size =  reg_size * sizeof(RK_U32);
212*437bfbebSnyanmisaka         reqs[0].data_ptr = REQ_DATA_PTR((void*)regs);
213*437bfbebSnyanmisaka         reqs[0].flag |= VPU_MPP_FLAGS_MULTI_MSG;
214*437bfbebSnyanmisaka 
215*437bfbebSnyanmisaka         reqs[1].cmd = MPP_CMD_SET_REG_READ;
216*437bfbebSnyanmisaka         reqs[1].flag = 0;
217*437bfbebSnyanmisaka         reqs[1].offset = 0;
218*437bfbebSnyanmisaka         reqs[1].size =  reg_size * sizeof(RK_U32);
219*437bfbebSnyanmisaka         reqs[1].data_ptr = REQ_DATA_PTR((void*)regs);
220*437bfbebSnyanmisaka 
221*437bfbebSnyanmisaka         if (extra_info && extra_info->magic == VPU_EXTRA_INFO_MAGIC) {
222*437bfbebSnyanmisaka             reg_size = nregs - VPU_EXTRA_INFO_SIZE;
223*437bfbebSnyanmisaka             reqs[2].cmd = MPP_CMD_SET_REG_ADDR_OFFSET;
224*437bfbebSnyanmisaka             reqs[2].flag = 0;
225*437bfbebSnyanmisaka             reqs[2].offset = 0;
226*437bfbebSnyanmisaka             reqs[2].size = extra_info->count * sizeof(extra_info->patchs[0]);
227*437bfbebSnyanmisaka             reqs[2].data_ptr = REQ_DATA_PTR((void *)&extra_info->patchs[0]);
228*437bfbebSnyanmisaka 
229*437bfbebSnyanmisaka             reqs[0].size =  reg_size * sizeof(RK_U32);
230*437bfbebSnyanmisaka             reqs[1].size =  reg_size * sizeof(RK_U32);
231*437bfbebSnyanmisaka             reqs[1].flag |= VPU_MPP_FLAGS_MULTI_MSG;
232*437bfbebSnyanmisaka             reqs[2].flag |= VPU_MPP_FLAGS_LAST_MSG;
233*437bfbebSnyanmisaka             ret = (RK_S32)ioctl(fd, MPP_IOC_CFG_V1, &reqs);
234*437bfbebSnyanmisaka         } else {
235*437bfbebSnyanmisaka             MppReqV1 reqs_tmp[2];
236*437bfbebSnyanmisaka             reqs[1].flag |= VPU_MPP_FLAGS_LAST_MSG;
237*437bfbebSnyanmisaka             memcpy(reqs_tmp, reqs, sizeof(MppReqV1) * 2);
238*437bfbebSnyanmisaka             ret = (RK_S32)ioctl(fd, MPP_IOC_CFG_V1, &reqs_tmp);
239*437bfbebSnyanmisaka         }
240*437bfbebSnyanmisaka 
241*437bfbebSnyanmisaka     } else {
242*437bfbebSnyanmisaka         nregs *= sizeof(RK_U32);
243*437bfbebSnyanmisaka         req.req     = regs;
244*437bfbebSnyanmisaka         req.size    = nregs;
245*437bfbebSnyanmisaka         ret = (RK_S32)ioctl(fd, VPU_IOC_SET_REG, &req);
246*437bfbebSnyanmisaka     }
247*437bfbebSnyanmisaka 
248*437bfbebSnyanmisaka     if (ret)
249*437bfbebSnyanmisaka         mpp_err_f("ioctl VPU_IOC_SET_REG failed ret %d errno %d %s\n", ret, errno, strerror(errno));
250*437bfbebSnyanmisaka 
251*437bfbebSnyanmisaka     return ret;
252*437bfbebSnyanmisaka }
253*437bfbebSnyanmisaka 
VPUClientSendReg2(RK_S32 socket,RK_S32 offset,RK_S32 size,void * param)254*437bfbebSnyanmisaka RK_S32 VPUClientSendReg2(RK_S32 socket, RK_S32 offset, RK_S32 size, void *param)
255*437bfbebSnyanmisaka {
256*437bfbebSnyanmisaka     RK_S32 ret = 0;
257*437bfbebSnyanmisaka 
258*437bfbebSnyanmisaka     if (param == NULL) {
259*437bfbebSnyanmisaka         mpp_err_f("input param is NULL");
260*437bfbebSnyanmisaka         return 1;
261*437bfbebSnyanmisaka     }
262*437bfbebSnyanmisaka 
263*437bfbebSnyanmisaka     ret = (RK_S32)ioctl(socket, VPU_IOC_WRITE(offset, size), param);
264*437bfbebSnyanmisaka     if (ret)
265*437bfbebSnyanmisaka         mpp_err_f("ioctl VPU_IOC_WRITE failed ret %d", ret);
266*437bfbebSnyanmisaka 
267*437bfbebSnyanmisaka     return ret;
268*437bfbebSnyanmisaka }
269*437bfbebSnyanmisaka 
VPUClientWaitResult(int socket,RK_U32 * regs,RK_U32 nregs,VPU_CMD_TYPE * cmd,RK_S32 * len)270*437bfbebSnyanmisaka RK_S32 VPUClientWaitResult(int socket, RK_U32 *regs, RK_U32 nregs, VPU_CMD_TYPE *cmd, RK_S32 *len)
271*437bfbebSnyanmisaka {
272*437bfbebSnyanmisaka     int fd = socket;
273*437bfbebSnyanmisaka     RK_S32 ret;
274*437bfbebSnyanmisaka     VPUReq_t req;
275*437bfbebSnyanmisaka     (void)len;
276*437bfbebSnyanmisaka 
277*437bfbebSnyanmisaka     if (ioctl_version > 0) {
278*437bfbebSnyanmisaka         MppReqV1 mpp_req;
279*437bfbebSnyanmisaka         RK_U32 reg_size = nregs;
280*437bfbebSnyanmisaka         VpuExtraInfo *extra_info = (VpuExtraInfo*)(regs + (nregs - VPU_EXTRA_INFO_SIZE));
281*437bfbebSnyanmisaka 
282*437bfbebSnyanmisaka         if (extra_info && extra_info->magic == VPU_EXTRA_INFO_MAGIC) {
283*437bfbebSnyanmisaka             reg_size -= 2;
284*437bfbebSnyanmisaka         } else {
285*437bfbebSnyanmisaka             reg_size -= VPU_EXTRA_INFO_SIZE;
286*437bfbebSnyanmisaka         }
287*437bfbebSnyanmisaka 
288*437bfbebSnyanmisaka         mpp_req.cmd = MPP_CMD_POLL_HW_FINISH;
289*437bfbebSnyanmisaka         mpp_req.flag = 0;
290*437bfbebSnyanmisaka         mpp_req.offset = 0;
291*437bfbebSnyanmisaka         mpp_req.size =  reg_size * sizeof(RK_U32);
292*437bfbebSnyanmisaka         mpp_req.data_ptr = REQ_DATA_PTR((void*)regs);
293*437bfbebSnyanmisaka         ret = (RK_S32)ioctl(fd, MPP_IOC_CFG_V1, &mpp_req);
294*437bfbebSnyanmisaka     } else {
295*437bfbebSnyanmisaka         nregs *= sizeof(RK_U32);
296*437bfbebSnyanmisaka         req.req     = regs;
297*437bfbebSnyanmisaka         req.size    = nregs;
298*437bfbebSnyanmisaka 
299*437bfbebSnyanmisaka         ret = (RK_S32)ioctl(fd, VPU_IOC_GET_REG, &req);
300*437bfbebSnyanmisaka     }
301*437bfbebSnyanmisaka 
302*437bfbebSnyanmisaka     if (ret) {
303*437bfbebSnyanmisaka         mpp_err_f("ioctl VPU_IOC_GET_REG failed ret %d errno %d %s\n", ret, errno, strerror(errno));
304*437bfbebSnyanmisaka         *cmd = VPU_SEND_CONFIG_ACK_FAIL;
305*437bfbebSnyanmisaka     } else
306*437bfbebSnyanmisaka         *cmd = VPU_SEND_CONFIG_ACK_OK;
307*437bfbebSnyanmisaka 
308*437bfbebSnyanmisaka     if (vpu_debug) {
309*437bfbebSnyanmisaka         RK_U32 i;
310*437bfbebSnyanmisaka 
311*437bfbebSnyanmisaka         for (i = 0; i < nregs; i++) {
312*437bfbebSnyanmisaka             mpp_log("get reg[%03d]: %08x\n", i, regs[i]);
313*437bfbebSnyanmisaka         }
314*437bfbebSnyanmisaka     }
315*437bfbebSnyanmisaka 
316*437bfbebSnyanmisaka     return ret;
317*437bfbebSnyanmisaka }
318*437bfbebSnyanmisaka 
VPUClientGetHwCfg(int socket,RK_U32 * cfg,RK_U32 cfg_size)319*437bfbebSnyanmisaka RK_S32 VPUClientGetHwCfg(int socket, RK_U32 *cfg, RK_U32 cfg_size)
320*437bfbebSnyanmisaka {
321*437bfbebSnyanmisaka     int fd = socket;
322*437bfbebSnyanmisaka     RK_S32 ret;
323*437bfbebSnyanmisaka     VPUReq_t req;
324*437bfbebSnyanmisaka     req.req     = cfg;
325*437bfbebSnyanmisaka     req.size    = cfg_size;
326*437bfbebSnyanmisaka     ret = (RK_S32)ioctl(fd, VPU_IOC_GET_HW_FUSE_STATUS, &req);
327*437bfbebSnyanmisaka     if (ret)
328*437bfbebSnyanmisaka         mpp_err_f("ioctl VPU_IOC_GET_HW_FUSE_STATUS failed ret %d\n", ret);
329*437bfbebSnyanmisaka 
330*437bfbebSnyanmisaka     return ret;
331*437bfbebSnyanmisaka }
332*437bfbebSnyanmisaka 
VPUCheckSupportWidth()333*437bfbebSnyanmisaka RK_U32 VPUCheckSupportWidth()
334*437bfbebSnyanmisaka {
335*437bfbebSnyanmisaka     VPUHwDecConfig_t hwCfg;
336*437bfbebSnyanmisaka     int fd = -1;
337*437bfbebSnyanmisaka     fd = open("/dev/vpu_service", O_RDWR | O_CLOEXEC);
338*437bfbebSnyanmisaka     if (fd < 0) {
339*437bfbebSnyanmisaka         fd = open("/dev/vpu-service", O_RDWR | O_CLOEXEC);
340*437bfbebSnyanmisaka     }
341*437bfbebSnyanmisaka     memset(&hwCfg, 0, sizeof(VPUHwDecConfig_t));
342*437bfbebSnyanmisaka     if (fd >= 0) {
343*437bfbebSnyanmisaka         if (VPUClientGetHwCfg(fd, (RK_U32*)&hwCfg, sizeof(hwCfg))) {
344*437bfbebSnyanmisaka             mpp_err_f("Get HwCfg failed\n");
345*437bfbebSnyanmisaka             close(fd);
346*437bfbebSnyanmisaka             return -1;
347*437bfbebSnyanmisaka         }
348*437bfbebSnyanmisaka         close(fd);
349*437bfbebSnyanmisaka         fd = -1;
350*437bfbebSnyanmisaka     }
351*437bfbebSnyanmisaka     return hwCfg.maxDecPicWidth;
352*437bfbebSnyanmisaka }
353*437bfbebSnyanmisaka 
VPUClientGetIOMMUStatus()354*437bfbebSnyanmisaka RK_S32 VPUClientGetIOMMUStatus()
355*437bfbebSnyanmisaka {
356*437bfbebSnyanmisaka     return 1;
357*437bfbebSnyanmisaka }
358