]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/contrib/dev/iwlwifi/iwl-eeprom-read.c
iwlwifi: update from iwlwifi-next
[FreeBSD/FreeBSD.git] / sys / contrib / dev / iwlwifi / iwl-eeprom-read.c
1 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
2 /*
3  * Copyright (C) 2005-2014, 2018-2019, 2021 Intel Corporation
4  */
5 #include <linux/types.h>
6 #include <linux/slab.h>
7 #include <linux/export.h>
8 #if defined(__FreeBSD__)
9 #include <linux/delay.h>
10 #endif
11
12 #include "iwl-drv.h"
13 #include "iwl-debug.h"
14 #include "iwl-eeprom-read.h"
15 #include "iwl-io.h"
16 #include "iwl-prph.h"
17 #include "iwl-csr.h"
18
19 /*
20  * EEPROM access time values:
21  *
22  * Driver initiates EEPROM read by writing byte address << 1 to CSR_EEPROM_REG.
23  * Driver then polls CSR_EEPROM_REG for CSR_EEPROM_REG_READ_VALID_MSK (0x1).
24  * When polling, wait 10 uSec between polling loops, up to a maximum 5000 uSec.
25  * Driver reads 16-bit value from bits 31-16 of CSR_EEPROM_REG.
26  */
27 #define IWL_EEPROM_ACCESS_TIMEOUT       5000 /* uSec */
28
29 /*
30  * The device's EEPROM semaphore prevents conflicts between driver and uCode
31  * when accessing the EEPROM; each access is a series of pulses to/from the
32  * EEPROM chip, not a single event, so even reads could conflict if they
33  * weren't arbitrated by the semaphore.
34  */
35 #define IWL_EEPROM_SEM_TIMEOUT          10   /* microseconds */
36 #define IWL_EEPROM_SEM_RETRY_LIMIT      1000 /* number of attempts (not time) */
37
38
39 static int iwl_eeprom_acquire_semaphore(struct iwl_trans *trans)
40 {
41         u16 count;
42         int ret;
43
44         for (count = 0; count < IWL_EEPROM_SEM_RETRY_LIMIT; count++) {
45                 /* Request semaphore */
46                 iwl_set_bit(trans, CSR_HW_IF_CONFIG_REG,
47                             CSR_HW_IF_CONFIG_REG_BIT_EEPROM_OWN_SEM);
48
49                 /* See if we got it */
50                 ret = iwl_poll_bit(trans, CSR_HW_IF_CONFIG_REG,
51                                 CSR_HW_IF_CONFIG_REG_BIT_EEPROM_OWN_SEM,
52                                 CSR_HW_IF_CONFIG_REG_BIT_EEPROM_OWN_SEM,
53                                 IWL_EEPROM_SEM_TIMEOUT);
54                 if (ret >= 0) {
55                         IWL_DEBUG_EEPROM(trans->dev,
56                                          "Acquired semaphore after %d tries.\n",
57                                          count+1);
58                         return ret;
59                 }
60         }
61
62         return ret;
63 }
64
65 static void iwl_eeprom_release_semaphore(struct iwl_trans *trans)
66 {
67         iwl_clear_bit(trans, CSR_HW_IF_CONFIG_REG,
68                       CSR_HW_IF_CONFIG_REG_BIT_EEPROM_OWN_SEM);
69 }
70
71 static int iwl_eeprom_verify_signature(struct iwl_trans *trans, bool nvm_is_otp)
72 {
73         u32 gp = iwl_read32(trans, CSR_EEPROM_GP) & CSR_EEPROM_GP_VALID_MSK;
74
75         IWL_DEBUG_EEPROM(trans->dev, "EEPROM signature=0x%08x\n", gp);
76
77         switch (gp) {
78         case CSR_EEPROM_GP_BAD_SIG_EEP_GOOD_SIG_OTP:
79                 if (!nvm_is_otp) {
80                         IWL_ERR(trans, "EEPROM with bad signature: 0x%08x\n",
81                                 gp);
82                         return -ENOENT;
83                 }
84                 return 0;
85         case CSR_EEPROM_GP_GOOD_SIG_EEP_LESS_THAN_4K:
86         case CSR_EEPROM_GP_GOOD_SIG_EEP_MORE_THAN_4K:
87                 if (nvm_is_otp) {
88                         IWL_ERR(trans, "OTP with bad signature: 0x%08x\n", gp);
89                         return -ENOENT;
90                 }
91                 return 0;
92         case CSR_EEPROM_GP_BAD_SIGNATURE_BOTH_EEP_AND_OTP:
93         default:
94                 IWL_ERR(trans,
95                         "bad EEPROM/OTP signature, type=%s, EEPROM_GP=0x%08x\n",
96                         nvm_is_otp ? "OTP" : "EEPROM", gp);
97                 return -ENOENT;
98         }
99 }
100
101 /******************************************************************************
102  *
103  * OTP related functions
104  *
105 ******************************************************************************/
106
107 static void iwl_set_otp_access_absolute(struct iwl_trans *trans)
108 {
109         iwl_read32(trans, CSR_OTP_GP_REG);
110
111         iwl_clear_bit(trans, CSR_OTP_GP_REG,
112                       CSR_OTP_GP_REG_OTP_ACCESS_MODE);
113 }
114
115 static int iwl_nvm_is_otp(struct iwl_trans *trans)
116 {
117         u32 otpgp;
118
119         /* OTP only valid for CP/PP and after */
120         switch (trans->hw_rev & CSR_HW_REV_TYPE_MSK) {
121         case CSR_HW_REV_TYPE_NONE:
122                 IWL_ERR(trans, "Unknown hardware type\n");
123                 return -EIO;
124         case CSR_HW_REV_TYPE_5300:
125         case CSR_HW_REV_TYPE_5350:
126         case CSR_HW_REV_TYPE_5100:
127         case CSR_HW_REV_TYPE_5150:
128                 return 0;
129         default:
130                 otpgp = iwl_read32(trans, CSR_OTP_GP_REG);
131                 if (otpgp & CSR_OTP_GP_REG_DEVICE_SELECT)
132                         return 1;
133                 return 0;
134         }
135 }
136
137 static int iwl_init_otp_access(struct iwl_trans *trans)
138 {
139         int ret;
140
141         ret = iwl_finish_nic_init(trans);
142         if (ret)
143                 return ret;
144
145         iwl_set_bits_prph(trans, APMG_PS_CTRL_REG,
146                           APMG_PS_CTRL_VAL_RESET_REQ);
147         udelay(5);
148         iwl_clear_bits_prph(trans, APMG_PS_CTRL_REG,
149                             APMG_PS_CTRL_VAL_RESET_REQ);
150
151         /*
152          * CSR auto clock gate disable bit -
153          * this is only applicable for HW with OTP shadow RAM
154          */
155         if (trans->trans_cfg->base_params->shadow_ram_support)
156                 iwl_set_bit(trans, CSR_DBG_LINK_PWR_MGMT_REG,
157                             CSR_RESET_LINK_PWR_MGMT_DISABLED);
158
159         return 0;
160 }
161
162 static int iwl_read_otp_word(struct iwl_trans *trans, u16 addr,
163                              __le16 *eeprom_data)
164 {
165         int ret = 0;
166         u32 r;
167         u32 otpgp;
168
169         iwl_write32(trans, CSR_EEPROM_REG,
170                     CSR_EEPROM_REG_MSK_ADDR & (addr << 1));
171         ret = iwl_poll_bit(trans, CSR_EEPROM_REG,
172                                  CSR_EEPROM_REG_READ_VALID_MSK,
173                                  CSR_EEPROM_REG_READ_VALID_MSK,
174                                  IWL_EEPROM_ACCESS_TIMEOUT);
175         if (ret < 0) {
176                 IWL_ERR(trans, "Time out reading OTP[%d]\n", addr);
177                 return ret;
178         }
179         r = iwl_read32(trans, CSR_EEPROM_REG);
180         /* check for ECC errors: */
181         otpgp = iwl_read32(trans, CSR_OTP_GP_REG);
182         if (otpgp & CSR_OTP_GP_REG_ECC_UNCORR_STATUS_MSK) {
183                 /* stop in this case */
184                 /* set the uncorrectable OTP ECC bit for acknowledgment */
185                 iwl_set_bit(trans, CSR_OTP_GP_REG,
186                             CSR_OTP_GP_REG_ECC_UNCORR_STATUS_MSK);
187                 IWL_ERR(trans, "Uncorrectable OTP ECC error, abort OTP read\n");
188                 return -EINVAL;
189         }
190         if (otpgp & CSR_OTP_GP_REG_ECC_CORR_STATUS_MSK) {
191                 /* continue in this case */
192                 /* set the correctable OTP ECC bit for acknowledgment */
193                 iwl_set_bit(trans, CSR_OTP_GP_REG,
194                             CSR_OTP_GP_REG_ECC_CORR_STATUS_MSK);
195                 IWL_ERR(trans, "Correctable OTP ECC error, continue read\n");
196         }
197         *eeprom_data = cpu_to_le16(r >> 16);
198         return 0;
199 }
200
201 /*
202  * iwl_is_otp_empty: check for empty OTP
203  */
204 static bool iwl_is_otp_empty(struct iwl_trans *trans)
205 {
206         u16 next_link_addr = 0;
207         __le16 link_value;
208         bool is_empty = false;
209
210         /* locate the beginning of OTP link list */
211         if (!iwl_read_otp_word(trans, next_link_addr, &link_value)) {
212                 if (!link_value) {
213                         IWL_ERR(trans, "OTP is empty\n");
214                         is_empty = true;
215                 }
216         } else {
217                 IWL_ERR(trans, "Unable to read first block of OTP list.\n");
218                 is_empty = true;
219         }
220
221         return is_empty;
222 }
223
224
225 /*
226  * iwl_find_otp_image: find EEPROM image in OTP
227  *   finding the OTP block that contains the EEPROM image.
228  *   the last valid block on the link list (the block _before_ the last block)
229  *   is the block we should read and used to configure the device.
230  *   If all the available OTP blocks are full, the last block will be the block
231  *   we should read and used to configure the device.
232  *   only perform this operation if shadow RAM is disabled
233  */
234 static int iwl_find_otp_image(struct iwl_trans *trans,
235                                         u16 *validblockaddr)
236 {
237         u16 next_link_addr = 0, valid_addr;
238         __le16 link_value = 0;
239         int usedblocks = 0;
240
241         /* set addressing mode to absolute to traverse the link list */
242         iwl_set_otp_access_absolute(trans);
243
244         /* checking for empty OTP or error */
245         if (iwl_is_otp_empty(trans))
246                 return -EINVAL;
247
248         /*
249          * start traverse link list
250          * until reach the max number of OTP blocks
251          * different devices have different number of OTP blocks
252          */
253         do {
254                 /* save current valid block address
255                  * check for more block on the link list
256                  */
257                 valid_addr = next_link_addr;
258                 next_link_addr = le16_to_cpu(link_value) * sizeof(u16);
259                 IWL_DEBUG_EEPROM(trans->dev, "OTP blocks %d addr 0x%x\n",
260                                  usedblocks, next_link_addr);
261                 if (iwl_read_otp_word(trans, next_link_addr, &link_value))
262                         return -EINVAL;
263                 if (!link_value) {
264                         /*
265                          * reach the end of link list, return success and
266                          * set address point to the starting address
267                          * of the image
268                          */
269                         *validblockaddr = valid_addr;
270                         /* skip first 2 bytes (link list pointer) */
271                         *validblockaddr += 2;
272                         return 0;
273                 }
274                 /* more in the link list, continue */
275                 usedblocks++;
276         } while (usedblocks <= trans->trans_cfg->base_params->max_ll_items);
277
278         /* OTP has no valid blocks */
279         IWL_DEBUG_EEPROM(trans->dev, "OTP has no valid blocks\n");
280         return -EINVAL;
281 }
282
283 /*
284  * iwl_read_eeprom - read EEPROM contents
285  *
286  * Load the EEPROM contents from adapter and return it
287  * and its size.
288  *
289  * NOTE:  This routine uses the non-debug IO access functions.
290  */
291 int iwl_read_eeprom(struct iwl_trans *trans, u8 **eeprom, size_t *eeprom_size)
292 {
293         __le16 *e;
294         u32 gp = iwl_read32(trans, CSR_EEPROM_GP);
295         int sz;
296         int ret;
297         u16 addr;
298         u16 validblockaddr = 0;
299         u16 cache_addr = 0;
300         int nvm_is_otp;
301
302         if (!eeprom || !eeprom_size)
303                 return -EINVAL;
304
305         nvm_is_otp = iwl_nvm_is_otp(trans);
306         if (nvm_is_otp < 0)
307                 return nvm_is_otp;
308
309         sz = trans->trans_cfg->base_params->eeprom_size;
310         IWL_DEBUG_EEPROM(trans->dev, "NVM size = %d\n", sz);
311
312         e = kmalloc(sz, GFP_KERNEL);
313         if (!e)
314                 return -ENOMEM;
315
316         ret = iwl_eeprom_verify_signature(trans, nvm_is_otp);
317         if (ret < 0) {
318                 IWL_ERR(trans, "EEPROM not found, EEPROM_GP=0x%08x\n", gp);
319                 goto err_free;
320         }
321
322         /* Make sure driver (instead of uCode) is allowed to read EEPROM */
323         ret = iwl_eeprom_acquire_semaphore(trans);
324         if (ret < 0) {
325                 IWL_ERR(trans, "Failed to acquire EEPROM semaphore.\n");
326                 goto err_free;
327         }
328
329         if (nvm_is_otp) {
330                 ret = iwl_init_otp_access(trans);
331                 if (ret) {
332                         IWL_ERR(trans, "Failed to initialize OTP access.\n");
333                         goto err_unlock;
334                 }
335
336                 iwl_write32(trans, CSR_EEPROM_GP,
337                             iwl_read32(trans, CSR_EEPROM_GP) &
338                             ~CSR_EEPROM_GP_IF_OWNER_MSK);
339
340                 iwl_set_bit(trans, CSR_OTP_GP_REG,
341                             CSR_OTP_GP_REG_ECC_CORR_STATUS_MSK |
342                             CSR_OTP_GP_REG_ECC_UNCORR_STATUS_MSK);
343                 /* traversing the linked list if no shadow ram supported */
344                 if (!trans->trans_cfg->base_params->shadow_ram_support) {
345                         ret = iwl_find_otp_image(trans, &validblockaddr);
346                         if (ret)
347                                 goto err_unlock;
348                 }
349                 for (addr = validblockaddr; addr < validblockaddr + sz;
350                      addr += sizeof(u16)) {
351                         __le16 eeprom_data;
352
353                         ret = iwl_read_otp_word(trans, addr, &eeprom_data);
354                         if (ret)
355                                 goto err_unlock;
356                         e[cache_addr / 2] = eeprom_data;
357                         cache_addr += sizeof(u16);
358                 }
359         } else {
360                 /* eeprom is an array of 16bit values */
361                 for (addr = 0; addr < sz; addr += sizeof(u16)) {
362                         u32 r;
363
364                         iwl_write32(trans, CSR_EEPROM_REG,
365                                     CSR_EEPROM_REG_MSK_ADDR & (addr << 1));
366
367                         ret = iwl_poll_bit(trans, CSR_EEPROM_REG,
368                                            CSR_EEPROM_REG_READ_VALID_MSK,
369                                            CSR_EEPROM_REG_READ_VALID_MSK,
370                                            IWL_EEPROM_ACCESS_TIMEOUT);
371                         if (ret < 0) {
372                                 IWL_ERR(trans,
373                                         "Time out reading EEPROM[%d]\n", addr);
374                                 goto err_unlock;
375                         }
376                         r = iwl_read32(trans, CSR_EEPROM_REG);
377                         e[addr / 2] = cpu_to_le16(r >> 16);
378                 }
379         }
380
381         IWL_DEBUG_EEPROM(trans->dev, "NVM Type: %s\n",
382                          nvm_is_otp ? "OTP" : "EEPROM");
383
384         iwl_eeprom_release_semaphore(trans);
385
386         *eeprom_size = sz;
387         *eeprom = (u8 *)e;
388         return 0;
389
390  err_unlock:
391         iwl_eeprom_release_semaphore(trans);
392  err_free:
393         kfree(e);
394
395         return ret;
396 }
397 IWL_EXPORT_SYMBOL(iwl_read_eeprom);