xref: /openbmc/u-boot/drivers/mtd/st_smi.c (revision f77d4410)
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
565