Patchwork Add new Macronix MX25L6495F support

login
register
about
Submitter Alex Lu
Date 2014-10-16 01:15:47
Message ID <OF5114ED77.CA20F6C9-ON48257D73.0006D9EC-48257D73.0006F08D@mxic.com.tw>
Download mbox | patch
Permalink /patch/4245/
State Accepted
Headers show

Comments

Alex Lu - 2014-10-16 01:15:47
resent as a subscriber.



AlexLu6 陸紀光/台灣/旺宏 
2014/10/15 下午 06:13

收件人
flashrom@flashrom.org, 
副本抄送

主旨
Add new Macronix MX25L6495F support





Dear sirs,

        This mail comes from Macronix to add the new MX25L6495F flash chip 
support
in the flashrom project in order to help the adoption of the chip for 
Google Chromium OS.
Please help to review it. Thanks a lot!

Alex Lu
FAE SW manager



CONFIDENTIALITY NOTE:

This e-mail and any attachments may contain confidential information 
and/or personal data, which is protected by applicable laws. Please be 
reminded that duplication, disclosure, distribution, or use of this e-mail 
(and/or its attachments) or any part thereof is prohibited. If you receive 
this e-mail in error, please notify us immediately and delete this mail as 
well as its attachment(s) from your system. In addition, please be 
informed that collection, processing, and/or use of personal data is 
prohibited unless expressly permitted by personal data protection laws. 
Thank you for your attention and cooperation.

Macronix International Co., Ltd.

=====================================================================



CONFIDENTIALITY NOTE:

This e-mail and any attachments may contain confidential information 
and/or personal data, which is protected by applicable laws. Please be 
reminded that duplication, disclosure, distribution, or use of this e-mail 
(and/or its attachments) or any part thereof is prohibited. If you receive 
this e-mail in error, please notify us immediately and delete this mail as 
well as its attachment(s) from your system. In addition, please be 
informed that collection, processing, and/or use of personal data is 
prohibited unless expressly permitted by personal data protection laws. 
Thank you for your attention and cooperation.

Macronix International Co., Ltd.

=====================================================================



============================================================================

CONFIDENTIALITY NOTE:

This e-mail and any attachments may contain confidential information and/or personal data, which is protected by applicable laws. Please be reminded that duplication, disclosure, distribution, or use of this e-mail (and/or its attachments) or any part thereof is prohibited. If you receive this e-mail in error, please notify us immediately and delete this mail as well as its attachment(s) from your system. In addition, please be informed that collection, processing, and/or use of personal data is prohibited unless expressly permitted by personal data protection laws. Thank you for your attention and cooperation.

Macronix International Co., Ltd.

=====================================================================

Patch

diff -u flashrom_orig/flashchips.c ../flashrom/flashchips.c
--- flashrom_orig/flashchips.c	2014-10-02 09:15:30.474142654 +0800
+++ ../flashrom/flashchips.c	2014-09-30 17:08:05.369024716 +0800
@@ -5109,7 +5069,45 @@ 
 		.write		= spi_chip_write_256,
 		.read		= spi_chip_read, /* Fast read (0x0B) supported */
 		.voltage	= {2700, 3600}, /* 2.35-3.6V for MX25V8005 */
		.wp		= &wp_generic,
+	},
+
+	{
+		.vendor		= "Macronix",
+		.name		= "MX25L6495F",
+		.bustype	= BUS_SPI,
+		.manufacture_id	= MACRONIX_ID,
+		.model_id	= MACRONIX_MX25L6495F,
+		.total_size	= 8192,
+		.page_size	= 256,
+		.feature_bits	= FEATURE_WRSR_WREN,
+		.tested		= TEST_OK_PREW,
+		.probe		= probe_spi_rdid,
+		.probe_timing	= TIMING_ZERO,
+		.block_erasers	=
+		{
+			{
+				.eraseblocks = { {4 * 1024, 2048} },
+				.block_erase = spi_block_erase_20,
+			}, {
+				.eraseblocks = { {64 * 1024, 128} },
+				.block_erase = spi_block_erase_d8,
+			}, {
+				.eraseblocks = { {32 * 1024, 256} },
+				.block_erase = spi_block_erase_52,
+			}, {
+				.eraseblocks = { {8 * 1024 * 1024, 1} },
+				.block_erase = spi_block_erase_60,
+			}, {
+				.eraseblocks = { {8 * 1024 * 1024, 1} },
+				.block_erase = spi_block_erase_c7,
+			}
+		},
+		.unlock		= spi_disable_blockprotect,
+		.write		= spi_chip_write_256,
+		.read		= spi_chip_read, /* Fast read (0x0B) supported */
+		.voltage	= {2700, 3600}, /* 2.35-3.6V for MX25V8005 */
+		.wp		= &wp_w25,
 	},
 
 	{
diff -u flashrom_orig/flashchips.h ../flashrom/flashchips.h
--- flashrom_orig/flashchips.h	2014-10-02 09:15:30.474142654 +0800
+++ ../flashrom/flashchips.h	2014-09-24 14:54:39.564723985 +0800
@@ -389,11 +388,12 @@ 
 #define MACRONIX_MX25L1605	0x2015	/* MX25L1605{,A,D} */
 #define MACRONIX_MX25L3205	0x2016	/* MX25L3205{,A} */
 #define MACRONIX_MX25L6405	0x2017	/* MX25L6405{,D}, MX25L6406E, MX25L6445E */
+#define MACRONIX_MX25L6495F	0x9517	/* MX25L6495F */
 #define MACRONIX_MX25L12805	0x2018	/* MX25L12805 */
 #define MACRONIX_MX25L1635D	0x2415
 #define MACRONIX_MX25L1635E	0x2515	/* MX25L1635{E} */
 #define MACRONIX_MX25U1635E	0x2535
-#define MACRONIX_MX25U3235E	0x2536	/* Same as MX25U6435F */
+#define MACRONIX_MX25U3235E	0x2536	/* Same as MX25U3235F */
 #define MACRONIX_MX25U6435E	0x2537	/* Same as MX25U6435F */
 #define MACRONIX_MX25L3235D	0x5E16	/* MX25L3225D/MX25L3235D/MX25L3237D */
 #define MACRONIX_MX29F001B	0x19
diff -u flashrom_orig/writeprotect.c ../flashrom/writeprotect.c
--- flashrom_orig/writeprotect.c	2014-10-02 09:15:30.494132402 +0800
+++ ../flashrom/writeprotect.c	2014-09-24 15:06:00.465921641 +0800
@@ -312,27 +281,27 @@ 
 
 /* FIXME: Is there an mx25l3205 (without a trailing letter)? */
 static struct w25q_range mx25l3205d_ranges[] = {
-	{ X, 0, 0, {0, 0} },	/* none */
-	{ X, 0, 0x1, {0x3f0000, 64 * 1024} },
-	{ X, 0, 0x2, {0x3e0000, 128 * 1024} },
-	{ X, 0, 0x3, {0x3c0000, 256 * 1024} },
-	{ X, 0, 0x4, {0x380000, 512 * 1024} },
-	{ X, 0, 0x5, {0x300000, 1024 * 1024} },
-	{ X, 0, 0x6, {0x200000, 2048 * 1024} },
-	{ X, 0, 0x7, {0x000000, 4096 * 1024} },
+	{ 0, 0, 0, {0, 0} },	/* none */
+	{ 0, 0, 0x1, {0x3f0000, 64 * 1024} },
+	{ 0, 0, 0x2, {0x3e0000, 128 * 1024} },
+	{ 0, 0, 0x3, {0x3c0000, 256 * 1024} },
+	{ 0, 0, 0x4, {0x380000, 512 * 1024} },
+	{ 0, 0, 0x5, {0x300000, 1024 * 1024} },
+	{ 0, 0, 0x6, {0x200000, 2048 * 1024} },
+	{ 0, 0, 0x7, {0x000000, 4096 * 1024} },
 
-	{ X, 1, 0x0, {0x000000, 4096 * 1024} },
-	{ X, 1, 0x1, {0x000000, 2048 * 1024} },
-	{ X, 1, 0x2, {0x000000, 3072 * 1024} },
-	{ X, 1, 0x3, {0x000000, 3584 * 1024} },
-	{ X, 1, 0x4, {0x000000, 3840 * 1024} },
-	{ X, 1, 0x5, {0x000000, 3968 * 1024} },
-	{ X, 1, 0x6, {0x000000, 4032 * 1024} },
-	{ X, 1, 0x7, {0x000000, 4096 * 1024} },
+	{ 0, 1, 0x0, {0x000000, 4096 * 1024} },
+	{ 0, 1, 0x1, {0x000000, 2048 * 1024} },
+	{ 0, 1, 0x2, {0x000000, 3072 * 1024} },
+	{ 0, 1, 0x3, {0x000000, 3584 * 1024} },
+	{ 0, 1, 0x4, {0x000000, 3840 * 1024} },
+	{ 0, 1, 0x5, {0x000000, 3968 * 1024} },
+	{ 0, 1, 0x6, {0x000000, 4032 * 1024} },
+	{ 0, 1, 0x7, {0x000000, 4096 * 1024} },
 };
 
 static struct w25q_range mx25u3235e_ranges[] = {
-	{ X, 0, 0, {0, 0} },	/* none */
+	{ 0, 0, 0, {0, 0} },	/* none */
 	{ 0, 0, 0x1, {0x3f0000, 64 * 1024} },
 	{ 0, 0, 0x2, {0x3e0000, 128 * 1024} },
 	{ 0, 0, 0x3, {0x3c0000, 256 * 1024} },
@@ -351,8 +320,72 @@ 
 	{ 0, 1, 0x7, {0x000000, 4096 * 1024} },
 };
 
-static struct w25q_range mx25u6435e_ranges[] = {
+#if 0
+/* FIXME: MX25L6405D has same ID as MX25L6406 */
+static struct w25q_range mx25l6405d_ranges[] = {
 	{ X, 0, 0, {0, 0} },	/* none */
+	{ X, 0, 0x1, {0x7e0000, 2 * 64 * 1024} },	/* blocks 126-127 */
+	{ X, 0, 0x2, {0x7c0000, 4 * 64 * 1024} },	/* blocks 124-127 */
+	{ X, 0, 0x3, {0x780000, 8 * 64 * 1024} },	/* blocks 120-127 */
+	{ X, 0, 0x4, {0x700000, 16 * 64 * 1024} },	/* blocks 112-127 */
+	{ X, 0, 0x5, {0x600000, 32 * 64 * 1024} },	/* blocks 96-127 */
+	{ X, 0, 0x6, {0x400000, 64 * 64 * 1024} },	/* blocks 64-127 */
+	{ X, 0, 0x7, {0x000000, 64 * 128 * 1024} },	/* blocks 0-127 */
+
+	{ X, 1, 0x0, {0x000000, 8192 * 1024} },
+	{ X, 1, 0x1, {0x000000, 64 * 64 * 1024} },	/* blocks 0-63 */
+	{ X, 1, 0x2, {0x000000, 64 * 96 * 1024} },	/* blocks 0-95 */
+	{ X, 1, 0x3, {0x000000, 64 * 112 * 1024} },	/* blocks 0-111 */
+	{ X, 1, 0x4, {0x000000, 64 * 120 * 1024} },	/* blocks 0-119 */
+	{ X, 1, 0x5, {0x000000, 64 * 124 * 1024} },	/* blocks 0-123 */
+	{ X, 1, 0x6, {0x000000, 64 * 126 * 1024} },	/* blocks 0-125 */
+	{ X, 1, 0x7, {0x000000, 64 * 128 * 1024} },	/* blocks 0-127 */
+};
+#endif
+
+/* FIXME: MX25L6406 has same ID as MX25L6405D */
+static struct w25q_range mx25l6406e_ranges[] = {
+	{ 0, 0, 0, {0, 0} },	/* none */
+	{ 0, 0, 0x1, {0x7e0000, 64 * 2 * 1024} },	/* blocks 126-127 */
+	{ 0, 0, 0x2, {0x7c0000, 64 * 4 * 1024} },	/* blocks 124-127 */
+	{ 0, 0, 0x3, {0x7a0000, 64 * 8 * 1024} },	/* blocks 120-127 */
+	{ 0, 0, 0x4, {0x700000, 64 * 16 * 1024} },	/* blocks 112-127 */
+	{ 0, 0, 0x5, {0x600000, 64 * 32 * 1024} },	/* blocks 96-127 */
+	{ 0, 0, 0x6, {0x400000, 64 * 64 * 1024} },	/* blocks 64-127 */
+	{ 0, 0, 0x7, {0x000000, 64 * 128 * 1024} },	/* all */
+
+	{ 0, 1, 0x0, {0x000000, 64 * 128 * 1024} },	/* all */
+	{ 0, 1, 0x1, {0x000000, 64 * 64 * 1024} },	/* blocks 0-63 */
+	{ 0, 1, 0x2, {0x000000, 64 * 96 * 1024} },	/* blocks 0-95 */
+	{ 0, 1, 0x3, {0x000000, 64 * 112 * 1024} },	/* blocks 0-111 */
+	{ 0, 1, 0x4, {0x000000, 64 * 120 * 1024} },	/* blocks 0-119 */
+	{ 0, 1, 0x5, {0x000000, 64 * 124 * 1024} },	/* blocks 0-123 */
+	{ 0, 1, 0x6, {0x000000, 64 * 126 * 1024} },	/* blocks 0-125 */
+	{ 0, 1, 0x7, {0x000000, 64 * 128 * 1024} },	/* all */
+};
+
+static struct w25q_range mx25l6495f_ranges[] = {
+	{ 0, 0, 0, {0, 0} },	/* none */
+	{ 0, 0, 0x1, {0x7f0000, 1 * 64 * 1024} },	/* blocks 127 */
+	{ 0, 0, 0x2, {0x7e0000, 2 * 64 * 1024} },	/* blocks 126-127 */
+	{ 0, 0, 0x3, {0x7c0000, 4 * 64 * 1024} },	/* blocks 124-127 */
+	{ 0, 0, 0x4, {0x780000, 8 * 64 * 1024} },	/* blocks 120-127 */
+	{ 0, 0, 0x5, {0x700000, 16 * 64 * 1024} },	/* blocks 112-127 */
+	{ 0, 0, 0x6, {0x600000, 32 * 64 * 1024} },	/* blocks 96-127 */
+	{ 0, 0, 0x7, {0x400000, 64 * 64 * 1024} },	/* blocks 64-127 */
+
+	{ 0, 1, 0x0, {0x000000, 64 * 128 * 1024} },	/* all */
+	{ 0, 1, 0x1, {0x000000, 64 * 128 * 1024} },	/* all */
+	{ 0, 1, 0x2, {0x000000, 64 * 128 * 1024} },	/* all */
+	{ 0, 1, 0x3, {0x000000, 64 * 128 * 1024} },	/* all */
+	{ 0, 1, 0x4, {0x000000, 64 * 128 * 1024} },	/* all */
+	{ 0, 1, 0x5, {0x000000, 64 * 128 * 1024} },	/* all */
+	{ 0, 1, 0x6, {0x000000, 64 * 128 * 1024} },	/* all */
+	{ 0, 1, 0x7, {0x000000, 64 * 128 * 1024} },	/* all */
+};
+
+static struct w25q_range mx25u6435e_ranges[] = {
+	{ 0, 0, 0, {0, 0} },	/* none */
 	{ 0, 0, 0x1, {0x7f0000,   1 * 64 * 1024} },	/* block 127 */
 	{ 0, 0, 0x2, {0x7e0000,   2 * 64 * 1024} },	/* blocks 126-127 */
 	{ 0, 0, 0x3, {0x7c0000,   4 * 64 * 1024} },	/* blocks 124-127 */
@@ -728,6 +761,16 @@ 
 			*w25q_ranges = mx25u6435e_ranges;
 			*num_entries = ARRAY_SIZE(mx25u6435e_ranges);
 			break;
+		case MACRONIX_MX25L6495F:
+			*w25q_ranges = mx25l6495f_ranges;
+			*num_entries = ARRAY_SIZE(mx25l6495f_ranges);
+			break;
+		case MACRONIX_MX25L6405:
+			/* FIXME: MX25L64* chips have mixed capabilities and
+			   share IDs */
+			*w25q_ranges = mx25l6406e_ranges;
+			*num_entries = ARRAY_SIZE(mx25l6406e_ranges);
+			break;
 		default:
 			msg_cerr("%s():%d: MXIC flash chip mismatch (0x%04x)"
 			         ", aborting\n", __func__, __LINE__,