1 /*
2 * Copyright (c) 2020 HiSilicon (Shanghai) Technologies CO., LIMITED.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 * Description: netbuf memory manage interface
15 * Create: 2022-04-20
16 */
17 #ifndef __OAL_MEM_HCM_H__
18 #define __OAL_MEM_HCM_H__
19 #include "oal_spinlock.h"
20 #include "oal_list.h"
21 #include "osal_types.h"
22
23 #include "soc_diag_wdk.h"
24 #include "wlan_types_common.h"
25 #include "oal_netbuf_ext.h"
26
27 #include "common_dft_rom.h"
28
29 #ifdef __cplusplus
30 #if __cplusplus
31 extern "C" {
32 #endif
33 #endif
34
35 #undef THIS_FILE_ID
36 #define THIS_FILE_ID OAM_FILE_ID_OAL_MEM_HCM_H
37
38 /*****************************************************************************
39 2 宏定义
40 *****************************************************************************/
41
42 /* 对于enhanced类型的申请接口与释放接口, 每一个内存块都包含一个4字节的头部 用来指向内存块管理结构体oal_mem_struc */
43 /* 整个内存块的结构如下所示 */
44 /* +-------------------+------------------------------------------+---------+--------------------------------+ */
45 /* | oal_mem_stru addr | payload | dog tag | 4/8 byte | | 4 byte | */
46 /* +-------------------+------------------------------------------+---------+--------------------------------| */
47
48 #define OAL_HMAC_DOG_TAG 0x5b3a293e /* 狗牌,用于检测内存越界 */
49 #define OAL_SDIO_FLOWCTRL_MAX 114 /* ini可配sdio流控的最大值 */
50
51 #if defined(_PRE_WLAN_DFR_STAT) || defined(_PRE_WLAN_DFT_STAT)
52 #define WLAN_MEM_MAX_SUBPOOL_NUM 8 /* 内存池中出netbuf内存池外最大子内存池个数 */
53 #endif
54 #define HAL_NORMAL_RX_MAX_RX_OPT_BUFFS 128 /* 普通优先级描述符优化规格 */
55
56 #define oal_mem_alloc(_en_pool_id, _us_len, _uc_lock) \
57 oal_mem_alloc_etc(THIS_FILE_ID, __LINE__, _en_pool_id, _us_len, _uc_lock)
58 #define oal_mem_free(_p_data, _uc_lock) \
59 oal_mem_free_etc(THIS_FILE_ID, __LINE__, _p_data, _uc_lock)
60
61 /*****************************************************************************
62 枚举名 : oal_mem_pool_id_enum_uint8
63 协议表格:
64 枚举说明: HOST侧内存池ID
65 *****************************************************************************/
66 typedef enum {
67 OAL_MEM_POOL_ID_EVENT = 0, /* 事件内存池 */
68 OAL_MEM_POOL_ID_SHARED_DATA_PKT, /* 共享数据帧内存池 */
69 OAL_MEM_POOL_ID_SHARED_MGMT_PKT, /* 共享管理帧内存池 */
70 OAL_MEM_POOL_ID_LOCAL, /* 本地变量内存池 */
71 OAL_MEM_POOL_ID_MIB, /* MIB内存池 */
72 OAL_MEM_POOL_ID_SHARED_DSCR, /* 共享描述符内存池 */
73
74 OAL_MEM_POOL_ID_NETBUF, /* netbuf内存池 */
75 OAL_MEM_POOL_ID_RX_DSCR, /* 共享接收描述符内存池 */
76 OAL_MEM_POOL_ID_TX_DSCR, /* 共享发送描述符1内存池 */
77 OAL_MEM_POOL_ID_BUTT
78 } oal_mem_pool_id_enum;
79 typedef osal_u8 oal_mem_pool_id_enum_uint8;
80
81 #ifdef _PRE_WLAN_DFR_STAT
82 /*****************************************************************************
83 结构名 : oal_mem_stru
84 结构说明: 内存块结构体
85 *****************************************************************************/
86 struct oal_mem_stru_tag {
87 osal_u8 *data; /* 存放数据的指针 */
88 osal_u8 *origin_data; /* 记录数据的原始指针 */
89 osal_u16 len; /* 内存块的长度 */
90 osal_u8 user_cnt : 4; /* 申请本内存块的用户计数 */
91 oal_mem_state_enum_uint8 mem_state_flag : 4; /* 内存块状态 */
92 oal_mem_pool_id_enum_uint8 pool_id : 4; /* 本内存属于哪一个内存池 */
93 osal_u8 subpool_id : 4; /* 本内存是属于哪一级子内存池 */
94
95 osal_ulong return_addr; /* alloc内存的函数地址 新增 */
96 };
97 typedef struct oal_mem_stru_tag oal_mem_stru;
98
99 /*****************************************************************************
100 结构名 : oal_mem_subpool_stru
101 结构说明: 子内存池结构体
102 *****************************************************************************/
103 typedef struct {
104 osal_spinlock spinlock;
105 osal_u16 len; /* 本子内存池的内存块长度 */
106 osal_u16 free_cnt; /* 本子内存池可用内存块数 */
107
108 /* 记录oal_mem_stru可用内存索引表的栈顶元素,其内容为oal_mem_stru指针 */
109 void **ppst_free_stack;
110
111 osal_u16 total_cnt; /* 本子内存池内存块总数 */
112 osal_u8 auc_resv[2];
113 } oal_mem_subpool_stru;
114
115 /*****************************************************************************
116 结构名 : oal_mem_pool_stru
117 结构说明: 内存池结构体
118 *****************************************************************************/
119 typedef struct {
120 osal_u16 max_byte_len; /* 本内存池可分配内存块最大长度 */
121 osal_u8 subpool_cnt; /* 本内存池一共有多少子内存池 */
122 osal_u8 resv;
123 /* 子内存池索引表数组 */
124 oal_mem_subpool_stru subpool_table[WLAN_MEM_MAX_SUBPOOL_NUM];
125
126 osal_u16 mem_used_cnt; /* 本内存池已用内存块 */
127 osal_u16 mem_total_cnt; /* 本内存池一共有多少内存块 */
128 oal_mem_stru *mem_start_addr;
129 } oal_mem_pool_stru;
130 #endif
131
132 /*****************************************************************************
133 10 函数声明
134 *****************************************************************************/
135 osal_void *oal_mem_alloc_etc(osal_u32 file_id, osal_u32 line_num,
136 oal_mem_pool_id_enum_uint8 pool_id, osal_u16 len, osal_u8 lock);
137 osal_u32 oal_mem_free_etc(osal_u32 file_id, osal_u32 line_num, osal_void *data, osal_u8 lock);
138
139 oal_netbuf_stru* oal_netbuf_alloc_ext(td_u32 size);
140
141 oal_netbuf_stru *oal_mem_multi_netbuf_alloc(osal_u16 len);
142
143 osal_u8 *oal_netbuf_header_buf(const oal_netbuf_stru *netbuf);
144 const osal_u8 *oal_netbuf_header_buf_const(const oal_netbuf_stru *netbuf);
145 const osal_u8 *oal_netbuf_cb_buf_const(const oal_netbuf_stru *netbuf);
146 osal_u8 *oal_netbuf_cb_buf(oal_netbuf_stru *netbuf);
147
148 /*****************************************************************************
149 功能描述 : 获取skb数据头部(偏移mac头后的数据)
150 *****************************************************************************/
oal_netbuf_wifi_data(const oal_netbuf_stru * netbuf)151 static inline osal_u8 *oal_netbuf_wifi_data(const oal_netbuf_stru *netbuf)
152 {
153 osal_u8 *payload = oal_netbuf_payload(netbuf);
154 return (payload + OAL_HDR_TOTAL_LEN);
155 }
156
157 #ifdef __cplusplus
158 #if __cplusplus
159 }
160 #endif
161 #endif
162
163 #endif /* end of oal_mem_hcm.h */
164