blob: 9b82d4c657e96cf0f0ae6de78a1070960498729b [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
Stefan Tauner2a1ed772014-08-31 00:09:21 +0000376int shutdown_free(void *data)
377{
378 free(data);
379 return 0;
380}
381
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000382/* Register a function to be executed on programmer shutdown.
383 * The advantage over atexit() is that you can supply a void pointer which will
384 * be used as parameter to the registered function upon programmer shutdown.
385 * This pointer can point to arbitrary data used by said function, e.g. undo
386 * information for GPIO settings etc. If unneeded, set data=NULL.
387 * Please note that the first (void *data) belongs to the function signature of
388 * the function passed as first parameter.
389 */
David Hendricks8bb20212011-06-14 01:35:36 +0000390int register_shutdown(int (*function) (void *data), void *data)
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000391{
392 if (shutdown_fn_count >= SHUTDOWN_MAXFN) {
Carl-Daniel Hailfinger9f5f2152010-06-04 23:20:21 +0000393 msg_perr("Tried to register more than %i shutdown functions.\n",
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000394 SHUTDOWN_MAXFN);
395 return 1;
396 }
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000397 if (!may_register_shutdown) {
398 msg_perr("Tried to register a shutdown function before "
399 "programmer init.\n");
400 return 1;
401 }
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000402 shutdown_fn[shutdown_fn_count].func = function;
403 shutdown_fn[shutdown_fn_count].data = data;
404 shutdown_fn_count++;
405
406 return 0;
407}
408
Nico Huberbcb2e5a2012-12-30 01:23:17 +0000409int programmer_init(enum programmer prog, const char *param)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000410{
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000411 int ret;
Carl-Daniel Hailfinger2e681602011-09-08 00:00:29 +0000412
413 if (prog >= PROGRAMMER_INVALID) {
414 msg_perr("Invalid programmer specified!\n");
415 return -1;
416 }
417 programmer = prog;
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000418 /* Initialize all programmer specific data. */
419 /* Default to unlimited decode sizes. */
420 max_rom_decode = (const struct decode_sizes) {
421 .parallel = 0xffffffff,
422 .lpc = 0xffffffff,
423 .fwh = 0xffffffff,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000424 .spi = 0xffffffff,
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000425 };
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000426 /* Default to top aligned flash at 4 GB. */
427 flashbase = 0;
428 /* Registering shutdown functions is now allowed. */
429 may_register_shutdown = 1;
Carl-Daniel Hailfingerd1be52d2010-07-03 12:14:25 +0000430 /* Default to allowing writes. Broken programmers set this to 0. */
431 programmer_may_write = 1;
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000432
433 programmer_param = param;
Carl-Daniel Hailfinger20a36ba2013-08-13 07:09:57 +0000434 msg_pdbg("Initializing %s programmer\n", programmer_table[programmer].name);
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000435 ret = programmer_table[programmer].init();
436 if (programmer_param && strlen(programmer_param)) {
Carl-Daniel Hailfinger20a36ba2013-08-13 07:09:57 +0000437 if (ret != 0) {
438 /* It is quite possible that any unhandled programmer parameter would have been valid,
439 * but an error in actual programmer init happened before the parameter was evaluated.
440 */
441 msg_pwarn("Unhandled programmer parameters (possibly due to another failure): %s\n",
442 programmer_param);
443 } else {
444 /* Actual programmer init was successful, but the user specified an invalid or unusable
445 * (for the current programmer configuration) parameter.
446 */
447 msg_perr("Unhandled programmer parameters: %s\n", programmer_param);
448 msg_perr("Aborting.\n");
449 ret = ERROR_FATAL;
450 }
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000451 }
452 return ret;
Uwe Hermann09e04f72009-05-16 22:36:00 +0000453}
454
Stefan Tauner20da4aa2014-05-07 22:07:23 +0000455/** Calls registered shutdown functions and resets internal programmer-related variables.
456 * Calling it is safe even without previous initialization, but further interactions with programmer support
457 * require a call to programmer_init() (afterwards).
458 *
459 * @return The OR-ed result values of all shutdown functions (i.e. 0 on success). */
Uwe Hermann09e04f72009-05-16 22:36:00 +0000460int programmer_shutdown(void)
461{
David Hendricks8bb20212011-06-14 01:35:36 +0000462 int ret = 0;
463
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000464 /* Registering shutdown functions is no longer allowed. */
465 may_register_shutdown = 0;
466 while (shutdown_fn_count > 0) {
467 int i = --shutdown_fn_count;
David Hendricks8bb20212011-06-14 01:35:36 +0000468 ret |= shutdown_fn[i].func(shutdown_fn[i].data);
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000469 }
Stefan Taunere34e3e82013-01-01 00:06:51 +0000470
Stefan Taunerb8911d62012-12-26 07:55:00 +0000471 programmer_param = NULL;
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000472 registered_master_count = 0;
Stefan Taunere34e3e82013-01-01 00:06:51 +0000473
David Hendricks8bb20212011-06-14 01:35:36 +0000474 return ret;
Uwe Hermann09e04f72009-05-16 22:36:00 +0000475}
476
Stefan Tauner305e0b92013-07-17 23:46:44 +0000477void *programmer_map_flash_region(const char *descr, uintptr_t phys_addr, size_t len)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000478{
Stefan Tauner26e7a152013-09-13 17:21:05 +0000479 void *ret = programmer_table[programmer].map_flash_region(descr, phys_addr, len);
480 msg_gspew("%s: mapping %s from 0x%0*" PRIxPTR " to 0x%0*" PRIxPTR "\n",
481 __func__, descr, PRIxPTR_WIDTH, phys_addr, PRIxPTR_WIDTH, (uintptr_t) ret);
482 return ret;
Uwe Hermann09e04f72009-05-16 22:36:00 +0000483}
484
485void programmer_unmap_flash_region(void *virt_addr, size_t len)
486{
487 programmer_table[programmer].unmap_flash_region(virt_addr, len);
Stefan Tauner4e32ec12014-08-30 23:39:51 +0000488 msg_gspew("%s: unmapped 0x%0*" PRIxPTR "\n", __func__, PRIxPTR_WIDTH, (uintptr_t)virt_addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000489}
490
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000491void chip_writeb(const struct flashctx *flash, uint8_t val, chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000492{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000493 flash->mst->par.chip_writeb(flash, val, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000494}
495
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000496void chip_writew(const struct flashctx *flash, uint16_t val, chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000497{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000498 flash->mst->par.chip_writew(flash, val, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000499}
500
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000501void chip_writel(const struct flashctx *flash, uint32_t val, chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000502{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000503 flash->mst->par.chip_writel(flash, val, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000504}
505
Mark Marshallf20b7be2014-05-09 21:16:21 +0000506void chip_writen(const struct flashctx *flash, const uint8_t *buf, chipaddr addr, size_t len)
Carl-Daniel Hailfinger0bd2a2b2009-06-05 18:32:07 +0000507{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000508 flash->mst->par.chip_writen(flash, buf, addr, len);
Carl-Daniel Hailfinger0bd2a2b2009-06-05 18:32:07 +0000509}
510
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000511uint8_t chip_readb(const struct flashctx *flash, const chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000512{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000513 return flash->mst->par.chip_readb(flash, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000514}
515
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000516uint16_t chip_readw(const struct flashctx *flash, const chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000517{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000518 return flash->mst->par.chip_readw(flash, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000519}
520
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000521uint32_t chip_readl(const struct flashctx *flash, const chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000522{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000523 return flash->mst->par.chip_readl(flash, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000524}
525
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000526void chip_readn(const struct flashctx *flash, uint8_t *buf, chipaddr addr,
527 size_t len)
Carl-Daniel Hailfinger0bd2a2b2009-06-05 18:32:07 +0000528{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000529 flash->mst->par.chip_readn(flash, buf, addr, len);
Carl-Daniel Hailfinger0bd2a2b2009-06-05 18:32:07 +0000530}
531
Stefan Taunerf80419c2014-05-02 15:41:42 +0000532void programmer_delay(unsigned int usecs)
Carl-Daniel Hailfingerca8bfc62009-06-05 17:48:08 +0000533{
Urja Rannikko8d7ec2a2013-10-21 21:49:08 +0000534 if (usecs > 0)
535 programmer_table[programmer].delay(usecs);
Carl-Daniel Hailfingerca8bfc62009-06-05 17:48:08 +0000536}
537
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000538int read_memmapped(struct flashctx *flash, uint8_t *buf, unsigned int start,
539 int unsigned len)
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000540{
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000541 chip_readn(flash, buf, flash->virtual_memory + start, len);
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000542
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000543 return 0;
544}
545
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000546/* This is a somewhat hacked function similar in some ways to strtok().
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000547 * It will look for needle with a subsequent '=' in haystack, return a copy of
548 * needle and remove everything from the first occurrence of needle to the next
549 * delimiter from haystack.
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000550 */
Nico Huberbcb2e5a2012-12-30 01:23:17 +0000551char *extract_param(const char *const *haystack, const char *needle, const char *delim)
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000552{
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000553 char *param_pos, *opt_pos, *rest;
554 char *opt = NULL;
555 int optlen;
Carl-Daniel Hailfinger27023762010-04-28 15:22:14 +0000556 int needlelen;
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000557
Carl-Daniel Hailfinger27023762010-04-28 15:22:14 +0000558 needlelen = strlen(needle);
559 if (!needlelen) {
560 msg_gerr("%s: empty needle! Please report a bug at "
561 "flashrom@flashrom.org\n", __func__);
562 return NULL;
563 }
564 /* No programmer parameters given. */
565 if (*haystack == NULL)
566 return NULL;
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000567 param_pos = strstr(*haystack, needle);
568 do {
569 if (!param_pos)
570 return NULL;
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000571 /* Needle followed by '='? */
572 if (param_pos[needlelen] == '=') {
573
574 /* Beginning of the string? */
575 if (param_pos == *haystack)
576 break;
577 /* After a delimiter? */
578 if (strchr(delim, *(param_pos - 1)))
579 break;
580 }
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000581 /* Continue searching. */
582 param_pos++;
583 param_pos = strstr(param_pos, needle);
584 } while (1);
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000585
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000586 if (param_pos) {
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000587 /* Get the string after needle and '='. */
588 opt_pos = param_pos + needlelen + 1;
589 optlen = strcspn(opt_pos, delim);
590 /* Return an empty string if the parameter was empty. */
591 opt = malloc(optlen + 1);
592 if (!opt) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000593 msg_gerr("Out of memory!\n");
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000594 exit(1);
595 }
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000596 strncpy(opt, opt_pos, optlen);
597 opt[optlen] = '\0';
598 rest = opt_pos + optlen;
599 /* Skip all delimiters after the current parameter. */
600 rest += strspn(rest, delim);
601 memmove(param_pos, rest, strlen(rest) + 1);
602 /* We could shrink haystack, but the effort is not worth it. */
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000603 }
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000604
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000605 return opt;
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000606}
607
Stefan Tauner66652442011-06-26 17:38:17 +0000608char *extract_programmer_param(const char *param_name)
Carl-Daniel Hailfinger2b6dcb32010-07-08 10:13:37 +0000609{
610 return extract_param(&programmer_param, param_name, ",");
611}
612
Sylvain "ythier" Hitier9db45512011-07-04 07:27:17 +0000613/* Returns the number of well-defined erasers for a chip. */
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +0000614static unsigned int count_usable_erasers(const struct flashctx *flash)
Stefan Tauner5368dca2011-07-01 00:19:12 +0000615{
616 unsigned int usable_erasefunctions = 0;
617 int k;
618 for (k = 0; k < NUM_ERASEFUNCTIONS; k++) {
619 if (!check_block_eraser(flash, k, 0))
620 usable_erasefunctions++;
621 }
622 return usable_erasefunctions;
623}
624
Mark Marshallf20b7be2014-05-09 21:16:21 +0000625static int compare_range(const uint8_t *wantbuf, const uint8_t *havebuf, unsigned int start, unsigned int len)
Stefan Tauner78ffbea2012-10-27 15:36:56 +0000626{
627 int ret = 0, failcount = 0;
628 unsigned int i;
629 for (i = 0; i < len; i++) {
630 if (wantbuf[i] != havebuf[i]) {
631 /* Only print the first failure. */
632 if (!failcount++)
633 msg_cerr("FAILED at 0x%08x! Expected=0x%02x, Found=0x%02x,",
634 start + i, wantbuf[i], havebuf[i]);
635 }
636 }
637 if (failcount) {
638 msg_cerr(" failed byte count from 0x%08x-0x%08x: 0x%x\n",
639 start, start + len - 1, failcount);
640 ret = -1;
641 }
642 return ret;
643}
644
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000645/* start is an offset to the base address of the flash chip */
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000646int check_erased_range(struct flashctx *flash, unsigned int start,
647 unsigned int len)
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000648{
649 int ret;
650 uint8_t *cmpbuf = malloc(len);
651
652 if (!cmpbuf) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000653 msg_gerr("Could not allocate memory!\n");
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000654 exit(1);
655 }
656 memset(cmpbuf, 0xff, len);
Stefan Tauner78ffbea2012-10-27 15:36:56 +0000657 ret = verify_range(flash, cmpbuf, start, len);
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000658 free(cmpbuf);
659 return ret;
660}
661
Uwe Hermann48ec1b12010-08-08 17:01:18 +0000662/*
Carl-Daniel Hailfingerd0250a32009-11-25 17:05:52 +0000663 * @cmpbuf buffer to compare against, cmpbuf[0] is expected to match the
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000664 * flash content at location start
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000665 * @start offset to the base address of the flash chip
666 * @len length of the verified area
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000667 * @return 0 for success, -1 for failure
668 */
Mark Marshallf20b7be2014-05-09 21:16:21 +0000669int verify_range(struct flashctx *flash, const uint8_t *cmpbuf, unsigned int start, unsigned int len)
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000670{
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000671 if (!len)
Stefan Taunerdf64a422014-05-27 00:06:14 +0000672 return -1;
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000673
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +0000674 if (!flash->chip->read) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000675 msg_cerr("ERROR: flashrom has no read function for this flash chip.\n");
Stefan Taunerdf64a422014-05-27 00:06:14 +0000676 return -1;
Carl-Daniel Hailfinger23290662009-06-24 08:20:45 +0000677 }
Stefan Taunerdf64a422014-05-27 00:06:14 +0000678
679 uint8_t *readbuf = malloc(len);
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000680 if (!readbuf) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000681 msg_gerr("Could not allocate memory!\n");
Stefan Taunerdf64a422014-05-27 00:06:14 +0000682 return -1;
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000683 }
Stefan Taunerdf64a422014-05-27 00:06:14 +0000684 int ret = 0;
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000685
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +0000686 if (start + len > flash->chip->total_size * 1024) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000687 msg_gerr("Error: %s called with start 0x%x + len 0x%x >"
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000688 " total_size 0x%x\n", __func__, start, len,
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +0000689 flash->chip->total_size * 1024);
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000690 ret = -1;
691 goto out_free;
692 }
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000693
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +0000694 ret = flash->chip->read(flash, readbuf, start, len);
Carl-Daniel Hailfingerd8369412010-11-16 17:21:58 +0000695 if (ret) {
696 msg_gerr("Verification impossible because read failed "
697 "at 0x%x (len 0x%x)\n", start, len);
Stefan Taunerdf64a422014-05-27 00:06:14 +0000698 ret = -1;
699 goto out_free;
Carl-Daniel Hailfingerd8369412010-11-16 17:21:58 +0000700 }
701
Stefan Tauner78ffbea2012-10-27 15:36:56 +0000702 ret = compare_range(cmpbuf, readbuf, start, len);
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000703out_free:
704 free(readbuf);
705 return ret;
706}
707
Stefan Tauner02437452013-04-01 19:34:53 +0000708/* Helper function for need_erase() that focuses on granularities of gran bytes. */
Mark Marshallf20b7be2014-05-09 21:16:21 +0000709static 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 +0000710{
711 unsigned int i, j, limit;
712 for (j = 0; j < len / gran; j++) {
713 limit = min (gran, len - j * gran);
714 /* Are 'have' and 'want' identical? */
715 if (!memcmp(have + j * gran, want + j * gran, limit))
716 continue;
717 /* have needs to be in erased state. */
718 for (i = 0; i < limit; i++)
719 if (have[j * gran + i] != 0xff)
720 return 1;
721 }
722 return 0;
723}
724
Uwe Hermann48ec1b12010-08-08 17:01:18 +0000725/*
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000726 * Check if the buffer @have can be programmed to the content of @want without
727 * erasing. This is only possible if all chunks of size @gran are either kept
728 * as-is or changed from an all-ones state to any other state.
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000729 *
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000730 * Warning: This function assumes that @have and @want point to naturally
731 * aligned regions.
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000732 *
733 * @have buffer with current content
734 * @want buffer with desired content
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000735 * @len length of the checked area
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000736 * @gran write granularity (enum, not count)
737 * @return 0 if no erase is needed, 1 otherwise
738 */
Mark Marshallf20b7be2014-05-09 21:16:21 +0000739int 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 +0000740{
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +0000741 int result = 0;
Stefan Tauner02437452013-04-01 19:34:53 +0000742 unsigned int i;
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000743
744 switch (gran) {
745 case write_gran_1bit:
746 for (i = 0; i < len; i++)
747 if ((have[i] & want[i]) != want[i]) {
748 result = 1;
749 break;
750 }
751 break;
752 case write_gran_1byte:
753 for (i = 0; i < len; i++)
754 if ((have[i] != want[i]) && (have[i] != 0xff)) {
755 result = 1;
756 break;
757 }
758 break;
759 case write_gran_256bytes:
Stefan Tauner02437452013-04-01 19:34:53 +0000760 result = need_erase_gran_bytes(have, want, len, 256);
761 break;
762 case write_gran_264bytes:
763 result = need_erase_gran_bytes(have, want, len, 264);
764 break;
765 case write_gran_512bytes:
766 result = need_erase_gran_bytes(have, want, len, 512);
767 break;
768 case write_gran_528bytes:
769 result = need_erase_gran_bytes(have, want, len, 528);
770 break;
771 case write_gran_1024bytes:
772 result = need_erase_gran_bytes(have, want, len, 1024);
773 break;
774 case write_gran_1056bytes:
775 result = need_erase_gran_bytes(have, want, len, 1056);
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000776 break;
Carl-Daniel Hailfinger1b0e9fc2014-06-16 22:36:17 +0000777 case write_gran_1byte_implicit_erase:
778 /* Do not erase, handle content changes from anything->0xff by writing 0xff. */
779 result = 0;
780 break;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000781 default:
782 msg_cerr("%s: Unsupported granularity! Please report a bug at "
783 "flashrom@flashrom.org\n", __func__);
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000784 }
785 return result;
786}
787
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000788/**
789 * Check if the buffer @have needs to be programmed to get the content of @want.
790 * If yes, return 1 and fill in first_start with the start address of the
791 * write operation and first_len with the length of the first to-be-written
792 * chunk. If not, return 0 and leave first_start and first_len undefined.
793 *
794 * Warning: This function assumes that @have and @want point to naturally
795 * aligned regions.
796 *
797 * @have buffer with current content
798 * @want buffer with desired content
799 * @len length of the checked area
800 * @gran write granularity (enum, not count)
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000801 * @first_start offset of the first byte which needs to be written (passed in
802 * value is increased by the offset of the first needed write
803 * relative to have/want or unchanged if no write is needed)
804 * @return length of the first contiguous area which needs to be written
805 * 0 if no write is needed
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000806 *
807 * FIXME: This function needs a parameter which tells it about coalescing
808 * in relation to the max write length of the programmer and the max write
809 * length of the chip.
810 */
Mark Marshallf20b7be2014-05-09 21:16:21 +0000811static unsigned int get_next_write(const uint8_t *have, const uint8_t *want, unsigned int len,
Stefan Taunerc69c9c82011-11-23 09:13:48 +0000812 unsigned int *first_start,
813 enum write_granularity gran)
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000814{
Stefan Taunerc69c9c82011-11-23 09:13:48 +0000815 int need_write = 0;
816 unsigned int rel_start = 0, first_len = 0;
817 unsigned int i, limit, stride;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000818
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000819 switch (gran) {
820 case write_gran_1bit:
821 case write_gran_1byte:
Carl-Daniel Hailfinger1b0e9fc2014-06-16 22:36:17 +0000822 case write_gran_1byte_implicit_erase:
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000823 stride = 1;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000824 break;
825 case write_gran_256bytes:
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000826 stride = 256;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000827 break;
Stefan Tauner02437452013-04-01 19:34:53 +0000828 case write_gran_264bytes:
829 stride = 264;
830 break;
831 case write_gran_512bytes:
832 stride = 512;
833 break;
834 case write_gran_528bytes:
835 stride = 528;
836 break;
837 case write_gran_1024bytes:
838 stride = 1024;
839 break;
840 case write_gran_1056bytes:
841 stride = 1056;
842 break;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000843 default:
844 msg_cerr("%s: Unsupported granularity! Please report a bug at "
845 "flashrom@flashrom.org\n", __func__);
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000846 /* Claim that no write was needed. A write with unknown
847 * granularity is too dangerous to try.
848 */
849 return 0;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000850 }
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000851 for (i = 0; i < len / stride; i++) {
852 limit = min(stride, len - i * stride);
853 /* Are 'have' and 'want' identical? */
854 if (memcmp(have + i * stride, want + i * stride, limit)) {
855 if (!need_write) {
856 /* First location where have and want differ. */
857 need_write = 1;
858 rel_start = i * stride;
859 }
860 } else {
861 if (need_write) {
862 /* First location where have and want
863 * do not differ anymore.
864 */
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000865 break;
866 }
867 }
868 }
Carl-Daniel Hailfinger202bf532010-12-06 13:05:44 +0000869 if (need_write)
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000870 first_len = min(i * stride - rel_start, len);
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000871 *first_start += rel_start;
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000872 return first_len;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000873}
874
Carl-Daniel Hailfingereaac68b2009-11-23 12:55:31 +0000875/* This function generates various test patterns useful for testing controller
876 * and chip communication as well as chip behaviour.
877 *
878 * If a byte can be written multiple times, each time keeping 0-bits at 0
879 * and changing 1-bits to 0 if the new value for that bit is 0, the effect
880 * is essentially an AND operation. That's also the reason why this function
881 * provides the result of AND between various patterns.
882 *
883 * Below is a list of patterns (and their block length).
884 * Pattern 0 is 05 15 25 35 45 55 65 75 85 95 a5 b5 c5 d5 e5 f5 (16 Bytes)
885 * Pattern 1 is 0a 1a 2a 3a 4a 5a 6a 7a 8a 9a aa ba ca da ea fa (16 Bytes)
886 * Pattern 2 is 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f (16 Bytes)
887 * Pattern 3 is a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af (16 Bytes)
888 * Pattern 4 is 00 10 20 30 40 50 60 70 80 90 a0 b0 c0 d0 e0 f0 (16 Bytes)
889 * Pattern 5 is 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f (16 Bytes)
890 * Pattern 6 is 00 (1 Byte)
891 * Pattern 7 is ff (1 Byte)
892 * Patterns 0-7 have a big-endian block number in the last 2 bytes of each 256
893 * byte block.
894 *
895 * Pattern 8 is 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11... (256 B)
896 * Pattern 9 is ff fe fd fc fb fa f9 f8 f7 f6 f5 f4 f3 f2 f1 f0 ef ee... (256 B)
897 * Pattern 10 is 00 00 00 01 00 02 00 03 00 04... (128 kB big-endian counter)
898 * Pattern 11 is ff ff ff fe ff fd ff fc ff fb... (128 kB big-endian downwards)
899 * Pattern 12 is 00 (1 Byte)
900 * Pattern 13 is ff (1 Byte)
901 * Patterns 8-13 have no block number.
902 *
903 * Patterns 0-3 are created to detect and efficiently diagnose communication
904 * slips like missed bits or bytes and their repetitive nature gives good visual
905 * cues to the person inspecting the results. In addition, the following holds:
906 * AND Pattern 0/1 == Pattern 4
907 * AND Pattern 2/3 == Pattern 5
908 * AND Pattern 0/1/2/3 == AND Pattern 4/5 == Pattern 6
909 * A weakness of pattern 0-5 is the inability to detect swaps/copies between
910 * any two 16-byte blocks except for the last 16-byte block in a 256-byte bloc.
911 * They work perfectly for detecting any swaps/aliasing of blocks >= 256 bytes.
912 * 0x5 and 0xa were picked because they are 0101 and 1010 binary.
913 * Patterns 8-9 are best for detecting swaps/aliasing of blocks < 256 bytes.
914 * Besides that, they provide for bit testing of the last two bytes of every
915 * 256 byte block which contains the block number for patterns 0-6.
916 * Patterns 10-11 are special purpose for detecting subblock aliasing with
917 * block sizes >256 bytes (some Dataflash chips etc.)
918 * AND Pattern 8/9 == Pattern 12
919 * AND Pattern 10/11 == Pattern 12
920 * Pattern 13 is the completely erased state.
921 * None of the patterns can detect aliasing at boundaries which are a multiple
922 * of 16 MBytes (but such chips do not exist anyway for Parallel/LPC/FWH/SPI).
923 */
924int generate_testpattern(uint8_t *buf, uint32_t size, int variant)
925{
926 int i;
927
928 if (!buf) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000929 msg_gerr("Invalid buffer!\n");
Carl-Daniel Hailfingereaac68b2009-11-23 12:55:31 +0000930 return 1;
931 }
932
933 switch (variant) {
934 case 0:
935 for (i = 0; i < size; i++)
936 buf[i] = (i & 0xf) << 4 | 0x5;
937 break;
938 case 1:
939 for (i = 0; i < size; i++)
940 buf[i] = (i & 0xf) << 4 | 0xa;
941 break;
942 case 2:
943 for (i = 0; i < size; i++)
944 buf[i] = 0x50 | (i & 0xf);
945 break;
946 case 3:
947 for (i = 0; i < size; i++)
948 buf[i] = 0xa0 | (i & 0xf);
949 break;
950 case 4:
951 for (i = 0; i < size; i++)
952 buf[i] = (i & 0xf) << 4;
953 break;
954 case 5:
955 for (i = 0; i < size; i++)
956 buf[i] = i & 0xf;
957 break;
958 case 6:
959 memset(buf, 0x00, size);
960 break;
961 case 7:
962 memset(buf, 0xff, size);
963 break;
964 case 8:
965 for (i = 0; i < size; i++)
966 buf[i] = i & 0xff;
967 break;
968 case 9:
969 for (i = 0; i < size; i++)
970 buf[i] = ~(i & 0xff);
971 break;
972 case 10:
973 for (i = 0; i < size % 2; i++) {
974 buf[i * 2] = (i >> 8) & 0xff;
975 buf[i * 2 + 1] = i & 0xff;
976 }
977 if (size & 0x1)
978 buf[i * 2] = (i >> 8) & 0xff;
979 break;
980 case 11:
981 for (i = 0; i < size % 2; i++) {
982 buf[i * 2] = ~((i >> 8) & 0xff);
983 buf[i * 2 + 1] = ~(i & 0xff);
984 }
985 if (size & 0x1)
986 buf[i * 2] = ~((i >> 8) & 0xff);
987 break;
988 case 12:
989 memset(buf, 0x00, size);
990 break;
991 case 13:
992 memset(buf, 0xff, size);
993 break;
994 }
995
996 if ((variant >= 0) && (variant <= 7)) {
997 /* Write block number in the last two bytes of each 256-byte
998 * block, big endian for easier reading of the hexdump.
999 * Note that this wraps around for chips larger than 2^24 bytes
1000 * (16 MB).
1001 */
1002 for (i = 0; i < size / 256; i++) {
1003 buf[i * 256 + 254] = (i >> 8) & 0xff;
1004 buf[i * 256 + 255] = i & 0xff;
1005 }
1006 }
1007
1008 return 0;
1009}
1010
Stefan Tauner9e3a6982014-08-15 17:17:59 +00001011/* Returns the number of busses commonly supported by the current programmer and flash chip where the latter
1012 * can not be completely accessed due to size/address limits of the programmer. */
1013unsigned int count_max_decode_exceedings(const struct flashctx *flash)
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001014{
Stefan Tauner9e3a6982014-08-15 17:17:59 +00001015 unsigned int limitexceeded = 0;
1016 uint32_t size = flash->chip->total_size * 1024;
1017 enum chipbustype buses = flash->mst->buses_supported & flash->chip->bustype;
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001018
1019 if ((buses & BUS_PARALLEL) && (max_rom_decode.parallel < size)) {
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001020 limitexceeded++;
Sean Nelson316a29f2010-05-07 20:09:04 +00001021 msg_pdbg("Chip size %u kB is bigger than supported "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001022 "size %u kB of chipset/board/programmer "
1023 "for %s interface, "
1024 "probe/read/erase/write may fail. ", size / 1024,
1025 max_rom_decode.parallel / 1024, "Parallel");
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001026 }
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001027 if ((buses & BUS_LPC) && (max_rom_decode.lpc < size)) {
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001028 limitexceeded++;
Sean Nelson316a29f2010-05-07 20:09:04 +00001029 msg_pdbg("Chip size %u kB is bigger than supported "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001030 "size %u kB of chipset/board/programmer "
1031 "for %s interface, "
1032 "probe/read/erase/write may fail. ", size / 1024,
1033 max_rom_decode.lpc / 1024, "LPC");
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001034 }
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001035 if ((buses & BUS_FWH) && (max_rom_decode.fwh < size)) {
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001036 limitexceeded++;
Sean Nelson316a29f2010-05-07 20:09:04 +00001037 msg_pdbg("Chip size %u kB is bigger than supported "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001038 "size %u kB of chipset/board/programmer "
1039 "for %s interface, "
1040 "probe/read/erase/write may fail. ", size / 1024,
1041 max_rom_decode.fwh / 1024, "FWH");
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001042 }
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001043 if ((buses & BUS_SPI) && (max_rom_decode.spi < size)) {
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001044 limitexceeded++;
Sean Nelson316a29f2010-05-07 20:09:04 +00001045 msg_pdbg("Chip size %u kB is bigger than supported "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001046 "size %u kB of chipset/board/programmer "
1047 "for %s interface, "
1048 "probe/read/erase/write may fail. ", size / 1024,
1049 max_rom_decode.spi / 1024, "SPI");
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001050 }
Stefan Tauner9e3a6982014-08-15 17:17:59 +00001051 return limitexceeded;
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001052}
1053
Stefan Tauner4e32ec12014-08-30 23:39:51 +00001054void unmap_flash(struct flashctx *flash)
1055{
1056 if (flash->virtual_registers != (chipaddr)ERROR_PTR) {
1057 programmer_unmap_flash_region((void *)flash->virtual_registers, flash->chip->total_size * 1024);
1058 flash->physical_registers = 0;
1059 flash->virtual_registers = (chipaddr)ERROR_PTR;
1060 }
1061
1062 if (flash->virtual_memory != (chipaddr)ERROR_PTR) {
1063 programmer_unmap_flash_region((void *)flash->virtual_memory, flash->chip->total_size * 1024);
1064 flash->physical_memory = 0;
1065 flash->virtual_memory = (chipaddr)ERROR_PTR;
1066 }
1067}
1068
1069int map_flash(struct flashctx *flash)
1070{
1071 /* Init pointers to the fail-safe state to distinguish them later from legit values. */
1072 flash->virtual_memory = (chipaddr)ERROR_PTR;
1073 flash->virtual_registers = (chipaddr)ERROR_PTR;
1074
1075 /* FIXME: This avoids mapping (and unmapping) of flash chip definitions with size 0.
1076 * These are used for various probing-related hacks that would not map successfully anyway and should be
1077 * removed ASAP. */
1078 if (flash->chip->total_size == 0)
1079 return 0;
1080
1081 const chipsize_t size = flash->chip->total_size * 1024;
1082 uintptr_t base = flashbase ? flashbase : (0xffffffff - size + 1);
1083 void *addr = programmer_map_flash_region(flash->chip->name, base, size);
1084 if (addr == ERROR_PTR) {
1085 msg_perr("Could not map flash chip %s at 0x%0*" PRIxPTR ".\n",
1086 flash->chip->name, PRIxPTR_WIDTH, base);
1087 return 1;
1088 }
1089 flash->physical_memory = base;
1090 flash->virtual_memory = (chipaddr)addr;
1091
1092 /* FIXME: Special function registers normally live 4 MByte below flash space, but it might be somewhere
1093 * completely different on some chips and programmers, or not mappable at all.
1094 * Ignore these problems for now and always report success. */
1095 if (flash->chip->feature_bits & FEATURE_REGISTERMAP) {
1096 base = 0xffffffff - size - 0x400000 + 1;
1097 addr = programmer_map_flash_region("flash chip registers", base, size);
1098 if (addr == ERROR_PTR) {
1099 msg_pdbg2("Could not map flash chip registers %s at 0x%0*" PRIxPTR ".\n",
1100 flash->chip->name, PRIxPTR_WIDTH, base);
1101 return 0;
1102 }
1103 flash->physical_registers = base;
1104 flash->virtual_registers = (chipaddr)addr;
1105 }
1106 return 0;
1107}
1108
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +00001109int probe_flash(struct registered_master *mst, int startchip, struct flashctx *flash, int force)
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001110{
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001111 const struct flashchip *chip;
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001112 enum chipbustype buses_common;
Carl-Daniel Hailfingerb22918c2009-06-01 02:08:58 +00001113 char *tmp;
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001114
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001115 for (chip = flashchips + startchip; chip && chip->name; chip++) {
1116 if (chip_to_probe && strcmp(chip->name, chip_to_probe) != 0)
Ollie Lhocbbf1252004-03-17 22:22:08 +00001117 continue;
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +00001118 buses_common = mst->buses_supported & chip->bustype;
Carl-Daniel Hailfingerc40cff72011-12-20 00:19:29 +00001119 if (!buses_common)
Carl-Daniel Hailfinger6573b742011-06-17 22:38:53 +00001120 continue;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001121 msg_gdbg("Probing for %s %s, %d kB: ", chip->vendor, chip->name, chip->total_size);
1122 if (!chip->probe && !force) {
1123 msg_gdbg("failed! flashrom has no probe function for this flash chip.\n");
Carl-Daniel Hailfingerb22918c2009-06-01 02:08:58 +00001124 continue;
1125 }
Stefan Reinauer70385642007-04-06 11:58:03 +00001126
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001127 /* Start filling in the dynamic data. */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001128 flash->chip = calloc(1, sizeof(struct flashchip));
1129 if (!flash->chip) {
1130 msg_gerr("Out of memory!\n");
1131 exit(1);
1132 }
1133 memcpy(flash->chip, chip, sizeof(struct flashchip));
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +00001134 flash->mst = mst;
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001135
Stefan Tauner4e32ec12014-08-30 23:39:51 +00001136 if (map_flash(flash) != 0)
1137 return -1;
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001138
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001139 /* We handle a forced match like a real match, we just avoid probing. Note that probe_flash()
1140 * is only called with force=1 after normal probing failed.
1141 */
Peter Stuge27c3e2d2008-07-02 17:15:47 +00001142 if (force)
1143 break;
Stefan Reinauerfcb63682006-03-16 16:57:41 +00001144
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001145 if (flash->chip->probe(flash) != 1)
Peter Stuge483b8f02008-09-03 23:10:05 +00001146 goto notfound;
1147
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001148 /* If this is the first chip found, accept it.
1149 * If this is not the first chip found, accept it only if it is
Stefan Taunerac1b4c82012-02-17 14:51:04 +00001150 * a non-generic match. SFDP and CFI are generic matches.
1151 * startchip==0 means this call to probe_flash() is the first
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +00001152 * one for this programmer interface (master) and thus no other chip has
Stefan Taunerac1b4c82012-02-17 14:51:04 +00001153 * been found on this interface.
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001154 */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001155 if (startchip == 0 && flash->chip->model_id == SFDP_DEVICE_ID) {
Stefan Taunerac1b4c82012-02-17 14:51:04 +00001156 msg_cinfo("===\n"
1157 "SFDP has autodetected a flash chip which is "
1158 "not natively supported by flashrom yet.\n");
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001159 if (count_usable_erasers(flash) == 0)
Stefan Taunerac1b4c82012-02-17 14:51:04 +00001160 msg_cinfo("The standard operations read and "
1161 "verify should work, but to support "
1162 "erase, write and all other "
1163 "possible features");
1164 else
1165 msg_cinfo("All standard operations (read, "
1166 "verify, erase and write) should "
1167 "work, but to support all possible "
1168 "features");
1169
Stefan Taunerb4e06bd2012-08-20 00:24:22 +00001170 msg_cinfo(" we need to add them manually.\n"
1171 "You can help us by mailing us the output of the following command to "
1172 "flashrom@flashrom.org:\n"
1173 "'flashrom -VV [plus the -p/--programmer parameter]'\n"
1174 "Thanks for your help!\n"
Stefan Taunerac1b4c82012-02-17 14:51:04 +00001175 "===\n");
1176 }
1177
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001178 /* First flash chip detected on this bus. */
1179 if (startchip == 0)
Peter Stuge27c3e2d2008-07-02 17:15:47 +00001180 break;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001181 /* Not the first flash chip detected on this bus, but not a generic match either. */
1182 if ((flash->chip->model_id != GENERIC_DEVICE_ID) && (flash->chip->model_id != SFDP_DEVICE_ID))
1183 break;
1184 /* 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 +00001185notfound:
Stefan Tauner4e32ec12014-08-30 23:39:51 +00001186 unmap_flash(flash);
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001187 free(flash->chip);
1188 flash->chip = NULL;
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001189 }
Uwe Hermannffec5f32007-08-23 16:08:21 +00001190
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001191 if (!flash->chip)
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001192 return -1;
Peter Stuge27c3e2d2008-07-02 17:15:47 +00001193
Stefan Reinauer051e2362011-01-19 06:21:54 +00001194
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001195 tmp = flashbuses_to_text(flash->chip->bustype);
Stefan Tauner4e32ec12014-08-30 23:39:51 +00001196 msg_cinfo("%s %s flash chip \"%s\" (%d kB, %s) ", force ? "Assuming" : "Found",
1197 flash->chip->vendor, flash->chip->name, flash->chip->total_size, tmp);
Stefan Tauner00155492011-06-26 20:45:35 +00001198 free(tmp);
Stefan Tauner4e32ec12014-08-30 23:39:51 +00001199#if CONFIG_INTERNAL == 1
1200 if (programmer_table[programmer].map_flash_region == physmap)
1201 msg_cinfo("mapped at physical address 0x%0*" PRIxPTR ".\n",
1202 PRIxPTR_WIDTH, flash->physical_memory);
1203 else
1204#endif
1205 msg_cinfo("on %s.\n", programmer_table[programmer].name);
Uwe Hermann9899cad2009-06-28 21:47:57 +00001206
Stefan Tauner4e32ec12014-08-30 23:39:51 +00001207 /* Flash registers may more likely not be mapped if the chip was forced.
1208 * Lock info may be stored in registers, so avoid lock info printing. */
Carl-Daniel Hailfinger859f3f02010-12-02 21:59:42 +00001209 if (!force)
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001210 if (flash->chip->printlock)
1211 flash->chip->printlock(flash);
Sean Nelson6e0b9122010-02-19 00:52:10 +00001212
Stefan Tauner4e32ec12014-08-30 23:39:51 +00001213 /* Get out of the way for later runs. */
1214 unmap_flash(flash);
1215
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001216 /* Return position of matching chip. */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001217 return chip - flashchips;
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001218}
1219
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001220int read_buf_from_file(unsigned char *buf, unsigned long size,
1221 const char *filename)
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001222{
Nico Huber7562f7d2013-08-30 21:29:45 +00001223#ifdef __LIBPAYLOAD__
1224 msg_gerr("Error: No file I/O support in libpayload\n");
1225 return 1;
1226#else
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001227 unsigned long numbytes;
1228 FILE *image;
1229 struct stat image_stat;
1230
1231 if ((image = fopen(filename, "rb")) == NULL) {
Stefan Tauner363fd7e2013-04-07 13:08:30 +00001232 msg_gerr("Error: opening file \"%s\" failed: %s\n", filename, strerror(errno));
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001233 return 1;
1234 }
1235 if (fstat(fileno(image), &image_stat) != 0) {
Stefan Tauner363fd7e2013-04-07 13:08:30 +00001236 msg_gerr("Error: getting metadata of file \"%s\" failed: %s\n", filename, strerror(errno));
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001237 fclose(image);
1238 return 1;
1239 }
1240 if (image_stat.st_size != size) {
Carl-Daniel Hailfinger11990da2013-07-13 23:21:05 +00001241 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 +00001242 (intmax_t)image_stat.st_size, size);
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001243 fclose(image);
1244 return 1;
1245 }
1246 numbytes = fread(buf, 1, size, image);
1247 if (fclose(image)) {
Stefan Tauner363fd7e2013-04-07 13:08:30 +00001248 msg_gerr("Error: closing file \"%s\" failed: %s\n", filename, strerror(errno));
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001249 return 1;
1250 }
1251 if (numbytes != size) {
1252 msg_gerr("Error: Failed to read complete file. Got %ld bytes, "
1253 "wanted %ld!\n", numbytes, size);
1254 return 1;
1255 }
1256 return 0;
Nico Huber7562f7d2013-08-30 21:29:45 +00001257#endif
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001258}
1259
Mark Marshallf20b7be2014-05-09 21:16:21 +00001260int write_buf_to_file(const unsigned char *buf, unsigned long size, const char *filename)
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001261{
Nico Huber7562f7d2013-08-30 21:29:45 +00001262#ifdef __LIBPAYLOAD__
1263 msg_gerr("Error: No file I/O support in libpayload\n");
1264 return 1;
1265#else
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001266 unsigned long numbytes;
1267 FILE *image;
Stephan Guilloux21dd55b2009-06-01 22:07:52 +00001268
1269 if (!filename) {
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001270 msg_gerr("No filename specified.\n");
Stephan Guilloux21dd55b2009-06-01 22:07:52 +00001271 return 1;
1272 }
Patrick Georgi0bf842d2010-01-25 22:55:33 +00001273 if ((image = fopen(filename, "wb")) == NULL) {
Stefan Tauner363fd7e2013-04-07 13:08:30 +00001274 msg_gerr("Error: opening file \"%s\" failed: %s\n", filename, strerror(errno));
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00001275 return 1;
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001276 }
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001277
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001278 numbytes = fwrite(buf, 1, size, image);
1279 fclose(image);
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001280 if (numbytes != size) {
1281 msg_gerr("File %s could not be written completely.\n",
1282 filename);
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001283 return 1;
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001284 }
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001285 return 0;
Nico Huber7562f7d2013-08-30 21:29:45 +00001286#endif
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001287}
1288
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001289int read_flash_to_file(struct flashctx *flash, const char *filename)
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001290{
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001291 unsigned long size = flash->chip->total_size * 1024;
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001292 unsigned char *buf = calloc(size, sizeof(char));
1293 int ret = 0;
1294
1295 msg_cinfo("Reading flash... ");
1296 if (!buf) {
1297 msg_gerr("Memory allocation failed!\n");
1298 msg_cinfo("FAILED.\n");
1299 return 1;
1300 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001301 if (!flash->chip->read) {
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001302 msg_cerr("No read function available for this flash chip.\n");
1303 ret = 1;
1304 goto out_free;
1305 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001306 if (flash->chip->read(flash, buf, 0, size)) {
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001307 msg_cerr("Read operation failed!\n");
1308 ret = 1;
1309 goto out_free;
1310 }
1311
Stefan Tauner355cbfd2011-05-28 02:37:14 +00001312 ret = write_buf_to_file(buf, size, filename);
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001313out_free:
1314 free(buf);
1315 msg_cinfo("%s.\n", ret ? "FAILED" : "done");
1316 return ret;
1317}
1318
Stefan Tauner96658be2014-05-26 22:05:31 +00001319/* Even if an error is found, the function will keep going and check the rest. */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001320static int selfcheck_eraseblocks(const struct flashchip *chip)
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001321{
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +00001322 int i, j, k;
1323 int ret = 0;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001324
1325 for (k = 0; k < NUM_ERASEFUNCTIONS; k++) {
1326 unsigned int done = 0;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001327 struct block_eraser eraser = chip->block_erasers[k];
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001328
1329 for (i = 0; i < NUM_ERASEREGIONS; i++) {
1330 /* Blocks with zero size are bugs in flashchips.c. */
1331 if (eraser.eraseblocks[i].count &&
1332 !eraser.eraseblocks[i].size) {
1333 msg_gerr("ERROR: Flash chip %s erase function "
1334 "%i region %i has size 0. Please report"
1335 " a bug at flashrom@flashrom.org\n",
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001336 chip->name, k, i);
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001337 ret = 1;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001338 }
1339 /* Blocks with zero count are bugs in flashchips.c. */
1340 if (!eraser.eraseblocks[i].count &&
1341 eraser.eraseblocks[i].size) {
1342 msg_gerr("ERROR: Flash chip %s erase function "
1343 "%i region %i has count 0. Please report"
1344 " a bug at flashrom@flashrom.org\n",
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001345 chip->name, k, i);
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001346 ret = 1;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001347 }
1348 done += eraser.eraseblocks[i].count *
1349 eraser.eraseblocks[i].size;
1350 }
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001351 /* Empty eraseblock definition with erase function. */
1352 if (!done && eraser.block_erase)
Sean Nelson316a29f2010-05-07 20:09:04 +00001353 msg_gspew("Strange: Empty eraseblock definition with "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001354 "non-empty erase function. Not an error.\n");
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001355 if (!done)
1356 continue;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001357 if (done != chip->total_size * 1024) {
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001358 msg_gerr("ERROR: Flash chip %s erase function %i "
1359 "region walking resulted in 0x%06x bytes total,"
1360 " expected 0x%06x bytes. Please report a bug at"
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001361 " flashrom@flashrom.org\n", chip->name, k,
1362 done, chip->total_size * 1024);
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001363 ret = 1;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001364 }
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001365 if (!eraser.block_erase)
1366 continue;
1367 /* Check if there are identical erase functions for different
1368 * layouts. That would imply "magic" erase functions. The
1369 * easiest way to check this is with function pointers.
1370 */
Uwe Hermann43959702010-03-13 17:28:29 +00001371 for (j = k + 1; j < NUM_ERASEFUNCTIONS; j++) {
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001372 if (eraser.block_erase ==
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001373 chip->block_erasers[j].block_erase) {
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001374 msg_gerr("ERROR: Flash chip %s erase function "
1375 "%i and %i are identical. Please report"
1376 " a bug at flashrom@flashrom.org\n",
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001377 chip->name, k, j);
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001378 ret = 1;
1379 }
Uwe Hermann43959702010-03-13 17:28:29 +00001380 }
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001381 }
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001382 return ret;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001383}
1384
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001385static int erase_and_write_block_helper(struct flashctx *flash,
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001386 unsigned int start, unsigned int len,
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001387 uint8_t *curcontents,
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001388 uint8_t *newcontents,
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001389 int (*erasefn) (struct flashctx *flash,
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001390 unsigned int addr,
1391 unsigned int len))
1392{
Stefan Taunerc69c9c82011-11-23 09:13:48 +00001393 unsigned int starthere = 0, lenhere = 0;
1394 int ret = 0, skip = 1, writecount = 0;
Stefan Tauner50d67aa2013-03-03 23:49:48 +00001395 enum write_granularity gran = flash->chip->gran;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001396
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001397 /* curcontents and newcontents are opaque to walk_eraseregions, and
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001398 * need to be adjusted here to keep the impression of proper abstraction
1399 */
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001400 curcontents += start;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001401 newcontents += start;
1402 msg_cdbg(":");
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001403 if (need_erase(curcontents, newcontents, len, gran)) {
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001404 msg_cdbg("E");
1405 ret = erasefn(flash, start, len);
1406 if (ret)
1407 return ret;
Carl-Daniel Hailfingerb4061f62011-06-26 17:04:16 +00001408 if (check_erased_range(flash, start, len)) {
1409 msg_cerr("ERASE FAILED!\n");
1410 return -1;
1411 }
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001412 /* Erase was successful. Adjust curcontents. */
1413 memset(curcontents, 0xff, len);
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001414 skip = 0;
1415 }
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001416 /* get_next_write() sets starthere to a new value after the call. */
1417 while ((lenhere = get_next_write(curcontents + starthere,
1418 newcontents + starthere,
1419 len - starthere, &starthere, gran))) {
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001420 if (!writecount++)
1421 msg_cdbg("W");
1422 /* Needs the partial write function signature. */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001423 ret = flash->chip->write(flash, newcontents + starthere,
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001424 start + starthere, lenhere);
1425 if (ret)
1426 return ret;
1427 starthere += lenhere;
1428 skip = 0;
1429 }
1430 if (skip)
1431 msg_cdbg("S");
Stefan Tauner682122b2013-06-23 22:15:39 +00001432 else
1433 all_skipped = false;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001434 return ret;
1435}
1436
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001437static int walk_eraseregions(struct flashctx *flash, int erasefunction,
1438 int (*do_something) (struct flashctx *flash,
Carl-Daniel Hailfinger4d3e9ca2010-07-13 00:42:00 +00001439 unsigned int addr,
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001440 unsigned int len,
1441 uint8_t *param1,
1442 uint8_t *param2,
1443 int (*erasefn) (
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001444 struct flashctx *flash,
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001445 unsigned int addr,
1446 unsigned int len)),
1447 void *param1, void *param2)
Carl-Daniel Hailfingera1223412010-07-13 00:37:19 +00001448{
1449 int i, j;
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +00001450 unsigned int start = 0;
1451 unsigned int len;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001452 struct block_eraser eraser = flash->chip->block_erasers[erasefunction];
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001453
Carl-Daniel Hailfingera1223412010-07-13 00:37:19 +00001454 for (i = 0; i < NUM_ERASEREGIONS; i++) {
1455 /* count==0 for all automatically initialized array
1456 * members so the loop below won't be executed for them.
1457 */
1458 len = eraser.eraseblocks[i].size;
1459 for (j = 0; j < eraser.eraseblocks[i].count; j++) {
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001460 /* Print this for every block except the first one. */
1461 if (i || j)
1462 msg_cdbg(", ");
1463 msg_cdbg("0x%06x-0x%06x", start,
Carl-Daniel Hailfingera1223412010-07-13 00:37:19 +00001464 start + len - 1);
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001465 if (do_something(flash, start, len, param1, param2,
1466 eraser.block_erase)) {
Carl-Daniel Hailfingera1223412010-07-13 00:37:19 +00001467 return 1;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001468 }
Carl-Daniel Hailfingera1223412010-07-13 00:37:19 +00001469 start += len;
1470 }
1471 }
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001472 msg_cdbg("\n");
Carl-Daniel Hailfingera1223412010-07-13 00:37:19 +00001473 return 0;
1474}
1475
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001476static int check_block_eraser(const struct flashctx *flash, int k, int log)
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001477{
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001478 struct block_eraser eraser = flash->chip->block_erasers[k];
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001479
1480 if (!eraser.block_erase && !eraser.eraseblocks[0].count) {
1481 if (log)
1482 msg_cdbg("not defined. ");
1483 return 1;
1484 }
1485 if (!eraser.block_erase && eraser.eraseblocks[0].count) {
1486 if (log)
1487 msg_cdbg("eraseblock layout is known, but matching "
Stefan Tauner355cbfd2011-05-28 02:37:14 +00001488 "block erase function is not implemented. ");
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001489 return 1;
1490 }
1491 if (eraser.block_erase && !eraser.eraseblocks[0].count) {
1492 if (log)
1493 msg_cdbg("block erase function found, but "
Stefan Tauner355cbfd2011-05-28 02:37:14 +00001494 "eraseblock layout is not defined. ");
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001495 return 1;
1496 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001497 // TODO: Once erase functions are annotated with allowed buses, check that as well.
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001498 return 0;
1499}
1500
Mark Marshallf20b7be2014-05-09 21:16:21 +00001501int erase_and_write_flash(struct flashctx *flash, uint8_t *oldcontents, uint8_t *newcontents)
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001502{
Carl-Daniel Hailfingerd8334db2011-07-21 21:21:04 +00001503 int k, ret = 1;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001504 uint8_t *curcontents;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001505 unsigned long size = flash->chip->total_size * 1024;
Sylvain "ythier" Hitier9db45512011-07-04 07:27:17 +00001506 unsigned int usable_erasefunctions = count_usable_erasers(flash);
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001507
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001508 msg_cinfo("Erasing and writing flash chip... ");
Stefan Tauner269de352011-07-12 22:35:21 +00001509 curcontents = malloc(size);
1510 if (!curcontents) {
1511 msg_gerr("Out of memory!\n");
1512 exit(1);
1513 }
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001514 /* Copy oldcontents to curcontents to avoid clobbering oldcontents. */
1515 memcpy(curcontents, oldcontents, size);
1516
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001517 for (k = 0; k < NUM_ERASEFUNCTIONS; k++) {
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001518 if (k != 0)
Stefan Tauner16878542014-07-13 23:53:40 +00001519 msg_cinfo("Looking for another erase function.\n");
Carl-Daniel Hailfingerd8334db2011-07-21 21:21:04 +00001520 if (!usable_erasefunctions) {
Stefan Tauner16878542014-07-13 23:53:40 +00001521 msg_cinfo("No usable erase functions left.\n");
Carl-Daniel Hailfingerd8334db2011-07-21 21:21:04 +00001522 break;
1523 }
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001524 msg_cdbg("Trying erase function %i... ", k);
1525 if (check_block_eraser(flash, k, 1))
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001526 continue;
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001527 usable_erasefunctions--;
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001528 ret = walk_eraseregions(flash, k, &erase_and_write_block_helper,
1529 curcontents, newcontents);
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001530 /* If everything is OK, don't try another erase function. */
1531 if (!ret)
1532 break;
Carl-Daniel Hailfingerb23b1eb2010-12-02 02:41:55 +00001533 /* Write/erase failed, so try to find out what the current chip
Carl-Daniel Hailfingerd8334db2011-07-21 21:21:04 +00001534 * contents are. If no usable erase functions remain, we can
1535 * skip this: the next iteration will break immediately anyway.
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001536 */
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001537 if (!usable_erasefunctions)
1538 continue;
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001539 /* Reading the whole chip may take a while, inform the user even
1540 * in non-verbose mode.
1541 */
1542 msg_cinfo("Reading current flash chip contents... ");
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001543 if (flash->chip->read(flash, curcontents, 0, size)) {
Carl-Daniel Hailfingerb23b1eb2010-12-02 02:41:55 +00001544 /* Now we are truly screwed. Read failed as well. */
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001545 msg_cerr("Can't read anymore! Aborting.\n");
Carl-Daniel Hailfingerb23b1eb2010-12-02 02:41:55 +00001546 /* We have no idea about the flash chip contents, so
1547 * retrying with another erase function is pointless.
1548 */
1549 break;
1550 }
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001551 msg_cinfo("done. ");
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001552 }
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001553 /* Free the scratchpad. */
1554 free(curcontents);
Carl-Daniel Hailfingerf160a122009-05-08 17:15:15 +00001555
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001556 if (ret) {
Sean Nelson316a29f2010-05-07 20:09:04 +00001557 msg_cerr("FAILED!\n");
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001558 } else {
Stefan Tauner682122b2013-06-23 22:15:39 +00001559 if (all_skipped)
1560 msg_cinfo("\nWarning: Chip content is identical to the requested image.\n");
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001561 msg_cinfo("Erase/write done.\n");
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001562 }
1563 return ret;
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001564}
1565
Stefan Tauner136388f2013-07-15 10:47:53 +00001566static void nonfatal_help_message(void)
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001567{
Stefan Taunera58f6e92014-05-10 09:25:44 +00001568 msg_gerr("Good, writing to the flash chip apparently didn't do anything.\n");
Stefan Tauner136388f2013-07-15 10:47:53 +00001569#if CONFIG_INTERNAL == 1
1570 if (programmer == PROGRAMMER_INTERNAL)
1571 msg_gerr("This means we have to add special support for your board, programmer or flash\n"
1572 "chip. Please report this on IRC at chat.freenode.net (channel #flashrom) or\n"
1573 "mail flashrom@flashrom.org, thanks!\n"
1574 "-------------------------------------------------------------------------------\n"
1575 "You may now reboot or simply leave the machine running.\n");
1576 else
1577#endif
1578 msg_gerr("Please check the connections (especially those to write protection pins) between\n"
1579 "the programmer and the flash chip. If you think the error is caused by flashrom\n"
1580 "please report this on IRC at chat.freenode.net (channel #flashrom) or\n"
1581 "mail flashrom@flashrom.org, thanks!\n");
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001582}
1583
Stefan Tauner136388f2013-07-15 10:47:53 +00001584static void emergency_help_message(void)
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00001585{
Stefan Tauner136388f2013-07-15 10:47:53 +00001586 msg_gerr("Your flash chip is in an unknown state.\n");
1587#if CONFIG_INTERNAL == 1
1588 if (programmer == PROGRAMMER_INTERNAL)
1589 msg_gerr("Get help on IRC at chat.freenode.net (channel #flashrom) or\n"
1590 "mail flashrom@flashrom.org with the subject \"FAILED: <your board name>\"!\n"
1591 "-------------------------------------------------------------------------------\n"
1592 "DO NOT REBOOT OR POWEROFF!\n");
1593 else
1594#endif
1595 msg_gerr("Please report this on IRC at chat.freenode.net (channel #flashrom) or\n"
1596 "mail flashrom@flashrom.org, thanks!\n");
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00001597}
1598
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001599/* The way to go if you want a delimited list of programmers */
Stefan Tauner66652442011-06-26 17:38:17 +00001600void list_programmers(const char *delim)
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001601{
1602 enum programmer p;
1603 for (p = 0; p < PROGRAMMER_INVALID; p++) {
Sean Nelson316a29f2010-05-07 20:09:04 +00001604 msg_ginfo("%s", programmer_table[p].name);
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001605 if (p < PROGRAMMER_INVALID - 1)
Sean Nelson316a29f2010-05-07 20:09:04 +00001606 msg_ginfo("%s", delim);
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001607 }
Sean Nelson316a29f2010-05-07 20:09:04 +00001608 msg_ginfo("\n");
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001609}
1610
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001611void list_programmers_linebreak(int startcol, int cols, int paren)
1612{
1613 const char *pname;
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +00001614 int pnamelen;
1615 int remaining = 0, firstline = 1;
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001616 enum programmer p;
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +00001617 int i;
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001618
1619 for (p = 0; p < PROGRAMMER_INVALID; p++) {
1620 pname = programmer_table[p].name;
1621 pnamelen = strlen(pname);
1622 if (remaining - pnamelen - 2 < 0) {
1623 if (firstline)
1624 firstline = 0;
1625 else
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001626 msg_ginfo("\n");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001627 for (i = 0; i < startcol; i++)
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001628 msg_ginfo(" ");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001629 remaining = cols - startcol;
1630 } else {
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001631 msg_ginfo(" ");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001632 remaining--;
1633 }
1634 if (paren && (p == 0)) {
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001635 msg_ginfo("(");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001636 remaining--;
1637 }
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001638 msg_ginfo("%s", pname);
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001639 remaining -= pnamelen;
1640 if (p < PROGRAMMER_INVALID - 1) {
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001641 msg_ginfo(",");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001642 remaining--;
1643 } else {
1644 if (paren)
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001645 msg_ginfo(")");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001646 }
1647 }
1648}
1649
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001650void print_sysinfo(void)
1651{
Carl-Daniel Hailfinger60d9bd22012-08-09 23:34:41 +00001652#ifdef _WIN32
1653 SYSTEM_INFO si;
1654 OSVERSIONINFOEX osvi;
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001655
Carl-Daniel Hailfinger60d9bd22012-08-09 23:34:41 +00001656 memset(&si, 0, sizeof(SYSTEM_INFO));
1657 memset(&osvi, 0, sizeof(OSVERSIONINFOEX));
1658 msg_ginfo(" on Windows");
1659 /* Tell Windows which version of the structure we want. */
1660 osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
1661 if (GetVersionEx((OSVERSIONINFO*) &osvi))
1662 msg_ginfo(" %lu.%lu", osvi.dwMajorVersion, osvi.dwMinorVersion);
1663 else
1664 msg_ginfo(" unknown version");
1665 GetSystemInfo(&si);
1666 switch (si.wProcessorArchitecture) {
1667 case PROCESSOR_ARCHITECTURE_AMD64:
1668 msg_ginfo(" (x86_64)");
1669 break;
1670 case PROCESSOR_ARCHITECTURE_INTEL:
1671 msg_ginfo(" (x86)");
1672 break;
1673 default:
1674 msg_ginfo(" (unknown arch)");
1675 break;
1676 }
1677#elif HAVE_UTSNAME == 1
1678 struct utsname osinfo;
1679
1680 uname(&osinfo);
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001681 msg_ginfo(" on %s %s (%s)", osinfo.sysname, osinfo.release,
1682 osinfo.machine);
1683#else
1684 msg_ginfo(" on unknown machine");
1685#endif
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001686}
1687
1688void print_buildinfo(void)
1689{
1690 msg_gdbg("flashrom was built with");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001691#if NEED_PCI == 1
1692#ifdef PCILIB_VERSION
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001693 msg_gdbg(" libpci %s,", PCILIB_VERSION);
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001694#else
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001695 msg_gdbg(" unknown PCI library,");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001696#endif
1697#endif
1698#ifdef __clang__
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001699 msg_gdbg(" LLVM Clang");
Carl-Daniel Hailfingerb51e58e2010-07-17 14:49:30 +00001700#ifdef __clang_version__
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001701 msg_gdbg(" %s,", __clang_version__);
Carl-Daniel Hailfingerb51e58e2010-07-17 14:49:30 +00001702#else
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001703 msg_gdbg(" unknown version (before r102686),");
Carl-Daniel Hailfingerb51e58e2010-07-17 14:49:30 +00001704#endif
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001705#elif defined(__GNUC__)
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001706 msg_gdbg(" GCC");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001707#ifdef __VERSION__
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001708 msg_gdbg(" %s,", __VERSION__);
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001709#else
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001710 msg_gdbg(" unknown version,");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001711#endif
1712#else
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001713 msg_gdbg(" unknown compiler,");
Carl-Daniel Hailfingercceafa22010-05-26 01:45:41 +00001714#endif
1715#if defined (__FLASHROM_LITTLE_ENDIAN__)
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001716 msg_gdbg(" little endian");
Carl-Daniel Hailfinger06b9efa2012-08-07 11:59:59 +00001717#elif defined (__FLASHROM_BIG_ENDIAN__)
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001718 msg_gdbg(" big endian");
Carl-Daniel Hailfinger06b9efa2012-08-07 11:59:59 +00001719#else
1720#error Endianness could not be determined
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001721#endif
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001722 msg_gdbg("\n");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001723}
1724
Bernhard Walle201bde32008-01-21 15:24:22 +00001725void print_version(void)
1726{
Carl-Daniel Hailfinger8841d3e2010-05-15 15:04:37 +00001727 msg_ginfo("flashrom v%s", flashrom_version);
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001728 print_sysinfo();
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001729 msg_ginfo("\n");
Bernhard Walle201bde32008-01-21 15:24:22 +00001730}
1731
Carl-Daniel Hailfinger8841d3e2010-05-15 15:04:37 +00001732void print_banner(void)
1733{
1734 msg_ginfo("flashrom is free software, get the source code at "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001735 "http://www.flashrom.org\n");
Carl-Daniel Hailfinger8841d3e2010-05-15 15:04:37 +00001736 msg_ginfo("\n");
1737}
1738
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001739int selfcheck(void)
1740{
Stefan Tauner96658be2014-05-26 22:05:31 +00001741 unsigned int i;
Stefan Taunera6d96482012-12-26 19:51:23 +00001742 int ret = 0;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001743
1744 /* Safety check. Instead of aborting after the first error, check
1745 * if more errors exist.
1746 */
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001747 if (ARRAY_SIZE(programmer_table) - 1 != PROGRAMMER_INVALID) {
Sean Nelson316a29f2010-05-07 20:09:04 +00001748 msg_gerr("Programmer table miscompilation!\n");
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001749 ret = 1;
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001750 }
Stefan Taunera6d96482012-12-26 19:51:23 +00001751 for (i = 0; i < PROGRAMMER_INVALID; i++) {
1752 const struct programmer_entry p = programmer_table[i];
1753 if (p.name == NULL) {
1754 msg_gerr("All programmers need a valid name, but the one with index %d does not!\n", i);
1755 ret = 1;
1756 /* This might hide other problems with this programmer, but allows for better error
1757 * messages below without jumping through hoops. */
1758 continue;
1759 }
Stefan Tauneraf358d62012-12-27 18:40:26 +00001760 switch (p.type) {
1761 case USB:
1762 case PCI:
1763 case OTHER:
1764 if (p.devs.note == NULL) {
1765 if (strcmp("internal", p.name) == 0)
1766 break; /* This one has its device list stored separately. */
1767 msg_gerr("Programmer %s has neither a device list nor a textual description!\n",
1768 p.name);
1769 ret = 1;
1770 }
1771 break;
1772 default:
1773 msg_gerr("Programmer %s does not have a valid type set!\n", p.name);
1774 ret = 1;
1775 break;
1776 }
Stefan Taunera6d96482012-12-26 19:51:23 +00001777 if (p.init == NULL) {
1778 msg_gerr("Programmer %s does not have a valid init function!\n", p.name);
1779 ret = 1;
1780 }
1781 if (p.delay == NULL) {
1782 msg_gerr("Programmer %s does not have a valid delay function!\n", p.name);
1783 ret = 1;
1784 }
1785 if (p.map_flash_region == NULL) {
1786 msg_gerr("Programmer %s does not have a valid map_flash_region function!\n", p.name);
1787 ret = 1;
1788 }
1789 if (p.unmap_flash_region == NULL) {
1790 msg_gerr("Programmer %s does not have a valid unmap_flash_region function!\n", p.name);
1791 ret = 1;
1792 }
1793 }
Stefan Tauner96658be2014-05-26 22:05:31 +00001794
1795 /* It would be favorable if we could check for the correct layout (especially termination) of various
1796 * constant arrays: flashchips, chipset_enables, board_matches, boards_known, laptops_known.
1797 * They are all defined as externs in this compilation unit so we don't know their sizes which vary
1798 * depending on compiler flags, e.g. the target architecture, and can sometimes be 0.
1799 * For 'flashchips' we export the size explicitly to work around this and to be able to implement the
1800 * checks below. */
Stefan Tauner6697f712014-08-06 15:09:15 +00001801 if (flashchips_size <= 1 || flashchips[flashchips_size - 1].name != NULL) {
Stefan Tauner7bcacb12011-05-26 01:35:19 +00001802 msg_gerr("Flashchips table miscompilation!\n");
1803 ret = 1;
Stefan Tauner96658be2014-05-26 22:05:31 +00001804 } else {
1805 for (i = 0; i < flashchips_size - 1; i++) {
1806 const struct flashchip *chip = &flashchips[i];
1807 if (chip->vendor == NULL || chip->name == NULL || chip->bustype == BUS_NONE) {
1808 ret = 1;
1809 msg_gerr("ERROR: Some field of flash chip #%d (%s) is misconfigured.\n"
1810 "Please report a bug at flashrom@flashrom.org\n", i,
1811 chip->name == NULL ? "unnamed" : chip->name);
1812 }
1813 if (selfcheck_eraseblocks(chip)) {
1814 ret = 1;
1815 }
1816 }
Stefan Tauner7bcacb12011-05-26 01:35:19 +00001817 }
Stefan Tauner7bcacb12011-05-26 01:35:19 +00001818
Stefan Tauner600576b2014-06-12 22:57:36 +00001819#if CONFIG_INTERNAL == 1
1820 ret |= selfcheck_board_enables();
1821#endif
1822
Stefan Tauner96658be2014-05-26 22:05:31 +00001823 /* TODO: implement similar sanity checks for other arrays where deemed necessary. */
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001824 return ret;
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001825}
1826
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001827/* FIXME: This function signature needs to be improved once doit() has a better
1828 * function signature.
1829 */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001830int chip_safety_check(const struct flashctx *flash, int force, int read_it, int write_it, int erase_it,
1831 int verify_it)
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001832{
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001833 const struct flashchip *chip = flash->chip;
1834
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001835 if (!programmer_may_write && (write_it || erase_it)) {
1836 msg_perr("Write/erase is not working yet on your programmer in "
1837 "its current configuration.\n");
1838 /* --force is the wrong approach, but it's the best we can do
1839 * until the generic programmer parameter parser is merged.
1840 */
1841 if (!force)
1842 return 1;
1843 msg_cerr("Continuing anyway.\n");
1844 }
1845
1846 if (read_it || erase_it || write_it || verify_it) {
1847 /* Everything needs read. */
Stefan Tauner6455dff2014-05-26 00:36:24 +00001848 if (chip->tested.read == BAD) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001849 msg_cerr("Read is not working on this chip. ");
1850 if (!force)
1851 return 1;
1852 msg_cerr("Continuing anyway.\n");
1853 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001854 if (!chip->read) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001855 msg_cerr("flashrom has no read function for this "
1856 "flash chip.\n");
1857 return 1;
1858 }
1859 }
1860 if (erase_it || write_it) {
1861 /* Write needs erase. */
Stefan Tauner6455dff2014-05-26 00:36:24 +00001862 if (chip->tested.erase == NA) {
1863 msg_cerr("Erase is not possible on this chip.\n");
1864 return 1;
1865 }
1866 if (chip->tested.erase == BAD) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001867 msg_cerr("Erase is not working on this chip. ");
1868 if (!force)
1869 return 1;
1870 msg_cerr("Continuing anyway.\n");
1871 }
Sylvain "ythier" Hitier9db45512011-07-04 07:27:17 +00001872 if(count_usable_erasers(flash) == 0) {
Stefan Tauner5368dca2011-07-01 00:19:12 +00001873 msg_cerr("flashrom has no erase function for this "
1874 "flash chip.\n");
1875 return 1;
1876 }
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001877 }
1878 if (write_it) {
Stefan Tauner6455dff2014-05-26 00:36:24 +00001879 if (chip->tested.write == NA) {
1880 msg_cerr("Write is not possible on this chip.\n");
1881 return 1;
1882 }
1883 if (chip->tested.write == BAD) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001884 msg_cerr("Write is not working on this chip. ");
1885 if (!force)
1886 return 1;
1887 msg_cerr("Continuing anyway.\n");
1888 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001889 if (!chip->write) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001890 msg_cerr("flashrom has no write function for this "
1891 "flash chip.\n");
1892 return 1;
1893 }
1894 }
1895 return 0;
1896}
1897
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001898/* This function signature is horrible. We need to design a better interface,
1899 * but right now it allows us to split off the CLI code.
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00001900 * Besides that, the function itself is a textbook example of abysmal code flow.
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001901 */
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +00001902int doit(struct flashctx *flash, int force, const char *filename, int read_it,
1903 int write_it, int erase_it, int verify_it)
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001904{
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001905 uint8_t *oldcontents;
1906 uint8_t *newcontents;
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001907 int ret = 0;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001908 unsigned long size = flash->chip->total_size * 1024;
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001909
David Hendricks77f931a2011-05-18 01:30:56 +00001910 if (chip_safety_check(flash, force, read_it, write_it, erase_it, verify_it)) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001911 msg_cerr("Aborting.\n");
Stefan Tauner20da4aa2014-05-07 22:07:23 +00001912 return 1;
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001913 }
1914
Stefan Tauner8268fdb2013-09-23 14:21:06 +00001915 if (normalize_romentries(flash)) {
1916 msg_cerr("Requested regions can not be handled. Aborting.\n");
Stefan Tauner20da4aa2014-05-07 22:07:23 +00001917 return 1;
Stefan Tauner8268fdb2013-09-23 14:21:06 +00001918 }
1919
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001920 /* Given the existence of read locks, we want to unlock for read,
1921 * erase and write.
1922 */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001923 if (flash->chip->unlock)
1924 flash->chip->unlock(flash);
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001925
1926 if (read_it) {
Stefan Tauner20da4aa2014-05-07 22:07:23 +00001927 return read_flash_to_file(flash, filename);
Carl-Daniel Hailfingerd1be52d2010-07-03 12:14:25 +00001928 }
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001929
Stefan Tauner269de352011-07-12 22:35:21 +00001930 oldcontents = malloc(size);
1931 if (!oldcontents) {
1932 msg_gerr("Out of memory!\n");
1933 exit(1);
1934 }
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001935 /* Assume worst case: All bits are 0. */
1936 memset(oldcontents, 0x00, size);
Stefan Tauner269de352011-07-12 22:35:21 +00001937 newcontents = malloc(size);
1938 if (!newcontents) {
1939 msg_gerr("Out of memory!\n");
1940 exit(1);
1941 }
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001942 /* Assume best case: All bits should be 1. */
1943 memset(newcontents, 0xff, size);
1944 /* Side effect of the assumptions above: Default write action is erase
1945 * because newcontents looks like a completely erased chip, and
1946 * oldcontents being completely 0x00 means we have to erase everything
1947 * before we can write.
1948 */
1949
Ollie Lhoefa28582004-12-08 20:10:01 +00001950 if (erase_it) {
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001951 /* FIXME: Do we really want the scary warning if erase failed?
1952 * After all, after erase the chip is either blank or partially
1953 * blank or it has the old contents. A blank chip won't boot,
1954 * so if the user wanted erase and reboots afterwards, the user
1955 * knows very well that booting won't work.
1956 */
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001957 if (erase_and_write_flash(flash, oldcontents, newcontents)) {
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00001958 emergency_help_message();
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001959 ret = 1;
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00001960 }
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001961 goto out;
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00001962 }
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001963
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00001964 if (write_it || verify_it) {
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001965 if (read_buf_from_file(newcontents, size, filename)) {
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001966 ret = 1;
1967 goto out;
Stefan Reinauer018aca82006-11-21 23:48:51 +00001968 }
1969
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +00001970#if CONFIG_INTERNAL == 1
Stefan Taunerb4e06bd2012-08-20 00:24:22 +00001971 if (programmer == PROGRAMMER_INTERNAL && cb_check_image(newcontents, size) < 0) {
1972 if (force_boardmismatch) {
1973 msg_pinfo("Proceeding anyway because user forced us to.\n");
1974 } else {
1975 msg_perr("Aborting. You can override this with "
1976 "-p internal:boardmismatch=force.\n");
Niklas Söderlund9e423762012-06-16 00:11:16 +00001977 ret = 1;
1978 goto out;
1979 }
Stefan Taunerb4e06bd2012-08-20 00:24:22 +00001980 }
Carl-Daniel Hailfinger66ef4e52009-12-13 22:28:00 +00001981#endif
Ollie Lhocbbf1252004-03-17 22:22:08 +00001982 }
1983
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001984 /* Read the whole chip to be able to check whether regions need to be
1985 * erased and to give better diagnostics in case write fails.
1986 * The alternative would be to read only the regions which are to be
1987 * preserved, but in that case we might perform unneeded erase which
1988 * takes time as well.
1989 */
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001990 msg_cinfo("Reading old flash chip contents... ");
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001991 if (flash->chip->read(flash, oldcontents, 0, size)) {
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001992 ret = 1;
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001993 msg_cinfo("FAILED.\n");
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001994 goto out;
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001995 }
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001996 msg_cinfo("done.\n");
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001997
Stefan Tauner8268fdb2013-09-23 14:21:06 +00001998 /* Build a new image taking the given layout into account. */
1999 build_new_image(flash, oldcontents, newcontents);
Uwe Hermanna7e05482007-05-09 10:17:44 +00002000
Ollie Lho184a4042005-11-26 21:55:36 +00002001 // ////////////////////////////////////////////////////////////
Uwe Hermanna7e05482007-05-09 10:17:44 +00002002
Peter Stugef31104c2008-04-28 14:47:30 +00002003 if (write_it) {
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00002004 if (erase_and_write_flash(flash, oldcontents, newcontents)) {
Stefan Taunera58f6e92014-05-10 09:25:44 +00002005 msg_cerr("Uh oh. Erase/write failed. Checking if anything has changed.\n");
2006 msg_cinfo("Reading current flash chip contents... ");
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00002007 if (!flash->chip->read(flash, newcontents, 0, size)) {
Stefan Taunera58f6e92014-05-10 09:25:44 +00002008 msg_cinfo("done.\n");
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00002009 if (!memcmp(oldcontents, newcontents, size)) {
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00002010 nonfatal_help_message();
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00002011 ret = 1;
2012 goto out;
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00002013 }
Stefan Taunera58f6e92014-05-10 09:25:44 +00002014 msg_cerr("Apparently at least some data has changed.\n");
2015 } else
2016 msg_cerr("Can't even read anymore!\n");
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00002017 emergency_help_message();
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00002018 ret = 1;
2019 goto out;
Peter Stugef31104c2008-04-28 14:47:30 +00002020 }
Peter Stugef31104c2008-04-28 14:47:30 +00002021 }
Ollie Lho184a4042005-11-26 21:55:36 +00002022
Stefan Taunerc4f44df2013-08-12 22:58:43 +00002023 /* Verify only if we either did not try to write (verify operation) or actually changed something. */
2024 if (verify_it && (!write_it || !all_skipped)) {
Stefan Tauner78ffbea2012-10-27 15:36:56 +00002025 msg_cinfo("Verifying flash... ");
2026
2027 if (write_it) {
2028 /* Work around chips which need some time to calm down. */
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00002029 programmer_delay(1000*1000);
Stefan Tauner78ffbea2012-10-27 15:36:56 +00002030 ret = verify_range(flash, newcontents, 0, size);
2031 /* If we tried to write, and verification now fails, we
2032 * might have an emergency situation.
2033 */
2034 if (ret)
2035 emergency_help_message();
2036 } else {
2037 ret = compare_range(newcontents, oldcontents, 0, size);
2038 }
2039 if (!ret)
2040 msg_cinfo("VERIFIED.\n");
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00002041 }
Ollie Lho184a4042005-11-26 21:55:36 +00002042
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00002043out:
2044 free(oldcontents);
2045 free(newcontents);
Stefan Reinauer143da0b2006-01-04 16:42:57 +00002046 return ret;
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00002047}