blob: 9bae9e30cabbace0c22f0c28d44c58e569389324 [file] [log] [blame]
Adam Kaufman064b1f22007-02-06 19:47:50 +00001/*
Uwe Hermannd1107642007-08-29 17:52:32 +00002 * This file is part of the flashrom project.
Adam Kaufman064b1f22007-02-06 19:47:50 +00003 *
Uwe Hermannd22a1d42007-09-09 20:21:05 +00004 * Copyright (C) 2000 Silicon Integrated System Corporation
5 * Copyright (C) 2000 Ronald G. Minnich <rminnich@gmail.com>
Stefan Reinauer8fa64812009-08-12 09:27:45 +00006 * Copyright (C) 2005-2009 coresystems GmbH
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00007 * Copyright (C) 2006-2009 Carl-Daniel Hailfinger
Adam Kaufman064b1f22007-02-06 19:47:50 +00008 *
Uwe Hermannd1107642007-08-29 17:52:32 +00009 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
Adam Kaufman064b1f22007-02-06 19:47:50 +000013 *
Uwe Hermannd1107642007-08-29 17:52:32 +000014 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
Adam Kaufman064b1f22007-02-06 19:47:50 +000018 */
19
Ronald G. Minnicheaab50b2003-09-12 22:41:53 +000020#ifndef __FLASH_H__
21#define __FLASH_H__ 1
22
Stefan Tauner0466c812013-06-16 10:30:08 +000023#include <inttypes.h>
Carl-Daniel Hailfinger11990da2013-07-13 23:21:05 +000024#include <stdio.h>
Ollie Lho184a4042005-11-26 21:55:36 +000025#include <stdint.h>
Carl-Daniel Hailfingerdd128c92010-06-03 00:49:50 +000026#include <stddef.h>
Nico Huber18781102012-12-10 13:34:12 +000027#include <stdarg.h>
Stefan Tauner682122b2013-06-23 22:15:39 +000028#include <stdbool.h>
Stefan Taunerb0eee9b2015-01-10 09:32:50 +000029#if IS_WINDOWS
Patrick Georgie48654c2010-01-06 22:14:39 +000030#include <windows.h>
31#undef min
32#undef max
33#endif
Andriy Gapon65c1b862008-05-22 13:22:45 +000034
Nico Huber11136c22023-05-01 12:00:09 +020035#include "chipdrivers/probing.h"
Nico Huberc3b02dc2023-08-12 01:13:45 +020036#include "libflashprog.h"
Nico Huber3a9939b2016-04-27 15:56:14 +020037#include "layout.h"
Nikolai Artemievc6c3f282021-10-20 23:34:15 +110038#include "writeprotect.h"
Nico Huber3a9939b2016-04-27 15:56:14 +020039
Nico Huberd8b2e802019-06-18 23:39:56 +020040#define KiB (1024)
41#define MiB (1024 * KiB)
42
Edward O'Callaghandd9d0c52022-06-04 20:23:57 +100043#define BIT(x) (1<<(x))
44
Nico Huberd8b2e802019-06-18 23:39:56 +020045/* Assumes `n` and `a` are at most 64-bit wide (to avoid typeof() operator). */
46#define ALIGN_DOWN(n, a) ((n) & ~((uint64_t)(a) - 1))
47
Patrick Georgied7a9642010-09-25 22:53:44 +000048#define ERROR_PTR ((void*)-1)
49
Carl-Daniel Hailfinger174f55b2010-10-08 00:37:55 +000050/* Error codes */
Carl-Daniel Hailfinger316fdfb2012-06-08 15:27:47 +000051#define ERROR_OOM -100
Carl-Daniel Hailfinger174f55b2010-10-08 00:37:55 +000052#define TIMEOUT_ERROR -101
53
Stefan Taunerc2333752013-07-13 23:31:37 +000054/* TODO: check using code for correct usage of types */
55typedef uintptr_t chipaddr;
Stefan Tauner305e0b92013-07-17 23:46:44 +000056#define PRIxPTR_WIDTH ((int)(sizeof(uintptr_t)*2))
Carl-Daniel Hailfinger5820f422009-05-16 21:22:56 +000057
David Hendricks8bb20212011-06-14 01:35:36 +000058int register_shutdown(int (*function) (void *data), void *data);
Stefan Tauner2a1ed772014-08-31 00:09:21 +000059int shutdown_free(void *data);
Stefan Taunerf80419c2014-05-02 15:41:42 +000060void programmer_delay(unsigned int usecs);
Carl-Daniel Hailfinger61a8bd22009-03-05 19:24:22 +000061
Uwe Hermanne5ac1642008-03-12 11:54:51 +000062#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
63
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +000064enum chipbustype {
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000065 BUS_NONE = 0,
66 BUS_PARALLEL = 1 << 0,
67 BUS_LPC = 1 << 1,
68 BUS_FWH = 1 << 2,
69 BUS_SPI = 1 << 3,
Carl-Daniel Hailfinger532c7172011-11-04 21:35:26 +000070 BUS_PROG = 1 << 4,
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000071 BUS_NONSPI = BUS_PARALLEL | BUS_LPC | BUS_FWH,
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +000072};
73
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +000074/*
Stefan Tauner02437452013-04-01 19:34:53 +000075 * The following enum defines possible write granularities of flash chips. These tend to reflect the properties
Martin Rothf6c1cb12022-03-15 10:55:25 -060076 * of the actual hardware not necessarily the write function(s) defined by the respective struct flashchip.
Stefan Tauner02437452013-04-01 19:34:53 +000077 * The latter might (and should) be more precisely specified, e.g. they might bail out early if their execution
78 * would result in undefined chip contents.
Stefan Taunereb582572012-09-21 12:52:50 +000079 */
80enum write_granularity {
Stefan Tauner02437452013-04-01 19:34:53 +000081 /* We assume 256 byte granularity by default. */
82 write_gran_256bytes = 0,/* If less than 256 bytes are written, the unwritten bytes are undefined. */
83 write_gran_1bit, /* Each bit can be cleared individually. */
84 write_gran_1byte, /* A byte can be written once. Further writes to an already written byte cause
85 * its contents to be either undefined or to stay unchanged. */
Paul Kocialkowskic8305e12015-10-16 02:16:20 +000086 write_gran_128bytes, /* If less than 128 bytes are written, the unwritten bytes are undefined. */
Stefan Tauner02437452013-04-01 19:34:53 +000087 write_gran_264bytes, /* If less than 264 bytes are written, the unwritten bytes are undefined. */
88 write_gran_512bytes, /* If less than 512 bytes are written, the unwritten bytes are undefined. */
89 write_gran_528bytes, /* If less than 528 bytes are written, the unwritten bytes are undefined. */
90 write_gran_1024bytes, /* If less than 1024 bytes are written, the unwritten bytes are undefined. */
91 write_gran_1056bytes, /* If less than 1056 bytes are written, the unwritten bytes are undefined. */
Carl-Daniel Hailfinger1b0e9fc2014-06-16 22:36:17 +000092 write_gran_1byte_implicit_erase, /* EEPROMs and other chips with implicit erase and 1-byte writes. */
Stefan Taunereb582572012-09-21 12:52:50 +000093};
94
Nico Huber3ac761c2023-01-16 02:43:17 +010095size_t gran_to_bytes(enum write_granularity);
96
Stefan Taunereb582572012-09-21 12:52:50 +000097/*
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +000098 * How many different contiguous runs of erase blocks with one size each do
99 * we have for a given erase function?
100 */
101#define NUM_ERASEREGIONS 5
102
103/*
104 * How many different erase functions do we have per chip?
Nico Huberaac81422017-11-10 22:54:13 +0100105 * Macronix MX25L25635F has 8 different functions.
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +0000106 */
Nico Huberaac81422017-11-10 22:54:13 +0100107#define NUM_ERASEFUNCTIONS 8
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +0000108
Nikolai Artemiev4ad48642020-11-05 13:54:27 +1100109#define MAX_CHIP_RESTORE_FUNCTIONS 4
110
Nico Huber2ae63012026-03-04 21:06:45 +0100111typedef uint32_t feature_bits_t;
112
Stefan Tauner0554ca52013-07-25 22:54:25 +0000113/* Feature bits used for non-SPI only */
Nico Huber84914db2026-03-07 17:11:28 +0100114#define FEATURE_LONG_RESET (1 << 0)
115#define FEATURE_SHORT_RESET (1 << 1)
116#define FEATURE_EITHER_RESET (FEATURE_LONG_RESET | FEATURE_SHORT_RESET)
Carl-Daniel Hailfinger4bf4e792010-01-09 03:15:50 +0000117#define FEATURE_ADDR_FULL (0 << 2)
118#define FEATURE_ADDR_MASK (3 << 2)
Sean Nelson35727f72010-01-28 23:55:12 +0000119#define FEATURE_ADDR_2AA (1 << 2)
120#define FEATURE_ADDR_AAA (2 << 2)
Michael Karcherad0010a2010-04-03 10:27:08 +0000121#define FEATURE_ADDR_SHIFTED (1 << 5)
Stefan Tauner0554ca52013-07-25 22:54:25 +0000122/* Feature bits used for SPI only */
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +0000123#define FEATURE_WRSR_EWSR (1 << 6)
124#define FEATURE_WRSR_WREN (1 << 7)
Stefan Tauner0554ca52013-07-25 22:54:25 +0000125#define FEATURE_WRSR_EITHER (FEATURE_WRSR_EWSR | FEATURE_WRSR_WREN)
Daniel Lenski65922a32012-02-15 23:40:23 +0000126#define FEATURE_OTP (1 << 8)
Nico Huber1412d9f2024-01-06 18:25:49 +0100127#define FEATURE_FAST_READ (1 << 9) /**< Supports fast-read instruction 0x0b, 8 dummy cycles */
Nico Huberfe34d2a2017-11-10 21:10:20 +0100128#define FEATURE_4BA_ENTER (1 << 10) /**< Can enter/exit 4BA mode with instructions 0xb7/0xe9 w/o WREN */
129#define FEATURE_4BA_ENTER_WREN (1 << 11) /**< Can enter/exit 4BA mode with instructions 0xb7/0xe9 after WREN */
Nico Huber86bddb52018-03-13 18:14:52 +0100130#define FEATURE_4BA_ENTER_EAR7 (1 << 12) /**< Can enter/exit 4BA mode by setting bit7 of the ext addr reg */
Nico Huber542b1f02022-05-24 14:30:12 +0200131#define FEATURE_4BA_EAR_C5C8 (1 << 13) /**< Regular 3-byte operations can be used by writing the most
132 significant address byte into an extended address register
133 (using 0xc5/0xc8 instructions). */
Nico Huber9bb8a322022-05-24 15:07:34 +0200134#define FEATURE_4BA_EAR_1716 (1 << 14) /**< Like FEATURE_4BA_EAR_C5C8 but with 0x17/0x16 instructions. */
135#define FEATURE_4BA_READ (1 << 15) /**< Native 4BA read instruction (0x13) is supported. */
136#define FEATURE_4BA_FAST_READ (1 << 16) /**< Native 4BA fast read instruction (0x0c) is supported. */
137#define FEATURE_4BA_WRITE (1 << 17) /**< Native 4BA byte program (0x12) is supported. */
Nico Huberaac81422017-11-10 22:54:13 +0100138/* 4BA Shorthands */
Nico Huber9bb8a322022-05-24 15:07:34 +0200139#define FEATURE_4BA_EAR_ANY (FEATURE_4BA_EAR_C5C8 | FEATURE_4BA_EAR_1716)
Nico Huberaac81422017-11-10 22:54:13 +0100140#define FEATURE_4BA_NATIVE (FEATURE_4BA_READ | FEATURE_4BA_FAST_READ | FEATURE_4BA_WRITE)
Nico Huber542b1f02022-05-24 14:30:12 +0200141#define FEATURE_4BA (FEATURE_4BA_ENTER | FEATURE_4BA_EAR_C5C8 | FEATURE_4BA_NATIVE)
142#define FEATURE_4BA_WREN (FEATURE_4BA_ENTER_WREN | FEATURE_4BA_EAR_C5C8 | FEATURE_4BA_NATIVE)
143#define FEATURE_4BA_EAR7 (FEATURE_4BA_ENTER_EAR7 | FEATURE_4BA_EAR_C5C8 | FEATURE_4BA_NATIVE)
Paul Kocialkowski995f7552018-01-15 01:06:09 +0300144/*
145 * Most flash chips are erased to ones and programmed to zeros. However, some
146 * other flash chips, such as the ENE KB9012 internal flash, work the opposite way.
147 */
Nico Huber9bb8a322022-05-24 15:07:34 +0200148#define FEATURE_ERASED_ZERO (1 << 18)
149#define FEATURE_NO_ERASE (1 << 19)
Paul Kocialkowski995f7552018-01-15 01:06:09 +0300150
Nico Huber9bb8a322022-05-24 15:07:34 +0200151#define FEATURE_WRSR_EXT2 (1 << 20)
152#define FEATURE_WRSR2 (1 << 21)
153#define FEATURE_WRSR_EXT3 ((1 << 22) | FEATURE_WRSR_EXT2)
154#define FEATURE_WRSR3 (1 << 23)
Nikolai Artemiev9de3f872021-10-20 22:32:25 +1100155
Nico Huber1412d9f2024-01-06 18:25:49 +0100156#define FEATURE_FAST_READ_DOUT (1 << 24) /**< Supports fast-read dual-output 0x3b, 8 dummy cycles */
157#define FEATURE_FAST_READ_DIO (1 << 25) /**< Supports fast-read dual-in/out 0xbb, 4 dummy cycles */
158#define FEATURE_FAST_READ_QOUT (1 << 26) /**< Supports fast-read quad-output 0x6b, 8 dummy cycles */
159#define FEATURE_FAST_READ_QIO (1 << 27) /**< Supports fast-read quad-in/out 0xeb, 6 dummy cycles */
160
161#define FEATURE_FAST_READ_QPI4B (1 << 28) /**< Supports native 4BA fast-read quad-i/o 0xec in QPI mode */
162
163#define FEATURE_QPI_35_F5 (1 << 29) /**< Can enter/exit QPI mode with instructions 0x35/0xf5 */
164#define FEATURE_QPI_38_FF (1 << 30) /**< Can enter/exit QPI mode with instructions 0x38/0xff */
165
166#define FEATURE_SET_READ_PARAMS (1u << 31) /**< SRP instruction 0xc0 for dummy cycles and burst length */
167
168/* Multi-I/O Shorthands */
Nico Huber46e42092024-10-20 18:21:43 +0200169#define FEATURE_DIO (FEATURE_FAST_READ | \
170 FEATURE_FAST_READ_DOUT | FEATURE_FAST_READ_DIO)
171#define FEATURE_QIO (FEATURE_DIO | \
Nico Huber1412d9f2024-01-06 18:25:49 +0100172 FEATURE_FAST_READ_QOUT | FEATURE_FAST_READ_QIO)
173#define FEATURE_QPI_35 (FEATURE_QIO | FEATURE_QPI_35_F5)
174#define FEATURE_QPI_38 (FEATURE_QIO | FEATURE_QPI_38_FF)
175#define FEATURE_QPI_SRP (FEATURE_QPI_38 | FEATURE_SET_READ_PARAMS)
176
Nico Huber930d4212024-05-04 18:59:15 +0200177/* Catch all dual/quad features to be able to mask them */
178#define FEATURE_ANY_DUAL (FEATURE_FAST_READ_DOUT | FEATURE_FAST_READ_DIO)
179#define FEATURE_ANY_QUAD (FEATURE_QPI_35_F5 | FEATURE_QPI_38_FF | \
180 FEATURE_FAST_READ_QOUT | FEATURE_FAST_READ_QIO | FEATURE_FAST_READ_QPI4B)
181
Paul Kocialkowski995f7552018-01-15 01:06:09 +0300182#define ERASED_VALUE(flash) (((flash)->chip->feature_bits & FEATURE_ERASED_ZERO) ? 0x00 : 0xff)
Sean Nelsonc57a9202010-01-04 17:15:23 +0000183
Stefan Tauner6455dff2014-05-26 00:36:24 +0000184enum test_state {
185 OK = 0,
186 NT = 1, /* Not tested */
187 BAD, /* Known to not work */
188 DEP, /* Support depends on configuration (e.g. Intel flash descriptor) */
189 NA, /* Not applicable (e.g. write support on ROM chips) */
190};
191
Sergii Dmytrukc720b6e2022-10-06 15:17:52 +0300192#define TEST_UNTESTED (struct tested){ .probe = NT, .read = NT, .erase = NT, .write = NT, .wp = NT }
Stefan Tauner6455dff2014-05-26 00:36:24 +0000193
Sergii Dmytrukc720b6e2022-10-06 15:17:52 +0300194#define TEST_OK_PROBE (struct tested){ .probe = OK, .read = NT, .erase = NT, .write = NT, .wp = NT }
195#define TEST_OK_PR (struct tested){ .probe = OK, .read = OK, .erase = NT, .write = NT, .wp = NT }
196#define TEST_OK_PRE (struct tested){ .probe = OK, .read = OK, .erase = OK, .write = NT, .wp = NT }
197#define TEST_OK_PREW (struct tested){ .probe = OK, .read = OK, .erase = OK, .write = OK, .wp = NT }
198#define TEST_OK_PREWB (struct tested){ .probe = OK, .read = OK, .erase = OK, .write = OK, .wp = OK }
Stefan Tauner6455dff2014-05-26 00:36:24 +0000199
Sergii Dmytrukc720b6e2022-10-06 15:17:52 +0300200#define TEST_BAD_PROBE (struct tested){ .probe = BAD, .read = NT, .erase = NT, .write = NT, .wp = NT }
201#define TEST_BAD_PR (struct tested){ .probe = BAD, .read = BAD, .erase = NT, .write = NT, .wp = NT }
202#define TEST_BAD_PRE (struct tested){ .probe = BAD, .read = BAD, .erase = BAD, .write = NT, .wp = NT }
203#define TEST_BAD_PREW (struct tested){ .probe = BAD, .read = BAD, .erase = BAD, .write = BAD, .wp = NT }
204#define TEST_BAD_PREWB (struct tested){ .probe = BAD, .read = BAD, .erase = BAD, .write = BAD, .wp = BAD }
Stefan Tauner6455dff2014-05-26 00:36:24 +0000205
Nico Huberc3b02dc2023-08-12 01:13:45 +0200206struct flashprog_flashctx;
207#define flashctx flashprog_flashctx /* TODO: Agree on a name and convert all occurrences. */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +0000208typedef int (erasefunc_t)(struct flashctx *flash, unsigned int addr, unsigned int blocklen);
Nico Huber7679b5c2023-04-28 21:48:53 +0000209typedef int (readfunc_t)(struct flashctx *flash, uint8_t *dst, unsigned int start, unsigned int len);
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +0000210
Nikolai Artemiev01675222021-10-20 22:30:41 +1100211enum flash_reg {
212 INVALID_REG = 0,
213 STATUS1,
214 STATUS2,
Sergii Dmytruk0b2e7dd2021-12-19 18:37:51 +0200215 STATUS3,
Sergii Dmytruk3d728e72021-11-27 15:14:27 +0200216 SECURITY,
Sergii Dmytrukbd72a472022-07-24 17:11:05 +0300217 CONFIG,
Nikolai Artemiev01675222021-10-20 22:30:41 +1100218 MAX_REGISTERS
219};
220
Nikolai Artemievc6c3f282021-10-20 23:34:15 +1100221struct reg_bit_info {
222 /* Register containing the bit */
223 enum flash_reg reg;
224
225 /* Bit index within register */
226 uint8_t bit_index;
227
228 /*
229 * Writability of the bit. RW does not guarantee the bit will be
230 * writable, for example if status register protection is enabled.
231 */
232 enum {
233 RO, /* Read only */
234 RW, /* Readable and writable */
235 OTP /* One-time programmable */
236 } writability;
237};
238
Nikolai Artemievc9feb1b2021-10-21 01:35:13 +1100239struct wp_bits;
240
Nico Huber901fb952023-01-11 23:24:23 +0100241enum preparation_steps {
Nico Huberb89c4522024-12-04 23:30:13 +0100242 PREPARE_POST_PROBE,
Nico Huber901fb952023-01-11 23:24:23 +0100243 PREPARE_FULL,
244};
245
Nico Huberdae90222026-03-09 20:36:56 +0100246struct flashchip {
Uwe Hermann76158682008-03-14 23:55:58 +0000247 const char *vendor;
Uwe Hermann372eeb52007-12-04 21:49:06 +0000248 const char *name;
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +0000249
250 enum chipbustype bustype;
251
Nico Huber11136c22023-05-01 12:00:09 +0200252 struct id_info id;
Ronald G. Minnich5e5f75e2002-01-29 18:21:41 +0000253
Stefan Taunerc0aaf952011-05-19 02:58:17 +0000254 /* Total chip size in kilobytes */
Stefan Taunerc69c9c82011-11-23 09:13:48 +0000255 unsigned int total_size;
Stefan Taunerc0aaf952011-05-19 02:58:17 +0000256 /* Chip page size in bytes */
Stefan Taunerc69c9c82011-11-23 09:13:48 +0000257 unsigned int page_size;
Nico Huber2ae63012026-03-04 21:06:45 +0100258 feature_bits_t feature_bits;
Ronald G. Minnich5e5f75e2002-01-29 18:21:41 +0000259
Nico Huberc3b02dc2023-08-12 01:13:45 +0200260 /* Indicate how well flashprog supports different operations of this flash chip. */
Stefan Tauner6455dff2014-05-26 00:36:24 +0000261 struct tested {
262 enum test_state probe;
263 enum test_state read;
264 enum test_state erase;
265 enum test_state write;
Sergii Dmytrukc720b6e2022-10-06 15:17:52 +0300266 enum test_state wp;
Stefan Tauner6455dff2014-05-26 00:36:24 +0000267 } tested;
Peter Stuge1159d582008-05-03 04:34:37 +0000268
Mike Banon31b5e3b2018-01-15 01:10:00 +0300269 /*
270 * Group chips that have common command sets. This should ensure that
271 * no chip gets confused by a probing command for a very different class
272 * of chips.
273 */
274 enum {
275 /* SPI25 is very common. Keep it at zero so we don't have
276 to specify it for each and every chip in the database.*/
277 SPI25 = 0,
Nico Huber4e6155a2025-01-02 23:05:09 +0100278 SPI25_EEPROM,
Nico Huber54557862023-05-15 12:01:04 +0200279 SPI95,
280 SPI_EDI,
Mike Banon31b5e3b2018-01-15 01:10:00 +0300281 } spi_cmd_set;
282
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +0000283 int (*probe) (struct flashctx *flash);
Maciej Pijankac6e11112009-06-03 14:46:22 +0000284
Stefan Taunerc69c9c82011-11-23 09:13:48 +0000285 /* Delay after "enter/exit ID mode" commands in microseconds.
286 * NB: negative values have special meanings, see TIMING_* below.
287 */
288 signed int probe_timing;
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +0000289
290 /*
Carl-Daniel Hailfinger63ce4bb2009-12-22 13:04:53 +0000291 * Erase blocks and associated erase function. Any chip erase function
292 * is stored as chip-sized virtual block together with said function.
Stefan Taunerc0aaf952011-05-19 02:58:17 +0000293 * The first one that fits will be chosen. There is currently no way to
294 * influence that behaviour. For testing just comment out the other
295 * elements or set the function pointer to NULL.
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +0000296 */
297 struct block_eraser {
Stefan Tauner6697f712014-08-06 15:09:15 +0000298 struct eraseblock {
Stefan Taunerd06d9412011-06-12 19:47:55 +0000299 unsigned int size; /* Eraseblock size in bytes */
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +0000300 unsigned int count; /* Number of contiguous blocks with that size */
301 } eraseblocks[NUM_ERASEREGIONS];
Stefan Tauner355cbfd2011-05-28 02:37:14 +0000302 /* a block_erase function should try to erase one block of size
303 * 'blocklen' at address 'blockaddr' and return 0 on success. */
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +0000304 int (*block_erase) (struct flashctx *flash, unsigned int blockaddr, unsigned int blocklen);
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +0000305 } block_erasers[NUM_ERASEFUNCTIONS];
306
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +0000307 int (*printlock) (struct flashctx *flash);
308 int (*unlock) (struct flashctx *flash);
Mark Marshallf20b7be2014-05-09 21:16:21 +0000309 int (*write) (struct flashctx *flash, const uint8_t *buf, unsigned int start, unsigned int len);
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +0000310 int (*read) (struct flashctx *flash, uint8_t *buf, unsigned int start, unsigned int len);
311 struct voltage {
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000312 uint16_t min;
313 uint16_t max;
314 } voltage;
Stefan Tauner50d67aa2013-03-03 23:49:48 +0000315 enum write_granularity gran;
Nico Huber57dbd642018-03-13 18:01:05 +0100316
Nikolai Artemievc6c3f282021-10-20 23:34:15 +1100317 struct reg_bit_map {
318 /* Status register protection bit (SRP) */
319 struct reg_bit_info srp;
320
321 /* Status register lock bit (SRP) */
322 struct reg_bit_info srl;
323
324 /*
325 * Note: some datasheets refer to configuration bits that
326 * function like TB/SEC/CMP bits as BP bits (e.g. BP3 for a bit
327 * that functions like TB).
328 *
329 * As a convention, any config bit that functions like a
330 * TB/SEC/CMP bit should be assigned to the respective
331 * tb/sec/cmp field in this structure, even if the datasheet
332 * uses a different name.
333 */
334
335 /* Block protection bits (BP) */
336 /* Extra element for terminator */
337 struct reg_bit_info bp[MAX_BP_BITS + 1];
338
339 /* Top/bottom protection bit (TB) */
340 struct reg_bit_info tb;
341
342 /* Sector/block protection bit (SEC) */
343 struct reg_bit_info sec;
344
345 /* Complement bit (CMP) */
346 struct reg_bit_info cmp;
Sergii Dmytruk801fcd02021-12-19 18:45:16 +0200347
348 /* Write Protect Selection (per sector protection when set) */
349 struct reg_bit_info wps;
Nico Huber1412d9f2024-01-06 18:25:49 +0100350
Nico Huberf7e2d972024-01-18 20:28:34 +0100351 /* Quad Enable bit (QE) */
352 struct reg_bit_info qe;
353
Nico Huber1412d9f2024-01-06 18:25:49 +0100354 /*
355 * Dummy cycles config (DC)
356 *
357 * These can control the amount of dummy cycles for various
358 * SPI and QPI commands. We assume that the bits default to
359 * `0' after reset, and that the defaults for SPI commands
360 * match the values that non-configurable chips use (cf.
361 * comment on `union dummy_cycles' below).
362 */
363 struct reg_bit_info dc[2];
Nikolai Artemievc6c3f282021-10-20 23:34:15 +1100364 } reg_bits;
Nikolai Artemievc9feb1b2021-10-21 01:35:13 +1100365
Nico Huber1412d9f2024-01-06 18:25:49 +0100366 /*
367 * SPI modes are assumed to use standard dummy cycles as follows:
368 * o fast read: 8
369 * o fast read dual-output: 8
370 * o fast read dual-in/out: 4
371 * o fast read quad-output: 8
372 * o fast read quad-in/out: 6
373 *
374 * In QPI mode, ...
375 */
376 union {
377 /* ... use either fixed values per instruction: */
378 struct {
379 uint16_t qpi_fast_read:4; /* 0x0b instruction */
380 uint16_t qpi_fast_read_qio:4; /* 0xeb instruction */
381 };
382 /*
383 * or configurable ones where 2 bits in a status/parameter
384 * register encode the number of cycles (00 entry is assumed
385 * as default after reset; used with FEATURE_SET_READ_PARAMS
386 * or DC register bits):
387 */
388 struct {
389 uint16_t clks00:4;
390 uint16_t clks01:4;
391 uint16_t clks10:4;
392 uint16_t clks11:4;
393 } qpi_read_params;
394
395 /*
396 * Whenever FEATURE_SET_READ_PARAMS is set or DC bits
397 * are specified, `.qpi_read_params` will be used with
398 * the fast read quad-i/o (0xeb) instruction.
399 * When not, fast read (0x0b) and fast read quad-i/o (0xeb)
400 * instructions will be enabled when `.qpi_fast_read` and
401 * `.qpi_fast_read_qio` are not `0`, respectively.
402 */
403 } dummy_cycles;
404
Nico Huberaabb3e02023-01-13 00:22:30 +0100405 /* Write WP configuration to the chip */
406 enum flashprog_wp_result (*wp_write_cfg)(struct flashctx *, const struct flashprog_wp_cfg *);
407 /* Read WP configuration from the chip */
408 enum flashprog_wp_result (*wp_read_cfg)(struct flashprog_wp_cfg *, struct flashctx *);
409 /* Get a list of protection ranges supported by the chip */
410 enum flashprog_wp_result (*wp_get_ranges)(struct flashprog_wp_ranges **, struct flashctx *);
Nikolai Artemievc9feb1b2021-10-21 01:35:13 +1100411 /* Function that takes a set of WP config bits (e.g. BP, SEC, TB, etc) */
412 /* and determines what protection range they select. */
413 void (*decode_range)(size_t *start, size_t *len, const struct wp_bits *, size_t chip_len);
Nico Huber901fb952023-01-11 23:24:23 +0100414
415 int (*prepare_access)(struct flashctx *, enum preparation_steps);
416 void (*finish_access)(struct flashctx *);
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +0000417};
Ronald G. Minnicheaab50b2003-09-12 22:41:53 +0000418
Nikolai Artemiev4ad48642020-11-05 13:54:27 +1100419typedef int (*chip_restore_fn_cb_t)(struct flashctx *flash, uint8_t status);
420
Richard Hughes842d6782021-01-15 09:48:12 +0000421struct flashprog_progress {
422 flashprog_progress_callback *callback;
423 enum flashprog_progress_stage stage;
424 size_t current;
425 size_t total;
426 void *user_data;
427};
428
Nico Huber4760b6e2024-01-06 23:45:28 +0100429struct spi_read_op;
430
Nico Huberc3b02dc2023-08-12 01:13:45 +0200431struct flashprog_flashctx {
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +0000432 struct flashchip *chip;
Stefan Tauner4e32ec12014-08-30 23:39:51 +0000433 /* FIXME: The memory mappings should be saved in a more structured way. */
434 /* The physical_* fields store the respective addresses in the physical address space of the CPU. */
435 uintptr_t physical_memory;
Nico Huberc3b02dc2023-08-12 01:13:45 +0200436 /* The virtual_* fields store where the respective physical address is mapped into flashprog's address
Stefan Tauner4e32ec12014-08-30 23:39:51 +0000437 * space. A value equivalent to (chipaddr)ERROR_PTR indicates an invalid mapping (or none at all). */
Carl-Daniel Hailfinger5820f422009-05-16 21:22:56 +0000438 chipaddr virtual_memory;
Stefan Tauner4e32ec12014-08-30 23:39:51 +0000439 /* Some flash devices have an additional register space; semantics are like above. */
440 uintptr_t physical_registers;
Carl-Daniel Hailfinger5820f422009-05-16 21:22:56 +0000441 chipaddr virtual_registers;
Nico Huber9a11cbf2023-01-13 01:19:07 +0100442 union {
Nico Huber5469c152026-02-12 22:56:52 +0100443 struct master_common *common;
Nico Huber9a11cbf2023-01-13 01:19:07 +0100444 struct par_master *par;
445 struct spi_master *spi;
446 struct opaque_master *opaque;
447 } mst;
Nico Huberc3b02dc2023-08-12 01:13:45 +0200448 const struct flashprog_layout *layout;
449 struct flashprog_layout *default_layout;
Nico Huber454f6132012-12-10 13:34:10 +0000450 struct {
451 bool force;
452 bool force_boardmismatch;
453 bool verify_after_write;
454 bool verify_whole_chip;
Nico Huber55e78842024-07-21 00:46:19 +0200455 bool non_volatile_wrsr;
Nico Huber454f6132012-12-10 13:34:10 +0000456 } flags;
Nico Huberf43c6542017-10-14 17:47:28 +0200457 /* We cache the state of the extended address register (highest byte
458 of a 4BA for 3BA instructions) and the state of the 4BA mode here.
459 If possible, we enter 4BA mode early. If that fails, we make use
460 of the extended address register. */
461 int address_high_byte;
462 bool in_4ba_mode;
Nico Huber1b1deda2024-04-18 00:35:48 +0200463 bool in_qpi_mode;
Nico Huber28620112024-07-21 15:43:59 +0200464 bool volatile_qe_enabled;
Nico Huber4760b6e2024-01-06 23:45:28 +0100465 /* For SPI flash chips, we dynamically select the fast-read operation. */
Nico Huber1b1deda2024-04-18 00:35:48 +0200466 struct spi_read_op *spi_fast_read;
Nikolai Artemiev4ad48642020-11-05 13:54:27 +1100467
468 int chip_restore_fn_count;
469 struct chip_restore_func_data {
470 chip_restore_fn_cb_t func;
471 uint8_t status;
472 } chip_restore_fn[MAX_CHIP_RESTORE_FUNCTIONS];
Richard Hughes842d6782021-01-15 09:48:12 +0000473
474 struct flashprog_progress progress;
Ronald G. Minnich5e5f75e2002-01-29 18:21:41 +0000475};
476
Maciej Pijankac6e11112009-06-03 14:46:22 +0000477/* Timing used in probe routines. ZERO is -2 to differentiate between an unset
478 * field and zero delay.
Paul Kocialkowski80ae14e2018-01-15 01:07:46 +0300479 *
Maciej Pijankac6e11112009-06-03 14:46:22 +0000480 * SPI devices will always have zero delay and ignore this field.
481 */
482#define TIMING_FIXME -1
483/* this is intentionally same value as fixme */
484#define TIMING_IGNORED -1
485#define TIMING_ZERO -2
486
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +0000487extern const struct flashchip flashchips[];
Stefan Tauner96658be2014-05-26 22:05:31 +0000488extern const unsigned int flashchips_size;
Ollie Lho184a4042005-11-26 21:55:36 +0000489
Nico Huberfbc41d22026-02-22 23:04:01 +0100490enum wrsr_target {
491 WRSR_VOLATILE_BITS = 1,
492 WRSR_NON_VOLATILE_BITS = 2,
493 WRSR_EITHER = 3,
494};
495static inline enum wrsr_target default_wrsr_target(const struct flashprog_flashctx *flash)
496{
497 return flash->flags.non_volatile_wrsr ? WRSR_NON_VOLATILE_BITS : WRSR_VOLATILE_BITS;
498}
499
500/* spi.c */
501const uint8_t *spi_get_opcode_from_erasefn(erasefunc_t *, bool *native_4ba);
502
503/* spi25.c */
504erasefunc_t *spi25_get_erasefn_from_opcode(uint8_t opcode);
505
Edward O'Callaghan63f6a372022-08-12 12:56:43 +1000506/* parallel.c */
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000507void chip_writeb(const struct flashctx *flash, uint8_t val, chipaddr addr);
508void chip_writew(const struct flashctx *flash, uint16_t val, chipaddr addr);
509void chip_writel(const struct flashctx *flash, uint32_t val, chipaddr addr);
Mark Marshallf20b7be2014-05-09 21:16:21 +0000510void chip_writen(const struct flashctx *flash, const uint8_t *buf, chipaddr addr, size_t len);
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000511uint8_t chip_readb(const struct flashctx *flash, const chipaddr addr);
512uint16_t chip_readw(const struct flashctx *flash, const chipaddr addr);
513uint32_t chip_readl(const struct flashctx *flash, const chipaddr addr);
514void chip_readn(const struct flashctx *flash, uint8_t *buf, const chipaddr addr, size_t len);
515
Uwe Hermannba290d12009-06-17 12:07:12 +0000516/* print.c */
Edward O'Callaghan3b64d812022-08-12 13:07:51 +1000517void print_buildinfo(void);
518void print_version(void);
519void print_banner(void);
Niklas Söderlundede2fa42012-10-23 13:06:46 +0000520int print_supported(void);
Carl-Daniel Hailfingerf5292052009-11-17 09:57:34 +0000521void print_supported_wiki(void);
Uwe Hermann515ab3d2009-05-15 17:02:34 +0000522
Stefan Tauner6ad6e012014-06-12 00:04:32 +0000523/* helpers.c */
Nico Huberaf9d7382023-05-01 13:33:26 +0200524bool flashprog_no_data(const void *raw_data, size_t);
Nico Huber7679b5c2023-04-28 21:48:53 +0000525int flashprog_read_chunked(struct flashctx *, uint8_t *dst, unsigned int start, unsigned int len, unsigned int chunksize, readfunc_t *);
Nico Huberbe42cf22026-02-21 17:40:44 +0100526int flashprog_limit_chip(struct flashctx *);
Stefan Tauner6ad6e012014-06-12 00:04:32 +0000527uint32_t address_to_bits(uint32_t addr);
Nico Huber519be662018-12-23 20:03:35 +0100528unsigned int bitcount(unsigned long a);
529#undef MIN
530#define MIN(a, b) ((a) < (b) ? (a) : (b))
531#undef MAX
532#define MAX(a, b) ((a) > (b) ? (a) : (b))
Stefan Tauner6ad6e012014-06-12 00:04:32 +0000533int max(int a, int b);
534int min(int a, int b);
535char *strcat_realloc(char *dest, const char *src);
536void tolower_string(char *str);
Marc Schink7ecfe482016-03-17 16:07:23 +0100537uint8_t reverse_byte(uint8_t x);
538void reverse_bytes(uint8_t *dst, const uint8_t *src, size_t length);
Stefan Taunerb41d8472014-11-01 22:56:06 +0000539#ifdef __MINGW32__
540char* strtok_r(char *str, const char *delim, char **nextp);
Miklós Márton8900d6c2019-07-30 00:03:22 +0200541char *strndup(const char *str, size_t size);
Stefan Taunerb41d8472014-11-01 22:56:06 +0000542#endif
Nico Huber2d625722016-05-03 10:48:02 +0200543#if defined(__DJGPP__) || (!defined(__LIBPAYLOAD__) && !defined(HAVE_STRNLEN))
Stefan Taunerdc627932015-01-27 18:07:50 +0000544size_t strnlen(const char *str, size_t n);
545#endif
Stefan Tauner6ad6e012014-06-12 00:04:32 +0000546
Nico Huberc3b02dc2023-08-12 01:13:45 +0200547/* flashprog.c */
548extern const char flashprog_version[];
Nico Huberbcb2e5a2012-12-30 01:23:17 +0000549extern const char *chip_to_probe;
Nico Huber2d625722016-05-03 10:48:02 +0200550char *flashbuses_to_text(enum chipbustype bustype);
Stefan Tauner4e32ec12014-08-30 23:39:51 +0000551int map_flash(struct flashctx *flash);
552void unmap_flash(struct flashctx *flash);
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +0000553int read_memmapped(struct flashctx *flash, uint8_t *buf, unsigned int start, unsigned int len);
554int erase_flash(struct flashctx *flash);
Nico Huber9a11cbf2023-01-13 01:19:07 +0100555struct registered_master;
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000556int probe_flash(struct registered_master *mst, int startchip, struct flashctx *fill_flash, int force);
Richard Hughes842d6782021-01-15 09:48:12 +0000557int flashprog_read_range(struct flashctx *, uint8_t *buf, unsigned int start, unsigned int len);
Mark Marshallf20b7be2014-05-09 21:16:21 +0000558int verify_range(struct flashctx *flash, const uint8_t *cmpbuf, unsigned int start, unsigned int len);
Edward O'Callaghanc72d20a2021-12-13 12:30:03 +1100559void emergency_help_message(void);
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +0000560void list_programmers_linebreak(int startcol, int cols, int paren);
Nico Huber32fa5082026-01-26 18:26:49 +0100561int selfcheck_chip(const struct flashchip *, int idx);
Carl-Daniel Hailfingera84835a2010-01-07 03:24:05 +0000562int selfcheck(void);
Stefan Tauner66652442011-06-26 17:38:17 +0000563int read_buf_from_file(unsigned char *buf, unsigned long size, const char *filename);
Mark Marshallf20b7be2014-05-09 21:16:21 +0000564int write_buf_to_file(const unsigned char *buf, unsigned long size, const char *filename);
Nico Huber305f4172013-06-14 11:55:26 +0200565int prepare_flash_access(struct flashctx *, bool read_it, bool write_it, bool erase_it, bool verify_it);
566void finalize_flash_access(struct flashctx *);
Nikolai Artemiev4ad48642020-11-05 13:54:27 +1100567int register_chip_restore(chip_restore_fn_cb_t func, struct flashctx *flash, uint8_t status);
Uwe Hermannba290d12009-06-17 12:07:12 +0000568
Tadas Slotkusad470342011-09-03 17:15:00 +0000569/* Something happened that shouldn't happen, but we can go on. */
Michael Karchera4448d92010-07-22 18:04:15 +0000570#define ERROR_NONFATAL 0x100
571
Tadas Slotkusad470342011-09-03 17:15:00 +0000572/* Something happened that shouldn't happen, we'll abort. */
573#define ERROR_FATAL -0xee
Nico Huberc3b02dc2023-08-12 01:13:45 +0200574#define ERROR_FLASHPROG_BUG -200
575/* We reached one of the hardcoded limits of flashprog. This can be fixed by
Carl-Daniel Hailfingerc40cff72011-12-20 00:19:29 +0000576 * increasing the limit of a compile-time allocation or by switching to dynamic
577 * allocation.
578 * Note: If this warning is triggered, check first for runaway registrations.
579 */
Nico Huberc3b02dc2023-08-12 01:13:45 +0200580#define ERROR_FLASHPROG_LIMIT -201
Tadas Slotkusad470342011-09-03 17:15:00 +0000581
Stefan Tauner9b32de92014-08-08 23:52:33 +0000582/* cli_common.c */
Stefan Tauner9b32de92014-08-08 23:52:33 +0000583void print_chip_support_status(const struct flashchip *chip);
584
Sean Nelson51e97d72010-01-07 20:09:33 +0000585/* cli_output.c */
Nico Huberc3b02dc2023-08-12 01:13:45 +0200586int flashprog_print_cb(enum flashprog_log_level level, const char *fmt, va_list ap);
Richard Hughes842d6782021-01-15 09:48:12 +0000587void flashprog_progress_cb(enum flashprog_progress_stage, size_t current, size_t total, void *user_data);
Carl-Daniel Hailfinger9f5f2152010-06-04 23:20:21 +0000588/* Let gcc and clang check for correct printf-style format strings. */
Nico Huberc3b02dc2023-08-12 01:13:45 +0200589int print(enum flashprog_log_level level, const char *fmt, ...)
Carl-Daniel Hailfinger11990da2013-07-13 23:21:05 +0000590#ifdef __MINGW32__
Antonio Ospiteb6e3d252018-03-03 18:40:24 +0100591# ifndef __MINGW_PRINTF_FORMAT
592# define __MINGW_PRINTF_FORMAT gnu_printf
593# endif
Stefan Taunerf268d8b2017-10-26 18:45:00 +0200594__attribute__((format(__MINGW_PRINTF_FORMAT, 2, 3)));
Carl-Daniel Hailfinger11990da2013-07-13 23:21:05 +0000595#else
596__attribute__((format(printf, 2, 3)));
597#endif
Nico Huberc3b02dc2023-08-12 01:13:45 +0200598#define msg_gerr(...) print(FLASHPROG_MSG_ERROR, __VA_ARGS__) /* general errors */
599#define msg_perr(...) print(FLASHPROG_MSG_ERROR, __VA_ARGS__) /* programmer errors */
600#define msg_cerr(...) print(FLASHPROG_MSG_ERROR, __VA_ARGS__) /* chip errors */
601#define msg_gwarn(...) print(FLASHPROG_MSG_WARN, __VA_ARGS__) /* general warnings */
602#define msg_pwarn(...) print(FLASHPROG_MSG_WARN, __VA_ARGS__) /* programmer warnings */
603#define msg_cwarn(...) print(FLASHPROG_MSG_WARN, __VA_ARGS__) /* chip warnings */
604#define msg_ginfo(...) print(FLASHPROG_MSG_INFO, __VA_ARGS__) /* general info */
605#define msg_pinfo(...) print(FLASHPROG_MSG_INFO, __VA_ARGS__) /* programmer info */
606#define msg_cinfo(...) print(FLASHPROG_MSG_INFO, __VA_ARGS__) /* chip info */
607#define msg_gdbg(...) print(FLASHPROG_MSG_DEBUG, __VA_ARGS__) /* general debug */
608#define msg_pdbg(...) print(FLASHPROG_MSG_DEBUG, __VA_ARGS__) /* programmer debug */
609#define msg_cdbg(...) print(FLASHPROG_MSG_DEBUG, __VA_ARGS__) /* chip debug */
610#define msg_gdbg2(...) print(FLASHPROG_MSG_DEBUG2, __VA_ARGS__) /* general debug2 */
611#define msg_pdbg2(...) print(FLASHPROG_MSG_DEBUG2, __VA_ARGS__) /* programmer debug2 */
612#define msg_cdbg2(...) print(FLASHPROG_MSG_DEBUG2, __VA_ARGS__) /* chip debug2 */
613#define msg_gspew(...) print(FLASHPROG_MSG_SPEW, __VA_ARGS__) /* general debug spew */
614#define msg_pspew(...) print(FLASHPROG_MSG_SPEW, __VA_ARGS__) /* programmer debug spew */
615#define msg_cspew(...) print(FLASHPROG_MSG_SPEW, __VA_ARGS__) /* chip debug spew */
Richard Hughes842d6782021-01-15 09:48:12 +0000616void flashprog_progress_add(struct flashprog_flashctx *, size_t progress);
Sean Nelson51e97d72010-01-07 20:09:33 +0000617
Carl-Daniel Hailfingerc40cff72011-12-20 00:19:29 +0000618enum chipbustype get_buses_supported(void);
Ollie Lho761bf1b2004-03-20 16:46:10 +0000619#endif /* !__FLASH_H__ */