source: trunk/flash.h

Last change on this file was 1678, checked in by stefanct, 45 hours ago

sbxxx: spibar[0] debug print refinements.

Newer models support a 66 MHz clock and fast reads.
We should probably distinguish the models better (as we do in ichspi)
and add support for frequency selection etc. For now this has to
suffice.

Signed-off-by: Stefan Tauner <stefan.tauner@…>
Acked-by: Stefan Tauner <stefan.tauner@…>

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 12.3 KB
Line 
1/*
2 * This file is part of the flashrom project.
3 *
4 * Copyright (C) 2000 Silicon Integrated System Corporation
5 * Copyright (C) 2000 Ronald G. Minnich <rminnich@gmail.com>
6 * Copyright (C) 2005-2009 coresystems GmbH
7 * Copyright (C) 2006-2009 Carl-Daniel Hailfinger
8 *
9 * 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.
13 *
14 * 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.
18 *
19 * 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
22 */
23
24#ifndef __FLASH_H__
25#define __FLASH_H__ 1
26
27#include <inttypes.h>
28#include <stdint.h>
29#include <stddef.h>
30#ifdef _WIN32
31#include <windows.h>
32#undef min
33#undef max
34#endif
35
36#define ERROR_PTR ((void*)-1)
37
38/* Error codes */
39#define ERROR_OOM       -100
40#define TIMEOUT_ERROR   -101
41
42typedef unsigned long chipaddr;
43
44int register_shutdown(int (*function) (void *data), void *data);
45void *programmer_map_flash_region(const char *descr, unsigned long phys_addr,
46                                  size_t len);
47void programmer_unmap_flash_region(void *virt_addr, size_t len);
48void programmer_delay(int usecs);
49
50#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
51
52enum chipbustype {
53        BUS_NONE        = 0,
54        BUS_PARALLEL    = 1 << 0,
55        BUS_LPC         = 1 << 1,
56        BUS_FWH         = 1 << 2,
57        BUS_SPI         = 1 << 3,
58        BUS_PROG        = 1 << 4,
59        BUS_NONSPI      = BUS_PARALLEL | BUS_LPC | BUS_FWH,
60};
61
62/*
63 * The following enum defines possible write granularities of flash chips. These tend to reflect the properties
64 * of the actual hardware not necesserily the write function(s) defined by the respective struct flashchip.
65 * The latter might (and should) be more precisely specified, e.g. they might bail out early if their execution
66 * would result in undefined chip contents.
67 */
68enum write_granularity {
69        /* We assume 256 byte granularity by default. */
70        write_gran_256bytes = 0,/* If less than 256 bytes are written, the unwritten bytes are undefined. */
71        write_gran_1bit,        /* Each bit can be cleared individually. */
72        write_gran_1byte,       /* A byte can be written once. Further writes to an already written byte cause
73                                 * its contents to be either undefined or to stay unchanged. */
74        write_gran_264bytes,    /* If less than 264 bytes are written, the unwritten bytes are undefined. */
75        write_gran_512bytes,    /* If less than 512 bytes are written, the unwritten bytes are undefined. */
76        write_gran_528bytes,    /* If less than 528 bytes are written, the unwritten bytes are undefined. */
77        write_gran_1024bytes,   /* If less than 1024 bytes are written, the unwritten bytes are undefined. */
78        write_gran_1056bytes,   /* If less than 1056 bytes are written, the unwritten bytes are undefined. */
79};
80
81/*
82 * How many different contiguous runs of erase blocks with one size each do
83 * we have for a given erase function?
84 */
85#define NUM_ERASEREGIONS 5
86
87/*
88 * How many different erase functions do we have per chip?
89 * Atmel AT25FS010 has 6 different functions.
90 */
91#define NUM_ERASEFUNCTIONS 6
92
93#define FEATURE_REGISTERMAP     (1 << 0)
94#define FEATURE_BYTEWRITES      (1 << 1)
95#define FEATURE_LONG_RESET      (0 << 4)
96#define FEATURE_SHORT_RESET     (1 << 4)
97#define FEATURE_EITHER_RESET    FEATURE_LONG_RESET
98#define FEATURE_RESET_MASK      (FEATURE_LONG_RESET | FEATURE_SHORT_RESET)
99#define FEATURE_ADDR_FULL       (0 << 2)
100#define FEATURE_ADDR_MASK       (3 << 2)
101#define FEATURE_ADDR_2AA        (1 << 2)
102#define FEATURE_ADDR_AAA        (2 << 2)
103#define FEATURE_ADDR_SHIFTED    (1 << 5)
104#define FEATURE_WRSR_EWSR       (1 << 6)
105#define FEATURE_WRSR_WREN       (1 << 7)
106#define FEATURE_OTP             (1 << 8)
107#define FEATURE_QPI             (1 << 9)
108#define FEATURE_WRSR_EITHER     (FEATURE_WRSR_EWSR | FEATURE_WRSR_WREN)
109
110struct flashctx;
111typedef int (erasefunc_t)(struct flashctx *flash, unsigned int addr, unsigned int blocklen);
112
113struct flashchip {
114        const char *vendor;
115        const char *name;
116
117        enum chipbustype bustype;
118
119        /*
120         * With 32bit manufacture_id and model_id we can cover IDs up to
121         * (including) the 4th bank of JEDEC JEP106W Standard Manufacturer's
122         * Identification code.
123         */
124        uint32_t manufacture_id;
125        uint32_t model_id;
126
127        /* Total chip size in kilobytes */
128        unsigned int total_size;
129        /* Chip page size in bytes */
130        unsigned int page_size;
131        int feature_bits;
132
133        /*
134         * Indicate if flashrom has been tested with this flash chip and if
135         * everything worked correctly.
136         */
137        uint32_t tested;
138
139        int (*probe) (struct flashctx *flash);
140
141        /* Delay after "enter/exit ID mode" commands in microseconds.
142         * NB: negative values have special meanings, see TIMING_* below.
143         */
144        signed int probe_timing;
145
146        /*
147         * Erase blocks and associated erase function. Any chip erase function
148         * is stored as chip-sized virtual block together with said function.
149         * The first one that fits will be chosen. There is currently no way to
150         * influence that behaviour. For testing just comment out the other
151         * elements or set the function pointer to NULL.
152         */
153        struct block_eraser {
154                struct eraseblock{
155                        unsigned int size; /* Eraseblock size in bytes */
156                        unsigned int count; /* Number of contiguous blocks with that size */
157                } eraseblocks[NUM_ERASEREGIONS];
158                /* a block_erase function should try to erase one block of size
159                 * 'blocklen' at address 'blockaddr' and return 0 on success. */
160                int (*block_erase) (struct flashctx *flash, unsigned int blockaddr, unsigned int blocklen);
161        } block_erasers[NUM_ERASEFUNCTIONS];
162
163        int (*printlock) (struct flashctx *flash);
164        int (*unlock) (struct flashctx *flash);
165        int (*write) (struct flashctx *flash, uint8_t *buf, unsigned int start, unsigned int len);
166        int (*read) (struct flashctx *flash, uint8_t *buf, unsigned int start, unsigned int len);
167        struct voltage {
168                uint16_t min;
169                uint16_t max;
170        } voltage;
171        enum write_granularity gran;
172};
173
174struct flashctx {
175        struct flashchip *chip;
176        chipaddr virtual_memory;
177        /* Some flash devices have an additional register space. */
178        chipaddr virtual_registers;
179        struct registered_programmer *pgm;
180};
181
182#define TEST_UNTESTED   0
183
184#define TEST_OK_PROBE   (1 << 0)
185#define TEST_OK_READ    (1 << 1)
186#define TEST_OK_ERASE   (1 << 2)
187#define TEST_OK_WRITE   (1 << 3)
188#define TEST_OK_PR      (TEST_OK_PROBE | TEST_OK_READ)
189#define TEST_OK_PRE     (TEST_OK_PROBE | TEST_OK_READ | TEST_OK_ERASE)
190#define TEST_OK_PRW     (TEST_OK_PROBE | TEST_OK_READ | TEST_OK_WRITE)
191#define TEST_OK_PREW    (TEST_OK_PROBE | TEST_OK_READ | TEST_OK_ERASE | TEST_OK_WRITE)
192#define TEST_OK_MASK    0x0f
193
194#define TEST_BAD_PROBE  (1 << 4)
195#define TEST_BAD_READ   (1 << 5)
196#define TEST_BAD_ERASE  (1 << 6)
197#define TEST_BAD_WRITE  (1 << 7)
198#define TEST_BAD_REW    (TEST_BAD_READ | TEST_BAD_ERASE | TEST_BAD_WRITE)
199#define TEST_BAD_PREW   (TEST_BAD_PROBE | TEST_BAD_READ | TEST_BAD_ERASE | TEST_BAD_WRITE)
200#define TEST_BAD_MASK   0xf0
201
202/* Timing used in probe routines. ZERO is -2 to differentiate between an unset
203 * field and zero delay.
204 *
205 * SPI devices will always have zero delay and ignore this field.
206 */
207#define TIMING_FIXME    -1
208/* this is intentionally same value as fixme */
209#define TIMING_IGNORED  -1
210#define TIMING_ZERO     -2
211
212extern const struct flashchip flashchips[];
213
214void chip_writeb(const struct flashctx *flash, uint8_t val, chipaddr addr);
215void chip_writew(const struct flashctx *flash, uint16_t val, chipaddr addr);
216void chip_writel(const struct flashctx *flash, uint32_t val, chipaddr addr);
217void chip_writen(const struct flashctx *flash, uint8_t *buf, chipaddr addr, size_t len);
218uint8_t chip_readb(const struct flashctx *flash, const chipaddr addr);
219uint16_t chip_readw(const struct flashctx *flash, const chipaddr addr);
220uint32_t chip_readl(const struct flashctx *flash, const chipaddr addr);
221void chip_readn(const struct flashctx *flash, uint8_t *buf, const chipaddr addr, size_t len);
222
223/* print.c */
224char *flashbuses_to_text(enum chipbustype bustype);
225int print_supported(void);
226void print_supported_wiki(void);
227
228/* flashrom.c */
229extern int verbose_screen;
230extern int verbose_logfile;
231extern const char flashrom_version[];
232extern const char *chip_to_probe;
233void map_flash_registers(struct flashctx *flash);
234int read_memmapped(struct flashctx *flash, uint8_t *buf, unsigned int start, unsigned int len);
235int erase_flash(struct flashctx *flash);
236int probe_flash(struct registered_programmer *pgm, int startchip, struct flashctx *fill_flash, int force);
237int read_flash_to_file(struct flashctx *flash, const char *filename);
238int min(int a, int b);
239int max(int a, int b);
240void tolower_string(char *str);
241char *extract_param(const char *const *haystack, const char *needle, const char *delim);
242int verify_range(struct flashctx *flash, uint8_t *cmpbuf, unsigned int start, unsigned int len);
243int need_erase(uint8_t *have, uint8_t *want, unsigned int len, enum write_granularity gran);
244char *strcat_realloc(char *dest, const char *src);
245void print_version(void);
246void print_buildinfo(void);
247void print_banner(void);
248void list_programmers_linebreak(int startcol, int cols, int paren);
249int selfcheck(void);
250int doit(struct flashctx *flash, int force, const char *filename, int read_it, int write_it, int erase_it, int verify_it);
251int read_buf_from_file(unsigned char *buf, unsigned long size, const char *filename);
252int write_buf_to_file(unsigned char *buf, unsigned long size, const char *filename);
253
254enum test_state {
255        OK = 0,
256        NT = 1, /* Not tested */
257        BAD
258};
259
260/* Something happened that shouldn't happen, but we can go on. */
261#define ERROR_NONFATAL 0x100
262
263/* Something happened that shouldn't happen, we'll abort. */
264#define ERROR_FATAL -0xee
265#define ERROR_FLASHROM_BUG -200
266/* We reached one of the hardcoded limits of flashrom. This can be fixed by
267 * increasing the limit of a compile-time allocation or by switching to dynamic
268 * allocation.
269 * Note: If this warning is triggered, check first for runaway registrations.
270 */
271#define ERROR_FLASHROM_LIMIT -201
272
273/* cli_output.c */
274#ifndef STANDALONE
275int open_logfile(const char * const filename);
276int close_logfile(void);
277void start_logging(void);
278#endif
279enum msglevel {
280        MSG_ERROR       = 0,
281        MSG_WARN        = 1,
282        MSG_INFO        = 2,
283        MSG_DEBUG       = 3,
284        MSG_DEBUG2      = 4,
285        MSG_SPEW        = 5,
286};
287/* Let gcc and clang check for correct printf-style format strings. */
288int print(enum msglevel level, const char *fmt, ...) __attribute__((format(printf, 2, 3)));
289#define msg_gerr(...)   print(MSG_ERROR, __VA_ARGS__)   /* general errors */
290#define msg_perr(...)   print(MSG_ERROR, __VA_ARGS__)   /* programmer errors */
291#define msg_cerr(...)   print(MSG_ERROR, __VA_ARGS__)   /* chip errors */
292#define msg_gwarn(...)  print(MSG_WARN, __VA_ARGS__)    /* general warnings */
293#define msg_pwarn(...)  print(MSG_WARN, __VA_ARGS__)    /* programmer warnings */
294#define msg_cwarn(...)  print(MSG_WARN, __VA_ARGS__)    /* chip warnings */
295#define msg_ginfo(...)  print(MSG_INFO, __VA_ARGS__)    /* general info */
296#define msg_pinfo(...)  print(MSG_INFO, __VA_ARGS__)    /* programmer info */
297#define msg_cinfo(...)  print(MSG_INFO, __VA_ARGS__)    /* chip info */
298#define msg_gdbg(...)   print(MSG_DEBUG, __VA_ARGS__)   /* general debug */
299#define msg_pdbg(...)   print(MSG_DEBUG, __VA_ARGS__)   /* programmer debug */
300#define msg_cdbg(...)   print(MSG_DEBUG, __VA_ARGS__)   /* chip debug */
301#define msg_gdbg2(...)  print(MSG_DEBUG2, __VA_ARGS__)  /* general debug2 */
302#define msg_pdbg2(...)  print(MSG_DEBUG2, __VA_ARGS__)  /* programmer debug2 */
303#define msg_cdbg2(...)  print(MSG_DEBUG2, __VA_ARGS__)  /* chip debug2 */
304#define msg_gspew(...)  print(MSG_SPEW, __VA_ARGS__)    /* general debug spew  */
305#define msg_pspew(...)  print(MSG_SPEW, __VA_ARGS__)    /* programmer debug spew  */
306#define msg_cspew(...)  print(MSG_SPEW, __VA_ARGS__)    /* chip debug spew  */
307
308/* layout.c */
309int register_include_arg(char *name);
310int process_include_args(void);
311int read_romlayout(char *name);
312int handle_romentries(const struct flashctx *flash, uint8_t *oldcontents, uint8_t *newcontents);
313
314/* spi.c */
315struct spi_command {
316        unsigned int writecnt;
317        unsigned int readcnt;
318        const unsigned char *writearr;
319        unsigned char *readarr;
320};
321int spi_send_command(struct flashctx *flash, unsigned int writecnt, unsigned int readcnt, const unsigned char *writearr, unsigned char *readarr);
322int spi_send_multicommand(struct flashctx *flash, struct spi_command *cmds);
323uint32_t spi_get_valid_read_addr(struct flashctx *flash);
324
325enum chipbustype get_buses_supported(void);
326#endif                          /* !__FLASH_H__ */
Note: See TracBrowser for help on using the repository browser.