xref: /OK3568_Linux_fs/external/rkwifibt/drivers/rtl8188fu/include/rtw_efuse.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 /******************************************************************************
2  *
3  * Copyright(c) 2007 - 2017 Realtek Corporation.
4  *
5  * This program is free software; you can redistribute it and/or modify it
6  * under the terms of version 2 of the GNU General Public License as
7  * published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12  * more details.
13  *
14  *****************************************************************************/
15 #ifndef __RTW_EFUSE_H__
16 #define __RTW_EFUSE_H__
17 
18 
19 #define	EFUSE_ERROE_HANDLE		1
20 
21 #define	PG_STATE_HEADER		0x01
22 #define	PG_STATE_WORD_0		0x02
23 #define	PG_STATE_WORD_1		0x04
24 #define	PG_STATE_WORD_2		0x08
25 #define	PG_STATE_WORD_3		0x10
26 #define	PG_STATE_DATA			0x20
27 
28 #define	PG_SWBYTE_H			0x01
29 #define	PG_SWBYTE_L			0x02
30 
31 #define	PGPKT_DATA_SIZE		8
32 
33 #define	EFUSE_WIFI				0
34 #define	EFUSE_BT				1
35 
36 enum _EFUSE_DEF_TYPE {
37 	TYPE_EFUSE_MAX_SECTION				= 0,
38 	TYPE_EFUSE_REAL_CONTENT_LEN			= 1,
39 	TYPE_AVAILABLE_EFUSE_BYTES_BANK		= 2,
40 	TYPE_AVAILABLE_EFUSE_BYTES_TOTAL	= 3,
41 	TYPE_EFUSE_MAP_LEN					= 4,
42 	TYPE_EFUSE_PROTECT_BYTES_BANK		= 5,
43 	TYPE_EFUSE_CONTENT_LEN_BANK			= 6,
44 };
45 
46 #define		EFUSE_MAX_MAP_LEN		1024
47 
48 #define		EFUSE_MAX_HW_SIZE		1024
49 #define		EFUSE_MAX_SECTION_BASE	16
50 #define		EFUSE_MAX_SECTION_NUM	128
51 #define		EFUSE_MAX_BANK_SIZE		512
52 
53 /*RTL8822B 8821C BT EFUSE Define 1 BANK 128 size logical map 1024*/
54 #ifdef RTW_HALMAC
55 #define BANK_NUM		1
56 #define EFUSE_BT_REAL_BANK_CONTENT_LEN	128
57 #define EFUSE_BT_REAL_CONTENT_LEN		(EFUSE_BT_REAL_BANK_CONTENT_LEN * BANK_NUM)
58 #define EFUSE_BT_MAP_LEN				1024	/* 1k bytes */
59 #define EFUSE_BT_MAX_SECTION			(EFUSE_BT_MAP_LEN / 8)
60 #ifdef CONFIG_RTL8822C
61 #define EFUSE_PROTECT_BYTES_BANK		54
62 #else
63 #define EFUSE_PROTECT_BYTES_BANK		16
64 #endif
65 #define AVAILABLE_EFUSE_ADDR(addr)	(addr < EFUSE_BT_REAL_CONTENT_LEN - EFUSE_PROTECT_BYTES_BANK)
66 #endif
67 
68 #define EXT_HEADER(header) ((header & 0x1F) == 0x0F)
69 #define ALL_WORDS_DISABLED(wde)	((wde & 0x0F) == 0x0F)
70 #define GET_HDR_OFFSET_2_0(header) ((header & 0xE0) >> 5)
71 
72 #define		EFUSE_REPEAT_THRESHOLD_			3
73 
74 #define IS_MASKED_MP(ic, txt, offset) (EFUSE_IsAddressMasked_MP_##ic##txt(offset))
75 #define IS_MASKED_TC(ic, txt, offset) (EFUSE_IsAddressMasked_TC_##ic##txt(offset))
76 #define GET_MASK_ARRAY_LEN_MP(ic, txt) (EFUSE_GetArrayLen_MP_##ic##txt())
77 #define GET_MASK_ARRAY_LEN_TC(ic, txt) (EFUSE_GetArrayLen_TC_##ic##txt())
78 #define GET_MASK_ARRAY_MP(ic, txt, offset) (EFUSE_GetMaskArray_MP_##ic##txt(offset))
79 #define GET_MASK_ARRAY_TC(ic, txt, offset) (EFUSE_GetMaskArray_TC_##ic##txt(offset))
80 
81 
82 #define IS_MASKED(ic, txt, offset) (IS_MASKED_MP(ic, txt, offset))
83 #define GET_MASK_ARRAY_LEN(ic, txt) (GET_MASK_ARRAY_LEN_MP(ic, txt))
84 #define GET_MASK_ARRAY(ic, txt, out) do { GET_MASK_ARRAY_MP(ic, txt, out); } while (0)
85 
86 #ifdef CONFIG_BT_EFUSE_MASK
87 #define IS_BT_MASKED_MP(ic, txt, offset) (EFUSE_IsBTAddressMasked_MP_##ic##txt(offset))
88 #define GET_BT_MASK_ARRAY_LEN_MP(ic, txt) (EFUSE_GetBTArrayLen_MP_##ic##txt())
89 #define GET_BT_MASK_ARRAY_LEN_TC(ic, txt) (EFUSE_GetBTArrayLen_TC_##ic##txt())
90 #define GET_BT_MASK_ARRAY_MP(ic, txt, offset) (EFUSE_GetBTMaskArray_MP_##ic##txt(offset))
91 
92 #define IS_BT_MASKED(ic, txt, offset) (IS_BT_MASKED_MP(ic,txt, offset))
93 #define GET_BT_MASK_ARRAY(ic, txt, out) do { GET_BT_MASK_ARRAY_MP(ic,txt, out); } while(0)
94 #define GET_BT_MASK_ARRAY_LEN(ic, txt) (GET_BT_MASK_ARRAY_LEN_MP(ic,txt))
95 #endif
96 
97 /* *********************************************
98  *	The following is for BT Efuse definition
99  * ********************************************* */
100 #define		EFUSE_BT_MAX_MAP_LEN		1024
101 #define		EFUSE_MAX_BANK			4
102 #define		EFUSE_MAX_BT_BANK		(EFUSE_MAX_BANK-1)
103 /* *********************************************
104  *--------------------------Define Parameters-------------------------------*/
105 #define		EFUSE_MAX_WORD_UNIT			4
106 
107 /*------------------------------Define structure----------------------------*/
108 typedef struct PG_PKT_STRUCT_A {
109 	u8 offset;
110 	u8 word_en;
111 	u8 data[8];
112 	u8 word_cnts;
113 } PGPKT_STRUCT, *PPGPKT_STRUCT;
114 
115 typedef enum {
116 	ERR_SUCCESS = 0,
117 	ERR_DRIVER_FAILURE,
118 	ERR_IO_FAILURE,
119 	ERR_WI_TIMEOUT,
120 	ERR_WI_BUSY,
121 	ERR_BAD_FORMAT,
122 	ERR_INVALID_DATA,
123 	ERR_NOT_ENOUGH_SPACE,
124 	ERR_WRITE_PROTECT,
125 	ERR_READ_BACK_FAIL,
126 	ERR_OUT_OF_RANGE
127 } ERROR_CODE;
128 
129 /*------------------------------Define structure----------------------------*/
130 typedef struct _EFUSE_HAL {
131 	u8	fakeEfuseBank;
132 	u32	fakeEfuseUsedBytes;
133 	u8	fakeEfuseContent[EFUSE_MAX_HW_SIZE];
134 	u8	fakeEfuseInitMap[EFUSE_MAX_MAP_LEN];
135 	u8	fakeEfuseModifiedMap[EFUSE_MAX_MAP_LEN];
136 	u32	EfuseUsedBytes;
137 	u8	EfuseUsedPercentage;
138 
139 	u16	BTEfuseUsedBytes;
140 	u8	BTEfuseUsedPercentage;
141 	u8	BTEfuseContent[EFUSE_MAX_BT_BANK][EFUSE_MAX_HW_SIZE];
142 	u8	BTEfuseInitMap[EFUSE_BT_MAX_MAP_LEN];
143 	u8	BTEfuseModifiedMap[EFUSE_BT_MAX_MAP_LEN];
144 
145 	u16	fakeBTEfuseUsedBytes;
146 	u8	fakeBTEfuseContent[EFUSE_MAX_BT_BANK][EFUSE_MAX_HW_SIZE];
147 	u8	fakeBTEfuseInitMap[EFUSE_BT_MAX_MAP_LEN];
148 	u8	fakeBTEfuseModifiedMap[EFUSE_BT_MAX_MAP_LEN];
149 
150 	/* EFUSE Configuration, initialized in HAL_CmnInitPGData(). */
151 	const u16  MaxSecNum_WiFi;
152 	const u16  MaxSecNum_BT;
153 	const u16  WordUnit;
154 	const u16  PhysicalLen_WiFi;
155 	const u16  PhysicalLen_BT;
156 	const u16  LogicalLen_WiFi;
157 	const u16  LogicalLen_BT;
158 	const u16  BankSize;
159 	const u16  TotalBankNum;
160 	const u16  BankNum_WiFi;
161 	const u16  BankNum_BT;
162 	const u16  OOBProtectBytes;
163 	const u16  ProtectBytes;
164 	const u16  BankAvailBytes;
165 	const u16  TotalAvailBytes_WiFi;
166 	const u16  TotalAvailBytes_BT;
167 	const u16  HeaderRetry;
168 	const u16  DataRetry;
169 
170 	ERROR_CODE	  Status;
171 
172 } EFUSE_HAL, *PEFUSE_HAL;
173 
174 extern u8 maskfileBuffer[64];
175 extern u8 btmaskfileBuffer[64];
176 
177 /*------------------------Export global variable----------------------------*/
178 extern u8 fakeEfuseBank;
179 extern u32 fakeEfuseUsedBytes;
180 extern u8 fakeEfuseContent[];
181 extern u8 fakeEfuseInitMap[];
182 extern u8 fakeEfuseModifiedMap[];
183 
184 extern u32 BTEfuseUsedBytes;
185 extern u8 BTEfuseContent[EFUSE_MAX_BT_BANK][EFUSE_MAX_HW_SIZE];
186 extern u8 BTEfuseInitMap[];
187 extern u8 BTEfuseModifiedMap[];
188 
189 extern u32 fakeBTEfuseUsedBytes;
190 extern u8 fakeBTEfuseContent[EFUSE_MAX_BT_BANK][EFUSE_MAX_HW_SIZE];
191 extern u8 fakeBTEfuseInitMap[];
192 extern u8 fakeBTEfuseModifiedMap[];
193 /*------------------------Export global variable----------------------------*/
194 #define		MAX_SEGMENT_SIZE			200
195 #define		MAX_SEGMENT_NUM			200
196 #define		MAX_BUF_SIZE				(MAX_SEGMENT_SIZE*MAX_SEGMENT_NUM)
197 #define		TMP_BUF_SIZE				100
198 #define		rtprintf					dcmd_Store_Return_Buf
199 
200 u8	efuse_bt_GetCurrentSize(PADAPTER padapter, u16 *size);
201 u16	efuse_bt_GetMaxSize(PADAPTER padapter);
202 u16 efuse_GetavailableSize(PADAPTER adapter);
203 
204 u8	efuse_GetCurrentSize(PADAPTER padapter, u16 *size);
205 u16	efuse_GetMaxSize(PADAPTER padapter);
206 u8	rtw_efuse_access(PADAPTER padapter, u8 bRead, u16 start_addr, u16 cnts, u8 *data);
207 u8	rtw_efuse_bt_access(PADAPTER adapter, u8 write, u16 addr, u16 cnts, u8 *data);
208 
209 u8	rtw_efuse_mask_map_read(PADAPTER padapter, u16 addr, u16 cnts, u8 *data);
210 u8	rtw_efuse_map_read(PADAPTER padapter, u16 addr, u16 cnts, u8 *data);
211 u8	rtw_efuse_map_write(PADAPTER padapter, u16 addr, u16 cnts, u8 *data);
212 u8	rtw_BT_efuse_map_read(PADAPTER padapter, u16 addr, u16 cnts, u8 *data);
213 u8	rtw_BT_efuse_map_write(PADAPTER padapter, u16 addr, u16 cnts, u8 *data);
214 #ifdef CONFIG_RTL8822C
215 void	rtw_pre_bt_efuse(PADAPTER padapter);
216 #endif
217 u16	Efuse_GetCurrentSize(PADAPTER pAdapter, u8 efuseType, BOOLEAN bPseudoTest);
218 u8	Efuse_CalculateWordCnts(u8 word_en);
219 void	ReadEFuseByte(PADAPTER Adapter, u16 _offset, u8 *pbuf, BOOLEAN bPseudoTest) ;
220 void	EFUSE_GetEfuseDefinition(PADAPTER pAdapter, u8 efuseType, u8 type, void *pOut, BOOLEAN bPseudoTest);
221 u8	efuse_OneByteRead(PADAPTER pAdapter, u16 addr, u8 *data, BOOLEAN	 bPseudoTest);
222 #define efuse_onebyte_read(adapter, addr, data, pseudo_test) efuse_OneByteRead((adapter), (addr), (data), (pseudo_test))
223 
224 u8	efuse_OneByteWrite(PADAPTER pAdapter, u16 addr, u8 data, BOOLEAN	 bPseudoTest);
225 
226 void	BTEfuse_PowerSwitch(PADAPTER pAdapter, u8	bWrite, u8	 PwrState);
227 void	Efuse_PowerSwitch(PADAPTER pAdapter, u8	bWrite, u8	 PwrState);
228 int	Efuse_PgPacketRead(PADAPTER pAdapter, u8 offset, u8 *data, BOOLEAN bPseudoTest);
229 int	Efuse_PgPacketWrite(PADAPTER pAdapter, u8 offset, u8 word_en, u8 *data, BOOLEAN bPseudoTest);
230 void	efuse_WordEnableDataRead(u8 word_en, u8 *sourdata, u8 *targetdata);
231 u8	Efuse_WordEnableDataWrite(PADAPTER pAdapter, u16 efuse_addr, u8 word_en, u8 *data, BOOLEAN bPseudoTest);
232 void	EFUSE_ShadowMapUpdate(PADAPTER pAdapter, u8 efuseType, BOOLEAN bPseudoTest);
233 void	EFUSE_ShadowRead(PADAPTER pAdapter, u8 Type, u16 Offset, u32 *Value);
234 #define efuse_logical_map_read(adapter, type, offset, value) EFUSE_ShadowRead((adapter), (type), (offset), (value))
235 
236 BOOLEAN rtw_file_efuse_IsMasked(PADAPTER pAdapter, u16 Offset, u8 *maskbuf);
237 BOOLEAN efuse_IsMasked(PADAPTER pAdapter, u16 Offset);
238 
239 void	hal_ReadEFuse_BT_logic_map(
240 	PADAPTER	padapter,
241 	u16			_offset,
242 	u16			_size_byte,
243 	u8			*pbuf
244 );
245 u8	EfusePgPacketWrite_BT(
246 	PADAPTER	pAdapter,
247 	u8			offset,
248 	u8			word_en,
249 	u8			*pData,
250 	u8			bPseudoTest);
251 
252 u16 rtw_get_bt_efuse_mask_arraylen(PADAPTER pAdapter);
253 void rtw_bt_efuse_mask_array(PADAPTER pAdapter, u8 *pArray);
254 u16 rtw_get_efuse_mask_arraylen(PADAPTER pAdapter);
255 void rtw_efuse_mask_array(PADAPTER pAdapter, u8 *pArray);
256 void rtw_efuse_analyze(PADAPTER	padapter, u8 Type, u8 Fake);
257 
258 #define MAC_HIDDEN_MAX_BW_NUM 8
259 extern const u8 _mac_hidden_max_bw_to_hal_bw_cap[];
260 #define mac_hidden_max_bw_to_hal_bw_cap(max_bw) (((max_bw) >= MAC_HIDDEN_MAX_BW_NUM) ? 0 : _mac_hidden_max_bw_to_hal_bw_cap[(max_bw)])
261 
262 #define MAC_HIDDEN_PROTOCOL_NUM 4
263 extern const u8 _mac_hidden_proto_to_hal_proto_cap[];
264 #define mac_hidden_proto_to_hal_proto_cap(proto) (((proto) >= MAC_HIDDEN_PROTOCOL_NUM) ? 0 : _mac_hidden_proto_to_hal_proto_cap[(proto)])
265 
266 u8 mac_hidden_wl_func_to_hal_wl_func(u8 func);
267 
268 #ifdef PLATFORM_LINUX
269 u8 rtw_efuse_file_read(PADAPTER padapter, u8 *filepath, u8 *buf, u32 len);
270 u8 rtw_efuse_file_store(PADAPTER padapter, u8 *filepath, u8 *buf, u32 len);
271 #ifdef CONFIG_EFUSE_CONFIG_FILE
272 u32 rtw_read_efuse_from_file(const char *path, u8 *buf, int map_size);
273 u32 rtw_read_macaddr_from_file(const char *path, u8 *buf);
274 #endif /* CONFIG_EFUSE_CONFIG_FILE */
275 #endif /* PLATFORM_LINUX */
276 
277 #endif
278