From fafcecccd5e0c919855fe9a6019ab33cdd44b757 Mon Sep 17 00:00:00 2001 From: snelson Date: Thu, 28 Jan 2010 23:55:12 +0000 Subject: Complete the addition of Feature Bits for all Jedec based chips. Add FEATURE_SHORT_RESET, FEATURE_LONG_RESET, and FEATURE_EITHER_RESET rewrite jedec functions to use getaddrmask convert write_49f002 to write_jedec_1 convert write_w39v040c to write_jedec_1 convert probe_w39v040c to probe_jedec convert write_49lf040 to write_jedec_1 convert write_pm29f002 to write_jedec convert write_29f040b to write_jedec_1 convert probe_29f040b to probe_jedec convert erase_chip_29f040b to erase_chip_block_jedec convert erase_sector_29f040b to erase_sector_jedec convert write_m29f002b to write_jedec convert write_m29f002t to write_jedec convert *_29f002 to *_jedec decouple unused files from Makefile: am29f040b.c en29f002a.c m29f002.c mx29f002.c pm29f002.c sst49lf040.c w39v040c.c w49f002u.c Signed-off-by: Sean Nelson Acked-by: Carl-Daniel Hailfinger Acked-by: Anders Juel Jensen git-svn-id: https://code.coreboot.org/svn/flashrom/trunk@886 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1 --- jedec.c | 44 ++++++++++++++++++++++++++++++++++---------- 1 file changed, 34 insertions(+), 10 deletions(-) (limited to 'jedec.c') diff --git a/jedec.c b/jedec.c index 055fbc3..055e910 100644 --- a/jedec.c +++ b/jedec.c @@ -27,6 +27,7 @@ #define MAX_REFLASH_TRIES 0x10 #define MASK_FULL 0xffff #define MASK_2AA 0x7ff +#define MASK_AAA 0xfff /* Check one byte for odd parity */ uint8_t oddparity(uint8_t val) @@ -98,8 +99,7 @@ void start_program_jedec_common(struct flashchip *flash, unsigned int mask) chip_writeb(0xA0, bios + (0x5555 & mask)); } -int probe_jedec_common(struct flashchip *flash, - unsigned int mask, int long_reset) +int probe_jedec_common(struct flashchip *flash, unsigned int mask) { chipaddr bios = flash->virtual_memory; uint8_t id1, id2; @@ -152,7 +152,7 @@ int probe_jedec_common(struct flashchip *flash, } /* Issue JEDEC Product ID Exit command */ - if (long_reset) + if ((flash->feature_bits & FEATURE_SHORT_RESET) == FEATURE_LONG_RESET) { chip_writeb(0xAA, bios + (0x5555 & mask)); if (probe_timing_exit) @@ -379,6 +379,12 @@ int getaddrmask(struct flashchip *flash) case FEATURE_ADDR_FULL: return MASK_FULL; break; + case FEATURE_ADDR_2AA: + return MASK_2AA; + break; + case FEATURE_ADDR_AAA: + return MASK_AAA; + break; default: fprintf(stderr, "%s called with unknown mask\n", __func__); return 0; @@ -388,10 +394,13 @@ int getaddrmask(struct flashchip *flash) int write_jedec(struct flashchip *flash, uint8_t *buf) { + int mask; int i, failed = 0; int total_size = flash->total_size * 1024; int page_size = flash->page_size; + mask = getaddrmask(flash); + if (erase_chip_jedec(flash)) { fprintf(stderr,"ERASE FAILED!\n"); return -1; @@ -401,7 +410,7 @@ int write_jedec(struct flashchip *flash, uint8_t *buf) for (i = 0; i < total_size / page_size; i++) { printf("%04d at address: 0x%08x", i, i * page_size); if (write_page_write_jedec_common(flash, buf + i * page_size, - i * page_size, page_size, MASK_FULL)) + i * page_size, page_size, mask)) failed = 1; printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b"); } @@ -415,6 +424,9 @@ int write_jedec_1(struct flashchip *flash, uint8_t * buf) int i; chipaddr bios = flash->virtual_memory; chipaddr dst = bios; + int mask; + + mask = getaddrmask(flash); programmer_delay(10); if (erase_flash(flash)) { @@ -427,7 +439,7 @@ int write_jedec_1(struct flashchip *flash, uint8_t * buf) if ((i & 0x3) == 0) printf("address: 0x%08lx", (unsigned long)i * 1024); - write_sector_jedec_common(flash, buf + i * 1024, dst + i * 1024, 1024, MASK_FULL); + write_sector_jedec_common(flash, buf + i * 1024, dst + i * 1024, 1024, mask); if ((i & 0x3) == 0) printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b"); @@ -441,12 +453,15 @@ int write_jedec_1(struct flashchip *flash, uint8_t * buf) int erase_chip_block_jedec(struct flashchip *flash, unsigned int addr, unsigned int blocksize) { + int mask; + + mask = getaddrmask(flash); if ((addr != 0) || (blocksize != flash->total_size * 1024)) { fprintf(stderr, "%s called with incorrect arguments\n", __func__); return -1; } - return erase_chip_jedec_common(flash, MASK_FULL); + return erase_chip_jedec_common(flash, mask); } int probe_jedec(struct flashchip *flash) @@ -454,20 +469,29 @@ int probe_jedec(struct flashchip *flash) int mask; mask = getaddrmask(flash); - return probe_jedec_common(flash, mask, 1); + return probe_jedec_common(flash, mask); } int erase_sector_jedec(struct flashchip *flash, unsigned int page, unsigned int size) { - return erase_sector_jedec_common(flash, page, size, MASK_FULL); + int mask; + + mask = getaddrmask(flash); + return erase_sector_jedec_common(flash, page, size, mask); } int erase_block_jedec(struct flashchip *flash, unsigned int page, unsigned int size) { - return erase_block_jedec_common(flash, page, size, MASK_FULL); + int mask; + + mask = getaddrmask(flash); + return erase_block_jedec_common(flash, page, size, mask); } int erase_chip_jedec(struct flashchip *flash) { - return erase_chip_jedec_common(flash, MASK_FULL); + int mask; + + mask = getaddrmask(flash); + return erase_chip_jedec_common(flash, mask); } -- cgit v1.2.1