Commit 622b95274e4d699f3c713c325e958565312625ad

Authored by Ryan Harkin
Committed by Stefan Roese
1 parent 677f970bc6

cfi_flash: use specific width types for cword

This patch changes the cword union to use specific length types that are
architecture indepented.

This patch also renames the members of the cword union to represent
their usage, i.e.:

    c  -> w8
    s  -> w16
    l  -> w32
    ll -> w64

Where "w" stands for "width" in bits.

I discovered this problem when enabling CFI flash on vexpress64.
cword.l was an unsigned long int, but it was intended to be 32 bits wide.
Unfortunately, it's 64-bits wide on a 64-bit system, meaning that a
64-bit system fails when attempting to use 32-bit wide CFI flash parts.

Similar problems also existed with the other cword sizes.

Signed-off-by: Ryan Harkin <ryan.harkin@linaro.org>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Stefan Roese <sr@denx.de>

Showing 2 changed files with 45 additions and 45 deletions Side-by-side Diff

drivers/mtd/cfi_flash.c
... ... @@ -335,34 +335,34 @@
335 335 switch (info->portwidth) {
336 336 case FLASH_CFI_8BIT:
337 337 debug ("fwc addr %p cmd %x %x 8bit x %d bit\n", addr, cmd,
338   - cword.c, info->chipwidth << CFI_FLASH_SHIFT_WIDTH);
339   - flash_write8(cword.c, addr);
  338 + cword.w8, info->chipwidth << CFI_FLASH_SHIFT_WIDTH);
  339 + flash_write8(cword.w8, addr);
340 340 break;
341 341 case FLASH_CFI_16BIT:
342 342 debug ("fwc addr %p cmd %x %4.4x 16bit x %d bit\n", addr,
343   - cmd, cword.w,
  343 + cmd, cword.w16,
344 344 info->chipwidth << CFI_FLASH_SHIFT_WIDTH);
345   - flash_write16(cword.w, addr);
  345 + flash_write16(cword.w16, addr);
346 346 break;
347 347 case FLASH_CFI_32BIT:
348   - debug ("fwc addr %p cmd %x %8.8lx 32bit x %d bit\n", addr,
349   - cmd, cword.l,
  348 + debug ("fwc addr %p cmd %x %8.8x 32bit x %d bit\n", addr,
  349 + cmd, cword.w32,
350 350 info->chipwidth << CFI_FLASH_SHIFT_WIDTH);
351   - flash_write32(cword.l, addr);
  351 + flash_write32(cword.w32, addr);
352 352 break;
353 353 case FLASH_CFI_64BIT:
354 354 #ifdef DEBUG
355 355 {
356 356 char str[20];
357 357  
358   - print_longlong (str, cword.ll);
  358 + print_longlong (str, cword.w64);
359 359  
360 360 debug ("fwrite addr %p cmd %x %s 64 bit x %d bit\n",
361 361 addr, cmd, str,
362 362 info->chipwidth << CFI_FLASH_SHIFT_WIDTH);
363 363 }
364 364 #endif
365   - flash_write64(cword.ll, addr);
  365 + flash_write64(cword.w64, addr);
366 366 break;
367 367 }
368 368  
369 369  
370 370  
... ... @@ -393,16 +393,16 @@
393 393 debug ("is= cmd %x(%c) addr %p ", cmd, cmd, addr);
394 394 switch (info->portwidth) {
395 395 case FLASH_CFI_8BIT:
396   - debug ("is= %x %x\n", flash_read8(addr), cword.c);
397   - retval = (flash_read8(addr) == cword.c);
  396 + debug ("is= %x %x\n", flash_read8(addr), cword.w8);
  397 + retval = (flash_read8(addr) == cword.w8);
398 398 break;
399 399 case FLASH_CFI_16BIT:
400   - debug ("is= %4.4x %4.4x\n", flash_read16(addr), cword.w);
401   - retval = (flash_read16(addr) == cword.w);
  400 + debug ("is= %4.4x %4.4x\n", flash_read16(addr), cword.w16);
  401 + retval = (flash_read16(addr) == cword.w16);
402 402 break;
403 403 case FLASH_CFI_32BIT:
404   - debug ("is= %8.8x %8.8lx\n", flash_read32(addr), cword.l);
405   - retval = (flash_read32(addr) == cword.l);
  404 + debug ("is= %8.8x %8.8x\n", flash_read32(addr), cword.w32);
  405 + retval = (flash_read32(addr) == cword.w32);
406 406 break;
407 407 case FLASH_CFI_64BIT:
408 408 #ifdef DEBUG
409 409  
... ... @@ -411,11 +411,11 @@
411 411 char str2[20];
412 412  
413 413 print_longlong (str1, flash_read64(addr));
414   - print_longlong (str2, cword.ll);
  414 + print_longlong (str2, cword.w64);
415 415 debug ("is= %s %s\n", str1, str2);
416 416 }
417 417 #endif
418   - retval = (flash_read64(addr) == cword.ll);
  418 + retval = (flash_read64(addr) == cword.w64);
419 419 break;
420 420 default:
421 421 retval = 0;
422 422  
423 423  
424 424  
... ... @@ -439,16 +439,16 @@
439 439 flash_make_cmd (info, cmd, &cword);
440 440 switch (info->portwidth) {
441 441 case FLASH_CFI_8BIT:
442   - retval = ((flash_read8(addr) & cword.c) == cword.c);
  442 + retval = ((flash_read8(addr) & cword.w8) == cword.w8);
443 443 break;
444 444 case FLASH_CFI_16BIT:
445   - retval = ((flash_read16(addr) & cword.w) == cword.w);
  445 + retval = ((flash_read16(addr) & cword.w16) == cword.w16);
446 446 break;
447 447 case FLASH_CFI_32BIT:
448   - retval = ((flash_read32(addr) & cword.l) == cword.l);
  448 + retval = ((flash_read32(addr) & cword.w32) == cword.w32);
449 449 break;
450 450 case FLASH_CFI_64BIT:
451   - retval = ((flash_read64(addr) & cword.ll) == cword.ll);
  451 + retval = ((flash_read64(addr) & cword.w64) == cword.w64);
452 452 break;
453 453 default:
454 454 retval = 0;
455 455  
456 456  
457 457  
458 458  
459 459  
460 460  
... ... @@ -680,33 +680,33 @@
680 680  
681 681 switch (info->portwidth) {
682 682 case FLASH_CFI_8BIT:
683   - cword->c = c;
  683 + cword->w8 = c;
684 684 break;
685 685 case FLASH_CFI_16BIT:
686 686 #if defined(__LITTLE_ENDIAN) && !defined(CONFIG_SYS_WRITE_SWAPPED_DATA)
687 687 w = c;
688 688 w <<= 8;
689   - cword->w = (cword->w >> 8) | w;
  689 + cword->w16 = (cword->w16 >> 8) | w;
690 690 #else
691   - cword->w = (cword->w << 8) | c;
  691 + cword->w16 = (cword->w16 << 8) | c;
692 692 #endif
693 693 break;
694 694 case FLASH_CFI_32BIT:
695 695 #if defined(__LITTLE_ENDIAN) && !defined(CONFIG_SYS_WRITE_SWAPPED_DATA)
696 696 l = c;
697 697 l <<= 24;
698   - cword->l = (cword->l >> 8) | l;
  698 + cword->w32 = (cword->w32 >> 8) | l;
699 699 #else
700   - cword->l = (cword->l << 8) | c;
  700 + cword->w32 = (cword->w32 << 8) | c;
701 701 #endif
702 702 break;
703 703 case FLASH_CFI_64BIT:
704 704 #if defined(__LITTLE_ENDIAN) && !defined(CONFIG_SYS_WRITE_SWAPPED_DATA)
705 705 ll = c;
706 706 ll <<= 56;
707   - cword->ll = (cword->ll >> 8) | ll;
  707 + cword->w64 = (cword->w64 >> 8) | ll;
708 708 #else
709   - cword->ll = (cword->ll << 8) | c;
  709 + cword->w64 = (cword->w64 << 8) | c;
710 710 #endif
711 711 break;
712 712 }
713 713  
714 714  
715 715  
... ... @@ -753,16 +753,16 @@
753 753 /* Check if Flash is (sufficiently) erased */
754 754 switch (info->portwidth) {
755 755 case FLASH_CFI_8BIT:
756   - flag = ((flash_read8(dstaddr) & cword.c) == cword.c);
  756 + flag = ((flash_read8(dstaddr) & cword.w8) == cword.w8);
757 757 break;
758 758 case FLASH_CFI_16BIT:
759   - flag = ((flash_read16(dstaddr) & cword.w) == cword.w);
  759 + flag = ((flash_read16(dstaddr) & cword.w16) == cword.w16);
760 760 break;
761 761 case FLASH_CFI_32BIT:
762   - flag = ((flash_read32(dstaddr) & cword.l) == cword.l);
  762 + flag = ((flash_read32(dstaddr) & cword.w32) == cword.w32);
763 763 break;
764 764 case FLASH_CFI_64BIT:
765   - flag = ((flash_read64(dstaddr) & cword.ll) == cword.ll);
  765 + flag = ((flash_read64(dstaddr) & cword.w64) == cword.w64);
766 766 break;
767 767 default:
768 768 flag = 0;
769 769  
770 770  
771 771  
... ... @@ -800,16 +800,16 @@
800 800  
801 801 switch (info->portwidth) {
802 802 case FLASH_CFI_8BIT:
803   - flash_write8(cword.c, dstaddr);
  803 + flash_write8(cword.w8, dstaddr);
804 804 break;
805 805 case FLASH_CFI_16BIT:
806   - flash_write16(cword.w, dstaddr);
  806 + flash_write16(cword.w16, dstaddr);
807 807 break;
808 808 case FLASH_CFI_32BIT:
809   - flash_write32(cword.l, dstaddr);
  809 + flash_write32(cword.w32, dstaddr);
810 810 break;
811 811 case FLASH_CFI_64BIT:
812   - flash_write64(cword.ll, dstaddr);
  812 + flash_write64(cword.w64, dstaddr);
813 813 break;
814 814 }
815 815  
... ... @@ -1115,7 +1115,7 @@
1115 1115 if (use_flash_status_poll(info)) {
1116 1116 cfiword_t cword;
1117 1117 void *dest;
1118   - cword.ll = 0xffffffffffffffffULL;
  1118 + cword.w64 = 0xffffffffffffffffULL;
1119 1119 dest = flash_map(info, sect, 0);
1120 1120 st = flash_status_poll(info, &cword, dest,
1121 1121 info->erase_blk_tout, "erase");
... ... @@ -1305,7 +1305,7 @@
1305 1305  
1306 1306 /* handle unaligned start */
1307 1307 if ((aln = addr - wp) != 0) {
1308   - cword.l = 0;
  1308 + cword.w32 = 0;
1309 1309 p = (uchar *)wp;
1310 1310 for (i = 0; i < aln; ++i)
1311 1311 flash_add_byte (info, &cword, flash_read8(p + i));
... ... @@ -1332,7 +1332,7 @@
1332 1332 while (cnt >= info->portwidth) {
1333 1333 /* prohibit buffer write when buffer_size is 1 */
1334 1334 if (info->buffer_size == 1) {
1335   - cword.l = 0;
  1335 + cword.w32 = 0;
1336 1336 for (i = 0; i < info->portwidth; i++)
1337 1337 flash_add_byte (info, &cword, *src++);
1338 1338 if ((rc = flash_write_cfiword (info, wp, cword)) != 0)
... ... @@ -1359,7 +1359,7 @@
1359 1359 }
1360 1360 #else
1361 1361 while (cnt >= info->portwidth) {
1362   - cword.l = 0;
  1362 + cword.w32 = 0;
1363 1363 for (i = 0; i < info->portwidth; i++) {
1364 1364 flash_add_byte (info, &cword, *src++);
1365 1365 }
... ... @@ -1381,7 +1381,7 @@
1381 1381 /*
1382 1382 * handle unaligned tail bytes
1383 1383 */
1384   - cword.l = 0;
  1384 + cword.w32 = 0;
1385 1385 p = (uchar *)wp;
1386 1386 for (i = 0; (i < info->portwidth) && (cnt > 0); ++i) {
1387 1387 flash_add_byte (info, &cword, *src++);
include/mtd/cfi_flash.h
... ... @@ -105,10 +105,10 @@
105 105 #define NUM_ERASE_REGIONS 4 /* max. number of erase regions */
106 106  
107 107 typedef union {
108   - unsigned char c;
109   - unsigned short w;
110   - unsigned long l;
111   - unsigned long long ll;
  108 + u8 w8;
  109 + u16 w16;
  110 + u32 w32;
  111 + u64 w64;
112 112 } cfiword_t;
113 113  
114 114 /* CFI standard query structure */