blob: 5cb7040e9494d9f12ef55058c8a09d33e223c022 [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 *
Uwe Hermannd1107642007-08-29 17:52:32 +000019 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Adam Kaufman064b1f22007-02-06 19:47:50 +000022 */
23
Ronald G. Minnicheaab50b2003-09-12 22:41:53 +000024#ifndef __FLASH_H__
25#define __FLASH_H__ 1
26
Stefan Taunerb0eee9b2015-01-10 09:32:50 +000027#include "platform.h"
28
Stefan Tauner0466c812013-06-16 10:30:08 +000029#include <inttypes.h>
Carl-Daniel Hailfinger11990da2013-07-13 23:21:05 +000030#include <stdio.h>
Ollie Lho184a4042005-11-26 21:55:36 +000031#include <stdint.h>
Carl-Daniel Hailfingerdd128c92010-06-03 00:49:50 +000032#include <stddef.h>
Nico Huber18781102012-12-10 13:34:12 +000033#include <stdarg.h>
Stefan Tauner682122b2013-06-23 22:15:39 +000034#include <stdbool.h>
Stefan Taunerb0eee9b2015-01-10 09:32:50 +000035#if IS_WINDOWS
Patrick Georgie48654c2010-01-06 22:14:39 +000036#include <windows.h>
37#undef min
38#undef max
39#endif
Andriy Gapon65c1b862008-05-22 13:22:45 +000040
Nico Huberd152fb92017-06-19 12:57:10 +020041#include "libflashrom.h"
Nico Huber3a9939b2016-04-27 15:56:14 +020042#include "layout.h"
43
Patrick Georgied7a9642010-09-25 22:53:44 +000044#define ERROR_PTR ((void*)-1)
45
Carl-Daniel Hailfinger174f55b2010-10-08 00:37:55 +000046/* Error codes */
Carl-Daniel Hailfinger316fdfb2012-06-08 15:27:47 +000047#define ERROR_OOM -100
Carl-Daniel Hailfinger174f55b2010-10-08 00:37:55 +000048#define TIMEOUT_ERROR -101
49
Stefan Taunerc2333752013-07-13 23:31:37 +000050/* TODO: check using code for correct usage of types */
51typedef uintptr_t chipaddr;
Stefan Tauner305e0b92013-07-17 23:46:44 +000052#define PRIxPTR_WIDTH ((int)(sizeof(uintptr_t)*2))
Carl-Daniel Hailfinger5820f422009-05-16 21:22:56 +000053
David Hendricks8bb20212011-06-14 01:35:36 +000054int register_shutdown(int (*function) (void *data), void *data);
Stefan Tauner2a1ed772014-08-31 00:09:21 +000055int shutdown_free(void *data);
Stefan Tauner305e0b92013-07-17 23:46:44 +000056void *programmer_map_flash_region(const char *descr, uintptr_t phys_addr, size_t len);
Uwe Hermann09e04f72009-05-16 22:36:00 +000057void programmer_unmap_flash_region(void *virt_addr, size_t len);
Stefan Taunerf80419c2014-05-02 15:41:42 +000058void programmer_delay(unsigned int usecs);
Carl-Daniel Hailfinger61a8bd22009-03-05 19:24:22 +000059
Uwe Hermanne5ac1642008-03-12 11:54:51 +000060#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
61
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +000062enum chipbustype {
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000063 BUS_NONE = 0,
64 BUS_PARALLEL = 1 << 0,
65 BUS_LPC = 1 << 1,
66 BUS_FWH = 1 << 2,
67 BUS_SPI = 1 << 3,
Carl-Daniel Hailfinger532c7172011-11-04 21:35:26 +000068 BUS_PROG = 1 << 4,
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000069 BUS_NONSPI = BUS_PARALLEL | BUS_LPC | BUS_FWH,
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +000070};
71
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +000072/*
Stefan Tauner02437452013-04-01 19:34:53 +000073 * The following enum defines possible write granularities of flash chips. These tend to reflect the properties
74 * of the actual hardware not necesserily the write function(s) defined by the respective struct flashchip.
75 * The latter might (and should) be more precisely specified, e.g. they might bail out early if their execution
76 * would result in undefined chip contents.
Stefan Taunereb582572012-09-21 12:52:50 +000077 */
78enum write_granularity {
Stefan Tauner02437452013-04-01 19:34:53 +000079 /* We assume 256 byte granularity by default. */
80 write_gran_256bytes = 0,/* If less than 256 bytes are written, the unwritten bytes are undefined. */
81 write_gran_1bit, /* Each bit can be cleared individually. */
82 write_gran_1byte, /* A byte can be written once. Further writes to an already written byte cause
83 * its contents to be either undefined or to stay unchanged. */
Paul Kocialkowskic8305e12015-10-16 02:16:20 +000084 write_gran_128bytes, /* If less than 128 bytes are written, the unwritten bytes are undefined. */
Stefan Tauner02437452013-04-01 19:34:53 +000085 write_gran_264bytes, /* If less than 264 bytes are written, the unwritten bytes are undefined. */
86 write_gran_512bytes, /* If less than 512 bytes are written, the unwritten bytes are undefined. */
87 write_gran_528bytes, /* If less than 528 bytes are written, the unwritten bytes are undefined. */
88 write_gran_1024bytes, /* If less than 1024 bytes are written, the unwritten bytes are undefined. */
89 write_gran_1056bytes, /* If less than 1056 bytes are written, the unwritten bytes are undefined. */
Carl-Daniel Hailfinger1b0e9fc2014-06-16 22:36:17 +000090 write_gran_1byte_implicit_erase, /* EEPROMs and other chips with implicit erase and 1-byte writes. */
Stefan Taunereb582572012-09-21 12:52:50 +000091};
92
93/*
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +000094 * How many different contiguous runs of erase blocks with one size each do
95 * we have for a given erase function?
96 */
97#define NUM_ERASEREGIONS 5
98
99/*
100 * How many different erase functions do we have per chip?
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +0000101 * Atmel AT25FS010 has 6 different functions.
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +0000102 */
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +0000103#define NUM_ERASEFUNCTIONS 6
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +0000104
Stefan Tauner0554ca52013-07-25 22:54:25 +0000105/* Feature bits used for non-SPI only */
Carl-Daniel Hailfinger4bf4e792010-01-09 03:15:50 +0000106#define FEATURE_REGISTERMAP (1 << 0)
Sean Nelson35727f72010-01-28 23:55:12 +0000107#define FEATURE_LONG_RESET (0 << 4)
108#define FEATURE_SHORT_RESET (1 << 4)
109#define FEATURE_EITHER_RESET FEATURE_LONG_RESET
Sean Nelsonf59e2632010-10-20 21:13:19 +0000110#define FEATURE_RESET_MASK (FEATURE_LONG_RESET | FEATURE_SHORT_RESET)
Carl-Daniel Hailfinger4bf4e792010-01-09 03:15:50 +0000111#define FEATURE_ADDR_FULL (0 << 2)
112#define FEATURE_ADDR_MASK (3 << 2)
Sean Nelson35727f72010-01-28 23:55:12 +0000113#define FEATURE_ADDR_2AA (1 << 2)
114#define FEATURE_ADDR_AAA (2 << 2)
Michael Karcherad0010a2010-04-03 10:27:08 +0000115#define FEATURE_ADDR_SHIFTED (1 << 5)
Stefan Tauner0554ca52013-07-25 22:54:25 +0000116/* Feature bits used for SPI only */
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +0000117#define FEATURE_WRSR_EWSR (1 << 6)
118#define FEATURE_WRSR_WREN (1 << 7)
Stefan Tauner0554ca52013-07-25 22:54:25 +0000119#define FEATURE_WRSR_EITHER (FEATURE_WRSR_EWSR | FEATURE_WRSR_WREN)
Daniel Lenski65922a32012-02-15 23:40:23 +0000120#define FEATURE_OTP (1 << 8)
Vincent Palatinf800f552013-03-15 02:03:16 +0000121#define FEATURE_QPI (1 << 9)
Ed Swierkcc20a9b2017-07-03 13:17:18 -0700122#define FEATURE_4BA_SUPPORT (1 << 10)
Nico Huberf43c6542017-10-14 17:47:28 +0200123#define FEATURE_4BA_EXT_ADDR (1 << 11) /**< Regular 3-byte operations can be used by writing the most
124 significant address byte into an extended address register. */
Sean Nelsonc57a9202010-01-04 17:15:23 +0000125
Stefan Tauner6455dff2014-05-26 00:36:24 +0000126enum test_state {
127 OK = 0,
128 NT = 1, /* Not tested */
129 BAD, /* Known to not work */
130 DEP, /* Support depends on configuration (e.g. Intel flash descriptor) */
131 NA, /* Not applicable (e.g. write support on ROM chips) */
132};
133
134#define TEST_UNTESTED (struct tested){ .probe = NT, .read = NT, .erase = NT, .write = NT }
135
136#define TEST_OK_PROBE (struct tested){ .probe = OK, .read = NT, .erase = NT, .write = NT }
137#define TEST_OK_PR (struct tested){ .probe = OK, .read = OK, .erase = NT, .write = NT }
138#define TEST_OK_PRE (struct tested){ .probe = OK, .read = OK, .erase = OK, .write = NT }
139#define TEST_OK_PREW (struct tested){ .probe = OK, .read = OK, .erase = OK, .write = OK }
140
141#define TEST_BAD_PROBE (struct tested){ .probe = BAD, .read = NT, .erase = NT, .write = NT }
142#define TEST_BAD_PR (struct tested){ .probe = BAD, .read = BAD, .erase = NT, .write = NT }
143#define TEST_BAD_PRE (struct tested){ .probe = BAD, .read = BAD, .erase = BAD, .write = NT }
144#define TEST_BAD_PREW (struct tested){ .probe = BAD, .read = BAD, .erase = BAD, .write = BAD }
145
Nico Huber454f6132012-12-10 13:34:10 +0000146struct flashrom_flashctx;
147#define flashctx flashrom_flashctx /* TODO: Agree on a name and convert all occurences. */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +0000148typedef int (erasefunc_t)(struct flashctx *flash, unsigned int addr, unsigned int blocklen);
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +0000149
Ronald G. Minnich5e5f75e2002-01-29 18:21:41 +0000150struct flashchip {
Uwe Hermann76158682008-03-14 23:55:58 +0000151 const char *vendor;
Uwe Hermann372eeb52007-12-04 21:49:06 +0000152 const char *name;
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +0000153
154 enum chipbustype bustype;
155
Uwe Hermann394131e2008-10-18 21:14:13 +0000156 /*
157 * With 32bit manufacture_id and model_id we can cover IDs up to
Carl-Daniel Hailfingerae8afa92007-12-31 01:49:00 +0000158 * (including) the 4th bank of JEDEC JEP106W Standard Manufacturer's
159 * Identification code.
160 */
161 uint32_t manufacture_id;
162 uint32_t model_id;
Ronald G. Minnich5e5f75e2002-01-29 18:21:41 +0000163
Stefan Taunerc0aaf952011-05-19 02:58:17 +0000164 /* Total chip size in kilobytes */
Stefan Taunerc69c9c82011-11-23 09:13:48 +0000165 unsigned int total_size;
Stefan Taunerc0aaf952011-05-19 02:58:17 +0000166 /* Chip page size in bytes */
Stefan Taunerc69c9c82011-11-23 09:13:48 +0000167 unsigned int page_size;
Sean Nelsonc57a9202010-01-04 17:15:23 +0000168 int feature_bits;
Ronald G. Minnich5e5f75e2002-01-29 18:21:41 +0000169
Boris Baykov99127182016-06-11 18:29:00 +0200170 /* set of function pointers to use in 4-bytes addressing mode */
171 struct four_bytes_addr_funcs_set {
Ed Swierkcc20a9b2017-07-03 13:17:18 -0700172 int (*set_4ba) (struct flashctx *flash);
Boris Baykov99127182016-06-11 18:29:00 +0200173 int (*read_nbyte) (struct flashctx *flash, unsigned int addr, uint8_t *bytes, unsigned int len);
174 int (*program_byte) (struct flashctx *flash, unsigned int addr, const uint8_t databyte);
175 int (*program_nbyte) (struct flashctx *flash, unsigned int addr, const uint8_t *bytes, unsigned int len);
176 } four_bytes_addr_funcs;
177
Stefan Tauner6455dff2014-05-26 00:36:24 +0000178 /* Indicate how well flashrom supports different operations of this flash chip. */
179 struct tested {
180 enum test_state probe;
181 enum test_state read;
182 enum test_state erase;
183 enum test_state write;
184 } tested;
Peter Stuge1159d582008-05-03 04:34:37 +0000185
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +0000186 int (*probe) (struct flashctx *flash);
Maciej Pijankac6e11112009-06-03 14:46:22 +0000187
Stefan Taunerc69c9c82011-11-23 09:13:48 +0000188 /* Delay after "enter/exit ID mode" commands in microseconds.
189 * NB: negative values have special meanings, see TIMING_* below.
190 */
191 signed int probe_timing;
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +0000192
193 /*
Carl-Daniel Hailfinger63ce4bb2009-12-22 13:04:53 +0000194 * Erase blocks and associated erase function. Any chip erase function
195 * is stored as chip-sized virtual block together with said function.
Stefan Taunerc0aaf952011-05-19 02:58:17 +0000196 * The first one that fits will be chosen. There is currently no way to
197 * influence that behaviour. For testing just comment out the other
198 * elements or set the function pointer to NULL.
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +0000199 */
200 struct block_eraser {
Stefan Tauner6697f712014-08-06 15:09:15 +0000201 struct eraseblock {
Stefan Taunerd06d9412011-06-12 19:47:55 +0000202 unsigned int size; /* Eraseblock size in bytes */
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +0000203 unsigned int count; /* Number of contiguous blocks with that size */
204 } eraseblocks[NUM_ERASEREGIONS];
Stefan Tauner355cbfd2011-05-28 02:37:14 +0000205 /* a block_erase function should try to erase one block of size
206 * 'blocklen' at address 'blockaddr' and return 0 on success. */
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +0000207 int (*block_erase) (struct flashctx *flash, unsigned int blockaddr, unsigned int blocklen);
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +0000208 } block_erasers[NUM_ERASEFUNCTIONS];
209
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +0000210 int (*printlock) (struct flashctx *flash);
211 int (*unlock) (struct flashctx *flash);
Mark Marshallf20b7be2014-05-09 21:16:21 +0000212 int (*write) (struct flashctx *flash, const uint8_t *buf, unsigned int start, unsigned int len);
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +0000213 int (*read) (struct flashctx *flash, uint8_t *buf, unsigned int start, unsigned int len);
214 struct voltage {
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000215 uint16_t min;
216 uint16_t max;
217 } voltage;
Stefan Tauner50d67aa2013-03-03 23:49:48 +0000218 enum write_granularity gran;
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +0000219};
Ronald G. Minnicheaab50b2003-09-12 22:41:53 +0000220
Nico Huber454f6132012-12-10 13:34:10 +0000221struct flashrom_flashctx {
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +0000222 struct flashchip *chip;
Stefan Tauner4e32ec12014-08-30 23:39:51 +0000223 /* FIXME: The memory mappings should be saved in a more structured way. */
224 /* The physical_* fields store the respective addresses in the physical address space of the CPU. */
225 uintptr_t physical_memory;
226 /* The virtual_* fields store where the respective physical address is mapped into flashrom's address
227 * space. A value equivalent to (chipaddr)ERROR_PTR indicates an invalid mapping (or none at all). */
Carl-Daniel Hailfinger5820f422009-05-16 21:22:56 +0000228 chipaddr virtual_memory;
Stefan Tauner4e32ec12014-08-30 23:39:51 +0000229 /* Some flash devices have an additional register space; semantics are like above. */
230 uintptr_t physical_registers;
Carl-Daniel Hailfinger5820f422009-05-16 21:22:56 +0000231 chipaddr virtual_registers;
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000232 struct registered_master *mst;
Nico Huber7af0e792016-04-29 16:40:15 +0200233 const struct flashrom_layout *layout;
234 struct single_layout fallback_layout;
Nico Huber454f6132012-12-10 13:34:10 +0000235 struct {
236 bool force;
237 bool force_boardmismatch;
238 bool verify_after_write;
239 bool verify_whole_chip;
240 } flags;
Nico Huberf43c6542017-10-14 17:47:28 +0200241 /* We cache the state of the extended address register (highest byte
242 of a 4BA for 3BA instructions) and the state of the 4BA mode here.
243 If possible, we enter 4BA mode early. If that fails, we make use
244 of the extended address register. */
245 int address_high_byte;
246 bool in_4ba_mode;
Ronald G. Minnich5e5f75e2002-01-29 18:21:41 +0000247};
248
Maciej Pijankac6e11112009-06-03 14:46:22 +0000249/* Timing used in probe routines. ZERO is -2 to differentiate between an unset
250 * field and zero delay.
251 *
252 * SPI devices will always have zero delay and ignore this field.
253 */
254#define TIMING_FIXME -1
255/* this is intentionally same value as fixme */
256#define TIMING_IGNORED -1
257#define TIMING_ZERO -2
258
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +0000259extern const struct flashchip flashchips[];
Stefan Tauner96658be2014-05-26 22:05:31 +0000260extern const unsigned int flashchips_size;
Ollie Lho184a4042005-11-26 21:55:36 +0000261
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000262void chip_writeb(const struct flashctx *flash, uint8_t val, chipaddr addr);
263void chip_writew(const struct flashctx *flash, uint16_t val, chipaddr addr);
264void chip_writel(const struct flashctx *flash, uint32_t val, chipaddr addr);
Mark Marshallf20b7be2014-05-09 21:16:21 +0000265void chip_writen(const struct flashctx *flash, const uint8_t *buf, chipaddr addr, size_t len);
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000266uint8_t chip_readb(const struct flashctx *flash, const chipaddr addr);
267uint16_t chip_readw(const struct flashctx *flash, const chipaddr addr);
268uint32_t chip_readl(const struct flashctx *flash, const chipaddr addr);
269void chip_readn(const struct flashctx *flash, uint8_t *buf, const chipaddr addr, size_t len);
270
Uwe Hermannba290d12009-06-17 12:07:12 +0000271/* print.c */
Niklas Söderlundede2fa42012-10-23 13:06:46 +0000272int print_supported(void);
Carl-Daniel Hailfingerf5292052009-11-17 09:57:34 +0000273void print_supported_wiki(void);
Uwe Hermann515ab3d2009-05-15 17:02:34 +0000274
Stefan Tauner6ad6e012014-06-12 00:04:32 +0000275/* helpers.c */
276uint32_t address_to_bits(uint32_t addr);
277int bitcount(unsigned long a);
278int max(int a, int b);
279int min(int a, int b);
280char *strcat_realloc(char *dest, const char *src);
281void tolower_string(char *str);
Stefan Taunerb41d8472014-11-01 22:56:06 +0000282#ifdef __MINGW32__
283char* strtok_r(char *str, const char *delim, char **nextp);
284#endif
Nico Huber2d625722016-05-03 10:48:02 +0200285#if defined(__DJGPP__) || (!defined(__LIBPAYLOAD__) && !defined(HAVE_STRNLEN))
Stefan Taunerdc627932015-01-27 18:07:50 +0000286size_t strnlen(const char *str, size_t n);
287#endif
Stefan Tauner6ad6e012014-06-12 00:04:32 +0000288
Uwe Hermann0846f892007-08-23 13:34:59 +0000289/* flashrom.c */
Mathias Krausea60faab2011-01-17 07:50:42 +0000290extern const char flashrom_version[];
Nico Huberbcb2e5a2012-12-30 01:23:17 +0000291extern const char *chip_to_probe;
Nico Huber2d625722016-05-03 10:48:02 +0200292char *flashbuses_to_text(enum chipbustype bustype);
Stefan Tauner4e32ec12014-08-30 23:39:51 +0000293int map_flash(struct flashctx *flash);
294void unmap_flash(struct flashctx *flash);
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +0000295int read_memmapped(struct flashctx *flash, uint8_t *buf, unsigned int start, unsigned int len);
296int erase_flash(struct flashctx *flash);
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000297int probe_flash(struct registered_master *mst, int startchip, struct flashctx *fill_flash, int force);
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +0000298int read_flash_to_file(struct flashctx *flash, const char *filename);
Nico Huberbcb2e5a2012-12-30 01:23:17 +0000299char *extract_param(const char *const *haystack, const char *needle, const char *delim);
Mark Marshallf20b7be2014-05-09 21:16:21 +0000300int verify_range(struct flashctx *flash, const uint8_t *cmpbuf, unsigned int start, unsigned int len);
301int need_erase(const uint8_t *have, const uint8_t *want, unsigned int len, enum write_granularity gran);
Carl-Daniel Hailfingera84835a2010-01-07 03:24:05 +0000302void print_version(void);
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +0000303void print_buildinfo(void);
Carl-Daniel Hailfinger8841d3e2010-05-15 15:04:37 +0000304void print_banner(void);
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +0000305void list_programmers_linebreak(int startcol, int cols, int paren);
Carl-Daniel Hailfingera84835a2010-01-07 03:24:05 +0000306int selfcheck(void);
Stefan Tauner66652442011-06-26 17:38:17 +0000307int read_buf_from_file(unsigned char *buf, unsigned long size, const char *filename);
Mark Marshallf20b7be2014-05-09 21:16:21 +0000308int write_buf_to_file(const unsigned char *buf, unsigned long size, const char *filename);
Nico Huber305f4172013-06-14 11:55:26 +0200309int prepare_flash_access(struct flashctx *, bool read_it, bool write_it, bool erase_it, bool verify_it);
310void finalize_flash_access(struct flashctx *);
Nico Huber899e4ec2016-04-29 18:39:01 +0200311int do_read(struct flashctx *, const char *filename);
312int do_erase(struct flashctx *);
313int do_write(struct flashctx *, const char *const filename);
314int do_verify(struct flashctx *, const char *const filename);
Uwe Hermannba290d12009-06-17 12:07:12 +0000315
Tadas Slotkusad470342011-09-03 17:15:00 +0000316/* Something happened that shouldn't happen, but we can go on. */
Michael Karchera4448d92010-07-22 18:04:15 +0000317#define ERROR_NONFATAL 0x100
318
Tadas Slotkusad470342011-09-03 17:15:00 +0000319/* Something happened that shouldn't happen, we'll abort. */
320#define ERROR_FATAL -0xee
Carl-Daniel Hailfingerc40cff72011-12-20 00:19:29 +0000321#define ERROR_FLASHROM_BUG -200
322/* We reached one of the hardcoded limits of flashrom. This can be fixed by
323 * increasing the limit of a compile-time allocation or by switching to dynamic
324 * allocation.
325 * Note: If this warning is triggered, check first for runaway registrations.
326 */
327#define ERROR_FLASHROM_LIMIT -201
Tadas Slotkusad470342011-09-03 17:15:00 +0000328
Stefan Tauner9b32de92014-08-08 23:52:33 +0000329/* cli_common.c */
Stefan Tauner9b32de92014-08-08 23:52:33 +0000330void print_chip_support_status(const struct flashchip *chip);
331
Sean Nelson51e97d72010-01-07 20:09:33 +0000332/* cli_output.c */
Nico Huberd152fb92017-06-19 12:57:10 +0200333extern enum flashrom_log_level verbose_screen;
334extern enum flashrom_log_level verbose_logfile;
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +0000335#ifndef STANDALONE
336int open_logfile(const char * const filename);
337int close_logfile(void);
338void start_logging(void);
339#endif
Nico Huberd152fb92017-06-19 12:57:10 +0200340int flashrom_print_cb(enum flashrom_log_level level, const char *fmt, va_list ap);
Carl-Daniel Hailfinger9f5f2152010-06-04 23:20:21 +0000341/* Let gcc and clang check for correct printf-style format strings. */
Nico Huberd152fb92017-06-19 12:57:10 +0200342int print(enum flashrom_log_level level, const char *fmt, ...)
Carl-Daniel Hailfinger11990da2013-07-13 23:21:05 +0000343#ifdef __MINGW32__
Stefan Taunerf268d8b2017-10-26 18:45:00 +0200344__attribute__((format(__MINGW_PRINTF_FORMAT, 2, 3)));
Carl-Daniel Hailfinger11990da2013-07-13 23:21:05 +0000345#else
346__attribute__((format(printf, 2, 3)));
347#endif
Nico Huberd152fb92017-06-19 12:57:10 +0200348#define msg_gerr(...) print(FLASHROM_MSG_ERROR, __VA_ARGS__) /* general errors */
349#define msg_perr(...) print(FLASHROM_MSG_ERROR, __VA_ARGS__) /* programmer errors */
350#define msg_cerr(...) print(FLASHROM_MSG_ERROR, __VA_ARGS__) /* chip errors */
351#define msg_gwarn(...) print(FLASHROM_MSG_WARN, __VA_ARGS__) /* general warnings */
352#define msg_pwarn(...) print(FLASHROM_MSG_WARN, __VA_ARGS__) /* programmer warnings */
353#define msg_cwarn(...) print(FLASHROM_MSG_WARN, __VA_ARGS__) /* chip warnings */
354#define msg_ginfo(...) print(FLASHROM_MSG_INFO, __VA_ARGS__) /* general info */
355#define msg_pinfo(...) print(FLASHROM_MSG_INFO, __VA_ARGS__) /* programmer info */
356#define msg_cinfo(...) print(FLASHROM_MSG_INFO, __VA_ARGS__) /* chip info */
357#define msg_gdbg(...) print(FLASHROM_MSG_DEBUG, __VA_ARGS__) /* general debug */
358#define msg_pdbg(...) print(FLASHROM_MSG_DEBUG, __VA_ARGS__) /* programmer debug */
359#define msg_cdbg(...) print(FLASHROM_MSG_DEBUG, __VA_ARGS__) /* chip debug */
360#define msg_gdbg2(...) print(FLASHROM_MSG_DEBUG2, __VA_ARGS__) /* general debug2 */
361#define msg_pdbg2(...) print(FLASHROM_MSG_DEBUG2, __VA_ARGS__) /* programmer debug2 */
362#define msg_cdbg2(...) print(FLASHROM_MSG_DEBUG2, __VA_ARGS__) /* chip debug2 */
363#define msg_gspew(...) print(FLASHROM_MSG_SPEW, __VA_ARGS__) /* general debug spew */
364#define msg_pspew(...) print(FLASHROM_MSG_SPEW, __VA_ARGS__) /* programmer debug spew */
365#define msg_cspew(...) print(FLASHROM_MSG_SPEW, __VA_ARGS__) /* chip debug spew */
Sean Nelson51e97d72010-01-07 20:09:33 +0000366
Uwe Hermann0846f892007-08-23 13:34:59 +0000367/* layout.c */
Louis Yung-Chieh Lo9bcf2682011-12-25 09:12:16 +0000368int register_include_arg(char *name);
Mark Marshallf20b7be2014-05-09 21:16:21 +0000369int read_romlayout(const char *name);
Stefan Tauner8268fdb2013-09-23 14:21:06 +0000370int normalize_romentries(const struct flashctx *flash);
Stefan Tauner949ccc82013-09-15 14:01:06 +0000371void layout_cleanup(void);
Uwe Hermann0846f892007-08-23 13:34:59 +0000372
Carl-Daniel Hailfinger00f911e2007-10-15 21:44:47 +0000373/* spi.c */
Carl-Daniel Hailfingerd0478292009-07-10 21:08:55 +0000374struct spi_command {
375 unsigned int writecnt;
376 unsigned int readcnt;
377 const unsigned char *writearr;
378 unsigned char *readarr;
379};
Nico Hubera3140d02017-10-15 11:20:58 +0200380#define NULL_SPI_CMD { 0, 0, NULL, NULL, }
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000381int spi_send_command(struct flashctx *flash, unsigned int writecnt, unsigned int readcnt, const unsigned char *writearr, unsigned char *readarr);
382int spi_send_multicommand(struct flashctx *flash, struct spi_command *cmds);
383uint32_t spi_get_valid_read_addr(struct flashctx *flash);
Mats Erik Andersson44e1a192008-09-26 13:19:02 +0000384
Carl-Daniel Hailfingerc40cff72011-12-20 00:19:29 +0000385enum chipbustype get_buses_supported(void);
Ollie Lho761bf1b2004-03-20 16:46:10 +0000386#endif /* !__FLASH_H__ */