blob: 9df14784ede27d1ff108daf1d4fcc2aa8cbaf12e [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
Alexandre Boeglin80e64712014-12-20 20:25:19 +0000357#if CONFIG_MSTARDDC_SPI == 1
358 {
359 .name = "mstarddc_spi",
360 .type = OTHER,
361 .devs.note = "MSTAR DDC devices addressable via /dev/i2c-* on Linux.\n",
362 .init = mstarddc_spi_init,
363 .map_flash_region = fallback_map,
364 .unmap_flash_region = fallback_unmap,
365 .delay = internal_delay,
366 },
367#endif
368
Carl-Daniel Hailfinger1c6d2ff2012-08-27 00:44:42 +0000369 {0}, /* This entry corresponds to PROGRAMMER_INVALID. */
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +0000370};
Luc Verhaegen8e3a6002007-04-04 22:45:58 +0000371
Carl-Daniel Hailfinger2bee8cf2010-11-10 15:25:18 +0000372#define SHUTDOWN_MAXFN 32
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000373static int shutdown_fn_count = 0;
374struct shutdown_func_data {
David Hendricks8bb20212011-06-14 01:35:36 +0000375 int (*func) (void *data);
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000376 void *data;
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000377} static shutdown_fn[SHUTDOWN_MAXFN];
378/* Initialize to 0 to make sure nobody registers a shutdown function before
379 * programmer init.
380 */
381static int may_register_shutdown = 0;
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000382
Stefan Taunerc4f44df2013-08-12 22:58:43 +0000383/* Did we change something or was every erase/write skipped (if any)? */
384static bool all_skipped = true;
385
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +0000386static int check_block_eraser(const struct flashctx *flash, int k, int log);
Stefan Tauner5368dca2011-07-01 00:19:12 +0000387
Stefan Tauner2a1ed772014-08-31 00:09:21 +0000388int shutdown_free(void *data)
389{
390 free(data);
391 return 0;
392}
393
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000394/* Register a function to be executed on programmer shutdown.
395 * The advantage over atexit() is that you can supply a void pointer which will
396 * be used as parameter to the registered function upon programmer shutdown.
397 * This pointer can point to arbitrary data used by said function, e.g. undo
398 * information for GPIO settings etc. If unneeded, set data=NULL.
399 * Please note that the first (void *data) belongs to the function signature of
400 * the function passed as first parameter.
401 */
David Hendricks8bb20212011-06-14 01:35:36 +0000402int register_shutdown(int (*function) (void *data), void *data)
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000403{
404 if (shutdown_fn_count >= SHUTDOWN_MAXFN) {
Carl-Daniel Hailfinger9f5f2152010-06-04 23:20:21 +0000405 msg_perr("Tried to register more than %i shutdown functions.\n",
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000406 SHUTDOWN_MAXFN);
407 return 1;
408 }
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000409 if (!may_register_shutdown) {
410 msg_perr("Tried to register a shutdown function before "
411 "programmer init.\n");
412 return 1;
413 }
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000414 shutdown_fn[shutdown_fn_count].func = function;
415 shutdown_fn[shutdown_fn_count].data = data;
416 shutdown_fn_count++;
417
418 return 0;
419}
420
Nico Huberbcb2e5a2012-12-30 01:23:17 +0000421int programmer_init(enum programmer prog, const char *param)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000422{
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000423 int ret;
Carl-Daniel Hailfinger2e681602011-09-08 00:00:29 +0000424
425 if (prog >= PROGRAMMER_INVALID) {
426 msg_perr("Invalid programmer specified!\n");
427 return -1;
428 }
429 programmer = prog;
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000430 /* Initialize all programmer specific data. */
431 /* Default to unlimited decode sizes. */
432 max_rom_decode = (const struct decode_sizes) {
433 .parallel = 0xffffffff,
434 .lpc = 0xffffffff,
435 .fwh = 0xffffffff,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000436 .spi = 0xffffffff,
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000437 };
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000438 /* Default to top aligned flash at 4 GB. */
439 flashbase = 0;
440 /* Registering shutdown functions is now allowed. */
441 may_register_shutdown = 1;
Carl-Daniel Hailfingerd1be52d2010-07-03 12:14:25 +0000442 /* Default to allowing writes. Broken programmers set this to 0. */
443 programmer_may_write = 1;
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000444
445 programmer_param = param;
Carl-Daniel Hailfinger20a36ba2013-08-13 07:09:57 +0000446 msg_pdbg("Initializing %s programmer\n", programmer_table[programmer].name);
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000447 ret = programmer_table[programmer].init();
448 if (programmer_param && strlen(programmer_param)) {
Carl-Daniel Hailfinger20a36ba2013-08-13 07:09:57 +0000449 if (ret != 0) {
450 /* It is quite possible that any unhandled programmer parameter would have been valid,
451 * but an error in actual programmer init happened before the parameter was evaluated.
452 */
453 msg_pwarn("Unhandled programmer parameters (possibly due to another failure): %s\n",
454 programmer_param);
455 } else {
456 /* Actual programmer init was successful, but the user specified an invalid or unusable
457 * (for the current programmer configuration) parameter.
458 */
459 msg_perr("Unhandled programmer parameters: %s\n", programmer_param);
460 msg_perr("Aborting.\n");
461 ret = ERROR_FATAL;
462 }
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000463 }
464 return ret;
Uwe Hermann09e04f72009-05-16 22:36:00 +0000465}
466
Stefan Tauner20da4aa2014-05-07 22:07:23 +0000467/** Calls registered shutdown functions and resets internal programmer-related variables.
468 * Calling it is safe even without previous initialization, but further interactions with programmer support
469 * require a call to programmer_init() (afterwards).
470 *
471 * @return The OR-ed result values of all shutdown functions (i.e. 0 on success). */
Uwe Hermann09e04f72009-05-16 22:36:00 +0000472int programmer_shutdown(void)
473{
David Hendricks8bb20212011-06-14 01:35:36 +0000474 int ret = 0;
475
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000476 /* Registering shutdown functions is no longer allowed. */
477 may_register_shutdown = 0;
478 while (shutdown_fn_count > 0) {
479 int i = --shutdown_fn_count;
David Hendricks8bb20212011-06-14 01:35:36 +0000480 ret |= shutdown_fn[i].func(shutdown_fn[i].data);
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000481 }
Stefan Taunere34e3e82013-01-01 00:06:51 +0000482
Stefan Taunerb8911d62012-12-26 07:55:00 +0000483 programmer_param = NULL;
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000484 registered_master_count = 0;
Stefan Taunere34e3e82013-01-01 00:06:51 +0000485
David Hendricks8bb20212011-06-14 01:35:36 +0000486 return ret;
Uwe Hermann09e04f72009-05-16 22:36:00 +0000487}
488
Stefan Tauner305e0b92013-07-17 23:46:44 +0000489void *programmer_map_flash_region(const char *descr, uintptr_t phys_addr, size_t len)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000490{
Stefan Tauner26e7a152013-09-13 17:21:05 +0000491 void *ret = programmer_table[programmer].map_flash_region(descr, phys_addr, len);
492 msg_gspew("%s: mapping %s from 0x%0*" PRIxPTR " to 0x%0*" PRIxPTR "\n",
493 __func__, descr, PRIxPTR_WIDTH, phys_addr, PRIxPTR_WIDTH, (uintptr_t) ret);
494 return ret;
Uwe Hermann09e04f72009-05-16 22:36:00 +0000495}
496
497void programmer_unmap_flash_region(void *virt_addr, size_t len)
498{
499 programmer_table[programmer].unmap_flash_region(virt_addr, len);
Stefan Tauner4e32ec12014-08-30 23:39:51 +0000500 msg_gspew("%s: unmapped 0x%0*" PRIxPTR "\n", __func__, PRIxPTR_WIDTH, (uintptr_t)virt_addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000501}
502
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000503void chip_writeb(const struct flashctx *flash, uint8_t val, chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000504{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000505 flash->mst->par.chip_writeb(flash, val, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000506}
507
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000508void chip_writew(const struct flashctx *flash, uint16_t val, chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000509{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000510 flash->mst->par.chip_writew(flash, val, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000511}
512
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000513void chip_writel(const struct flashctx *flash, uint32_t val, chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000514{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000515 flash->mst->par.chip_writel(flash, val, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000516}
517
Mark Marshallf20b7be2014-05-09 21:16:21 +0000518void chip_writen(const struct flashctx *flash, const uint8_t *buf, chipaddr addr, size_t len)
Carl-Daniel Hailfinger0bd2a2b2009-06-05 18:32:07 +0000519{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000520 flash->mst->par.chip_writen(flash, buf, addr, len);
Carl-Daniel Hailfinger0bd2a2b2009-06-05 18:32:07 +0000521}
522
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000523uint8_t chip_readb(const struct flashctx *flash, const chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000524{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000525 return flash->mst->par.chip_readb(flash, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000526}
527
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000528uint16_t chip_readw(const struct flashctx *flash, const chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000529{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000530 return flash->mst->par.chip_readw(flash, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000531}
532
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000533uint32_t chip_readl(const struct flashctx *flash, const chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000534{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000535 return flash->mst->par.chip_readl(flash, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000536}
537
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000538void chip_readn(const struct flashctx *flash, uint8_t *buf, chipaddr addr,
539 size_t len)
Carl-Daniel Hailfinger0bd2a2b2009-06-05 18:32:07 +0000540{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000541 flash->mst->par.chip_readn(flash, buf, addr, len);
Carl-Daniel Hailfinger0bd2a2b2009-06-05 18:32:07 +0000542}
543
Stefan Taunerf80419c2014-05-02 15:41:42 +0000544void programmer_delay(unsigned int usecs)
Carl-Daniel Hailfingerca8bfc62009-06-05 17:48:08 +0000545{
Urja Rannikko8d7ec2a2013-10-21 21:49:08 +0000546 if (usecs > 0)
547 programmer_table[programmer].delay(usecs);
Carl-Daniel Hailfingerca8bfc62009-06-05 17:48:08 +0000548}
549
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000550int read_memmapped(struct flashctx *flash, uint8_t *buf, unsigned int start,
551 int unsigned len)
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000552{
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000553 chip_readn(flash, buf, flash->virtual_memory + start, len);
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000554
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000555 return 0;
556}
557
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000558/* This is a somewhat hacked function similar in some ways to strtok().
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000559 * It will look for needle with a subsequent '=' in haystack, return a copy of
560 * needle and remove everything from the first occurrence of needle to the next
561 * delimiter from haystack.
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000562 */
Nico Huberbcb2e5a2012-12-30 01:23:17 +0000563char *extract_param(const char *const *haystack, const char *needle, const char *delim)
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000564{
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000565 char *param_pos, *opt_pos, *rest;
566 char *opt = NULL;
567 int optlen;
Carl-Daniel Hailfinger27023762010-04-28 15:22:14 +0000568 int needlelen;
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000569
Carl-Daniel Hailfinger27023762010-04-28 15:22:14 +0000570 needlelen = strlen(needle);
571 if (!needlelen) {
572 msg_gerr("%s: empty needle! Please report a bug at "
573 "flashrom@flashrom.org\n", __func__);
574 return NULL;
575 }
576 /* No programmer parameters given. */
577 if (*haystack == NULL)
578 return NULL;
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000579 param_pos = strstr(*haystack, needle);
580 do {
581 if (!param_pos)
582 return NULL;
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000583 /* Needle followed by '='? */
584 if (param_pos[needlelen] == '=') {
585
586 /* Beginning of the string? */
587 if (param_pos == *haystack)
588 break;
589 /* After a delimiter? */
590 if (strchr(delim, *(param_pos - 1)))
591 break;
592 }
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000593 /* Continue searching. */
594 param_pos++;
595 param_pos = strstr(param_pos, needle);
596 } while (1);
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000597
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000598 if (param_pos) {
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000599 /* Get the string after needle and '='. */
600 opt_pos = param_pos + needlelen + 1;
601 optlen = strcspn(opt_pos, delim);
602 /* Return an empty string if the parameter was empty. */
603 opt = malloc(optlen + 1);
604 if (!opt) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000605 msg_gerr("Out of memory!\n");
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000606 exit(1);
607 }
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000608 strncpy(opt, opt_pos, optlen);
609 opt[optlen] = '\0';
610 rest = opt_pos + optlen;
611 /* Skip all delimiters after the current parameter. */
612 rest += strspn(rest, delim);
613 memmove(param_pos, rest, strlen(rest) + 1);
614 /* We could shrink haystack, but the effort is not worth it. */
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000615 }
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000616
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000617 return opt;
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000618}
619
Stefan Tauner66652442011-06-26 17:38:17 +0000620char *extract_programmer_param(const char *param_name)
Carl-Daniel Hailfinger2b6dcb32010-07-08 10:13:37 +0000621{
622 return extract_param(&programmer_param, param_name, ",");
623}
624
Sylvain "ythier" Hitier9db45512011-07-04 07:27:17 +0000625/* Returns the number of well-defined erasers for a chip. */
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +0000626static unsigned int count_usable_erasers(const struct flashctx *flash)
Stefan Tauner5368dca2011-07-01 00:19:12 +0000627{
628 unsigned int usable_erasefunctions = 0;
629 int k;
630 for (k = 0; k < NUM_ERASEFUNCTIONS; k++) {
631 if (!check_block_eraser(flash, k, 0))
632 usable_erasefunctions++;
633 }
634 return usable_erasefunctions;
635}
636
Mark Marshallf20b7be2014-05-09 21:16:21 +0000637static int compare_range(const uint8_t *wantbuf, const uint8_t *havebuf, unsigned int start, unsigned int len)
Stefan Tauner78ffbea2012-10-27 15:36:56 +0000638{
639 int ret = 0, failcount = 0;
640 unsigned int i;
641 for (i = 0; i < len; i++) {
642 if (wantbuf[i] != havebuf[i]) {
643 /* Only print the first failure. */
644 if (!failcount++)
645 msg_cerr("FAILED at 0x%08x! Expected=0x%02x, Found=0x%02x,",
646 start + i, wantbuf[i], havebuf[i]);
647 }
648 }
649 if (failcount) {
650 msg_cerr(" failed byte count from 0x%08x-0x%08x: 0x%x\n",
651 start, start + len - 1, failcount);
652 ret = -1;
653 }
654 return ret;
655}
656
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000657/* start is an offset to the base address of the flash chip */
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000658int check_erased_range(struct flashctx *flash, unsigned int start,
659 unsigned int len)
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000660{
661 int ret;
662 uint8_t *cmpbuf = malloc(len);
663
664 if (!cmpbuf) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000665 msg_gerr("Could not allocate memory!\n");
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000666 exit(1);
667 }
668 memset(cmpbuf, 0xff, len);
Stefan Tauner78ffbea2012-10-27 15:36:56 +0000669 ret = verify_range(flash, cmpbuf, start, len);
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000670 free(cmpbuf);
671 return ret;
672}
673
Uwe Hermann48ec1b12010-08-08 17:01:18 +0000674/*
Carl-Daniel Hailfingerd0250a32009-11-25 17:05:52 +0000675 * @cmpbuf buffer to compare against, cmpbuf[0] is expected to match the
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000676 * flash content at location start
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000677 * @start offset to the base address of the flash chip
678 * @len length of the verified area
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000679 * @return 0 for success, -1 for failure
680 */
Mark Marshallf20b7be2014-05-09 21:16:21 +0000681int verify_range(struct flashctx *flash, const uint8_t *cmpbuf, unsigned int start, unsigned int len)
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000682{
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000683 if (!len)
Stefan Taunerdf64a422014-05-27 00:06:14 +0000684 return -1;
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000685
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +0000686 if (!flash->chip->read) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000687 msg_cerr("ERROR: flashrom has no read function for this flash chip.\n");
Stefan Taunerdf64a422014-05-27 00:06:14 +0000688 return -1;
Carl-Daniel Hailfinger23290662009-06-24 08:20:45 +0000689 }
Stefan Taunerdf64a422014-05-27 00:06:14 +0000690
691 uint8_t *readbuf = malloc(len);
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000692 if (!readbuf) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000693 msg_gerr("Could not allocate memory!\n");
Stefan Taunerdf64a422014-05-27 00:06:14 +0000694 return -1;
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000695 }
Stefan Taunerdf64a422014-05-27 00:06:14 +0000696 int ret = 0;
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000697
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +0000698 if (start + len > flash->chip->total_size * 1024) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000699 msg_gerr("Error: %s called with start 0x%x + len 0x%x >"
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000700 " total_size 0x%x\n", __func__, start, len,
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +0000701 flash->chip->total_size * 1024);
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000702 ret = -1;
703 goto out_free;
704 }
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000705
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +0000706 ret = flash->chip->read(flash, readbuf, start, len);
Carl-Daniel Hailfingerd8369412010-11-16 17:21:58 +0000707 if (ret) {
708 msg_gerr("Verification impossible because read failed "
709 "at 0x%x (len 0x%x)\n", start, len);
Stefan Taunerdf64a422014-05-27 00:06:14 +0000710 ret = -1;
711 goto out_free;
Carl-Daniel Hailfingerd8369412010-11-16 17:21:58 +0000712 }
713
Stefan Tauner78ffbea2012-10-27 15:36:56 +0000714 ret = compare_range(cmpbuf, readbuf, start, len);
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000715out_free:
716 free(readbuf);
717 return ret;
718}
719
Stefan Tauner02437452013-04-01 19:34:53 +0000720/* Helper function for need_erase() that focuses on granularities of gran bytes. */
Mark Marshallf20b7be2014-05-09 21:16:21 +0000721static 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 +0000722{
723 unsigned int i, j, limit;
724 for (j = 0; j < len / gran; j++) {
725 limit = min (gran, len - j * gran);
726 /* Are 'have' and 'want' identical? */
727 if (!memcmp(have + j * gran, want + j * gran, limit))
728 continue;
729 /* have needs to be in erased state. */
730 for (i = 0; i < limit; i++)
731 if (have[j * gran + i] != 0xff)
732 return 1;
733 }
734 return 0;
735}
736
Uwe Hermann48ec1b12010-08-08 17:01:18 +0000737/*
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000738 * Check if the buffer @have can be programmed to the content of @want without
739 * erasing. This is only possible if all chunks of size @gran are either kept
740 * as-is or changed from an all-ones state to any other state.
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000741 *
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000742 * Warning: This function assumes that @have and @want point to naturally
743 * aligned regions.
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000744 *
745 * @have buffer with current content
746 * @want buffer with desired content
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000747 * @len length of the checked area
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000748 * @gran write granularity (enum, not count)
749 * @return 0 if no erase is needed, 1 otherwise
750 */
Mark Marshallf20b7be2014-05-09 21:16:21 +0000751int 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 +0000752{
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +0000753 int result = 0;
Stefan Tauner02437452013-04-01 19:34:53 +0000754 unsigned int i;
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000755
756 switch (gran) {
757 case write_gran_1bit:
758 for (i = 0; i < len; i++)
759 if ((have[i] & want[i]) != want[i]) {
760 result = 1;
761 break;
762 }
763 break;
764 case write_gran_1byte:
765 for (i = 0; i < len; i++)
766 if ((have[i] != want[i]) && (have[i] != 0xff)) {
767 result = 1;
768 break;
769 }
770 break;
771 case write_gran_256bytes:
Stefan Tauner02437452013-04-01 19:34:53 +0000772 result = need_erase_gran_bytes(have, want, len, 256);
773 break;
774 case write_gran_264bytes:
775 result = need_erase_gran_bytes(have, want, len, 264);
776 break;
777 case write_gran_512bytes:
778 result = need_erase_gran_bytes(have, want, len, 512);
779 break;
780 case write_gran_528bytes:
781 result = need_erase_gran_bytes(have, want, len, 528);
782 break;
783 case write_gran_1024bytes:
784 result = need_erase_gran_bytes(have, want, len, 1024);
785 break;
786 case write_gran_1056bytes:
787 result = need_erase_gran_bytes(have, want, len, 1056);
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000788 break;
Carl-Daniel Hailfinger1b0e9fc2014-06-16 22:36:17 +0000789 case write_gran_1byte_implicit_erase:
790 /* Do not erase, handle content changes from anything->0xff by writing 0xff. */
791 result = 0;
792 break;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000793 default:
794 msg_cerr("%s: Unsupported granularity! Please report a bug at "
795 "flashrom@flashrom.org\n", __func__);
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000796 }
797 return result;
798}
799
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000800/**
801 * Check if the buffer @have needs to be programmed to get the content of @want.
802 * If yes, return 1 and fill in first_start with the start address of the
803 * write operation and first_len with the length of the first to-be-written
804 * chunk. If not, return 0 and leave first_start and first_len undefined.
805 *
806 * Warning: This function assumes that @have and @want point to naturally
807 * aligned regions.
808 *
809 * @have buffer with current content
810 * @want buffer with desired content
811 * @len length of the checked area
812 * @gran write granularity (enum, not count)
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000813 * @first_start offset of the first byte which needs to be written (passed in
814 * value is increased by the offset of the first needed write
815 * relative to have/want or unchanged if no write is needed)
816 * @return length of the first contiguous area which needs to be written
817 * 0 if no write is needed
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000818 *
819 * FIXME: This function needs a parameter which tells it about coalescing
820 * in relation to the max write length of the programmer and the max write
821 * length of the chip.
822 */
Mark Marshallf20b7be2014-05-09 21:16:21 +0000823static unsigned int get_next_write(const uint8_t *have, const uint8_t *want, unsigned int len,
Stefan Taunerc69c9c82011-11-23 09:13:48 +0000824 unsigned int *first_start,
825 enum write_granularity gran)
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000826{
Stefan Taunerc69c9c82011-11-23 09:13:48 +0000827 int need_write = 0;
828 unsigned int rel_start = 0, first_len = 0;
829 unsigned int i, limit, stride;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000830
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000831 switch (gran) {
832 case write_gran_1bit:
833 case write_gran_1byte:
Carl-Daniel Hailfinger1b0e9fc2014-06-16 22:36:17 +0000834 case write_gran_1byte_implicit_erase:
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000835 stride = 1;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000836 break;
837 case write_gran_256bytes:
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000838 stride = 256;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000839 break;
Stefan Tauner02437452013-04-01 19:34:53 +0000840 case write_gran_264bytes:
841 stride = 264;
842 break;
843 case write_gran_512bytes:
844 stride = 512;
845 break;
846 case write_gran_528bytes:
847 stride = 528;
848 break;
849 case write_gran_1024bytes:
850 stride = 1024;
851 break;
852 case write_gran_1056bytes:
853 stride = 1056;
854 break;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000855 default:
856 msg_cerr("%s: Unsupported granularity! Please report a bug at "
857 "flashrom@flashrom.org\n", __func__);
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000858 /* Claim that no write was needed. A write with unknown
859 * granularity is too dangerous to try.
860 */
861 return 0;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000862 }
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000863 for (i = 0; i < len / stride; i++) {
864 limit = min(stride, len - i * stride);
865 /* Are 'have' and 'want' identical? */
866 if (memcmp(have + i * stride, want + i * stride, limit)) {
867 if (!need_write) {
868 /* First location where have and want differ. */
869 need_write = 1;
870 rel_start = i * stride;
871 }
872 } else {
873 if (need_write) {
874 /* First location where have and want
875 * do not differ anymore.
876 */
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000877 break;
878 }
879 }
880 }
Carl-Daniel Hailfinger202bf532010-12-06 13:05:44 +0000881 if (need_write)
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000882 first_len = min(i * stride - rel_start, len);
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000883 *first_start += rel_start;
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000884 return first_len;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000885}
886
Carl-Daniel Hailfingereaac68b2009-11-23 12:55:31 +0000887/* This function generates various test patterns useful for testing controller
888 * and chip communication as well as chip behaviour.
889 *
890 * If a byte can be written multiple times, each time keeping 0-bits at 0
891 * and changing 1-bits to 0 if the new value for that bit is 0, the effect
892 * is essentially an AND operation. That's also the reason why this function
893 * provides the result of AND between various patterns.
894 *
895 * Below is a list of patterns (and their block length).
896 * Pattern 0 is 05 15 25 35 45 55 65 75 85 95 a5 b5 c5 d5 e5 f5 (16 Bytes)
897 * Pattern 1 is 0a 1a 2a 3a 4a 5a 6a 7a 8a 9a aa ba ca da ea fa (16 Bytes)
898 * Pattern 2 is 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f (16 Bytes)
899 * Pattern 3 is a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af (16 Bytes)
900 * Pattern 4 is 00 10 20 30 40 50 60 70 80 90 a0 b0 c0 d0 e0 f0 (16 Bytes)
901 * Pattern 5 is 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f (16 Bytes)
902 * Pattern 6 is 00 (1 Byte)
903 * Pattern 7 is ff (1 Byte)
904 * Patterns 0-7 have a big-endian block number in the last 2 bytes of each 256
905 * byte block.
906 *
907 * Pattern 8 is 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11... (256 B)
908 * Pattern 9 is ff fe fd fc fb fa f9 f8 f7 f6 f5 f4 f3 f2 f1 f0 ef ee... (256 B)
909 * Pattern 10 is 00 00 00 01 00 02 00 03 00 04... (128 kB big-endian counter)
910 * Pattern 11 is ff ff ff fe ff fd ff fc ff fb... (128 kB big-endian downwards)
911 * Pattern 12 is 00 (1 Byte)
912 * Pattern 13 is ff (1 Byte)
913 * Patterns 8-13 have no block number.
914 *
915 * Patterns 0-3 are created to detect and efficiently diagnose communication
916 * slips like missed bits or bytes and their repetitive nature gives good visual
917 * cues to the person inspecting the results. In addition, the following holds:
918 * AND Pattern 0/1 == Pattern 4
919 * AND Pattern 2/3 == Pattern 5
920 * AND Pattern 0/1/2/3 == AND Pattern 4/5 == Pattern 6
921 * A weakness of pattern 0-5 is the inability to detect swaps/copies between
922 * any two 16-byte blocks except for the last 16-byte block in a 256-byte bloc.
923 * They work perfectly for detecting any swaps/aliasing of blocks >= 256 bytes.
924 * 0x5 and 0xa were picked because they are 0101 and 1010 binary.
925 * Patterns 8-9 are best for detecting swaps/aliasing of blocks < 256 bytes.
926 * Besides that, they provide for bit testing of the last two bytes of every
927 * 256 byte block which contains the block number for patterns 0-6.
928 * Patterns 10-11 are special purpose for detecting subblock aliasing with
929 * block sizes >256 bytes (some Dataflash chips etc.)
930 * AND Pattern 8/9 == Pattern 12
931 * AND Pattern 10/11 == Pattern 12
932 * Pattern 13 is the completely erased state.
933 * None of the patterns can detect aliasing at boundaries which are a multiple
934 * of 16 MBytes (but such chips do not exist anyway for Parallel/LPC/FWH/SPI).
935 */
936int generate_testpattern(uint8_t *buf, uint32_t size, int variant)
937{
938 int i;
939
940 if (!buf) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000941 msg_gerr("Invalid buffer!\n");
Carl-Daniel Hailfingereaac68b2009-11-23 12:55:31 +0000942 return 1;
943 }
944
945 switch (variant) {
946 case 0:
947 for (i = 0; i < size; i++)
948 buf[i] = (i & 0xf) << 4 | 0x5;
949 break;
950 case 1:
951 for (i = 0; i < size; i++)
952 buf[i] = (i & 0xf) << 4 | 0xa;
953 break;
954 case 2:
955 for (i = 0; i < size; i++)
956 buf[i] = 0x50 | (i & 0xf);
957 break;
958 case 3:
959 for (i = 0; i < size; i++)
960 buf[i] = 0xa0 | (i & 0xf);
961 break;
962 case 4:
963 for (i = 0; i < size; i++)
964 buf[i] = (i & 0xf) << 4;
965 break;
966 case 5:
967 for (i = 0; i < size; i++)
968 buf[i] = i & 0xf;
969 break;
970 case 6:
971 memset(buf, 0x00, size);
972 break;
973 case 7:
974 memset(buf, 0xff, size);
975 break;
976 case 8:
977 for (i = 0; i < size; i++)
978 buf[i] = i & 0xff;
979 break;
980 case 9:
981 for (i = 0; i < size; i++)
982 buf[i] = ~(i & 0xff);
983 break;
984 case 10:
985 for (i = 0; i < size % 2; i++) {
986 buf[i * 2] = (i >> 8) & 0xff;
987 buf[i * 2 + 1] = i & 0xff;
988 }
989 if (size & 0x1)
990 buf[i * 2] = (i >> 8) & 0xff;
991 break;
992 case 11:
993 for (i = 0; i < size % 2; i++) {
994 buf[i * 2] = ~((i >> 8) & 0xff);
995 buf[i * 2 + 1] = ~(i & 0xff);
996 }
997 if (size & 0x1)
998 buf[i * 2] = ~((i >> 8) & 0xff);
999 break;
1000 case 12:
1001 memset(buf, 0x00, size);
1002 break;
1003 case 13:
1004 memset(buf, 0xff, size);
1005 break;
1006 }
1007
1008 if ((variant >= 0) && (variant <= 7)) {
1009 /* Write block number in the last two bytes of each 256-byte
1010 * block, big endian for easier reading of the hexdump.
1011 * Note that this wraps around for chips larger than 2^24 bytes
1012 * (16 MB).
1013 */
1014 for (i = 0; i < size / 256; i++) {
1015 buf[i * 256 + 254] = (i >> 8) & 0xff;
1016 buf[i * 256 + 255] = i & 0xff;
1017 }
1018 }
1019
1020 return 0;
1021}
1022
Stefan Tauner9e3a6982014-08-15 17:17:59 +00001023/* Returns the number of busses commonly supported by the current programmer and flash chip where the latter
1024 * can not be completely accessed due to size/address limits of the programmer. */
1025unsigned int count_max_decode_exceedings(const struct flashctx *flash)
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001026{
Stefan Tauner9e3a6982014-08-15 17:17:59 +00001027 unsigned int limitexceeded = 0;
1028 uint32_t size = flash->chip->total_size * 1024;
1029 enum chipbustype buses = flash->mst->buses_supported & flash->chip->bustype;
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001030
1031 if ((buses & BUS_PARALLEL) && (max_rom_decode.parallel < size)) {
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001032 limitexceeded++;
Sean Nelson316a29f2010-05-07 20:09:04 +00001033 msg_pdbg("Chip size %u kB is bigger than supported "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001034 "size %u kB of chipset/board/programmer "
1035 "for %s interface, "
1036 "probe/read/erase/write may fail. ", size / 1024,
1037 max_rom_decode.parallel / 1024, "Parallel");
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001038 }
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001039 if ((buses & BUS_LPC) && (max_rom_decode.lpc < size)) {
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001040 limitexceeded++;
Sean Nelson316a29f2010-05-07 20:09:04 +00001041 msg_pdbg("Chip size %u kB is bigger than supported "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001042 "size %u kB of chipset/board/programmer "
1043 "for %s interface, "
1044 "probe/read/erase/write may fail. ", size / 1024,
1045 max_rom_decode.lpc / 1024, "LPC");
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001046 }
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001047 if ((buses & BUS_FWH) && (max_rom_decode.fwh < size)) {
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001048 limitexceeded++;
Sean Nelson316a29f2010-05-07 20:09:04 +00001049 msg_pdbg("Chip size %u kB is bigger than supported "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001050 "size %u kB of chipset/board/programmer "
1051 "for %s interface, "
1052 "probe/read/erase/write may fail. ", size / 1024,
1053 max_rom_decode.fwh / 1024, "FWH");
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001054 }
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001055 if ((buses & BUS_SPI) && (max_rom_decode.spi < size)) {
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001056 limitexceeded++;
Sean Nelson316a29f2010-05-07 20:09:04 +00001057 msg_pdbg("Chip size %u kB is bigger than supported "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001058 "size %u kB of chipset/board/programmer "
1059 "for %s interface, "
1060 "probe/read/erase/write may fail. ", size / 1024,
1061 max_rom_decode.spi / 1024, "SPI");
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001062 }
Stefan Tauner9e3a6982014-08-15 17:17:59 +00001063 return limitexceeded;
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001064}
1065
Stefan Tauner4e32ec12014-08-30 23:39:51 +00001066void unmap_flash(struct flashctx *flash)
1067{
1068 if (flash->virtual_registers != (chipaddr)ERROR_PTR) {
1069 programmer_unmap_flash_region((void *)flash->virtual_registers, flash->chip->total_size * 1024);
1070 flash->physical_registers = 0;
1071 flash->virtual_registers = (chipaddr)ERROR_PTR;
1072 }
1073
1074 if (flash->virtual_memory != (chipaddr)ERROR_PTR) {
1075 programmer_unmap_flash_region((void *)flash->virtual_memory, flash->chip->total_size * 1024);
1076 flash->physical_memory = 0;
1077 flash->virtual_memory = (chipaddr)ERROR_PTR;
1078 }
1079}
1080
1081int map_flash(struct flashctx *flash)
1082{
1083 /* Init pointers to the fail-safe state to distinguish them later from legit values. */
1084 flash->virtual_memory = (chipaddr)ERROR_PTR;
1085 flash->virtual_registers = (chipaddr)ERROR_PTR;
1086
1087 /* FIXME: This avoids mapping (and unmapping) of flash chip definitions with size 0.
1088 * These are used for various probing-related hacks that would not map successfully anyway and should be
1089 * removed ASAP. */
1090 if (flash->chip->total_size == 0)
1091 return 0;
1092
1093 const chipsize_t size = flash->chip->total_size * 1024;
1094 uintptr_t base = flashbase ? flashbase : (0xffffffff - size + 1);
1095 void *addr = programmer_map_flash_region(flash->chip->name, base, size);
1096 if (addr == ERROR_PTR) {
1097 msg_perr("Could not map flash chip %s at 0x%0*" PRIxPTR ".\n",
1098 flash->chip->name, PRIxPTR_WIDTH, base);
1099 return 1;
1100 }
1101 flash->physical_memory = base;
1102 flash->virtual_memory = (chipaddr)addr;
1103
1104 /* FIXME: Special function registers normally live 4 MByte below flash space, but it might be somewhere
1105 * completely different on some chips and programmers, or not mappable at all.
1106 * Ignore these problems for now and always report success. */
1107 if (flash->chip->feature_bits & FEATURE_REGISTERMAP) {
1108 base = 0xffffffff - size - 0x400000 + 1;
1109 addr = programmer_map_flash_region("flash chip registers", base, size);
1110 if (addr == ERROR_PTR) {
1111 msg_pdbg2("Could not map flash chip registers %s at 0x%0*" PRIxPTR ".\n",
1112 flash->chip->name, PRIxPTR_WIDTH, base);
1113 return 0;
1114 }
1115 flash->physical_registers = base;
1116 flash->virtual_registers = (chipaddr)addr;
1117 }
1118 return 0;
1119}
1120
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +00001121int probe_flash(struct registered_master *mst, int startchip, struct flashctx *flash, int force)
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001122{
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001123 const struct flashchip *chip;
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001124 enum chipbustype buses_common;
Carl-Daniel Hailfingerb22918c2009-06-01 02:08:58 +00001125 char *tmp;
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001126
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001127 for (chip = flashchips + startchip; chip && chip->name; chip++) {
1128 if (chip_to_probe && strcmp(chip->name, chip_to_probe) != 0)
Ollie Lhocbbf1252004-03-17 22:22:08 +00001129 continue;
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +00001130 buses_common = mst->buses_supported & chip->bustype;
Carl-Daniel Hailfingerc40cff72011-12-20 00:19:29 +00001131 if (!buses_common)
Carl-Daniel Hailfinger6573b742011-06-17 22:38:53 +00001132 continue;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001133 msg_gdbg("Probing for %s %s, %d kB: ", chip->vendor, chip->name, chip->total_size);
1134 if (!chip->probe && !force) {
1135 msg_gdbg("failed! flashrom has no probe function for this flash chip.\n");
Carl-Daniel Hailfingerb22918c2009-06-01 02:08:58 +00001136 continue;
1137 }
Stefan Reinauer70385642007-04-06 11:58:03 +00001138
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001139 /* Start filling in the dynamic data. */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001140 flash->chip = calloc(1, sizeof(struct flashchip));
1141 if (!flash->chip) {
1142 msg_gerr("Out of memory!\n");
1143 exit(1);
1144 }
1145 memcpy(flash->chip, chip, sizeof(struct flashchip));
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +00001146 flash->mst = mst;
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001147
Stefan Tauner4e32ec12014-08-30 23:39:51 +00001148 if (map_flash(flash) != 0)
1149 return -1;
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001150
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001151 /* We handle a forced match like a real match, we just avoid probing. Note that probe_flash()
1152 * is only called with force=1 after normal probing failed.
1153 */
Peter Stuge27c3e2d2008-07-02 17:15:47 +00001154 if (force)
1155 break;
Stefan Reinauerfcb63682006-03-16 16:57:41 +00001156
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001157 if (flash->chip->probe(flash) != 1)
Peter Stuge483b8f02008-09-03 23:10:05 +00001158 goto notfound;
1159
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001160 /* If this is the first chip found, accept it.
1161 * If this is not the first chip found, accept it only if it is
Stefan Taunerac1b4c82012-02-17 14:51:04 +00001162 * a non-generic match. SFDP and CFI are generic matches.
1163 * startchip==0 means this call to probe_flash() is the first
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +00001164 * one for this programmer interface (master) and thus no other chip has
Stefan Taunerac1b4c82012-02-17 14:51:04 +00001165 * been found on this interface.
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001166 */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001167 if (startchip == 0 && flash->chip->model_id == SFDP_DEVICE_ID) {
Stefan Taunerac1b4c82012-02-17 14:51:04 +00001168 msg_cinfo("===\n"
1169 "SFDP has autodetected a flash chip which is "
1170 "not natively supported by flashrom yet.\n");
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001171 if (count_usable_erasers(flash) == 0)
Stefan Taunerac1b4c82012-02-17 14:51:04 +00001172 msg_cinfo("The standard operations read and "
1173 "verify should work, but to support "
1174 "erase, write and all other "
1175 "possible features");
1176 else
1177 msg_cinfo("All standard operations (read, "
1178 "verify, erase and write) should "
1179 "work, but to support all possible "
1180 "features");
1181
Stefan Taunerb4e06bd2012-08-20 00:24:22 +00001182 msg_cinfo(" we need to add them manually.\n"
1183 "You can help us by mailing us the output of the following command to "
1184 "flashrom@flashrom.org:\n"
1185 "'flashrom -VV [plus the -p/--programmer parameter]'\n"
1186 "Thanks for your help!\n"
Stefan Taunerac1b4c82012-02-17 14:51:04 +00001187 "===\n");
1188 }
1189
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001190 /* First flash chip detected on this bus. */
1191 if (startchip == 0)
Peter Stuge27c3e2d2008-07-02 17:15:47 +00001192 break;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001193 /* Not the first flash chip detected on this bus, but not a generic match either. */
1194 if ((flash->chip->model_id != GENERIC_DEVICE_ID) && (flash->chip->model_id != SFDP_DEVICE_ID))
1195 break;
1196 /* 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 +00001197notfound:
Stefan Tauner4e32ec12014-08-30 23:39:51 +00001198 unmap_flash(flash);
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001199 free(flash->chip);
1200 flash->chip = NULL;
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001201 }
Uwe Hermannffec5f32007-08-23 16:08:21 +00001202
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001203 if (!flash->chip)
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001204 return -1;
Peter Stuge27c3e2d2008-07-02 17:15:47 +00001205
Stefan Reinauer051e2362011-01-19 06:21:54 +00001206
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001207 tmp = flashbuses_to_text(flash->chip->bustype);
Stefan Tauner4e32ec12014-08-30 23:39:51 +00001208 msg_cinfo("%s %s flash chip \"%s\" (%d kB, %s) ", force ? "Assuming" : "Found",
1209 flash->chip->vendor, flash->chip->name, flash->chip->total_size, tmp);
Stefan Tauner00155492011-06-26 20:45:35 +00001210 free(tmp);
Stefan Tauner4e32ec12014-08-30 23:39:51 +00001211#if CONFIG_INTERNAL == 1
1212 if (programmer_table[programmer].map_flash_region == physmap)
1213 msg_cinfo("mapped at physical address 0x%0*" PRIxPTR ".\n",
1214 PRIxPTR_WIDTH, flash->physical_memory);
1215 else
1216#endif
1217 msg_cinfo("on %s.\n", programmer_table[programmer].name);
Uwe Hermann9899cad2009-06-28 21:47:57 +00001218
Stefan Tauner4e32ec12014-08-30 23:39:51 +00001219 /* Flash registers may more likely not be mapped if the chip was forced.
1220 * Lock info may be stored in registers, so avoid lock info printing. */
Carl-Daniel Hailfinger859f3f02010-12-02 21:59:42 +00001221 if (!force)
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001222 if (flash->chip->printlock)
1223 flash->chip->printlock(flash);
Sean Nelson6e0b9122010-02-19 00:52:10 +00001224
Stefan Tauner4e32ec12014-08-30 23:39:51 +00001225 /* Get out of the way for later runs. */
1226 unmap_flash(flash);
1227
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001228 /* Return position of matching chip. */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001229 return chip - flashchips;
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001230}
1231
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001232int read_buf_from_file(unsigned char *buf, unsigned long size,
1233 const char *filename)
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001234{
Nico Huber7562f7d2013-08-30 21:29:45 +00001235#ifdef __LIBPAYLOAD__
1236 msg_gerr("Error: No file I/O support in libpayload\n");
1237 return 1;
1238#else
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001239 unsigned long numbytes;
1240 FILE *image;
1241 struct stat image_stat;
1242
1243 if ((image = fopen(filename, "rb")) == NULL) {
Stefan Tauner363fd7e2013-04-07 13:08:30 +00001244 msg_gerr("Error: opening file \"%s\" failed: %s\n", filename, strerror(errno));
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001245 return 1;
1246 }
1247 if (fstat(fileno(image), &image_stat) != 0) {
Stefan Tauner363fd7e2013-04-07 13:08:30 +00001248 msg_gerr("Error: getting metadata of file \"%s\" failed: %s\n", filename, strerror(errno));
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001249 fclose(image);
1250 return 1;
1251 }
1252 if (image_stat.st_size != size) {
Carl-Daniel Hailfinger11990da2013-07-13 23:21:05 +00001253 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 +00001254 (intmax_t)image_stat.st_size, size);
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001255 fclose(image);
1256 return 1;
1257 }
1258 numbytes = fread(buf, 1, size, image);
1259 if (fclose(image)) {
Stefan Tauner363fd7e2013-04-07 13:08:30 +00001260 msg_gerr("Error: closing file \"%s\" failed: %s\n", filename, strerror(errno));
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001261 return 1;
1262 }
1263 if (numbytes != size) {
1264 msg_gerr("Error: Failed to read complete file. Got %ld bytes, "
1265 "wanted %ld!\n", numbytes, size);
1266 return 1;
1267 }
1268 return 0;
Nico Huber7562f7d2013-08-30 21:29:45 +00001269#endif
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001270}
1271
Mark Marshallf20b7be2014-05-09 21:16:21 +00001272int write_buf_to_file(const unsigned char *buf, unsigned long size, const char *filename)
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001273{
Nico Huber7562f7d2013-08-30 21:29:45 +00001274#ifdef __LIBPAYLOAD__
1275 msg_gerr("Error: No file I/O support in libpayload\n");
1276 return 1;
1277#else
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001278 unsigned long numbytes;
1279 FILE *image;
Stephan Guilloux21dd55b2009-06-01 22:07:52 +00001280
1281 if (!filename) {
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001282 msg_gerr("No filename specified.\n");
Stephan Guilloux21dd55b2009-06-01 22:07:52 +00001283 return 1;
1284 }
Patrick Georgi0bf842d2010-01-25 22:55:33 +00001285 if ((image = fopen(filename, "wb")) == NULL) {
Stefan Tauner363fd7e2013-04-07 13:08:30 +00001286 msg_gerr("Error: opening file \"%s\" failed: %s\n", filename, strerror(errno));
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00001287 return 1;
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001288 }
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001289
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001290 numbytes = fwrite(buf, 1, size, image);
1291 fclose(image);
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001292 if (numbytes != size) {
1293 msg_gerr("File %s could not be written completely.\n",
1294 filename);
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001295 return 1;
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001296 }
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001297 return 0;
Nico Huber7562f7d2013-08-30 21:29:45 +00001298#endif
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001299}
1300
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001301int read_flash_to_file(struct flashctx *flash, const char *filename)
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001302{
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001303 unsigned long size = flash->chip->total_size * 1024;
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001304 unsigned char *buf = calloc(size, sizeof(char));
1305 int ret = 0;
1306
1307 msg_cinfo("Reading flash... ");
1308 if (!buf) {
1309 msg_gerr("Memory allocation failed!\n");
1310 msg_cinfo("FAILED.\n");
1311 return 1;
1312 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001313 if (!flash->chip->read) {
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001314 msg_cerr("No read function available for this flash chip.\n");
1315 ret = 1;
1316 goto out_free;
1317 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001318 if (flash->chip->read(flash, buf, 0, size)) {
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001319 msg_cerr("Read operation failed!\n");
1320 ret = 1;
1321 goto out_free;
1322 }
1323
Stefan Tauner355cbfd2011-05-28 02:37:14 +00001324 ret = write_buf_to_file(buf, size, filename);
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001325out_free:
1326 free(buf);
1327 msg_cinfo("%s.\n", ret ? "FAILED" : "done");
1328 return ret;
1329}
1330
Stefan Tauner96658be2014-05-26 22:05:31 +00001331/* Even if an error is found, the function will keep going and check the rest. */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001332static int selfcheck_eraseblocks(const struct flashchip *chip)
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001333{
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +00001334 int i, j, k;
1335 int ret = 0;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001336
1337 for (k = 0; k < NUM_ERASEFUNCTIONS; k++) {
1338 unsigned int done = 0;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001339 struct block_eraser eraser = chip->block_erasers[k];
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001340
1341 for (i = 0; i < NUM_ERASEREGIONS; i++) {
1342 /* Blocks with zero size are bugs in flashchips.c. */
1343 if (eraser.eraseblocks[i].count &&
1344 !eraser.eraseblocks[i].size) {
1345 msg_gerr("ERROR: Flash chip %s erase function "
1346 "%i region %i has size 0. Please report"
1347 " a bug at flashrom@flashrom.org\n",
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001348 chip->name, k, i);
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001349 ret = 1;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001350 }
1351 /* Blocks with zero count are bugs in flashchips.c. */
1352 if (!eraser.eraseblocks[i].count &&
1353 eraser.eraseblocks[i].size) {
1354 msg_gerr("ERROR: Flash chip %s erase function "
1355 "%i region %i has count 0. Please report"
1356 " a bug at flashrom@flashrom.org\n",
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001357 chip->name, k, i);
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001358 ret = 1;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001359 }
1360 done += eraser.eraseblocks[i].count *
1361 eraser.eraseblocks[i].size;
1362 }
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001363 /* Empty eraseblock definition with erase function. */
1364 if (!done && eraser.block_erase)
Sean Nelson316a29f2010-05-07 20:09:04 +00001365 msg_gspew("Strange: Empty eraseblock definition with "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001366 "non-empty erase function. Not an error.\n");
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001367 if (!done)
1368 continue;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001369 if (done != chip->total_size * 1024) {
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001370 msg_gerr("ERROR: Flash chip %s erase function %i "
1371 "region walking resulted in 0x%06x bytes total,"
1372 " expected 0x%06x bytes. Please report a bug at"
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001373 " flashrom@flashrom.org\n", chip->name, k,
1374 done, chip->total_size * 1024);
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001375 ret = 1;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001376 }
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001377 if (!eraser.block_erase)
1378 continue;
1379 /* Check if there are identical erase functions for different
1380 * layouts. That would imply "magic" erase functions. The
1381 * easiest way to check this is with function pointers.
1382 */
Uwe Hermann43959702010-03-13 17:28:29 +00001383 for (j = k + 1; j < NUM_ERASEFUNCTIONS; j++) {
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001384 if (eraser.block_erase ==
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001385 chip->block_erasers[j].block_erase) {
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001386 msg_gerr("ERROR: Flash chip %s erase function "
1387 "%i and %i are identical. Please report"
1388 " a bug at flashrom@flashrom.org\n",
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001389 chip->name, k, j);
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001390 ret = 1;
1391 }
Uwe Hermann43959702010-03-13 17:28:29 +00001392 }
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001393 }
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001394 return ret;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001395}
1396
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001397static int erase_and_write_block_helper(struct flashctx *flash,
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001398 unsigned int start, unsigned int len,
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001399 uint8_t *curcontents,
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001400 uint8_t *newcontents,
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001401 int (*erasefn) (struct flashctx *flash,
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001402 unsigned int addr,
1403 unsigned int len))
1404{
Stefan Taunerc69c9c82011-11-23 09:13:48 +00001405 unsigned int starthere = 0, lenhere = 0;
1406 int ret = 0, skip = 1, writecount = 0;
Stefan Tauner50d67aa2013-03-03 23:49:48 +00001407 enum write_granularity gran = flash->chip->gran;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001408
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001409 /* curcontents and newcontents are opaque to walk_eraseregions, and
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001410 * need to be adjusted here to keep the impression of proper abstraction
1411 */
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001412 curcontents += start;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001413 newcontents += start;
1414 msg_cdbg(":");
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001415 if (need_erase(curcontents, newcontents, len, gran)) {
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001416 msg_cdbg("E");
1417 ret = erasefn(flash, start, len);
1418 if (ret)
1419 return ret;
Carl-Daniel Hailfingerb4061f62011-06-26 17:04:16 +00001420 if (check_erased_range(flash, start, len)) {
1421 msg_cerr("ERASE FAILED!\n");
1422 return -1;
1423 }
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001424 /* Erase was successful. Adjust curcontents. */
1425 memset(curcontents, 0xff, len);
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001426 skip = 0;
1427 }
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001428 /* get_next_write() sets starthere to a new value after the call. */
1429 while ((lenhere = get_next_write(curcontents + starthere,
1430 newcontents + starthere,
1431 len - starthere, &starthere, gran))) {
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001432 if (!writecount++)
1433 msg_cdbg("W");
1434 /* Needs the partial write function signature. */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001435 ret = flash->chip->write(flash, newcontents + starthere,
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001436 start + starthere, lenhere);
1437 if (ret)
1438 return ret;
1439 starthere += lenhere;
1440 skip = 0;
1441 }
1442 if (skip)
1443 msg_cdbg("S");
Stefan Tauner682122b2013-06-23 22:15:39 +00001444 else
1445 all_skipped = false;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001446 return ret;
1447}
1448
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001449static int walk_eraseregions(struct flashctx *flash, int erasefunction,
1450 int (*do_something) (struct flashctx *flash,
Carl-Daniel Hailfinger4d3e9ca2010-07-13 00:42:00 +00001451 unsigned int addr,
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001452 unsigned int len,
1453 uint8_t *param1,
1454 uint8_t *param2,
1455 int (*erasefn) (
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001456 struct flashctx *flash,
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001457 unsigned int addr,
1458 unsigned int len)),
1459 void *param1, void *param2)
Carl-Daniel Hailfingera1223412010-07-13 00:37:19 +00001460{
1461 int i, j;
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +00001462 unsigned int start = 0;
1463 unsigned int len;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001464 struct block_eraser eraser = flash->chip->block_erasers[erasefunction];
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001465
Carl-Daniel Hailfingera1223412010-07-13 00:37:19 +00001466 for (i = 0; i < NUM_ERASEREGIONS; i++) {
1467 /* count==0 for all automatically initialized array
1468 * members so the loop below won't be executed for them.
1469 */
1470 len = eraser.eraseblocks[i].size;
1471 for (j = 0; j < eraser.eraseblocks[i].count; j++) {
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001472 /* Print this for every block except the first one. */
1473 if (i || j)
1474 msg_cdbg(", ");
1475 msg_cdbg("0x%06x-0x%06x", start,
Carl-Daniel Hailfingera1223412010-07-13 00:37:19 +00001476 start + len - 1);
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001477 if (do_something(flash, start, len, param1, param2,
1478 eraser.block_erase)) {
Carl-Daniel Hailfingera1223412010-07-13 00:37:19 +00001479 return 1;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001480 }
Carl-Daniel Hailfingera1223412010-07-13 00:37:19 +00001481 start += len;
1482 }
1483 }
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001484 msg_cdbg("\n");
Carl-Daniel Hailfingera1223412010-07-13 00:37:19 +00001485 return 0;
1486}
1487
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001488static int check_block_eraser(const struct flashctx *flash, int k, int log)
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001489{
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001490 struct block_eraser eraser = flash->chip->block_erasers[k];
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001491
1492 if (!eraser.block_erase && !eraser.eraseblocks[0].count) {
1493 if (log)
1494 msg_cdbg("not defined. ");
1495 return 1;
1496 }
1497 if (!eraser.block_erase && eraser.eraseblocks[0].count) {
1498 if (log)
1499 msg_cdbg("eraseblock layout is known, but matching "
Stefan Tauner355cbfd2011-05-28 02:37:14 +00001500 "block erase function is not implemented. ");
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001501 return 1;
1502 }
1503 if (eraser.block_erase && !eraser.eraseblocks[0].count) {
1504 if (log)
1505 msg_cdbg("block erase function found, but "
Stefan Tauner355cbfd2011-05-28 02:37:14 +00001506 "eraseblock layout is not defined. ");
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001507 return 1;
1508 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001509 // TODO: Once erase functions are annotated with allowed buses, check that as well.
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001510 return 0;
1511}
1512
Mark Marshallf20b7be2014-05-09 21:16:21 +00001513int erase_and_write_flash(struct flashctx *flash, uint8_t *oldcontents, uint8_t *newcontents)
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001514{
Carl-Daniel Hailfingerd8334db2011-07-21 21:21:04 +00001515 int k, ret = 1;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001516 uint8_t *curcontents;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001517 unsigned long size = flash->chip->total_size * 1024;
Sylvain "ythier" Hitier9db45512011-07-04 07:27:17 +00001518 unsigned int usable_erasefunctions = count_usable_erasers(flash);
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001519
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001520 msg_cinfo("Erasing and writing flash chip... ");
Stefan Tauner269de352011-07-12 22:35:21 +00001521 curcontents = malloc(size);
1522 if (!curcontents) {
1523 msg_gerr("Out of memory!\n");
1524 exit(1);
1525 }
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001526 /* Copy oldcontents to curcontents to avoid clobbering oldcontents. */
1527 memcpy(curcontents, oldcontents, size);
1528
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001529 for (k = 0; k < NUM_ERASEFUNCTIONS; k++) {
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001530 if (k != 0)
Stefan Tauner16878542014-07-13 23:53:40 +00001531 msg_cinfo("Looking for another erase function.\n");
Carl-Daniel Hailfingerd8334db2011-07-21 21:21:04 +00001532 if (!usable_erasefunctions) {
Stefan Tauner16878542014-07-13 23:53:40 +00001533 msg_cinfo("No usable erase functions left.\n");
Carl-Daniel Hailfingerd8334db2011-07-21 21:21:04 +00001534 break;
1535 }
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001536 msg_cdbg("Trying erase function %i... ", k);
1537 if (check_block_eraser(flash, k, 1))
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001538 continue;
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001539 usable_erasefunctions--;
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001540 ret = walk_eraseregions(flash, k, &erase_and_write_block_helper,
1541 curcontents, newcontents);
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001542 /* If everything is OK, don't try another erase function. */
1543 if (!ret)
1544 break;
Carl-Daniel Hailfingerb23b1eb2010-12-02 02:41:55 +00001545 /* Write/erase failed, so try to find out what the current chip
Carl-Daniel Hailfingerd8334db2011-07-21 21:21:04 +00001546 * contents are. If no usable erase functions remain, we can
1547 * skip this: the next iteration will break immediately anyway.
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001548 */
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001549 if (!usable_erasefunctions)
1550 continue;
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001551 /* Reading the whole chip may take a while, inform the user even
1552 * in non-verbose mode.
1553 */
1554 msg_cinfo("Reading current flash chip contents... ");
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001555 if (flash->chip->read(flash, curcontents, 0, size)) {
Carl-Daniel Hailfingerb23b1eb2010-12-02 02:41:55 +00001556 /* Now we are truly screwed. Read failed as well. */
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001557 msg_cerr("Can't read anymore! Aborting.\n");
Carl-Daniel Hailfingerb23b1eb2010-12-02 02:41:55 +00001558 /* We have no idea about the flash chip contents, so
1559 * retrying with another erase function is pointless.
1560 */
1561 break;
1562 }
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001563 msg_cinfo("done. ");
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001564 }
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001565 /* Free the scratchpad. */
1566 free(curcontents);
Carl-Daniel Hailfingerf160a122009-05-08 17:15:15 +00001567
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001568 if (ret) {
Sean Nelson316a29f2010-05-07 20:09:04 +00001569 msg_cerr("FAILED!\n");
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001570 } else {
Stefan Tauner682122b2013-06-23 22:15:39 +00001571 if (all_skipped)
1572 msg_cinfo("\nWarning: Chip content is identical to the requested image.\n");
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001573 msg_cinfo("Erase/write done.\n");
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001574 }
1575 return ret;
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001576}
1577
Stefan Tauner136388f2013-07-15 10:47:53 +00001578static void nonfatal_help_message(void)
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001579{
Stefan Taunera58f6e92014-05-10 09:25:44 +00001580 msg_gerr("Good, writing to the flash chip apparently didn't do anything.\n");
Stefan Tauner136388f2013-07-15 10:47:53 +00001581#if CONFIG_INTERNAL == 1
1582 if (programmer == PROGRAMMER_INTERNAL)
1583 msg_gerr("This means we have to add special support for your board, programmer or flash\n"
1584 "chip. Please report this on IRC at chat.freenode.net (channel #flashrom) or\n"
1585 "mail flashrom@flashrom.org, thanks!\n"
1586 "-------------------------------------------------------------------------------\n"
1587 "You may now reboot or simply leave the machine running.\n");
1588 else
1589#endif
1590 msg_gerr("Please check the connections (especially those to write protection pins) between\n"
1591 "the programmer and the flash chip. If you think the error is caused by flashrom\n"
1592 "please report this on IRC at chat.freenode.net (channel #flashrom) or\n"
1593 "mail flashrom@flashrom.org, thanks!\n");
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001594}
1595
Stefan Tauner136388f2013-07-15 10:47:53 +00001596static void emergency_help_message(void)
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00001597{
Stefan Tauner136388f2013-07-15 10:47:53 +00001598 msg_gerr("Your flash chip is in an unknown state.\n");
1599#if CONFIG_INTERNAL == 1
1600 if (programmer == PROGRAMMER_INTERNAL)
1601 msg_gerr("Get help on IRC at chat.freenode.net (channel #flashrom) or\n"
1602 "mail flashrom@flashrom.org with the subject \"FAILED: <your board name>\"!\n"
1603 "-------------------------------------------------------------------------------\n"
1604 "DO NOT REBOOT OR POWEROFF!\n");
1605 else
1606#endif
1607 msg_gerr("Please report this on IRC at chat.freenode.net (channel #flashrom) or\n"
1608 "mail flashrom@flashrom.org, thanks!\n");
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00001609}
1610
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001611/* The way to go if you want a delimited list of programmers */
Stefan Tauner66652442011-06-26 17:38:17 +00001612void list_programmers(const char *delim)
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001613{
1614 enum programmer p;
1615 for (p = 0; p < PROGRAMMER_INVALID; p++) {
Sean Nelson316a29f2010-05-07 20:09:04 +00001616 msg_ginfo("%s", programmer_table[p].name);
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001617 if (p < PROGRAMMER_INVALID - 1)
Sean Nelson316a29f2010-05-07 20:09:04 +00001618 msg_ginfo("%s", delim);
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001619 }
Sean Nelson316a29f2010-05-07 20:09:04 +00001620 msg_ginfo("\n");
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001621}
1622
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001623void list_programmers_linebreak(int startcol, int cols, int paren)
1624{
1625 const char *pname;
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +00001626 int pnamelen;
1627 int remaining = 0, firstline = 1;
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001628 enum programmer p;
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +00001629 int i;
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001630
1631 for (p = 0; p < PROGRAMMER_INVALID; p++) {
1632 pname = programmer_table[p].name;
1633 pnamelen = strlen(pname);
1634 if (remaining - pnamelen - 2 < 0) {
1635 if (firstline)
1636 firstline = 0;
1637 else
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001638 msg_ginfo("\n");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001639 for (i = 0; i < startcol; i++)
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001640 msg_ginfo(" ");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001641 remaining = cols - startcol;
1642 } else {
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001643 msg_ginfo(" ");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001644 remaining--;
1645 }
1646 if (paren && (p == 0)) {
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001647 msg_ginfo("(");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001648 remaining--;
1649 }
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001650 msg_ginfo("%s", pname);
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001651 remaining -= pnamelen;
1652 if (p < PROGRAMMER_INVALID - 1) {
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001653 msg_ginfo(",");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001654 remaining--;
1655 } else {
1656 if (paren)
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001657 msg_ginfo(")");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001658 }
1659 }
1660}
1661
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001662void print_sysinfo(void)
1663{
Stefan Taunerb0eee9b2015-01-10 09:32:50 +00001664#if IS_WINDOWS
Carl-Daniel Hailfinger60d9bd22012-08-09 23:34:41 +00001665 SYSTEM_INFO si;
1666 OSVERSIONINFOEX osvi;
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001667
Carl-Daniel Hailfinger60d9bd22012-08-09 23:34:41 +00001668 memset(&si, 0, sizeof(SYSTEM_INFO));
1669 memset(&osvi, 0, sizeof(OSVERSIONINFOEX));
1670 msg_ginfo(" on Windows");
1671 /* Tell Windows which version of the structure we want. */
1672 osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
1673 if (GetVersionEx((OSVERSIONINFO*) &osvi))
1674 msg_ginfo(" %lu.%lu", osvi.dwMajorVersion, osvi.dwMinorVersion);
1675 else
1676 msg_ginfo(" unknown version");
1677 GetSystemInfo(&si);
1678 switch (si.wProcessorArchitecture) {
1679 case PROCESSOR_ARCHITECTURE_AMD64:
1680 msg_ginfo(" (x86_64)");
1681 break;
1682 case PROCESSOR_ARCHITECTURE_INTEL:
1683 msg_ginfo(" (x86)");
1684 break;
1685 default:
1686 msg_ginfo(" (unknown arch)");
1687 break;
1688 }
1689#elif HAVE_UTSNAME == 1
1690 struct utsname osinfo;
1691
1692 uname(&osinfo);
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001693 msg_ginfo(" on %s %s (%s)", osinfo.sysname, osinfo.release,
1694 osinfo.machine);
1695#else
1696 msg_ginfo(" on unknown machine");
1697#endif
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001698}
1699
1700void print_buildinfo(void)
1701{
1702 msg_gdbg("flashrom was built with");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001703#if NEED_PCI == 1
1704#ifdef PCILIB_VERSION
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001705 msg_gdbg(" libpci %s,", PCILIB_VERSION);
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001706#else
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001707 msg_gdbg(" unknown PCI library,");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001708#endif
1709#endif
1710#ifdef __clang__
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001711 msg_gdbg(" LLVM Clang");
Carl-Daniel Hailfingerb51e58e2010-07-17 14:49:30 +00001712#ifdef __clang_version__
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001713 msg_gdbg(" %s,", __clang_version__);
Carl-Daniel Hailfingerb51e58e2010-07-17 14:49:30 +00001714#else
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001715 msg_gdbg(" unknown version (before r102686),");
Carl-Daniel Hailfingerb51e58e2010-07-17 14:49:30 +00001716#endif
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001717#elif defined(__GNUC__)
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001718 msg_gdbg(" GCC");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001719#ifdef __VERSION__
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001720 msg_gdbg(" %s,", __VERSION__);
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001721#else
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001722 msg_gdbg(" unknown version,");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001723#endif
1724#else
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001725 msg_gdbg(" unknown compiler,");
Carl-Daniel Hailfingercceafa22010-05-26 01:45:41 +00001726#endif
1727#if defined (__FLASHROM_LITTLE_ENDIAN__)
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001728 msg_gdbg(" little endian");
Carl-Daniel Hailfinger06b9efa2012-08-07 11:59:59 +00001729#elif defined (__FLASHROM_BIG_ENDIAN__)
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001730 msg_gdbg(" big endian");
Carl-Daniel Hailfinger06b9efa2012-08-07 11:59:59 +00001731#else
1732#error Endianness could not be determined
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001733#endif
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001734 msg_gdbg("\n");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001735}
1736
Bernhard Walle201bde32008-01-21 15:24:22 +00001737void print_version(void)
1738{
Carl-Daniel Hailfinger8841d3e2010-05-15 15:04:37 +00001739 msg_ginfo("flashrom v%s", flashrom_version);
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001740 print_sysinfo();
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001741 msg_ginfo("\n");
Bernhard Walle201bde32008-01-21 15:24:22 +00001742}
1743
Carl-Daniel Hailfinger8841d3e2010-05-15 15:04:37 +00001744void print_banner(void)
1745{
1746 msg_ginfo("flashrom is free software, get the source code at "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001747 "http://www.flashrom.org\n");
Carl-Daniel Hailfinger8841d3e2010-05-15 15:04:37 +00001748 msg_ginfo("\n");
1749}
1750
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001751int selfcheck(void)
1752{
Stefan Tauner96658be2014-05-26 22:05:31 +00001753 unsigned int i;
Stefan Taunera6d96482012-12-26 19:51:23 +00001754 int ret = 0;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001755
1756 /* Safety check. Instead of aborting after the first error, check
1757 * if more errors exist.
1758 */
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001759 if (ARRAY_SIZE(programmer_table) - 1 != PROGRAMMER_INVALID) {
Sean Nelson316a29f2010-05-07 20:09:04 +00001760 msg_gerr("Programmer table miscompilation!\n");
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001761 ret = 1;
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001762 }
Stefan Taunera6d96482012-12-26 19:51:23 +00001763 for (i = 0; i < PROGRAMMER_INVALID; i++) {
1764 const struct programmer_entry p = programmer_table[i];
1765 if (p.name == NULL) {
1766 msg_gerr("All programmers need a valid name, but the one with index %d does not!\n", i);
1767 ret = 1;
1768 /* This might hide other problems with this programmer, but allows for better error
1769 * messages below without jumping through hoops. */
1770 continue;
1771 }
Stefan Tauneraf358d62012-12-27 18:40:26 +00001772 switch (p.type) {
1773 case USB:
1774 case PCI:
1775 case OTHER:
1776 if (p.devs.note == NULL) {
1777 if (strcmp("internal", p.name) == 0)
1778 break; /* This one has its device list stored separately. */
1779 msg_gerr("Programmer %s has neither a device list nor a textual description!\n",
1780 p.name);
1781 ret = 1;
1782 }
1783 break;
1784 default:
1785 msg_gerr("Programmer %s does not have a valid type set!\n", p.name);
1786 ret = 1;
1787 break;
1788 }
Stefan Taunera6d96482012-12-26 19:51:23 +00001789 if (p.init == NULL) {
1790 msg_gerr("Programmer %s does not have a valid init function!\n", p.name);
1791 ret = 1;
1792 }
1793 if (p.delay == NULL) {
1794 msg_gerr("Programmer %s does not have a valid delay function!\n", p.name);
1795 ret = 1;
1796 }
1797 if (p.map_flash_region == NULL) {
1798 msg_gerr("Programmer %s does not have a valid map_flash_region function!\n", p.name);
1799 ret = 1;
1800 }
1801 if (p.unmap_flash_region == NULL) {
1802 msg_gerr("Programmer %s does not have a valid unmap_flash_region function!\n", p.name);
1803 ret = 1;
1804 }
1805 }
Stefan Tauner96658be2014-05-26 22:05:31 +00001806
1807 /* It would be favorable if we could check for the correct layout (especially termination) of various
1808 * constant arrays: flashchips, chipset_enables, board_matches, boards_known, laptops_known.
1809 * They are all defined as externs in this compilation unit so we don't know their sizes which vary
1810 * depending on compiler flags, e.g. the target architecture, and can sometimes be 0.
1811 * For 'flashchips' we export the size explicitly to work around this and to be able to implement the
1812 * checks below. */
Stefan Tauner6697f712014-08-06 15:09:15 +00001813 if (flashchips_size <= 1 || flashchips[flashchips_size - 1].name != NULL) {
Stefan Tauner7bcacb12011-05-26 01:35:19 +00001814 msg_gerr("Flashchips table miscompilation!\n");
1815 ret = 1;
Stefan Tauner96658be2014-05-26 22:05:31 +00001816 } else {
1817 for (i = 0; i < flashchips_size - 1; i++) {
1818 const struct flashchip *chip = &flashchips[i];
1819 if (chip->vendor == NULL || chip->name == NULL || chip->bustype == BUS_NONE) {
1820 ret = 1;
1821 msg_gerr("ERROR: Some field of flash chip #%d (%s) is misconfigured.\n"
1822 "Please report a bug at flashrom@flashrom.org\n", i,
1823 chip->name == NULL ? "unnamed" : chip->name);
1824 }
1825 if (selfcheck_eraseblocks(chip)) {
1826 ret = 1;
1827 }
1828 }
Stefan Tauner7bcacb12011-05-26 01:35:19 +00001829 }
Stefan Tauner7bcacb12011-05-26 01:35:19 +00001830
Stefan Tauner600576b2014-06-12 22:57:36 +00001831#if CONFIG_INTERNAL == 1
1832 ret |= selfcheck_board_enables();
1833#endif
1834
Stefan Tauner96658be2014-05-26 22:05:31 +00001835 /* TODO: implement similar sanity checks for other arrays where deemed necessary. */
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001836 return ret;
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001837}
1838
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001839/* FIXME: This function signature needs to be improved once doit() has a better
1840 * function signature.
1841 */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001842int chip_safety_check(const struct flashctx *flash, int force, int read_it, int write_it, int erase_it,
1843 int verify_it)
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001844{
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001845 const struct flashchip *chip = flash->chip;
1846
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001847 if (!programmer_may_write && (write_it || erase_it)) {
1848 msg_perr("Write/erase is not working yet on your programmer in "
1849 "its current configuration.\n");
1850 /* --force is the wrong approach, but it's the best we can do
1851 * until the generic programmer parameter parser is merged.
1852 */
1853 if (!force)
1854 return 1;
1855 msg_cerr("Continuing anyway.\n");
1856 }
1857
1858 if (read_it || erase_it || write_it || verify_it) {
1859 /* Everything needs read. */
Stefan Tauner6455dff2014-05-26 00:36:24 +00001860 if (chip->tested.read == BAD) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001861 msg_cerr("Read is not working on this chip. ");
1862 if (!force)
1863 return 1;
1864 msg_cerr("Continuing anyway.\n");
1865 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001866 if (!chip->read) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001867 msg_cerr("flashrom has no read function for this "
1868 "flash chip.\n");
1869 return 1;
1870 }
1871 }
1872 if (erase_it || write_it) {
1873 /* Write needs erase. */
Stefan Tauner6455dff2014-05-26 00:36:24 +00001874 if (chip->tested.erase == NA) {
1875 msg_cerr("Erase is not possible on this chip.\n");
1876 return 1;
1877 }
1878 if (chip->tested.erase == BAD) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001879 msg_cerr("Erase is not working on this chip. ");
1880 if (!force)
1881 return 1;
1882 msg_cerr("Continuing anyway.\n");
1883 }
Sylvain "ythier" Hitier9db45512011-07-04 07:27:17 +00001884 if(count_usable_erasers(flash) == 0) {
Stefan Tauner5368dca2011-07-01 00:19:12 +00001885 msg_cerr("flashrom has no erase function for this "
1886 "flash chip.\n");
1887 return 1;
1888 }
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001889 }
1890 if (write_it) {
Stefan Tauner6455dff2014-05-26 00:36:24 +00001891 if (chip->tested.write == NA) {
1892 msg_cerr("Write is not possible on this chip.\n");
1893 return 1;
1894 }
1895 if (chip->tested.write == BAD) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001896 msg_cerr("Write is not working on this chip. ");
1897 if (!force)
1898 return 1;
1899 msg_cerr("Continuing anyway.\n");
1900 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001901 if (!chip->write) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001902 msg_cerr("flashrom has no write function for this "
1903 "flash chip.\n");
1904 return 1;
1905 }
1906 }
1907 return 0;
1908}
1909
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001910/* This function signature is horrible. We need to design a better interface,
1911 * but right now it allows us to split off the CLI code.
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00001912 * Besides that, the function itself is a textbook example of abysmal code flow.
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001913 */
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +00001914int doit(struct flashctx *flash, int force, const char *filename, int read_it,
1915 int write_it, int erase_it, int verify_it)
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001916{
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001917 uint8_t *oldcontents;
1918 uint8_t *newcontents;
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001919 int ret = 0;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001920 unsigned long size = flash->chip->total_size * 1024;
Stefan Tauner73f5bda2014-10-19 07:53:45 +00001921 int read_all_first = 1; /* FIXME: Make this configurable. */
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001922
David Hendricks77f931a2011-05-18 01:30:56 +00001923 if (chip_safety_check(flash, force, read_it, write_it, erase_it, verify_it)) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001924 msg_cerr("Aborting.\n");
Stefan Tauner20da4aa2014-05-07 22:07:23 +00001925 return 1;
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001926 }
1927
Stefan Tauner8268fdb2013-09-23 14:21:06 +00001928 if (normalize_romentries(flash)) {
1929 msg_cerr("Requested regions can not be handled. Aborting.\n");
Stefan Tauner20da4aa2014-05-07 22:07:23 +00001930 return 1;
Stefan Tauner8268fdb2013-09-23 14:21:06 +00001931 }
1932
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001933 /* Given the existence of read locks, we want to unlock for read,
1934 * erase and write.
1935 */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001936 if (flash->chip->unlock)
1937 flash->chip->unlock(flash);
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001938
1939 if (read_it) {
Stefan Tauner20da4aa2014-05-07 22:07:23 +00001940 return read_flash_to_file(flash, filename);
Carl-Daniel Hailfingerd1be52d2010-07-03 12:14:25 +00001941 }
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001942
Stefan Tauner269de352011-07-12 22:35:21 +00001943 oldcontents = malloc(size);
1944 if (!oldcontents) {
1945 msg_gerr("Out of memory!\n");
1946 exit(1);
1947 }
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001948 /* Assume worst case: All bits are 0. */
1949 memset(oldcontents, 0x00, size);
Stefan Tauner269de352011-07-12 22:35:21 +00001950 newcontents = malloc(size);
1951 if (!newcontents) {
1952 msg_gerr("Out of memory!\n");
1953 exit(1);
1954 }
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001955 /* Assume best case: All bits should be 1. */
1956 memset(newcontents, 0xff, size);
1957 /* Side effect of the assumptions above: Default write action is erase
1958 * because newcontents looks like a completely erased chip, and
1959 * oldcontents being completely 0x00 means we have to erase everything
1960 * before we can write.
1961 */
1962
Ollie Lhoefa28582004-12-08 20:10:01 +00001963 if (erase_it) {
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001964 /* FIXME: Do we really want the scary warning if erase failed?
1965 * After all, after erase the chip is either blank or partially
1966 * blank or it has the old contents. A blank chip won't boot,
1967 * so if the user wanted erase and reboots afterwards, the user
1968 * knows very well that booting won't work.
1969 */
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001970 if (erase_and_write_flash(flash, oldcontents, newcontents)) {
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00001971 emergency_help_message();
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001972 ret = 1;
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00001973 }
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001974 goto out;
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00001975 }
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001976
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00001977 if (write_it || verify_it) {
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001978 if (read_buf_from_file(newcontents, size, filename)) {
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001979 ret = 1;
1980 goto out;
Stefan Reinauer018aca82006-11-21 23:48:51 +00001981 }
1982
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +00001983#if CONFIG_INTERNAL == 1
Stefan Taunerb4e06bd2012-08-20 00:24:22 +00001984 if (programmer == PROGRAMMER_INTERNAL && cb_check_image(newcontents, size) < 0) {
1985 if (force_boardmismatch) {
1986 msg_pinfo("Proceeding anyway because user forced us to.\n");
1987 } else {
1988 msg_perr("Aborting. You can override this with "
1989 "-p internal:boardmismatch=force.\n");
Niklas Söderlund9e423762012-06-16 00:11:16 +00001990 ret = 1;
1991 goto out;
1992 }
Stefan Taunerb4e06bd2012-08-20 00:24:22 +00001993 }
Carl-Daniel Hailfinger66ef4e52009-12-13 22:28:00 +00001994#endif
Ollie Lhocbbf1252004-03-17 22:22:08 +00001995 }
1996
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001997 /* Read the whole chip to be able to check whether regions need to be
1998 * erased and to give better diagnostics in case write fails.
Stefan Tauner73f5bda2014-10-19 07:53:45 +00001999 * The alternative is to read only the regions which are to be
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00002000 * preserved, but in that case we might perform unneeded erase which
2001 * takes time as well.
2002 */
Stefan Tauner73f5bda2014-10-19 07:53:45 +00002003 if (read_all_first) {
2004 msg_cinfo("Reading old flash chip contents... ");
2005 if (flash->chip->read(flash, oldcontents, 0, size)) {
2006 ret = 1;
2007 msg_cinfo("FAILED.\n");
2008 goto out;
2009 }
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00002010 }
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00002011 msg_cinfo("done.\n");
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00002012
Stefan Tauner8268fdb2013-09-23 14:21:06 +00002013 /* Build a new image taking the given layout into account. */
Stefan Tauner73f5bda2014-10-19 07:53:45 +00002014 if (build_new_image(flash, read_all_first, oldcontents, newcontents)) {
2015 msg_gerr("Could not prepare the data to be written, aborting.\n");
2016 ret = 1;
2017 goto out;
2018 }
Uwe Hermanna7e05482007-05-09 10:17:44 +00002019
Ollie Lho184a4042005-11-26 21:55:36 +00002020 // ////////////////////////////////////////////////////////////
Uwe Hermanna7e05482007-05-09 10:17:44 +00002021
Stefan Tauner73f5bda2014-10-19 07:53:45 +00002022 if (write_it && erase_and_write_flash(flash, oldcontents, newcontents)) {
2023 msg_cerr("Uh oh. Erase/write failed.");
2024 if (read_all_first) {
2025 msg_cerr("Checking if anything has changed.\n");
Stefan Taunera58f6e92014-05-10 09:25:44 +00002026 msg_cinfo("Reading current flash chip contents... ");
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00002027 if (!flash->chip->read(flash, newcontents, 0, size)) {
Stefan Taunera58f6e92014-05-10 09:25:44 +00002028 msg_cinfo("done.\n");
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00002029 if (!memcmp(oldcontents, newcontents, size)) {
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00002030 nonfatal_help_message();
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00002031 ret = 1;
2032 goto out;
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00002033 }
Stefan Taunera58f6e92014-05-10 09:25:44 +00002034 msg_cerr("Apparently at least some data has changed.\n");
2035 } else
2036 msg_cerr("Can't even read anymore!\n");
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00002037 emergency_help_message();
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00002038 ret = 1;
2039 goto out;
Stefan Tauner73f5bda2014-10-19 07:53:45 +00002040 } else
2041 msg_cerr("\n");
2042 emergency_help_message();
2043 ret = 1;
2044 goto out;
Peter Stugef31104c2008-04-28 14:47:30 +00002045 }
Ollie Lho184a4042005-11-26 21:55:36 +00002046
Stefan Taunerc4f44df2013-08-12 22:58:43 +00002047 /* Verify only if we either did not try to write (verify operation) or actually changed something. */
2048 if (verify_it && (!write_it || !all_skipped)) {
Stefan Tauner78ffbea2012-10-27 15:36:56 +00002049 msg_cinfo("Verifying flash... ");
2050
2051 if (write_it) {
2052 /* Work around chips which need some time to calm down. */
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00002053 programmer_delay(1000*1000);
Stefan Tauner78ffbea2012-10-27 15:36:56 +00002054 ret = verify_range(flash, newcontents, 0, size);
2055 /* If we tried to write, and verification now fails, we
2056 * might have an emergency situation.
2057 */
2058 if (ret)
2059 emergency_help_message();
2060 } else {
2061 ret = compare_range(newcontents, oldcontents, 0, size);
2062 }
2063 if (!ret)
2064 msg_cinfo("VERIFIED.\n");
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00002065 }
Ollie Lho184a4042005-11-26 21:55:36 +00002066
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00002067out:
2068 free(oldcontents);
2069 free(newcontents);
Stefan Reinauer143da0b2006-01-04 16:42:57 +00002070 return ret;
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00002071}