xref: /rockchip-linux_mpp/osal/driver/mpp_vcodec_client.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
1*437bfbebSnyanmisaka /* SPDX-License-Identifier: Apache-2.0 OR MIT */
2*437bfbebSnyanmisaka /*
3*437bfbebSnyanmisaka  * Copyright (c) 2024 Rockchip Electronics Co., Ltd.
4*437bfbebSnyanmisaka  */
5*437bfbebSnyanmisaka 
6*437bfbebSnyanmisaka #define MODULE_TAG "mpp_vcodec"
7*437bfbebSnyanmisaka 
8*437bfbebSnyanmisaka #include <sys/ioctl.h>
9*437bfbebSnyanmisaka #include <fcntl.h>
10*437bfbebSnyanmisaka #include <errno.h>
11*437bfbebSnyanmisaka #include <string.h>
12*437bfbebSnyanmisaka 
13*437bfbebSnyanmisaka #include "mpp_log.h"
14*437bfbebSnyanmisaka #include "mpp_env.h"
15*437bfbebSnyanmisaka #include "mpp_common.h"
16*437bfbebSnyanmisaka #include "mpp_vcodec_client.h"
17*437bfbebSnyanmisaka 
18*437bfbebSnyanmisaka #define VOCDEC_IOC_MAGIC            'V'
19*437bfbebSnyanmisaka #define VOCDEC_IOC_CFG              _IOW(VOCDEC_IOC_MAGIC, 1, unsigned int)
20*437bfbebSnyanmisaka 
21*437bfbebSnyanmisaka typedef struct vcodec_req_t {
22*437bfbebSnyanmisaka     RK_U32 cmd;
23*437bfbebSnyanmisaka     RK_U32 ctrl_cmd;
24*437bfbebSnyanmisaka     RK_U32 size;
25*437bfbebSnyanmisaka     RK_U64 data;
26*437bfbebSnyanmisaka } vcodec_req;
27*437bfbebSnyanmisaka 
28*437bfbebSnyanmisaka #if __SIZEOF_POINTER__ == 4
29*437bfbebSnyanmisaka #define REQ_DATA_PTR(ptr) ((RK_U32)ptr)
30*437bfbebSnyanmisaka #elif __SIZEOF_POINTER__ == 8
31*437bfbebSnyanmisaka #define REQ_DATA_PTR(ptr) ((RK_U64)ptr)
32*437bfbebSnyanmisaka #endif
33*437bfbebSnyanmisaka 
mpp_vcodec_open(void)34*437bfbebSnyanmisaka RK_S32 mpp_vcodec_open(void)
35*437bfbebSnyanmisaka {
36*437bfbebSnyanmisaka     RK_S32 fd = -1;
37*437bfbebSnyanmisaka 
38*437bfbebSnyanmisaka     fd = open("/dev/vcodec", O_RDWR | O_CLOEXEC);
39*437bfbebSnyanmisaka     if (fd < 0) {
40*437bfbebSnyanmisaka         mpp_err("open /dev/vcodec failed errno %d %s\n", errno, strerror(errno));
41*437bfbebSnyanmisaka         return -1;
42*437bfbebSnyanmisaka     }
43*437bfbebSnyanmisaka 
44*437bfbebSnyanmisaka     return fd;
45*437bfbebSnyanmisaka }
46*437bfbebSnyanmisaka 
mpp_vcodec_ioctl(RK_S32 fd,RK_U32 cmd,RK_U32 ctrl_cmd,RK_U32 size,void * param)47*437bfbebSnyanmisaka MPP_RET mpp_vcodec_ioctl(RK_S32 fd, RK_U32 cmd, RK_U32 ctrl_cmd, RK_U32 size, void *param)
48*437bfbebSnyanmisaka {
49*437bfbebSnyanmisaka     vcodec_req req;
50*437bfbebSnyanmisaka     RK_S32 ret = 0;
51*437bfbebSnyanmisaka 
52*437bfbebSnyanmisaka     memset(&req, 0, sizeof(req));
53*437bfbebSnyanmisaka     req.cmd = cmd;
54*437bfbebSnyanmisaka     req.ctrl_cmd = ctrl_cmd;
55*437bfbebSnyanmisaka     req.size = size;
56*437bfbebSnyanmisaka     req.data = REQ_DATA_PTR(param);
57*437bfbebSnyanmisaka 
58*437bfbebSnyanmisaka     ret = (RK_S32)ioctl(fd, VOCDEC_IOC_CFG, &req);
59*437bfbebSnyanmisaka     if (ret) {
60*437bfbebSnyanmisaka         mpp_err("ioctl fd %d failed ret %d errno %d %s\n",
61*437bfbebSnyanmisaka                 fd, ret, errno, strerror(errno));
62*437bfbebSnyanmisaka         return MPP_NOK;
63*437bfbebSnyanmisaka     }
64*437bfbebSnyanmisaka 
65*437bfbebSnyanmisaka     return MPP_OK;
66*437bfbebSnyanmisaka }
67*437bfbebSnyanmisaka 
mpp_vcodec_close(RK_S32 fd)68*437bfbebSnyanmisaka MPP_RET mpp_vcodec_close(RK_S32 fd)
69*437bfbebSnyanmisaka {
70*437bfbebSnyanmisaka     if (fd)
71*437bfbebSnyanmisaka         close(fd);
72*437bfbebSnyanmisaka 
73*437bfbebSnyanmisaka     return MPP_OK;
74*437bfbebSnyanmisaka }
75