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