Commit 622b95274e4d699f3c713c325e958565312625ad
Committed by
Stefan Roese
1 parent
677f970bc6
Exists in
v2017.01-smarct4x
and in
30 other branches
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 */ |