1 /* SPDX-License-Identifier: Apache-2.0 OR MIT */ 2 /* 3 * Copyright (c) 2025 Rockchip Electronics Co., Ltd. 4 */ 5 6 #ifndef __KMPP_BUFFER_IMPL_H__ 7 #define __KMPP_BUFFER_IMPL_H__ 8 9 #include "mpp_list.h" 10 #include "kmpp_obj.h" 11 #include "kmpp_buffer.h" 12 13 #define BUF_ST_NONE (0) 14 #define BUF_ST_INIT (1) 15 #define BUF_ST_INIT_TO_USED (2) 16 #define BUF_ST_USED (3) 17 #define BUF_ST_UNUSED (4) 18 #define BUF_ST_USED_TO_DEINIT (5) 19 #define BUF_ST_DEINIT_AT_GRP (6) 20 #define BUF_ST_DEINIT_AT_SRV (7) 21 22 /* buffer group share name storage for both name and allocator */ 23 #define BUF_GRP_STR_BUF_SIZE (64) 24 25 typedef struct KmppBufGrpCfgImpl_t { 26 rk_u32 flag; 27 rk_u32 count; 28 rk_u32 size; 29 KmppBufferMode mode; 30 rk_s32 fd; 31 rk_s32 grp_id; 32 rk_s32 used; 33 rk_s32 unused; 34 void *device; 35 KmppShmPtr allocator; 36 KmppShmPtr name; 37 void *grp_impl; 38 } KmppBufGrpCfgImpl; 39 40 typedef struct KmppBufGrpPriv_t { 41 KmppObj obj; 42 KmppBufGrpCfgImpl *impl; 43 } KmppBufGrpPriv; 44 45 typedef struct KmppBufGrpImpl_t { 46 /* group share config pointer */ 47 KmppShmPtr cfg; 48 KmppBufGrpCfg cfg_ext; 49 KmppBufGrpCfgImpl *cfg_usr; 50 KmppObj obj; 51 52 /* internal parameter set on used */ 53 rk_u32 flag; 54 rk_u32 count; 55 rk_u32 size; 56 KmppBufferMode mode; 57 58 pthread_mutex_t lock; 59 struct list_head list_srv; 60 struct list_head list_used; 61 struct list_head list_unused; 62 rk_s32 count_used; 63 rk_s32 count_unused; 64 65 /* allocator */ 66 void* heap; 67 rk_s32 heap_fd; 68 rk_s32 grp_id; 69 rk_s32 buf_id; 70 rk_s32 buf_cnt; 71 rk_s32 buffer_count; 72 73 /* status status */ 74 rk_s32 log_runtime_en; 75 rk_s32 log_history_en; 76 rk_s32 clear_on_exit; 77 rk_s32 dump_on_exit; 78 rk_s32 is_orphan; 79 rk_s32 is_finalizing; 80 rk_s32 is_default; 81 82 /* string storage */ 83 rk_s32 name_offset; 84 rk_u8 str_buf[BUF_GRP_STR_BUF_SIZE]; 85 86 /* buffer group config for internal usage */ 87 KmppBufGrpCfgImpl cfg_int; 88 } KmppBufGrpImpl; 89 90 typedef struct KmppBufCfgImpl_t { 91 rk_u32 size; 92 rk_u32 offset; 93 rk_u32 flag; 94 rk_s32 fd; 95 rk_s32 index; /* index for external user buffer match */ 96 rk_s32 grp_id; 97 rk_s32 buf_gid; 98 rk_s32 buf_uid; 99 100 void *hnd; 101 void *dmabuf; 102 void *kdev; 103 void *dev; 104 rk_u64 iova; 105 void *kptr; 106 void *kpriv; 107 void *kfp; 108 rk_u64 uptr; 109 rk_u64 upriv; 110 rk_u64 ufp; 111 KmppShmPtr sptr; 112 KmppShmPtr group; 113 void *buf_impl; 114 } KmppBufCfgImpl; 115 116 typedef struct KmppBufPriv_t { 117 KmppObj obj; 118 KmppBufCfgImpl *impl; 119 } KmppBufPriv; 120 121 typedef struct KmppBufferImpl_t { 122 KmppShmPtr cfg; 123 KmppBufCfg cfg_ext; 124 KmppBufCfgImpl *cfg_usr; 125 126 KmppBufGrpImpl *grp; 127 /* when grp is valid used grp lock else use srv lock */ 128 pthread_mutex_t lock; 129 struct list_head list_status; 130 KmppObj obj; 131 132 KmppDmaBuf buf; 133 void *kptr; 134 rk_u64 uaddr; 135 rk_u32 size; 136 137 rk_s32 grp_id; 138 rk_s32 buf_gid; 139 rk_s32 buf_uid; 140 rk_s32 ref_cnt; 141 142 rk_u32 status; 143 rk_u32 discard; 144 145 /* mutex for list_maps */ 146 void *mutex_maps; 147 /* list for list in KmppBufIovaMap */ 148 struct list_head list_maps; 149 150 KmppBufCfgImpl cfg_int; 151 } KmppBufferImpl; 152 153 #endif /* __KMPP_BUF_GRP_IMPL_H__ */ 154