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