xref: /rockchip-linux_mpp/kmpp/base/kmpp_buffer.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
1*437bfbebSnyanmisaka /* SPDX-License-Identifier: Apache-2.0 OR MIT */
2*437bfbebSnyanmisaka /*
3*437bfbebSnyanmisaka  * Copyright (c) 2025 Rockchip Electronics Co., Ltd.
4*437bfbebSnyanmisaka  */
5*437bfbebSnyanmisaka 
6*437bfbebSnyanmisaka #define MODULE_TAG "kmpp_buffer"
7*437bfbebSnyanmisaka 
8*437bfbebSnyanmisaka #include <asm/ioctl.h>
9*437bfbebSnyanmisaka #include "mpp_mem.h"
10*437bfbebSnyanmisaka 
11*437bfbebSnyanmisaka #include "mpp_list.h"
12*437bfbebSnyanmisaka #include "mpp_log.h"
13*437bfbebSnyanmisaka #include "mpp_lock.h"
14*437bfbebSnyanmisaka #include "mpp_thread.h"
15*437bfbebSnyanmisaka #include "kmpp_obj.h"
16*437bfbebSnyanmisaka #include "kmpp_buffer_impl.h"
17*437bfbebSnyanmisaka 
18*437bfbebSnyanmisaka #define KMPP_OBJ_NAME               kmpp_buf_grp_cfg
19*437bfbebSnyanmisaka #define KMPP_OBJ_INTF_TYPE          KmppBufGrpCfg
20*437bfbebSnyanmisaka #define KMPP_OBJ_IMPL_TYPE          KmppBufGrpCfgImpl
21*437bfbebSnyanmisaka #define KMPP_OBJ_SGLN_ID            MPP_SGLN_KMPP_BUF_GRP_CFG
22*437bfbebSnyanmisaka #define KMPP_OBJ_ENTRY_TABLE        KMPP_BUF_GRP_CFG_ENTRY_TABLE
23*437bfbebSnyanmisaka #include "kmpp_obj_helper.h"
24*437bfbebSnyanmisaka 
kmpp_buf_grp_to_cfg(KmppBufGrp grp)25*437bfbebSnyanmisaka KmppBufGrpCfg kmpp_buf_grp_to_cfg(KmppBufGrp grp)
26*437bfbebSnyanmisaka {
27*437bfbebSnyanmisaka     if (grp) {
28*437bfbebSnyanmisaka         KmppBufGrpPriv *priv = (KmppBufGrpPriv *)kmpp_obj_to_priv((KmppObj)grp);
29*437bfbebSnyanmisaka 
30*437bfbebSnyanmisaka         if (priv)
31*437bfbebSnyanmisaka             return (KmppBufGrpCfg)(priv->obj);
32*437bfbebSnyanmisaka     }
33*437bfbebSnyanmisaka 
34*437bfbebSnyanmisaka     return NULL;
35*437bfbebSnyanmisaka }
36*437bfbebSnyanmisaka 
kmpp_buf_grp_impl_init(void * entry,KmppObj obj,const char * caller)37*437bfbebSnyanmisaka rk_s32 kmpp_buf_grp_impl_init(void *entry, KmppObj obj, const char *caller)
38*437bfbebSnyanmisaka {
39*437bfbebSnyanmisaka     KmppBufGrpPriv *priv = (KmppBufGrpPriv *)kmpp_obj_to_priv(obj);
40*437bfbebSnyanmisaka     (void)entry;
41*437bfbebSnyanmisaka 
42*437bfbebSnyanmisaka     if (!priv) {
43*437bfbebSnyanmisaka         mpp_loge_f("invalid grp %p without priv at %s\n", obj, caller);
44*437bfbebSnyanmisaka         return rk_nok;
45*437bfbebSnyanmisaka     }
46*437bfbebSnyanmisaka 
47*437bfbebSnyanmisaka     {
48*437bfbebSnyanmisaka         KmppBufGrpCfg cfg;
49*437bfbebSnyanmisaka         KmppShmPtr sptr;
50*437bfbebSnyanmisaka 
51*437bfbebSnyanmisaka         kmpp_obj_get_shm(obj, "cfg", &sptr);
52*437bfbebSnyanmisaka         kmpp_obj_get_by_sptr_f(&cfg, &sptr);
53*437bfbebSnyanmisaka 
54*437bfbebSnyanmisaka         mpp_assert(cfg);
55*437bfbebSnyanmisaka 
56*437bfbebSnyanmisaka         priv->obj = cfg;
57*437bfbebSnyanmisaka         priv->impl = kmpp_obj_to_entry(cfg);
58*437bfbebSnyanmisaka     }
59*437bfbebSnyanmisaka 
60*437bfbebSnyanmisaka     return rk_ok;
61*437bfbebSnyanmisaka }
62*437bfbebSnyanmisaka 
kmpp_buf_grp_impl_deinit(void * entry,KmppObj obj,const char * caller)63*437bfbebSnyanmisaka rk_s32 kmpp_buf_grp_impl_deinit(void *entry, KmppObj obj, const char *caller)
64*437bfbebSnyanmisaka {
65*437bfbebSnyanmisaka     KmppBufGrpPriv *priv = (KmppBufGrpPriv *)kmpp_obj_to_priv(obj);
66*437bfbebSnyanmisaka     (void)entry;
67*437bfbebSnyanmisaka 
68*437bfbebSnyanmisaka     if (!priv) {
69*437bfbebSnyanmisaka         mpp_loge_f("invalid grp %p without priv at %s\n", obj, caller);
70*437bfbebSnyanmisaka         return rk_nok;
71*437bfbebSnyanmisaka     }
72*437bfbebSnyanmisaka 
73*437bfbebSnyanmisaka     if (priv->obj) {
74*437bfbebSnyanmisaka         kmpp_obj_impl_put(priv->obj, caller);
75*437bfbebSnyanmisaka         priv->obj = NULL;
76*437bfbebSnyanmisaka     }
77*437bfbebSnyanmisaka 
78*437bfbebSnyanmisaka     priv->impl = NULL;
79*437bfbebSnyanmisaka 
80*437bfbebSnyanmisaka     return rk_ok;
81*437bfbebSnyanmisaka }
82*437bfbebSnyanmisaka 
83*437bfbebSnyanmisaka #define KMPP_OBJ_NAME               kmpp_buf_grp
84*437bfbebSnyanmisaka #define KMPP_OBJ_INTF_TYPE          KmppBufGrp
85*437bfbebSnyanmisaka #define KMPP_OBJ_IMPL_TYPE          KmppBufGrpImpl
86*437bfbebSnyanmisaka #define KMPP_OBJ_SGLN_ID            MPP_SGLN_KMPP_BUF_GRP
87*437bfbebSnyanmisaka #define KMPP_OBJ_FUNC_INIT          kmpp_buf_grp_impl_init
88*437bfbebSnyanmisaka #define KMPP_OBJ_FUNC_DEINIT        kmpp_buf_grp_impl_deinit
89*437bfbebSnyanmisaka #define KMPP_OBJ_FUNC_IOCTL         KMPP_BUF_GRP_IOCTL_TABLE
90*437bfbebSnyanmisaka #define KMPP_OBJ_PRIV_SIZE          sizeof(KmppBufGrpPriv)
91*437bfbebSnyanmisaka #include "kmpp_obj_helper.h"
92*437bfbebSnyanmisaka 
93*437bfbebSnyanmisaka #define KMPP_OBJ_NAME               kmpp_buf_cfg
94*437bfbebSnyanmisaka #define KMPP_OBJ_INTF_TYPE          KmppBufCfg
95*437bfbebSnyanmisaka #define KMPP_OBJ_IMPL_TYPE          KmppBufCfgImpl
96*437bfbebSnyanmisaka #define KMPP_OBJ_SGLN_ID            MPP_SGLN_KMPP_BUF_CFG
97*437bfbebSnyanmisaka #define KMPP_OBJ_ENTRY_TABLE        KMPP_BUF_CFG_ENTRY_TABLE
98*437bfbebSnyanmisaka #include "kmpp_obj_helper.h"
99*437bfbebSnyanmisaka 
kmpp_buffer_to_cfg(KmppBuffer buf)100*437bfbebSnyanmisaka KmppBufCfg kmpp_buffer_to_cfg(KmppBuffer buf)
101*437bfbebSnyanmisaka {
102*437bfbebSnyanmisaka     if (buf) {
103*437bfbebSnyanmisaka         KmppBufPriv *priv = (KmppBufPriv *)kmpp_obj_to_priv((KmppObj)buf);
104*437bfbebSnyanmisaka 
105*437bfbebSnyanmisaka         if (priv)
106*437bfbebSnyanmisaka             return (KmppBufCfg)(priv->obj);
107*437bfbebSnyanmisaka     }
108*437bfbebSnyanmisaka 
109*437bfbebSnyanmisaka     return NULL;
110*437bfbebSnyanmisaka }
111*437bfbebSnyanmisaka 
kmpp_buffer_impl_init(void * entry,KmppObj obj,const char * caller)112*437bfbebSnyanmisaka rk_s32 kmpp_buffer_impl_init(void *entry, KmppObj obj, const char *caller)
113*437bfbebSnyanmisaka {
114*437bfbebSnyanmisaka     KmppBufPriv *priv = (KmppBufPriv *)kmpp_obj_to_priv(obj);
115*437bfbebSnyanmisaka     (void)entry;
116*437bfbebSnyanmisaka 
117*437bfbebSnyanmisaka     if (!priv) {
118*437bfbebSnyanmisaka         mpp_loge_f("invalid buf %p without priv at %s\n", obj, caller);
119*437bfbebSnyanmisaka         return rk_nok;
120*437bfbebSnyanmisaka     }
121*437bfbebSnyanmisaka 
122*437bfbebSnyanmisaka     {
123*437bfbebSnyanmisaka         KmppBufCfg cfg;
124*437bfbebSnyanmisaka         KmppShmPtr sptr;
125*437bfbebSnyanmisaka 
126*437bfbebSnyanmisaka         kmpp_obj_get_shm(obj, "cfg", &sptr);
127*437bfbebSnyanmisaka         kmpp_obj_get_by_sptr_f(&cfg, &sptr);
128*437bfbebSnyanmisaka 
129*437bfbebSnyanmisaka         mpp_assert(cfg);
130*437bfbebSnyanmisaka 
131*437bfbebSnyanmisaka         priv->obj = cfg;
132*437bfbebSnyanmisaka         priv->impl = kmpp_obj_to_entry(cfg);
133*437bfbebSnyanmisaka     }
134*437bfbebSnyanmisaka 
135*437bfbebSnyanmisaka     return rk_ok;
136*437bfbebSnyanmisaka }
137*437bfbebSnyanmisaka 
kmpp_buffer_impl_deinit(void * entry,KmppObj obj,const char * caller)138*437bfbebSnyanmisaka rk_s32 kmpp_buffer_impl_deinit(void *entry,  KmppObj obj, const char *caller)
139*437bfbebSnyanmisaka {
140*437bfbebSnyanmisaka     KmppBufPriv *priv = (KmppBufPriv *)kmpp_obj_to_priv(obj);
141*437bfbebSnyanmisaka     (void)entry;
142*437bfbebSnyanmisaka 
143*437bfbebSnyanmisaka     if (!priv) {
144*437bfbebSnyanmisaka         mpp_loge_f("invalid buf %p without priv at %s\n", obj, caller);
145*437bfbebSnyanmisaka         return rk_nok;
146*437bfbebSnyanmisaka     }
147*437bfbebSnyanmisaka 
148*437bfbebSnyanmisaka     if (priv->impl->fd > 0) {
149*437bfbebSnyanmisaka         close(priv->impl->fd);
150*437bfbebSnyanmisaka         priv->impl->fd = -1;
151*437bfbebSnyanmisaka     }
152*437bfbebSnyanmisaka 
153*437bfbebSnyanmisaka     if (priv->obj) {
154*437bfbebSnyanmisaka         kmpp_obj_impl_put(priv->obj, caller);
155*437bfbebSnyanmisaka         priv->obj = NULL;
156*437bfbebSnyanmisaka     }
157*437bfbebSnyanmisaka 
158*437bfbebSnyanmisaka     priv->impl = NULL;
159*437bfbebSnyanmisaka 
160*437bfbebSnyanmisaka     return rk_ok;
161*437bfbebSnyanmisaka }
162*437bfbebSnyanmisaka 
163*437bfbebSnyanmisaka #define KMPP_OBJ_NAME               kmpp_buffer
164*437bfbebSnyanmisaka #define KMPP_OBJ_INTF_TYPE          KmppBuffer
165*437bfbebSnyanmisaka #define KMPP_OBJ_IMPL_TYPE          KmppBufferImpl
166*437bfbebSnyanmisaka #define KMPP_OBJ_SGLN_ID            MPP_SGLN_KMPP_BUFFER
167*437bfbebSnyanmisaka #define KMPP_OBJ_FUNC_INIT          kmpp_buffer_impl_init
168*437bfbebSnyanmisaka #define KMPP_OBJ_FUNC_DEINIT        kmpp_buffer_impl_deinit
169*437bfbebSnyanmisaka #define KMPP_OBJ_FUNC_IOCTL         KMPP_BUFFER_IOCTL_TABLE
170*437bfbebSnyanmisaka #define KMPP_OBJ_PRIV_SIZE          sizeof(KmppBufPriv)
171*437bfbebSnyanmisaka #include "kmpp_obj_helper.h"
172