blob: a8a8533d47e7f60873788b8dc2a7c4039206fa2c [file] [log] [blame]
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001/*
Uwe Hermannd1107642007-08-29 17:52:32 +00002 * This file is part of the flashrom project.
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00003 *
Uwe Hermannd22a1d42007-09-09 20:21:05 +00004 * Copyright (C) 2000 Silicon Integrated System Corporation
5 * Copyright (C) 2004 Tyan Corp <yhlu@tyan.com>
Uwe Hermannc7e8a0c2009-05-19 14:14:21 +00006 * Copyright (C) 2005-2008 coresystems GmbH
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007 * Copyright (C) 2008,2009 Carl-Daniel Hailfinger
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +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.
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +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.
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +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
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +000022 */
23
Carl-Daniel Hailfinger831e8f42010-05-30 22:24:40 +000024#include <stdio.h>
Stefan Reinauer018aca82006-11-21 23:48:51 +000025#include <sys/types.h>
Patrick Georgia9095a92010-09-30 17:03:32 +000026#ifndef __LIBPAYLOAD__
27#include <fcntl.h>
Stefan Reinauer018aca82006-11-21 23:48:51 +000028#include <sys/stat.h>
Patrick Georgia9095a92010-09-30 17:03:32 +000029#endif
Ronald G. Minnichceec4202003-07-25 04:37:41 +000030#include <string.h>
Ronald G. Minnicheaab50b2003-09-12 22:41:53 +000031#include <stdlib.h>
Stefan Tauner363fd7e2013-04-07 13:08:30 +000032#include <errno.h>
Carl-Daniel Hailfingerc2441382010-11-09 22:00:31 +000033#include <ctype.h>
Ollie Lho184a4042005-11-26 21:55:36 +000034#include <getopt.h>
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +000035#if HAVE_UTSNAME == 1
36#include <sys/utsname.h>
37#endif
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +000038#include "flash.h"
Carl-Daniel Hailfinger08454642009-06-15 14:14:48 +000039#include "flashchips.h"
Carl-Daniel Hailfinger5b997c32010-07-27 22:41:39 +000040#include "programmer.h"
Carl-Daniel Hailfinger06b9efa2012-08-07 11:59:59 +000041#include "hwaccess.h"
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +000042
Mathias Krausea60faab2011-01-17 07:50:42 +000043const char flashrom_version[] = FLASHROM_VERSION;
Nico Huberbcb2e5a2012-12-30 01:23:17 +000044const char *chip_to_probe = NULL;
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +000045int verbose_screen = MSG_INFO;
46int verbose_logfile = MSG_DEBUG2;
Carl-Daniel Hailfinger66ef4e52009-12-13 22:28:00 +000047
Carl-Daniel Hailfinger2e681602011-09-08 00:00:29 +000048static enum programmer programmer = PROGRAMMER_INVALID;
Carl-Daniel Hailfinger66ef4e52009-12-13 22:28:00 +000049
Nico Huberbcb2e5a2012-12-30 01:23:17 +000050static const char *programmer_param = NULL;
Stefan Reinauer70385642007-04-06 11:58:03 +000051
Uwe Hermann48ec1b12010-08-08 17:01:18 +000052/*
Carl-Daniel Hailfinger66ef4e52009-12-13 22:28:00 +000053 * Programmers supporting multiple buses can have differing size limits on
54 * each bus. Store the limits for each bus in a common struct.
55 */
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +000056struct decode_sizes max_rom_decode;
57
58/* If nonzero, used as the start address of bottom-aligned flash. */
59unsigned long flashbase;
Carl-Daniel Hailfinger66ef4e52009-12-13 22:28:00 +000060
Carl-Daniel Hailfingerd1be52d2010-07-03 12:14:25 +000061/* Is writing allowed with this programmer? */
62int programmer_may_write;
63
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +000064const struct programmer_entry programmer_table[] = {
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +000065#if CONFIG_INTERNAL == 1
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +000066 {
Carl-Daniel Hailfinger37fc4692009-08-12 14:34:35 +000067 .name = "internal",
Stefan Tauneraf358d62012-12-27 18:40:26 +000068 .type = OTHER,
69 .devs.note = NULL,
Carl-Daniel Hailfinger1e334e62009-05-11 15:46:43 +000070 .init = internal_init,
Carl-Daniel Hailfinger1455b2b2009-05-11 14:13:25 +000071 .map_flash_region = physmap,
72 .unmap_flash_region = physunmap,
Carl-Daniel Hailfingerca8bfc62009-06-05 17:48:08 +000073 .delay = internal_delay,
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +000074 },
Carl-Daniel Hailfinger66ef4e52009-12-13 22:28:00 +000075#endif
Luc Verhaegen8e3a6002007-04-04 22:45:58 +000076
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +000077#if CONFIG_DUMMY == 1
Carl-Daniel Hailfingerc3129202009-05-09 00:54:55 +000078 {
Carl-Daniel Hailfinger37fc4692009-08-12 14:34:35 +000079 .name = "dummy",
Stefan Tauneraf358d62012-12-27 18:40:26 +000080 .type = OTHER,
81 /* FIXME */
82 .devs.note = "Dummy device, does nothing and logs all accesses\n",
Carl-Daniel Hailfinger1e334e62009-05-11 15:46:43 +000083 .init = dummy_init,
Carl-Daniel Hailfinger1455b2b2009-05-11 14:13:25 +000084 .map_flash_region = dummy_map,
85 .unmap_flash_region = dummy_unmap,
Carl-Daniel Hailfingerca8bfc62009-06-05 17:48:08 +000086 .delay = internal_delay,
Carl-Daniel Hailfingerc3129202009-05-09 00:54:55 +000087 },
Carl-Daniel Hailfinger4740c6f2009-09-16 10:09:21 +000088#endif
Carl-Daniel Hailfingerc3129202009-05-09 00:54:55 +000089
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +000090#if CONFIG_NIC3COM == 1
Uwe Hermannb4dcb712009-05-13 11:36:06 +000091 {
Carl-Daniel Hailfinger37fc4692009-08-12 14:34:35 +000092 .name = "nic3com",
Stefan Tauneraf358d62012-12-27 18:40:26 +000093 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +000094 .devs.dev = nics_3com,
Uwe Hermannb4dcb712009-05-13 11:36:06 +000095 .init = nic3com_init,
Uwe Hermannc6915932009-05-17 23:12:17 +000096 .map_flash_region = fallback_map,
97 .unmap_flash_region = fallback_unmap,
Carl-Daniel Hailfingerca8bfc62009-06-05 17:48:08 +000098 .delay = internal_delay,
Uwe Hermannb4dcb712009-05-13 11:36:06 +000099 },
Carl-Daniel Hailfinger4740c6f2009-09-16 10:09:21 +0000100#endif
Uwe Hermannb4dcb712009-05-13 11:36:06 +0000101
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000102#if CONFIG_NICREALTEK == 1
Joerg Fischer5665ef32010-05-21 21:54:07 +0000103 {
Carl-Daniel Hailfinger40446ee2011-03-07 01:08:09 +0000104 /* This programmer works for Realtek RTL8139 and SMC 1211. */
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000105 .name = "nicrealtek",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000106 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000107 .devs.dev = nics_realtek,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000108 .init = nicrealtek_init,
109 .map_flash_region = fallback_map,
110 .unmap_flash_region = fallback_unmap,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000111 .delay = internal_delay,
Joerg Fischer5665ef32010-05-21 21:54:07 +0000112 },
Joerg Fischer5665ef32010-05-21 21:54:07 +0000113#endif
114
Andrew Morganc29c2e72010-06-07 22:37:54 +0000115#if CONFIG_NICNATSEMI == 1
116 {
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000117 .name = "nicnatsemi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000118 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000119 .devs.dev = nics_natsemi,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000120 .init = nicnatsemi_init,
121 .map_flash_region = fallback_map,
122 .unmap_flash_region = fallback_unmap,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000123 .delay = internal_delay,
Andrew Morganc29c2e72010-06-07 22:37:54 +0000124 },
125#endif
Joerg Fischer5665ef32010-05-21 21:54:07 +0000126
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000127#if CONFIG_GFXNVIDIA == 1
Uwe Hermann2bc98f62009-09-30 18:29:55 +0000128 {
129 .name = "gfxnvidia",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000130 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000131 .devs.dev = gfx_nvidia,
Uwe Hermann2bc98f62009-09-30 18:29:55 +0000132 .init = gfxnvidia_init,
Uwe Hermann2bc98f62009-09-30 18:29:55 +0000133 .map_flash_region = fallback_map,
134 .unmap_flash_region = fallback_unmap,
Uwe Hermann2bc98f62009-09-30 18:29:55 +0000135 .delay = internal_delay,
136 },
137#endif
138
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000139#if CONFIG_DRKAISER == 1
Rudolf Marek68720c72009-05-17 19:39:27 +0000140 {
TURBO Jb0912c02009-09-02 23:00:46 +0000141 .name = "drkaiser",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000142 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000143 .devs.dev = drkaiser_pcidev,
TURBO Jb0912c02009-09-02 23:00:46 +0000144 .init = drkaiser_init,
TURBO Jb0912c02009-09-02 23:00:46 +0000145 .map_flash_region = fallback_map,
146 .unmap_flash_region = fallback_unmap,
TURBO Jb0912c02009-09-02 23:00:46 +0000147 .delay = internal_delay,
148 },
Carl-Daniel Hailfinger4740c6f2009-09-16 10:09:21 +0000149#endif
TURBO Jb0912c02009-09-02 23:00:46 +0000150
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000151#if CONFIG_SATASII == 1
TURBO Jb0912c02009-09-02 23:00:46 +0000152 {
Carl-Daniel Hailfinger37fc4692009-08-12 14:34:35 +0000153 .name = "satasii",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000154 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000155 .devs.dev = satas_sii,
Rudolf Marek68720c72009-05-17 19:39:27 +0000156 .init = satasii_init,
Uwe Hermannc6915932009-05-17 23:12:17 +0000157 .map_flash_region = fallback_map,
158 .unmap_flash_region = fallback_unmap,
Carl-Daniel Hailfingerca8bfc62009-06-05 17:48:08 +0000159 .delay = internal_delay,
Rudolf Marek68720c72009-05-17 19:39:27 +0000160 },
Carl-Daniel Hailfinger4740c6f2009-09-16 10:09:21 +0000161#endif
Rudolf Marek68720c72009-05-17 19:39:27 +0000162
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000163#if CONFIG_ATAHPT == 1
Uwe Hermannddd5c9e2010-02-21 21:17:00 +0000164 {
165 .name = "atahpt",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000166 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000167 .devs.dev = ata_hpt,
Uwe Hermannddd5c9e2010-02-21 21:17:00 +0000168 .init = atahpt_init,
Uwe Hermannddd5c9e2010-02-21 21:17:00 +0000169 .map_flash_region = fallback_map,
170 .unmap_flash_region = fallback_unmap,
Uwe Hermannddd5c9e2010-02-21 21:17:00 +0000171 .delay = internal_delay,
172 },
173#endif
174
Jonathan Kollasch7f0f3fa2014-06-01 10:26:23 +0000175#if CONFIG_ATAVIA == 1
176 {
177 .name = "atavia",
178 .type = PCI,
179 .devs.dev = ata_via,
180 .init = atavia_init,
181 .map_flash_region = atavia_map,
182 .unmap_flash_region = fallback_unmap,
183 .delay = internal_delay,
184 },
185#endif
186
Kyösti Mälkki72d42f82014-06-01 23:48:31 +0000187#if CONFIG_IT8212 == 1
188 {
189 .name = "it8212",
190 .type = PCI,
191 .devs.dev = devs_it8212,
192 .init = it8212_init,
193 .map_flash_region = fallback_map,
194 .unmap_flash_region = fallback_unmap,
195 .delay = internal_delay,
196 },
197#endif
198
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000199#if CONFIG_FT2232_SPI == 1
Paul Fox05dfbe62009-06-16 21:08:06 +0000200 {
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000201 .name = "ft2232_spi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000202 .type = USB,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000203 .devs.dev = devs_ft2232spi,
Paul Fox05dfbe62009-06-16 21:08:06 +0000204 .init = ft2232_spi_init,
Carl-Daniel Hailfinger415e5132009-08-12 11:39:29 +0000205 .map_flash_region = fallback_map,
206 .unmap_flash_region = fallback_unmap,
Paul Fox05dfbe62009-06-16 21:08:06 +0000207 .delay = internal_delay,
208 },
Carl-Daniel Hailfinger3426ef62009-08-19 13:27:58 +0000209#endif
Carl-Daniel Hailfinger415e5132009-08-12 11:39:29 +0000210
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000211#if CONFIG_SERPROG == 1
Urja Rannikko22915352009-06-23 11:33:43 +0000212 {
Carl-Daniel Hailfinger37fc4692009-08-12 14:34:35 +0000213 .name = "serprog",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000214 .type = OTHER,
215 /* FIXME */
216 .devs.note = "All programmer devices speaking the serprog protocol\n",
Urja Rannikko22915352009-06-23 11:33:43 +0000217 .init = serprog_init,
Urja Rannikko22915352009-06-23 11:33:43 +0000218 .map_flash_region = fallback_map,
219 .unmap_flash_region = fallback_unmap,
Urja Rannikko22915352009-06-23 11:33:43 +0000220 .delay = serprog_delay,
221 },
Carl-Daniel Hailfinger6be74112009-08-12 16:17:41 +0000222#endif
Paul Fox05dfbe62009-06-16 21:08:06 +0000223
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000224#if CONFIG_BUSPIRATE_SPI == 1
Carl-Daniel Hailfinger5cca01f2009-11-24 00:20:03 +0000225 {
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000226 .name = "buspirate_spi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000227 .type = OTHER,
228 /* FIXME */
229 .devs.note = "Dangerous Prototypes Bus Pirate\n",
Carl-Daniel Hailfinger5cca01f2009-11-24 00:20:03 +0000230 .init = buspirate_spi_init,
Carl-Daniel Hailfinger5cca01f2009-11-24 00:20:03 +0000231 .map_flash_region = fallback_map,
232 .unmap_flash_region = fallback_unmap,
Carl-Daniel Hailfinger5cca01f2009-11-24 00:20:03 +0000233 .delay = internal_delay,
234 },
235#endif
236
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000237#if CONFIG_DEDIPROG == 1
Carl-Daniel Hailfingerd38fac82010-01-19 11:15:48 +0000238 {
239 .name = "dediprog",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000240 .type = OTHER,
241 /* FIXME */
242 .devs.note = "Dediprog SF100\n",
Carl-Daniel Hailfingerd38fac82010-01-19 11:15:48 +0000243 .init = dediprog_init,
Carl-Daniel Hailfingerd38fac82010-01-19 11:15:48 +0000244 .map_flash_region = fallback_map,
245 .unmap_flash_region = fallback_unmap,
Carl-Daniel Hailfingerd38fac82010-01-19 11:15:48 +0000246 .delay = internal_delay,
247 },
248#endif
249
Carl-Daniel Hailfingere7fdd6e2010-07-21 10:26:01 +0000250#if CONFIG_RAYER_SPI == 1
251 {
252 .name = "rayer_spi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000253 .type = OTHER,
254 /* FIXME */
255 .devs.note = "RayeR parallel port programmer\n",
Carl-Daniel Hailfingere7fdd6e2010-07-21 10:26:01 +0000256 .init = rayer_spi_init,
Carl-Daniel Hailfingere7fdd6e2010-07-21 10:26:01 +0000257 .map_flash_region = fallback_map,
258 .unmap_flash_region = fallback_unmap,
Carl-Daniel Hailfingere7fdd6e2010-07-21 10:26:01 +0000259 .delay = internal_delay,
260 },
261#endif
262
Virgil-Adrian Teacada7c5452012-04-30 23:11:06 +0000263#if CONFIG_PONY_SPI == 1
264 {
265 .name = "pony_spi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000266 .type = OTHER,
267 /* FIXME */
268 .devs.note = "Programmers compatible with SI-Prog, serbang or AJAWe\n",
Virgil-Adrian Teacada7c5452012-04-30 23:11:06 +0000269 .init = pony_spi_init,
270 .map_flash_region = fallback_map,
271 .unmap_flash_region = fallback_unmap,
272 .delay = internal_delay,
Stefan Tauneraf358d62012-12-27 18:40:26 +0000273 },
Virgil-Adrian Teacada7c5452012-04-30 23:11:06 +0000274#endif
275
Carl-Daniel Hailfingerb713d2e2011-05-08 00:24:18 +0000276#if CONFIG_NICINTEL == 1
277 {
278 .name = "nicintel",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000279 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000280 .devs.dev = nics_intel,
Carl-Daniel Hailfingerb713d2e2011-05-08 00:24:18 +0000281 .init = nicintel_init,
Carl-Daniel Hailfingerb713d2e2011-05-08 00:24:18 +0000282 .map_flash_region = fallback_map,
283 .unmap_flash_region = fallback_unmap,
Carl-Daniel Hailfingerb713d2e2011-05-08 00:24:18 +0000284 .delay = internal_delay,
285 },
286#endif
287
Idwer Vollering004f4b72010-09-03 18:21:21 +0000288#if CONFIG_NICINTEL_SPI == 1
289 {
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000290 .name = "nicintel_spi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000291 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000292 .devs.dev = nics_intel_spi,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000293 .init = nicintel_spi_init,
294 .map_flash_region = fallback_map,
295 .unmap_flash_region = fallback_unmap,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000296 .delay = internal_delay,
Idwer Vollering004f4b72010-09-03 18:21:21 +0000297 },
298#endif
299
Mark Marshall90021f22010-12-03 14:48:11 +0000300#if CONFIG_OGP_SPI == 1
301 {
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000302 .name = "ogp_spi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000303 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000304 .devs.dev = ogp_spi,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000305 .init = ogp_spi_init,
306 .map_flash_region = fallback_map,
307 .unmap_flash_region = fallback_unmap,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000308 .delay = internal_delay,
Mark Marshall90021f22010-12-03 14:48:11 +0000309 },
310#endif
311
Carl-Daniel Hailfinger9a1105c2011-02-04 21:37:59 +0000312#if CONFIG_SATAMV == 1
313 {
314 .name = "satamv",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000315 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000316 .devs.dev = satas_mv,
Carl-Daniel Hailfinger9a1105c2011-02-04 21:37:59 +0000317 .init = satamv_init,
Carl-Daniel Hailfinger9a1105c2011-02-04 21:37:59 +0000318 .map_flash_region = fallback_map,
319 .unmap_flash_region = fallback_unmap,
Carl-Daniel Hailfinger9a1105c2011-02-04 21:37:59 +0000320 .delay = internal_delay,
321 },
322#endif
323
Sven Schnelle5ce5f702011-09-03 18:37:52 +0000324#if CONFIG_LINUX_SPI == 1
325 {
326 .name = "linux_spi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000327 .type = OTHER,
328 .devs.note = "Device files /dev/spidev*.*\n",
Sven Schnelle5ce5f702011-09-03 18:37:52 +0000329 .init = linux_spi_init,
330 .map_flash_region = fallback_map,
331 .unmap_flash_region = fallback_unmap,
Sven Schnelle5ce5f702011-09-03 18:37:52 +0000332 .delay = internal_delay,
333 },
334#endif
335
James Lairdc60de0e2013-03-27 13:00:23 +0000336#if CONFIG_USBBLASTER_SPI == 1
337 {
338 .name = "usbblaster_spi",
339 .type = USB,
340 .devs.dev = devs_usbblasterspi,
341 .init = usbblaster_spi_init,
342 .map_flash_region = fallback_map,
343 .unmap_flash_region = fallback_unmap,
344 .delay = internal_delay,
345 },
346#endif
347
Carl-Daniel Hailfinger1c6d2ff2012-08-27 00:44:42 +0000348 {0}, /* This entry corresponds to PROGRAMMER_INVALID. */
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +0000349};
Luc Verhaegen8e3a6002007-04-04 22:45:58 +0000350
Carl-Daniel Hailfinger2bee8cf2010-11-10 15:25:18 +0000351#define SHUTDOWN_MAXFN 32
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000352static int shutdown_fn_count = 0;
353struct shutdown_func_data {
David Hendricks8bb20212011-06-14 01:35:36 +0000354 int (*func) (void *data);
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000355 void *data;
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000356} static shutdown_fn[SHUTDOWN_MAXFN];
357/* Initialize to 0 to make sure nobody registers a shutdown function before
358 * programmer init.
359 */
360static int may_register_shutdown = 0;
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000361
Stefan Taunerc4f44df2013-08-12 22:58:43 +0000362/* Did we change something or was every erase/write skipped (if any)? */
363static bool all_skipped = true;
364
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +0000365static int check_block_eraser(const struct flashctx *flash, int k, int log);
Stefan Tauner5368dca2011-07-01 00:19:12 +0000366
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000367/* Register a function to be executed on programmer shutdown.
368 * The advantage over atexit() is that you can supply a void pointer which will
369 * be used as parameter to the registered function upon programmer shutdown.
370 * This pointer can point to arbitrary data used by said function, e.g. undo
371 * information for GPIO settings etc. If unneeded, set data=NULL.
372 * Please note that the first (void *data) belongs to the function signature of
373 * the function passed as first parameter.
374 */
David Hendricks8bb20212011-06-14 01:35:36 +0000375int register_shutdown(int (*function) (void *data), void *data)
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000376{
377 if (shutdown_fn_count >= SHUTDOWN_MAXFN) {
Carl-Daniel Hailfinger9f5f2152010-06-04 23:20:21 +0000378 msg_perr("Tried to register more than %i shutdown functions.\n",
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000379 SHUTDOWN_MAXFN);
380 return 1;
381 }
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000382 if (!may_register_shutdown) {
383 msg_perr("Tried to register a shutdown function before "
384 "programmer init.\n");
385 return 1;
386 }
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000387 shutdown_fn[shutdown_fn_count].func = function;
388 shutdown_fn[shutdown_fn_count].data = data;
389 shutdown_fn_count++;
390
391 return 0;
392}
393
Nico Huberbcb2e5a2012-12-30 01:23:17 +0000394int programmer_init(enum programmer prog, const char *param)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000395{
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000396 int ret;
Carl-Daniel Hailfinger2e681602011-09-08 00:00:29 +0000397
398 if (prog >= PROGRAMMER_INVALID) {
399 msg_perr("Invalid programmer specified!\n");
400 return -1;
401 }
402 programmer = prog;
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000403 /* Initialize all programmer specific data. */
404 /* Default to unlimited decode sizes. */
405 max_rom_decode = (const struct decode_sizes) {
406 .parallel = 0xffffffff,
407 .lpc = 0xffffffff,
408 .fwh = 0xffffffff,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000409 .spi = 0xffffffff,
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000410 };
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000411 /* Default to top aligned flash at 4 GB. */
412 flashbase = 0;
413 /* Registering shutdown functions is now allowed. */
414 may_register_shutdown = 1;
Carl-Daniel Hailfingerd1be52d2010-07-03 12:14:25 +0000415 /* Default to allowing writes. Broken programmers set this to 0. */
416 programmer_may_write = 1;
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000417
418 programmer_param = param;
Carl-Daniel Hailfinger20a36ba2013-08-13 07:09:57 +0000419 msg_pdbg("Initializing %s programmer\n", programmer_table[programmer].name);
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000420 ret = programmer_table[programmer].init();
421 if (programmer_param && strlen(programmer_param)) {
Carl-Daniel Hailfinger20a36ba2013-08-13 07:09:57 +0000422 if (ret != 0) {
423 /* It is quite possible that any unhandled programmer parameter would have been valid,
424 * but an error in actual programmer init happened before the parameter was evaluated.
425 */
426 msg_pwarn("Unhandled programmer parameters (possibly due to another failure): %s\n",
427 programmer_param);
428 } else {
429 /* Actual programmer init was successful, but the user specified an invalid or unusable
430 * (for the current programmer configuration) parameter.
431 */
432 msg_perr("Unhandled programmer parameters: %s\n", programmer_param);
433 msg_perr("Aborting.\n");
434 ret = ERROR_FATAL;
435 }
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000436 }
437 return ret;
Uwe Hermann09e04f72009-05-16 22:36:00 +0000438}
439
Stefan Tauner20da4aa2014-05-07 22:07:23 +0000440/** Calls registered shutdown functions and resets internal programmer-related variables.
441 * Calling it is safe even without previous initialization, but further interactions with programmer support
442 * require a call to programmer_init() (afterwards).
443 *
444 * @return The OR-ed result values of all shutdown functions (i.e. 0 on success). */
Uwe Hermann09e04f72009-05-16 22:36:00 +0000445int programmer_shutdown(void)
446{
David Hendricks8bb20212011-06-14 01:35:36 +0000447 int ret = 0;
448
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000449 /* Registering shutdown functions is no longer allowed. */
450 may_register_shutdown = 0;
451 while (shutdown_fn_count > 0) {
452 int i = --shutdown_fn_count;
David Hendricks8bb20212011-06-14 01:35:36 +0000453 ret |= shutdown_fn[i].func(shutdown_fn[i].data);
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000454 }
Stefan Taunere34e3e82013-01-01 00:06:51 +0000455
Stefan Taunerb8911d62012-12-26 07:55:00 +0000456 programmer_param = NULL;
Stefan Taunere34e3e82013-01-01 00:06:51 +0000457 registered_programmer_count = 0;
458
David Hendricks8bb20212011-06-14 01:35:36 +0000459 return ret;
Uwe Hermann09e04f72009-05-16 22:36:00 +0000460}
461
Stefan Tauner305e0b92013-07-17 23:46:44 +0000462void *programmer_map_flash_region(const char *descr, uintptr_t phys_addr, size_t len)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000463{
Stefan Tauner26e7a152013-09-13 17:21:05 +0000464 void *ret = programmer_table[programmer].map_flash_region(descr, phys_addr, len);
465 msg_gspew("%s: mapping %s from 0x%0*" PRIxPTR " to 0x%0*" PRIxPTR "\n",
466 __func__, descr, PRIxPTR_WIDTH, phys_addr, PRIxPTR_WIDTH, (uintptr_t) ret);
467 return ret;
Uwe Hermann09e04f72009-05-16 22:36:00 +0000468}
469
470void programmer_unmap_flash_region(void *virt_addr, size_t len)
471{
472 programmer_table[programmer].unmap_flash_region(virt_addr, len);
473}
474
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000475void chip_writeb(const struct flashctx *flash, uint8_t val, chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000476{
Carl-Daniel Hailfingerc40cff72011-12-20 00:19:29 +0000477 flash->pgm->par.chip_writeb(flash, val, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000478}
479
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000480void chip_writew(const struct flashctx *flash, uint16_t val, chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000481{
Carl-Daniel Hailfingerc40cff72011-12-20 00:19:29 +0000482 flash->pgm->par.chip_writew(flash, val, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000483}
484
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000485void chip_writel(const struct flashctx *flash, uint32_t val, chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000486{
Carl-Daniel Hailfingerc40cff72011-12-20 00:19:29 +0000487 flash->pgm->par.chip_writel(flash, val, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000488}
489
Mark Marshallf20b7be2014-05-09 21:16:21 +0000490void chip_writen(const struct flashctx *flash, const uint8_t *buf, chipaddr addr, size_t len)
Carl-Daniel Hailfinger0bd2a2b2009-06-05 18:32:07 +0000491{
Carl-Daniel Hailfingerc40cff72011-12-20 00:19:29 +0000492 flash->pgm->par.chip_writen(flash, buf, addr, len);
Carl-Daniel Hailfinger0bd2a2b2009-06-05 18:32:07 +0000493}
494
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000495uint8_t chip_readb(const struct flashctx *flash, const chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000496{
Carl-Daniel Hailfingerc40cff72011-12-20 00:19:29 +0000497 return flash->pgm->par.chip_readb(flash, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000498}
499
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000500uint16_t chip_readw(const struct flashctx *flash, const chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000501{
Carl-Daniel Hailfingerc40cff72011-12-20 00:19:29 +0000502 return flash->pgm->par.chip_readw(flash, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000503}
504
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000505uint32_t chip_readl(const struct flashctx *flash, const chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000506{
Carl-Daniel Hailfingerc40cff72011-12-20 00:19:29 +0000507 return flash->pgm->par.chip_readl(flash, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000508}
509
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000510void chip_readn(const struct flashctx *flash, uint8_t *buf, chipaddr addr,
511 size_t len)
Carl-Daniel Hailfinger0bd2a2b2009-06-05 18:32:07 +0000512{
Carl-Daniel Hailfingerc40cff72011-12-20 00:19:29 +0000513 flash->pgm->par.chip_readn(flash, buf, addr, len);
Carl-Daniel Hailfinger0bd2a2b2009-06-05 18:32:07 +0000514}
515
Stefan Taunerf80419c2014-05-02 15:41:42 +0000516void programmer_delay(unsigned int usecs)
Carl-Daniel Hailfingerca8bfc62009-06-05 17:48:08 +0000517{
Urja Rannikko8d7ec2a2013-10-21 21:49:08 +0000518 if (usecs > 0)
519 programmer_table[programmer].delay(usecs);
Carl-Daniel Hailfingerca8bfc62009-06-05 17:48:08 +0000520}
521
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +0000522void map_flash_registers(struct flashctx *flash)
Stefan Reinauerff4f1972007-05-24 08:48:10 +0000523{
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +0000524 size_t size = flash->chip->total_size * 1024;
Carl-Daniel Hailfingerd0fc9462009-05-11 14:01:17 +0000525 /* Flash registers live 4 MByte below the flash. */
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +0000526 /* FIXME: This is incorrect for nonstandard flashbase. */
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +0000527 flash->virtual_registers = (chipaddr)programmer_map_flash_region("flash chip registers", (0xFFFFFFFF - 0x400000 - size + 1), size);
Stefan Reinauerff4f1972007-05-24 08:48:10 +0000528}
529
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000530int read_memmapped(struct flashctx *flash, uint8_t *buf, unsigned int start,
531 int unsigned len)
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000532{
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000533 chip_readn(flash, buf, flash->virtual_memory + start, len);
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000534
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000535 return 0;
536}
537
Carl-Daniel Hailfinger38a059d2009-06-13 12:04:03 +0000538int min(int a, int b)
539{
540 return (a < b) ? a : b;
541}
542
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000543int max(int a, int b)
544{
545 return (a > b) ? a : b;
546}
547
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +0000548int bitcount(unsigned long a)
549{
550 int i = 0;
551 for (; a != 0; a >>= 1)
552 if (a & 1)
553 i++;
554 return i;
555}
556
Carl-Daniel Hailfingerc2441382010-11-09 22:00:31 +0000557void tolower_string(char *str)
558{
559 for (; *str != '\0'; str++)
560 *str = (char)tolower((unsigned char)*str);
561}
562
Carl-Daniel Hailfingerb22918c2009-06-01 02:08:58 +0000563char *strcat_realloc(char *dest, const char *src)
564{
565 dest = realloc(dest, strlen(dest) + strlen(src) + 1);
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000566 if (!dest) {
567 msg_gerr("Out of memory!\n");
Carl-Daniel Hailfingerb22918c2009-06-01 02:08:58 +0000568 return NULL;
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000569 }
Carl-Daniel Hailfingerb22918c2009-06-01 02:08:58 +0000570 strcat(dest, src);
571 return dest;
572}
573
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000574/* This is a somewhat hacked function similar in some ways to strtok().
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000575 * It will look for needle with a subsequent '=' in haystack, return a copy of
576 * needle and remove everything from the first occurrence of needle to the next
577 * delimiter from haystack.
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000578 */
Nico Huberbcb2e5a2012-12-30 01:23:17 +0000579char *extract_param(const char *const *haystack, const char *needle, const char *delim)
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000580{
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000581 char *param_pos, *opt_pos, *rest;
582 char *opt = NULL;
583 int optlen;
Carl-Daniel Hailfinger27023762010-04-28 15:22:14 +0000584 int needlelen;
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000585
Carl-Daniel Hailfinger27023762010-04-28 15:22:14 +0000586 needlelen = strlen(needle);
587 if (!needlelen) {
588 msg_gerr("%s: empty needle! Please report a bug at "
589 "flashrom@flashrom.org\n", __func__);
590 return NULL;
591 }
592 /* No programmer parameters given. */
593 if (*haystack == NULL)
594 return NULL;
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000595 param_pos = strstr(*haystack, needle);
596 do {
597 if (!param_pos)
598 return NULL;
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000599 /* Needle followed by '='? */
600 if (param_pos[needlelen] == '=') {
601
602 /* Beginning of the string? */
603 if (param_pos == *haystack)
604 break;
605 /* After a delimiter? */
606 if (strchr(delim, *(param_pos - 1)))
607 break;
608 }
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000609 /* Continue searching. */
610 param_pos++;
611 param_pos = strstr(param_pos, needle);
612 } while (1);
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000613
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000614 if (param_pos) {
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000615 /* Get the string after needle and '='. */
616 opt_pos = param_pos + needlelen + 1;
617 optlen = strcspn(opt_pos, delim);
618 /* Return an empty string if the parameter was empty. */
619 opt = malloc(optlen + 1);
620 if (!opt) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000621 msg_gerr("Out of memory!\n");
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000622 exit(1);
623 }
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000624 strncpy(opt, opt_pos, optlen);
625 opt[optlen] = '\0';
626 rest = opt_pos + optlen;
627 /* Skip all delimiters after the current parameter. */
628 rest += strspn(rest, delim);
629 memmove(param_pos, rest, strlen(rest) + 1);
630 /* We could shrink haystack, but the effort is not worth it. */
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000631 }
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000632
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000633 return opt;
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000634}
635
Stefan Tauner66652442011-06-26 17:38:17 +0000636char *extract_programmer_param(const char *param_name)
Carl-Daniel Hailfinger2b6dcb32010-07-08 10:13:37 +0000637{
638 return extract_param(&programmer_param, param_name, ",");
639}
640
Sylvain "ythier" Hitier9db45512011-07-04 07:27:17 +0000641/* Returns the number of well-defined erasers for a chip. */
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +0000642static unsigned int count_usable_erasers(const struct flashctx *flash)
Stefan Tauner5368dca2011-07-01 00:19:12 +0000643{
644 unsigned int usable_erasefunctions = 0;
645 int k;
646 for (k = 0; k < NUM_ERASEFUNCTIONS; k++) {
647 if (!check_block_eraser(flash, k, 0))
648 usable_erasefunctions++;
649 }
650 return usable_erasefunctions;
651}
652
Mark Marshallf20b7be2014-05-09 21:16:21 +0000653static int compare_range(const uint8_t *wantbuf, const uint8_t *havebuf, unsigned int start, unsigned int len)
Stefan Tauner78ffbea2012-10-27 15:36:56 +0000654{
655 int ret = 0, failcount = 0;
656 unsigned int i;
657 for (i = 0; i < len; i++) {
658 if (wantbuf[i] != havebuf[i]) {
659 /* Only print the first failure. */
660 if (!failcount++)
661 msg_cerr("FAILED at 0x%08x! Expected=0x%02x, Found=0x%02x,",
662 start + i, wantbuf[i], havebuf[i]);
663 }
664 }
665 if (failcount) {
666 msg_cerr(" failed byte count from 0x%08x-0x%08x: 0x%x\n",
667 start, start + len - 1, failcount);
668 ret = -1;
669 }
670 return ret;
671}
672
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000673/* start is an offset to the base address of the flash chip */
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000674int check_erased_range(struct flashctx *flash, unsigned int start,
675 unsigned int len)
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000676{
677 int ret;
678 uint8_t *cmpbuf = malloc(len);
679
680 if (!cmpbuf) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000681 msg_gerr("Could not allocate memory!\n");
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000682 exit(1);
683 }
684 memset(cmpbuf, 0xff, len);
Stefan Tauner78ffbea2012-10-27 15:36:56 +0000685 ret = verify_range(flash, cmpbuf, start, len);
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000686 free(cmpbuf);
687 return ret;
688}
689
Uwe Hermann48ec1b12010-08-08 17:01:18 +0000690/*
Carl-Daniel Hailfingerd0250a32009-11-25 17:05:52 +0000691 * @cmpbuf buffer to compare against, cmpbuf[0] is expected to match the
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000692 * flash content at location start
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000693 * @start offset to the base address of the flash chip
694 * @len length of the verified area
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000695 * @return 0 for success, -1 for failure
696 */
Mark Marshallf20b7be2014-05-09 21:16:21 +0000697int verify_range(struct flashctx *flash, const uint8_t *cmpbuf, unsigned int start, unsigned int len)
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000698{
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000699 if (!len)
Stefan Taunerdf64a422014-05-27 00:06:14 +0000700 return -1;
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000701
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +0000702 if (!flash->chip->read) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000703 msg_cerr("ERROR: flashrom has no read function for this flash chip.\n");
Stefan Taunerdf64a422014-05-27 00:06:14 +0000704 return -1;
Carl-Daniel Hailfinger23290662009-06-24 08:20:45 +0000705 }
Stefan Taunerdf64a422014-05-27 00:06:14 +0000706
707 uint8_t *readbuf = malloc(len);
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000708 if (!readbuf) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000709 msg_gerr("Could not allocate memory!\n");
Stefan Taunerdf64a422014-05-27 00:06:14 +0000710 return -1;
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000711 }
Stefan Taunerdf64a422014-05-27 00:06:14 +0000712 int ret = 0;
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000713
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +0000714 if (start + len > flash->chip->total_size * 1024) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000715 msg_gerr("Error: %s called with start 0x%x + len 0x%x >"
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000716 " total_size 0x%x\n", __func__, start, len,
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +0000717 flash->chip->total_size * 1024);
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000718 ret = -1;
719 goto out_free;
720 }
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000721
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +0000722 ret = flash->chip->read(flash, readbuf, start, len);
Carl-Daniel Hailfingerd8369412010-11-16 17:21:58 +0000723 if (ret) {
724 msg_gerr("Verification impossible because read failed "
725 "at 0x%x (len 0x%x)\n", start, len);
Stefan Taunerdf64a422014-05-27 00:06:14 +0000726 ret = -1;
727 goto out_free;
Carl-Daniel Hailfingerd8369412010-11-16 17:21:58 +0000728 }
729
Stefan Tauner78ffbea2012-10-27 15:36:56 +0000730 ret = compare_range(cmpbuf, readbuf, start, len);
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000731out_free:
732 free(readbuf);
733 return ret;
734}
735
Stefan Tauner02437452013-04-01 19:34:53 +0000736/* Helper function for need_erase() that focuses on granularities of gran bytes. */
Mark Marshallf20b7be2014-05-09 21:16:21 +0000737static int need_erase_gran_bytes(const uint8_t *have, const uint8_t *want, unsigned int len, unsigned int gran)
Stefan Tauner02437452013-04-01 19:34:53 +0000738{
739 unsigned int i, j, limit;
740 for (j = 0; j < len / gran; j++) {
741 limit = min (gran, len - j * gran);
742 /* Are 'have' and 'want' identical? */
743 if (!memcmp(have + j * gran, want + j * gran, limit))
744 continue;
745 /* have needs to be in erased state. */
746 for (i = 0; i < limit; i++)
747 if (have[j * gran + i] != 0xff)
748 return 1;
749 }
750 return 0;
751}
752
Uwe Hermann48ec1b12010-08-08 17:01:18 +0000753/*
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000754 * Check if the buffer @have can be programmed to the content of @want without
755 * erasing. This is only possible if all chunks of size @gran are either kept
756 * as-is or changed from an all-ones state to any other state.
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000757 *
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000758 * Warning: This function assumes that @have and @want point to naturally
759 * aligned regions.
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000760 *
761 * @have buffer with current content
762 * @want buffer with desired content
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000763 * @len length of the checked area
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000764 * @gran write granularity (enum, not count)
765 * @return 0 if no erase is needed, 1 otherwise
766 */
Mark Marshallf20b7be2014-05-09 21:16:21 +0000767int need_erase(const uint8_t *have, const uint8_t *want, unsigned int len, enum write_granularity gran)
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000768{
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +0000769 int result = 0;
Stefan Tauner02437452013-04-01 19:34:53 +0000770 unsigned int i;
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000771
772 switch (gran) {
773 case write_gran_1bit:
774 for (i = 0; i < len; i++)
775 if ((have[i] & want[i]) != want[i]) {
776 result = 1;
777 break;
778 }
779 break;
780 case write_gran_1byte:
781 for (i = 0; i < len; i++)
782 if ((have[i] != want[i]) && (have[i] != 0xff)) {
783 result = 1;
784 break;
785 }
786 break;
787 case write_gran_256bytes:
Stefan Tauner02437452013-04-01 19:34:53 +0000788 result = need_erase_gran_bytes(have, want, len, 256);
789 break;
790 case write_gran_264bytes:
791 result = need_erase_gran_bytes(have, want, len, 264);
792 break;
793 case write_gran_512bytes:
794 result = need_erase_gran_bytes(have, want, len, 512);
795 break;
796 case write_gran_528bytes:
797 result = need_erase_gran_bytes(have, want, len, 528);
798 break;
799 case write_gran_1024bytes:
800 result = need_erase_gran_bytes(have, want, len, 1024);
801 break;
802 case write_gran_1056bytes:
803 result = need_erase_gran_bytes(have, want, len, 1056);
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000804 break;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000805 default:
806 msg_cerr("%s: Unsupported granularity! Please report a bug at "
807 "flashrom@flashrom.org\n", __func__);
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000808 }
809 return result;
810}
811
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000812/**
813 * Check if the buffer @have needs to be programmed to get the content of @want.
814 * If yes, return 1 and fill in first_start with the start address of the
815 * write operation and first_len with the length of the first to-be-written
816 * chunk. If not, return 0 and leave first_start and first_len undefined.
817 *
818 * Warning: This function assumes that @have and @want point to naturally
819 * aligned regions.
820 *
821 * @have buffer with current content
822 * @want buffer with desired content
823 * @len length of the checked area
824 * @gran write granularity (enum, not count)
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000825 * @first_start offset of the first byte which needs to be written (passed in
826 * value is increased by the offset of the first needed write
827 * relative to have/want or unchanged if no write is needed)
828 * @return length of the first contiguous area which needs to be written
829 * 0 if no write is needed
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000830 *
831 * FIXME: This function needs a parameter which tells it about coalescing
832 * in relation to the max write length of the programmer and the max write
833 * length of the chip.
834 */
Mark Marshallf20b7be2014-05-09 21:16:21 +0000835static unsigned int get_next_write(const uint8_t *have, const uint8_t *want, unsigned int len,
Stefan Taunerc69c9c82011-11-23 09:13:48 +0000836 unsigned int *first_start,
837 enum write_granularity gran)
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000838{
Stefan Taunerc69c9c82011-11-23 09:13:48 +0000839 int need_write = 0;
840 unsigned int rel_start = 0, first_len = 0;
841 unsigned int i, limit, stride;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000842
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000843 switch (gran) {
844 case write_gran_1bit:
845 case write_gran_1byte:
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000846 stride = 1;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000847 break;
848 case write_gran_256bytes:
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000849 stride = 256;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000850 break;
Stefan Tauner02437452013-04-01 19:34:53 +0000851 case write_gran_264bytes:
852 stride = 264;
853 break;
854 case write_gran_512bytes:
855 stride = 512;
856 break;
857 case write_gran_528bytes:
858 stride = 528;
859 break;
860 case write_gran_1024bytes:
861 stride = 1024;
862 break;
863 case write_gran_1056bytes:
864 stride = 1056;
865 break;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000866 default:
867 msg_cerr("%s: Unsupported granularity! Please report a bug at "
868 "flashrom@flashrom.org\n", __func__);
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000869 /* Claim that no write was needed. A write with unknown
870 * granularity is too dangerous to try.
871 */
872 return 0;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000873 }
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000874 for (i = 0; i < len / stride; i++) {
875 limit = min(stride, len - i * stride);
876 /* Are 'have' and 'want' identical? */
877 if (memcmp(have + i * stride, want + i * stride, limit)) {
878 if (!need_write) {
879 /* First location where have and want differ. */
880 need_write = 1;
881 rel_start = i * stride;
882 }
883 } else {
884 if (need_write) {
885 /* First location where have and want
886 * do not differ anymore.
887 */
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000888 break;
889 }
890 }
891 }
Carl-Daniel Hailfinger202bf532010-12-06 13:05:44 +0000892 if (need_write)
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000893 first_len = min(i * stride - rel_start, len);
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000894 *first_start += rel_start;
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000895 return first_len;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000896}
897
Carl-Daniel Hailfingereaac68b2009-11-23 12:55:31 +0000898/* This function generates various test patterns useful for testing controller
899 * and chip communication as well as chip behaviour.
900 *
901 * If a byte can be written multiple times, each time keeping 0-bits at 0
902 * and changing 1-bits to 0 if the new value for that bit is 0, the effect
903 * is essentially an AND operation. That's also the reason why this function
904 * provides the result of AND between various patterns.
905 *
906 * Below is a list of patterns (and their block length).
907 * Pattern 0 is 05 15 25 35 45 55 65 75 85 95 a5 b5 c5 d5 e5 f5 (16 Bytes)
908 * Pattern 1 is 0a 1a 2a 3a 4a 5a 6a 7a 8a 9a aa ba ca da ea fa (16 Bytes)
909 * Pattern 2 is 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f (16 Bytes)
910 * Pattern 3 is a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af (16 Bytes)
911 * Pattern 4 is 00 10 20 30 40 50 60 70 80 90 a0 b0 c0 d0 e0 f0 (16 Bytes)
912 * Pattern 5 is 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f (16 Bytes)
913 * Pattern 6 is 00 (1 Byte)
914 * Pattern 7 is ff (1 Byte)
915 * Patterns 0-7 have a big-endian block number in the last 2 bytes of each 256
916 * byte block.
917 *
918 * Pattern 8 is 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11... (256 B)
919 * Pattern 9 is ff fe fd fc fb fa f9 f8 f7 f6 f5 f4 f3 f2 f1 f0 ef ee... (256 B)
920 * Pattern 10 is 00 00 00 01 00 02 00 03 00 04... (128 kB big-endian counter)
921 * Pattern 11 is ff ff ff fe ff fd ff fc ff fb... (128 kB big-endian downwards)
922 * Pattern 12 is 00 (1 Byte)
923 * Pattern 13 is ff (1 Byte)
924 * Patterns 8-13 have no block number.
925 *
926 * Patterns 0-3 are created to detect and efficiently diagnose communication
927 * slips like missed bits or bytes and their repetitive nature gives good visual
928 * cues to the person inspecting the results. In addition, the following holds:
929 * AND Pattern 0/1 == Pattern 4
930 * AND Pattern 2/3 == Pattern 5
931 * AND Pattern 0/1/2/3 == AND Pattern 4/5 == Pattern 6
932 * A weakness of pattern 0-5 is the inability to detect swaps/copies between
933 * any two 16-byte blocks except for the last 16-byte block in a 256-byte bloc.
934 * They work perfectly for detecting any swaps/aliasing of blocks >= 256 bytes.
935 * 0x5 and 0xa were picked because they are 0101 and 1010 binary.
936 * Patterns 8-9 are best for detecting swaps/aliasing of blocks < 256 bytes.
937 * Besides that, they provide for bit testing of the last two bytes of every
938 * 256 byte block which contains the block number for patterns 0-6.
939 * Patterns 10-11 are special purpose for detecting subblock aliasing with
940 * block sizes >256 bytes (some Dataflash chips etc.)
941 * AND Pattern 8/9 == Pattern 12
942 * AND Pattern 10/11 == Pattern 12
943 * Pattern 13 is the completely erased state.
944 * None of the patterns can detect aliasing at boundaries which are a multiple
945 * of 16 MBytes (but such chips do not exist anyway for Parallel/LPC/FWH/SPI).
946 */
947int generate_testpattern(uint8_t *buf, uint32_t size, int variant)
948{
949 int i;
950
951 if (!buf) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000952 msg_gerr("Invalid buffer!\n");
Carl-Daniel Hailfingereaac68b2009-11-23 12:55:31 +0000953 return 1;
954 }
955
956 switch (variant) {
957 case 0:
958 for (i = 0; i < size; i++)
959 buf[i] = (i & 0xf) << 4 | 0x5;
960 break;
961 case 1:
962 for (i = 0; i < size; i++)
963 buf[i] = (i & 0xf) << 4 | 0xa;
964 break;
965 case 2:
966 for (i = 0; i < size; i++)
967 buf[i] = 0x50 | (i & 0xf);
968 break;
969 case 3:
970 for (i = 0; i < size; i++)
971 buf[i] = 0xa0 | (i & 0xf);
972 break;
973 case 4:
974 for (i = 0; i < size; i++)
975 buf[i] = (i & 0xf) << 4;
976 break;
977 case 5:
978 for (i = 0; i < size; i++)
979 buf[i] = i & 0xf;
980 break;
981 case 6:
982 memset(buf, 0x00, size);
983 break;
984 case 7:
985 memset(buf, 0xff, size);
986 break;
987 case 8:
988 for (i = 0; i < size; i++)
989 buf[i] = i & 0xff;
990 break;
991 case 9:
992 for (i = 0; i < size; i++)
993 buf[i] = ~(i & 0xff);
994 break;
995 case 10:
996 for (i = 0; i < size % 2; i++) {
997 buf[i * 2] = (i >> 8) & 0xff;
998 buf[i * 2 + 1] = i & 0xff;
999 }
1000 if (size & 0x1)
1001 buf[i * 2] = (i >> 8) & 0xff;
1002 break;
1003 case 11:
1004 for (i = 0; i < size % 2; i++) {
1005 buf[i * 2] = ~((i >> 8) & 0xff);
1006 buf[i * 2 + 1] = ~(i & 0xff);
1007 }
1008 if (size & 0x1)
1009 buf[i * 2] = ~((i >> 8) & 0xff);
1010 break;
1011 case 12:
1012 memset(buf, 0x00, size);
1013 break;
1014 case 13:
1015 memset(buf, 0xff, size);
1016 break;
1017 }
1018
1019 if ((variant >= 0) && (variant <= 7)) {
1020 /* Write block number in the last two bytes of each 256-byte
1021 * block, big endian for easier reading of the hexdump.
1022 * Note that this wraps around for chips larger than 2^24 bytes
1023 * (16 MB).
1024 */
1025 for (i = 0; i < size / 256; i++) {
1026 buf[i * 256 + 254] = (i >> 8) & 0xff;
1027 buf[i * 256 + 255] = i & 0xff;
1028 }
1029 }
1030
1031 return 0;
1032}
1033
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001034int check_max_decode(enum chipbustype buses, uint32_t size)
1035{
1036 int limitexceeded = 0;
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001037
1038 if ((buses & BUS_PARALLEL) && (max_rom_decode.parallel < size)) {
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001039 limitexceeded++;
Sean Nelson316a29f2010-05-07 20:09:04 +00001040 msg_pdbg("Chip size %u kB is bigger than supported "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001041 "size %u kB of chipset/board/programmer "
1042 "for %s interface, "
1043 "probe/read/erase/write may fail. ", size / 1024,
1044 max_rom_decode.parallel / 1024, "Parallel");
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001045 }
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001046 if ((buses & BUS_LPC) && (max_rom_decode.lpc < size)) {
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001047 limitexceeded++;
Sean Nelson316a29f2010-05-07 20:09:04 +00001048 msg_pdbg("Chip size %u kB is bigger than supported "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001049 "size %u kB of chipset/board/programmer "
1050 "for %s interface, "
1051 "probe/read/erase/write may fail. ", size / 1024,
1052 max_rom_decode.lpc / 1024, "LPC");
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001053 }
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001054 if ((buses & BUS_FWH) && (max_rom_decode.fwh < size)) {
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001055 limitexceeded++;
Sean Nelson316a29f2010-05-07 20:09:04 +00001056 msg_pdbg("Chip size %u kB is bigger than supported "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001057 "size %u kB of chipset/board/programmer "
1058 "for %s interface, "
1059 "probe/read/erase/write may fail. ", size / 1024,
1060 max_rom_decode.fwh / 1024, "FWH");
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001061 }
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001062 if ((buses & BUS_SPI) && (max_rom_decode.spi < size)) {
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001063 limitexceeded++;
Sean Nelson316a29f2010-05-07 20:09:04 +00001064 msg_pdbg("Chip size %u kB is bigger than supported "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001065 "size %u kB of chipset/board/programmer "
1066 "for %s interface, "
1067 "probe/read/erase/write may fail. ", size / 1024,
1068 max_rom_decode.spi / 1024, "SPI");
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001069 }
1070 if (!limitexceeded)
1071 return 0;
1072 /* Sometimes chip and programmer have more than one bus in common,
1073 * and the limit is not exceeded on all buses. Tell the user.
1074 */
1075 if (bitcount(buses) > limitexceeded)
Carl-Daniel Hailfingera84835a2010-01-07 03:24:05 +00001076 /* FIXME: This message is designed towards CLI users. */
Sean Nelson316a29f2010-05-07 20:09:04 +00001077 msg_pdbg("There is at least one common chip/programmer "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001078 "interface which can support a chip of this size. "
1079 "You can try --force at your own risk.\n");
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001080 return 1;
1081}
1082
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001083int probe_flash(struct registered_programmer *pgm, int startchip, struct flashctx *flash, int force)
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001084{
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001085 const struct flashchip *chip;
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001086 unsigned long base = 0;
Stefan Reinauer051e2362011-01-19 06:21:54 +00001087 char location[64];
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001088 uint32_t size;
1089 enum chipbustype buses_common;
Carl-Daniel Hailfingerb22918c2009-06-01 02:08:58 +00001090 char *tmp;
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001091
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001092 for (chip = flashchips + startchip; chip && chip->name; chip++) {
1093 if (chip_to_probe && strcmp(chip->name, chip_to_probe) != 0)
Ollie Lhocbbf1252004-03-17 22:22:08 +00001094 continue;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001095 buses_common = pgm->buses_supported & chip->bustype;
Carl-Daniel Hailfingerc40cff72011-12-20 00:19:29 +00001096 if (!buses_common)
Carl-Daniel Hailfinger6573b742011-06-17 22:38:53 +00001097 continue;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001098 msg_gdbg("Probing for %s %s, %d kB: ", chip->vendor, chip->name, chip->total_size);
1099 if (!chip->probe && !force) {
1100 msg_gdbg("failed! flashrom has no probe function for this flash chip.\n");
Carl-Daniel Hailfingerb22918c2009-06-01 02:08:58 +00001101 continue;
1102 }
Stefan Reinauer70385642007-04-06 11:58:03 +00001103
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001104 size = chip->total_size * 1024;
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001105 check_max_decode(buses_common, size);
Stefan Reinauer70385642007-04-06 11:58:03 +00001106
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001107 /* Start filling in the dynamic data. */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001108 flash->chip = calloc(1, sizeof(struct flashchip));
1109 if (!flash->chip) {
1110 msg_gerr("Out of memory!\n");
1111 exit(1);
1112 }
1113 memcpy(flash->chip, chip, sizeof(struct flashchip));
1114 flash->pgm = pgm;
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001115
Carl-Daniel Hailfinger97d6b092009-05-09 07:27:23 +00001116 base = flashbase ? flashbase : (0xffffffff - size + 1);
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001117 flash->virtual_memory = (chipaddr)programmer_map_flash_region("flash chip", base, size);
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001118
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001119 /* We handle a forced match like a real match, we just avoid probing. Note that probe_flash()
1120 * is only called with force=1 after normal probing failed.
1121 */
Peter Stuge27c3e2d2008-07-02 17:15:47 +00001122 if (force)
1123 break;
Stefan Reinauerfcb63682006-03-16 16:57:41 +00001124
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001125 if (flash->chip->probe(flash) != 1)
Peter Stuge483b8f02008-09-03 23:10:05 +00001126 goto notfound;
1127
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001128 /* If this is the first chip found, accept it.
1129 * If this is not the first chip found, accept it only if it is
Stefan Taunerac1b4c82012-02-17 14:51:04 +00001130 * a non-generic match. SFDP and CFI are generic matches.
1131 * startchip==0 means this call to probe_flash() is the first
1132 * one for this programmer interface and thus no other chip has
1133 * been found on this interface.
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001134 */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001135 if (startchip == 0 && flash->chip->model_id == SFDP_DEVICE_ID) {
Stefan Taunerac1b4c82012-02-17 14:51:04 +00001136 msg_cinfo("===\n"
1137 "SFDP has autodetected a flash chip which is "
1138 "not natively supported by flashrom yet.\n");
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001139 if (count_usable_erasers(flash) == 0)
Stefan Taunerac1b4c82012-02-17 14:51:04 +00001140 msg_cinfo("The standard operations read and "
1141 "verify should work, but to support "
1142 "erase, write and all other "
1143 "possible features");
1144 else
1145 msg_cinfo("All standard operations (read, "
1146 "verify, erase and write) should "
1147 "work, but to support all possible "
1148 "features");
1149
Stefan Taunerb4e06bd2012-08-20 00:24:22 +00001150 msg_cinfo(" we need to add them manually.\n"
1151 "You can help us by mailing us the output of the following command to "
1152 "flashrom@flashrom.org:\n"
1153 "'flashrom -VV [plus the -p/--programmer parameter]'\n"
1154 "Thanks for your help!\n"
Stefan Taunerac1b4c82012-02-17 14:51:04 +00001155 "===\n");
1156 }
1157
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001158 /* First flash chip detected on this bus. */
1159 if (startchip == 0)
Peter Stuge27c3e2d2008-07-02 17:15:47 +00001160 break;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001161 /* Not the first flash chip detected on this bus, but not a generic match either. */
1162 if ((flash->chip->model_id != GENERIC_DEVICE_ID) && (flash->chip->model_id != SFDP_DEVICE_ID))
1163 break;
1164 /* Not the first flash chip detected on this bus, and it's just a generic match. Ignore it. */
Peter Stuge483b8f02008-09-03 23:10:05 +00001165notfound:
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001166 programmer_unmap_flash_region((void *)flash->virtual_memory, size);
1167 flash->virtual_memory = (chipaddr)NULL;
1168 free(flash->chip);
1169 flash->chip = NULL;
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001170 }
Uwe Hermannffec5f32007-08-23 16:08:21 +00001171
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001172 if (!flash->chip)
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001173 return -1;
Peter Stuge27c3e2d2008-07-02 17:15:47 +00001174
Carl-Daniel Hailfingerd9535582011-03-08 00:09:11 +00001175#if CONFIG_INTERNAL == 1
1176 if (programmer_table[programmer].map_flash_region == physmap)
Stefan Reinauer051e2362011-01-19 06:21:54 +00001177 snprintf(location, sizeof(location), "at physical address 0x%lx", base);
Carl-Daniel Hailfingerd9535582011-03-08 00:09:11 +00001178 else
1179#endif
Stefan Reinauer051e2362011-01-19 06:21:54 +00001180 snprintf(location, sizeof(location), "on %s", programmer_table[programmer].name);
Stefan Reinauer051e2362011-01-19 06:21:54 +00001181
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001182 tmp = flashbuses_to_text(flash->chip->bustype);
1183 msg_cinfo("%s %s flash chip \"%s\" (%d kB, %s) %s.\n", force ? "Assuming" : "Found",
1184 flash->chip->vendor, flash->chip->name, flash->chip->total_size, tmp, location);
Stefan Tauner00155492011-06-26 20:45:35 +00001185 free(tmp);
Uwe Hermann9899cad2009-06-28 21:47:57 +00001186
Carl-Daniel Hailfinger859f3f02010-12-02 21:59:42 +00001187 /* Flash registers will not be mapped if the chip was forced. Lock info
1188 * may be stored in registers, so avoid lock info printing.
1189 */
1190 if (!force)
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001191 if (flash->chip->printlock)
1192 flash->chip->printlock(flash);
Sean Nelson6e0b9122010-02-19 00:52:10 +00001193
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001194 /* Return position of matching chip. */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001195 return chip - flashchips;
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001196}
1197
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001198int read_buf_from_file(unsigned char *buf, unsigned long size,
1199 const char *filename)
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001200{
Nico Huber7562f7d2013-08-30 21:29:45 +00001201#ifdef __LIBPAYLOAD__
1202 msg_gerr("Error: No file I/O support in libpayload\n");
1203 return 1;
1204#else
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001205 unsigned long numbytes;
1206 FILE *image;
1207 struct stat image_stat;
1208
1209 if ((image = fopen(filename, "rb")) == NULL) {
Stefan Tauner363fd7e2013-04-07 13:08:30 +00001210 msg_gerr("Error: opening file \"%s\" failed: %s\n", filename, strerror(errno));
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001211 return 1;
1212 }
1213 if (fstat(fileno(image), &image_stat) != 0) {
Stefan Tauner363fd7e2013-04-07 13:08:30 +00001214 msg_gerr("Error: getting metadata of file \"%s\" failed: %s\n", filename, strerror(errno));
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001215 fclose(image);
1216 return 1;
1217 }
1218 if (image_stat.st_size != size) {
Carl-Daniel Hailfinger11990da2013-07-13 23:21:05 +00001219 msg_gerr("Error: Image size (%jd B) doesn't match the flash chip's size (%lu B)!\n",
Stefan Taunere038e902013-02-04 04:38:42 +00001220 (intmax_t)image_stat.st_size, size);
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001221 fclose(image);
1222 return 1;
1223 }
1224 numbytes = fread(buf, 1, size, image);
1225 if (fclose(image)) {
Stefan Tauner363fd7e2013-04-07 13:08:30 +00001226 msg_gerr("Error: closing file \"%s\" failed: %s\n", filename, strerror(errno));
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001227 return 1;
1228 }
1229 if (numbytes != size) {
1230 msg_gerr("Error: Failed to read complete file. Got %ld bytes, "
1231 "wanted %ld!\n", numbytes, size);
1232 return 1;
1233 }
1234 return 0;
Nico Huber7562f7d2013-08-30 21:29:45 +00001235#endif
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001236}
1237
Mark Marshallf20b7be2014-05-09 21:16:21 +00001238int write_buf_to_file(const unsigned char *buf, unsigned long size, const char *filename)
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001239{
Nico Huber7562f7d2013-08-30 21:29:45 +00001240#ifdef __LIBPAYLOAD__
1241 msg_gerr("Error: No file I/O support in libpayload\n");
1242 return 1;
1243#else
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001244 unsigned long numbytes;
1245 FILE *image;
Stephan Guilloux21dd55b2009-06-01 22:07:52 +00001246
1247 if (!filename) {
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001248 msg_gerr("No filename specified.\n");
Stephan Guilloux21dd55b2009-06-01 22:07:52 +00001249 return 1;
1250 }
Patrick Georgi0bf842d2010-01-25 22:55:33 +00001251 if ((image = fopen(filename, "wb")) == NULL) {
Stefan Tauner363fd7e2013-04-07 13:08:30 +00001252 msg_gerr("Error: opening file \"%s\" failed: %s\n", filename, strerror(errno));
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00001253 return 1;
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001254 }
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001255
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001256 numbytes = fwrite(buf, 1, size, image);
1257 fclose(image);
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001258 if (numbytes != size) {
1259 msg_gerr("File %s could not be written completely.\n",
1260 filename);
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001261 return 1;
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001262 }
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001263 return 0;
Nico Huber7562f7d2013-08-30 21:29:45 +00001264#endif
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001265}
1266
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001267int read_flash_to_file(struct flashctx *flash, const char *filename)
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001268{
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001269 unsigned long size = flash->chip->total_size * 1024;
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001270 unsigned char *buf = calloc(size, sizeof(char));
1271 int ret = 0;
1272
1273 msg_cinfo("Reading flash... ");
1274 if (!buf) {
1275 msg_gerr("Memory allocation failed!\n");
1276 msg_cinfo("FAILED.\n");
1277 return 1;
1278 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001279 if (!flash->chip->read) {
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001280 msg_cerr("No read function available for this flash chip.\n");
1281 ret = 1;
1282 goto out_free;
1283 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001284 if (flash->chip->read(flash, buf, 0, size)) {
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001285 msg_cerr("Read operation failed!\n");
1286 ret = 1;
1287 goto out_free;
1288 }
1289
Stefan Tauner355cbfd2011-05-28 02:37:14 +00001290 ret = write_buf_to_file(buf, size, filename);
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001291out_free:
1292 free(buf);
1293 msg_cinfo("%s.\n", ret ? "FAILED" : "done");
1294 return ret;
1295}
1296
Stefan Tauner96658be2014-05-26 22:05:31 +00001297/* Even if an error is found, the function will keep going and check the rest. */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001298static int selfcheck_eraseblocks(const struct flashchip *chip)
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001299{
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +00001300 int i, j, k;
1301 int ret = 0;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001302
1303 for (k = 0; k < NUM_ERASEFUNCTIONS; k++) {
1304 unsigned int done = 0;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001305 struct block_eraser eraser = chip->block_erasers[k];
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001306
1307 for (i = 0; i < NUM_ERASEREGIONS; i++) {
1308 /* Blocks with zero size are bugs in flashchips.c. */
1309 if (eraser.eraseblocks[i].count &&
1310 !eraser.eraseblocks[i].size) {
1311 msg_gerr("ERROR: Flash chip %s erase function "
1312 "%i region %i has size 0. Please report"
1313 " a bug at flashrom@flashrom.org\n",
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001314 chip->name, k, i);
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001315 ret = 1;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001316 }
1317 /* Blocks with zero count are bugs in flashchips.c. */
1318 if (!eraser.eraseblocks[i].count &&
1319 eraser.eraseblocks[i].size) {
1320 msg_gerr("ERROR: Flash chip %s erase function "
1321 "%i region %i has count 0. Please report"
1322 " a bug at flashrom@flashrom.org\n",
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001323 chip->name, k, i);
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001324 ret = 1;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001325 }
1326 done += eraser.eraseblocks[i].count *
1327 eraser.eraseblocks[i].size;
1328 }
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001329 /* Empty eraseblock definition with erase function. */
1330 if (!done && eraser.block_erase)
Sean Nelson316a29f2010-05-07 20:09:04 +00001331 msg_gspew("Strange: Empty eraseblock definition with "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001332 "non-empty erase function. Not an error.\n");
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001333 if (!done)
1334 continue;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001335 if (done != chip->total_size * 1024) {
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001336 msg_gerr("ERROR: Flash chip %s erase function %i "
1337 "region walking resulted in 0x%06x bytes total,"
1338 " expected 0x%06x bytes. Please report a bug at"
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001339 " flashrom@flashrom.org\n", chip->name, k,
1340 done, chip->total_size * 1024);
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001341 ret = 1;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001342 }
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001343 if (!eraser.block_erase)
1344 continue;
1345 /* Check if there are identical erase functions for different
1346 * layouts. That would imply "magic" erase functions. The
1347 * easiest way to check this is with function pointers.
1348 */
Uwe Hermann43959702010-03-13 17:28:29 +00001349 for (j = k + 1; j < NUM_ERASEFUNCTIONS; j++) {
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001350 if (eraser.block_erase ==
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001351 chip->block_erasers[j].block_erase) {
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001352 msg_gerr("ERROR: Flash chip %s erase function "
1353 "%i and %i are identical. Please report"
1354 " a bug at flashrom@flashrom.org\n",
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001355 chip->name, k, j);
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001356 ret = 1;
1357 }
Uwe Hermann43959702010-03-13 17:28:29 +00001358 }
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001359 }
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001360 return ret;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001361}
1362
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001363static int erase_and_write_block_helper(struct flashctx *flash,
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001364 unsigned int start, unsigned int len,
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001365 uint8_t *curcontents,
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001366 uint8_t *newcontents,
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001367 int (*erasefn) (struct flashctx *flash,
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001368 unsigned int addr,
1369 unsigned int len))
1370{
Stefan Taunerc69c9c82011-11-23 09:13:48 +00001371 unsigned int starthere = 0, lenhere = 0;
1372 int ret = 0, skip = 1, writecount = 0;
Stefan Tauner50d67aa2013-03-03 23:49:48 +00001373 enum write_granularity gran = flash->chip->gran;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001374
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001375 /* curcontents and newcontents are opaque to walk_eraseregions, and
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001376 * need to be adjusted here to keep the impression of proper abstraction
1377 */
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001378 curcontents += start;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001379 newcontents += start;
1380 msg_cdbg(":");
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001381 if (need_erase(curcontents, newcontents, len, gran)) {
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001382 msg_cdbg("E");
1383 ret = erasefn(flash, start, len);
1384 if (ret)
1385 return ret;
Carl-Daniel Hailfingerb4061f62011-06-26 17:04:16 +00001386 if (check_erased_range(flash, start, len)) {
1387 msg_cerr("ERASE FAILED!\n");
1388 return -1;
1389 }
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001390 /* Erase was successful. Adjust curcontents. */
1391 memset(curcontents, 0xff, len);
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001392 skip = 0;
1393 }
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001394 /* get_next_write() sets starthere to a new value after the call. */
1395 while ((lenhere = get_next_write(curcontents + starthere,
1396 newcontents + starthere,
1397 len - starthere, &starthere, gran))) {
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001398 if (!writecount++)
1399 msg_cdbg("W");
1400 /* Needs the partial write function signature. */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001401 ret = flash->chip->write(flash, newcontents + starthere,
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001402 start + starthere, lenhere);
1403 if (ret)
1404 return ret;
1405 starthere += lenhere;
1406 skip = 0;
1407 }
1408 if (skip)
1409 msg_cdbg("S");
Stefan Tauner682122b2013-06-23 22:15:39 +00001410 else
1411 all_skipped = false;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001412 return ret;
1413}
1414
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001415static int walk_eraseregions(struct flashctx *flash, int erasefunction,
1416 int (*do_something) (struct flashctx *flash,
Carl-Daniel Hailfinger4d3e9ca2010-07-13 00:42:00 +00001417 unsigned int addr,
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001418 unsigned int len,
1419 uint8_t *param1,
1420 uint8_t *param2,
1421 int (*erasefn) (
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001422 struct flashctx *flash,
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001423 unsigned int addr,
1424 unsigned int len)),
1425 void *param1, void *param2)
Carl-Daniel Hailfingera1223412010-07-13 00:37:19 +00001426{
1427 int i, j;
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +00001428 unsigned int start = 0;
1429 unsigned int len;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001430 struct block_eraser eraser = flash->chip->block_erasers[erasefunction];
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001431
Carl-Daniel Hailfingera1223412010-07-13 00:37:19 +00001432 for (i = 0; i < NUM_ERASEREGIONS; i++) {
1433 /* count==0 for all automatically initialized array
1434 * members so the loop below won't be executed for them.
1435 */
1436 len = eraser.eraseblocks[i].size;
1437 for (j = 0; j < eraser.eraseblocks[i].count; j++) {
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001438 /* Print this for every block except the first one. */
1439 if (i || j)
1440 msg_cdbg(", ");
1441 msg_cdbg("0x%06x-0x%06x", start,
Carl-Daniel Hailfingera1223412010-07-13 00:37:19 +00001442 start + len - 1);
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001443 if (do_something(flash, start, len, param1, param2,
1444 eraser.block_erase)) {
Carl-Daniel Hailfingera1223412010-07-13 00:37:19 +00001445 return 1;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001446 }
Carl-Daniel Hailfingera1223412010-07-13 00:37:19 +00001447 start += len;
1448 }
1449 }
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001450 msg_cdbg("\n");
Carl-Daniel Hailfingera1223412010-07-13 00:37:19 +00001451 return 0;
1452}
1453
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001454static int check_block_eraser(const struct flashctx *flash, int k, int log)
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001455{
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001456 struct block_eraser eraser = flash->chip->block_erasers[k];
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001457
1458 if (!eraser.block_erase && !eraser.eraseblocks[0].count) {
1459 if (log)
1460 msg_cdbg("not defined. ");
1461 return 1;
1462 }
1463 if (!eraser.block_erase && eraser.eraseblocks[0].count) {
1464 if (log)
1465 msg_cdbg("eraseblock layout is known, but matching "
Stefan Tauner355cbfd2011-05-28 02:37:14 +00001466 "block erase function is not implemented. ");
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001467 return 1;
1468 }
1469 if (eraser.block_erase && !eraser.eraseblocks[0].count) {
1470 if (log)
1471 msg_cdbg("block erase function found, but "
Stefan Tauner355cbfd2011-05-28 02:37:14 +00001472 "eraseblock layout is not defined. ");
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001473 return 1;
1474 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001475 // TODO: Once erase functions are annotated with allowed buses, check that as well.
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001476 return 0;
1477}
1478
Mark Marshallf20b7be2014-05-09 21:16:21 +00001479int erase_and_write_flash(struct flashctx *flash, uint8_t *oldcontents, uint8_t *newcontents)
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001480{
Carl-Daniel Hailfingerd8334db2011-07-21 21:21:04 +00001481 int k, ret = 1;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001482 uint8_t *curcontents;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001483 unsigned long size = flash->chip->total_size * 1024;
Sylvain "ythier" Hitier9db45512011-07-04 07:27:17 +00001484 unsigned int usable_erasefunctions = count_usable_erasers(flash);
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001485
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001486 msg_cinfo("Erasing and writing flash chip... ");
Stefan Tauner269de352011-07-12 22:35:21 +00001487 curcontents = malloc(size);
1488 if (!curcontents) {
1489 msg_gerr("Out of memory!\n");
1490 exit(1);
1491 }
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001492 /* Copy oldcontents to curcontents to avoid clobbering oldcontents. */
1493 memcpy(curcontents, oldcontents, size);
1494
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001495 for (k = 0; k < NUM_ERASEFUNCTIONS; k++) {
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001496 if (k != 0)
1497 msg_cdbg("Looking for another erase function.\n");
Carl-Daniel Hailfingerd8334db2011-07-21 21:21:04 +00001498 if (!usable_erasefunctions) {
1499 msg_cdbg("No usable erase functions left.\n");
1500 break;
1501 }
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001502 msg_cdbg("Trying erase function %i... ", k);
1503 if (check_block_eraser(flash, k, 1))
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001504 continue;
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001505 usable_erasefunctions--;
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001506 ret = walk_eraseregions(flash, k, &erase_and_write_block_helper,
1507 curcontents, newcontents);
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001508 /* If everything is OK, don't try another erase function. */
1509 if (!ret)
1510 break;
Carl-Daniel Hailfingerb23b1eb2010-12-02 02:41:55 +00001511 /* Write/erase failed, so try to find out what the current chip
Carl-Daniel Hailfingerd8334db2011-07-21 21:21:04 +00001512 * contents are. If no usable erase functions remain, we can
1513 * skip this: the next iteration will break immediately anyway.
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001514 */
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001515 if (!usable_erasefunctions)
1516 continue;
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001517 /* Reading the whole chip may take a while, inform the user even
1518 * in non-verbose mode.
1519 */
1520 msg_cinfo("Reading current flash chip contents... ");
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001521 if (flash->chip->read(flash, curcontents, 0, size)) {
Carl-Daniel Hailfingerb23b1eb2010-12-02 02:41:55 +00001522 /* Now we are truly screwed. Read failed as well. */
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001523 msg_cerr("Can't read anymore! Aborting.\n");
Carl-Daniel Hailfingerb23b1eb2010-12-02 02:41:55 +00001524 /* We have no idea about the flash chip contents, so
1525 * retrying with another erase function is pointless.
1526 */
1527 break;
1528 }
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001529 msg_cinfo("done. ");
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001530 }
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001531 /* Free the scratchpad. */
1532 free(curcontents);
Carl-Daniel Hailfingerf160a122009-05-08 17:15:15 +00001533
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001534 if (ret) {
Sean Nelson316a29f2010-05-07 20:09:04 +00001535 msg_cerr("FAILED!\n");
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001536 } else {
Stefan Tauner682122b2013-06-23 22:15:39 +00001537 if (all_skipped)
1538 msg_cinfo("\nWarning: Chip content is identical to the requested image.\n");
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001539 msg_cinfo("Erase/write done.\n");
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001540 }
1541 return ret;
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001542}
1543
Stefan Tauner136388f2013-07-15 10:47:53 +00001544static void nonfatal_help_message(void)
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001545{
Stefan Taunera58f6e92014-05-10 09:25:44 +00001546 msg_gerr("Good, writing to the flash chip apparently didn't do anything.\n");
Stefan Tauner136388f2013-07-15 10:47:53 +00001547#if CONFIG_INTERNAL == 1
1548 if (programmer == PROGRAMMER_INTERNAL)
1549 msg_gerr("This means we have to add special support for your board, programmer or flash\n"
1550 "chip. Please report this on IRC at chat.freenode.net (channel #flashrom) or\n"
1551 "mail flashrom@flashrom.org, thanks!\n"
1552 "-------------------------------------------------------------------------------\n"
1553 "You may now reboot or simply leave the machine running.\n");
1554 else
1555#endif
1556 msg_gerr("Please check the connections (especially those to write protection pins) between\n"
1557 "the programmer and the flash chip. If you think the error is caused by flashrom\n"
1558 "please report this on IRC at chat.freenode.net (channel #flashrom) or\n"
1559 "mail flashrom@flashrom.org, thanks!\n");
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001560}
1561
Stefan Tauner136388f2013-07-15 10:47:53 +00001562static void emergency_help_message(void)
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00001563{
Stefan Tauner136388f2013-07-15 10:47:53 +00001564 msg_gerr("Your flash chip is in an unknown state.\n");
1565#if CONFIG_INTERNAL == 1
1566 if (programmer == PROGRAMMER_INTERNAL)
1567 msg_gerr("Get help on IRC at chat.freenode.net (channel #flashrom) or\n"
1568 "mail flashrom@flashrom.org with the subject \"FAILED: <your board name>\"!\n"
1569 "-------------------------------------------------------------------------------\n"
1570 "DO NOT REBOOT OR POWEROFF!\n");
1571 else
1572#endif
1573 msg_gerr("Please report this on IRC at chat.freenode.net (channel #flashrom) or\n"
1574 "mail flashrom@flashrom.org, thanks!\n");
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00001575}
1576
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001577/* The way to go if you want a delimited list of programmers */
Stefan Tauner66652442011-06-26 17:38:17 +00001578void list_programmers(const char *delim)
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001579{
1580 enum programmer p;
1581 for (p = 0; p < PROGRAMMER_INVALID; p++) {
Sean Nelson316a29f2010-05-07 20:09:04 +00001582 msg_ginfo("%s", programmer_table[p].name);
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001583 if (p < PROGRAMMER_INVALID - 1)
Sean Nelson316a29f2010-05-07 20:09:04 +00001584 msg_ginfo("%s", delim);
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001585 }
Sean Nelson316a29f2010-05-07 20:09:04 +00001586 msg_ginfo("\n");
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001587}
1588
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001589void list_programmers_linebreak(int startcol, int cols, int paren)
1590{
1591 const char *pname;
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +00001592 int pnamelen;
1593 int remaining = 0, firstline = 1;
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001594 enum programmer p;
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +00001595 int i;
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001596
1597 for (p = 0; p < PROGRAMMER_INVALID; p++) {
1598 pname = programmer_table[p].name;
1599 pnamelen = strlen(pname);
1600 if (remaining - pnamelen - 2 < 0) {
1601 if (firstline)
1602 firstline = 0;
1603 else
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001604 msg_ginfo("\n");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001605 for (i = 0; i < startcol; i++)
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001606 msg_ginfo(" ");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001607 remaining = cols - startcol;
1608 } else {
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001609 msg_ginfo(" ");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001610 remaining--;
1611 }
1612 if (paren && (p == 0)) {
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001613 msg_ginfo("(");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001614 remaining--;
1615 }
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001616 msg_ginfo("%s", pname);
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001617 remaining -= pnamelen;
1618 if (p < PROGRAMMER_INVALID - 1) {
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001619 msg_ginfo(",");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001620 remaining--;
1621 } else {
1622 if (paren)
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001623 msg_ginfo(")");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001624 }
1625 }
1626}
1627
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001628void print_sysinfo(void)
1629{
Carl-Daniel Hailfinger60d9bd22012-08-09 23:34:41 +00001630#ifdef _WIN32
1631 SYSTEM_INFO si;
1632 OSVERSIONINFOEX osvi;
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001633
Carl-Daniel Hailfinger60d9bd22012-08-09 23:34:41 +00001634 memset(&si, 0, sizeof(SYSTEM_INFO));
1635 memset(&osvi, 0, sizeof(OSVERSIONINFOEX));
1636 msg_ginfo(" on Windows");
1637 /* Tell Windows which version of the structure we want. */
1638 osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
1639 if (GetVersionEx((OSVERSIONINFO*) &osvi))
1640 msg_ginfo(" %lu.%lu", osvi.dwMajorVersion, osvi.dwMinorVersion);
1641 else
1642 msg_ginfo(" unknown version");
1643 GetSystemInfo(&si);
1644 switch (si.wProcessorArchitecture) {
1645 case PROCESSOR_ARCHITECTURE_AMD64:
1646 msg_ginfo(" (x86_64)");
1647 break;
1648 case PROCESSOR_ARCHITECTURE_INTEL:
1649 msg_ginfo(" (x86)");
1650 break;
1651 default:
1652 msg_ginfo(" (unknown arch)");
1653 break;
1654 }
1655#elif HAVE_UTSNAME == 1
1656 struct utsname osinfo;
1657
1658 uname(&osinfo);
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001659 msg_ginfo(" on %s %s (%s)", osinfo.sysname, osinfo.release,
1660 osinfo.machine);
1661#else
1662 msg_ginfo(" on unknown machine");
1663#endif
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001664}
1665
1666void print_buildinfo(void)
1667{
1668 msg_gdbg("flashrom was built with");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001669#if NEED_PCI == 1
1670#ifdef PCILIB_VERSION
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001671 msg_gdbg(" libpci %s,", PCILIB_VERSION);
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001672#else
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001673 msg_gdbg(" unknown PCI library,");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001674#endif
1675#endif
1676#ifdef __clang__
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001677 msg_gdbg(" LLVM Clang");
Carl-Daniel Hailfingerb51e58e2010-07-17 14:49:30 +00001678#ifdef __clang_version__
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001679 msg_gdbg(" %s,", __clang_version__);
Carl-Daniel Hailfingerb51e58e2010-07-17 14:49:30 +00001680#else
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001681 msg_gdbg(" unknown version (before r102686),");
Carl-Daniel Hailfingerb51e58e2010-07-17 14:49:30 +00001682#endif
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001683#elif defined(__GNUC__)
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001684 msg_gdbg(" GCC");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001685#ifdef __VERSION__
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001686 msg_gdbg(" %s,", __VERSION__);
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001687#else
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001688 msg_gdbg(" unknown version,");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001689#endif
1690#else
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001691 msg_gdbg(" unknown compiler,");
Carl-Daniel Hailfingercceafa22010-05-26 01:45:41 +00001692#endif
1693#if defined (__FLASHROM_LITTLE_ENDIAN__)
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001694 msg_gdbg(" little endian");
Carl-Daniel Hailfinger06b9efa2012-08-07 11:59:59 +00001695#elif defined (__FLASHROM_BIG_ENDIAN__)
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001696 msg_gdbg(" big endian");
Carl-Daniel Hailfinger06b9efa2012-08-07 11:59:59 +00001697#else
1698#error Endianness could not be determined
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001699#endif
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001700 msg_gdbg("\n");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001701}
1702
Bernhard Walle201bde32008-01-21 15:24:22 +00001703void print_version(void)
1704{
Carl-Daniel Hailfinger8841d3e2010-05-15 15:04:37 +00001705 msg_ginfo("flashrom v%s", flashrom_version);
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001706 print_sysinfo();
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001707 msg_ginfo("\n");
Bernhard Walle201bde32008-01-21 15:24:22 +00001708}
1709
Carl-Daniel Hailfinger8841d3e2010-05-15 15:04:37 +00001710void print_banner(void)
1711{
1712 msg_ginfo("flashrom is free software, get the source code at "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001713 "http://www.flashrom.org\n");
Carl-Daniel Hailfinger8841d3e2010-05-15 15:04:37 +00001714 msg_ginfo("\n");
1715}
1716
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001717int selfcheck(void)
1718{
Stefan Tauner96658be2014-05-26 22:05:31 +00001719 unsigned int i;
Stefan Taunera6d96482012-12-26 19:51:23 +00001720 int ret = 0;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001721
1722 /* Safety check. Instead of aborting after the first error, check
1723 * if more errors exist.
1724 */
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001725 if (ARRAY_SIZE(programmer_table) - 1 != PROGRAMMER_INVALID) {
Sean Nelson316a29f2010-05-07 20:09:04 +00001726 msg_gerr("Programmer table miscompilation!\n");
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001727 ret = 1;
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001728 }
Stefan Taunera6d96482012-12-26 19:51:23 +00001729 for (i = 0; i < PROGRAMMER_INVALID; i++) {
1730 const struct programmer_entry p = programmer_table[i];
1731 if (p.name == NULL) {
1732 msg_gerr("All programmers need a valid name, but the one with index %d does not!\n", i);
1733 ret = 1;
1734 /* This might hide other problems with this programmer, but allows for better error
1735 * messages below without jumping through hoops. */
1736 continue;
1737 }
Stefan Tauneraf358d62012-12-27 18:40:26 +00001738 switch (p.type) {
1739 case USB:
1740 case PCI:
1741 case OTHER:
1742 if (p.devs.note == NULL) {
1743 if (strcmp("internal", p.name) == 0)
1744 break; /* This one has its device list stored separately. */
1745 msg_gerr("Programmer %s has neither a device list nor a textual description!\n",
1746 p.name);
1747 ret = 1;
1748 }
1749 break;
1750 default:
1751 msg_gerr("Programmer %s does not have a valid type set!\n", p.name);
1752 ret = 1;
1753 break;
1754 }
Stefan Taunera6d96482012-12-26 19:51:23 +00001755 if (p.init == NULL) {
1756 msg_gerr("Programmer %s does not have a valid init function!\n", p.name);
1757 ret = 1;
1758 }
1759 if (p.delay == NULL) {
1760 msg_gerr("Programmer %s does not have a valid delay function!\n", p.name);
1761 ret = 1;
1762 }
1763 if (p.map_flash_region == NULL) {
1764 msg_gerr("Programmer %s does not have a valid map_flash_region function!\n", p.name);
1765 ret = 1;
1766 }
1767 if (p.unmap_flash_region == NULL) {
1768 msg_gerr("Programmer %s does not have a valid unmap_flash_region function!\n", p.name);
1769 ret = 1;
1770 }
1771 }
Stefan Tauner96658be2014-05-26 22:05:31 +00001772
1773 /* It would be favorable if we could check for the correct layout (especially termination) of various
1774 * constant arrays: flashchips, chipset_enables, board_matches, boards_known, laptops_known.
1775 * They are all defined as externs in this compilation unit so we don't know their sizes which vary
1776 * depending on compiler flags, e.g. the target architecture, and can sometimes be 0.
1777 * For 'flashchips' we export the size explicitly to work around this and to be able to implement the
1778 * checks below. */
1779 if (flashchips_size <= 1 || flashchips[flashchips_size-1].name != NULL) {
Stefan Tauner7bcacb12011-05-26 01:35:19 +00001780 msg_gerr("Flashchips table miscompilation!\n");
1781 ret = 1;
Stefan Tauner96658be2014-05-26 22:05:31 +00001782 } else {
1783 for (i = 0; i < flashchips_size - 1; i++) {
1784 const struct flashchip *chip = &flashchips[i];
1785 if (chip->vendor == NULL || chip->name == NULL || chip->bustype == BUS_NONE) {
1786 ret = 1;
1787 msg_gerr("ERROR: Some field of flash chip #%d (%s) is misconfigured.\n"
1788 "Please report a bug at flashrom@flashrom.org\n", i,
1789 chip->name == NULL ? "unnamed" : chip->name);
1790 }
1791 if (selfcheck_eraseblocks(chip)) {
1792 ret = 1;
1793 }
1794 }
Stefan Tauner7bcacb12011-05-26 01:35:19 +00001795 }
Stefan Tauner7bcacb12011-05-26 01:35:19 +00001796
Stefan Tauner96658be2014-05-26 22:05:31 +00001797 /* TODO: implement similar sanity checks for other arrays where deemed necessary. */
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001798 return ret;
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001799}
1800
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001801void check_chip_supported(const struct flashchip *chip)
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001802{
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001803 if (chip->feature_bits & FEATURE_OTP) {
Daniel Lenski65922a32012-02-15 23:40:23 +00001804 msg_cdbg("This chip may contain one-time programmable memory. "
1805 "flashrom cannot read\nand may never be able to write "
1806 "it, hence it may not be able to completely\n"
1807 "clone the contents of this chip (see man page for "
1808 "details).\n");
1809 }
Stefan Tauner6455dff2014-05-26 00:36:24 +00001810
1811 if ((chip->tested.erase == NA) && (chip->tested.write == NA)) {
1812 msg_cdbg("This chip's main memory can not be erased/written by design.\n");
1813 }
1814
1815 if ((chip->tested.probe == BAD) || (chip->tested.probe == NT) ||
1816 (chip->tested.read == BAD) || (chip->tested.read == NT) ||
1817 (chip->tested.erase == BAD) || (chip->tested.erase == NT) ||
1818 (chip->tested.write == BAD) || (chip->tested.write == NT)){
Sean Nelson316a29f2010-05-07 20:09:04 +00001819 msg_cinfo("===\n");
Stefan Tauner6455dff2014-05-26 00:36:24 +00001820 if ((chip->tested.probe == BAD) ||
1821 (chip->tested.read == BAD) ||
1822 (chip->tested.erase == BAD) ||
1823 (chip->tested.write == BAD)) {
Sean Nelson316a29f2010-05-07 20:09:04 +00001824 msg_cinfo("This flash part has status NOT WORKING for operations:");
Stefan Tauner6455dff2014-05-26 00:36:24 +00001825 if (chip->tested.probe == BAD)
Sean Nelson316a29f2010-05-07 20:09:04 +00001826 msg_cinfo(" PROBE");
Stefan Tauner6455dff2014-05-26 00:36:24 +00001827 if (chip->tested.read == BAD)
Sean Nelson316a29f2010-05-07 20:09:04 +00001828 msg_cinfo(" READ");
Stefan Tauner6455dff2014-05-26 00:36:24 +00001829 if (chip->tested.erase == BAD)
Sean Nelson316a29f2010-05-07 20:09:04 +00001830 msg_cinfo(" ERASE");
Stefan Tauner6455dff2014-05-26 00:36:24 +00001831 if (chip->tested.write == BAD)
Sean Nelson316a29f2010-05-07 20:09:04 +00001832 msg_cinfo(" WRITE");
1833 msg_cinfo("\n");
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001834 }
Stefan Tauner6455dff2014-05-26 00:36:24 +00001835 if ((chip->tested.probe == NT) ||
1836 (chip->tested.read == NT) ||
1837 (chip->tested.erase == NT) ||
1838 (chip->tested.write == NT)) {
Sean Nelson316a29f2010-05-07 20:09:04 +00001839 msg_cinfo("This flash part has status UNTESTED for operations:");
Stefan Tauner6455dff2014-05-26 00:36:24 +00001840 if (chip->tested.probe == NT)
Sean Nelson316a29f2010-05-07 20:09:04 +00001841 msg_cinfo(" PROBE");
Stefan Tauner6455dff2014-05-26 00:36:24 +00001842 if (chip->tested.read == NT)
Sean Nelson316a29f2010-05-07 20:09:04 +00001843 msg_cinfo(" READ");
Stefan Tauner6455dff2014-05-26 00:36:24 +00001844 if (chip->tested.erase == NT)
Sean Nelson316a29f2010-05-07 20:09:04 +00001845 msg_cinfo(" ERASE");
Stefan Tauner6455dff2014-05-26 00:36:24 +00001846 if (chip->tested.write == NT)
Sean Nelson316a29f2010-05-07 20:09:04 +00001847 msg_cinfo(" WRITE");
1848 msg_cinfo("\n");
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001849 }
Carl-Daniel Hailfingera84835a2010-01-07 03:24:05 +00001850 /* FIXME: This message is designed towards CLI users. */
Carl-Daniel Hailfinger8841d3e2010-05-15 15:04:37 +00001851 msg_cinfo("The test status of this chip may have been updated "
1852 "in the latest development\n"
1853 "version of flashrom. If you are running the latest "
1854 "development version,\n"
1855 "please email a report to flashrom@flashrom.org if "
1856 "any of the above operations\n"
1857 "work correctly for you with this flash part. Please "
1858 "include the flashrom\n"
1859 "output with the additional -V option for all "
1860 "operations you tested (-V, -Vr,\n"
Paul Menzele3800132012-01-12 13:58:43 +00001861 "-VE, -Vw), and mention which mainboard or "
Carl-Daniel Hailfinger8841d3e2010-05-15 15:04:37 +00001862 "programmer you tested.\n"
Paul Menzelab6328f2010-10-08 11:03:02 +00001863 "Please mention your board in the subject line. "
1864 "Thanks for your help!\n");
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001865 }
1866}
1867
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001868/* FIXME: This function signature needs to be improved once doit() has a better
1869 * function signature.
1870 */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001871int chip_safety_check(const struct flashctx *flash, int force, int read_it, int write_it, int erase_it,
1872 int verify_it)
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001873{
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001874 const struct flashchip *chip = flash->chip;
1875
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001876 if (!programmer_may_write && (write_it || erase_it)) {
1877 msg_perr("Write/erase is not working yet on your programmer in "
1878 "its current configuration.\n");
1879 /* --force is the wrong approach, but it's the best we can do
1880 * until the generic programmer parameter parser is merged.
1881 */
1882 if (!force)
1883 return 1;
1884 msg_cerr("Continuing anyway.\n");
1885 }
1886
1887 if (read_it || erase_it || write_it || verify_it) {
1888 /* Everything needs read. */
Stefan Tauner6455dff2014-05-26 00:36:24 +00001889 if (chip->tested.read == BAD) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001890 msg_cerr("Read is not working on this chip. ");
1891 if (!force)
1892 return 1;
1893 msg_cerr("Continuing anyway.\n");
1894 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001895 if (!chip->read) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001896 msg_cerr("flashrom has no read function for this "
1897 "flash chip.\n");
1898 return 1;
1899 }
1900 }
1901 if (erase_it || write_it) {
1902 /* Write needs erase. */
Stefan Tauner6455dff2014-05-26 00:36:24 +00001903 if (chip->tested.erase == NA) {
1904 msg_cerr("Erase is not possible on this chip.\n");
1905 return 1;
1906 }
1907 if (chip->tested.erase == BAD) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001908 msg_cerr("Erase is not working on this chip. ");
1909 if (!force)
1910 return 1;
1911 msg_cerr("Continuing anyway.\n");
1912 }
Sylvain "ythier" Hitier9db45512011-07-04 07:27:17 +00001913 if(count_usable_erasers(flash) == 0) {
Stefan Tauner5368dca2011-07-01 00:19:12 +00001914 msg_cerr("flashrom has no erase function for this "
1915 "flash chip.\n");
1916 return 1;
1917 }
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001918 }
1919 if (write_it) {
Stefan Tauner6455dff2014-05-26 00:36:24 +00001920 if (chip->tested.write == NA) {
1921 msg_cerr("Write is not possible on this chip.\n");
1922 return 1;
1923 }
1924 if (chip->tested.write == BAD) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001925 msg_cerr("Write is not working on this chip. ");
1926 if (!force)
1927 return 1;
1928 msg_cerr("Continuing anyway.\n");
1929 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001930 if (!chip->write) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001931 msg_cerr("flashrom has no write function for this "
1932 "flash chip.\n");
1933 return 1;
1934 }
1935 }
1936 return 0;
1937}
1938
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001939/* This function signature is horrible. We need to design a better interface,
1940 * but right now it allows us to split off the CLI code.
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00001941 * Besides that, the function itself is a textbook example of abysmal code flow.
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001942 */
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +00001943int doit(struct flashctx *flash, int force, const char *filename, int read_it,
1944 int write_it, int erase_it, int verify_it)
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001945{
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001946 uint8_t *oldcontents;
1947 uint8_t *newcontents;
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001948 int ret = 0;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001949 unsigned long size = flash->chip->total_size * 1024;
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001950
David Hendricks77f931a2011-05-18 01:30:56 +00001951 if (chip_safety_check(flash, force, read_it, write_it, erase_it, verify_it)) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001952 msg_cerr("Aborting.\n");
Stefan Tauner20da4aa2014-05-07 22:07:23 +00001953 return 1;
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001954 }
1955
Stefan Tauner8268fdb2013-09-23 14:21:06 +00001956 if (normalize_romentries(flash)) {
1957 msg_cerr("Requested regions can not be handled. Aborting.\n");
Stefan Tauner20da4aa2014-05-07 22:07:23 +00001958 return 1;
Stefan Tauner8268fdb2013-09-23 14:21:06 +00001959 }
1960
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001961 /* Given the existence of read locks, we want to unlock for read,
1962 * erase and write.
1963 */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001964 if (flash->chip->unlock)
1965 flash->chip->unlock(flash);
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001966
1967 if (read_it) {
Stefan Tauner20da4aa2014-05-07 22:07:23 +00001968 return read_flash_to_file(flash, filename);
Carl-Daniel Hailfingerd1be52d2010-07-03 12:14:25 +00001969 }
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001970
Stefan Tauner269de352011-07-12 22:35:21 +00001971 oldcontents = malloc(size);
1972 if (!oldcontents) {
1973 msg_gerr("Out of memory!\n");
1974 exit(1);
1975 }
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001976 /* Assume worst case: All bits are 0. */
1977 memset(oldcontents, 0x00, size);
Stefan Tauner269de352011-07-12 22:35:21 +00001978 newcontents = malloc(size);
1979 if (!newcontents) {
1980 msg_gerr("Out of memory!\n");
1981 exit(1);
1982 }
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001983 /* Assume best case: All bits should be 1. */
1984 memset(newcontents, 0xff, size);
1985 /* Side effect of the assumptions above: Default write action is erase
1986 * because newcontents looks like a completely erased chip, and
1987 * oldcontents being completely 0x00 means we have to erase everything
1988 * before we can write.
1989 */
1990
Ollie Lhoefa28582004-12-08 20:10:01 +00001991 if (erase_it) {
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001992 /* FIXME: Do we really want the scary warning if erase failed?
1993 * After all, after erase the chip is either blank or partially
1994 * blank or it has the old contents. A blank chip won't boot,
1995 * so if the user wanted erase and reboots afterwards, the user
1996 * knows very well that booting won't work.
1997 */
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001998 if (erase_and_write_flash(flash, oldcontents, newcontents)) {
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00001999 emergency_help_message();
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00002000 ret = 1;
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00002001 }
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00002002 goto out;
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00002003 }
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00002004
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00002005 if (write_it || verify_it) {
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00002006 if (read_buf_from_file(newcontents, size, filename)) {
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00002007 ret = 1;
2008 goto out;
Stefan Reinauer018aca82006-11-21 23:48:51 +00002009 }
2010
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +00002011#if CONFIG_INTERNAL == 1
Stefan Taunerb4e06bd2012-08-20 00:24:22 +00002012 if (programmer == PROGRAMMER_INTERNAL && cb_check_image(newcontents, size) < 0) {
2013 if (force_boardmismatch) {
2014 msg_pinfo("Proceeding anyway because user forced us to.\n");
2015 } else {
2016 msg_perr("Aborting. You can override this with "
2017 "-p internal:boardmismatch=force.\n");
Niklas Söderlund9e423762012-06-16 00:11:16 +00002018 ret = 1;
2019 goto out;
2020 }
Stefan Taunerb4e06bd2012-08-20 00:24:22 +00002021 }
Carl-Daniel Hailfinger66ef4e52009-12-13 22:28:00 +00002022#endif
Ollie Lhocbbf1252004-03-17 22:22:08 +00002023 }
2024
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00002025 /* Read the whole chip to be able to check whether regions need to be
2026 * erased and to give better diagnostics in case write fails.
2027 * The alternative would be to read only the regions which are to be
2028 * preserved, but in that case we might perform unneeded erase which
2029 * takes time as well.
2030 */
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00002031 msg_cinfo("Reading old flash chip contents... ");
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00002032 if (flash->chip->read(flash, oldcontents, 0, size)) {
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00002033 ret = 1;
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00002034 msg_cinfo("FAILED.\n");
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00002035 goto out;
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00002036 }
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00002037 msg_cinfo("done.\n");
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00002038
Stefan Tauner8268fdb2013-09-23 14:21:06 +00002039 /* Build a new image taking the given layout into account. */
2040 build_new_image(flash, oldcontents, newcontents);
Uwe Hermanna7e05482007-05-09 10:17:44 +00002041
Ollie Lho184a4042005-11-26 21:55:36 +00002042 // ////////////////////////////////////////////////////////////
Uwe Hermanna7e05482007-05-09 10:17:44 +00002043
Peter Stugef31104c2008-04-28 14:47:30 +00002044 if (write_it) {
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00002045 if (erase_and_write_flash(flash, oldcontents, newcontents)) {
Stefan Taunera58f6e92014-05-10 09:25:44 +00002046 msg_cerr("Uh oh. Erase/write failed. Checking if anything has changed.\n");
2047 msg_cinfo("Reading current flash chip contents... ");
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00002048 if (!flash->chip->read(flash, newcontents, 0, size)) {
Stefan Taunera58f6e92014-05-10 09:25:44 +00002049 msg_cinfo("done.\n");
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00002050 if (!memcmp(oldcontents, newcontents, size)) {
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00002051 nonfatal_help_message();
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00002052 ret = 1;
2053 goto out;
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00002054 }
Stefan Taunera58f6e92014-05-10 09:25:44 +00002055 msg_cerr("Apparently at least some data has changed.\n");
2056 } else
2057 msg_cerr("Can't even read anymore!\n");
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00002058 emergency_help_message();
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00002059 ret = 1;
2060 goto out;
Peter Stugef31104c2008-04-28 14:47:30 +00002061 }
Peter Stugef31104c2008-04-28 14:47:30 +00002062 }
Ollie Lho184a4042005-11-26 21:55:36 +00002063
Stefan Taunerc4f44df2013-08-12 22:58:43 +00002064 /* Verify only if we either did not try to write (verify operation) or actually changed something. */
2065 if (verify_it && (!write_it || !all_skipped)) {
Stefan Tauner78ffbea2012-10-27 15:36:56 +00002066 msg_cinfo("Verifying flash... ");
2067
2068 if (write_it) {
2069 /* Work around chips which need some time to calm down. */
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00002070 programmer_delay(1000*1000);
Stefan Tauner78ffbea2012-10-27 15:36:56 +00002071 ret = verify_range(flash, newcontents, 0, size);
2072 /* If we tried to write, and verification now fails, we
2073 * might have an emergency situation.
2074 */
2075 if (ret)
2076 emergency_help_message();
2077 } else {
2078 ret = compare_range(newcontents, oldcontents, 0, size);
2079 }
2080 if (!ret)
2081 msg_cinfo("VERIFIED.\n");
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00002082 }
Ollie Lho184a4042005-11-26 21:55:36 +00002083
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00002084out:
2085 free(oldcontents);
2086 free(newcontents);
Stefan Reinauer143da0b2006-01-04 16:42:57 +00002087 return ret;
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00002088}