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