1 /* 2 * Copyright (C) 2021 HiSilicon (Shanghai) Technologies CO., LIMITED. 3 * 4 * This program is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU General Public License 6 * as published by the Free Software Foundation; either version 2 7 * of the License, or (at your option) any later version. 8 * 9 * This program is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 * GNU General Public License for more details. 13 * 14 * You should have received a copy of the GNU General Public License 15 * along with this program; if not, write to the Free Software 16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 17 */ 18 19 #ifndef __OAL_MEM_H__ 20 #define __OAL_MEM_H__ 21 22 #include "oal_net.h" 23 #include "oal_util.h" 24 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION) 25 #include <linux/kallsyms.h> 26 #endif 27 #include "oal_spinlock.h" 28 #include "oal_mm.h" 29 #ifdef __cplusplus 30 #if __cplusplus 31 extern "C" { 32 #endif 33 #endif 34 35 /* **************************************************************************** 36 宏定义 37 **************************************************************************** */ 38 #define OAL_MEM_MAX_WORD_ALIGNMENT_BUFFER 3 39 #define hi_malloc(_id, _size) oal_memalloc((_size) + OAL_MEM_MAX_WORD_ALIGNMENT_BUFFER) 40 #define hi_free(_id, _ptr) oal_free(_ptr) 41 42 #define PACKET_H_MEM __attribute__((section("pkt_head_mem_section"))) __attribute__((zero_init)) 43 #define PACKETMEM __attribute__((section("pkt_mem_section"))) __attribute__((zero_init)) 44 #define PACKET_DC_MEM __attribute__((section("pkt_dc_mem_section"))) __attribute__((zero_init)) 45 46 /* host侧向device侧发送数据,sdio传输为了使payload部分四字节对齐,在真正的payload前面会有pad长度扩充, 47 因此,device侧需要获得真正payload部分,需要偏移pay的长度,此接口只在device侧rx adapt时使用,将pad 48 部分剥离掉,后续通过OAL_NETBUF_DATA(_pst_buf)获取的即为真正的payload内容 */ 49 #define oal_dev_netbuf_hcc_payload(_pst_buf) \ 50 (oal_dev_netbuf_get_payload(_pst_buf) + ((struct hcc_header *)oal_dev_netbuf_hcchdr(_pst_buf))->pad_payload) 51 #define oal_dev_netbuf_hcchdr(_pst_buf) oal_netbuf_get_hcc_hdr_addr(_pst_buf) 52 53 #ifdef _PRE_DEBUG_MODE 54 #define oal_mem_tracing(_p_data, _uc_lock) oal_mem_trace(0, __LINE__, _p_data, _uc_lock) 55 #define OAL_DOG_TAG_SIZE 4 /* 狗牌大小(4字节) */ 56 #else 57 #define oal_mem_tracing(_p_data, _uc_lock) 58 #define OAL_DOG_TAG_SIZE 0 59 #endif 60 61 /* 对于enhanced类型的申请接口与释放接口,每一个内存块都包含一个4字节的头部, */ 62 /* 用来指向内存块管理结构体oal_mem_struc,整个内存块的结构如下所示。 */ 63 /* */ 64 /* +-------------------+------------------------------------------+---------+ */ 65 /* | oal_mem_stru addr | payload | dog tag | */ 66 /* +-------------------+------------------------------------------+---------+ */ 67 /* | 4/8 byte | | 4 byte | */ 68 /* +-------------------+------------------------------------------+---------+ */ 69 #define OAL_MEM_INFO_SIZE 4 70 #define OAL_DOG_TAG 0x5b3a293e /* 狗牌,用于检测内存越界 */ 71 72 #define OAL_NETBUF_MACHDR_BYTE_LEN 64 /* netbuf mac head */ 73 #define MAC_HEAD_OFFSET (OAL_NETBUF_MACHDR_BYTE_LEN - WLAN_MAX_MAC_HDR_LEN) 74 #define CB_OFFSET (OAL_NETBUF_MACHDR_BYTE_LEN - WLAN_MAX_MAC_HDR_LEN - HI_MAX_DEV_CB_LEN) 75 /* HCC PAD LEN (64 - hcc - cb - mac) */ 76 #define OAL_PAD_HDR_LEN (OAL_NETBUF_MACHDR_BYTE_LEN - WLAN_MAX_MAC_HDR_LEN - HI_MAX_DEV_CB_LEN - \ 77 OAL_HCC_HDR_LEN) 78 #define OAL_NETBUF_CONTROL_COUNT 10 79 80 #define OAL_HCC_HDR_LEN 8 81 #define OAL_TX_CB_LEN 48 82 #define HI_MAX_DEV_CB_LEN 20 /* device侧cb字段结构体长度。原值19, 四字节不对齐。 */ 83 84 /* 对于enhanced类型的申请接口与释放接口,每一个内存块都包含一个4字节的头部, */ 85 /* 用来指向内存块管理结构体oal_mem_struc,整个内存块的结构如下所示。 */ 86 /* */ 87 /* +-------------------+------------------------------------------+---------+ */ 88 /* | oal_mem_stru addr | payload | dog tag | */ 89 /* +-------------------+------------------------------------------+---------+ */ 90 /* | 4 byte | | 4 byte | */ 91 /* +-------------------+------------------------------------------+---------+ */ 92 /* **************************************************************************** 93 枚举定义 94 **************************************************************************** */ 95 typedef enum { 96 OAL_MEM_STATE_FREE = 0, /* 该内存空闲 */ 97 OAL_MEM_STATE_ALLOC, /* 该内存已分配 */ 98 OAL_MEM_STATE_BUTT 99 } oal_mem_state_enum; 100 typedef hi_u8 oal_mem_state_enum_uint8; 101 102 /* **************************************************************************** 103 枚举名 : oal_mem_pool_id_enum_uint8 104 协议表格: 105 枚举说明: HOST侧内存池ID 106 **************************************************************************** */ 107 typedef enum { 108 OAL_MEM_POOL_ID_EVENT = 0, /* 事件内存池 */ 109 OAL_MEM_POOL_ID_LOCAL, /* 本地变量内存池 */ 110 OAL_MEM_POOL_ID_MIB, /* MIB内存池 */ 111 OAL_MEM_POOL_ID_BUTT, 112 } oal_mem_pool_id_enum; 113 typedef hi_u8 oal_mem_pool_id_enum_uint8; 114 115 /* **************************************************************************** 116 枚举名 : oal_netbuf_priority_enum_uint8 117 协议表格: 118 枚举说明: netbuf优先级 119 **************************************************************************** */ 120 typedef enum { 121 OAL_NETBUF_PRIORITY_LOW = 0, /* 最低优先级,不能跨池申请 */ 122 OAL_NETBUF_PRIORITY_MID = 1, /* 中间优先级,可以跨池申请,但不能申请大包的最后N片 */ 123 OAL_NETBUF_PRIORITY_HIGH = 2, /* 最高优先级,可以跨池申请,且可以申请大包的最后N片 */ 124 125 OAL_NETBUF_PRIORITY_BUTT 126 } oal_netbuf_priority_enum; 127 typedef hi_u8 oal_netbuf_priority_enum_uint8; 128 129 /* **************************************************************************** 130 枚举名 : oal_netbuf_id_enum_uint8 131 协议表格: 132 枚举说明: 对外提供netbuf内存池ID 133 **************************************************************************** */ 134 typedef enum { 135 OAL_NORMAL_NETBUF = 0, /* 包括短帧、长帧内存池 */ 136 OAL_MGMT_NETBUF = 1, /* 管理帧内存池 */ 137 138 OAL_NETBUF_POOL_ID_BUTT 139 } oal_netbuf_id_enum; 140 typedef hi_u8 oal_netbuf_id_enum_uint8; 141 142 /* **************************************************************************** 143 枚举名 : oal_mem_netbuf_pool_id_enum_uint8 144 协议表格: 145 枚举说明: netbuf内存池ID 146 **************************************************************************** */ 147 typedef enum { 148 OAL_MEM_NETBUF_POOL_ID_SHORT_PKT = 0, /* 短帧内存池 */ 149 OAL_MEM_NETBUF_POOL_ID_MGMT_PKT, /* 管理帧 */ 150 OAL_MEM_NETBUF_POOL_ID_LARGE_PKT, /* 长帧内存池 */ 151 152 OAL_MEM_NETBUF_POOL_ID_BUTT 153 } oal_mem_netbuf_pool_id_enum; 154 typedef hi_u8 oal_mem_netbuf_pool_id_enum_uint8; 155 156 /* **************************************************************************** 157 结构说明: PKT内存配置结构体 158 **************************************************************************** */ 159 typedef struct { 160 uintptr_t start_addr; /* PKT内存块的首地址 */ 161 hi_u32 length; /* 内存块长度 */ 162 } oal_mem_pkt_cfg_stru; 163 164 /* **************************************************************************** 165 结构名 : oal_netbuf_machdr_stru 166 结构说明: 裸系统下mac结构体大小 167 **************************************************************************** */ 168 typedef struct { 169 hi_u8 auc_mac_hdr[OAL_NETBUF_MACHDR_BYTE_LEN + OAL_DOG_TAG_SIZE]; 170 } oal_netbuf_machdr_stru; 171 172 /* **************************************************************************** 173 结构名 : oal_mem_pool_info_stru 174 结构说明: 内存池信息结构体 175 **************************************************************************** */ 176 typedef struct { 177 uintptr_t buff_base; /* 本内存池内存块基地址 */ 178 hi_u32 buff_len; /* 本内存池内存块总长度 */ 179 } oal_mem_pool_info_stru; 180 181 /* **************************************************************************** 182 STRUCT定义 183 **************************************************************************** */ 184 /* **************************************************************************** 185 结构名 : oal_mem_ctrl_blk_stru 186 结构说明: 将内存块所用空间封装成一个结构体 187 **************************************************************************** */ 188 typedef struct { 189 hi_u8 *puc_base_addr; 190 hi_u32 idx; 191 hi_u32 max_size; 192 } oal_mem_ctrl_blk_stru; 193 194 /* **************************************************************************** 195 结构名 : oal_mem_netbuf_info_stru 196 结构说明: netbuf内存块维测结构体 197 **************************************************************************** */ 198 typedef struct { 199 hi_u32 dog_tag; /* 狗牌,用于内存写越界检查 */ 200 hi_u32 alloc_file_id; /* 申请netbuf内存时的文件ID */ 201 hi_u32 alloc_line_num; /* 申请netbuf内存时的行号 */ 202 hi_u32 alloc_time_stamp; /* 申请netbuf内存时的时间戳 */ 203 hi_u32 trace_file_id; /* netbuf内存在关键路径上的文件ID */ 204 hi_u32 trace_line_num; /* netbuf内存在关键路径上的行号 */ 205 hi_u32 trace_time_stamp; /* netbuf内存在关键路径上的时间戳 */ 206 } oal_mem_netbuf_info_stru; 207 208 /* **************************************************************************** 209 结构名 : oal_mem_stru 210 结构说明: 内存块结构体 211 **************************************************************************** */ 212 #pragma pack(push, 1) /* 涉及位域操作,按1字节对齐 */ 213 struct oal_mem_stru_tag { 214 hi_u8 *puc_data; /* 存放数据的指针 */ 215 hi_u8 *puc_origin_data; /* 记录数据的原始指针 */ 216 hi_u16 us_len; /* 内存块的长度 */ 217 hi_u8 user_cnt :4; /* 申请本内存块的用户计数 */ 218 oal_mem_state_enum_uint8 mem_state_flag :4; /* 内存块状态 */ 219 oal_mem_pool_id_enum_uint8 pool_id :4; /* 本内存属于哪一个内存池 */ 220 hi_u8 subpool_id :4; /* 本内存是属于哪一级子内存池 */ 221 }; 222 typedef struct oal_mem_stru_tag oal_mem_stru; 223 /* 取消实际结构对齐,恢复原有对齐方式 */ 224 #pragma pack(pop) 225 /* **************************************************************************** 226 结构名 : oal_mem_subpool_stru 227 结构说明: 子内存池结构体 228 **************************************************************************** */ 229 typedef struct { 230 oal_spin_lock_stru st_spinlock; 231 hi_u16 us_len; /* 本子内存池的内存块长度 */ 232 hi_u16 us_free_cnt; /* 本子内存池可用内存块数 */ 233 234 /* 记录oal_mem_stru可用内存索引表的栈顶元素,其内容为oal_mem_stru指针 */ 235 hi_void **free_stack; 236 237 hi_u16 us_total_cnt; /* 本子内存池内存块总数 */ 238 hi_u8 auc_resv[2]; /* 2: bytes保留字段 */ 239 } oal_mem_subpool_stru; 240 241 /* **************************************************************************** 242 结构名 : oal_mem_pool_stru 243 结构说明: 内存池结构体 244 **************************************************************************** */ 245 typedef struct { 246 hi_u16 us_max_byte_len; /* 本内存池可分配内存块最大长度 */ 247 hi_u8 subpool_cnt; /* 本内存池一共有多少子内存池 */ 248 hi_u8 uc_resv; 249 /* 子内存池索引表数组 */ 250 oal_mem_subpool_stru ast_subpool_table[WLAN_MEM_MAX_SUBPOOL_NUM]; 251 252 hi_u16 us_mem_used_cnt; /* 本内存池已用内存块 */ 253 hi_u16 us_mem_total_cnt; /* 本内存池一共有多少内存块 */ 254 oal_mem_stru *mem_start_addr; 255 } oal_mem_pool_stru; 256 257 /* **************************************************************************** 258 结构名 : oal_mem_subpool_cfg_stru 259 结构说明: 子内存池配置结构体 260 **************************************************************************** */ 261 typedef struct { 262 hi_u16 us_size; /* 本子内存池内存块大小 */ 263 hi_u16 us_cnt; /* 本子内存池内存块个数 */ 264 } oal_mem_subpool_cfg_stru; 265 266 /* **************************************************************************** 267 结构名 : oal_mem_pool_cfg_stru 268 结构说明: 内存池配置结构体 269 **************************************************************************** */ 270 typedef struct { 271 oal_mem_pool_id_enum_uint8 pool_id; /* 内存池ID */ 272 hi_u8 subpool_cnt; /* 本内存池子内存池个数 */ 273 274 hi_u8 auc_resv[2]; /* 2: bytes保留字段 */ 275 276 /* 指向每一子内存池具体配置信息 */ 277 oal_mem_subpool_cfg_stru *subpool_cfg_info; 278 } oal_mem_pool_cfg_stru; 279 280 /* **************************************************************************** 281 函数声明 282 **************************************************************************** */ 283 hi_void oal_mem_exit(hi_void); 284 hi_void *oal_mem_alloc(oal_mem_pool_id_enum_uint8 pool_id, hi_u16 us_len); 285 hi_u32 oal_mem_free(const hi_void *data); 286 hi_u32 oal_mem_free_enhanced(oal_mem_stru *mem); 287 hi_u32 oal_mem_init_pool(hi_void); 288 oal_mem_stru *oal_mem_alloc_enhanced(oal_mem_pool_id_enum_uint8 pool_id, hi_u16 us_len); 289 hi_u8 *oal_dev_netbuf_get_payload(const oal_dev_netbuf_stru *dev_netbuf); 290 hi_u8 *oal_dev_netbuf_cb(hi_u16 us_netbuf_index); 291 hi_u8 *oal_dev_netbuf_get_mac_hdr(const oal_dev_netbuf_stru *dev_netbuf); 292 hi_u32 oal_mem_dev_netbuf_free(oal_dev_netbuf_stru *dev_netbuf); 293 hi_u16 oal_dev_netbuf_get_len(const oal_dev_netbuf_stru *dev_netbuf); 294 hi_u32 oal_mem_trace(hi_u32 file_id, hi_u32 line_num, hi_void *data, hi_u8 lock); 295 hi_u8 oal_mem_get_vap_res_num(hi_void); 296 hi_u8 oal_mem_get_user_res_num(hi_void); 297 hi_u32 oal_mem_set_vap_res_num(const hi_u8 vap_res_num, const hi_u8 vap_spec); 298 hi_u32 oal_mem_set_user_res_num(const hi_u8 user_res_num, const hi_u8 user_spec); 299 hi_u32 oal_mem_set_subpool_config(const oal_mem_subpool_cfg_stru *subpool_cfg, oal_mem_pool_id_enum_uint8 pool_id, 300 hi_u8 subpool_num); 301 hi_u16 oal_mem_get_dev_netbuff_cnt(hi_void); 302 303 #ifdef __cplusplus 304 #if __cplusplus 305 } 306 #endif 307 #endif 308 #endif /* end of oal_mm.h */ 309