xref: /rockchip-linux_mpp/kmpp/base/kmpp_buffer.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
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