blob: 3f29e6db9f2d723452aba79413c1ea80881dea6c [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
Ricardo Ribalda Delgado2a41f0a2014-07-28 20:35:21 +0000300#if CONFIG_NICINTEL_EEPROM == 1
301 {
302 .name = "nicintel_eeprom",
303 .type = PCI,
304 .devs.dev = nics_intel_ee,
305 .init = nicintel_ee_init,
306 .map_flash_region = fallback_map,
307 .unmap_flash_region = fallback_unmap,
308 .delay = internal_delay,
309 },
310#endif
311
Mark Marshall90021f22010-12-03 14:48:11 +0000312#if CONFIG_OGP_SPI == 1
313 {
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000314 .name = "ogp_spi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000315 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000316 .devs.dev = ogp_spi,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000317 .init = ogp_spi_init,
318 .map_flash_region = fallback_map,
319 .unmap_flash_region = fallback_unmap,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000320 .delay = internal_delay,
Mark Marshall90021f22010-12-03 14:48:11 +0000321 },
322#endif
323
Carl-Daniel Hailfinger9a1105c2011-02-04 21:37:59 +0000324#if CONFIG_SATAMV == 1
325 {
326 .name = "satamv",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000327 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000328 .devs.dev = satas_mv,
Carl-Daniel Hailfinger9a1105c2011-02-04 21:37:59 +0000329 .init = satamv_init,
Carl-Daniel Hailfinger9a1105c2011-02-04 21:37:59 +0000330 .map_flash_region = fallback_map,
331 .unmap_flash_region = fallback_unmap,
Carl-Daniel Hailfinger9a1105c2011-02-04 21:37:59 +0000332 .delay = internal_delay,
333 },
334#endif
335
Sven Schnelle5ce5f702011-09-03 18:37:52 +0000336#if CONFIG_LINUX_SPI == 1
337 {
338 .name = "linux_spi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000339 .type = OTHER,
340 .devs.note = "Device files /dev/spidev*.*\n",
Sven Schnelle5ce5f702011-09-03 18:37:52 +0000341 .init = linux_spi_init,
342 .map_flash_region = fallback_map,
343 .unmap_flash_region = fallback_unmap,
Sven Schnelle5ce5f702011-09-03 18:37:52 +0000344 .delay = internal_delay,
345 },
346#endif
347
James Lairdc60de0e2013-03-27 13:00:23 +0000348#if CONFIG_USBBLASTER_SPI == 1
349 {
350 .name = "usbblaster_spi",
351 .type = USB,
352 .devs.dev = devs_usbblasterspi,
353 .init = usbblaster_spi_init,
354 .map_flash_region = fallback_map,
355 .unmap_flash_region = fallback_unmap,
356 .delay = internal_delay,
357 },
358#endif
359
Carl-Daniel Hailfinger1c6d2ff2012-08-27 00:44:42 +0000360 {0}, /* This entry corresponds to PROGRAMMER_INVALID. */
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +0000361};
Luc Verhaegen8e3a6002007-04-04 22:45:58 +0000362
Carl-Daniel Hailfinger2bee8cf2010-11-10 15:25:18 +0000363#define SHUTDOWN_MAXFN 32
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000364static int shutdown_fn_count = 0;
365struct shutdown_func_data {
David Hendricks8bb20212011-06-14 01:35:36 +0000366 int (*func) (void *data);
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000367 void *data;
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000368} static shutdown_fn[SHUTDOWN_MAXFN];
369/* Initialize to 0 to make sure nobody registers a shutdown function before
370 * programmer init.
371 */
372static int may_register_shutdown = 0;
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000373
Stefan Taunerc4f44df2013-08-12 22:58:43 +0000374/* Did we change something or was every erase/write skipped (if any)? */
375static bool all_skipped = true;
376
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +0000377static int check_block_eraser(const struct flashctx *flash, int k, int log);
Stefan Tauner5368dca2011-07-01 00:19:12 +0000378
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000379/* Register a function to be executed on programmer shutdown.
380 * The advantage over atexit() is that you can supply a void pointer which will
381 * be used as parameter to the registered function upon programmer shutdown.
382 * This pointer can point to arbitrary data used by said function, e.g. undo
383 * information for GPIO settings etc. If unneeded, set data=NULL.
384 * Please note that the first (void *data) belongs to the function signature of
385 * the function passed as first parameter.
386 */
David Hendricks8bb20212011-06-14 01:35:36 +0000387int register_shutdown(int (*function) (void *data), void *data)
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000388{
389 if (shutdown_fn_count >= SHUTDOWN_MAXFN) {
Carl-Daniel Hailfinger9f5f2152010-06-04 23:20:21 +0000390 msg_perr("Tried to register more than %i shutdown functions.\n",
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000391 SHUTDOWN_MAXFN);
392 return 1;
393 }
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000394 if (!may_register_shutdown) {
395 msg_perr("Tried to register a shutdown function before "
396 "programmer init.\n");
397 return 1;
398 }
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000399 shutdown_fn[shutdown_fn_count].func = function;
400 shutdown_fn[shutdown_fn_count].data = data;
401 shutdown_fn_count++;
402
403 return 0;
404}
405
Nico Huberbcb2e5a2012-12-30 01:23:17 +0000406int programmer_init(enum programmer prog, const char *param)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000407{
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000408 int ret;
Carl-Daniel Hailfinger2e681602011-09-08 00:00:29 +0000409
410 if (prog >= PROGRAMMER_INVALID) {
411 msg_perr("Invalid programmer specified!\n");
412 return -1;
413 }
414 programmer = prog;
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000415 /* Initialize all programmer specific data. */
416 /* Default to unlimited decode sizes. */
417 max_rom_decode = (const struct decode_sizes) {
418 .parallel = 0xffffffff,
419 .lpc = 0xffffffff,
420 .fwh = 0xffffffff,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000421 .spi = 0xffffffff,
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000422 };
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000423 /* Default to top aligned flash at 4 GB. */
424 flashbase = 0;
425 /* Registering shutdown functions is now allowed. */
426 may_register_shutdown = 1;
Carl-Daniel Hailfingerd1be52d2010-07-03 12:14:25 +0000427 /* Default to allowing writes. Broken programmers set this to 0. */
428 programmer_may_write = 1;
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000429
430 programmer_param = param;
Carl-Daniel Hailfinger20a36ba2013-08-13 07:09:57 +0000431 msg_pdbg("Initializing %s programmer\n", programmer_table[programmer].name);
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000432 ret = programmer_table[programmer].init();
433 if (programmer_param && strlen(programmer_param)) {
Carl-Daniel Hailfinger20a36ba2013-08-13 07:09:57 +0000434 if (ret != 0) {
435 /* It is quite possible that any unhandled programmer parameter would have been valid,
436 * but an error in actual programmer init happened before the parameter was evaluated.
437 */
438 msg_pwarn("Unhandled programmer parameters (possibly due to another failure): %s\n",
439 programmer_param);
440 } else {
441 /* Actual programmer init was successful, but the user specified an invalid or unusable
442 * (for the current programmer configuration) parameter.
443 */
444 msg_perr("Unhandled programmer parameters: %s\n", programmer_param);
445 msg_perr("Aborting.\n");
446 ret = ERROR_FATAL;
447 }
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000448 }
449 return ret;
Uwe Hermann09e04f72009-05-16 22:36:00 +0000450}
451
Stefan Tauner20da4aa2014-05-07 22:07:23 +0000452/** Calls registered shutdown functions and resets internal programmer-related variables.
453 * Calling it is safe even without previous initialization, but further interactions with programmer support
454 * require a call to programmer_init() (afterwards).
455 *
456 * @return The OR-ed result values of all shutdown functions (i.e. 0 on success). */
Uwe Hermann09e04f72009-05-16 22:36:00 +0000457int programmer_shutdown(void)
458{
David Hendricks8bb20212011-06-14 01:35:36 +0000459 int ret = 0;
460
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000461 /* Registering shutdown functions is no longer allowed. */
462 may_register_shutdown = 0;
463 while (shutdown_fn_count > 0) {
464 int i = --shutdown_fn_count;
David Hendricks8bb20212011-06-14 01:35:36 +0000465 ret |= shutdown_fn[i].func(shutdown_fn[i].data);
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000466 }
Stefan Taunere34e3e82013-01-01 00:06:51 +0000467
Stefan Taunerb8911d62012-12-26 07:55:00 +0000468 programmer_param = NULL;
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000469 registered_master_count = 0;
Stefan Taunere34e3e82013-01-01 00:06:51 +0000470
David Hendricks8bb20212011-06-14 01:35:36 +0000471 return ret;
Uwe Hermann09e04f72009-05-16 22:36:00 +0000472}
473
Stefan Tauner305e0b92013-07-17 23:46:44 +0000474void *programmer_map_flash_region(const char *descr, uintptr_t phys_addr, size_t len)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000475{
Stefan Tauner26e7a152013-09-13 17:21:05 +0000476 void *ret = programmer_table[programmer].map_flash_region(descr, phys_addr, len);
477 msg_gspew("%s: mapping %s from 0x%0*" PRIxPTR " to 0x%0*" PRIxPTR "\n",
478 __func__, descr, PRIxPTR_WIDTH, phys_addr, PRIxPTR_WIDTH, (uintptr_t) ret);
479 return ret;
Uwe Hermann09e04f72009-05-16 22:36:00 +0000480}
481
482void programmer_unmap_flash_region(void *virt_addr, size_t len)
483{
484 programmer_table[programmer].unmap_flash_region(virt_addr, len);
485}
486
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000487void chip_writeb(const struct flashctx *flash, uint8_t val, chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000488{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000489 flash->mst->par.chip_writeb(flash, val, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000490}
491
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000492void chip_writew(const struct flashctx *flash, uint16_t val, chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000493{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000494 flash->mst->par.chip_writew(flash, val, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000495}
496
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000497void chip_writel(const struct flashctx *flash, uint32_t val, chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000498{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000499 flash->mst->par.chip_writel(flash, val, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000500}
501
Mark Marshallf20b7be2014-05-09 21:16:21 +0000502void chip_writen(const struct flashctx *flash, const uint8_t *buf, chipaddr addr, size_t len)
Carl-Daniel Hailfinger0bd2a2b2009-06-05 18:32:07 +0000503{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000504 flash->mst->par.chip_writen(flash, buf, addr, len);
Carl-Daniel Hailfinger0bd2a2b2009-06-05 18:32:07 +0000505}
506
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000507uint8_t chip_readb(const struct flashctx *flash, const chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000508{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000509 return flash->mst->par.chip_readb(flash, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000510}
511
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000512uint16_t chip_readw(const struct flashctx *flash, const chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000513{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000514 return flash->mst->par.chip_readw(flash, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000515}
516
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000517uint32_t chip_readl(const struct flashctx *flash, const chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000518{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000519 return flash->mst->par.chip_readl(flash, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000520}
521
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000522void chip_readn(const struct flashctx *flash, uint8_t *buf, chipaddr addr,
523 size_t len)
Carl-Daniel Hailfinger0bd2a2b2009-06-05 18:32:07 +0000524{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000525 flash->mst->par.chip_readn(flash, buf, addr, len);
Carl-Daniel Hailfinger0bd2a2b2009-06-05 18:32:07 +0000526}
527
Stefan Taunerf80419c2014-05-02 15:41:42 +0000528void programmer_delay(unsigned int usecs)
Carl-Daniel Hailfingerca8bfc62009-06-05 17:48:08 +0000529{
Urja Rannikko8d7ec2a2013-10-21 21:49:08 +0000530 if (usecs > 0)
531 programmer_table[programmer].delay(usecs);
Carl-Daniel Hailfingerca8bfc62009-06-05 17:48:08 +0000532}
533
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +0000534void map_flash_registers(struct flashctx *flash)
Stefan Reinauerff4f1972007-05-24 08:48:10 +0000535{
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +0000536 size_t size = flash->chip->total_size * 1024;
Carl-Daniel Hailfingerd0fc9462009-05-11 14:01:17 +0000537 /* Flash registers live 4 MByte below the flash. */
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +0000538 /* FIXME: This is incorrect for nonstandard flashbase. */
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +0000539 flash->virtual_registers = (chipaddr)programmer_map_flash_region("flash chip registers", (0xFFFFFFFF - 0x400000 - size + 1), size);
Stefan Reinauerff4f1972007-05-24 08:48:10 +0000540}
541
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000542int read_memmapped(struct flashctx *flash, uint8_t *buf, unsigned int start,
543 int unsigned len)
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000544{
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000545 chip_readn(flash, buf, flash->virtual_memory + start, len);
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000546
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000547 return 0;
548}
549
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000550/* This is a somewhat hacked function similar in some ways to strtok().
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000551 * It will look for needle with a subsequent '=' in haystack, return a copy of
552 * needle and remove everything from the first occurrence of needle to the next
553 * delimiter from haystack.
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000554 */
Nico Huberbcb2e5a2012-12-30 01:23:17 +0000555char *extract_param(const char *const *haystack, const char *needle, const char *delim)
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000556{
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000557 char *param_pos, *opt_pos, *rest;
558 char *opt = NULL;
559 int optlen;
Carl-Daniel Hailfinger27023762010-04-28 15:22:14 +0000560 int needlelen;
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000561
Carl-Daniel Hailfinger27023762010-04-28 15:22:14 +0000562 needlelen = strlen(needle);
563 if (!needlelen) {
564 msg_gerr("%s: empty needle! Please report a bug at "
565 "flashrom@flashrom.org\n", __func__);
566 return NULL;
567 }
568 /* No programmer parameters given. */
569 if (*haystack == NULL)
570 return NULL;
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000571 param_pos = strstr(*haystack, needle);
572 do {
573 if (!param_pos)
574 return NULL;
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000575 /* Needle followed by '='? */
576 if (param_pos[needlelen] == '=') {
577
578 /* Beginning of the string? */
579 if (param_pos == *haystack)
580 break;
581 /* After a delimiter? */
582 if (strchr(delim, *(param_pos - 1)))
583 break;
584 }
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000585 /* Continue searching. */
586 param_pos++;
587 param_pos = strstr(param_pos, needle);
588 } while (1);
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000589
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000590 if (param_pos) {
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000591 /* Get the string after needle and '='. */
592 opt_pos = param_pos + needlelen + 1;
593 optlen = strcspn(opt_pos, delim);
594 /* Return an empty string if the parameter was empty. */
595 opt = malloc(optlen + 1);
596 if (!opt) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000597 msg_gerr("Out of memory!\n");
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000598 exit(1);
599 }
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000600 strncpy(opt, opt_pos, optlen);
601 opt[optlen] = '\0';
602 rest = opt_pos + optlen;
603 /* Skip all delimiters after the current parameter. */
604 rest += strspn(rest, delim);
605 memmove(param_pos, rest, strlen(rest) + 1);
606 /* We could shrink haystack, but the effort is not worth it. */
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000607 }
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000608
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000609 return opt;
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000610}
611
Stefan Tauner66652442011-06-26 17:38:17 +0000612char *extract_programmer_param(const char *param_name)
Carl-Daniel Hailfinger2b6dcb32010-07-08 10:13:37 +0000613{
614 return extract_param(&programmer_param, param_name, ",");
615}
616
Sylvain "ythier" Hitier9db45512011-07-04 07:27:17 +0000617/* Returns the number of well-defined erasers for a chip. */
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +0000618static unsigned int count_usable_erasers(const struct flashctx *flash)
Stefan Tauner5368dca2011-07-01 00:19:12 +0000619{
620 unsigned int usable_erasefunctions = 0;
621 int k;
622 for (k = 0; k < NUM_ERASEFUNCTIONS; k++) {
623 if (!check_block_eraser(flash, k, 0))
624 usable_erasefunctions++;
625 }
626 return usable_erasefunctions;
627}
628
Mark Marshallf20b7be2014-05-09 21:16:21 +0000629static int compare_range(const uint8_t *wantbuf, const uint8_t *havebuf, unsigned int start, unsigned int len)
Stefan Tauner78ffbea2012-10-27 15:36:56 +0000630{
631 int ret = 0, failcount = 0;
632 unsigned int i;
633 for (i = 0; i < len; i++) {
634 if (wantbuf[i] != havebuf[i]) {
635 /* Only print the first failure. */
636 if (!failcount++)
637 msg_cerr("FAILED at 0x%08x! Expected=0x%02x, Found=0x%02x,",
638 start + i, wantbuf[i], havebuf[i]);
639 }
640 }
641 if (failcount) {
642 msg_cerr(" failed byte count from 0x%08x-0x%08x: 0x%x\n",
643 start, start + len - 1, failcount);
644 ret = -1;
645 }
646 return ret;
647}
648
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000649/* start is an offset to the base address of the flash chip */
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000650int check_erased_range(struct flashctx *flash, unsigned int start,
651 unsigned int len)
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000652{
653 int ret;
654 uint8_t *cmpbuf = malloc(len);
655
656 if (!cmpbuf) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000657 msg_gerr("Could not allocate memory!\n");
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000658 exit(1);
659 }
660 memset(cmpbuf, 0xff, len);
Stefan Tauner78ffbea2012-10-27 15:36:56 +0000661 ret = verify_range(flash, cmpbuf, start, len);
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000662 free(cmpbuf);
663 return ret;
664}
665
Uwe Hermann48ec1b12010-08-08 17:01:18 +0000666/*
Carl-Daniel Hailfingerd0250a32009-11-25 17:05:52 +0000667 * @cmpbuf buffer to compare against, cmpbuf[0] is expected to match the
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000668 * flash content at location start
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000669 * @start offset to the base address of the flash chip
670 * @len length of the verified area
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000671 * @return 0 for success, -1 for failure
672 */
Mark Marshallf20b7be2014-05-09 21:16:21 +0000673int verify_range(struct flashctx *flash, const uint8_t *cmpbuf, unsigned int start, unsigned int len)
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000674{
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000675 if (!len)
Stefan Taunerdf64a422014-05-27 00:06:14 +0000676 return -1;
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000677
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +0000678 if (!flash->chip->read) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000679 msg_cerr("ERROR: flashrom has no read function for this flash chip.\n");
Stefan Taunerdf64a422014-05-27 00:06:14 +0000680 return -1;
Carl-Daniel Hailfinger23290662009-06-24 08:20:45 +0000681 }
Stefan Taunerdf64a422014-05-27 00:06:14 +0000682
683 uint8_t *readbuf = malloc(len);
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000684 if (!readbuf) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000685 msg_gerr("Could not allocate memory!\n");
Stefan Taunerdf64a422014-05-27 00:06:14 +0000686 return -1;
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000687 }
Stefan Taunerdf64a422014-05-27 00:06:14 +0000688 int ret = 0;
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000689
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +0000690 if (start + len > flash->chip->total_size * 1024) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000691 msg_gerr("Error: %s called with start 0x%x + len 0x%x >"
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000692 " total_size 0x%x\n", __func__, start, len,
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +0000693 flash->chip->total_size * 1024);
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000694 ret = -1;
695 goto out_free;
696 }
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000697
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +0000698 ret = flash->chip->read(flash, readbuf, start, len);
Carl-Daniel Hailfingerd8369412010-11-16 17:21:58 +0000699 if (ret) {
700 msg_gerr("Verification impossible because read failed "
701 "at 0x%x (len 0x%x)\n", start, len);
Stefan Taunerdf64a422014-05-27 00:06:14 +0000702 ret = -1;
703 goto out_free;
Carl-Daniel Hailfingerd8369412010-11-16 17:21:58 +0000704 }
705
Stefan Tauner78ffbea2012-10-27 15:36:56 +0000706 ret = compare_range(cmpbuf, readbuf, start, len);
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000707out_free:
708 free(readbuf);
709 return ret;
710}
711
Stefan Tauner02437452013-04-01 19:34:53 +0000712/* Helper function for need_erase() that focuses on granularities of gran bytes. */
Mark Marshallf20b7be2014-05-09 21:16:21 +0000713static 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 +0000714{
715 unsigned int i, j, limit;
716 for (j = 0; j < len / gran; j++) {
717 limit = min (gran, len - j * gran);
718 /* Are 'have' and 'want' identical? */
719 if (!memcmp(have + j * gran, want + j * gran, limit))
720 continue;
721 /* have needs to be in erased state. */
722 for (i = 0; i < limit; i++)
723 if (have[j * gran + i] != 0xff)
724 return 1;
725 }
726 return 0;
727}
728
Uwe Hermann48ec1b12010-08-08 17:01:18 +0000729/*
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000730 * Check if the buffer @have can be programmed to the content of @want without
731 * erasing. This is only possible if all chunks of size @gran are either kept
732 * as-is or changed from an all-ones state to any other state.
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000733 *
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000734 * Warning: This function assumes that @have and @want point to naturally
735 * aligned regions.
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000736 *
737 * @have buffer with current content
738 * @want buffer with desired content
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000739 * @len length of the checked area
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000740 * @gran write granularity (enum, not count)
741 * @return 0 if no erase is needed, 1 otherwise
742 */
Mark Marshallf20b7be2014-05-09 21:16:21 +0000743int 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 +0000744{
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +0000745 int result = 0;
Stefan Tauner02437452013-04-01 19:34:53 +0000746 unsigned int i;
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000747
748 switch (gran) {
749 case write_gran_1bit:
750 for (i = 0; i < len; i++)
751 if ((have[i] & want[i]) != want[i]) {
752 result = 1;
753 break;
754 }
755 break;
756 case write_gran_1byte:
757 for (i = 0; i < len; i++)
758 if ((have[i] != want[i]) && (have[i] != 0xff)) {
759 result = 1;
760 break;
761 }
762 break;
763 case write_gran_256bytes:
Stefan Tauner02437452013-04-01 19:34:53 +0000764 result = need_erase_gran_bytes(have, want, len, 256);
765 break;
766 case write_gran_264bytes:
767 result = need_erase_gran_bytes(have, want, len, 264);
768 break;
769 case write_gran_512bytes:
770 result = need_erase_gran_bytes(have, want, len, 512);
771 break;
772 case write_gran_528bytes:
773 result = need_erase_gran_bytes(have, want, len, 528);
774 break;
775 case write_gran_1024bytes:
776 result = need_erase_gran_bytes(have, want, len, 1024);
777 break;
778 case write_gran_1056bytes:
779 result = need_erase_gran_bytes(have, want, len, 1056);
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000780 break;
Carl-Daniel Hailfinger1b0e9fc2014-06-16 22:36:17 +0000781 case write_gran_1byte_implicit_erase:
782 /* Do not erase, handle content changes from anything->0xff by writing 0xff. */
783 result = 0;
784 break;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000785 default:
786 msg_cerr("%s: Unsupported granularity! Please report a bug at "
787 "flashrom@flashrom.org\n", __func__);
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000788 }
789 return result;
790}
791
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000792/**
793 * Check if the buffer @have needs to be programmed to get the content of @want.
794 * If yes, return 1 and fill in first_start with the start address of the
795 * write operation and first_len with the length of the first to-be-written
796 * chunk. If not, return 0 and leave first_start and first_len undefined.
797 *
798 * Warning: This function assumes that @have and @want point to naturally
799 * aligned regions.
800 *
801 * @have buffer with current content
802 * @want buffer with desired content
803 * @len length of the checked area
804 * @gran write granularity (enum, not count)
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000805 * @first_start offset of the first byte which needs to be written (passed in
806 * value is increased by the offset of the first needed write
807 * relative to have/want or unchanged if no write is needed)
808 * @return length of the first contiguous area which needs to be written
809 * 0 if no write is needed
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000810 *
811 * FIXME: This function needs a parameter which tells it about coalescing
812 * in relation to the max write length of the programmer and the max write
813 * length of the chip.
814 */
Mark Marshallf20b7be2014-05-09 21:16:21 +0000815static unsigned int get_next_write(const uint8_t *have, const uint8_t *want, unsigned int len,
Stefan Taunerc69c9c82011-11-23 09:13:48 +0000816 unsigned int *first_start,
817 enum write_granularity gran)
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000818{
Stefan Taunerc69c9c82011-11-23 09:13:48 +0000819 int need_write = 0;
820 unsigned int rel_start = 0, first_len = 0;
821 unsigned int i, limit, stride;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000822
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000823 switch (gran) {
824 case write_gran_1bit:
825 case write_gran_1byte:
Carl-Daniel Hailfinger1b0e9fc2014-06-16 22:36:17 +0000826 case write_gran_1byte_implicit_erase:
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000827 stride = 1;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000828 break;
829 case write_gran_256bytes:
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000830 stride = 256;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000831 break;
Stefan Tauner02437452013-04-01 19:34:53 +0000832 case write_gran_264bytes:
833 stride = 264;
834 break;
835 case write_gran_512bytes:
836 stride = 512;
837 break;
838 case write_gran_528bytes:
839 stride = 528;
840 break;
841 case write_gran_1024bytes:
842 stride = 1024;
843 break;
844 case write_gran_1056bytes:
845 stride = 1056;
846 break;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000847 default:
848 msg_cerr("%s: Unsupported granularity! Please report a bug at "
849 "flashrom@flashrom.org\n", __func__);
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000850 /* Claim that no write was needed. A write with unknown
851 * granularity is too dangerous to try.
852 */
853 return 0;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000854 }
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000855 for (i = 0; i < len / stride; i++) {
856 limit = min(stride, len - i * stride);
857 /* Are 'have' and 'want' identical? */
858 if (memcmp(have + i * stride, want + i * stride, limit)) {
859 if (!need_write) {
860 /* First location where have and want differ. */
861 need_write = 1;
862 rel_start = i * stride;
863 }
864 } else {
865 if (need_write) {
866 /* First location where have and want
867 * do not differ anymore.
868 */
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000869 break;
870 }
871 }
872 }
Carl-Daniel Hailfinger202bf532010-12-06 13:05:44 +0000873 if (need_write)
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000874 first_len = min(i * stride - rel_start, len);
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000875 *first_start += rel_start;
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000876 return first_len;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000877}
878
Carl-Daniel Hailfingereaac68b2009-11-23 12:55:31 +0000879/* This function generates various test patterns useful for testing controller
880 * and chip communication as well as chip behaviour.
881 *
882 * If a byte can be written multiple times, each time keeping 0-bits at 0
883 * and changing 1-bits to 0 if the new value for that bit is 0, the effect
884 * is essentially an AND operation. That's also the reason why this function
885 * provides the result of AND between various patterns.
886 *
887 * Below is a list of patterns (and their block length).
888 * Pattern 0 is 05 15 25 35 45 55 65 75 85 95 a5 b5 c5 d5 e5 f5 (16 Bytes)
889 * Pattern 1 is 0a 1a 2a 3a 4a 5a 6a 7a 8a 9a aa ba ca da ea fa (16 Bytes)
890 * Pattern 2 is 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f (16 Bytes)
891 * Pattern 3 is a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af (16 Bytes)
892 * Pattern 4 is 00 10 20 30 40 50 60 70 80 90 a0 b0 c0 d0 e0 f0 (16 Bytes)
893 * Pattern 5 is 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f (16 Bytes)
894 * Pattern 6 is 00 (1 Byte)
895 * Pattern 7 is ff (1 Byte)
896 * Patterns 0-7 have a big-endian block number in the last 2 bytes of each 256
897 * byte block.
898 *
899 * Pattern 8 is 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11... (256 B)
900 * Pattern 9 is ff fe fd fc fb fa f9 f8 f7 f6 f5 f4 f3 f2 f1 f0 ef ee... (256 B)
901 * Pattern 10 is 00 00 00 01 00 02 00 03 00 04... (128 kB big-endian counter)
902 * Pattern 11 is ff ff ff fe ff fd ff fc ff fb... (128 kB big-endian downwards)
903 * Pattern 12 is 00 (1 Byte)
904 * Pattern 13 is ff (1 Byte)
905 * Patterns 8-13 have no block number.
906 *
907 * Patterns 0-3 are created to detect and efficiently diagnose communication
908 * slips like missed bits or bytes and their repetitive nature gives good visual
909 * cues to the person inspecting the results. In addition, the following holds:
910 * AND Pattern 0/1 == Pattern 4
911 * AND Pattern 2/3 == Pattern 5
912 * AND Pattern 0/1/2/3 == AND Pattern 4/5 == Pattern 6
913 * A weakness of pattern 0-5 is the inability to detect swaps/copies between
914 * any two 16-byte blocks except for the last 16-byte block in a 256-byte bloc.
915 * They work perfectly for detecting any swaps/aliasing of blocks >= 256 bytes.
916 * 0x5 and 0xa were picked because they are 0101 and 1010 binary.
917 * Patterns 8-9 are best for detecting swaps/aliasing of blocks < 256 bytes.
918 * Besides that, they provide for bit testing of the last two bytes of every
919 * 256 byte block which contains the block number for patterns 0-6.
920 * Patterns 10-11 are special purpose for detecting subblock aliasing with
921 * block sizes >256 bytes (some Dataflash chips etc.)
922 * AND Pattern 8/9 == Pattern 12
923 * AND Pattern 10/11 == Pattern 12
924 * Pattern 13 is the completely erased state.
925 * None of the patterns can detect aliasing at boundaries which are a multiple
926 * of 16 MBytes (but such chips do not exist anyway for Parallel/LPC/FWH/SPI).
927 */
928int generate_testpattern(uint8_t *buf, uint32_t size, int variant)
929{
930 int i;
931
932 if (!buf) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000933 msg_gerr("Invalid buffer!\n");
Carl-Daniel Hailfingereaac68b2009-11-23 12:55:31 +0000934 return 1;
935 }
936
937 switch (variant) {
938 case 0:
939 for (i = 0; i < size; i++)
940 buf[i] = (i & 0xf) << 4 | 0x5;
941 break;
942 case 1:
943 for (i = 0; i < size; i++)
944 buf[i] = (i & 0xf) << 4 | 0xa;
945 break;
946 case 2:
947 for (i = 0; i < size; i++)
948 buf[i] = 0x50 | (i & 0xf);
949 break;
950 case 3:
951 for (i = 0; i < size; i++)
952 buf[i] = 0xa0 | (i & 0xf);
953 break;
954 case 4:
955 for (i = 0; i < size; i++)
956 buf[i] = (i & 0xf) << 4;
957 break;
958 case 5:
959 for (i = 0; i < size; i++)
960 buf[i] = i & 0xf;
961 break;
962 case 6:
963 memset(buf, 0x00, size);
964 break;
965 case 7:
966 memset(buf, 0xff, size);
967 break;
968 case 8:
969 for (i = 0; i < size; i++)
970 buf[i] = i & 0xff;
971 break;
972 case 9:
973 for (i = 0; i < size; i++)
974 buf[i] = ~(i & 0xff);
975 break;
976 case 10:
977 for (i = 0; i < size % 2; i++) {
978 buf[i * 2] = (i >> 8) & 0xff;
979 buf[i * 2 + 1] = i & 0xff;
980 }
981 if (size & 0x1)
982 buf[i * 2] = (i >> 8) & 0xff;
983 break;
984 case 11:
985 for (i = 0; i < size % 2; i++) {
986 buf[i * 2] = ~((i >> 8) & 0xff);
987 buf[i * 2 + 1] = ~(i & 0xff);
988 }
989 if (size & 0x1)
990 buf[i * 2] = ~((i >> 8) & 0xff);
991 break;
992 case 12:
993 memset(buf, 0x00, size);
994 break;
995 case 13:
996 memset(buf, 0xff, size);
997 break;
998 }
999
1000 if ((variant >= 0) && (variant <= 7)) {
1001 /* Write block number in the last two bytes of each 256-byte
1002 * block, big endian for easier reading of the hexdump.
1003 * Note that this wraps around for chips larger than 2^24 bytes
1004 * (16 MB).
1005 */
1006 for (i = 0; i < size / 256; i++) {
1007 buf[i * 256 + 254] = (i >> 8) & 0xff;
1008 buf[i * 256 + 255] = i & 0xff;
1009 }
1010 }
1011
1012 return 0;
1013}
1014
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001015int check_max_decode(enum chipbustype buses, uint32_t size)
1016{
1017 int limitexceeded = 0;
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001018
1019 if ((buses & BUS_PARALLEL) && (max_rom_decode.parallel < size)) {
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001020 limitexceeded++;
Sean Nelson316a29f2010-05-07 20:09:04 +00001021 msg_pdbg("Chip size %u kB is bigger than supported "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001022 "size %u kB of chipset/board/programmer "
1023 "for %s interface, "
1024 "probe/read/erase/write may fail. ", size / 1024,
1025 max_rom_decode.parallel / 1024, "Parallel");
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001026 }
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001027 if ((buses & BUS_LPC) && (max_rom_decode.lpc < size)) {
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001028 limitexceeded++;
Sean Nelson316a29f2010-05-07 20:09:04 +00001029 msg_pdbg("Chip size %u kB is bigger than supported "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001030 "size %u kB of chipset/board/programmer "
1031 "for %s interface, "
1032 "probe/read/erase/write may fail. ", size / 1024,
1033 max_rom_decode.lpc / 1024, "LPC");
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001034 }
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001035 if ((buses & BUS_FWH) && (max_rom_decode.fwh < size)) {
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001036 limitexceeded++;
Sean Nelson316a29f2010-05-07 20:09:04 +00001037 msg_pdbg("Chip size %u kB is bigger than supported "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001038 "size %u kB of chipset/board/programmer "
1039 "for %s interface, "
1040 "probe/read/erase/write may fail. ", size / 1024,
1041 max_rom_decode.fwh / 1024, "FWH");
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001042 }
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001043 if ((buses & BUS_SPI) && (max_rom_decode.spi < size)) {
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001044 limitexceeded++;
Sean Nelson316a29f2010-05-07 20:09:04 +00001045 msg_pdbg("Chip size %u kB is bigger than supported "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001046 "size %u kB of chipset/board/programmer "
1047 "for %s interface, "
1048 "probe/read/erase/write may fail. ", size / 1024,
1049 max_rom_decode.spi / 1024, "SPI");
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001050 }
1051 if (!limitexceeded)
1052 return 0;
1053 /* Sometimes chip and programmer have more than one bus in common,
1054 * and the limit is not exceeded on all buses. Tell the user.
1055 */
1056 if (bitcount(buses) > limitexceeded)
Carl-Daniel Hailfingera84835a2010-01-07 03:24:05 +00001057 /* FIXME: This message is designed towards CLI users. */
Sean Nelson316a29f2010-05-07 20:09:04 +00001058 msg_pdbg("There is at least one common chip/programmer "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001059 "interface which can support a chip of this size. "
1060 "You can try --force at your own risk.\n");
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001061 return 1;
1062}
1063
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +00001064int probe_flash(struct registered_master *mst, int startchip, struct flashctx *flash, int force)
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001065{
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001066 const struct flashchip *chip;
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001067 unsigned long base = 0;
Stefan Reinauer051e2362011-01-19 06:21:54 +00001068 char location[64];
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001069 uint32_t size;
1070 enum chipbustype buses_common;
Carl-Daniel Hailfingerb22918c2009-06-01 02:08:58 +00001071 char *tmp;
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001072
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001073 for (chip = flashchips + startchip; chip && chip->name; chip++) {
1074 if (chip_to_probe && strcmp(chip->name, chip_to_probe) != 0)
Ollie Lhocbbf1252004-03-17 22:22:08 +00001075 continue;
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +00001076 buses_common = mst->buses_supported & chip->bustype;
Carl-Daniel Hailfingerc40cff72011-12-20 00:19:29 +00001077 if (!buses_common)
Carl-Daniel Hailfinger6573b742011-06-17 22:38:53 +00001078 continue;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001079 msg_gdbg("Probing for %s %s, %d kB: ", chip->vendor, chip->name, chip->total_size);
1080 if (!chip->probe && !force) {
1081 msg_gdbg("failed! flashrom has no probe function for this flash chip.\n");
Carl-Daniel Hailfingerb22918c2009-06-01 02:08:58 +00001082 continue;
1083 }
Stefan Reinauer70385642007-04-06 11:58:03 +00001084
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001085 size = chip->total_size * 1024;
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001086 check_max_decode(buses_common, size);
Stefan Reinauer70385642007-04-06 11:58:03 +00001087
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001088 /* Start filling in the dynamic data. */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001089 flash->chip = calloc(1, sizeof(struct flashchip));
1090 if (!flash->chip) {
1091 msg_gerr("Out of memory!\n");
1092 exit(1);
1093 }
1094 memcpy(flash->chip, chip, sizeof(struct flashchip));
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +00001095 flash->mst = mst;
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001096
Carl-Daniel Hailfinger97d6b092009-05-09 07:27:23 +00001097 base = flashbase ? flashbase : (0xffffffff - size + 1);
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001098 flash->virtual_memory = (chipaddr)programmer_map_flash_region("flash chip", base, size);
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001099
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001100 /* We handle a forced match like a real match, we just avoid probing. Note that probe_flash()
1101 * is only called with force=1 after normal probing failed.
1102 */
Peter Stuge27c3e2d2008-07-02 17:15:47 +00001103 if (force)
1104 break;
Stefan Reinauerfcb63682006-03-16 16:57:41 +00001105
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001106 if (flash->chip->probe(flash) != 1)
Peter Stuge483b8f02008-09-03 23:10:05 +00001107 goto notfound;
1108
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001109 /* If this is the first chip found, accept it.
1110 * If this is not the first chip found, accept it only if it is
Stefan Taunerac1b4c82012-02-17 14:51:04 +00001111 * a non-generic match. SFDP and CFI are generic matches.
1112 * startchip==0 means this call to probe_flash() is the first
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +00001113 * one for this programmer interface (master) and thus no other chip has
Stefan Taunerac1b4c82012-02-17 14:51:04 +00001114 * been found on this interface.
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001115 */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001116 if (startchip == 0 && flash->chip->model_id == SFDP_DEVICE_ID) {
Stefan Taunerac1b4c82012-02-17 14:51:04 +00001117 msg_cinfo("===\n"
1118 "SFDP has autodetected a flash chip which is "
1119 "not natively supported by flashrom yet.\n");
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001120 if (count_usable_erasers(flash) == 0)
Stefan Taunerac1b4c82012-02-17 14:51:04 +00001121 msg_cinfo("The standard operations read and "
1122 "verify should work, but to support "
1123 "erase, write and all other "
1124 "possible features");
1125 else
1126 msg_cinfo("All standard operations (read, "
1127 "verify, erase and write) should "
1128 "work, but to support all possible "
1129 "features");
1130
Stefan Taunerb4e06bd2012-08-20 00:24:22 +00001131 msg_cinfo(" we need to add them manually.\n"
1132 "You can help us by mailing us the output of the following command to "
1133 "flashrom@flashrom.org:\n"
1134 "'flashrom -VV [plus the -p/--programmer parameter]'\n"
1135 "Thanks for your help!\n"
Stefan Taunerac1b4c82012-02-17 14:51:04 +00001136 "===\n");
1137 }
1138
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001139 /* First flash chip detected on this bus. */
1140 if (startchip == 0)
Peter Stuge27c3e2d2008-07-02 17:15:47 +00001141 break;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001142 /* Not the first flash chip detected on this bus, but not a generic match either. */
1143 if ((flash->chip->model_id != GENERIC_DEVICE_ID) && (flash->chip->model_id != SFDP_DEVICE_ID))
1144 break;
1145 /* 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 +00001146notfound:
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001147 programmer_unmap_flash_region((void *)flash->virtual_memory, size);
1148 flash->virtual_memory = (chipaddr)NULL;
1149 free(flash->chip);
1150 flash->chip = NULL;
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001151 }
Uwe Hermannffec5f32007-08-23 16:08:21 +00001152
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001153 if (!flash->chip)
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001154 return -1;
Peter Stuge27c3e2d2008-07-02 17:15:47 +00001155
Carl-Daniel Hailfingerd9535582011-03-08 00:09:11 +00001156#if CONFIG_INTERNAL == 1
1157 if (programmer_table[programmer].map_flash_region == physmap)
Stefan Reinauer051e2362011-01-19 06:21:54 +00001158 snprintf(location, sizeof(location), "at physical address 0x%lx", base);
Carl-Daniel Hailfingerd9535582011-03-08 00:09:11 +00001159 else
1160#endif
Stefan Reinauer051e2362011-01-19 06:21:54 +00001161 snprintf(location, sizeof(location), "on %s", programmer_table[programmer].name);
Stefan Reinauer051e2362011-01-19 06:21:54 +00001162
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001163 tmp = flashbuses_to_text(flash->chip->bustype);
1164 msg_cinfo("%s %s flash chip \"%s\" (%d kB, %s) %s.\n", force ? "Assuming" : "Found",
1165 flash->chip->vendor, flash->chip->name, flash->chip->total_size, tmp, location);
Stefan Tauner00155492011-06-26 20:45:35 +00001166 free(tmp);
Uwe Hermann9899cad2009-06-28 21:47:57 +00001167
Carl-Daniel Hailfinger859f3f02010-12-02 21:59:42 +00001168 /* Flash registers will not be mapped if the chip was forced. Lock info
1169 * may be stored in registers, so avoid lock info printing.
1170 */
1171 if (!force)
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001172 if (flash->chip->printlock)
1173 flash->chip->printlock(flash);
Sean Nelson6e0b9122010-02-19 00:52:10 +00001174
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001175 /* Return position of matching chip. */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001176 return chip - flashchips;
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001177}
1178
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001179int read_buf_from_file(unsigned char *buf, unsigned long size,
1180 const char *filename)
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001181{
Nico Huber7562f7d2013-08-30 21:29:45 +00001182#ifdef __LIBPAYLOAD__
1183 msg_gerr("Error: No file I/O support in libpayload\n");
1184 return 1;
1185#else
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001186 unsigned long numbytes;
1187 FILE *image;
1188 struct stat image_stat;
1189
1190 if ((image = fopen(filename, "rb")) == NULL) {
Stefan Tauner363fd7e2013-04-07 13:08:30 +00001191 msg_gerr("Error: opening file \"%s\" failed: %s\n", filename, strerror(errno));
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001192 return 1;
1193 }
1194 if (fstat(fileno(image), &image_stat) != 0) {
Stefan Tauner363fd7e2013-04-07 13:08:30 +00001195 msg_gerr("Error: getting metadata of file \"%s\" failed: %s\n", filename, strerror(errno));
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001196 fclose(image);
1197 return 1;
1198 }
1199 if (image_stat.st_size != size) {
Carl-Daniel Hailfinger11990da2013-07-13 23:21:05 +00001200 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 +00001201 (intmax_t)image_stat.st_size, size);
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001202 fclose(image);
1203 return 1;
1204 }
1205 numbytes = fread(buf, 1, size, image);
1206 if (fclose(image)) {
Stefan Tauner363fd7e2013-04-07 13:08:30 +00001207 msg_gerr("Error: closing file \"%s\" failed: %s\n", filename, strerror(errno));
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001208 return 1;
1209 }
1210 if (numbytes != size) {
1211 msg_gerr("Error: Failed to read complete file. Got %ld bytes, "
1212 "wanted %ld!\n", numbytes, size);
1213 return 1;
1214 }
1215 return 0;
Nico Huber7562f7d2013-08-30 21:29:45 +00001216#endif
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001217}
1218
Mark Marshallf20b7be2014-05-09 21:16:21 +00001219int write_buf_to_file(const unsigned char *buf, unsigned long size, const char *filename)
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001220{
Nico Huber7562f7d2013-08-30 21:29:45 +00001221#ifdef __LIBPAYLOAD__
1222 msg_gerr("Error: No file I/O support in libpayload\n");
1223 return 1;
1224#else
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001225 unsigned long numbytes;
1226 FILE *image;
Stephan Guilloux21dd55b2009-06-01 22:07:52 +00001227
1228 if (!filename) {
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001229 msg_gerr("No filename specified.\n");
Stephan Guilloux21dd55b2009-06-01 22:07:52 +00001230 return 1;
1231 }
Patrick Georgi0bf842d2010-01-25 22:55:33 +00001232 if ((image = fopen(filename, "wb")) == NULL) {
Stefan Tauner363fd7e2013-04-07 13:08:30 +00001233 msg_gerr("Error: opening file \"%s\" failed: %s\n", filename, strerror(errno));
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00001234 return 1;
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001235 }
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001236
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001237 numbytes = fwrite(buf, 1, size, image);
1238 fclose(image);
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001239 if (numbytes != size) {
1240 msg_gerr("File %s could not be written completely.\n",
1241 filename);
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001242 return 1;
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001243 }
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001244 return 0;
Nico Huber7562f7d2013-08-30 21:29:45 +00001245#endif
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001246}
1247
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001248int read_flash_to_file(struct flashctx *flash, const char *filename)
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001249{
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001250 unsigned long size = flash->chip->total_size * 1024;
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001251 unsigned char *buf = calloc(size, sizeof(char));
1252 int ret = 0;
1253
1254 msg_cinfo("Reading flash... ");
1255 if (!buf) {
1256 msg_gerr("Memory allocation failed!\n");
1257 msg_cinfo("FAILED.\n");
1258 return 1;
1259 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001260 if (!flash->chip->read) {
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001261 msg_cerr("No read function available for this flash chip.\n");
1262 ret = 1;
1263 goto out_free;
1264 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001265 if (flash->chip->read(flash, buf, 0, size)) {
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001266 msg_cerr("Read operation failed!\n");
1267 ret = 1;
1268 goto out_free;
1269 }
1270
Stefan Tauner355cbfd2011-05-28 02:37:14 +00001271 ret = write_buf_to_file(buf, size, filename);
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001272out_free:
1273 free(buf);
1274 msg_cinfo("%s.\n", ret ? "FAILED" : "done");
1275 return ret;
1276}
1277
Stefan Tauner96658be2014-05-26 22:05:31 +00001278/* Even if an error is found, the function will keep going and check the rest. */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001279static int selfcheck_eraseblocks(const struct flashchip *chip)
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001280{
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +00001281 int i, j, k;
1282 int ret = 0;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001283
1284 for (k = 0; k < NUM_ERASEFUNCTIONS; k++) {
1285 unsigned int done = 0;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001286 struct block_eraser eraser = chip->block_erasers[k];
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001287
1288 for (i = 0; i < NUM_ERASEREGIONS; i++) {
1289 /* Blocks with zero size are bugs in flashchips.c. */
1290 if (eraser.eraseblocks[i].count &&
1291 !eraser.eraseblocks[i].size) {
1292 msg_gerr("ERROR: Flash chip %s erase function "
1293 "%i region %i has size 0. Please report"
1294 " a bug at flashrom@flashrom.org\n",
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001295 chip->name, k, i);
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001296 ret = 1;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001297 }
1298 /* Blocks with zero count are bugs in flashchips.c. */
1299 if (!eraser.eraseblocks[i].count &&
1300 eraser.eraseblocks[i].size) {
1301 msg_gerr("ERROR: Flash chip %s erase function "
1302 "%i region %i has count 0. Please report"
1303 " a bug at flashrom@flashrom.org\n",
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001304 chip->name, k, i);
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001305 ret = 1;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001306 }
1307 done += eraser.eraseblocks[i].count *
1308 eraser.eraseblocks[i].size;
1309 }
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001310 /* Empty eraseblock definition with erase function. */
1311 if (!done && eraser.block_erase)
Sean Nelson316a29f2010-05-07 20:09:04 +00001312 msg_gspew("Strange: Empty eraseblock definition with "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001313 "non-empty erase function. Not an error.\n");
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001314 if (!done)
1315 continue;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001316 if (done != chip->total_size * 1024) {
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001317 msg_gerr("ERROR: Flash chip %s erase function %i "
1318 "region walking resulted in 0x%06x bytes total,"
1319 " expected 0x%06x bytes. Please report a bug at"
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001320 " flashrom@flashrom.org\n", chip->name, k,
1321 done, chip->total_size * 1024);
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001322 ret = 1;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001323 }
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001324 if (!eraser.block_erase)
1325 continue;
1326 /* Check if there are identical erase functions for different
1327 * layouts. That would imply "magic" erase functions. The
1328 * easiest way to check this is with function pointers.
1329 */
Uwe Hermann43959702010-03-13 17:28:29 +00001330 for (j = k + 1; j < NUM_ERASEFUNCTIONS; j++) {
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001331 if (eraser.block_erase ==
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001332 chip->block_erasers[j].block_erase) {
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001333 msg_gerr("ERROR: Flash chip %s erase function "
1334 "%i and %i are identical. Please report"
1335 " a bug at flashrom@flashrom.org\n",
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001336 chip->name, k, j);
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001337 ret = 1;
1338 }
Uwe Hermann43959702010-03-13 17:28:29 +00001339 }
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001340 }
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001341 return ret;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001342}
1343
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001344static int erase_and_write_block_helper(struct flashctx *flash,
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001345 unsigned int start, unsigned int len,
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001346 uint8_t *curcontents,
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001347 uint8_t *newcontents,
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001348 int (*erasefn) (struct flashctx *flash,
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001349 unsigned int addr,
1350 unsigned int len))
1351{
Stefan Taunerc69c9c82011-11-23 09:13:48 +00001352 unsigned int starthere = 0, lenhere = 0;
1353 int ret = 0, skip = 1, writecount = 0;
Stefan Tauner50d67aa2013-03-03 23:49:48 +00001354 enum write_granularity gran = flash->chip->gran;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001355
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001356 /* curcontents and newcontents are opaque to walk_eraseregions, and
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001357 * need to be adjusted here to keep the impression of proper abstraction
1358 */
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001359 curcontents += start;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001360 newcontents += start;
1361 msg_cdbg(":");
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001362 if (need_erase(curcontents, newcontents, len, gran)) {
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001363 msg_cdbg("E");
1364 ret = erasefn(flash, start, len);
1365 if (ret)
1366 return ret;
Carl-Daniel Hailfingerb4061f62011-06-26 17:04:16 +00001367 if (check_erased_range(flash, start, len)) {
1368 msg_cerr("ERASE FAILED!\n");
1369 return -1;
1370 }
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001371 /* Erase was successful. Adjust curcontents. */
1372 memset(curcontents, 0xff, len);
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001373 skip = 0;
1374 }
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001375 /* get_next_write() sets starthere to a new value after the call. */
1376 while ((lenhere = get_next_write(curcontents + starthere,
1377 newcontents + starthere,
1378 len - starthere, &starthere, gran))) {
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001379 if (!writecount++)
1380 msg_cdbg("W");
1381 /* Needs the partial write function signature. */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001382 ret = flash->chip->write(flash, newcontents + starthere,
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001383 start + starthere, lenhere);
1384 if (ret)
1385 return ret;
1386 starthere += lenhere;
1387 skip = 0;
1388 }
1389 if (skip)
1390 msg_cdbg("S");
Stefan Tauner682122b2013-06-23 22:15:39 +00001391 else
1392 all_skipped = false;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001393 return ret;
1394}
1395
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001396static int walk_eraseregions(struct flashctx *flash, int erasefunction,
1397 int (*do_something) (struct flashctx *flash,
Carl-Daniel Hailfinger4d3e9ca2010-07-13 00:42:00 +00001398 unsigned int addr,
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001399 unsigned int len,
1400 uint8_t *param1,
1401 uint8_t *param2,
1402 int (*erasefn) (
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001403 struct flashctx *flash,
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001404 unsigned int addr,
1405 unsigned int len)),
1406 void *param1, void *param2)
Carl-Daniel Hailfingera1223412010-07-13 00:37:19 +00001407{
1408 int i, j;
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +00001409 unsigned int start = 0;
1410 unsigned int len;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001411 struct block_eraser eraser = flash->chip->block_erasers[erasefunction];
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001412
Carl-Daniel Hailfingera1223412010-07-13 00:37:19 +00001413 for (i = 0; i < NUM_ERASEREGIONS; i++) {
1414 /* count==0 for all automatically initialized array
1415 * members so the loop below won't be executed for them.
1416 */
1417 len = eraser.eraseblocks[i].size;
1418 for (j = 0; j < eraser.eraseblocks[i].count; j++) {
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001419 /* Print this for every block except the first one. */
1420 if (i || j)
1421 msg_cdbg(", ");
1422 msg_cdbg("0x%06x-0x%06x", start,
Carl-Daniel Hailfingera1223412010-07-13 00:37:19 +00001423 start + len - 1);
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001424 if (do_something(flash, start, len, param1, param2,
1425 eraser.block_erase)) {
Carl-Daniel Hailfingera1223412010-07-13 00:37:19 +00001426 return 1;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001427 }
Carl-Daniel Hailfingera1223412010-07-13 00:37:19 +00001428 start += len;
1429 }
1430 }
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001431 msg_cdbg("\n");
Carl-Daniel Hailfingera1223412010-07-13 00:37:19 +00001432 return 0;
1433}
1434
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001435static int check_block_eraser(const struct flashctx *flash, int k, int log)
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001436{
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001437 struct block_eraser eraser = flash->chip->block_erasers[k];
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001438
1439 if (!eraser.block_erase && !eraser.eraseblocks[0].count) {
1440 if (log)
1441 msg_cdbg("not defined. ");
1442 return 1;
1443 }
1444 if (!eraser.block_erase && eraser.eraseblocks[0].count) {
1445 if (log)
1446 msg_cdbg("eraseblock layout is known, but matching "
Stefan Tauner355cbfd2011-05-28 02:37:14 +00001447 "block erase function is not implemented. ");
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001448 return 1;
1449 }
1450 if (eraser.block_erase && !eraser.eraseblocks[0].count) {
1451 if (log)
1452 msg_cdbg("block erase function found, but "
Stefan Tauner355cbfd2011-05-28 02:37:14 +00001453 "eraseblock layout is not defined. ");
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001454 return 1;
1455 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001456 // TODO: Once erase functions are annotated with allowed buses, check that as well.
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001457 return 0;
1458}
1459
Mark Marshallf20b7be2014-05-09 21:16:21 +00001460int erase_and_write_flash(struct flashctx *flash, uint8_t *oldcontents, uint8_t *newcontents)
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001461{
Carl-Daniel Hailfingerd8334db2011-07-21 21:21:04 +00001462 int k, ret = 1;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001463 uint8_t *curcontents;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001464 unsigned long size = flash->chip->total_size * 1024;
Sylvain "ythier" Hitier9db45512011-07-04 07:27:17 +00001465 unsigned int usable_erasefunctions = count_usable_erasers(flash);
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001466
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001467 msg_cinfo("Erasing and writing flash chip... ");
Stefan Tauner269de352011-07-12 22:35:21 +00001468 curcontents = malloc(size);
1469 if (!curcontents) {
1470 msg_gerr("Out of memory!\n");
1471 exit(1);
1472 }
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001473 /* Copy oldcontents to curcontents to avoid clobbering oldcontents. */
1474 memcpy(curcontents, oldcontents, size);
1475
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001476 for (k = 0; k < NUM_ERASEFUNCTIONS; k++) {
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001477 if (k != 0)
Stefan Tauner16878542014-07-13 23:53:40 +00001478 msg_cinfo("Looking for another erase function.\n");
Carl-Daniel Hailfingerd8334db2011-07-21 21:21:04 +00001479 if (!usable_erasefunctions) {
Stefan Tauner16878542014-07-13 23:53:40 +00001480 msg_cinfo("No usable erase functions left.\n");
Carl-Daniel Hailfingerd8334db2011-07-21 21:21:04 +00001481 break;
1482 }
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001483 msg_cdbg("Trying erase function %i... ", k);
1484 if (check_block_eraser(flash, k, 1))
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001485 continue;
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001486 usable_erasefunctions--;
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001487 ret = walk_eraseregions(flash, k, &erase_and_write_block_helper,
1488 curcontents, newcontents);
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001489 /* If everything is OK, don't try another erase function. */
1490 if (!ret)
1491 break;
Carl-Daniel Hailfingerb23b1eb2010-12-02 02:41:55 +00001492 /* Write/erase failed, so try to find out what the current chip
Carl-Daniel Hailfingerd8334db2011-07-21 21:21:04 +00001493 * contents are. If no usable erase functions remain, we can
1494 * skip this: the next iteration will break immediately anyway.
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001495 */
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001496 if (!usable_erasefunctions)
1497 continue;
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001498 /* Reading the whole chip may take a while, inform the user even
1499 * in non-verbose mode.
1500 */
1501 msg_cinfo("Reading current flash chip contents... ");
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001502 if (flash->chip->read(flash, curcontents, 0, size)) {
Carl-Daniel Hailfingerb23b1eb2010-12-02 02:41:55 +00001503 /* Now we are truly screwed. Read failed as well. */
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001504 msg_cerr("Can't read anymore! Aborting.\n");
Carl-Daniel Hailfingerb23b1eb2010-12-02 02:41:55 +00001505 /* We have no idea about the flash chip contents, so
1506 * retrying with another erase function is pointless.
1507 */
1508 break;
1509 }
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001510 msg_cinfo("done. ");
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001511 }
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001512 /* Free the scratchpad. */
1513 free(curcontents);
Carl-Daniel Hailfingerf160a122009-05-08 17:15:15 +00001514
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001515 if (ret) {
Sean Nelson316a29f2010-05-07 20:09:04 +00001516 msg_cerr("FAILED!\n");
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001517 } else {
Stefan Tauner682122b2013-06-23 22:15:39 +00001518 if (all_skipped)
1519 msg_cinfo("\nWarning: Chip content is identical to the requested image.\n");
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001520 msg_cinfo("Erase/write done.\n");
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001521 }
1522 return ret;
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001523}
1524
Stefan Tauner136388f2013-07-15 10:47:53 +00001525static void nonfatal_help_message(void)
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001526{
Stefan Taunera58f6e92014-05-10 09:25:44 +00001527 msg_gerr("Good, writing to the flash chip apparently didn't do anything.\n");
Stefan Tauner136388f2013-07-15 10:47:53 +00001528#if CONFIG_INTERNAL == 1
1529 if (programmer == PROGRAMMER_INTERNAL)
1530 msg_gerr("This means we have to add special support for your board, programmer or flash\n"
1531 "chip. Please report this on IRC at chat.freenode.net (channel #flashrom) or\n"
1532 "mail flashrom@flashrom.org, thanks!\n"
1533 "-------------------------------------------------------------------------------\n"
1534 "You may now reboot or simply leave the machine running.\n");
1535 else
1536#endif
1537 msg_gerr("Please check the connections (especially those to write protection pins) between\n"
1538 "the programmer and the flash chip. If you think the error is caused by flashrom\n"
1539 "please report this on IRC at chat.freenode.net (channel #flashrom) or\n"
1540 "mail flashrom@flashrom.org, thanks!\n");
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001541}
1542
Stefan Tauner136388f2013-07-15 10:47:53 +00001543static void emergency_help_message(void)
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00001544{
Stefan Tauner136388f2013-07-15 10:47:53 +00001545 msg_gerr("Your flash chip is in an unknown state.\n");
1546#if CONFIG_INTERNAL == 1
1547 if (programmer == PROGRAMMER_INTERNAL)
1548 msg_gerr("Get help on IRC at chat.freenode.net (channel #flashrom) or\n"
1549 "mail flashrom@flashrom.org with the subject \"FAILED: <your board name>\"!\n"
1550 "-------------------------------------------------------------------------------\n"
1551 "DO NOT REBOOT OR POWEROFF!\n");
1552 else
1553#endif
1554 msg_gerr("Please report this on IRC at chat.freenode.net (channel #flashrom) or\n"
1555 "mail flashrom@flashrom.org, thanks!\n");
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00001556}
1557
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001558/* The way to go if you want a delimited list of programmers */
Stefan Tauner66652442011-06-26 17:38:17 +00001559void list_programmers(const char *delim)
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001560{
1561 enum programmer p;
1562 for (p = 0; p < PROGRAMMER_INVALID; p++) {
Sean Nelson316a29f2010-05-07 20:09:04 +00001563 msg_ginfo("%s", programmer_table[p].name);
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001564 if (p < PROGRAMMER_INVALID - 1)
Sean Nelson316a29f2010-05-07 20:09:04 +00001565 msg_ginfo("%s", delim);
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001566 }
Sean Nelson316a29f2010-05-07 20:09:04 +00001567 msg_ginfo("\n");
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001568}
1569
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001570void list_programmers_linebreak(int startcol, int cols, int paren)
1571{
1572 const char *pname;
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +00001573 int pnamelen;
1574 int remaining = 0, firstline = 1;
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001575 enum programmer p;
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +00001576 int i;
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001577
1578 for (p = 0; p < PROGRAMMER_INVALID; p++) {
1579 pname = programmer_table[p].name;
1580 pnamelen = strlen(pname);
1581 if (remaining - pnamelen - 2 < 0) {
1582 if (firstline)
1583 firstline = 0;
1584 else
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001585 msg_ginfo("\n");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001586 for (i = 0; i < startcol; i++)
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001587 msg_ginfo(" ");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001588 remaining = cols - startcol;
1589 } else {
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001590 msg_ginfo(" ");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001591 remaining--;
1592 }
1593 if (paren && (p == 0)) {
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001594 msg_ginfo("(");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001595 remaining--;
1596 }
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001597 msg_ginfo("%s", pname);
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001598 remaining -= pnamelen;
1599 if (p < PROGRAMMER_INVALID - 1) {
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001600 msg_ginfo(",");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001601 remaining--;
1602 } else {
1603 if (paren)
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001604 msg_ginfo(")");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001605 }
1606 }
1607}
1608
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001609void print_sysinfo(void)
1610{
Carl-Daniel Hailfinger60d9bd22012-08-09 23:34:41 +00001611#ifdef _WIN32
1612 SYSTEM_INFO si;
1613 OSVERSIONINFOEX osvi;
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001614
Carl-Daniel Hailfinger60d9bd22012-08-09 23:34:41 +00001615 memset(&si, 0, sizeof(SYSTEM_INFO));
1616 memset(&osvi, 0, sizeof(OSVERSIONINFOEX));
1617 msg_ginfo(" on Windows");
1618 /* Tell Windows which version of the structure we want. */
1619 osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
1620 if (GetVersionEx((OSVERSIONINFO*) &osvi))
1621 msg_ginfo(" %lu.%lu", osvi.dwMajorVersion, osvi.dwMinorVersion);
1622 else
1623 msg_ginfo(" unknown version");
1624 GetSystemInfo(&si);
1625 switch (si.wProcessorArchitecture) {
1626 case PROCESSOR_ARCHITECTURE_AMD64:
1627 msg_ginfo(" (x86_64)");
1628 break;
1629 case PROCESSOR_ARCHITECTURE_INTEL:
1630 msg_ginfo(" (x86)");
1631 break;
1632 default:
1633 msg_ginfo(" (unknown arch)");
1634 break;
1635 }
1636#elif HAVE_UTSNAME == 1
1637 struct utsname osinfo;
1638
1639 uname(&osinfo);
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001640 msg_ginfo(" on %s %s (%s)", osinfo.sysname, osinfo.release,
1641 osinfo.machine);
1642#else
1643 msg_ginfo(" on unknown machine");
1644#endif
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001645}
1646
1647void print_buildinfo(void)
1648{
1649 msg_gdbg("flashrom was built with");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001650#if NEED_PCI == 1
1651#ifdef PCILIB_VERSION
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001652 msg_gdbg(" libpci %s,", PCILIB_VERSION);
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001653#else
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001654 msg_gdbg(" unknown PCI library,");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001655#endif
1656#endif
1657#ifdef __clang__
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001658 msg_gdbg(" LLVM Clang");
Carl-Daniel Hailfingerb51e58e2010-07-17 14:49:30 +00001659#ifdef __clang_version__
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001660 msg_gdbg(" %s,", __clang_version__);
Carl-Daniel Hailfingerb51e58e2010-07-17 14:49:30 +00001661#else
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001662 msg_gdbg(" unknown version (before r102686),");
Carl-Daniel Hailfingerb51e58e2010-07-17 14:49:30 +00001663#endif
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001664#elif defined(__GNUC__)
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001665 msg_gdbg(" GCC");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001666#ifdef __VERSION__
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001667 msg_gdbg(" %s,", __VERSION__);
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001668#else
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001669 msg_gdbg(" unknown version,");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001670#endif
1671#else
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001672 msg_gdbg(" unknown compiler,");
Carl-Daniel Hailfingercceafa22010-05-26 01:45:41 +00001673#endif
1674#if defined (__FLASHROM_LITTLE_ENDIAN__)
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001675 msg_gdbg(" little endian");
Carl-Daniel Hailfinger06b9efa2012-08-07 11:59:59 +00001676#elif defined (__FLASHROM_BIG_ENDIAN__)
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001677 msg_gdbg(" big endian");
Carl-Daniel Hailfinger06b9efa2012-08-07 11:59:59 +00001678#else
1679#error Endianness could not be determined
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001680#endif
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001681 msg_gdbg("\n");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001682}
1683
Bernhard Walle201bde32008-01-21 15:24:22 +00001684void print_version(void)
1685{
Carl-Daniel Hailfinger8841d3e2010-05-15 15:04:37 +00001686 msg_ginfo("flashrom v%s", flashrom_version);
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001687 print_sysinfo();
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001688 msg_ginfo("\n");
Bernhard Walle201bde32008-01-21 15:24:22 +00001689}
1690
Carl-Daniel Hailfinger8841d3e2010-05-15 15:04:37 +00001691void print_banner(void)
1692{
1693 msg_ginfo("flashrom is free software, get the source code at "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001694 "http://www.flashrom.org\n");
Carl-Daniel Hailfinger8841d3e2010-05-15 15:04:37 +00001695 msg_ginfo("\n");
1696}
1697
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001698int selfcheck(void)
1699{
Stefan Tauner96658be2014-05-26 22:05:31 +00001700 unsigned int i;
Stefan Taunera6d96482012-12-26 19:51:23 +00001701 int ret = 0;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001702
1703 /* Safety check. Instead of aborting after the first error, check
1704 * if more errors exist.
1705 */
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001706 if (ARRAY_SIZE(programmer_table) - 1 != PROGRAMMER_INVALID) {
Sean Nelson316a29f2010-05-07 20:09:04 +00001707 msg_gerr("Programmer table miscompilation!\n");
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001708 ret = 1;
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001709 }
Stefan Taunera6d96482012-12-26 19:51:23 +00001710 for (i = 0; i < PROGRAMMER_INVALID; i++) {
1711 const struct programmer_entry p = programmer_table[i];
1712 if (p.name == NULL) {
1713 msg_gerr("All programmers need a valid name, but the one with index %d does not!\n", i);
1714 ret = 1;
1715 /* This might hide other problems with this programmer, but allows for better error
1716 * messages below without jumping through hoops. */
1717 continue;
1718 }
Stefan Tauneraf358d62012-12-27 18:40:26 +00001719 switch (p.type) {
1720 case USB:
1721 case PCI:
1722 case OTHER:
1723 if (p.devs.note == NULL) {
1724 if (strcmp("internal", p.name) == 0)
1725 break; /* This one has its device list stored separately. */
1726 msg_gerr("Programmer %s has neither a device list nor a textual description!\n",
1727 p.name);
1728 ret = 1;
1729 }
1730 break;
1731 default:
1732 msg_gerr("Programmer %s does not have a valid type set!\n", p.name);
1733 ret = 1;
1734 break;
1735 }
Stefan Taunera6d96482012-12-26 19:51:23 +00001736 if (p.init == NULL) {
1737 msg_gerr("Programmer %s does not have a valid init function!\n", p.name);
1738 ret = 1;
1739 }
1740 if (p.delay == NULL) {
1741 msg_gerr("Programmer %s does not have a valid delay function!\n", p.name);
1742 ret = 1;
1743 }
1744 if (p.map_flash_region == NULL) {
1745 msg_gerr("Programmer %s does not have a valid map_flash_region function!\n", p.name);
1746 ret = 1;
1747 }
1748 if (p.unmap_flash_region == NULL) {
1749 msg_gerr("Programmer %s does not have a valid unmap_flash_region function!\n", p.name);
1750 ret = 1;
1751 }
1752 }
Stefan Tauner96658be2014-05-26 22:05:31 +00001753
1754 /* It would be favorable if we could check for the correct layout (especially termination) of various
1755 * constant arrays: flashchips, chipset_enables, board_matches, boards_known, laptops_known.
1756 * They are all defined as externs in this compilation unit so we don't know their sizes which vary
1757 * depending on compiler flags, e.g. the target architecture, and can sometimes be 0.
1758 * For 'flashchips' we export the size explicitly to work around this and to be able to implement the
1759 * checks below. */
Stefan Tauner6697f712014-08-06 15:09:15 +00001760 if (flashchips_size <= 1 || flashchips[flashchips_size - 1].name != NULL) {
Stefan Tauner7bcacb12011-05-26 01:35:19 +00001761 msg_gerr("Flashchips table miscompilation!\n");
1762 ret = 1;
Stefan Tauner96658be2014-05-26 22:05:31 +00001763 } else {
1764 for (i = 0; i < flashchips_size - 1; i++) {
1765 const struct flashchip *chip = &flashchips[i];
1766 if (chip->vendor == NULL || chip->name == NULL || chip->bustype == BUS_NONE) {
1767 ret = 1;
1768 msg_gerr("ERROR: Some field of flash chip #%d (%s) is misconfigured.\n"
1769 "Please report a bug at flashrom@flashrom.org\n", i,
1770 chip->name == NULL ? "unnamed" : chip->name);
1771 }
1772 if (selfcheck_eraseblocks(chip)) {
1773 ret = 1;
1774 }
1775 }
Stefan Tauner7bcacb12011-05-26 01:35:19 +00001776 }
Stefan Tauner7bcacb12011-05-26 01:35:19 +00001777
Stefan Tauner600576b2014-06-12 22:57:36 +00001778#if CONFIG_INTERNAL == 1
1779 ret |= selfcheck_board_enables();
1780#endif
1781
Stefan Tauner96658be2014-05-26 22:05:31 +00001782 /* TODO: implement similar sanity checks for other arrays where deemed necessary. */
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001783 return ret;
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001784}
1785
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001786void check_chip_supported(const struct flashchip *chip)
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001787{
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001788 if (chip->feature_bits & FEATURE_OTP) {
Daniel Lenski65922a32012-02-15 23:40:23 +00001789 msg_cdbg("This chip may contain one-time programmable memory. "
1790 "flashrom cannot read\nand may never be able to write "
1791 "it, hence it may not be able to completely\n"
1792 "clone the contents of this chip (see man page for "
1793 "details).\n");
1794 }
Stefan Tauner6455dff2014-05-26 00:36:24 +00001795
1796 if ((chip->tested.erase == NA) && (chip->tested.write == NA)) {
1797 msg_cdbg("This chip's main memory can not be erased/written by design.\n");
1798 }
1799
1800 if ((chip->tested.probe == BAD) || (chip->tested.probe == NT) ||
1801 (chip->tested.read == BAD) || (chip->tested.read == NT) ||
1802 (chip->tested.erase == BAD) || (chip->tested.erase == NT) ||
1803 (chip->tested.write == BAD) || (chip->tested.write == NT)){
Sean Nelson316a29f2010-05-07 20:09:04 +00001804 msg_cinfo("===\n");
Stefan Tauner6455dff2014-05-26 00:36:24 +00001805 if ((chip->tested.probe == BAD) ||
1806 (chip->tested.read == BAD) ||
1807 (chip->tested.erase == BAD) ||
1808 (chip->tested.write == BAD)) {
Sean Nelson316a29f2010-05-07 20:09:04 +00001809 msg_cinfo("This flash part has status NOT WORKING for operations:");
Stefan Tauner6455dff2014-05-26 00:36:24 +00001810 if (chip->tested.probe == BAD)
Sean Nelson316a29f2010-05-07 20:09:04 +00001811 msg_cinfo(" PROBE");
Stefan Tauner6455dff2014-05-26 00:36:24 +00001812 if (chip->tested.read == BAD)
Sean Nelson316a29f2010-05-07 20:09:04 +00001813 msg_cinfo(" READ");
Stefan Tauner6455dff2014-05-26 00:36:24 +00001814 if (chip->tested.erase == BAD)
Sean Nelson316a29f2010-05-07 20:09:04 +00001815 msg_cinfo(" ERASE");
Stefan Tauner6455dff2014-05-26 00:36:24 +00001816 if (chip->tested.write == BAD)
Sean Nelson316a29f2010-05-07 20:09:04 +00001817 msg_cinfo(" WRITE");
1818 msg_cinfo("\n");
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001819 }
Stefan Tauner6455dff2014-05-26 00:36:24 +00001820 if ((chip->tested.probe == NT) ||
1821 (chip->tested.read == NT) ||
1822 (chip->tested.erase == NT) ||
1823 (chip->tested.write == NT)) {
Sean Nelson316a29f2010-05-07 20:09:04 +00001824 msg_cinfo("This flash part has status UNTESTED for operations:");
Stefan Tauner6455dff2014-05-26 00:36:24 +00001825 if (chip->tested.probe == NT)
Sean Nelson316a29f2010-05-07 20:09:04 +00001826 msg_cinfo(" PROBE");
Stefan Tauner6455dff2014-05-26 00:36:24 +00001827 if (chip->tested.read == NT)
Sean Nelson316a29f2010-05-07 20:09:04 +00001828 msg_cinfo(" READ");
Stefan Tauner6455dff2014-05-26 00:36:24 +00001829 if (chip->tested.erase == NT)
Sean Nelson316a29f2010-05-07 20:09:04 +00001830 msg_cinfo(" ERASE");
Stefan Tauner6455dff2014-05-26 00:36:24 +00001831 if (chip->tested.write == NT)
Sean Nelson316a29f2010-05-07 20:09:04 +00001832 msg_cinfo(" WRITE");
1833 msg_cinfo("\n");
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001834 }
Carl-Daniel Hailfingera84835a2010-01-07 03:24:05 +00001835 /* FIXME: This message is designed towards CLI users. */
Carl-Daniel Hailfinger8841d3e2010-05-15 15:04:37 +00001836 msg_cinfo("The test status of this chip may have been updated "
1837 "in the latest development\n"
1838 "version of flashrom. If you are running the latest "
1839 "development version,\n"
1840 "please email a report to flashrom@flashrom.org if "
1841 "any of the above operations\n"
1842 "work correctly for you with this flash part. Please "
1843 "include the flashrom\n"
1844 "output with the additional -V option for all "
1845 "operations you tested (-V, -Vr,\n"
Paul Menzele3800132012-01-12 13:58:43 +00001846 "-VE, -Vw), and mention which mainboard or "
Carl-Daniel Hailfinger8841d3e2010-05-15 15:04:37 +00001847 "programmer you tested.\n"
Paul Menzelab6328f2010-10-08 11:03:02 +00001848 "Please mention your board in the subject line. "
1849 "Thanks for your help!\n");
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001850 }
1851}
1852
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001853/* FIXME: This function signature needs to be improved once doit() has a better
1854 * function signature.
1855 */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001856int chip_safety_check(const struct flashctx *flash, int force, int read_it, int write_it, int erase_it,
1857 int verify_it)
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001858{
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001859 const struct flashchip *chip = flash->chip;
1860
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001861 if (!programmer_may_write && (write_it || erase_it)) {
1862 msg_perr("Write/erase is not working yet on your programmer in "
1863 "its current configuration.\n");
1864 /* --force is the wrong approach, but it's the best we can do
1865 * until the generic programmer parameter parser is merged.
1866 */
1867 if (!force)
1868 return 1;
1869 msg_cerr("Continuing anyway.\n");
1870 }
1871
1872 if (read_it || erase_it || write_it || verify_it) {
1873 /* Everything needs read. */
Stefan Tauner6455dff2014-05-26 00:36:24 +00001874 if (chip->tested.read == BAD) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001875 msg_cerr("Read is not working on this chip. ");
1876 if (!force)
1877 return 1;
1878 msg_cerr("Continuing anyway.\n");
1879 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001880 if (!chip->read) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001881 msg_cerr("flashrom has no read function for this "
1882 "flash chip.\n");
1883 return 1;
1884 }
1885 }
1886 if (erase_it || write_it) {
1887 /* Write needs erase. */
Stefan Tauner6455dff2014-05-26 00:36:24 +00001888 if (chip->tested.erase == NA) {
1889 msg_cerr("Erase is not possible on this chip.\n");
1890 return 1;
1891 }
1892 if (chip->tested.erase == BAD) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001893 msg_cerr("Erase is not working on this chip. ");
1894 if (!force)
1895 return 1;
1896 msg_cerr("Continuing anyway.\n");
1897 }
Sylvain "ythier" Hitier9db45512011-07-04 07:27:17 +00001898 if(count_usable_erasers(flash) == 0) {
Stefan Tauner5368dca2011-07-01 00:19:12 +00001899 msg_cerr("flashrom has no erase function for this "
1900 "flash chip.\n");
1901 return 1;
1902 }
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001903 }
1904 if (write_it) {
Stefan Tauner6455dff2014-05-26 00:36:24 +00001905 if (chip->tested.write == NA) {
1906 msg_cerr("Write is not possible on this chip.\n");
1907 return 1;
1908 }
1909 if (chip->tested.write == BAD) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001910 msg_cerr("Write is not working on this chip. ");
1911 if (!force)
1912 return 1;
1913 msg_cerr("Continuing anyway.\n");
1914 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001915 if (!chip->write) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001916 msg_cerr("flashrom has no write function for this "
1917 "flash chip.\n");
1918 return 1;
1919 }
1920 }
1921 return 0;
1922}
1923
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001924/* This function signature is horrible. We need to design a better interface,
1925 * but right now it allows us to split off the CLI code.
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00001926 * Besides that, the function itself is a textbook example of abysmal code flow.
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001927 */
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +00001928int doit(struct flashctx *flash, int force, const char *filename, int read_it,
1929 int write_it, int erase_it, int verify_it)
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001930{
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001931 uint8_t *oldcontents;
1932 uint8_t *newcontents;
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001933 int ret = 0;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001934 unsigned long size = flash->chip->total_size * 1024;
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001935
David Hendricks77f931a2011-05-18 01:30:56 +00001936 if (chip_safety_check(flash, force, read_it, write_it, erase_it, verify_it)) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001937 msg_cerr("Aborting.\n");
Stefan Tauner20da4aa2014-05-07 22:07:23 +00001938 return 1;
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001939 }
1940
Stefan Tauner8268fdb2013-09-23 14:21:06 +00001941 if (normalize_romentries(flash)) {
1942 msg_cerr("Requested regions can not be handled. Aborting.\n");
Stefan Tauner20da4aa2014-05-07 22:07:23 +00001943 return 1;
Stefan Tauner8268fdb2013-09-23 14:21:06 +00001944 }
1945
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001946 /* Given the existence of read locks, we want to unlock for read,
1947 * erase and write.
1948 */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001949 if (flash->chip->unlock)
1950 flash->chip->unlock(flash);
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001951
1952 if (read_it) {
Stefan Tauner20da4aa2014-05-07 22:07:23 +00001953 return read_flash_to_file(flash, filename);
Carl-Daniel Hailfingerd1be52d2010-07-03 12:14:25 +00001954 }
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001955
Stefan Tauner269de352011-07-12 22:35:21 +00001956 oldcontents = malloc(size);
1957 if (!oldcontents) {
1958 msg_gerr("Out of memory!\n");
1959 exit(1);
1960 }
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001961 /* Assume worst case: All bits are 0. */
1962 memset(oldcontents, 0x00, size);
Stefan Tauner269de352011-07-12 22:35:21 +00001963 newcontents = malloc(size);
1964 if (!newcontents) {
1965 msg_gerr("Out of memory!\n");
1966 exit(1);
1967 }
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001968 /* Assume best case: All bits should be 1. */
1969 memset(newcontents, 0xff, size);
1970 /* Side effect of the assumptions above: Default write action is erase
1971 * because newcontents looks like a completely erased chip, and
1972 * oldcontents being completely 0x00 means we have to erase everything
1973 * before we can write.
1974 */
1975
Ollie Lhoefa28582004-12-08 20:10:01 +00001976 if (erase_it) {
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001977 /* FIXME: Do we really want the scary warning if erase failed?
1978 * After all, after erase the chip is either blank or partially
1979 * blank or it has the old contents. A blank chip won't boot,
1980 * so if the user wanted erase and reboots afterwards, the user
1981 * knows very well that booting won't work.
1982 */
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001983 if (erase_and_write_flash(flash, oldcontents, newcontents)) {
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00001984 emergency_help_message();
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001985 ret = 1;
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00001986 }
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001987 goto out;
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00001988 }
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001989
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00001990 if (write_it || verify_it) {
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001991 if (read_buf_from_file(newcontents, size, filename)) {
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001992 ret = 1;
1993 goto out;
Stefan Reinauer018aca82006-11-21 23:48:51 +00001994 }
1995
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +00001996#if CONFIG_INTERNAL == 1
Stefan Taunerb4e06bd2012-08-20 00:24:22 +00001997 if (programmer == PROGRAMMER_INTERNAL && cb_check_image(newcontents, size) < 0) {
1998 if (force_boardmismatch) {
1999 msg_pinfo("Proceeding anyway because user forced us to.\n");
2000 } else {
2001 msg_perr("Aborting. You can override this with "
2002 "-p internal:boardmismatch=force.\n");
Niklas Söderlund9e423762012-06-16 00:11:16 +00002003 ret = 1;
2004 goto out;
2005 }
Stefan Taunerb4e06bd2012-08-20 00:24:22 +00002006 }
Carl-Daniel Hailfinger66ef4e52009-12-13 22:28:00 +00002007#endif
Ollie Lhocbbf1252004-03-17 22:22:08 +00002008 }
2009
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00002010 /* Read the whole chip to be able to check whether regions need to be
2011 * erased and to give better diagnostics in case write fails.
2012 * The alternative would be to read only the regions which are to be
2013 * preserved, but in that case we might perform unneeded erase which
2014 * takes time as well.
2015 */
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00002016 msg_cinfo("Reading old flash chip contents... ");
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00002017 if (flash->chip->read(flash, oldcontents, 0, size)) {
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00002018 ret = 1;
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00002019 msg_cinfo("FAILED.\n");
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00002020 goto out;
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00002021 }
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00002022 msg_cinfo("done.\n");
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00002023
Stefan Tauner8268fdb2013-09-23 14:21:06 +00002024 /* Build a new image taking the given layout into account. */
2025 build_new_image(flash, oldcontents, newcontents);
Uwe Hermanna7e05482007-05-09 10:17:44 +00002026
Ollie Lho184a4042005-11-26 21:55:36 +00002027 // ////////////////////////////////////////////////////////////
Uwe Hermanna7e05482007-05-09 10:17:44 +00002028
Peter Stugef31104c2008-04-28 14:47:30 +00002029 if (write_it) {
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00002030 if (erase_and_write_flash(flash, oldcontents, newcontents)) {
Stefan Taunera58f6e92014-05-10 09:25:44 +00002031 msg_cerr("Uh oh. Erase/write failed. Checking if anything has changed.\n");
2032 msg_cinfo("Reading current flash chip contents... ");
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00002033 if (!flash->chip->read(flash, newcontents, 0, size)) {
Stefan Taunera58f6e92014-05-10 09:25:44 +00002034 msg_cinfo("done.\n");
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00002035 if (!memcmp(oldcontents, newcontents, size)) {
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00002036 nonfatal_help_message();
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00002037 ret = 1;
2038 goto out;
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00002039 }
Stefan Taunera58f6e92014-05-10 09:25:44 +00002040 msg_cerr("Apparently at least some data has changed.\n");
2041 } else
2042 msg_cerr("Can't even read anymore!\n");
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00002043 emergency_help_message();
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00002044 ret = 1;
2045 goto out;
Peter Stugef31104c2008-04-28 14:47:30 +00002046 }
Peter Stugef31104c2008-04-28 14:47:30 +00002047 }
Ollie Lho184a4042005-11-26 21:55:36 +00002048
Stefan Taunerc4f44df2013-08-12 22:58:43 +00002049 /* Verify only if we either did not try to write (verify operation) or actually changed something. */
2050 if (verify_it && (!write_it || !all_skipped)) {
Stefan Tauner78ffbea2012-10-27 15:36:56 +00002051 msg_cinfo("Verifying flash... ");
2052
2053 if (write_it) {
2054 /* Work around chips which need some time to calm down. */
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00002055 programmer_delay(1000*1000);
Stefan Tauner78ffbea2012-10-27 15:36:56 +00002056 ret = verify_range(flash, newcontents, 0, size);
2057 /* If we tried to write, and verification now fails, we
2058 * might have an emergency situation.
2059 */
2060 if (ret)
2061 emergency_help_message();
2062 } else {
2063 ret = compare_range(newcontents, oldcontents, 0, size);
2064 }
2065 if (!ret)
2066 msg_cinfo("VERIFIED.\n");
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00002067 }
Ollie Lho184a4042005-11-26 21:55:36 +00002068
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00002069out:
2070 free(oldcontents);
2071 free(newcontents);
Stefan Reinauer143da0b2006-01-04 16:42:57 +00002072 return ret;
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00002073}