• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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