blob: 93b292b7862009d970f58ca3ec9574b489dbdd0a [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 Hailfinger66ef4e52009-12-13 22:28:00 +000045
Carl-Daniel Hailfinger2e681602011-09-08 00:00:29 +000046static enum programmer programmer = PROGRAMMER_INVALID;
Nico Huberbcb2e5a2012-12-30 01:23:17 +000047static const char *programmer_param = NULL;
Stefan Reinauer70385642007-04-06 11:58:03 +000048
Uwe Hermann48ec1b12010-08-08 17:01:18 +000049/*
Carl-Daniel Hailfinger66ef4e52009-12-13 22:28:00 +000050 * Programmers supporting multiple buses can have differing size limits on
51 * each bus. Store the limits for each bus in a common struct.
52 */
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +000053struct decode_sizes max_rom_decode;
54
55/* If nonzero, used as the start address of bottom-aligned flash. */
56unsigned long flashbase;
Carl-Daniel Hailfinger66ef4e52009-12-13 22:28:00 +000057
Carl-Daniel Hailfingerd1be52d2010-07-03 12:14:25 +000058/* Is writing allowed with this programmer? */
59int programmer_may_write;
60
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +000061const struct programmer_entry programmer_table[] = {
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +000062#if CONFIG_INTERNAL == 1
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +000063 {
Carl-Daniel Hailfinger37fc4692009-08-12 14:34:35 +000064 .name = "internal",
Stefan Tauneraf358d62012-12-27 18:40:26 +000065 .type = OTHER,
66 .devs.note = NULL,
Carl-Daniel Hailfinger1e334e62009-05-11 15:46:43 +000067 .init = internal_init,
Carl-Daniel Hailfinger1455b2b2009-05-11 14:13:25 +000068 .map_flash_region = physmap,
69 .unmap_flash_region = physunmap,
Carl-Daniel Hailfingerca8bfc62009-06-05 17:48:08 +000070 .delay = internal_delay,
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +000071 },
Carl-Daniel Hailfinger66ef4e52009-12-13 22:28:00 +000072#endif
Luc Verhaegen8e3a6002007-04-04 22:45:58 +000073
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +000074#if CONFIG_DUMMY == 1
Carl-Daniel Hailfingerc3129202009-05-09 00:54:55 +000075 {
Carl-Daniel Hailfinger37fc4692009-08-12 14:34:35 +000076 .name = "dummy",
Stefan Tauneraf358d62012-12-27 18:40:26 +000077 .type = OTHER,
78 /* FIXME */
79 .devs.note = "Dummy device, does nothing and logs all accesses\n",
Carl-Daniel Hailfinger1e334e62009-05-11 15:46:43 +000080 .init = dummy_init,
Carl-Daniel Hailfinger1455b2b2009-05-11 14:13:25 +000081 .map_flash_region = dummy_map,
82 .unmap_flash_region = dummy_unmap,
Carl-Daniel Hailfingerca8bfc62009-06-05 17:48:08 +000083 .delay = internal_delay,
Carl-Daniel Hailfingerc3129202009-05-09 00:54:55 +000084 },
Carl-Daniel Hailfinger4740c6f2009-09-16 10:09:21 +000085#endif
Carl-Daniel Hailfingerc3129202009-05-09 00:54:55 +000086
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +000087#if CONFIG_NIC3COM == 1
Uwe Hermannb4dcb712009-05-13 11:36:06 +000088 {
Carl-Daniel Hailfinger37fc4692009-08-12 14:34:35 +000089 .name = "nic3com",
Stefan Tauneraf358d62012-12-27 18:40:26 +000090 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +000091 .devs.dev = nics_3com,
Uwe Hermannb4dcb712009-05-13 11:36:06 +000092 .init = nic3com_init,
Uwe Hermannc6915932009-05-17 23:12:17 +000093 .map_flash_region = fallback_map,
94 .unmap_flash_region = fallback_unmap,
Carl-Daniel Hailfingerca8bfc62009-06-05 17:48:08 +000095 .delay = internal_delay,
Uwe Hermannb4dcb712009-05-13 11:36:06 +000096 },
Carl-Daniel Hailfinger4740c6f2009-09-16 10:09:21 +000097#endif
Uwe Hermannb4dcb712009-05-13 11:36:06 +000098
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +000099#if CONFIG_NICREALTEK == 1
Joerg Fischer5665ef32010-05-21 21:54:07 +0000100 {
Carl-Daniel Hailfinger40446ee2011-03-07 01:08:09 +0000101 /* This programmer works for Realtek RTL8139 and SMC 1211. */
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000102 .name = "nicrealtek",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000103 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000104 .devs.dev = nics_realtek,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000105 .init = nicrealtek_init,
106 .map_flash_region = fallback_map,
107 .unmap_flash_region = fallback_unmap,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000108 .delay = internal_delay,
Joerg Fischer5665ef32010-05-21 21:54:07 +0000109 },
Joerg Fischer5665ef32010-05-21 21:54:07 +0000110#endif
111
Andrew Morganc29c2e72010-06-07 22:37:54 +0000112#if CONFIG_NICNATSEMI == 1
113 {
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000114 .name = "nicnatsemi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000115 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000116 .devs.dev = nics_natsemi,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000117 .init = nicnatsemi_init,
118 .map_flash_region = fallback_map,
119 .unmap_flash_region = fallback_unmap,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000120 .delay = internal_delay,
Andrew Morganc29c2e72010-06-07 22:37:54 +0000121 },
122#endif
Joerg Fischer5665ef32010-05-21 21:54:07 +0000123
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000124#if CONFIG_GFXNVIDIA == 1
Uwe Hermann2bc98f62009-09-30 18:29:55 +0000125 {
126 .name = "gfxnvidia",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000127 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000128 .devs.dev = gfx_nvidia,
Uwe Hermann2bc98f62009-09-30 18:29:55 +0000129 .init = gfxnvidia_init,
Uwe Hermann2bc98f62009-09-30 18:29:55 +0000130 .map_flash_region = fallback_map,
131 .unmap_flash_region = fallback_unmap,
Uwe Hermann2bc98f62009-09-30 18:29:55 +0000132 .delay = internal_delay,
133 },
134#endif
135
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000136#if CONFIG_DRKAISER == 1
Rudolf Marek68720c72009-05-17 19:39:27 +0000137 {
TURBO Jb0912c02009-09-02 23:00:46 +0000138 .name = "drkaiser",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000139 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000140 .devs.dev = drkaiser_pcidev,
TURBO Jb0912c02009-09-02 23:00:46 +0000141 .init = drkaiser_init,
TURBO Jb0912c02009-09-02 23:00:46 +0000142 .map_flash_region = fallback_map,
143 .unmap_flash_region = fallback_unmap,
TURBO Jb0912c02009-09-02 23:00:46 +0000144 .delay = internal_delay,
145 },
Carl-Daniel Hailfinger4740c6f2009-09-16 10:09:21 +0000146#endif
TURBO Jb0912c02009-09-02 23:00:46 +0000147
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000148#if CONFIG_SATASII == 1
TURBO Jb0912c02009-09-02 23:00:46 +0000149 {
Carl-Daniel Hailfinger37fc4692009-08-12 14:34:35 +0000150 .name = "satasii",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000151 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000152 .devs.dev = satas_sii,
Rudolf Marek68720c72009-05-17 19:39:27 +0000153 .init = satasii_init,
Uwe Hermannc6915932009-05-17 23:12:17 +0000154 .map_flash_region = fallback_map,
155 .unmap_flash_region = fallback_unmap,
Carl-Daniel Hailfingerca8bfc62009-06-05 17:48:08 +0000156 .delay = internal_delay,
Rudolf Marek68720c72009-05-17 19:39:27 +0000157 },
Carl-Daniel Hailfinger4740c6f2009-09-16 10:09:21 +0000158#endif
Rudolf Marek68720c72009-05-17 19:39:27 +0000159
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000160#if CONFIG_ATAHPT == 1
Uwe Hermannddd5c9e2010-02-21 21:17:00 +0000161 {
162 .name = "atahpt",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000163 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000164 .devs.dev = ata_hpt,
Uwe Hermannddd5c9e2010-02-21 21:17:00 +0000165 .init = atahpt_init,
Uwe Hermannddd5c9e2010-02-21 21:17:00 +0000166 .map_flash_region = fallback_map,
167 .unmap_flash_region = fallback_unmap,
Uwe Hermannddd5c9e2010-02-21 21:17:00 +0000168 .delay = internal_delay,
169 },
170#endif
171
Jonathan Kollasch7f0f3fa2014-06-01 10:26:23 +0000172#if CONFIG_ATAVIA == 1
173 {
174 .name = "atavia",
175 .type = PCI,
176 .devs.dev = ata_via,
177 .init = atavia_init,
178 .map_flash_region = atavia_map,
179 .unmap_flash_region = fallback_unmap,
180 .delay = internal_delay,
181 },
182#endif
183
Kyösti Mälkki72d42f82014-06-01 23:48:31 +0000184#if CONFIG_IT8212 == 1
185 {
186 .name = "it8212",
187 .type = PCI,
188 .devs.dev = devs_it8212,
189 .init = it8212_init,
190 .map_flash_region = fallback_map,
191 .unmap_flash_region = fallback_unmap,
192 .delay = internal_delay,
193 },
194#endif
195
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000196#if CONFIG_FT2232_SPI == 1
Paul Fox05dfbe62009-06-16 21:08:06 +0000197 {
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000198 .name = "ft2232_spi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000199 .type = USB,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000200 .devs.dev = devs_ft2232spi,
Paul Fox05dfbe62009-06-16 21:08:06 +0000201 .init = ft2232_spi_init,
Carl-Daniel Hailfinger415e5132009-08-12 11:39:29 +0000202 .map_flash_region = fallback_map,
203 .unmap_flash_region = fallback_unmap,
Paul Fox05dfbe62009-06-16 21:08:06 +0000204 .delay = internal_delay,
205 },
Carl-Daniel Hailfinger3426ef62009-08-19 13:27:58 +0000206#endif
Carl-Daniel Hailfinger415e5132009-08-12 11:39:29 +0000207
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000208#if CONFIG_SERPROG == 1
Urja Rannikko22915352009-06-23 11:33:43 +0000209 {
Carl-Daniel Hailfinger37fc4692009-08-12 14:34:35 +0000210 .name = "serprog",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000211 .type = OTHER,
212 /* FIXME */
213 .devs.note = "All programmer devices speaking the serprog protocol\n",
Urja Rannikko22915352009-06-23 11:33:43 +0000214 .init = serprog_init,
Urja Rannikko22915352009-06-23 11:33:43 +0000215 .map_flash_region = fallback_map,
216 .unmap_flash_region = fallback_unmap,
Urja Rannikko22915352009-06-23 11:33:43 +0000217 .delay = serprog_delay,
218 },
Carl-Daniel Hailfinger6be74112009-08-12 16:17:41 +0000219#endif
Paul Fox05dfbe62009-06-16 21:08:06 +0000220
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000221#if CONFIG_BUSPIRATE_SPI == 1
Carl-Daniel Hailfinger5cca01f2009-11-24 00:20:03 +0000222 {
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000223 .name = "buspirate_spi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000224 .type = OTHER,
225 /* FIXME */
226 .devs.note = "Dangerous Prototypes Bus Pirate\n",
Carl-Daniel Hailfinger5cca01f2009-11-24 00:20:03 +0000227 .init = buspirate_spi_init,
Carl-Daniel Hailfinger5cca01f2009-11-24 00:20:03 +0000228 .map_flash_region = fallback_map,
229 .unmap_flash_region = fallback_unmap,
Carl-Daniel Hailfinger5cca01f2009-11-24 00:20:03 +0000230 .delay = internal_delay,
231 },
232#endif
233
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000234#if CONFIG_DEDIPROG == 1
Carl-Daniel Hailfingerd38fac82010-01-19 11:15:48 +0000235 {
236 .name = "dediprog",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000237 .type = OTHER,
238 /* FIXME */
239 .devs.note = "Dediprog SF100\n",
Carl-Daniel Hailfingerd38fac82010-01-19 11:15:48 +0000240 .init = dediprog_init,
Carl-Daniel Hailfingerd38fac82010-01-19 11:15:48 +0000241 .map_flash_region = fallback_map,
242 .unmap_flash_region = fallback_unmap,
Carl-Daniel Hailfingerd38fac82010-01-19 11:15:48 +0000243 .delay = internal_delay,
244 },
245#endif
246
Carl-Daniel Hailfingere7fdd6e2010-07-21 10:26:01 +0000247#if CONFIG_RAYER_SPI == 1
248 {
249 .name = "rayer_spi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000250 .type = OTHER,
251 /* FIXME */
252 .devs.note = "RayeR parallel port programmer\n",
Carl-Daniel Hailfingere7fdd6e2010-07-21 10:26:01 +0000253 .init = rayer_spi_init,
Carl-Daniel Hailfingere7fdd6e2010-07-21 10:26:01 +0000254 .map_flash_region = fallback_map,
255 .unmap_flash_region = fallback_unmap,
Carl-Daniel Hailfingere7fdd6e2010-07-21 10:26:01 +0000256 .delay = internal_delay,
257 },
258#endif
259
Virgil-Adrian Teacada7c5452012-04-30 23:11:06 +0000260#if CONFIG_PONY_SPI == 1
261 {
262 .name = "pony_spi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000263 .type = OTHER,
264 /* FIXME */
265 .devs.note = "Programmers compatible with SI-Prog, serbang or AJAWe\n",
Virgil-Adrian Teacada7c5452012-04-30 23:11:06 +0000266 .init = pony_spi_init,
267 .map_flash_region = fallback_map,
268 .unmap_flash_region = fallback_unmap,
269 .delay = internal_delay,
Stefan Tauneraf358d62012-12-27 18:40:26 +0000270 },
Virgil-Adrian Teacada7c5452012-04-30 23:11:06 +0000271#endif
272
Carl-Daniel Hailfingerb713d2e2011-05-08 00:24:18 +0000273#if CONFIG_NICINTEL == 1
274 {
275 .name = "nicintel",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000276 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000277 .devs.dev = nics_intel,
Carl-Daniel Hailfingerb713d2e2011-05-08 00:24:18 +0000278 .init = nicintel_init,
Carl-Daniel Hailfingerb713d2e2011-05-08 00:24:18 +0000279 .map_flash_region = fallback_map,
280 .unmap_flash_region = fallback_unmap,
Carl-Daniel Hailfingerb713d2e2011-05-08 00:24:18 +0000281 .delay = internal_delay,
282 },
283#endif
284
Idwer Vollering004f4b72010-09-03 18:21:21 +0000285#if CONFIG_NICINTEL_SPI == 1
286 {
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000287 .name = "nicintel_spi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000288 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000289 .devs.dev = nics_intel_spi,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000290 .init = nicintel_spi_init,
291 .map_flash_region = fallback_map,
292 .unmap_flash_region = fallback_unmap,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000293 .delay = internal_delay,
Idwer Vollering004f4b72010-09-03 18:21:21 +0000294 },
295#endif
296
Ricardo Ribalda Delgado2a41f0a2014-07-28 20:35:21 +0000297#if CONFIG_NICINTEL_EEPROM == 1
298 {
299 .name = "nicintel_eeprom",
300 .type = PCI,
301 .devs.dev = nics_intel_ee,
302 .init = nicintel_ee_init,
303 .map_flash_region = fallback_map,
304 .unmap_flash_region = fallback_unmap,
305 .delay = internal_delay,
306 },
307#endif
308
Mark Marshall90021f22010-12-03 14:48:11 +0000309#if CONFIG_OGP_SPI == 1
310 {
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000311 .name = "ogp_spi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000312 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000313 .devs.dev = ogp_spi,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000314 .init = ogp_spi_init,
315 .map_flash_region = fallback_map,
316 .unmap_flash_region = fallback_unmap,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000317 .delay = internal_delay,
Mark Marshall90021f22010-12-03 14:48:11 +0000318 },
319#endif
320
Carl-Daniel Hailfinger9a1105c2011-02-04 21:37:59 +0000321#if CONFIG_SATAMV == 1
322 {
323 .name = "satamv",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000324 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000325 .devs.dev = satas_mv,
Carl-Daniel Hailfinger9a1105c2011-02-04 21:37:59 +0000326 .init = satamv_init,
Carl-Daniel Hailfinger9a1105c2011-02-04 21:37:59 +0000327 .map_flash_region = fallback_map,
328 .unmap_flash_region = fallback_unmap,
Carl-Daniel Hailfinger9a1105c2011-02-04 21:37:59 +0000329 .delay = internal_delay,
330 },
331#endif
332
Sven Schnelle5ce5f702011-09-03 18:37:52 +0000333#if CONFIG_LINUX_SPI == 1
334 {
335 .name = "linux_spi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000336 .type = OTHER,
337 .devs.note = "Device files /dev/spidev*.*\n",
Sven Schnelle5ce5f702011-09-03 18:37:52 +0000338 .init = linux_spi_init,
339 .map_flash_region = fallback_map,
340 .unmap_flash_region = fallback_unmap,
Sven Schnelle5ce5f702011-09-03 18:37:52 +0000341 .delay = internal_delay,
342 },
343#endif
344
James Lairdc60de0e2013-03-27 13:00:23 +0000345#if CONFIG_USBBLASTER_SPI == 1
346 {
347 .name = "usbblaster_spi",
348 .type = USB,
349 .devs.dev = devs_usbblasterspi,
350 .init = usbblaster_spi_init,
351 .map_flash_region = fallback_map,
352 .unmap_flash_region = fallback_unmap,
353 .delay = internal_delay,
354 },
355#endif
356
Carl-Daniel Hailfinger1c6d2ff2012-08-27 00:44:42 +0000357 {0}, /* This entry corresponds to PROGRAMMER_INVALID. */
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +0000358};
Luc Verhaegen8e3a6002007-04-04 22:45:58 +0000359
Carl-Daniel Hailfinger2bee8cf2010-11-10 15:25:18 +0000360#define SHUTDOWN_MAXFN 32
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000361static int shutdown_fn_count = 0;
362struct shutdown_func_data {
David Hendricks8bb20212011-06-14 01:35:36 +0000363 int (*func) (void *data);
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000364 void *data;
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000365} static shutdown_fn[SHUTDOWN_MAXFN];
366/* Initialize to 0 to make sure nobody registers a shutdown function before
367 * programmer init.
368 */
369static int may_register_shutdown = 0;
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000370
Stefan Taunerc4f44df2013-08-12 22:58:43 +0000371/* Did we change something or was every erase/write skipped (if any)? */
372static bool all_skipped = true;
373
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +0000374static int check_block_eraser(const struct flashctx *flash, int k, int log);
Stefan Tauner5368dca2011-07-01 00:19:12 +0000375
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000376/* Register a function to be executed on programmer shutdown.
377 * The advantage over atexit() is that you can supply a void pointer which will
378 * be used as parameter to the registered function upon programmer shutdown.
379 * This pointer can point to arbitrary data used by said function, e.g. undo
380 * information for GPIO settings etc. If unneeded, set data=NULL.
381 * Please note that the first (void *data) belongs to the function signature of
382 * the function passed as first parameter.
383 */
David Hendricks8bb20212011-06-14 01:35:36 +0000384int register_shutdown(int (*function) (void *data), void *data)
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000385{
386 if (shutdown_fn_count >= SHUTDOWN_MAXFN) {
Carl-Daniel Hailfinger9f5f2152010-06-04 23:20:21 +0000387 msg_perr("Tried to register more than %i shutdown functions.\n",
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000388 SHUTDOWN_MAXFN);
389 return 1;
390 }
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000391 if (!may_register_shutdown) {
392 msg_perr("Tried to register a shutdown function before "
393 "programmer init.\n");
394 return 1;
395 }
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000396 shutdown_fn[shutdown_fn_count].func = function;
397 shutdown_fn[shutdown_fn_count].data = data;
398 shutdown_fn_count++;
399
400 return 0;
401}
402
Nico Huberbcb2e5a2012-12-30 01:23:17 +0000403int programmer_init(enum programmer prog, const char *param)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000404{
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000405 int ret;
Carl-Daniel Hailfinger2e681602011-09-08 00:00:29 +0000406
407 if (prog >= PROGRAMMER_INVALID) {
408 msg_perr("Invalid programmer specified!\n");
409 return -1;
410 }
411 programmer = prog;
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000412 /* Initialize all programmer specific data. */
413 /* Default to unlimited decode sizes. */
414 max_rom_decode = (const struct decode_sizes) {
415 .parallel = 0xffffffff,
416 .lpc = 0xffffffff,
417 .fwh = 0xffffffff,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000418 .spi = 0xffffffff,
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000419 };
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000420 /* Default to top aligned flash at 4 GB. */
421 flashbase = 0;
422 /* Registering shutdown functions is now allowed. */
423 may_register_shutdown = 1;
Carl-Daniel Hailfingerd1be52d2010-07-03 12:14:25 +0000424 /* Default to allowing writes. Broken programmers set this to 0. */
425 programmer_may_write = 1;
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000426
427 programmer_param = param;
Carl-Daniel Hailfinger20a36ba2013-08-13 07:09:57 +0000428 msg_pdbg("Initializing %s programmer\n", programmer_table[programmer].name);
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000429 ret = programmer_table[programmer].init();
430 if (programmer_param && strlen(programmer_param)) {
Carl-Daniel Hailfinger20a36ba2013-08-13 07:09:57 +0000431 if (ret != 0) {
432 /* It is quite possible that any unhandled programmer parameter would have been valid,
433 * but an error in actual programmer init happened before the parameter was evaluated.
434 */
435 msg_pwarn("Unhandled programmer parameters (possibly due to another failure): %s\n",
436 programmer_param);
437 } else {
438 /* Actual programmer init was successful, but the user specified an invalid or unusable
439 * (for the current programmer configuration) parameter.
440 */
441 msg_perr("Unhandled programmer parameters: %s\n", programmer_param);
442 msg_perr("Aborting.\n");
443 ret = ERROR_FATAL;
444 }
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000445 }
446 return ret;
Uwe Hermann09e04f72009-05-16 22:36:00 +0000447}
448
Stefan Tauner20da4aa2014-05-07 22:07:23 +0000449/** Calls registered shutdown functions and resets internal programmer-related variables.
450 * Calling it is safe even without previous initialization, but further interactions with programmer support
451 * require a call to programmer_init() (afterwards).
452 *
453 * @return The OR-ed result values of all shutdown functions (i.e. 0 on success). */
Uwe Hermann09e04f72009-05-16 22:36:00 +0000454int programmer_shutdown(void)
455{
David Hendricks8bb20212011-06-14 01:35:36 +0000456 int ret = 0;
457
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000458 /* Registering shutdown functions is no longer allowed. */
459 may_register_shutdown = 0;
460 while (shutdown_fn_count > 0) {
461 int i = --shutdown_fn_count;
David Hendricks8bb20212011-06-14 01:35:36 +0000462 ret |= shutdown_fn[i].func(shutdown_fn[i].data);
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000463 }
Stefan Taunere34e3e82013-01-01 00:06:51 +0000464
Stefan Taunerb8911d62012-12-26 07:55:00 +0000465 programmer_param = NULL;
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000466 registered_master_count = 0;
Stefan Taunere34e3e82013-01-01 00:06:51 +0000467
David Hendricks8bb20212011-06-14 01:35:36 +0000468 return ret;
Uwe Hermann09e04f72009-05-16 22:36:00 +0000469}
470
Stefan Tauner305e0b92013-07-17 23:46:44 +0000471void *programmer_map_flash_region(const char *descr, uintptr_t phys_addr, size_t len)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000472{
Stefan Tauner26e7a152013-09-13 17:21:05 +0000473 void *ret = programmer_table[programmer].map_flash_region(descr, phys_addr, len);
474 msg_gspew("%s: mapping %s from 0x%0*" PRIxPTR " to 0x%0*" PRIxPTR "\n",
475 __func__, descr, PRIxPTR_WIDTH, phys_addr, PRIxPTR_WIDTH, (uintptr_t) ret);
476 return ret;
Uwe Hermann09e04f72009-05-16 22:36:00 +0000477}
478
479void programmer_unmap_flash_region(void *virt_addr, size_t len)
480{
481 programmer_table[programmer].unmap_flash_region(virt_addr, len);
482}
483
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000484void chip_writeb(const struct flashctx *flash, uint8_t val, chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000485{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000486 flash->mst->par.chip_writeb(flash, val, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000487}
488
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000489void chip_writew(const struct flashctx *flash, uint16_t val, chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000490{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000491 flash->mst->par.chip_writew(flash, val, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000492}
493
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000494void chip_writel(const struct flashctx *flash, uint32_t val, chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000495{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000496 flash->mst->par.chip_writel(flash, val, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000497}
498
Mark Marshallf20b7be2014-05-09 21:16:21 +0000499void chip_writen(const struct flashctx *flash, const uint8_t *buf, chipaddr addr, size_t len)
Carl-Daniel Hailfinger0bd2a2b2009-06-05 18:32:07 +0000500{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000501 flash->mst->par.chip_writen(flash, buf, addr, len);
Carl-Daniel Hailfinger0bd2a2b2009-06-05 18:32:07 +0000502}
503
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000504uint8_t chip_readb(const struct flashctx *flash, const chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000505{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000506 return flash->mst->par.chip_readb(flash, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000507}
508
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000509uint16_t chip_readw(const struct flashctx *flash, const chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000510{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000511 return flash->mst->par.chip_readw(flash, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000512}
513
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000514uint32_t chip_readl(const struct flashctx *flash, const chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000515{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000516 return flash->mst->par.chip_readl(flash, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000517}
518
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000519void chip_readn(const struct flashctx *flash, uint8_t *buf, chipaddr addr,
520 size_t len)
Carl-Daniel Hailfinger0bd2a2b2009-06-05 18:32:07 +0000521{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000522 flash->mst->par.chip_readn(flash, buf, addr, len);
Carl-Daniel Hailfinger0bd2a2b2009-06-05 18:32:07 +0000523}
524
Stefan Taunerf80419c2014-05-02 15:41:42 +0000525void programmer_delay(unsigned int usecs)
Carl-Daniel Hailfingerca8bfc62009-06-05 17:48:08 +0000526{
Urja Rannikko8d7ec2a2013-10-21 21:49:08 +0000527 if (usecs > 0)
528 programmer_table[programmer].delay(usecs);
Carl-Daniel Hailfingerca8bfc62009-06-05 17:48:08 +0000529}
530
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +0000531void map_flash_registers(struct flashctx *flash)
Stefan Reinauerff4f1972007-05-24 08:48:10 +0000532{
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +0000533 size_t size = flash->chip->total_size * 1024;
Carl-Daniel Hailfingerd0fc9462009-05-11 14:01:17 +0000534 /* Flash registers live 4 MByte below the flash. */
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +0000535 /* FIXME: This is incorrect for nonstandard flashbase. */
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +0000536 flash->virtual_registers = (chipaddr)programmer_map_flash_region("flash chip registers", (0xFFFFFFFF - 0x400000 - size + 1), size);
Stefan Reinauerff4f1972007-05-24 08:48:10 +0000537}
538
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000539int read_memmapped(struct flashctx *flash, uint8_t *buf, unsigned int start,
540 int unsigned len)
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000541{
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000542 chip_readn(flash, buf, flash->virtual_memory + start, len);
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000543
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000544 return 0;
545}
546
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000547/* This is a somewhat hacked function similar in some ways to strtok().
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000548 * It will look for needle with a subsequent '=' in haystack, return a copy of
549 * needle and remove everything from the first occurrence of needle to the next
550 * delimiter from haystack.
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000551 */
Nico Huberbcb2e5a2012-12-30 01:23:17 +0000552char *extract_param(const char *const *haystack, const char *needle, const char *delim)
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000553{
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000554 char *param_pos, *opt_pos, *rest;
555 char *opt = NULL;
556 int optlen;
Carl-Daniel Hailfinger27023762010-04-28 15:22:14 +0000557 int needlelen;
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000558
Carl-Daniel Hailfinger27023762010-04-28 15:22:14 +0000559 needlelen = strlen(needle);
560 if (!needlelen) {
561 msg_gerr("%s: empty needle! Please report a bug at "
562 "flashrom@flashrom.org\n", __func__);
563 return NULL;
564 }
565 /* No programmer parameters given. */
566 if (*haystack == NULL)
567 return NULL;
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000568 param_pos = strstr(*haystack, needle);
569 do {
570 if (!param_pos)
571 return NULL;
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000572 /* Needle followed by '='? */
573 if (param_pos[needlelen] == '=') {
574
575 /* Beginning of the string? */
576 if (param_pos == *haystack)
577 break;
578 /* After a delimiter? */
579 if (strchr(delim, *(param_pos - 1)))
580 break;
581 }
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000582 /* Continue searching. */
583 param_pos++;
584 param_pos = strstr(param_pos, needle);
585 } while (1);
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000586
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000587 if (param_pos) {
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000588 /* Get the string after needle and '='. */
589 opt_pos = param_pos + needlelen + 1;
590 optlen = strcspn(opt_pos, delim);
591 /* Return an empty string if the parameter was empty. */
592 opt = malloc(optlen + 1);
593 if (!opt) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000594 msg_gerr("Out of memory!\n");
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000595 exit(1);
596 }
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000597 strncpy(opt, opt_pos, optlen);
598 opt[optlen] = '\0';
599 rest = opt_pos + optlen;
600 /* Skip all delimiters after the current parameter. */
601 rest += strspn(rest, delim);
602 memmove(param_pos, rest, strlen(rest) + 1);
603 /* We could shrink haystack, but the effort is not worth it. */
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000604 }
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000605
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000606 return opt;
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000607}
608
Stefan Tauner66652442011-06-26 17:38:17 +0000609char *extract_programmer_param(const char *param_name)
Carl-Daniel Hailfinger2b6dcb32010-07-08 10:13:37 +0000610{
611 return extract_param(&programmer_param, param_name, ",");
612}
613
Sylvain "ythier" Hitier9db45512011-07-04 07:27:17 +0000614/* Returns the number of well-defined erasers for a chip. */
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +0000615static unsigned int count_usable_erasers(const struct flashctx *flash)
Stefan Tauner5368dca2011-07-01 00:19:12 +0000616{
617 unsigned int usable_erasefunctions = 0;
618 int k;
619 for (k = 0; k < NUM_ERASEFUNCTIONS; k++) {
620 if (!check_block_eraser(flash, k, 0))
621 usable_erasefunctions++;
622 }
623 return usable_erasefunctions;
624}
625
Mark Marshallf20b7be2014-05-09 21:16:21 +0000626static int compare_range(const uint8_t *wantbuf, const uint8_t *havebuf, unsigned int start, unsigned int len)
Stefan Tauner78ffbea2012-10-27 15:36:56 +0000627{
628 int ret = 0, failcount = 0;
629 unsigned int i;
630 for (i = 0; i < len; i++) {
631 if (wantbuf[i] != havebuf[i]) {
632 /* Only print the first failure. */
633 if (!failcount++)
634 msg_cerr("FAILED at 0x%08x! Expected=0x%02x, Found=0x%02x,",
635 start + i, wantbuf[i], havebuf[i]);
636 }
637 }
638 if (failcount) {
639 msg_cerr(" failed byte count from 0x%08x-0x%08x: 0x%x\n",
640 start, start + len - 1, failcount);
641 ret = -1;
642 }
643 return ret;
644}
645
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000646/* start is an offset to the base address of the flash chip */
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000647int check_erased_range(struct flashctx *flash, unsigned int start,
648 unsigned int len)
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000649{
650 int ret;
651 uint8_t *cmpbuf = malloc(len);
652
653 if (!cmpbuf) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000654 msg_gerr("Could not allocate memory!\n");
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000655 exit(1);
656 }
657 memset(cmpbuf, 0xff, len);
Stefan Tauner78ffbea2012-10-27 15:36:56 +0000658 ret = verify_range(flash, cmpbuf, start, len);
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000659 free(cmpbuf);
660 return ret;
661}
662
Uwe Hermann48ec1b12010-08-08 17:01:18 +0000663/*
Carl-Daniel Hailfingerd0250a32009-11-25 17:05:52 +0000664 * @cmpbuf buffer to compare against, cmpbuf[0] is expected to match the
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000665 * flash content at location start
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000666 * @start offset to the base address of the flash chip
667 * @len length of the verified area
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000668 * @return 0 for success, -1 for failure
669 */
Mark Marshallf20b7be2014-05-09 21:16:21 +0000670int verify_range(struct flashctx *flash, const uint8_t *cmpbuf, unsigned int start, unsigned int len)
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000671{
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000672 if (!len)
Stefan Taunerdf64a422014-05-27 00:06:14 +0000673 return -1;
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000674
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +0000675 if (!flash->chip->read) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000676 msg_cerr("ERROR: flashrom has no read function for this flash chip.\n");
Stefan Taunerdf64a422014-05-27 00:06:14 +0000677 return -1;
Carl-Daniel Hailfinger23290662009-06-24 08:20:45 +0000678 }
Stefan Taunerdf64a422014-05-27 00:06:14 +0000679
680 uint8_t *readbuf = malloc(len);
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000681 if (!readbuf) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000682 msg_gerr("Could not allocate memory!\n");
Stefan Taunerdf64a422014-05-27 00:06:14 +0000683 return -1;
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000684 }
Stefan Taunerdf64a422014-05-27 00:06:14 +0000685 int ret = 0;
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000686
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +0000687 if (start + len > flash->chip->total_size * 1024) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000688 msg_gerr("Error: %s called with start 0x%x + len 0x%x >"
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000689 " total_size 0x%x\n", __func__, start, len,
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +0000690 flash->chip->total_size * 1024);
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000691 ret = -1;
692 goto out_free;
693 }
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000694
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +0000695 ret = flash->chip->read(flash, readbuf, start, len);
Carl-Daniel Hailfingerd8369412010-11-16 17:21:58 +0000696 if (ret) {
697 msg_gerr("Verification impossible because read failed "
698 "at 0x%x (len 0x%x)\n", start, len);
Stefan Taunerdf64a422014-05-27 00:06:14 +0000699 ret = -1;
700 goto out_free;
Carl-Daniel Hailfingerd8369412010-11-16 17:21:58 +0000701 }
702
Stefan Tauner78ffbea2012-10-27 15:36:56 +0000703 ret = compare_range(cmpbuf, readbuf, start, len);
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000704out_free:
705 free(readbuf);
706 return ret;
707}
708
Stefan Tauner02437452013-04-01 19:34:53 +0000709/* Helper function for need_erase() that focuses on granularities of gran bytes. */
Mark Marshallf20b7be2014-05-09 21:16:21 +0000710static 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 +0000711{
712 unsigned int i, j, limit;
713 for (j = 0; j < len / gran; j++) {
714 limit = min (gran, len - j * gran);
715 /* Are 'have' and 'want' identical? */
716 if (!memcmp(have + j * gran, want + j * gran, limit))
717 continue;
718 /* have needs to be in erased state. */
719 for (i = 0; i < limit; i++)
720 if (have[j * gran + i] != 0xff)
721 return 1;
722 }
723 return 0;
724}
725
Uwe Hermann48ec1b12010-08-08 17:01:18 +0000726/*
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000727 * Check if the buffer @have can be programmed to the content of @want without
728 * erasing. This is only possible if all chunks of size @gran are either kept
729 * as-is or changed from an all-ones state to any other state.
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000730 *
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000731 * Warning: This function assumes that @have and @want point to naturally
732 * aligned regions.
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000733 *
734 * @have buffer with current content
735 * @want buffer with desired content
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000736 * @len length of the checked area
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000737 * @gran write granularity (enum, not count)
738 * @return 0 if no erase is needed, 1 otherwise
739 */
Mark Marshallf20b7be2014-05-09 21:16:21 +0000740int 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 +0000741{
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +0000742 int result = 0;
Stefan Tauner02437452013-04-01 19:34:53 +0000743 unsigned int i;
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000744
745 switch (gran) {
746 case write_gran_1bit:
747 for (i = 0; i < len; i++)
748 if ((have[i] & want[i]) != want[i]) {
749 result = 1;
750 break;
751 }
752 break;
753 case write_gran_1byte:
754 for (i = 0; i < len; i++)
755 if ((have[i] != want[i]) && (have[i] != 0xff)) {
756 result = 1;
757 break;
758 }
759 break;
760 case write_gran_256bytes:
Stefan Tauner02437452013-04-01 19:34:53 +0000761 result = need_erase_gran_bytes(have, want, len, 256);
762 break;
763 case write_gran_264bytes:
764 result = need_erase_gran_bytes(have, want, len, 264);
765 break;
766 case write_gran_512bytes:
767 result = need_erase_gran_bytes(have, want, len, 512);
768 break;
769 case write_gran_528bytes:
770 result = need_erase_gran_bytes(have, want, len, 528);
771 break;
772 case write_gran_1024bytes:
773 result = need_erase_gran_bytes(have, want, len, 1024);
774 break;
775 case write_gran_1056bytes:
776 result = need_erase_gran_bytes(have, want, len, 1056);
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000777 break;
Carl-Daniel Hailfinger1b0e9fc2014-06-16 22:36:17 +0000778 case write_gran_1byte_implicit_erase:
779 /* Do not erase, handle content changes from anything->0xff by writing 0xff. */
780 result = 0;
781 break;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000782 default:
783 msg_cerr("%s: Unsupported granularity! Please report a bug at "
784 "flashrom@flashrom.org\n", __func__);
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000785 }
786 return result;
787}
788
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000789/**
790 * Check if the buffer @have needs to be programmed to get the content of @want.
791 * If yes, return 1 and fill in first_start with the start address of the
792 * write operation and first_len with the length of the first to-be-written
793 * chunk. If not, return 0 and leave first_start and first_len undefined.
794 *
795 * Warning: This function assumes that @have and @want point to naturally
796 * aligned regions.
797 *
798 * @have buffer with current content
799 * @want buffer with desired content
800 * @len length of the checked area
801 * @gran write granularity (enum, not count)
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000802 * @first_start offset of the first byte which needs to be written (passed in
803 * value is increased by the offset of the first needed write
804 * relative to have/want or unchanged if no write is needed)
805 * @return length of the first contiguous area which needs to be written
806 * 0 if no write is needed
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000807 *
808 * FIXME: This function needs a parameter which tells it about coalescing
809 * in relation to the max write length of the programmer and the max write
810 * length of the chip.
811 */
Mark Marshallf20b7be2014-05-09 21:16:21 +0000812static unsigned int get_next_write(const uint8_t *have, const uint8_t *want, unsigned int len,
Stefan Taunerc69c9c82011-11-23 09:13:48 +0000813 unsigned int *first_start,
814 enum write_granularity gran)
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000815{
Stefan Taunerc69c9c82011-11-23 09:13:48 +0000816 int need_write = 0;
817 unsigned int rel_start = 0, first_len = 0;
818 unsigned int i, limit, stride;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000819
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000820 switch (gran) {
821 case write_gran_1bit:
822 case write_gran_1byte:
Carl-Daniel Hailfinger1b0e9fc2014-06-16 22:36:17 +0000823 case write_gran_1byte_implicit_erase:
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000824 stride = 1;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000825 break;
826 case write_gran_256bytes:
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000827 stride = 256;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000828 break;
Stefan Tauner02437452013-04-01 19:34:53 +0000829 case write_gran_264bytes:
830 stride = 264;
831 break;
832 case write_gran_512bytes:
833 stride = 512;
834 break;
835 case write_gran_528bytes:
836 stride = 528;
837 break;
838 case write_gran_1024bytes:
839 stride = 1024;
840 break;
841 case write_gran_1056bytes:
842 stride = 1056;
843 break;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000844 default:
845 msg_cerr("%s: Unsupported granularity! Please report a bug at "
846 "flashrom@flashrom.org\n", __func__);
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000847 /* Claim that no write was needed. A write with unknown
848 * granularity is too dangerous to try.
849 */
850 return 0;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000851 }
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000852 for (i = 0; i < len / stride; i++) {
853 limit = min(stride, len - i * stride);
854 /* Are 'have' and 'want' identical? */
855 if (memcmp(have + i * stride, want + i * stride, limit)) {
856 if (!need_write) {
857 /* First location where have and want differ. */
858 need_write = 1;
859 rel_start = i * stride;
860 }
861 } else {
862 if (need_write) {
863 /* First location where have and want
864 * do not differ anymore.
865 */
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000866 break;
867 }
868 }
869 }
Carl-Daniel Hailfinger202bf532010-12-06 13:05:44 +0000870 if (need_write)
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000871 first_len = min(i * stride - rel_start, len);
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000872 *first_start += rel_start;
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000873 return first_len;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000874}
875
Carl-Daniel Hailfingereaac68b2009-11-23 12:55:31 +0000876/* This function generates various test patterns useful for testing controller
877 * and chip communication as well as chip behaviour.
878 *
879 * If a byte can be written multiple times, each time keeping 0-bits at 0
880 * and changing 1-bits to 0 if the new value for that bit is 0, the effect
881 * is essentially an AND operation. That's also the reason why this function
882 * provides the result of AND between various patterns.
883 *
884 * Below is a list of patterns (and their block length).
885 * Pattern 0 is 05 15 25 35 45 55 65 75 85 95 a5 b5 c5 d5 e5 f5 (16 Bytes)
886 * Pattern 1 is 0a 1a 2a 3a 4a 5a 6a 7a 8a 9a aa ba ca da ea fa (16 Bytes)
887 * Pattern 2 is 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f (16 Bytes)
888 * Pattern 3 is a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af (16 Bytes)
889 * Pattern 4 is 00 10 20 30 40 50 60 70 80 90 a0 b0 c0 d0 e0 f0 (16 Bytes)
890 * Pattern 5 is 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f (16 Bytes)
891 * Pattern 6 is 00 (1 Byte)
892 * Pattern 7 is ff (1 Byte)
893 * Patterns 0-7 have a big-endian block number in the last 2 bytes of each 256
894 * byte block.
895 *
896 * Pattern 8 is 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11... (256 B)
897 * Pattern 9 is ff fe fd fc fb fa f9 f8 f7 f6 f5 f4 f3 f2 f1 f0 ef ee... (256 B)
898 * Pattern 10 is 00 00 00 01 00 02 00 03 00 04... (128 kB big-endian counter)
899 * Pattern 11 is ff ff ff fe ff fd ff fc ff fb... (128 kB big-endian downwards)
900 * Pattern 12 is 00 (1 Byte)
901 * Pattern 13 is ff (1 Byte)
902 * Patterns 8-13 have no block number.
903 *
904 * Patterns 0-3 are created to detect and efficiently diagnose communication
905 * slips like missed bits or bytes and their repetitive nature gives good visual
906 * cues to the person inspecting the results. In addition, the following holds:
907 * AND Pattern 0/1 == Pattern 4
908 * AND Pattern 2/3 == Pattern 5
909 * AND Pattern 0/1/2/3 == AND Pattern 4/5 == Pattern 6
910 * A weakness of pattern 0-5 is the inability to detect swaps/copies between
911 * any two 16-byte blocks except for the last 16-byte block in a 256-byte bloc.
912 * They work perfectly for detecting any swaps/aliasing of blocks >= 256 bytes.
913 * 0x5 and 0xa were picked because they are 0101 and 1010 binary.
914 * Patterns 8-9 are best for detecting swaps/aliasing of blocks < 256 bytes.
915 * Besides that, they provide for bit testing of the last two bytes of every
916 * 256 byte block which contains the block number for patterns 0-6.
917 * Patterns 10-11 are special purpose for detecting subblock aliasing with
918 * block sizes >256 bytes (some Dataflash chips etc.)
919 * AND Pattern 8/9 == Pattern 12
920 * AND Pattern 10/11 == Pattern 12
921 * Pattern 13 is the completely erased state.
922 * None of the patterns can detect aliasing at boundaries which are a multiple
923 * of 16 MBytes (but such chips do not exist anyway for Parallel/LPC/FWH/SPI).
924 */
925int generate_testpattern(uint8_t *buf, uint32_t size, int variant)
926{
927 int i;
928
929 if (!buf) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000930 msg_gerr("Invalid buffer!\n");
Carl-Daniel Hailfingereaac68b2009-11-23 12:55:31 +0000931 return 1;
932 }
933
934 switch (variant) {
935 case 0:
936 for (i = 0; i < size; i++)
937 buf[i] = (i & 0xf) << 4 | 0x5;
938 break;
939 case 1:
940 for (i = 0; i < size; i++)
941 buf[i] = (i & 0xf) << 4 | 0xa;
942 break;
943 case 2:
944 for (i = 0; i < size; i++)
945 buf[i] = 0x50 | (i & 0xf);
946 break;
947 case 3:
948 for (i = 0; i < size; i++)
949 buf[i] = 0xa0 | (i & 0xf);
950 break;
951 case 4:
952 for (i = 0; i < size; i++)
953 buf[i] = (i & 0xf) << 4;
954 break;
955 case 5:
956 for (i = 0; i < size; i++)
957 buf[i] = i & 0xf;
958 break;
959 case 6:
960 memset(buf, 0x00, size);
961 break;
962 case 7:
963 memset(buf, 0xff, size);
964 break;
965 case 8:
966 for (i = 0; i < size; i++)
967 buf[i] = i & 0xff;
968 break;
969 case 9:
970 for (i = 0; i < size; i++)
971 buf[i] = ~(i & 0xff);
972 break;
973 case 10:
974 for (i = 0; i < size % 2; i++) {
975 buf[i * 2] = (i >> 8) & 0xff;
976 buf[i * 2 + 1] = i & 0xff;
977 }
978 if (size & 0x1)
979 buf[i * 2] = (i >> 8) & 0xff;
980 break;
981 case 11:
982 for (i = 0; i < size % 2; i++) {
983 buf[i * 2] = ~((i >> 8) & 0xff);
984 buf[i * 2 + 1] = ~(i & 0xff);
985 }
986 if (size & 0x1)
987 buf[i * 2] = ~((i >> 8) & 0xff);
988 break;
989 case 12:
990 memset(buf, 0x00, size);
991 break;
992 case 13:
993 memset(buf, 0xff, size);
994 break;
995 }
996
997 if ((variant >= 0) && (variant <= 7)) {
998 /* Write block number in the last two bytes of each 256-byte
999 * block, big endian for easier reading of the hexdump.
1000 * Note that this wraps around for chips larger than 2^24 bytes
1001 * (16 MB).
1002 */
1003 for (i = 0; i < size / 256; i++) {
1004 buf[i * 256 + 254] = (i >> 8) & 0xff;
1005 buf[i * 256 + 255] = i & 0xff;
1006 }
1007 }
1008
1009 return 0;
1010}
1011
Stefan Tauner9e3a6982014-08-15 17:17:59 +00001012/* Returns the number of busses commonly supported by the current programmer and flash chip where the latter
1013 * can not be completely accessed due to size/address limits of the programmer. */
1014unsigned int count_max_decode_exceedings(const struct flashctx *flash)
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001015{
Stefan Tauner9e3a6982014-08-15 17:17:59 +00001016 unsigned int limitexceeded = 0;
1017 uint32_t size = flash->chip->total_size * 1024;
1018 enum chipbustype buses = flash->mst->buses_supported & flash->chip->bustype;
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001019
1020 if ((buses & BUS_PARALLEL) && (max_rom_decode.parallel < size)) {
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001021 limitexceeded++;
Sean Nelson316a29f2010-05-07 20:09:04 +00001022 msg_pdbg("Chip size %u kB is bigger than supported "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001023 "size %u kB of chipset/board/programmer "
1024 "for %s interface, "
1025 "probe/read/erase/write may fail. ", size / 1024,
1026 max_rom_decode.parallel / 1024, "Parallel");
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001027 }
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001028 if ((buses & BUS_LPC) && (max_rom_decode.lpc < size)) {
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001029 limitexceeded++;
Sean Nelson316a29f2010-05-07 20:09:04 +00001030 msg_pdbg("Chip size %u kB is bigger than supported "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001031 "size %u kB of chipset/board/programmer "
1032 "for %s interface, "
1033 "probe/read/erase/write may fail. ", size / 1024,
1034 max_rom_decode.lpc / 1024, "LPC");
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001035 }
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001036 if ((buses & BUS_FWH) && (max_rom_decode.fwh < size)) {
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001037 limitexceeded++;
Sean Nelson316a29f2010-05-07 20:09:04 +00001038 msg_pdbg("Chip size %u kB is bigger than supported "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001039 "size %u kB of chipset/board/programmer "
1040 "for %s interface, "
1041 "probe/read/erase/write may fail. ", size / 1024,
1042 max_rom_decode.fwh / 1024, "FWH");
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001043 }
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001044 if ((buses & BUS_SPI) && (max_rom_decode.spi < size)) {
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001045 limitexceeded++;
Sean Nelson316a29f2010-05-07 20:09:04 +00001046 msg_pdbg("Chip size %u kB is bigger than supported "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001047 "size %u kB of chipset/board/programmer "
1048 "for %s interface, "
1049 "probe/read/erase/write may fail. ", size / 1024,
1050 max_rom_decode.spi / 1024, "SPI");
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001051 }
Stefan Tauner9e3a6982014-08-15 17:17:59 +00001052 return limitexceeded;
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001053}
1054
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +00001055int probe_flash(struct registered_master *mst, int startchip, struct flashctx *flash, int force)
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001056{
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001057 const struct flashchip *chip;
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001058 unsigned long base = 0;
Stefan Reinauer051e2362011-01-19 06:21:54 +00001059 char location[64];
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001060 uint32_t size;
1061 enum chipbustype buses_common;
Carl-Daniel Hailfingerb22918c2009-06-01 02:08:58 +00001062 char *tmp;
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001063
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001064 for (chip = flashchips + startchip; chip && chip->name; chip++) {
1065 if (chip_to_probe && strcmp(chip->name, chip_to_probe) != 0)
Ollie Lhocbbf1252004-03-17 22:22:08 +00001066 continue;
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +00001067 buses_common = mst->buses_supported & chip->bustype;
Carl-Daniel Hailfingerc40cff72011-12-20 00:19:29 +00001068 if (!buses_common)
Carl-Daniel Hailfinger6573b742011-06-17 22:38:53 +00001069 continue;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001070 msg_gdbg("Probing for %s %s, %d kB: ", chip->vendor, chip->name, chip->total_size);
1071 if (!chip->probe && !force) {
1072 msg_gdbg("failed! flashrom has no probe function for this flash chip.\n");
Carl-Daniel Hailfingerb22918c2009-06-01 02:08:58 +00001073 continue;
1074 }
Stefan Reinauer70385642007-04-06 11:58:03 +00001075
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001076 /* Start filling in the dynamic data. */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001077 flash->chip = calloc(1, sizeof(struct flashchip));
1078 if (!flash->chip) {
1079 msg_gerr("Out of memory!\n");
1080 exit(1);
1081 }
1082 memcpy(flash->chip, chip, sizeof(struct flashchip));
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +00001083 flash->mst = mst;
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001084
Stefan Tauner9e3a6982014-08-15 17:17:59 +00001085 size = flash->chip->total_size * 1024;
Carl-Daniel Hailfinger97d6b092009-05-09 07:27:23 +00001086 base = flashbase ? flashbase : (0xffffffff - size + 1);
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001087 flash->virtual_memory = (chipaddr)programmer_map_flash_region("flash chip", base, size);
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001088
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001089 /* We handle a forced match like a real match, we just avoid probing. Note that probe_flash()
1090 * is only called with force=1 after normal probing failed.
1091 */
Peter Stuge27c3e2d2008-07-02 17:15:47 +00001092 if (force)
1093 break;
Stefan Reinauerfcb63682006-03-16 16:57:41 +00001094
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001095 if (flash->chip->probe(flash) != 1)
Peter Stuge483b8f02008-09-03 23:10:05 +00001096 goto notfound;
1097
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001098 /* If this is the first chip found, accept it.
1099 * If this is not the first chip found, accept it only if it is
Stefan Taunerac1b4c82012-02-17 14:51:04 +00001100 * a non-generic match. SFDP and CFI are generic matches.
1101 * startchip==0 means this call to probe_flash() is the first
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +00001102 * one for this programmer interface (master) and thus no other chip has
Stefan Taunerac1b4c82012-02-17 14:51:04 +00001103 * been found on this interface.
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001104 */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001105 if (startchip == 0 && flash->chip->model_id == SFDP_DEVICE_ID) {
Stefan Taunerac1b4c82012-02-17 14:51:04 +00001106 msg_cinfo("===\n"
1107 "SFDP has autodetected a flash chip which is "
1108 "not natively supported by flashrom yet.\n");
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001109 if (count_usable_erasers(flash) == 0)
Stefan Taunerac1b4c82012-02-17 14:51:04 +00001110 msg_cinfo("The standard operations read and "
1111 "verify should work, but to support "
1112 "erase, write and all other "
1113 "possible features");
1114 else
1115 msg_cinfo("All standard operations (read, "
1116 "verify, erase and write) should "
1117 "work, but to support all possible "
1118 "features");
1119
Stefan Taunerb4e06bd2012-08-20 00:24:22 +00001120 msg_cinfo(" we need to add them manually.\n"
1121 "You can help us by mailing us the output of the following command to "
1122 "flashrom@flashrom.org:\n"
1123 "'flashrom -VV [plus the -p/--programmer parameter]'\n"
1124 "Thanks for your help!\n"
Stefan Taunerac1b4c82012-02-17 14:51:04 +00001125 "===\n");
1126 }
1127
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001128 /* First flash chip detected on this bus. */
1129 if (startchip == 0)
Peter Stuge27c3e2d2008-07-02 17:15:47 +00001130 break;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001131 /* Not the first flash chip detected on this bus, but not a generic match either. */
1132 if ((flash->chip->model_id != GENERIC_DEVICE_ID) && (flash->chip->model_id != SFDP_DEVICE_ID))
1133 break;
1134 /* 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 +00001135notfound:
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001136 programmer_unmap_flash_region((void *)flash->virtual_memory, size);
1137 flash->virtual_memory = (chipaddr)NULL;
1138 free(flash->chip);
1139 flash->chip = NULL;
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001140 }
Uwe Hermannffec5f32007-08-23 16:08:21 +00001141
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001142 if (!flash->chip)
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001143 return -1;
Peter Stuge27c3e2d2008-07-02 17:15:47 +00001144
Carl-Daniel Hailfingerd9535582011-03-08 00:09:11 +00001145#if CONFIG_INTERNAL == 1
1146 if (programmer_table[programmer].map_flash_region == physmap)
Stefan Reinauer051e2362011-01-19 06:21:54 +00001147 snprintf(location, sizeof(location), "at physical address 0x%lx", base);
Carl-Daniel Hailfingerd9535582011-03-08 00:09:11 +00001148 else
1149#endif
Stefan Reinauer051e2362011-01-19 06:21:54 +00001150 snprintf(location, sizeof(location), "on %s", programmer_table[programmer].name);
Stefan Reinauer051e2362011-01-19 06:21:54 +00001151
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001152 tmp = flashbuses_to_text(flash->chip->bustype);
1153 msg_cinfo("%s %s flash chip \"%s\" (%d kB, %s) %s.\n", force ? "Assuming" : "Found",
1154 flash->chip->vendor, flash->chip->name, flash->chip->total_size, tmp, location);
Stefan Tauner00155492011-06-26 20:45:35 +00001155 free(tmp);
Uwe Hermann9899cad2009-06-28 21:47:57 +00001156
Carl-Daniel Hailfinger859f3f02010-12-02 21:59:42 +00001157 /* Flash registers will not be mapped if the chip was forced. Lock info
1158 * may be stored in registers, so avoid lock info printing.
1159 */
1160 if (!force)
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001161 if (flash->chip->printlock)
1162 flash->chip->printlock(flash);
Sean Nelson6e0b9122010-02-19 00:52:10 +00001163
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001164 /* Return position of matching chip. */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001165 return chip - flashchips;
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001166}
1167
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001168int read_buf_from_file(unsigned char *buf, unsigned long size,
1169 const char *filename)
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001170{
Nico Huber7562f7d2013-08-30 21:29:45 +00001171#ifdef __LIBPAYLOAD__
1172 msg_gerr("Error: No file I/O support in libpayload\n");
1173 return 1;
1174#else
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001175 unsigned long numbytes;
1176 FILE *image;
1177 struct stat image_stat;
1178
1179 if ((image = fopen(filename, "rb")) == NULL) {
Stefan Tauner363fd7e2013-04-07 13:08:30 +00001180 msg_gerr("Error: opening file \"%s\" failed: %s\n", filename, strerror(errno));
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001181 return 1;
1182 }
1183 if (fstat(fileno(image), &image_stat) != 0) {
Stefan Tauner363fd7e2013-04-07 13:08:30 +00001184 msg_gerr("Error: getting metadata of file \"%s\" failed: %s\n", filename, strerror(errno));
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001185 fclose(image);
1186 return 1;
1187 }
1188 if (image_stat.st_size != size) {
Carl-Daniel Hailfinger11990da2013-07-13 23:21:05 +00001189 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 +00001190 (intmax_t)image_stat.st_size, size);
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001191 fclose(image);
1192 return 1;
1193 }
1194 numbytes = fread(buf, 1, size, image);
1195 if (fclose(image)) {
Stefan Tauner363fd7e2013-04-07 13:08:30 +00001196 msg_gerr("Error: closing file \"%s\" failed: %s\n", filename, strerror(errno));
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001197 return 1;
1198 }
1199 if (numbytes != size) {
1200 msg_gerr("Error: Failed to read complete file. Got %ld bytes, "
1201 "wanted %ld!\n", numbytes, size);
1202 return 1;
1203 }
1204 return 0;
Nico Huber7562f7d2013-08-30 21:29:45 +00001205#endif
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001206}
1207
Mark Marshallf20b7be2014-05-09 21:16:21 +00001208int write_buf_to_file(const unsigned char *buf, unsigned long size, const char *filename)
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001209{
Nico Huber7562f7d2013-08-30 21:29:45 +00001210#ifdef __LIBPAYLOAD__
1211 msg_gerr("Error: No file I/O support in libpayload\n");
1212 return 1;
1213#else
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001214 unsigned long numbytes;
1215 FILE *image;
Stephan Guilloux21dd55b2009-06-01 22:07:52 +00001216
1217 if (!filename) {
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001218 msg_gerr("No filename specified.\n");
Stephan Guilloux21dd55b2009-06-01 22:07:52 +00001219 return 1;
1220 }
Patrick Georgi0bf842d2010-01-25 22:55:33 +00001221 if ((image = fopen(filename, "wb")) == NULL) {
Stefan Tauner363fd7e2013-04-07 13:08:30 +00001222 msg_gerr("Error: opening file \"%s\" failed: %s\n", filename, strerror(errno));
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00001223 return 1;
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001224 }
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001225
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001226 numbytes = fwrite(buf, 1, size, image);
1227 fclose(image);
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001228 if (numbytes != size) {
1229 msg_gerr("File %s could not be written completely.\n",
1230 filename);
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001231 return 1;
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001232 }
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001233 return 0;
Nico Huber7562f7d2013-08-30 21:29:45 +00001234#endif
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001235}
1236
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001237int read_flash_to_file(struct flashctx *flash, const char *filename)
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001238{
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001239 unsigned long size = flash->chip->total_size * 1024;
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001240 unsigned char *buf = calloc(size, sizeof(char));
1241 int ret = 0;
1242
1243 msg_cinfo("Reading flash... ");
1244 if (!buf) {
1245 msg_gerr("Memory allocation failed!\n");
1246 msg_cinfo("FAILED.\n");
1247 return 1;
1248 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001249 if (!flash->chip->read) {
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001250 msg_cerr("No read function available for this flash chip.\n");
1251 ret = 1;
1252 goto out_free;
1253 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001254 if (flash->chip->read(flash, buf, 0, size)) {
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001255 msg_cerr("Read operation failed!\n");
1256 ret = 1;
1257 goto out_free;
1258 }
1259
Stefan Tauner355cbfd2011-05-28 02:37:14 +00001260 ret = write_buf_to_file(buf, size, filename);
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001261out_free:
1262 free(buf);
1263 msg_cinfo("%s.\n", ret ? "FAILED" : "done");
1264 return ret;
1265}
1266
Stefan Tauner96658be2014-05-26 22:05:31 +00001267/* Even if an error is found, the function will keep going and check the rest. */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001268static int selfcheck_eraseblocks(const struct flashchip *chip)
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001269{
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +00001270 int i, j, k;
1271 int ret = 0;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001272
1273 for (k = 0; k < NUM_ERASEFUNCTIONS; k++) {
1274 unsigned int done = 0;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001275 struct block_eraser eraser = chip->block_erasers[k];
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001276
1277 for (i = 0; i < NUM_ERASEREGIONS; i++) {
1278 /* Blocks with zero size are bugs in flashchips.c. */
1279 if (eraser.eraseblocks[i].count &&
1280 !eraser.eraseblocks[i].size) {
1281 msg_gerr("ERROR: Flash chip %s erase function "
1282 "%i region %i has size 0. Please report"
1283 " a bug at flashrom@flashrom.org\n",
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001284 chip->name, k, i);
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001285 ret = 1;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001286 }
1287 /* Blocks with zero count are bugs in flashchips.c. */
1288 if (!eraser.eraseblocks[i].count &&
1289 eraser.eraseblocks[i].size) {
1290 msg_gerr("ERROR: Flash chip %s erase function "
1291 "%i region %i has count 0. Please report"
1292 " a bug at flashrom@flashrom.org\n",
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001293 chip->name, k, i);
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001294 ret = 1;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001295 }
1296 done += eraser.eraseblocks[i].count *
1297 eraser.eraseblocks[i].size;
1298 }
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001299 /* Empty eraseblock definition with erase function. */
1300 if (!done && eraser.block_erase)
Sean Nelson316a29f2010-05-07 20:09:04 +00001301 msg_gspew("Strange: Empty eraseblock definition with "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001302 "non-empty erase function. Not an error.\n");
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001303 if (!done)
1304 continue;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001305 if (done != chip->total_size * 1024) {
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001306 msg_gerr("ERROR: Flash chip %s erase function %i "
1307 "region walking resulted in 0x%06x bytes total,"
1308 " expected 0x%06x bytes. Please report a bug at"
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001309 " flashrom@flashrom.org\n", chip->name, k,
1310 done, chip->total_size * 1024);
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001311 ret = 1;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001312 }
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001313 if (!eraser.block_erase)
1314 continue;
1315 /* Check if there are identical erase functions for different
1316 * layouts. That would imply "magic" erase functions. The
1317 * easiest way to check this is with function pointers.
1318 */
Uwe Hermann43959702010-03-13 17:28:29 +00001319 for (j = k + 1; j < NUM_ERASEFUNCTIONS; j++) {
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001320 if (eraser.block_erase ==
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001321 chip->block_erasers[j].block_erase) {
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001322 msg_gerr("ERROR: Flash chip %s erase function "
1323 "%i and %i are identical. Please report"
1324 " a bug at flashrom@flashrom.org\n",
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001325 chip->name, k, j);
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001326 ret = 1;
1327 }
Uwe Hermann43959702010-03-13 17:28:29 +00001328 }
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001329 }
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001330 return ret;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001331}
1332
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001333static int erase_and_write_block_helper(struct flashctx *flash,
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001334 unsigned int start, unsigned int len,
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001335 uint8_t *curcontents,
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001336 uint8_t *newcontents,
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001337 int (*erasefn) (struct flashctx *flash,
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001338 unsigned int addr,
1339 unsigned int len))
1340{
Stefan Taunerc69c9c82011-11-23 09:13:48 +00001341 unsigned int starthere = 0, lenhere = 0;
1342 int ret = 0, skip = 1, writecount = 0;
Stefan Tauner50d67aa2013-03-03 23:49:48 +00001343 enum write_granularity gran = flash->chip->gran;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001344
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001345 /* curcontents and newcontents are opaque to walk_eraseregions, and
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001346 * need to be adjusted here to keep the impression of proper abstraction
1347 */
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001348 curcontents += start;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001349 newcontents += start;
1350 msg_cdbg(":");
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001351 if (need_erase(curcontents, newcontents, len, gran)) {
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001352 msg_cdbg("E");
1353 ret = erasefn(flash, start, len);
1354 if (ret)
1355 return ret;
Carl-Daniel Hailfingerb4061f62011-06-26 17:04:16 +00001356 if (check_erased_range(flash, start, len)) {
1357 msg_cerr("ERASE FAILED!\n");
1358 return -1;
1359 }
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001360 /* Erase was successful. Adjust curcontents. */
1361 memset(curcontents, 0xff, len);
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001362 skip = 0;
1363 }
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001364 /* get_next_write() sets starthere to a new value after the call. */
1365 while ((lenhere = get_next_write(curcontents + starthere,
1366 newcontents + starthere,
1367 len - starthere, &starthere, gran))) {
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001368 if (!writecount++)
1369 msg_cdbg("W");
1370 /* Needs the partial write function signature. */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001371 ret = flash->chip->write(flash, newcontents + starthere,
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001372 start + starthere, lenhere);
1373 if (ret)
1374 return ret;
1375 starthere += lenhere;
1376 skip = 0;
1377 }
1378 if (skip)
1379 msg_cdbg("S");
Stefan Tauner682122b2013-06-23 22:15:39 +00001380 else
1381 all_skipped = false;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001382 return ret;
1383}
1384
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001385static int walk_eraseregions(struct flashctx *flash, int erasefunction,
1386 int (*do_something) (struct flashctx *flash,
Carl-Daniel Hailfinger4d3e9ca2010-07-13 00:42:00 +00001387 unsigned int addr,
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001388 unsigned int len,
1389 uint8_t *param1,
1390 uint8_t *param2,
1391 int (*erasefn) (
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001392 struct flashctx *flash,
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001393 unsigned int addr,
1394 unsigned int len)),
1395 void *param1, void *param2)
Carl-Daniel Hailfingera1223412010-07-13 00:37:19 +00001396{
1397 int i, j;
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +00001398 unsigned int start = 0;
1399 unsigned int len;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001400 struct block_eraser eraser = flash->chip->block_erasers[erasefunction];
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001401
Carl-Daniel Hailfingera1223412010-07-13 00:37:19 +00001402 for (i = 0; i < NUM_ERASEREGIONS; i++) {
1403 /* count==0 for all automatically initialized array
1404 * members so the loop below won't be executed for them.
1405 */
1406 len = eraser.eraseblocks[i].size;
1407 for (j = 0; j < eraser.eraseblocks[i].count; j++) {
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001408 /* Print this for every block except the first one. */
1409 if (i || j)
1410 msg_cdbg(", ");
1411 msg_cdbg("0x%06x-0x%06x", start,
Carl-Daniel Hailfingera1223412010-07-13 00:37:19 +00001412 start + len - 1);
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001413 if (do_something(flash, start, len, param1, param2,
1414 eraser.block_erase)) {
Carl-Daniel Hailfingera1223412010-07-13 00:37:19 +00001415 return 1;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001416 }
Carl-Daniel Hailfingera1223412010-07-13 00:37:19 +00001417 start += len;
1418 }
1419 }
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001420 msg_cdbg("\n");
Carl-Daniel Hailfingera1223412010-07-13 00:37:19 +00001421 return 0;
1422}
1423
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001424static int check_block_eraser(const struct flashctx *flash, int k, int log)
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001425{
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001426 struct block_eraser eraser = flash->chip->block_erasers[k];
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001427
1428 if (!eraser.block_erase && !eraser.eraseblocks[0].count) {
1429 if (log)
1430 msg_cdbg("not defined. ");
1431 return 1;
1432 }
1433 if (!eraser.block_erase && eraser.eraseblocks[0].count) {
1434 if (log)
1435 msg_cdbg("eraseblock layout is known, but matching "
Stefan Tauner355cbfd2011-05-28 02:37:14 +00001436 "block erase function is not implemented. ");
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001437 return 1;
1438 }
1439 if (eraser.block_erase && !eraser.eraseblocks[0].count) {
1440 if (log)
1441 msg_cdbg("block erase function found, but "
Stefan Tauner355cbfd2011-05-28 02:37:14 +00001442 "eraseblock layout is not defined. ");
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001443 return 1;
1444 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001445 // TODO: Once erase functions are annotated with allowed buses, check that as well.
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001446 return 0;
1447}
1448
Mark Marshallf20b7be2014-05-09 21:16:21 +00001449int erase_and_write_flash(struct flashctx *flash, uint8_t *oldcontents, uint8_t *newcontents)
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001450{
Carl-Daniel Hailfingerd8334db2011-07-21 21:21:04 +00001451 int k, ret = 1;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001452 uint8_t *curcontents;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001453 unsigned long size = flash->chip->total_size * 1024;
Sylvain "ythier" Hitier9db45512011-07-04 07:27:17 +00001454 unsigned int usable_erasefunctions = count_usable_erasers(flash);
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001455
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001456 msg_cinfo("Erasing and writing flash chip... ");
Stefan Tauner269de352011-07-12 22:35:21 +00001457 curcontents = malloc(size);
1458 if (!curcontents) {
1459 msg_gerr("Out of memory!\n");
1460 exit(1);
1461 }
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001462 /* Copy oldcontents to curcontents to avoid clobbering oldcontents. */
1463 memcpy(curcontents, oldcontents, size);
1464
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001465 for (k = 0; k < NUM_ERASEFUNCTIONS; k++) {
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001466 if (k != 0)
Stefan Tauner16878542014-07-13 23:53:40 +00001467 msg_cinfo("Looking for another erase function.\n");
Carl-Daniel Hailfingerd8334db2011-07-21 21:21:04 +00001468 if (!usable_erasefunctions) {
Stefan Tauner16878542014-07-13 23:53:40 +00001469 msg_cinfo("No usable erase functions left.\n");
Carl-Daniel Hailfingerd8334db2011-07-21 21:21:04 +00001470 break;
1471 }
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001472 msg_cdbg("Trying erase function %i... ", k);
1473 if (check_block_eraser(flash, k, 1))
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001474 continue;
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001475 usable_erasefunctions--;
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001476 ret = walk_eraseregions(flash, k, &erase_and_write_block_helper,
1477 curcontents, newcontents);
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001478 /* If everything is OK, don't try another erase function. */
1479 if (!ret)
1480 break;
Carl-Daniel Hailfingerb23b1eb2010-12-02 02:41:55 +00001481 /* Write/erase failed, so try to find out what the current chip
Carl-Daniel Hailfingerd8334db2011-07-21 21:21:04 +00001482 * contents are. If no usable erase functions remain, we can
1483 * skip this: the next iteration will break immediately anyway.
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001484 */
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001485 if (!usable_erasefunctions)
1486 continue;
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001487 /* Reading the whole chip may take a while, inform the user even
1488 * in non-verbose mode.
1489 */
1490 msg_cinfo("Reading current flash chip contents... ");
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001491 if (flash->chip->read(flash, curcontents, 0, size)) {
Carl-Daniel Hailfingerb23b1eb2010-12-02 02:41:55 +00001492 /* Now we are truly screwed. Read failed as well. */
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001493 msg_cerr("Can't read anymore! Aborting.\n");
Carl-Daniel Hailfingerb23b1eb2010-12-02 02:41:55 +00001494 /* We have no idea about the flash chip contents, so
1495 * retrying with another erase function is pointless.
1496 */
1497 break;
1498 }
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001499 msg_cinfo("done. ");
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001500 }
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001501 /* Free the scratchpad. */
1502 free(curcontents);
Carl-Daniel Hailfingerf160a122009-05-08 17:15:15 +00001503
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001504 if (ret) {
Sean Nelson316a29f2010-05-07 20:09:04 +00001505 msg_cerr("FAILED!\n");
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001506 } else {
Stefan Tauner682122b2013-06-23 22:15:39 +00001507 if (all_skipped)
1508 msg_cinfo("\nWarning: Chip content is identical to the requested image.\n");
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001509 msg_cinfo("Erase/write done.\n");
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001510 }
1511 return ret;
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001512}
1513
Stefan Tauner136388f2013-07-15 10:47:53 +00001514static void nonfatal_help_message(void)
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001515{
Stefan Taunera58f6e92014-05-10 09:25:44 +00001516 msg_gerr("Good, writing to the flash chip apparently didn't do anything.\n");
Stefan Tauner136388f2013-07-15 10:47:53 +00001517#if CONFIG_INTERNAL == 1
1518 if (programmer == PROGRAMMER_INTERNAL)
1519 msg_gerr("This means we have to add special support for your board, programmer or flash\n"
1520 "chip. Please report this on IRC at chat.freenode.net (channel #flashrom) or\n"
1521 "mail flashrom@flashrom.org, thanks!\n"
1522 "-------------------------------------------------------------------------------\n"
1523 "You may now reboot or simply leave the machine running.\n");
1524 else
1525#endif
1526 msg_gerr("Please check the connections (especially those to write protection pins) between\n"
1527 "the programmer and the flash chip. If you think the error is caused by flashrom\n"
1528 "please report this on IRC at chat.freenode.net (channel #flashrom) or\n"
1529 "mail flashrom@flashrom.org, thanks!\n");
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001530}
1531
Stefan Tauner136388f2013-07-15 10:47:53 +00001532static void emergency_help_message(void)
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00001533{
Stefan Tauner136388f2013-07-15 10:47:53 +00001534 msg_gerr("Your flash chip is in an unknown state.\n");
1535#if CONFIG_INTERNAL == 1
1536 if (programmer == PROGRAMMER_INTERNAL)
1537 msg_gerr("Get help on IRC at chat.freenode.net (channel #flashrom) or\n"
1538 "mail flashrom@flashrom.org with the subject \"FAILED: <your board name>\"!\n"
1539 "-------------------------------------------------------------------------------\n"
1540 "DO NOT REBOOT OR POWEROFF!\n");
1541 else
1542#endif
1543 msg_gerr("Please report this on IRC at chat.freenode.net (channel #flashrom) or\n"
1544 "mail flashrom@flashrom.org, thanks!\n");
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00001545}
1546
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001547/* The way to go if you want a delimited list of programmers */
Stefan Tauner66652442011-06-26 17:38:17 +00001548void list_programmers(const char *delim)
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001549{
1550 enum programmer p;
1551 for (p = 0; p < PROGRAMMER_INVALID; p++) {
Sean Nelson316a29f2010-05-07 20:09:04 +00001552 msg_ginfo("%s", programmer_table[p].name);
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001553 if (p < PROGRAMMER_INVALID - 1)
Sean Nelson316a29f2010-05-07 20:09:04 +00001554 msg_ginfo("%s", delim);
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001555 }
Sean Nelson316a29f2010-05-07 20:09:04 +00001556 msg_ginfo("\n");
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001557}
1558
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001559void list_programmers_linebreak(int startcol, int cols, int paren)
1560{
1561 const char *pname;
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +00001562 int pnamelen;
1563 int remaining = 0, firstline = 1;
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001564 enum programmer p;
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +00001565 int i;
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001566
1567 for (p = 0; p < PROGRAMMER_INVALID; p++) {
1568 pname = programmer_table[p].name;
1569 pnamelen = strlen(pname);
1570 if (remaining - pnamelen - 2 < 0) {
1571 if (firstline)
1572 firstline = 0;
1573 else
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001574 msg_ginfo("\n");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001575 for (i = 0; i < startcol; i++)
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001576 msg_ginfo(" ");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001577 remaining = cols - startcol;
1578 } else {
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001579 msg_ginfo(" ");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001580 remaining--;
1581 }
1582 if (paren && (p == 0)) {
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001583 msg_ginfo("(");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001584 remaining--;
1585 }
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001586 msg_ginfo("%s", pname);
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001587 remaining -= pnamelen;
1588 if (p < PROGRAMMER_INVALID - 1) {
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001589 msg_ginfo(",");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001590 remaining--;
1591 } else {
1592 if (paren)
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001593 msg_ginfo(")");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001594 }
1595 }
1596}
1597
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001598void print_sysinfo(void)
1599{
Carl-Daniel Hailfinger60d9bd22012-08-09 23:34:41 +00001600#ifdef _WIN32
1601 SYSTEM_INFO si;
1602 OSVERSIONINFOEX osvi;
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001603
Carl-Daniel Hailfinger60d9bd22012-08-09 23:34:41 +00001604 memset(&si, 0, sizeof(SYSTEM_INFO));
1605 memset(&osvi, 0, sizeof(OSVERSIONINFOEX));
1606 msg_ginfo(" on Windows");
1607 /* Tell Windows which version of the structure we want. */
1608 osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
1609 if (GetVersionEx((OSVERSIONINFO*) &osvi))
1610 msg_ginfo(" %lu.%lu", osvi.dwMajorVersion, osvi.dwMinorVersion);
1611 else
1612 msg_ginfo(" unknown version");
1613 GetSystemInfo(&si);
1614 switch (si.wProcessorArchitecture) {
1615 case PROCESSOR_ARCHITECTURE_AMD64:
1616 msg_ginfo(" (x86_64)");
1617 break;
1618 case PROCESSOR_ARCHITECTURE_INTEL:
1619 msg_ginfo(" (x86)");
1620 break;
1621 default:
1622 msg_ginfo(" (unknown arch)");
1623 break;
1624 }
1625#elif HAVE_UTSNAME == 1
1626 struct utsname osinfo;
1627
1628 uname(&osinfo);
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001629 msg_ginfo(" on %s %s (%s)", osinfo.sysname, osinfo.release,
1630 osinfo.machine);
1631#else
1632 msg_ginfo(" on unknown machine");
1633#endif
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001634}
1635
1636void print_buildinfo(void)
1637{
1638 msg_gdbg("flashrom was built with");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001639#if NEED_PCI == 1
1640#ifdef PCILIB_VERSION
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001641 msg_gdbg(" libpci %s,", PCILIB_VERSION);
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001642#else
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001643 msg_gdbg(" unknown PCI library,");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001644#endif
1645#endif
1646#ifdef __clang__
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001647 msg_gdbg(" LLVM Clang");
Carl-Daniel Hailfingerb51e58e2010-07-17 14:49:30 +00001648#ifdef __clang_version__
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001649 msg_gdbg(" %s,", __clang_version__);
Carl-Daniel Hailfingerb51e58e2010-07-17 14:49:30 +00001650#else
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001651 msg_gdbg(" unknown version (before r102686),");
Carl-Daniel Hailfingerb51e58e2010-07-17 14:49:30 +00001652#endif
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001653#elif defined(__GNUC__)
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001654 msg_gdbg(" GCC");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001655#ifdef __VERSION__
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001656 msg_gdbg(" %s,", __VERSION__);
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001657#else
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001658 msg_gdbg(" unknown version,");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001659#endif
1660#else
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001661 msg_gdbg(" unknown compiler,");
Carl-Daniel Hailfingercceafa22010-05-26 01:45:41 +00001662#endif
1663#if defined (__FLASHROM_LITTLE_ENDIAN__)
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001664 msg_gdbg(" little endian");
Carl-Daniel Hailfinger06b9efa2012-08-07 11:59:59 +00001665#elif defined (__FLASHROM_BIG_ENDIAN__)
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001666 msg_gdbg(" big endian");
Carl-Daniel Hailfinger06b9efa2012-08-07 11:59:59 +00001667#else
1668#error Endianness could not be determined
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001669#endif
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001670 msg_gdbg("\n");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001671}
1672
Bernhard Walle201bde32008-01-21 15:24:22 +00001673void print_version(void)
1674{
Carl-Daniel Hailfinger8841d3e2010-05-15 15:04:37 +00001675 msg_ginfo("flashrom v%s", flashrom_version);
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001676 print_sysinfo();
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001677 msg_ginfo("\n");
Bernhard Walle201bde32008-01-21 15:24:22 +00001678}
1679
Carl-Daniel Hailfinger8841d3e2010-05-15 15:04:37 +00001680void print_banner(void)
1681{
1682 msg_ginfo("flashrom is free software, get the source code at "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001683 "http://www.flashrom.org\n");
Carl-Daniel Hailfinger8841d3e2010-05-15 15:04:37 +00001684 msg_ginfo("\n");
1685}
1686
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001687int selfcheck(void)
1688{
Stefan Tauner96658be2014-05-26 22:05:31 +00001689 unsigned int i;
Stefan Taunera6d96482012-12-26 19:51:23 +00001690 int ret = 0;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001691
1692 /* Safety check. Instead of aborting after the first error, check
1693 * if more errors exist.
1694 */
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001695 if (ARRAY_SIZE(programmer_table) - 1 != PROGRAMMER_INVALID) {
Sean Nelson316a29f2010-05-07 20:09:04 +00001696 msg_gerr("Programmer table miscompilation!\n");
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001697 ret = 1;
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001698 }
Stefan Taunera6d96482012-12-26 19:51:23 +00001699 for (i = 0; i < PROGRAMMER_INVALID; i++) {
1700 const struct programmer_entry p = programmer_table[i];
1701 if (p.name == NULL) {
1702 msg_gerr("All programmers need a valid name, but the one with index %d does not!\n", i);
1703 ret = 1;
1704 /* This might hide other problems with this programmer, but allows for better error
1705 * messages below without jumping through hoops. */
1706 continue;
1707 }
Stefan Tauneraf358d62012-12-27 18:40:26 +00001708 switch (p.type) {
1709 case USB:
1710 case PCI:
1711 case OTHER:
1712 if (p.devs.note == NULL) {
1713 if (strcmp("internal", p.name) == 0)
1714 break; /* This one has its device list stored separately. */
1715 msg_gerr("Programmer %s has neither a device list nor a textual description!\n",
1716 p.name);
1717 ret = 1;
1718 }
1719 break;
1720 default:
1721 msg_gerr("Programmer %s does not have a valid type set!\n", p.name);
1722 ret = 1;
1723 break;
1724 }
Stefan Taunera6d96482012-12-26 19:51:23 +00001725 if (p.init == NULL) {
1726 msg_gerr("Programmer %s does not have a valid init function!\n", p.name);
1727 ret = 1;
1728 }
1729 if (p.delay == NULL) {
1730 msg_gerr("Programmer %s does not have a valid delay function!\n", p.name);
1731 ret = 1;
1732 }
1733 if (p.map_flash_region == NULL) {
1734 msg_gerr("Programmer %s does not have a valid map_flash_region function!\n", p.name);
1735 ret = 1;
1736 }
1737 if (p.unmap_flash_region == NULL) {
1738 msg_gerr("Programmer %s does not have a valid unmap_flash_region function!\n", p.name);
1739 ret = 1;
1740 }
1741 }
Stefan Tauner96658be2014-05-26 22:05:31 +00001742
1743 /* It would be favorable if we could check for the correct layout (especially termination) of various
1744 * constant arrays: flashchips, chipset_enables, board_matches, boards_known, laptops_known.
1745 * They are all defined as externs in this compilation unit so we don't know their sizes which vary
1746 * depending on compiler flags, e.g. the target architecture, and can sometimes be 0.
1747 * For 'flashchips' we export the size explicitly to work around this and to be able to implement the
1748 * checks below. */
Stefan Tauner6697f712014-08-06 15:09:15 +00001749 if (flashchips_size <= 1 || flashchips[flashchips_size - 1].name != NULL) {
Stefan Tauner7bcacb12011-05-26 01:35:19 +00001750 msg_gerr("Flashchips table miscompilation!\n");
1751 ret = 1;
Stefan Tauner96658be2014-05-26 22:05:31 +00001752 } else {
1753 for (i = 0; i < flashchips_size - 1; i++) {
1754 const struct flashchip *chip = &flashchips[i];
1755 if (chip->vendor == NULL || chip->name == NULL || chip->bustype == BUS_NONE) {
1756 ret = 1;
1757 msg_gerr("ERROR: Some field of flash chip #%d (%s) is misconfigured.\n"
1758 "Please report a bug at flashrom@flashrom.org\n", i,
1759 chip->name == NULL ? "unnamed" : chip->name);
1760 }
1761 if (selfcheck_eraseblocks(chip)) {
1762 ret = 1;
1763 }
1764 }
Stefan Tauner7bcacb12011-05-26 01:35:19 +00001765 }
Stefan Tauner7bcacb12011-05-26 01:35:19 +00001766
Stefan Tauner600576b2014-06-12 22:57:36 +00001767#if CONFIG_INTERNAL == 1
1768 ret |= selfcheck_board_enables();
1769#endif
1770
Stefan Tauner96658be2014-05-26 22:05:31 +00001771 /* TODO: implement similar sanity checks for other arrays where deemed necessary. */
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001772 return ret;
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001773}
1774
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001775/* FIXME: This function signature needs to be improved once doit() has a better
1776 * function signature.
1777 */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001778int chip_safety_check(const struct flashctx *flash, int force, int read_it, int write_it, int erase_it,
1779 int verify_it)
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001780{
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001781 const struct flashchip *chip = flash->chip;
1782
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001783 if (!programmer_may_write && (write_it || erase_it)) {
1784 msg_perr("Write/erase is not working yet on your programmer in "
1785 "its current configuration.\n");
1786 /* --force is the wrong approach, but it's the best we can do
1787 * until the generic programmer parameter parser is merged.
1788 */
1789 if (!force)
1790 return 1;
1791 msg_cerr("Continuing anyway.\n");
1792 }
1793
1794 if (read_it || erase_it || write_it || verify_it) {
1795 /* Everything needs read. */
Stefan Tauner6455dff2014-05-26 00:36:24 +00001796 if (chip->tested.read == BAD) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001797 msg_cerr("Read is not working on this chip. ");
1798 if (!force)
1799 return 1;
1800 msg_cerr("Continuing anyway.\n");
1801 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001802 if (!chip->read) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001803 msg_cerr("flashrom has no read function for this "
1804 "flash chip.\n");
1805 return 1;
1806 }
1807 }
1808 if (erase_it || write_it) {
1809 /* Write needs erase. */
Stefan Tauner6455dff2014-05-26 00:36:24 +00001810 if (chip->tested.erase == NA) {
1811 msg_cerr("Erase is not possible on this chip.\n");
1812 return 1;
1813 }
1814 if (chip->tested.erase == BAD) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001815 msg_cerr("Erase is not working on this chip. ");
1816 if (!force)
1817 return 1;
1818 msg_cerr("Continuing anyway.\n");
1819 }
Sylvain "ythier" Hitier9db45512011-07-04 07:27:17 +00001820 if(count_usable_erasers(flash) == 0) {
Stefan Tauner5368dca2011-07-01 00:19:12 +00001821 msg_cerr("flashrom has no erase function for this "
1822 "flash chip.\n");
1823 return 1;
1824 }
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001825 }
1826 if (write_it) {
Stefan Tauner6455dff2014-05-26 00:36:24 +00001827 if (chip->tested.write == NA) {
1828 msg_cerr("Write is not possible on this chip.\n");
1829 return 1;
1830 }
1831 if (chip->tested.write == BAD) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001832 msg_cerr("Write is not working on this chip. ");
1833 if (!force)
1834 return 1;
1835 msg_cerr("Continuing anyway.\n");
1836 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001837 if (!chip->write) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001838 msg_cerr("flashrom has no write function for this "
1839 "flash chip.\n");
1840 return 1;
1841 }
1842 }
1843 return 0;
1844}
1845
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001846/* This function signature is horrible. We need to design a better interface,
1847 * but right now it allows us to split off the CLI code.
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00001848 * Besides that, the function itself is a textbook example of abysmal code flow.
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001849 */
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +00001850int doit(struct flashctx *flash, int force, const char *filename, int read_it,
1851 int write_it, int erase_it, int verify_it)
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001852{
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001853 uint8_t *oldcontents;
1854 uint8_t *newcontents;
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001855 int ret = 0;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001856 unsigned long size = flash->chip->total_size * 1024;
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001857
David Hendricks77f931a2011-05-18 01:30:56 +00001858 if (chip_safety_check(flash, force, read_it, write_it, erase_it, verify_it)) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001859 msg_cerr("Aborting.\n");
Stefan Tauner20da4aa2014-05-07 22:07:23 +00001860 return 1;
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001861 }
1862
Stefan Tauner8268fdb2013-09-23 14:21:06 +00001863 if (normalize_romentries(flash)) {
1864 msg_cerr("Requested regions can not be handled. Aborting.\n");
Stefan Tauner20da4aa2014-05-07 22:07:23 +00001865 return 1;
Stefan Tauner8268fdb2013-09-23 14:21:06 +00001866 }
1867
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001868 /* Given the existence of read locks, we want to unlock for read,
1869 * erase and write.
1870 */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001871 if (flash->chip->unlock)
1872 flash->chip->unlock(flash);
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001873
1874 if (read_it) {
Stefan Tauner20da4aa2014-05-07 22:07:23 +00001875 return read_flash_to_file(flash, filename);
Carl-Daniel Hailfingerd1be52d2010-07-03 12:14:25 +00001876 }
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001877
Stefan Tauner269de352011-07-12 22:35:21 +00001878 oldcontents = malloc(size);
1879 if (!oldcontents) {
1880 msg_gerr("Out of memory!\n");
1881 exit(1);
1882 }
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001883 /* Assume worst case: All bits are 0. */
1884 memset(oldcontents, 0x00, size);
Stefan Tauner269de352011-07-12 22:35:21 +00001885 newcontents = malloc(size);
1886 if (!newcontents) {
1887 msg_gerr("Out of memory!\n");
1888 exit(1);
1889 }
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001890 /* Assume best case: All bits should be 1. */
1891 memset(newcontents, 0xff, size);
1892 /* Side effect of the assumptions above: Default write action is erase
1893 * because newcontents looks like a completely erased chip, and
1894 * oldcontents being completely 0x00 means we have to erase everything
1895 * before we can write.
1896 */
1897
Ollie Lhoefa28582004-12-08 20:10:01 +00001898 if (erase_it) {
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001899 /* FIXME: Do we really want the scary warning if erase failed?
1900 * After all, after erase the chip is either blank or partially
1901 * blank or it has the old contents. A blank chip won't boot,
1902 * so if the user wanted erase and reboots afterwards, the user
1903 * knows very well that booting won't work.
1904 */
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001905 if (erase_and_write_flash(flash, oldcontents, newcontents)) {
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00001906 emergency_help_message();
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001907 ret = 1;
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00001908 }
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001909 goto out;
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00001910 }
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001911
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00001912 if (write_it || verify_it) {
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001913 if (read_buf_from_file(newcontents, size, filename)) {
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001914 ret = 1;
1915 goto out;
Stefan Reinauer018aca82006-11-21 23:48:51 +00001916 }
1917
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +00001918#if CONFIG_INTERNAL == 1
Stefan Taunerb4e06bd2012-08-20 00:24:22 +00001919 if (programmer == PROGRAMMER_INTERNAL && cb_check_image(newcontents, size) < 0) {
1920 if (force_boardmismatch) {
1921 msg_pinfo("Proceeding anyway because user forced us to.\n");
1922 } else {
1923 msg_perr("Aborting. You can override this with "
1924 "-p internal:boardmismatch=force.\n");
Niklas Söderlund9e423762012-06-16 00:11:16 +00001925 ret = 1;
1926 goto out;
1927 }
Stefan Taunerb4e06bd2012-08-20 00:24:22 +00001928 }
Carl-Daniel Hailfinger66ef4e52009-12-13 22:28:00 +00001929#endif
Ollie Lhocbbf1252004-03-17 22:22:08 +00001930 }
1931
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001932 /* Read the whole chip to be able to check whether regions need to be
1933 * erased and to give better diagnostics in case write fails.
1934 * The alternative would be to read only the regions which are to be
1935 * preserved, but in that case we might perform unneeded erase which
1936 * takes time as well.
1937 */
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001938 msg_cinfo("Reading old flash chip contents... ");
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001939 if (flash->chip->read(flash, oldcontents, 0, size)) {
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001940 ret = 1;
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001941 msg_cinfo("FAILED.\n");
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001942 goto out;
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001943 }
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001944 msg_cinfo("done.\n");
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001945
Stefan Tauner8268fdb2013-09-23 14:21:06 +00001946 /* Build a new image taking the given layout into account. */
1947 build_new_image(flash, oldcontents, newcontents);
Uwe Hermanna7e05482007-05-09 10:17:44 +00001948
Ollie Lho184a4042005-11-26 21:55:36 +00001949 // ////////////////////////////////////////////////////////////
Uwe Hermanna7e05482007-05-09 10:17:44 +00001950
Peter Stugef31104c2008-04-28 14:47:30 +00001951 if (write_it) {
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001952 if (erase_and_write_flash(flash, oldcontents, newcontents)) {
Stefan Taunera58f6e92014-05-10 09:25:44 +00001953 msg_cerr("Uh oh. Erase/write failed. Checking if anything has changed.\n");
1954 msg_cinfo("Reading current flash chip contents... ");
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001955 if (!flash->chip->read(flash, newcontents, 0, size)) {
Stefan Taunera58f6e92014-05-10 09:25:44 +00001956 msg_cinfo("done.\n");
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001957 if (!memcmp(oldcontents, newcontents, size)) {
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001958 nonfatal_help_message();
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001959 ret = 1;
1960 goto out;
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001961 }
Stefan Taunera58f6e92014-05-10 09:25:44 +00001962 msg_cerr("Apparently at least some data has changed.\n");
1963 } else
1964 msg_cerr("Can't even read anymore!\n");
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00001965 emergency_help_message();
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001966 ret = 1;
1967 goto out;
Peter Stugef31104c2008-04-28 14:47:30 +00001968 }
Peter Stugef31104c2008-04-28 14:47:30 +00001969 }
Ollie Lho184a4042005-11-26 21:55:36 +00001970
Stefan Taunerc4f44df2013-08-12 22:58:43 +00001971 /* Verify only if we either did not try to write (verify operation) or actually changed something. */
1972 if (verify_it && (!write_it || !all_skipped)) {
Stefan Tauner78ffbea2012-10-27 15:36:56 +00001973 msg_cinfo("Verifying flash... ");
1974
1975 if (write_it) {
1976 /* Work around chips which need some time to calm down. */
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00001977 programmer_delay(1000*1000);
Stefan Tauner78ffbea2012-10-27 15:36:56 +00001978 ret = verify_range(flash, newcontents, 0, size);
1979 /* If we tried to write, and verification now fails, we
1980 * might have an emergency situation.
1981 */
1982 if (ret)
1983 emergency_help_message();
1984 } else {
1985 ret = compare_range(newcontents, oldcontents, 0, size);
1986 }
1987 if (!ret)
1988 msg_cinfo("VERIFIED.\n");
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00001989 }
Ollie Lho184a4042005-11-26 21:55:36 +00001990
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001991out:
1992 free(oldcontents);
1993 free(newcontents);
Stefan Reinauer143da0b2006-01-04 16:42:57 +00001994 return ret;
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001995}