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