d29a71595dc3027c8937fed6db83b57ed2c7b123
[oweals/u-boot.git] / drivers / mtd / st_smi.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * (C) Copyright 2009
4  * Vipin Kumar, ST Microelectronics, vipin.kumar@st.com.
5  */
6
7 #include <common.h>
8 #include <flash.h>
9 #include <linux/err.h>
10 #include <linux/mtd/st_smi.h>
11
12 #include <asm/io.h>
13 #include <asm/arch/hardware.h>
14
15 #if defined(CONFIG_MTD_NOR_FLASH)
16
17 static struct smi_regs *const smicntl =
18     (struct smi_regs * const)CONFIG_SYS_SMI_BASE;
19 static ulong bank_base[CONFIG_SYS_MAX_FLASH_BANKS] =
20     CONFIG_SYS_FLASH_ADDR_BASE;
21 flash_info_t flash_info[CONFIG_SYS_MAX_FLASH_BANKS];
22
23 /* data structure to maintain flash ids from different vendors */
24 struct flash_device {
25         char *name;
26         u8 erase_cmd;
27         u32 device_id;
28         u32 pagesize;
29         unsigned long sectorsize;
30         unsigned long size_in_bytes;
31 };
32
33 #define FLASH_ID(n, es, id, psize, ssize, size) \
34 {                               \
35         .name = n,              \
36         .erase_cmd = es,        \
37         .device_id = id,        \
38         .pagesize = psize,      \
39         .sectorsize = ssize,    \
40         .size_in_bytes = size   \
41 }
42
43 /*
44  * List of supported flash devices.
45  * Currently the erase_cmd field is not used in this driver.
46  */
47 static struct flash_device flash_devices[] = {
48         FLASH_ID("st m25p16"     , 0xd8, 0x00152020, 0x100, 0x10000, 0x200000),
49         FLASH_ID("st m25p32"     , 0xd8, 0x00162020, 0x100, 0x10000, 0x400000),
50         FLASH_ID("st m25p64"     , 0xd8, 0x00172020, 0x100, 0x10000, 0x800000),
51         FLASH_ID("st m25p128"    , 0xd8, 0x00182020, 0x100, 0x40000, 0x1000000),
52         FLASH_ID("st m25p05"     , 0xd8, 0x00102020, 0x80 , 0x8000 , 0x10000),
53         FLASH_ID("st m25p10"     , 0xd8, 0x00112020, 0x80 , 0x8000 , 0x20000),
54         FLASH_ID("st m25p20"     , 0xd8, 0x00122020, 0x100, 0x10000, 0x40000),
55         FLASH_ID("st m25p40"     , 0xd8, 0x00132020, 0x100, 0x10000, 0x80000),
56         FLASH_ID("st m25p80"     , 0xd8, 0x00142020, 0x100, 0x10000, 0x100000),
57         FLASH_ID("st m45pe10"    , 0xd8, 0x00114020, 0x100, 0x10000, 0x20000),
58         FLASH_ID("st m45pe20"    , 0xd8, 0x00124020, 0x100, 0x10000, 0x40000),
59         FLASH_ID("st m45pe40"    , 0xd8, 0x00134020, 0x100, 0x10000, 0x80000),
60         FLASH_ID("st m45pe80"    , 0xd8, 0x00144020, 0x100, 0x10000, 0x100000),
61         FLASH_ID("sp s25fl004"   , 0xd8, 0x00120201, 0x100, 0x10000, 0x80000),
62         FLASH_ID("sp s25fl008"   , 0xd8, 0x00130201, 0x100, 0x10000, 0x100000),
63         FLASH_ID("sp s25fl016"   , 0xd8, 0x00140201, 0x100, 0x10000, 0x200000),
64         FLASH_ID("sp s25fl032"   , 0xd8, 0x00150201, 0x100, 0x10000, 0x400000),
65         FLASH_ID("sp s25fl064"   , 0xd8, 0x00160201, 0x100, 0x10000, 0x800000),
66         FLASH_ID("mac 25l512"    , 0xd8, 0x001020C2, 0x010, 0x10000, 0x10000),
67         FLASH_ID("mac 25l1005"   , 0xd8, 0x001120C2, 0x010, 0x10000, 0x20000),
68         FLASH_ID("mac 25l2005"   , 0xd8, 0x001220C2, 0x010, 0x10000, 0x40000),
69         FLASH_ID("mac 25l4005"   , 0xd8, 0x001320C2, 0x010, 0x10000, 0x80000),
70         FLASH_ID("mac 25l4005a"  , 0xd8, 0x001320C2, 0x010, 0x10000, 0x80000),
71         FLASH_ID("mac 25l8005"   , 0xd8, 0x001420C2, 0x010, 0x10000, 0x100000),
72         FLASH_ID("mac 25l1605"   , 0xd8, 0x001520C2, 0x100, 0x10000, 0x200000),
73         FLASH_ID("mac 25l1605a"  , 0xd8, 0x001520C2, 0x010, 0x10000, 0x200000),
74         FLASH_ID("mac 25l3205"   , 0xd8, 0x001620C2, 0x100, 0x10000, 0x400000),
75         FLASH_ID("mac 25l3205a"  , 0xd8, 0x001620C2, 0x100, 0x10000, 0x400000),
76         FLASH_ID("mac 25l6405"   , 0xd8, 0x001720C2, 0x100, 0x10000, 0x800000),
77         FLASH_ID("wbd w25q128" , 0xd8, 0x001840EF, 0x100, 0x10000, 0x1000000),
78 };
79
80 /*
81  * smi_wait_xfer_finish - Wait until TFF is set in status register
82  * @timeout:     timeout in milliseconds
83  *
84  * Wait until TFF is set in status register
85  */
86 static int smi_wait_xfer_finish(int timeout)
87 {
88         ulong start = get_timer(0);
89
90         while (get_timer(start) < timeout) {
91                 if (readl(&smicntl->smi_sr) & TFF)
92                         return 0;
93
94                 /* Try after 10 ms */
95                 udelay(10);
96         };
97
98         return -1;
99 }
100
101 /*
102  * smi_read_id - Read flash id
103  * @info:        flash_info structure pointer
104  * @banknum:     bank number
105  *
106  * Read the flash id present at bank #banknum
107  */
108 static unsigned int smi_read_id(flash_info_t *info, int banknum)
109 {
110         unsigned int value;
111
112         writel(readl(&smicntl->smi_cr1) | SW_MODE, &smicntl->smi_cr1);
113         writel(READ_ID, &smicntl->smi_tr);
114         writel((banknum << BANKSEL_SHIFT) | SEND | TX_LEN_1 | RX_LEN_3,
115                &smicntl->smi_cr2);
116
117         if (smi_wait_xfer_finish(XFER_FINISH_TOUT))
118                 return -EIO;
119
120         value = (readl(&smicntl->smi_rr) & 0x00FFFFFF);
121
122         writel(readl(&smicntl->smi_sr) & ~TFF, &smicntl->smi_sr);
123         writel(readl(&smicntl->smi_cr1) & ~SW_MODE, &smicntl->smi_cr1);
124
125         return value;
126 }
127
128 /*
129  * flash_get_size - Detect the SMI flash by reading the ID.
130  * @base:        Base address of the flash area bank #banknum
131  * @banknum:     Bank number
132  *
133  * Detect the SMI flash by reading the ID. Initializes the flash_info structure
134  * with size, sector count etc.
135  */
136 static ulong flash_get_size(ulong base, int banknum)
137 {
138         flash_info_t *info = &flash_info[banknum];
139         int value;
140         int i;
141
142         value = smi_read_id(info, banknum);
143
144         if (value < 0) {
145                 printf("Flash id could not be read\n");
146                 return 0;
147         }
148
149         /* Matches chip-id to entire list of 'serial-nor flash' ids */
150         for (i = 0; i < ARRAY_SIZE(flash_devices); i++) {
151                 if (flash_devices[i].device_id == value) {
152                         info->size = flash_devices[i].size_in_bytes;
153                         info->flash_id = value;
154                         info->start[0] = base;
155                         info->sector_count =
156                                         info->size/flash_devices[i].sectorsize;
157
158                         return info->size;
159                 }
160         }
161
162         return 0;
163 }
164
165 /*
166  * smi_read_sr - Read status register of SMI
167  * @bank:        bank number
168  *
169  * This routine will get the status register of the flash chip present at the
170  * given bank
171  */
172 static int smi_read_sr(int bank)
173 {
174         u32 ctrlreg1, val;
175
176         /* store the CTRL REG1 state */
177         ctrlreg1 = readl(&smicntl->smi_cr1);
178
179         /* Program SMI in HW Mode */
180         writel(readl(&smicntl->smi_cr1) & ~(SW_MODE | WB_MODE),
181                &smicntl->smi_cr1);
182
183         /* Performing a RSR instruction in HW mode */
184         writel((bank << BANKSEL_SHIFT) | RD_STATUS_REG, &smicntl->smi_cr2);
185
186         if (smi_wait_xfer_finish(XFER_FINISH_TOUT))
187                 return -1;
188
189         val = readl(&smicntl->smi_sr);
190
191         /* Restore the CTRL REG1 state */
192         writel(ctrlreg1, &smicntl->smi_cr1);
193
194         return val;
195 }
196
197 /*
198  * smi_wait_till_ready - Wait till last operation is over.
199  * @bank:        bank number shifted.
200  * @timeout:     timeout in milliseconds.
201  *
202  * This routine checks for WIP(write in progress)bit in Status register(SMSR-b0)
203  * The routine checks for #timeout loops, each at interval of 1 milli-second.
204  * If successful the routine returns 0.
205  */
206 static int smi_wait_till_ready(int bank, int timeout)
207 {
208         int sr;
209         ulong start = get_timer(0);
210
211         /* One chip guarantees max 5 msec wait here after page writes,
212            but potentially three seconds (!) after page erase. */
213         while (get_timer(start) < timeout) {
214                 sr = smi_read_sr(bank);
215                 if ((sr >= 0) && (!(sr & WIP_BIT)))
216                         return 0;
217
218                 /* Try again after 10 usec */
219                 udelay(10);
220         } while (timeout--);
221
222         printf("SMI controller is still in wait, timeout=%d\n", timeout);
223         return -EIO;
224 }
225
226 /*
227  * smi_write_enable - Enable the flash to do write operation
228  * @bank:        bank number
229  *
230  * Set write enable latch with Write Enable command.
231  * Returns negative if error occurred.
232  */
233 static int smi_write_enable(int bank)
234 {
235         u32 ctrlreg1;
236         u32 start;
237         int timeout = WMODE_TOUT;
238         int sr;
239
240         /* Store the CTRL REG1 state */
241         ctrlreg1 = readl(&smicntl->smi_cr1);
242
243         /* Program SMI in H/W Mode */
244         writel(readl(&smicntl->smi_cr1) & ~SW_MODE, &smicntl->smi_cr1);
245
246         /* Give the Flash, Write Enable command */
247         writel((bank << BANKSEL_SHIFT) | WE, &smicntl->smi_cr2);
248
249         if (smi_wait_xfer_finish(XFER_FINISH_TOUT))
250                 return -1;
251
252         /* Restore the CTRL REG1 state */
253         writel(ctrlreg1, &smicntl->smi_cr1);
254
255         start = get_timer(0);
256         while (get_timer(start) < timeout) {
257                 sr = smi_read_sr(bank);
258                 if ((sr >= 0) && (sr & (1 << (bank + WM_SHIFT))))
259                         return 0;
260
261                 /* Try again after 10 usec */
262                 udelay(10);
263         };
264
265         return -1;
266 }
267
268 /*
269  * smi_init - SMI initialization routine
270  *
271  * SMI initialization routine. Sets SMI control register1.
272  */
273 void smi_init(void)
274 {
275         /* Setting the fast mode values. SMI working at 166/4 = 41.5 MHz */
276         writel(HOLD1 | FAST_MODE | BANK_EN | DSEL_TIME | PRESCAL4,
277                &smicntl->smi_cr1);
278 }
279
280 /*
281  * smi_sector_erase - Erase flash sector
282  * @info:        flash_info structure pointer
283  * @sector:      sector number
284  *
285  * Set write enable latch with Write Enable command.
286  * Returns negative if error occurred.
287  */
288 static int smi_sector_erase(flash_info_t *info, unsigned int sector)
289 {
290         int bank;
291         unsigned int sect_add;
292         unsigned int instruction;
293
294         switch (info->start[0]) {
295         case SMIBANK0_BASE:
296                 bank = BANK0;
297                 break;
298         case SMIBANK1_BASE:
299                 bank = BANK1;
300                 break;
301         case SMIBANK2_BASE:
302                 bank = BANK2;
303                 break;
304         case SMIBANK3_BASE:
305                 bank = BANK3;
306                 break;
307         default:
308                 return -1;
309         }
310
311         sect_add = sector * (info->size / info->sector_count);
312         instruction = ((sect_add >> 8) & 0x0000FF00) | SECTOR_ERASE;
313
314         writel(readl(&smicntl->smi_sr) & ~(ERF1 | ERF2), &smicntl->smi_sr);
315
316         /* Wait until finished previous write command. */
317         if (smi_wait_till_ready(bank, CONFIG_SYS_FLASH_ERASE_TOUT))
318                 return -EBUSY;
319
320         /* Send write enable, before erase commands. */
321         if (smi_write_enable(bank))
322                 return -EIO;
323
324         /* Put SMI in SW mode */
325         writel(readl(&smicntl->smi_cr1) | SW_MODE, &smicntl->smi_cr1);
326
327         /* Send Sector Erase command in SW Mode */
328         writel(instruction, &smicntl->smi_tr);
329         writel((bank << BANKSEL_SHIFT) | SEND | TX_LEN_4,
330                        &smicntl->smi_cr2);
331         if (smi_wait_xfer_finish(XFER_FINISH_TOUT))
332                 return -EIO;
333
334         if (smi_wait_till_ready(bank, CONFIG_SYS_FLASH_ERASE_TOUT))
335                 return -EBUSY;
336
337         /* Put SMI in HW mode */
338         writel(readl(&smicntl->smi_cr1) & ~SW_MODE,
339                        &smicntl->smi_cr1);
340
341         return 0;
342 }
343
344 /*
345  * smi_write - Write to SMI flash
346  * @src_addr:    source buffer
347  * @dst_addr:    destination buffer
348  * @length:      length to write in bytes
349  * @bank:        bank base address
350  *
351  * Write to SMI flash
352  */
353 static int smi_write(unsigned int *src_addr, unsigned int *dst_addr,
354                      unsigned int length, ulong bank_addr)
355 {
356         u8 *src_addr8 = (u8 *)src_addr;
357         u8 *dst_addr8 = (u8 *)dst_addr;
358         int banknum;
359         int i;
360
361         switch (bank_addr) {
362         case SMIBANK0_BASE:
363                 banknum = BANK0;
364                 break;
365         case SMIBANK1_BASE:
366                 banknum = BANK1;
367                 break;
368         case SMIBANK2_BASE:
369                 banknum = BANK2;
370                 break;
371         case SMIBANK3_BASE:
372                 banknum = BANK3;
373                 break;
374         default:
375                 return -1;
376         }
377
378         if (smi_wait_till_ready(banknum, CONFIG_SYS_FLASH_WRITE_TOUT))
379                 return -EBUSY;
380
381         /* Set SMI in Hardware Mode */
382         writel(readl(&smicntl->smi_cr1) & ~SW_MODE, &smicntl->smi_cr1);
383
384         if (smi_write_enable(banknum))
385                 return -EIO;
386
387         /* Perform the write command */
388         for (i = 0; i < length; i += 4) {
389                 if (((ulong) (dst_addr) % SFLASH_PAGE_SIZE) == 0) {
390                         if (smi_wait_till_ready(banknum,
391                                                 CONFIG_SYS_FLASH_WRITE_TOUT))
392                                 return -EBUSY;
393
394                         if (smi_write_enable(banknum))
395                                 return -EIO;
396                 }
397
398                 if (length < 4) {
399                         int k;
400
401                         /*
402                          * Handle special case, where length < 4 (redundant env)
403                          */
404                         for (k = 0; k < length; k++)
405                                 *dst_addr8++ = *src_addr8++;
406                 } else {
407                         /* Normal 32bit write */
408                         *dst_addr++ = *src_addr++;
409                 }
410
411                 if ((readl(&smicntl->smi_sr) & (ERF1 | ERF2)))
412                         return -EIO;
413         }
414
415         if (smi_wait_till_ready(banknum, CONFIG_SYS_FLASH_WRITE_TOUT))
416                 return -EBUSY;
417
418         writel(readl(&smicntl->smi_sr) & ~(WCF), &smicntl->smi_sr);
419
420         return 0;
421 }
422
423 /*
424  * write_buff - Write to SMI flash
425  * @info:        flash info structure
426  * @src:         source buffer
427  * @dest_addr:   destination buffer
428  * @length:      length to write in words
429  *
430  * Write to SMI flash
431  */
432 int write_buff(flash_info_t *info, uchar *src, ulong dest_addr, ulong length)
433 {
434         return smi_write((unsigned int *)src, (unsigned int *)dest_addr,
435                          length, info->start[0]);
436 }
437
438 /*
439  * flash_init - SMI flash initialization
440  *
441  * SMI flash initialization
442  */
443 unsigned long flash_init(void)
444 {
445         unsigned long size = 0;
446         int i, j;
447
448         smi_init();
449
450         for (i = 0; i < CONFIG_SYS_MAX_FLASH_BANKS; i++) {
451                 flash_info[i].flash_id = FLASH_UNKNOWN;
452                 size += flash_info[i].size = flash_get_size(bank_base[i], i);
453         }
454
455         for (j = 0; j < CONFIG_SYS_MAX_FLASH_BANKS; j++) {
456                 for (i = 1; i < flash_info[j].sector_count; i++)
457                         flash_info[j].start[i] =
458                             flash_info[j].start[i - 1] +
459                             flash_info->size / flash_info->sector_count;
460
461         }
462
463         return size;
464 }
465
466 /*
467  * flash_print_info - Print SMI flash information
468  *
469  * Print SMI flash information
470  */
471 void flash_print_info(flash_info_t *info)
472 {
473         int i;
474         if (info->flash_id == FLASH_UNKNOWN) {
475                 puts("missing or unknown FLASH type\n");
476                 return;
477         }
478
479         if (info->size >= 0x100000)
480                 printf("  Size: %ld MB in %d Sectors\n",
481                        info->size >> 20, info->sector_count);
482         else
483                 printf("  Size: %ld KB in %d Sectors\n",
484                        info->size >> 10, info->sector_count);
485
486         puts("  Sector Start Addresses:");
487         for (i = 0; i < info->sector_count; ++i) {
488 #ifdef CONFIG_SYS_FLASH_EMPTY_INFO
489                 int size;
490                 int erased;
491                 u32 *flash;
492
493                 /*
494                  * Check if whole sector is erased
495                  */
496                 size = (info->size) / (info->sector_count);
497                 flash = (u32 *) info->start[i];
498                 size = size / sizeof(int);
499
500                 while ((size--) && (*flash++ == ~0))
501                         ;
502
503                 size++;
504                 if (size)
505                         erased = 0;
506                 else
507                         erased = 1;
508
509                 if ((i % 5) == 0)
510                         printf("\n");
511
512                 printf(" %08lX%s%s",
513                        info->start[i],
514                        erased ? " E" : "  ", info->protect[i] ? "RO " : "   ");
515 #else
516                 if ((i % 5) == 0)
517                         printf("\n   ");
518                 printf(" %08lX%s",
519                        info->start[i], info->protect[i] ? " (RO)  " : "     ");
520 #endif
521         }
522         putc('\n');
523         return;
524 }
525
526 /*
527  * flash_erase - Erase SMI flash
528  *
529  * Erase SMI flash
530  */
531 int flash_erase(flash_info_t *info, int s_first, int s_last)
532 {
533         int rcode = 0;
534         int prot = 0;
535         flash_sect_t sect;
536
537         if ((s_first < 0) || (s_first > s_last)) {
538                 puts("- no sectors to erase\n");
539                 return 1;
540         }
541
542         for (sect = s_first; sect <= s_last; ++sect) {
543                 if (info->protect[sect])
544                         prot++;
545         }
546         if (prot) {
547                 printf("- Warning: %d protected sectors will not be erased!\n",
548                        prot);
549         } else {
550                 putc('\n');
551         }
552
553         for (sect = s_first; sect <= s_last; sect++) {
554                 if (info->protect[sect] == 0) {
555                         if (smi_sector_erase(info, sect))
556                                 rcode = 1;
557                         else
558                                 putc('.');
559                 }
560         }
561         puts(" done\n");
562         return rcode;
563 }
564 #endif