blob: 273eb9971bb559f37e9730eec4dd4e01cc1d7d21 [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
Nico Huber7af0e792016-04-29 16:40:15 +02008 * Copyright (C) 2016 secunet Security Networks AG
9 * (Written by Nico Huber <nico.huber@secunet.com> for secunet)
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +000010 *
Uwe Hermannd1107642007-08-29 17:52:32 +000011 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +000015 *
Uwe Hermannd1107642007-08-29 17:52:32 +000016 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +000020 *
Uwe Hermannd1107642007-08-29 17:52:32 +000021 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, write to the Free Software
23 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +000024 */
25
Carl-Daniel Hailfinger831e8f42010-05-30 22:24:40 +000026#include <stdio.h>
Stefan Reinauer018aca82006-11-21 23:48:51 +000027#include <sys/types.h>
Patrick Georgia9095a92010-09-30 17:03:32 +000028#ifndef __LIBPAYLOAD__
29#include <fcntl.h>
Stefan Reinauer018aca82006-11-21 23:48:51 +000030#include <sys/stat.h>
Patrick Georgia9095a92010-09-30 17:03:32 +000031#endif
Ronald G. Minnichceec4202003-07-25 04:37:41 +000032#include <string.h>
Stefan Tauner16687702015-12-25 21:59:45 +000033#include <unistd.h>
Ronald G. Minnicheaab50b2003-09-12 22:41:53 +000034#include <stdlib.h>
Stefan Tauner363fd7e2013-04-07 13:08:30 +000035#include <errno.h>
Carl-Daniel Hailfingerc2441382010-11-09 22:00:31 +000036#include <ctype.h>
Ollie Lho184a4042005-11-26 21:55:36 +000037#include <getopt.h>
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +000038#if HAVE_UTSNAME == 1
39#include <sys/utsname.h>
40#endif
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +000041#include "flash.h"
Carl-Daniel Hailfinger08454642009-06-15 14:14:48 +000042#include "flashchips.h"
Carl-Daniel Hailfinger5b997c32010-07-27 22:41:39 +000043#include "programmer.h"
Carl-Daniel Hailfinger06b9efa2012-08-07 11:59:59 +000044#include "hwaccess.h"
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +000045
Mathias Krausea60faab2011-01-17 07:50:42 +000046const char flashrom_version[] = FLASHROM_VERSION;
Nico Huberbcb2e5a2012-12-30 01:23:17 +000047const char *chip_to_probe = NULL;
Carl-Daniel Hailfinger66ef4e52009-12-13 22:28:00 +000048
Carl-Daniel Hailfinger2e681602011-09-08 00:00:29 +000049static enum programmer programmer = PROGRAMMER_INVALID;
Nico Huberbcb2e5a2012-12-30 01:23:17 +000050static const char *programmer_param = NULL;
Stefan Reinauer70385642007-04-06 11:58:03 +000051
Uwe Hermann48ec1b12010-08-08 17:01:18 +000052/*
Carl-Daniel Hailfinger66ef4e52009-12-13 22:28:00 +000053 * Programmers supporting multiple buses can have differing size limits on
54 * each bus. Store the limits for each bus in a common struct.
55 */
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +000056struct decode_sizes max_rom_decode;
57
58/* If nonzero, used as the start address of bottom-aligned flash. */
59unsigned long flashbase;
Carl-Daniel Hailfinger66ef4e52009-12-13 22:28:00 +000060
Carl-Daniel Hailfingerd1be52d2010-07-03 12:14:25 +000061/* Is writing allowed with this programmer? */
62int programmer_may_write;
63
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +000064const struct programmer_entry programmer_table[] = {
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +000065#if CONFIG_INTERNAL == 1
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +000066 {
Carl-Daniel Hailfinger37fc4692009-08-12 14:34:35 +000067 .name = "internal",
Stefan Tauneraf358d62012-12-27 18:40:26 +000068 .type = OTHER,
69 .devs.note = NULL,
Carl-Daniel Hailfinger1e334e62009-05-11 15:46:43 +000070 .init = internal_init,
Carl-Daniel Hailfinger1455b2b2009-05-11 14:13:25 +000071 .map_flash_region = physmap,
72 .unmap_flash_region = physunmap,
Carl-Daniel Hailfingerca8bfc62009-06-05 17:48:08 +000073 .delay = internal_delay,
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +000074 },
Carl-Daniel Hailfinger66ef4e52009-12-13 22:28:00 +000075#endif
Luc Verhaegen8e3a6002007-04-04 22:45:58 +000076
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +000077#if CONFIG_DUMMY == 1
Carl-Daniel Hailfingerc3129202009-05-09 00:54:55 +000078 {
Carl-Daniel Hailfinger37fc4692009-08-12 14:34:35 +000079 .name = "dummy",
Stefan Tauneraf358d62012-12-27 18:40:26 +000080 .type = OTHER,
81 /* FIXME */
82 .devs.note = "Dummy device, does nothing and logs all accesses\n",
Carl-Daniel Hailfinger1e334e62009-05-11 15:46:43 +000083 .init = dummy_init,
Carl-Daniel Hailfinger1455b2b2009-05-11 14:13:25 +000084 .map_flash_region = dummy_map,
85 .unmap_flash_region = dummy_unmap,
Carl-Daniel Hailfingerca8bfc62009-06-05 17:48:08 +000086 .delay = internal_delay,
Carl-Daniel Hailfingerc3129202009-05-09 00:54:55 +000087 },
Carl-Daniel Hailfinger4740c6f2009-09-16 10:09:21 +000088#endif
Carl-Daniel Hailfingerc3129202009-05-09 00:54:55 +000089
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +000090#if CONFIG_NIC3COM == 1
Uwe Hermannb4dcb712009-05-13 11:36:06 +000091 {
Carl-Daniel Hailfinger37fc4692009-08-12 14:34:35 +000092 .name = "nic3com",
Stefan Tauneraf358d62012-12-27 18:40:26 +000093 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +000094 .devs.dev = nics_3com,
Uwe Hermannb4dcb712009-05-13 11:36:06 +000095 .init = nic3com_init,
Uwe Hermannc6915932009-05-17 23:12:17 +000096 .map_flash_region = fallback_map,
97 .unmap_flash_region = fallback_unmap,
Carl-Daniel Hailfingerca8bfc62009-06-05 17:48:08 +000098 .delay = internal_delay,
Uwe Hermannb4dcb712009-05-13 11:36:06 +000099 },
Carl-Daniel Hailfinger4740c6f2009-09-16 10:09:21 +0000100#endif
Uwe Hermannb4dcb712009-05-13 11:36:06 +0000101
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000102#if CONFIG_NICREALTEK == 1
Joerg Fischer5665ef32010-05-21 21:54:07 +0000103 {
Carl-Daniel Hailfinger40446ee2011-03-07 01:08:09 +0000104 /* This programmer works for Realtek RTL8139 and SMC 1211. */
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000105 .name = "nicrealtek",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000106 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000107 .devs.dev = nics_realtek,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000108 .init = nicrealtek_init,
109 .map_flash_region = fallback_map,
110 .unmap_flash_region = fallback_unmap,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000111 .delay = internal_delay,
Joerg Fischer5665ef32010-05-21 21:54:07 +0000112 },
Joerg Fischer5665ef32010-05-21 21:54:07 +0000113#endif
114
Andrew Morganc29c2e72010-06-07 22:37:54 +0000115#if CONFIG_NICNATSEMI == 1
116 {
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000117 .name = "nicnatsemi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000118 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000119 .devs.dev = nics_natsemi,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000120 .init = nicnatsemi_init,
121 .map_flash_region = fallback_map,
122 .unmap_flash_region = fallback_unmap,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000123 .delay = internal_delay,
Andrew Morganc29c2e72010-06-07 22:37:54 +0000124 },
125#endif
Joerg Fischer5665ef32010-05-21 21:54:07 +0000126
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000127#if CONFIG_GFXNVIDIA == 1
Uwe Hermann2bc98f62009-09-30 18:29:55 +0000128 {
129 .name = "gfxnvidia",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000130 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000131 .devs.dev = gfx_nvidia,
Uwe Hermann2bc98f62009-09-30 18:29:55 +0000132 .init = gfxnvidia_init,
Uwe Hermann2bc98f62009-09-30 18:29:55 +0000133 .map_flash_region = fallback_map,
134 .unmap_flash_region = fallback_unmap,
Uwe Hermann2bc98f62009-09-30 18:29:55 +0000135 .delay = internal_delay,
136 },
137#endif
138
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000139#if CONFIG_DRKAISER == 1
Rudolf Marek68720c72009-05-17 19:39:27 +0000140 {
TURBO Jb0912c02009-09-02 23:00:46 +0000141 .name = "drkaiser",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000142 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000143 .devs.dev = drkaiser_pcidev,
TURBO Jb0912c02009-09-02 23:00:46 +0000144 .init = drkaiser_init,
TURBO Jb0912c02009-09-02 23:00:46 +0000145 .map_flash_region = fallback_map,
146 .unmap_flash_region = fallback_unmap,
TURBO Jb0912c02009-09-02 23:00:46 +0000147 .delay = internal_delay,
148 },
Carl-Daniel Hailfinger4740c6f2009-09-16 10:09:21 +0000149#endif
TURBO Jb0912c02009-09-02 23:00:46 +0000150
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000151#if CONFIG_SATASII == 1
TURBO Jb0912c02009-09-02 23:00:46 +0000152 {
Carl-Daniel Hailfinger37fc4692009-08-12 14:34:35 +0000153 .name = "satasii",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000154 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000155 .devs.dev = satas_sii,
Rudolf Marek68720c72009-05-17 19:39:27 +0000156 .init = satasii_init,
Uwe Hermannc6915932009-05-17 23:12:17 +0000157 .map_flash_region = fallback_map,
158 .unmap_flash_region = fallback_unmap,
Carl-Daniel Hailfingerca8bfc62009-06-05 17:48:08 +0000159 .delay = internal_delay,
Rudolf Marek68720c72009-05-17 19:39:27 +0000160 },
Carl-Daniel Hailfinger4740c6f2009-09-16 10:09:21 +0000161#endif
Rudolf Marek68720c72009-05-17 19:39:27 +0000162
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000163#if CONFIG_ATAHPT == 1
Uwe Hermannddd5c9e2010-02-21 21:17:00 +0000164 {
165 .name = "atahpt",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000166 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000167 .devs.dev = ata_hpt,
Uwe Hermannddd5c9e2010-02-21 21:17:00 +0000168 .init = atahpt_init,
Uwe Hermannddd5c9e2010-02-21 21:17:00 +0000169 .map_flash_region = fallback_map,
170 .unmap_flash_region = fallback_unmap,
Uwe Hermannddd5c9e2010-02-21 21:17:00 +0000171 .delay = internal_delay,
172 },
173#endif
174
Jonathan Kollasch7f0f3fa2014-06-01 10:26:23 +0000175#if CONFIG_ATAVIA == 1
176 {
177 .name = "atavia",
178 .type = PCI,
179 .devs.dev = ata_via,
180 .init = atavia_init,
181 .map_flash_region = atavia_map,
182 .unmap_flash_region = fallback_unmap,
183 .delay = internal_delay,
184 },
185#endif
186
Joseph C. Lehnerc2644a32016-01-16 23:45:25 +0000187#if CONFIG_ATAPROMISE == 1
188 {
189 .name = "atapromise",
190 .type = PCI,
191 .devs.dev = ata_promise,
192 .init = atapromise_init,
193 .map_flash_region = atapromise_map,
194 .unmap_flash_region = fallback_unmap,
195 .delay = internal_delay,
196 },
197#endif
198
Kyösti Mälkki72d42f82014-06-01 23:48:31 +0000199#if CONFIG_IT8212 == 1
200 {
201 .name = "it8212",
202 .type = PCI,
203 .devs.dev = devs_it8212,
204 .init = it8212_init,
205 .map_flash_region = fallback_map,
206 .unmap_flash_region = fallback_unmap,
207 .delay = internal_delay,
208 },
209#endif
210
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000211#if CONFIG_FT2232_SPI == 1
Paul Fox05dfbe62009-06-16 21:08:06 +0000212 {
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000213 .name = "ft2232_spi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000214 .type = USB,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000215 .devs.dev = devs_ft2232spi,
Paul Fox05dfbe62009-06-16 21:08:06 +0000216 .init = ft2232_spi_init,
Carl-Daniel Hailfinger415e5132009-08-12 11:39:29 +0000217 .map_flash_region = fallback_map,
218 .unmap_flash_region = fallback_unmap,
Paul Fox05dfbe62009-06-16 21:08:06 +0000219 .delay = internal_delay,
220 },
Carl-Daniel Hailfinger3426ef62009-08-19 13:27:58 +0000221#endif
Carl-Daniel Hailfinger415e5132009-08-12 11:39:29 +0000222
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000223#if CONFIG_SERPROG == 1
Urja Rannikko22915352009-06-23 11:33:43 +0000224 {
Carl-Daniel Hailfinger37fc4692009-08-12 14:34:35 +0000225 .name = "serprog",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000226 .type = OTHER,
227 /* FIXME */
228 .devs.note = "All programmer devices speaking the serprog protocol\n",
Urja Rannikko22915352009-06-23 11:33:43 +0000229 .init = serprog_init,
Urja Rannikko0b4ffd52015-06-29 23:24:23 +0000230 .map_flash_region = serprog_map,
Urja Rannikko22915352009-06-23 11:33:43 +0000231 .unmap_flash_region = fallback_unmap,
Urja Rannikko22915352009-06-23 11:33:43 +0000232 .delay = serprog_delay,
233 },
Carl-Daniel Hailfinger6be74112009-08-12 16:17:41 +0000234#endif
Paul Fox05dfbe62009-06-16 21:08:06 +0000235
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000236#if CONFIG_BUSPIRATE_SPI == 1
Carl-Daniel Hailfinger5cca01f2009-11-24 00:20:03 +0000237 {
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000238 .name = "buspirate_spi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000239 .type = OTHER,
240 /* FIXME */
241 .devs.note = "Dangerous Prototypes Bus Pirate\n",
Carl-Daniel Hailfinger5cca01f2009-11-24 00:20:03 +0000242 .init = buspirate_spi_init,
Carl-Daniel Hailfinger5cca01f2009-11-24 00:20:03 +0000243 .map_flash_region = fallback_map,
244 .unmap_flash_region = fallback_unmap,
Carl-Daniel Hailfinger5cca01f2009-11-24 00:20:03 +0000245 .delay = internal_delay,
246 },
247#endif
248
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000249#if CONFIG_DEDIPROG == 1
Carl-Daniel Hailfingerd38fac82010-01-19 11:15:48 +0000250 {
251 .name = "dediprog",
Stefan Taunerfdec7472016-02-22 08:59:27 +0000252 .type = USB,
253 .devs.dev = devs_dediprog,
Carl-Daniel Hailfingerd38fac82010-01-19 11:15:48 +0000254 .init = dediprog_init,
Carl-Daniel Hailfingerd38fac82010-01-19 11:15:48 +0000255 .map_flash_region = fallback_map,
256 .unmap_flash_region = fallback_unmap,
Carl-Daniel Hailfingerd38fac82010-01-19 11:15:48 +0000257 .delay = internal_delay,
258 },
259#endif
260
Carl-Daniel Hailfingere7fdd6e2010-07-21 10:26:01 +0000261#if CONFIG_RAYER_SPI == 1
262 {
263 .name = "rayer_spi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000264 .type = OTHER,
265 /* FIXME */
266 .devs.note = "RayeR parallel port programmer\n",
Carl-Daniel Hailfingere7fdd6e2010-07-21 10:26:01 +0000267 .init = rayer_spi_init,
Carl-Daniel Hailfingere7fdd6e2010-07-21 10:26:01 +0000268 .map_flash_region = fallback_map,
269 .unmap_flash_region = fallback_unmap,
Carl-Daniel Hailfingere7fdd6e2010-07-21 10:26:01 +0000270 .delay = internal_delay,
271 },
272#endif
273
Virgil-Adrian Teacada7c5452012-04-30 23:11:06 +0000274#if CONFIG_PONY_SPI == 1
275 {
276 .name = "pony_spi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000277 .type = OTHER,
278 /* FIXME */
279 .devs.note = "Programmers compatible with SI-Prog, serbang or AJAWe\n",
Virgil-Adrian Teacada7c5452012-04-30 23:11:06 +0000280 .init = pony_spi_init,
281 .map_flash_region = fallback_map,
282 .unmap_flash_region = fallback_unmap,
283 .delay = internal_delay,
Stefan Tauneraf358d62012-12-27 18:40:26 +0000284 },
Virgil-Adrian Teacada7c5452012-04-30 23:11:06 +0000285#endif
286
Carl-Daniel Hailfingerb713d2e2011-05-08 00:24:18 +0000287#if CONFIG_NICINTEL == 1
288 {
289 .name = "nicintel",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000290 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000291 .devs.dev = nics_intel,
Carl-Daniel Hailfingerb713d2e2011-05-08 00:24:18 +0000292 .init = nicintel_init,
Carl-Daniel Hailfingerb713d2e2011-05-08 00:24:18 +0000293 .map_flash_region = fallback_map,
294 .unmap_flash_region = fallback_unmap,
Carl-Daniel Hailfingerb713d2e2011-05-08 00:24:18 +0000295 .delay = internal_delay,
296 },
297#endif
298
Idwer Vollering004f4b72010-09-03 18:21:21 +0000299#if CONFIG_NICINTEL_SPI == 1
300 {
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000301 .name = "nicintel_spi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000302 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000303 .devs.dev = nics_intel_spi,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000304 .init = nicintel_spi_init,
305 .map_flash_region = fallback_map,
306 .unmap_flash_region = fallback_unmap,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000307 .delay = internal_delay,
Idwer Vollering004f4b72010-09-03 18:21:21 +0000308 },
309#endif
310
Ricardo Ribalda Delgado2a41f0a2014-07-28 20:35:21 +0000311#if CONFIG_NICINTEL_EEPROM == 1
312 {
313 .name = "nicintel_eeprom",
314 .type = PCI,
315 .devs.dev = nics_intel_ee,
316 .init = nicintel_ee_init,
317 .map_flash_region = fallback_map,
318 .unmap_flash_region = fallback_unmap,
319 .delay = internal_delay,
320 },
321#endif
322
Mark Marshall90021f22010-12-03 14:48:11 +0000323#if CONFIG_OGP_SPI == 1
324 {
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000325 .name = "ogp_spi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000326 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000327 .devs.dev = ogp_spi,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000328 .init = ogp_spi_init,
329 .map_flash_region = fallback_map,
330 .unmap_flash_region = fallback_unmap,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000331 .delay = internal_delay,
Mark Marshall90021f22010-12-03 14:48:11 +0000332 },
333#endif
334
Carl-Daniel Hailfinger9a1105c2011-02-04 21:37:59 +0000335#if CONFIG_SATAMV == 1
336 {
337 .name = "satamv",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000338 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000339 .devs.dev = satas_mv,
Carl-Daniel Hailfinger9a1105c2011-02-04 21:37:59 +0000340 .init = satamv_init,
Carl-Daniel Hailfinger9a1105c2011-02-04 21:37:59 +0000341 .map_flash_region = fallback_map,
342 .unmap_flash_region = fallback_unmap,
Carl-Daniel Hailfinger9a1105c2011-02-04 21:37:59 +0000343 .delay = internal_delay,
344 },
345#endif
346
Sven Schnelle5ce5f702011-09-03 18:37:52 +0000347#if CONFIG_LINUX_SPI == 1
348 {
349 .name = "linux_spi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000350 .type = OTHER,
351 .devs.note = "Device files /dev/spidev*.*\n",
Sven Schnelle5ce5f702011-09-03 18:37:52 +0000352 .init = linux_spi_init,
353 .map_flash_region = fallback_map,
354 .unmap_flash_region = fallback_unmap,
Sven Schnelle5ce5f702011-09-03 18:37:52 +0000355 .delay = internal_delay,
356 },
357#endif
358
James Lairdc60de0e2013-03-27 13:00:23 +0000359#if CONFIG_USBBLASTER_SPI == 1
360 {
361 .name = "usbblaster_spi",
362 .type = USB,
363 .devs.dev = devs_usbblasterspi,
364 .init = usbblaster_spi_init,
365 .map_flash_region = fallback_map,
366 .unmap_flash_region = fallback_unmap,
367 .delay = internal_delay,
368 },
369#endif
370
Alexandre Boeglin80e64712014-12-20 20:25:19 +0000371#if CONFIG_MSTARDDC_SPI == 1
372 {
373 .name = "mstarddc_spi",
374 .type = OTHER,
375 .devs.note = "MSTAR DDC devices addressable via /dev/i2c-* on Linux.\n",
376 .init = mstarddc_spi_init,
377 .map_flash_region = fallback_map,
378 .unmap_flash_region = fallback_unmap,
379 .delay = internal_delay,
380 },
381#endif
382
Justin Chevrier66e554b2015-02-08 21:58:10 +0000383#if CONFIG_PICKIT2_SPI == 1
384 {
385 .name = "pickit2_spi",
Stefan Taunerf31fe842016-02-22 08:59:15 +0000386 .type = USB,
387 .devs.dev = devs_pickit2_spi,
Justin Chevrier66e554b2015-02-08 21:58:10 +0000388 .init = pickit2_spi_init,
389 .map_flash_region = fallback_map,
390 .unmap_flash_region = fallback_unmap,
391 .delay = internal_delay,
392 },
393#endif
394
Urja Rannikko0870b022016-01-31 22:10:29 +0000395#if CONFIG_CH341A_SPI == 1
396 {
397 .name = "ch341a_spi",
398 .type = USB,
399 .devs.dev = devs_ch341a_spi,
400 .init = ch341a_spi_init,
401 .map_flash_region = fallback_map,
402 .unmap_flash_region = fallback_unmap,
403 .delay = ch341a_spi_delay,
404 },
405#endif
406
Carl-Daniel Hailfinger1c6d2ff2012-08-27 00:44:42 +0000407 {0}, /* This entry corresponds to PROGRAMMER_INVALID. */
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +0000408};
Luc Verhaegen8e3a6002007-04-04 22:45:58 +0000409
Carl-Daniel Hailfinger2bee8cf2010-11-10 15:25:18 +0000410#define SHUTDOWN_MAXFN 32
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000411static int shutdown_fn_count = 0;
412struct shutdown_func_data {
David Hendricks8bb20212011-06-14 01:35:36 +0000413 int (*func) (void *data);
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000414 void *data;
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000415} static shutdown_fn[SHUTDOWN_MAXFN];
416/* Initialize to 0 to make sure nobody registers a shutdown function before
417 * programmer init.
418 */
419static int may_register_shutdown = 0;
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000420
Stefan Taunerc4f44df2013-08-12 22:58:43 +0000421/* Did we change something or was every erase/write skipped (if any)? */
422static bool all_skipped = true;
423
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +0000424static int check_block_eraser(const struct flashctx *flash, int k, int log);
Stefan Tauner5368dca2011-07-01 00:19:12 +0000425
Stefan Tauner2a1ed772014-08-31 00:09:21 +0000426int shutdown_free(void *data)
427{
428 free(data);
429 return 0;
430}
431
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000432/* Register a function to be executed on programmer shutdown.
433 * The advantage over atexit() is that you can supply a void pointer which will
434 * be used as parameter to the registered function upon programmer shutdown.
435 * This pointer can point to arbitrary data used by said function, e.g. undo
436 * information for GPIO settings etc. If unneeded, set data=NULL.
437 * Please note that the first (void *data) belongs to the function signature of
438 * the function passed as first parameter.
439 */
David Hendricks8bb20212011-06-14 01:35:36 +0000440int register_shutdown(int (*function) (void *data), void *data)
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000441{
442 if (shutdown_fn_count >= SHUTDOWN_MAXFN) {
Carl-Daniel Hailfinger9f5f2152010-06-04 23:20:21 +0000443 msg_perr("Tried to register more than %i shutdown functions.\n",
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000444 SHUTDOWN_MAXFN);
445 return 1;
446 }
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000447 if (!may_register_shutdown) {
448 msg_perr("Tried to register a shutdown function before "
449 "programmer init.\n");
450 return 1;
451 }
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000452 shutdown_fn[shutdown_fn_count].func = function;
453 shutdown_fn[shutdown_fn_count].data = data;
454 shutdown_fn_count++;
455
456 return 0;
457}
458
Nico Huberbcb2e5a2012-12-30 01:23:17 +0000459int programmer_init(enum programmer prog, const char *param)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000460{
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000461 int ret;
Carl-Daniel Hailfinger2e681602011-09-08 00:00:29 +0000462
463 if (prog >= PROGRAMMER_INVALID) {
464 msg_perr("Invalid programmer specified!\n");
465 return -1;
466 }
467 programmer = prog;
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000468 /* Initialize all programmer specific data. */
469 /* Default to unlimited decode sizes. */
470 max_rom_decode = (const struct decode_sizes) {
471 .parallel = 0xffffffff,
472 .lpc = 0xffffffff,
473 .fwh = 0xffffffff,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000474 .spi = 0xffffffff,
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000475 };
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000476 /* Default to top aligned flash at 4 GB. */
477 flashbase = 0;
478 /* Registering shutdown functions is now allowed. */
479 may_register_shutdown = 1;
Carl-Daniel Hailfingerd1be52d2010-07-03 12:14:25 +0000480 /* Default to allowing writes. Broken programmers set this to 0. */
481 programmer_may_write = 1;
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000482
483 programmer_param = param;
Carl-Daniel Hailfinger20a36ba2013-08-13 07:09:57 +0000484 msg_pdbg("Initializing %s programmer\n", programmer_table[programmer].name);
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000485 ret = programmer_table[programmer].init();
486 if (programmer_param && strlen(programmer_param)) {
Carl-Daniel Hailfinger20a36ba2013-08-13 07:09:57 +0000487 if (ret != 0) {
488 /* It is quite possible that any unhandled programmer parameter would have been valid,
489 * but an error in actual programmer init happened before the parameter was evaluated.
490 */
491 msg_pwarn("Unhandled programmer parameters (possibly due to another failure): %s\n",
492 programmer_param);
493 } else {
494 /* Actual programmer init was successful, but the user specified an invalid or unusable
495 * (for the current programmer configuration) parameter.
496 */
497 msg_perr("Unhandled programmer parameters: %s\n", programmer_param);
498 msg_perr("Aborting.\n");
499 ret = ERROR_FATAL;
500 }
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000501 }
502 return ret;
Uwe Hermann09e04f72009-05-16 22:36:00 +0000503}
504
Stefan Tauner20da4aa2014-05-07 22:07:23 +0000505/** Calls registered shutdown functions and resets internal programmer-related variables.
506 * Calling it is safe even without previous initialization, but further interactions with programmer support
507 * require a call to programmer_init() (afterwards).
508 *
509 * @return The OR-ed result values of all shutdown functions (i.e. 0 on success). */
Uwe Hermann09e04f72009-05-16 22:36:00 +0000510int programmer_shutdown(void)
511{
David Hendricks8bb20212011-06-14 01:35:36 +0000512 int ret = 0;
513
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000514 /* Registering shutdown functions is no longer allowed. */
515 may_register_shutdown = 0;
516 while (shutdown_fn_count > 0) {
517 int i = --shutdown_fn_count;
David Hendricks8bb20212011-06-14 01:35:36 +0000518 ret |= shutdown_fn[i].func(shutdown_fn[i].data);
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000519 }
Stefan Taunere34e3e82013-01-01 00:06:51 +0000520
Stefan Taunerb8911d62012-12-26 07:55:00 +0000521 programmer_param = NULL;
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000522 registered_master_count = 0;
Stefan Taunere34e3e82013-01-01 00:06:51 +0000523
David Hendricks8bb20212011-06-14 01:35:36 +0000524 return ret;
Uwe Hermann09e04f72009-05-16 22:36:00 +0000525}
526
Stefan Tauner305e0b92013-07-17 23:46:44 +0000527void *programmer_map_flash_region(const char *descr, uintptr_t phys_addr, size_t len)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000528{
Stefan Tauner26e7a152013-09-13 17:21:05 +0000529 void *ret = programmer_table[programmer].map_flash_region(descr, phys_addr, len);
530 msg_gspew("%s: mapping %s from 0x%0*" PRIxPTR " to 0x%0*" PRIxPTR "\n",
531 __func__, descr, PRIxPTR_WIDTH, phys_addr, PRIxPTR_WIDTH, (uintptr_t) ret);
532 return ret;
Uwe Hermann09e04f72009-05-16 22:36:00 +0000533}
534
535void programmer_unmap_flash_region(void *virt_addr, size_t len)
536{
537 programmer_table[programmer].unmap_flash_region(virt_addr, len);
Stefan Tauner4e32ec12014-08-30 23:39:51 +0000538 msg_gspew("%s: unmapped 0x%0*" PRIxPTR "\n", __func__, PRIxPTR_WIDTH, (uintptr_t)virt_addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000539}
540
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000541void chip_writeb(const struct flashctx *flash, uint8_t val, chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000542{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000543 flash->mst->par.chip_writeb(flash, val, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000544}
545
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000546void chip_writew(const struct flashctx *flash, uint16_t val, chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000547{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000548 flash->mst->par.chip_writew(flash, val, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000549}
550
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000551void chip_writel(const struct flashctx *flash, uint32_t val, chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000552{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000553 flash->mst->par.chip_writel(flash, val, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000554}
555
Mark Marshallf20b7be2014-05-09 21:16:21 +0000556void chip_writen(const struct flashctx *flash, const uint8_t *buf, chipaddr addr, size_t len)
Carl-Daniel Hailfinger0bd2a2b2009-06-05 18:32:07 +0000557{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000558 flash->mst->par.chip_writen(flash, buf, addr, len);
Carl-Daniel Hailfinger0bd2a2b2009-06-05 18:32:07 +0000559}
560
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000561uint8_t chip_readb(const struct flashctx *flash, const chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000562{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000563 return flash->mst->par.chip_readb(flash, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000564}
565
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000566uint16_t chip_readw(const struct flashctx *flash, const chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000567{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000568 return flash->mst->par.chip_readw(flash, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000569}
570
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000571uint32_t chip_readl(const struct flashctx *flash, const chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000572{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000573 return flash->mst->par.chip_readl(flash, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000574}
575
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000576void chip_readn(const struct flashctx *flash, uint8_t *buf, chipaddr addr,
577 size_t len)
Carl-Daniel Hailfinger0bd2a2b2009-06-05 18:32:07 +0000578{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000579 flash->mst->par.chip_readn(flash, buf, addr, len);
Carl-Daniel Hailfinger0bd2a2b2009-06-05 18:32:07 +0000580}
581
Stefan Taunerf80419c2014-05-02 15:41:42 +0000582void programmer_delay(unsigned int usecs)
Carl-Daniel Hailfingerca8bfc62009-06-05 17:48:08 +0000583{
Urja Rannikko8d7ec2a2013-10-21 21:49:08 +0000584 if (usecs > 0)
585 programmer_table[programmer].delay(usecs);
Carl-Daniel Hailfingerca8bfc62009-06-05 17:48:08 +0000586}
587
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000588int read_memmapped(struct flashctx *flash, uint8_t *buf, unsigned int start,
589 int unsigned len)
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000590{
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000591 chip_readn(flash, buf, flash->virtual_memory + start, len);
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000592
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000593 return 0;
594}
595
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000596/* This is a somewhat hacked function similar in some ways to strtok().
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000597 * It will look for needle with a subsequent '=' in haystack, return a copy of
598 * needle and remove everything from the first occurrence of needle to the next
599 * delimiter from haystack.
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000600 */
Nico Huberbcb2e5a2012-12-30 01:23:17 +0000601char *extract_param(const char *const *haystack, const char *needle, const char *delim)
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000602{
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000603 char *param_pos, *opt_pos, *rest;
604 char *opt = NULL;
605 int optlen;
Carl-Daniel Hailfinger27023762010-04-28 15:22:14 +0000606 int needlelen;
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000607
Carl-Daniel Hailfinger27023762010-04-28 15:22:14 +0000608 needlelen = strlen(needle);
609 if (!needlelen) {
610 msg_gerr("%s: empty needle! Please report a bug at "
611 "flashrom@flashrom.org\n", __func__);
612 return NULL;
613 }
614 /* No programmer parameters given. */
615 if (*haystack == NULL)
616 return NULL;
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000617 param_pos = strstr(*haystack, needle);
618 do {
619 if (!param_pos)
620 return NULL;
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000621 /* Needle followed by '='? */
622 if (param_pos[needlelen] == '=') {
623
624 /* Beginning of the string? */
625 if (param_pos == *haystack)
626 break;
627 /* After a delimiter? */
628 if (strchr(delim, *(param_pos - 1)))
629 break;
630 }
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000631 /* Continue searching. */
632 param_pos++;
633 param_pos = strstr(param_pos, needle);
634 } while (1);
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000635
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000636 if (param_pos) {
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000637 /* Get the string after needle and '='. */
638 opt_pos = param_pos + needlelen + 1;
639 optlen = strcspn(opt_pos, delim);
640 /* Return an empty string if the parameter was empty. */
641 opt = malloc(optlen + 1);
642 if (!opt) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000643 msg_gerr("Out of memory!\n");
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000644 exit(1);
645 }
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000646 strncpy(opt, opt_pos, optlen);
647 opt[optlen] = '\0';
648 rest = opt_pos + optlen;
649 /* Skip all delimiters after the current parameter. */
650 rest += strspn(rest, delim);
651 memmove(param_pos, rest, strlen(rest) + 1);
652 /* We could shrink haystack, but the effort is not worth it. */
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000653 }
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000654
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000655 return opt;
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000656}
657
Stefan Tauner66652442011-06-26 17:38:17 +0000658char *extract_programmer_param(const char *param_name)
Carl-Daniel Hailfinger2b6dcb32010-07-08 10:13:37 +0000659{
660 return extract_param(&programmer_param, param_name, ",");
661}
662
Sylvain "ythier" Hitier9db45512011-07-04 07:27:17 +0000663/* Returns the number of well-defined erasers for a chip. */
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +0000664static unsigned int count_usable_erasers(const struct flashctx *flash)
Stefan Tauner5368dca2011-07-01 00:19:12 +0000665{
666 unsigned int usable_erasefunctions = 0;
667 int k;
668 for (k = 0; k < NUM_ERASEFUNCTIONS; k++) {
669 if (!check_block_eraser(flash, k, 0))
670 usable_erasefunctions++;
671 }
672 return usable_erasefunctions;
673}
674
Mark Marshallf20b7be2014-05-09 21:16:21 +0000675static int compare_range(const uint8_t *wantbuf, const uint8_t *havebuf, unsigned int start, unsigned int len)
Stefan Tauner78ffbea2012-10-27 15:36:56 +0000676{
677 int ret = 0, failcount = 0;
678 unsigned int i;
679 for (i = 0; i < len; i++) {
680 if (wantbuf[i] != havebuf[i]) {
681 /* Only print the first failure. */
682 if (!failcount++)
683 msg_cerr("FAILED at 0x%08x! Expected=0x%02x, Found=0x%02x,",
684 start + i, wantbuf[i], havebuf[i]);
685 }
686 }
687 if (failcount) {
688 msg_cerr(" failed byte count from 0x%08x-0x%08x: 0x%x\n",
689 start, start + len - 1, failcount);
690 ret = -1;
691 }
692 return ret;
693}
694
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000695/* start is an offset to the base address of the flash chip */
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000696int check_erased_range(struct flashctx *flash, unsigned int start,
697 unsigned int len)
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000698{
699 int ret;
700 uint8_t *cmpbuf = malloc(len);
701
702 if (!cmpbuf) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000703 msg_gerr("Could not allocate memory!\n");
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000704 exit(1);
705 }
706 memset(cmpbuf, 0xff, len);
Stefan Tauner78ffbea2012-10-27 15:36:56 +0000707 ret = verify_range(flash, cmpbuf, start, len);
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000708 free(cmpbuf);
709 return ret;
710}
711
Uwe Hermann48ec1b12010-08-08 17:01:18 +0000712/*
Carl-Daniel Hailfingerd0250a32009-11-25 17:05:52 +0000713 * @cmpbuf buffer to compare against, cmpbuf[0] is expected to match the
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000714 * flash content at location start
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000715 * @start offset to the base address of the flash chip
716 * @len length of the verified area
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000717 * @return 0 for success, -1 for failure
718 */
Mark Marshallf20b7be2014-05-09 21:16:21 +0000719int verify_range(struct flashctx *flash, const uint8_t *cmpbuf, unsigned int start, unsigned int len)
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000720{
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000721 if (!len)
Stefan Taunerdf64a422014-05-27 00:06:14 +0000722 return -1;
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000723
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +0000724 if (!flash->chip->read) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000725 msg_cerr("ERROR: flashrom has no read function for this flash chip.\n");
Stefan Taunerdf64a422014-05-27 00:06:14 +0000726 return -1;
Carl-Daniel Hailfinger23290662009-06-24 08:20:45 +0000727 }
Stefan Taunerdf64a422014-05-27 00:06:14 +0000728
729 uint8_t *readbuf = malloc(len);
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000730 if (!readbuf) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000731 msg_gerr("Could not allocate memory!\n");
Stefan Taunerdf64a422014-05-27 00:06:14 +0000732 return -1;
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000733 }
Stefan Taunerdf64a422014-05-27 00:06:14 +0000734 int ret = 0;
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000735
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +0000736 if (start + len > flash->chip->total_size * 1024) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000737 msg_gerr("Error: %s called with start 0x%x + len 0x%x >"
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000738 " total_size 0x%x\n", __func__, start, len,
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +0000739 flash->chip->total_size * 1024);
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000740 ret = -1;
741 goto out_free;
742 }
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000743
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +0000744 ret = flash->chip->read(flash, readbuf, start, len);
Carl-Daniel Hailfingerd8369412010-11-16 17:21:58 +0000745 if (ret) {
746 msg_gerr("Verification impossible because read failed "
747 "at 0x%x (len 0x%x)\n", start, len);
Stefan Taunerdf64a422014-05-27 00:06:14 +0000748 ret = -1;
749 goto out_free;
Carl-Daniel Hailfingerd8369412010-11-16 17:21:58 +0000750 }
751
Stefan Tauner78ffbea2012-10-27 15:36:56 +0000752 ret = compare_range(cmpbuf, readbuf, start, len);
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000753out_free:
754 free(readbuf);
755 return ret;
756}
757
Stefan Tauner02437452013-04-01 19:34:53 +0000758/* Helper function for need_erase() that focuses on granularities of gran bytes. */
Mark Marshallf20b7be2014-05-09 21:16:21 +0000759static 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 +0000760{
761 unsigned int i, j, limit;
762 for (j = 0; j < len / gran; j++) {
763 limit = min (gran, len - j * gran);
764 /* Are 'have' and 'want' identical? */
765 if (!memcmp(have + j * gran, want + j * gran, limit))
766 continue;
767 /* have needs to be in erased state. */
768 for (i = 0; i < limit; i++)
769 if (have[j * gran + i] != 0xff)
770 return 1;
771 }
772 return 0;
773}
774
Uwe Hermann48ec1b12010-08-08 17:01:18 +0000775/*
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000776 * Check if the buffer @have can be programmed to the content of @want without
777 * erasing. This is only possible if all chunks of size @gran are either kept
778 * as-is or changed from an all-ones state to any other state.
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000779 *
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000780 * Warning: This function assumes that @have and @want point to naturally
781 * aligned regions.
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000782 *
783 * @have buffer with current content
784 * @want buffer with desired content
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000785 * @len length of the checked area
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000786 * @gran write granularity (enum, not count)
787 * @return 0 if no erase is needed, 1 otherwise
788 */
Mark Marshallf20b7be2014-05-09 21:16:21 +0000789int 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 +0000790{
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +0000791 int result = 0;
Stefan Tauner02437452013-04-01 19:34:53 +0000792 unsigned int i;
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000793
794 switch (gran) {
795 case write_gran_1bit:
796 for (i = 0; i < len; i++)
797 if ((have[i] & want[i]) != want[i]) {
798 result = 1;
799 break;
800 }
801 break;
802 case write_gran_1byte:
803 for (i = 0; i < len; i++)
804 if ((have[i] != want[i]) && (have[i] != 0xff)) {
805 result = 1;
806 break;
807 }
808 break;
Paul Kocialkowskic8305e12015-10-16 02:16:20 +0000809 case write_gran_128bytes:
810 result = need_erase_gran_bytes(have, want, len, 128);
811 break;
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000812 case write_gran_256bytes:
Stefan Tauner02437452013-04-01 19:34:53 +0000813 result = need_erase_gran_bytes(have, want, len, 256);
814 break;
815 case write_gran_264bytes:
816 result = need_erase_gran_bytes(have, want, len, 264);
817 break;
818 case write_gran_512bytes:
819 result = need_erase_gran_bytes(have, want, len, 512);
820 break;
821 case write_gran_528bytes:
822 result = need_erase_gran_bytes(have, want, len, 528);
823 break;
824 case write_gran_1024bytes:
825 result = need_erase_gran_bytes(have, want, len, 1024);
826 break;
827 case write_gran_1056bytes:
828 result = need_erase_gran_bytes(have, want, len, 1056);
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000829 break;
Carl-Daniel Hailfinger1b0e9fc2014-06-16 22:36:17 +0000830 case write_gran_1byte_implicit_erase:
831 /* Do not erase, handle content changes from anything->0xff by writing 0xff. */
832 result = 0;
833 break;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000834 default:
835 msg_cerr("%s: Unsupported granularity! Please report a bug at "
836 "flashrom@flashrom.org\n", __func__);
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000837 }
838 return result;
839}
840
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000841/**
842 * Check if the buffer @have needs to be programmed to get the content of @want.
843 * If yes, return 1 and fill in first_start with the start address of the
844 * write operation and first_len with the length of the first to-be-written
845 * chunk. If not, return 0 and leave first_start and first_len undefined.
846 *
847 * Warning: This function assumes that @have and @want point to naturally
848 * aligned regions.
849 *
850 * @have buffer with current content
851 * @want buffer with desired content
852 * @len length of the checked area
853 * @gran write granularity (enum, not count)
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000854 * @first_start offset of the first byte which needs to be written (passed in
855 * value is increased by the offset of the first needed write
856 * relative to have/want or unchanged if no write is needed)
857 * @return length of the first contiguous area which needs to be written
858 * 0 if no write is needed
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000859 *
860 * FIXME: This function needs a parameter which tells it about coalescing
861 * in relation to the max write length of the programmer and the max write
862 * length of the chip.
863 */
Mark Marshallf20b7be2014-05-09 21:16:21 +0000864static unsigned int get_next_write(const uint8_t *have, const uint8_t *want, unsigned int len,
Stefan Taunerc69c9c82011-11-23 09:13:48 +0000865 unsigned int *first_start,
866 enum write_granularity gran)
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000867{
Stefan Taunerc69c9c82011-11-23 09:13:48 +0000868 int need_write = 0;
869 unsigned int rel_start = 0, first_len = 0;
870 unsigned int i, limit, stride;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000871
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000872 switch (gran) {
873 case write_gran_1bit:
874 case write_gran_1byte:
Carl-Daniel Hailfinger1b0e9fc2014-06-16 22:36:17 +0000875 case write_gran_1byte_implicit_erase:
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000876 stride = 1;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000877 break;
Paul Kocialkowskic8305e12015-10-16 02:16:20 +0000878 case write_gran_128bytes:
879 stride = 128;
880 break;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000881 case write_gran_256bytes:
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000882 stride = 256;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000883 break;
Stefan Tauner02437452013-04-01 19:34:53 +0000884 case write_gran_264bytes:
885 stride = 264;
886 break;
887 case write_gran_512bytes:
888 stride = 512;
889 break;
890 case write_gran_528bytes:
891 stride = 528;
892 break;
893 case write_gran_1024bytes:
894 stride = 1024;
895 break;
896 case write_gran_1056bytes:
897 stride = 1056;
898 break;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000899 default:
900 msg_cerr("%s: Unsupported granularity! Please report a bug at "
901 "flashrom@flashrom.org\n", __func__);
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000902 /* Claim that no write was needed. A write with unknown
903 * granularity is too dangerous to try.
904 */
905 return 0;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000906 }
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000907 for (i = 0; i < len / stride; i++) {
908 limit = min(stride, len - i * stride);
909 /* Are 'have' and 'want' identical? */
910 if (memcmp(have + i * stride, want + i * stride, limit)) {
911 if (!need_write) {
912 /* First location where have and want differ. */
913 need_write = 1;
914 rel_start = i * stride;
915 }
916 } else {
917 if (need_write) {
918 /* First location where have and want
919 * do not differ anymore.
920 */
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000921 break;
922 }
923 }
924 }
Carl-Daniel Hailfinger202bf532010-12-06 13:05:44 +0000925 if (need_write)
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000926 first_len = min(i * stride - rel_start, len);
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000927 *first_start += rel_start;
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000928 return first_len;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000929}
930
Carl-Daniel Hailfingereaac68b2009-11-23 12:55:31 +0000931/* This function generates various test patterns useful for testing controller
932 * and chip communication as well as chip behaviour.
933 *
934 * If a byte can be written multiple times, each time keeping 0-bits at 0
935 * and changing 1-bits to 0 if the new value for that bit is 0, the effect
936 * is essentially an AND operation. That's also the reason why this function
937 * provides the result of AND between various patterns.
938 *
939 * Below is a list of patterns (and their block length).
940 * Pattern 0 is 05 15 25 35 45 55 65 75 85 95 a5 b5 c5 d5 e5 f5 (16 Bytes)
941 * Pattern 1 is 0a 1a 2a 3a 4a 5a 6a 7a 8a 9a aa ba ca da ea fa (16 Bytes)
942 * Pattern 2 is 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f (16 Bytes)
943 * Pattern 3 is a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af (16 Bytes)
944 * Pattern 4 is 00 10 20 30 40 50 60 70 80 90 a0 b0 c0 d0 e0 f0 (16 Bytes)
945 * Pattern 5 is 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f (16 Bytes)
946 * Pattern 6 is 00 (1 Byte)
947 * Pattern 7 is ff (1 Byte)
948 * Patterns 0-7 have a big-endian block number in the last 2 bytes of each 256
949 * byte block.
950 *
951 * Pattern 8 is 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11... (256 B)
952 * Pattern 9 is ff fe fd fc fb fa f9 f8 f7 f6 f5 f4 f3 f2 f1 f0 ef ee... (256 B)
953 * Pattern 10 is 00 00 00 01 00 02 00 03 00 04... (128 kB big-endian counter)
954 * Pattern 11 is ff ff ff fe ff fd ff fc ff fb... (128 kB big-endian downwards)
955 * Pattern 12 is 00 (1 Byte)
956 * Pattern 13 is ff (1 Byte)
957 * Patterns 8-13 have no block number.
958 *
959 * Patterns 0-3 are created to detect and efficiently diagnose communication
960 * slips like missed bits or bytes and their repetitive nature gives good visual
961 * cues to the person inspecting the results. In addition, the following holds:
962 * AND Pattern 0/1 == Pattern 4
963 * AND Pattern 2/3 == Pattern 5
964 * AND Pattern 0/1/2/3 == AND Pattern 4/5 == Pattern 6
965 * A weakness of pattern 0-5 is the inability to detect swaps/copies between
966 * any two 16-byte blocks except for the last 16-byte block in a 256-byte bloc.
967 * They work perfectly for detecting any swaps/aliasing of blocks >= 256 bytes.
968 * 0x5 and 0xa were picked because they are 0101 and 1010 binary.
969 * Patterns 8-9 are best for detecting swaps/aliasing of blocks < 256 bytes.
970 * Besides that, they provide for bit testing of the last two bytes of every
971 * 256 byte block which contains the block number for patterns 0-6.
972 * Patterns 10-11 are special purpose for detecting subblock aliasing with
973 * block sizes >256 bytes (some Dataflash chips etc.)
974 * AND Pattern 8/9 == Pattern 12
975 * AND Pattern 10/11 == Pattern 12
976 * Pattern 13 is the completely erased state.
977 * None of the patterns can detect aliasing at boundaries which are a multiple
978 * of 16 MBytes (but such chips do not exist anyway for Parallel/LPC/FWH/SPI).
979 */
980int generate_testpattern(uint8_t *buf, uint32_t size, int variant)
981{
982 int i;
983
984 if (!buf) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000985 msg_gerr("Invalid buffer!\n");
Carl-Daniel Hailfingereaac68b2009-11-23 12:55:31 +0000986 return 1;
987 }
988
989 switch (variant) {
990 case 0:
991 for (i = 0; i < size; i++)
992 buf[i] = (i & 0xf) << 4 | 0x5;
993 break;
994 case 1:
995 for (i = 0; i < size; i++)
996 buf[i] = (i & 0xf) << 4 | 0xa;
997 break;
998 case 2:
999 for (i = 0; i < size; i++)
1000 buf[i] = 0x50 | (i & 0xf);
1001 break;
1002 case 3:
1003 for (i = 0; i < size; i++)
1004 buf[i] = 0xa0 | (i & 0xf);
1005 break;
1006 case 4:
1007 for (i = 0; i < size; i++)
1008 buf[i] = (i & 0xf) << 4;
1009 break;
1010 case 5:
1011 for (i = 0; i < size; i++)
1012 buf[i] = i & 0xf;
1013 break;
1014 case 6:
1015 memset(buf, 0x00, size);
1016 break;
1017 case 7:
1018 memset(buf, 0xff, size);
1019 break;
1020 case 8:
1021 for (i = 0; i < size; i++)
1022 buf[i] = i & 0xff;
1023 break;
1024 case 9:
1025 for (i = 0; i < size; i++)
1026 buf[i] = ~(i & 0xff);
1027 break;
1028 case 10:
1029 for (i = 0; i < size % 2; i++) {
1030 buf[i * 2] = (i >> 8) & 0xff;
1031 buf[i * 2 + 1] = i & 0xff;
1032 }
1033 if (size & 0x1)
1034 buf[i * 2] = (i >> 8) & 0xff;
1035 break;
1036 case 11:
1037 for (i = 0; i < size % 2; i++) {
1038 buf[i * 2] = ~((i >> 8) & 0xff);
1039 buf[i * 2 + 1] = ~(i & 0xff);
1040 }
1041 if (size & 0x1)
1042 buf[i * 2] = ~((i >> 8) & 0xff);
1043 break;
1044 case 12:
1045 memset(buf, 0x00, size);
1046 break;
1047 case 13:
1048 memset(buf, 0xff, size);
1049 break;
1050 }
1051
1052 if ((variant >= 0) && (variant <= 7)) {
1053 /* Write block number in the last two bytes of each 256-byte
1054 * block, big endian for easier reading of the hexdump.
1055 * Note that this wraps around for chips larger than 2^24 bytes
1056 * (16 MB).
1057 */
1058 for (i = 0; i < size / 256; i++) {
1059 buf[i * 256 + 254] = (i >> 8) & 0xff;
1060 buf[i * 256 + 255] = i & 0xff;
1061 }
1062 }
1063
1064 return 0;
1065}
1066
Stefan Tauner9e3a6982014-08-15 17:17:59 +00001067/* Returns the number of busses commonly supported by the current programmer and flash chip where the latter
1068 * can not be completely accessed due to size/address limits of the programmer. */
1069unsigned int count_max_decode_exceedings(const struct flashctx *flash)
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001070{
Stefan Tauner9e3a6982014-08-15 17:17:59 +00001071 unsigned int limitexceeded = 0;
1072 uint32_t size = flash->chip->total_size * 1024;
1073 enum chipbustype buses = flash->mst->buses_supported & flash->chip->bustype;
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001074
1075 if ((buses & BUS_PARALLEL) && (max_rom_decode.parallel < size)) {
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001076 limitexceeded++;
Sean Nelson316a29f2010-05-07 20:09:04 +00001077 msg_pdbg("Chip size %u kB is bigger than supported "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001078 "size %u kB of chipset/board/programmer "
1079 "for %s interface, "
1080 "probe/read/erase/write may fail. ", size / 1024,
1081 max_rom_decode.parallel / 1024, "Parallel");
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001082 }
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001083 if ((buses & BUS_LPC) && (max_rom_decode.lpc < size)) {
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001084 limitexceeded++;
Sean Nelson316a29f2010-05-07 20:09:04 +00001085 msg_pdbg("Chip size %u kB is bigger than supported "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001086 "size %u kB of chipset/board/programmer "
1087 "for %s interface, "
1088 "probe/read/erase/write may fail. ", size / 1024,
1089 max_rom_decode.lpc / 1024, "LPC");
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001090 }
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001091 if ((buses & BUS_FWH) && (max_rom_decode.fwh < size)) {
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001092 limitexceeded++;
Sean Nelson316a29f2010-05-07 20:09:04 +00001093 msg_pdbg("Chip size %u kB is bigger than supported "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001094 "size %u kB of chipset/board/programmer "
1095 "for %s interface, "
1096 "probe/read/erase/write may fail. ", size / 1024,
1097 max_rom_decode.fwh / 1024, "FWH");
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001098 }
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001099 if ((buses & BUS_SPI) && (max_rom_decode.spi < size)) {
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001100 limitexceeded++;
Sean Nelson316a29f2010-05-07 20:09:04 +00001101 msg_pdbg("Chip size %u kB is bigger than supported "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001102 "size %u kB of chipset/board/programmer "
1103 "for %s interface, "
1104 "probe/read/erase/write may fail. ", size / 1024,
1105 max_rom_decode.spi / 1024, "SPI");
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001106 }
Stefan Tauner9e3a6982014-08-15 17:17:59 +00001107 return limitexceeded;
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001108}
1109
Stefan Tauner4e32ec12014-08-30 23:39:51 +00001110void unmap_flash(struct flashctx *flash)
1111{
1112 if (flash->virtual_registers != (chipaddr)ERROR_PTR) {
1113 programmer_unmap_flash_region((void *)flash->virtual_registers, flash->chip->total_size * 1024);
1114 flash->physical_registers = 0;
1115 flash->virtual_registers = (chipaddr)ERROR_PTR;
1116 }
1117
1118 if (flash->virtual_memory != (chipaddr)ERROR_PTR) {
1119 programmer_unmap_flash_region((void *)flash->virtual_memory, flash->chip->total_size * 1024);
1120 flash->physical_memory = 0;
1121 flash->virtual_memory = (chipaddr)ERROR_PTR;
1122 }
1123}
1124
1125int map_flash(struct flashctx *flash)
1126{
1127 /* Init pointers to the fail-safe state to distinguish them later from legit values. */
1128 flash->virtual_memory = (chipaddr)ERROR_PTR;
1129 flash->virtual_registers = (chipaddr)ERROR_PTR;
1130
1131 /* FIXME: This avoids mapping (and unmapping) of flash chip definitions with size 0.
1132 * These are used for various probing-related hacks that would not map successfully anyway and should be
1133 * removed ASAP. */
1134 if (flash->chip->total_size == 0)
1135 return 0;
1136
1137 const chipsize_t size = flash->chip->total_size * 1024;
1138 uintptr_t base = flashbase ? flashbase : (0xffffffff - size + 1);
1139 void *addr = programmer_map_flash_region(flash->chip->name, base, size);
1140 if (addr == ERROR_PTR) {
1141 msg_perr("Could not map flash chip %s at 0x%0*" PRIxPTR ".\n",
1142 flash->chip->name, PRIxPTR_WIDTH, base);
1143 return 1;
1144 }
1145 flash->physical_memory = base;
1146 flash->virtual_memory = (chipaddr)addr;
1147
1148 /* FIXME: Special function registers normally live 4 MByte below flash space, but it might be somewhere
1149 * completely different on some chips and programmers, or not mappable at all.
1150 * Ignore these problems for now and always report success. */
1151 if (flash->chip->feature_bits & FEATURE_REGISTERMAP) {
1152 base = 0xffffffff - size - 0x400000 + 1;
1153 addr = programmer_map_flash_region("flash chip registers", base, size);
1154 if (addr == ERROR_PTR) {
1155 msg_pdbg2("Could not map flash chip registers %s at 0x%0*" PRIxPTR ".\n",
1156 flash->chip->name, PRIxPTR_WIDTH, base);
1157 return 0;
1158 }
1159 flash->physical_registers = base;
1160 flash->virtual_registers = (chipaddr)addr;
1161 }
1162 return 0;
1163}
1164
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +00001165int probe_flash(struct registered_master *mst, int startchip, struct flashctx *flash, int force)
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001166{
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001167 const struct flashchip *chip;
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001168 enum chipbustype buses_common;
Carl-Daniel Hailfingerb22918c2009-06-01 02:08:58 +00001169 char *tmp;
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001170
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001171 for (chip = flashchips + startchip; chip && chip->name; chip++) {
1172 if (chip_to_probe && strcmp(chip->name, chip_to_probe) != 0)
Ollie Lhocbbf1252004-03-17 22:22:08 +00001173 continue;
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +00001174 buses_common = mst->buses_supported & chip->bustype;
Carl-Daniel Hailfingerc40cff72011-12-20 00:19:29 +00001175 if (!buses_common)
Carl-Daniel Hailfinger6573b742011-06-17 22:38:53 +00001176 continue;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001177 msg_gdbg("Probing for %s %s, %d kB: ", chip->vendor, chip->name, chip->total_size);
1178 if (!chip->probe && !force) {
1179 msg_gdbg("failed! flashrom has no probe function for this flash chip.\n");
Carl-Daniel Hailfingerb22918c2009-06-01 02:08:58 +00001180 continue;
1181 }
Stefan Reinauer70385642007-04-06 11:58:03 +00001182
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001183 /* Start filling in the dynamic data. */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001184 flash->chip = calloc(1, sizeof(struct flashchip));
1185 if (!flash->chip) {
1186 msg_gerr("Out of memory!\n");
1187 exit(1);
1188 }
1189 memcpy(flash->chip, chip, sizeof(struct flashchip));
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +00001190 flash->mst = mst;
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001191
Stefan Tauner4e32ec12014-08-30 23:39:51 +00001192 if (map_flash(flash) != 0)
1193 return -1;
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001194
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001195 /* We handle a forced match like a real match, we just avoid probing. Note that probe_flash()
1196 * is only called with force=1 after normal probing failed.
1197 */
Peter Stuge27c3e2d2008-07-02 17:15:47 +00001198 if (force)
1199 break;
Stefan Reinauerfcb63682006-03-16 16:57:41 +00001200
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001201 if (flash->chip->probe(flash) != 1)
Peter Stuge483b8f02008-09-03 23:10:05 +00001202 goto notfound;
1203
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001204 /* If this is the first chip found, accept it.
1205 * If this is not the first chip found, accept it only if it is
Stefan Taunerac1b4c82012-02-17 14:51:04 +00001206 * a non-generic match. SFDP and CFI are generic matches.
1207 * startchip==0 means this call to probe_flash() is the first
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +00001208 * one for this programmer interface (master) and thus no other chip has
Stefan Taunerac1b4c82012-02-17 14:51:04 +00001209 * been found on this interface.
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001210 */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001211 if (startchip == 0 && flash->chip->model_id == SFDP_DEVICE_ID) {
Stefan Taunerac1b4c82012-02-17 14:51:04 +00001212 msg_cinfo("===\n"
1213 "SFDP has autodetected a flash chip which is "
1214 "not natively supported by flashrom yet.\n");
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001215 if (count_usable_erasers(flash) == 0)
Stefan Taunerac1b4c82012-02-17 14:51:04 +00001216 msg_cinfo("The standard operations read and "
1217 "verify should work, but to support "
1218 "erase, write and all other "
1219 "possible features");
1220 else
1221 msg_cinfo("All standard operations (read, "
1222 "verify, erase and write) should "
1223 "work, but to support all possible "
1224 "features");
1225
Stefan Taunerb4e06bd2012-08-20 00:24:22 +00001226 msg_cinfo(" we need to add them manually.\n"
1227 "You can help us by mailing us the output of the following command to "
1228 "flashrom@flashrom.org:\n"
1229 "'flashrom -VV [plus the -p/--programmer parameter]'\n"
1230 "Thanks for your help!\n"
Stefan Taunerac1b4c82012-02-17 14:51:04 +00001231 "===\n");
1232 }
1233
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001234 /* First flash chip detected on this bus. */
1235 if (startchip == 0)
Peter Stuge27c3e2d2008-07-02 17:15:47 +00001236 break;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001237 /* Not the first flash chip detected on this bus, but not a generic match either. */
1238 if ((flash->chip->model_id != GENERIC_DEVICE_ID) && (flash->chip->model_id != SFDP_DEVICE_ID))
1239 break;
1240 /* 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 +00001241notfound:
Stefan Tauner4e32ec12014-08-30 23:39:51 +00001242 unmap_flash(flash);
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001243 free(flash->chip);
1244 flash->chip = NULL;
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001245 }
Uwe Hermannffec5f32007-08-23 16:08:21 +00001246
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001247 if (!flash->chip)
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001248 return -1;
Peter Stuge27c3e2d2008-07-02 17:15:47 +00001249
Nico Huber7af0e792016-04-29 16:40:15 +02001250 /* Fill fallback layout covering the whole chip. */
1251 struct single_layout *const fallback = &flash->fallback_layout;
1252 fallback->base.entries = &fallback->entry;
1253 fallback->base.num_entries = 1;
1254 fallback->entry.start = 0;
1255 fallback->entry.end = flash->chip->total_size * 1024 - 1;
1256 fallback->entry.included = true;
1257 strcpy(fallback->entry.name, "complete flash");
Stefan Reinauer051e2362011-01-19 06:21:54 +00001258
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001259 tmp = flashbuses_to_text(flash->chip->bustype);
Stefan Tauner4e32ec12014-08-30 23:39:51 +00001260 msg_cinfo("%s %s flash chip \"%s\" (%d kB, %s) ", force ? "Assuming" : "Found",
1261 flash->chip->vendor, flash->chip->name, flash->chip->total_size, tmp);
Stefan Tauner00155492011-06-26 20:45:35 +00001262 free(tmp);
Stefan Tauner4e32ec12014-08-30 23:39:51 +00001263#if CONFIG_INTERNAL == 1
1264 if (programmer_table[programmer].map_flash_region == physmap)
1265 msg_cinfo("mapped at physical address 0x%0*" PRIxPTR ".\n",
1266 PRIxPTR_WIDTH, flash->physical_memory);
1267 else
1268#endif
1269 msg_cinfo("on %s.\n", programmer_table[programmer].name);
Uwe Hermann9899cad2009-06-28 21:47:57 +00001270
Stefan Tauner4e32ec12014-08-30 23:39:51 +00001271 /* Flash registers may more likely not be mapped if the chip was forced.
1272 * Lock info may be stored in registers, so avoid lock info printing. */
Carl-Daniel Hailfinger859f3f02010-12-02 21:59:42 +00001273 if (!force)
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001274 if (flash->chip->printlock)
1275 flash->chip->printlock(flash);
Sean Nelson6e0b9122010-02-19 00:52:10 +00001276
Stefan Tauner4e32ec12014-08-30 23:39:51 +00001277 /* Get out of the way for later runs. */
1278 unmap_flash(flash);
1279
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001280 /* Return position of matching chip. */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001281 return chip - flashchips;
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001282}
1283
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001284int read_buf_from_file(unsigned char *buf, unsigned long size,
1285 const char *filename)
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001286{
Nico Huber7562f7d2013-08-30 21:29:45 +00001287#ifdef __LIBPAYLOAD__
1288 msg_gerr("Error: No file I/O support in libpayload\n");
1289 return 1;
1290#else
Stefan Tauner16687702015-12-25 21:59:45 +00001291 int ret = 0;
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001292
Stefan Tauner16687702015-12-25 21:59:45 +00001293 FILE *image;
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001294 if ((image = fopen(filename, "rb")) == NULL) {
Stefan Tauner363fd7e2013-04-07 13:08:30 +00001295 msg_gerr("Error: opening file \"%s\" failed: %s\n", filename, strerror(errno));
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001296 return 1;
1297 }
Stefan Tauner16687702015-12-25 21:59:45 +00001298
1299 struct stat image_stat;
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001300 if (fstat(fileno(image), &image_stat) != 0) {
Stefan Tauner363fd7e2013-04-07 13:08:30 +00001301 msg_gerr("Error: getting metadata of file \"%s\" failed: %s\n", filename, strerror(errno));
Stefan Tauner16687702015-12-25 21:59:45 +00001302 ret = 1;
1303 goto out;
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001304 }
1305 if (image_stat.st_size != size) {
Carl-Daniel Hailfinger11990da2013-07-13 23:21:05 +00001306 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 +00001307 (intmax_t)image_stat.st_size, size);
Stefan Tauner16687702015-12-25 21:59:45 +00001308 ret = 1;
1309 goto out;
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001310 }
Stefan Tauner16687702015-12-25 21:59:45 +00001311
1312 unsigned long numbytes = fread(buf, 1, size, image);
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001313 if (numbytes != size) {
1314 msg_gerr("Error: Failed to read complete file. Got %ld bytes, "
1315 "wanted %ld!\n", numbytes, size);
Stefan Tauner16687702015-12-25 21:59:45 +00001316 ret = 1;
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001317 }
Stefan Tauner16687702015-12-25 21:59:45 +00001318out:
1319 (void)fclose(image);
1320 return ret;
Nico Huber7562f7d2013-08-30 21:29:45 +00001321#endif
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001322}
1323
Mark Marshallf20b7be2014-05-09 21:16:21 +00001324int write_buf_to_file(const unsigned char *buf, unsigned long size, const char *filename)
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001325{
Nico Huber7562f7d2013-08-30 21:29:45 +00001326#ifdef __LIBPAYLOAD__
1327 msg_gerr("Error: No file I/O support in libpayload\n");
1328 return 1;
1329#else
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001330 FILE *image;
Stefan Tauner16687702015-12-25 21:59:45 +00001331 int ret = 0;
Stephan Guilloux21dd55b2009-06-01 22:07:52 +00001332
1333 if (!filename) {
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001334 msg_gerr("No filename specified.\n");
Stephan Guilloux21dd55b2009-06-01 22:07:52 +00001335 return 1;
1336 }
Patrick Georgi0bf842d2010-01-25 22:55:33 +00001337 if ((image = fopen(filename, "wb")) == NULL) {
Stefan Tauner363fd7e2013-04-07 13:08:30 +00001338 msg_gerr("Error: opening file \"%s\" failed: %s\n", filename, strerror(errno));
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00001339 return 1;
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001340 }
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001341
Stefan Tauner16687702015-12-25 21:59:45 +00001342 unsigned long numbytes = fwrite(buf, 1, size, image);
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001343 if (numbytes != size) {
Stefan Tauner16687702015-12-25 21:59:45 +00001344 msg_gerr("Error: file %s could not be written completely.\n", filename);
1345 ret = 1;
1346 goto out;
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001347 }
Stefan Tauner16687702015-12-25 21:59:45 +00001348 if (fflush(image)) {
1349 msg_gerr("Error: flushing file \"%s\" failed: %s\n", filename, strerror(errno));
1350 ret = 1;
1351 }
1352 // Try to fsync() only regular files and if that function is available at all (e.g. not on MinGW).
1353#if defined(_POSIX_FSYNC) && (_POSIX_FSYNC != -1)
1354 struct stat image_stat;
1355 if (fstat(fileno(image), &image_stat) != 0) {
1356 msg_gerr("Error: getting metadata of file \"%s\" failed: %s\n", filename, strerror(errno));
1357 ret = 1;
1358 goto out;
1359 }
1360 if (S_ISREG(image_stat.st_mode)) {
1361 if (fsync(fileno(image))) {
1362 msg_gerr("Error: fsyncing file \"%s\" failed: %s\n", filename, strerror(errno));
1363 ret = 1;
1364 }
1365 }
1366#endif
1367out:
1368 if (fclose(image)) {
1369 msg_gerr("Error: closing file \"%s\" failed: %s\n", filename, strerror(errno));
1370 ret = 1;
1371 }
1372 return ret;
Nico Huber7562f7d2013-08-30 21:29:45 +00001373#endif
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001374}
1375
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001376int read_flash_to_file(struct flashctx *flash, const char *filename)
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001377{
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001378 unsigned long size = flash->chip->total_size * 1024;
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001379 unsigned char *buf = calloc(size, sizeof(char));
1380 int ret = 0;
1381
1382 msg_cinfo("Reading flash... ");
1383 if (!buf) {
1384 msg_gerr("Memory allocation failed!\n");
1385 msg_cinfo("FAILED.\n");
1386 return 1;
1387 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001388 if (!flash->chip->read) {
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001389 msg_cerr("No read function available for this flash chip.\n");
1390 ret = 1;
1391 goto out_free;
1392 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001393 if (flash->chip->read(flash, buf, 0, size)) {
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001394 msg_cerr("Read operation failed!\n");
1395 ret = 1;
1396 goto out_free;
1397 }
1398
Stefan Tauner355cbfd2011-05-28 02:37:14 +00001399 ret = write_buf_to_file(buf, size, filename);
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001400out_free:
1401 free(buf);
1402 msg_cinfo("%s.\n", ret ? "FAILED" : "done");
1403 return ret;
1404}
1405
Stefan Tauner96658be2014-05-26 22:05:31 +00001406/* Even if an error is found, the function will keep going and check the rest. */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001407static int selfcheck_eraseblocks(const struct flashchip *chip)
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001408{
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +00001409 int i, j, k;
1410 int ret = 0;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001411
1412 for (k = 0; k < NUM_ERASEFUNCTIONS; k++) {
1413 unsigned int done = 0;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001414 struct block_eraser eraser = chip->block_erasers[k];
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001415
1416 for (i = 0; i < NUM_ERASEREGIONS; i++) {
1417 /* Blocks with zero size are bugs in flashchips.c. */
1418 if (eraser.eraseblocks[i].count &&
1419 !eraser.eraseblocks[i].size) {
1420 msg_gerr("ERROR: Flash chip %s erase function "
1421 "%i region %i has size 0. Please report"
1422 " a bug at flashrom@flashrom.org\n",
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001423 chip->name, k, i);
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001424 ret = 1;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001425 }
1426 /* Blocks with zero count are bugs in flashchips.c. */
1427 if (!eraser.eraseblocks[i].count &&
1428 eraser.eraseblocks[i].size) {
1429 msg_gerr("ERROR: Flash chip %s erase function "
1430 "%i region %i has count 0. Please report"
1431 " a bug at flashrom@flashrom.org\n",
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001432 chip->name, k, i);
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001433 ret = 1;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001434 }
1435 done += eraser.eraseblocks[i].count *
1436 eraser.eraseblocks[i].size;
1437 }
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001438 /* Empty eraseblock definition with erase function. */
1439 if (!done && eraser.block_erase)
Sean Nelson316a29f2010-05-07 20:09:04 +00001440 msg_gspew("Strange: Empty eraseblock definition with "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001441 "non-empty erase function. Not an error.\n");
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001442 if (!done)
1443 continue;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001444 if (done != chip->total_size * 1024) {
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001445 msg_gerr("ERROR: Flash chip %s erase function %i "
1446 "region walking resulted in 0x%06x bytes total,"
1447 " expected 0x%06x bytes. Please report a bug at"
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001448 " flashrom@flashrom.org\n", chip->name, k,
1449 done, chip->total_size * 1024);
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001450 ret = 1;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001451 }
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001452 if (!eraser.block_erase)
1453 continue;
1454 /* Check if there are identical erase functions for different
1455 * layouts. That would imply "magic" erase functions. The
1456 * easiest way to check this is with function pointers.
1457 */
Uwe Hermann43959702010-03-13 17:28:29 +00001458 for (j = k + 1; j < NUM_ERASEFUNCTIONS; j++) {
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001459 if (eraser.block_erase ==
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001460 chip->block_erasers[j].block_erase) {
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001461 msg_gerr("ERROR: Flash chip %s erase function "
1462 "%i and %i are identical. Please report"
1463 " a bug at flashrom@flashrom.org\n",
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001464 chip->name, k, j);
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001465 ret = 1;
1466 }
Uwe Hermann43959702010-03-13 17:28:29 +00001467 }
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001468 }
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001469 return ret;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001470}
1471
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001472static int erase_and_write_block_helper(struct flashctx *flash,
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001473 unsigned int start, unsigned int len,
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001474 uint8_t *curcontents,
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001475 uint8_t *newcontents,
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001476 int (*erasefn) (struct flashctx *flash,
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001477 unsigned int addr,
1478 unsigned int len))
1479{
Stefan Taunerc69c9c82011-11-23 09:13:48 +00001480 unsigned int starthere = 0, lenhere = 0;
1481 int ret = 0, skip = 1, writecount = 0;
Stefan Tauner50d67aa2013-03-03 23:49:48 +00001482 enum write_granularity gran = flash->chip->gran;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001483
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001484 /* curcontents and newcontents are opaque to walk_eraseregions, and
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001485 * need to be adjusted here to keep the impression of proper abstraction
1486 */
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001487 curcontents += start;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001488 newcontents += start;
1489 msg_cdbg(":");
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001490 if (need_erase(curcontents, newcontents, len, gran)) {
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001491 msg_cdbg("E");
1492 ret = erasefn(flash, start, len);
1493 if (ret)
1494 return ret;
Carl-Daniel Hailfingerb4061f62011-06-26 17:04:16 +00001495 if (check_erased_range(flash, start, len)) {
1496 msg_cerr("ERASE FAILED!\n");
1497 return -1;
1498 }
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001499 /* Erase was successful. Adjust curcontents. */
1500 memset(curcontents, 0xff, len);
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001501 skip = 0;
1502 }
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001503 /* get_next_write() sets starthere to a new value after the call. */
1504 while ((lenhere = get_next_write(curcontents + starthere,
1505 newcontents + starthere,
1506 len - starthere, &starthere, gran))) {
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001507 if (!writecount++)
1508 msg_cdbg("W");
1509 /* Needs the partial write function signature. */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001510 ret = flash->chip->write(flash, newcontents + starthere,
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001511 start + starthere, lenhere);
1512 if (ret)
1513 return ret;
1514 starthere += lenhere;
1515 skip = 0;
1516 }
1517 if (skip)
1518 msg_cdbg("S");
Stefan Tauner682122b2013-06-23 22:15:39 +00001519 else
1520 all_skipped = false;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001521 return ret;
1522}
1523
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001524static int walk_eraseregions(struct flashctx *flash, int erasefunction,
1525 int (*do_something) (struct flashctx *flash,
Carl-Daniel Hailfinger4d3e9ca2010-07-13 00:42:00 +00001526 unsigned int addr,
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001527 unsigned int len,
1528 uint8_t *param1,
1529 uint8_t *param2,
1530 int (*erasefn) (
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001531 struct flashctx *flash,
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001532 unsigned int addr,
1533 unsigned int len)),
1534 void *param1, void *param2)
Carl-Daniel Hailfingera1223412010-07-13 00:37:19 +00001535{
1536 int i, j;
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +00001537 unsigned int start = 0;
1538 unsigned int len;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001539 struct block_eraser eraser = flash->chip->block_erasers[erasefunction];
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001540
Carl-Daniel Hailfingera1223412010-07-13 00:37:19 +00001541 for (i = 0; i < NUM_ERASEREGIONS; i++) {
1542 /* count==0 for all automatically initialized array
1543 * members so the loop below won't be executed for them.
1544 */
1545 len = eraser.eraseblocks[i].size;
1546 for (j = 0; j < eraser.eraseblocks[i].count; j++) {
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001547 /* Print this for every block except the first one. */
1548 if (i || j)
1549 msg_cdbg(", ");
1550 msg_cdbg("0x%06x-0x%06x", start,
Carl-Daniel Hailfingera1223412010-07-13 00:37:19 +00001551 start + len - 1);
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001552 if (do_something(flash, start, len, param1, param2,
1553 eraser.block_erase)) {
Carl-Daniel Hailfingera1223412010-07-13 00:37:19 +00001554 return 1;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001555 }
Carl-Daniel Hailfingera1223412010-07-13 00:37:19 +00001556 start += len;
1557 }
1558 }
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001559 msg_cdbg("\n");
Carl-Daniel Hailfingera1223412010-07-13 00:37:19 +00001560 return 0;
1561}
1562
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001563static int check_block_eraser(const struct flashctx *flash, int k, int log)
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001564{
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001565 struct block_eraser eraser = flash->chip->block_erasers[k];
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001566
1567 if (!eraser.block_erase && !eraser.eraseblocks[0].count) {
1568 if (log)
1569 msg_cdbg("not defined. ");
1570 return 1;
1571 }
1572 if (!eraser.block_erase && eraser.eraseblocks[0].count) {
1573 if (log)
1574 msg_cdbg("eraseblock layout is known, but matching "
Stefan Tauner355cbfd2011-05-28 02:37:14 +00001575 "block erase function is not implemented. ");
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001576 return 1;
1577 }
1578 if (eraser.block_erase && !eraser.eraseblocks[0].count) {
1579 if (log)
1580 msg_cdbg("block erase function found, but "
Stefan Tauner355cbfd2011-05-28 02:37:14 +00001581 "eraseblock layout is not defined. ");
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001582 return 1;
1583 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001584 // TODO: Once erase functions are annotated with allowed buses, check that as well.
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001585 return 0;
1586}
1587
Mark Marshallf20b7be2014-05-09 21:16:21 +00001588int erase_and_write_flash(struct flashctx *flash, uint8_t *oldcontents, uint8_t *newcontents)
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001589{
Carl-Daniel Hailfingerd8334db2011-07-21 21:21:04 +00001590 int k, ret = 1;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001591 uint8_t *curcontents;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001592 unsigned long size = flash->chip->total_size * 1024;
Sylvain "ythier" Hitier9db45512011-07-04 07:27:17 +00001593 unsigned int usable_erasefunctions = count_usable_erasers(flash);
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001594
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001595 msg_cinfo("Erasing and writing flash chip... ");
Stefan Tauner269de352011-07-12 22:35:21 +00001596 curcontents = malloc(size);
1597 if (!curcontents) {
1598 msg_gerr("Out of memory!\n");
1599 exit(1);
1600 }
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001601 /* Copy oldcontents to curcontents to avoid clobbering oldcontents. */
1602 memcpy(curcontents, oldcontents, size);
1603
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001604 for (k = 0; k < NUM_ERASEFUNCTIONS; k++) {
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001605 if (k != 0)
Stefan Tauner16878542014-07-13 23:53:40 +00001606 msg_cinfo("Looking for another erase function.\n");
Carl-Daniel Hailfingerd8334db2011-07-21 21:21:04 +00001607 if (!usable_erasefunctions) {
Stefan Tauner16878542014-07-13 23:53:40 +00001608 msg_cinfo("No usable erase functions left.\n");
Carl-Daniel Hailfingerd8334db2011-07-21 21:21:04 +00001609 break;
1610 }
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001611 msg_cdbg("Trying erase function %i... ", k);
1612 if (check_block_eraser(flash, k, 1))
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001613 continue;
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001614 usable_erasefunctions--;
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001615 ret = walk_eraseregions(flash, k, &erase_and_write_block_helper,
1616 curcontents, newcontents);
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001617 /* If everything is OK, don't try another erase function. */
1618 if (!ret)
1619 break;
Carl-Daniel Hailfingerb23b1eb2010-12-02 02:41:55 +00001620 /* Write/erase failed, so try to find out what the current chip
Carl-Daniel Hailfingerd8334db2011-07-21 21:21:04 +00001621 * contents are. If no usable erase functions remain, we can
1622 * skip this: the next iteration will break immediately anyway.
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001623 */
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001624 if (!usable_erasefunctions)
1625 continue;
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001626 /* Reading the whole chip may take a while, inform the user even
1627 * in non-verbose mode.
1628 */
1629 msg_cinfo("Reading current flash chip contents... ");
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001630 if (flash->chip->read(flash, curcontents, 0, size)) {
Carl-Daniel Hailfingerb23b1eb2010-12-02 02:41:55 +00001631 /* Now we are truly screwed. Read failed as well. */
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001632 msg_cerr("Can't read anymore! Aborting.\n");
Carl-Daniel Hailfingerb23b1eb2010-12-02 02:41:55 +00001633 /* We have no idea about the flash chip contents, so
1634 * retrying with another erase function is pointless.
1635 */
1636 break;
1637 }
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001638 msg_cinfo("done. ");
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001639 }
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001640 /* Free the scratchpad. */
1641 free(curcontents);
Carl-Daniel Hailfingerf160a122009-05-08 17:15:15 +00001642
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001643 if (ret) {
Sean Nelson316a29f2010-05-07 20:09:04 +00001644 msg_cerr("FAILED!\n");
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001645 } else {
Stefan Tauner682122b2013-06-23 22:15:39 +00001646 if (all_skipped)
1647 msg_cinfo("\nWarning: Chip content is identical to the requested image.\n");
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001648 msg_cinfo("Erase/write done.\n");
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001649 }
1650 return ret;
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001651}
1652
Nico Huber7af0e792016-04-29 16:40:15 +02001653static const struct flashrom_layout *get_layout(const struct flashctx *const flashctx)
1654{
1655 if (flashctx->layout && flashctx->layout->num_entries)
1656 return flashctx->layout;
1657 else
1658 return &flashctx->fallback_layout.base;
1659}
1660
1661/**
1662 * @brief Reads the included layout regions into a buffer.
1663 *
1664 * If there is no layout set in the given flash context, the whole chip will
1665 * be read.
1666 *
1667 * @param flashctx Flash context to be used.
1668 * @param buffer Buffer of full chip size to read into.
1669 * @return 0 on success,
1670 * 1 if any read fails.
1671 */
1672static int read_by_layout(struct flashctx *const flashctx, uint8_t *const buffer)
1673{
1674 const struct flashrom_layout *const layout = get_layout(flashctx);
1675
1676 size_t i;
1677 for (i = 0; i < layout->num_entries; ++i) {
1678 if (!layout->entries[i].included)
1679 continue;
1680
1681 const chipoff_t region_start = layout->entries[i].start;
1682 const chipsize_t region_len = layout->entries[i].end - layout->entries[i].start + 1;
1683
1684 if (flashctx->chip->read(flashctx, buffer + region_start, region_start, region_len))
1685 return 1;
1686 }
1687 return 0;
1688}
1689
1690typedef int (*erasefn_t)(struct flashctx *, unsigned int addr, unsigned int len);
1691/**
1692 * @private
1693 *
1694 * For read-erase-write, `curcontents` and `newcontents` shall point
1695 * to buffers of the chip's size. Both are supposed to be prefilled
1696 * with at least the included layout regions of the current flash
1697 * contents (`curcontents`) and the data to be written to the flash
1698 * (`newcontents`).
1699 *
1700 * For erase, `curcontents` and `newcontents` shall be NULL-pointers.
1701 *
1702 * The `chipoff_t` values are used internally by `walk_by_layout()`.
1703 */
1704struct walk_info {
1705 uint8_t *curcontents;
1706 const uint8_t *newcontents;
1707 chipoff_t region_start;
1708 chipoff_t region_end;
1709 chipoff_t erase_start;
1710 chipoff_t erase_end;
1711};
1712/* returns 0 on success, 1 to retry with another erase function, 2 for immediate abort */
1713typedef int (*per_blockfn_t)(struct flashctx *, const struct walk_info *, erasefn_t);
1714
1715static int walk_eraseblocks(struct flashctx *const flashctx,
1716 struct walk_info *const info,
1717 const size_t erasefunction, const per_blockfn_t per_blockfn)
1718{
1719 int ret;
1720 size_t i, j;
1721 bool first = true;
1722 struct block_eraser *const eraser = &flashctx->chip->block_erasers[erasefunction];
1723
1724 info->erase_start = 0;
1725 for (i = 0; i < NUM_ERASEREGIONS; ++i) {
1726 /* count==0 for all automatically initialized array
1727 members so the loop below won't be executed for them. */
1728 for (j = 0; j < eraser->eraseblocks[i].count; ++j, info->erase_start = info->erase_end + 1) {
1729 info->erase_end = info->erase_start + eraser->eraseblocks[i].size - 1;
1730
1731 /* Skip any eraseblock that is completely outside the current region. */
1732 if (info->erase_end < info->region_start)
1733 continue;
1734 if (info->region_end < info->erase_start)
1735 break;
1736
1737 /* Print this for every block except the first one. */
1738 if (first)
1739 first = false;
1740 else
1741 msg_cdbg(", ");
1742 msg_cdbg("0x%06x-0x%06x:", info->erase_start, info->erase_end);
1743
1744 ret = per_blockfn(flashctx, info, eraser->block_erase);
1745 if (ret)
1746 return ret;
1747 }
1748 if (info->region_end < info->erase_start)
1749 break;
1750 }
1751 msg_cdbg("\n");
1752 return 0;
1753}
1754
1755static int walk_by_layout(struct flashctx *const flashctx, struct walk_info *const info,
1756 const per_blockfn_t per_blockfn)
1757{
1758 const struct flashrom_layout *const layout = get_layout(flashctx);
1759
1760 all_skipped = true;
1761 msg_cinfo("Erasing and writing flash chip... ");
1762
1763 size_t i;
1764 for (i = 0; i < layout->num_entries; ++i) {
1765 if (!layout->entries[i].included)
1766 continue;
1767
1768 info->region_start = layout->entries[i].start;
1769 info->region_end = layout->entries[i].end;
1770
1771 size_t j;
1772 int error = 1; /* retry as long as it's 1 */
1773 for (j = 0; j < NUM_ERASEFUNCTIONS; ++j) {
1774 if (j != 0)
1775 msg_cinfo("Looking for another erase function.\n");
1776 msg_cdbg("Trying erase function %zi... ", j);
1777 if (check_block_eraser(flashctx, j, 1))
1778 continue;
1779
1780 error = walk_eraseblocks(flashctx, info, j, per_blockfn);
1781 if (error != 1)
1782 break;
1783
1784 if (info->curcontents) {
1785 msg_cinfo("Reading current flash chip contents... ");
1786 if (read_by_layout(flashctx, info->curcontents)) {
1787 /* Now we are truly screwed. Read failed as well. */
1788 msg_cerr("Can't read anymore! Aborting.\n");
1789 /* We have no idea about the flash chip contents, so
1790 retrying with another erase function is pointless. */
1791 error = 2;
1792 break;
1793 }
1794 msg_cinfo("done. ");
1795 }
1796 }
1797 if (error == 1)
1798 msg_cinfo("No usable erase functions left.\n");
1799 if (error) {
1800 msg_cerr("FAILED!\n");
1801 return 1;
1802 }
1803 }
1804 if (all_skipped)
1805 msg_cinfo("\nWarning: Chip content is identical to the requested image.\n");
1806 msg_cinfo("Erase/write done.\n");
1807 return 0;
1808}
1809
1810static int erase_block(struct flashctx *const flashctx,
1811 const struct walk_info *const info, const erasefn_t erasefn)
1812{
1813 const unsigned int erase_len = info->erase_end + 1 - info->erase_start;
1814
1815 all_skipped = false;
1816
1817 msg_cdbg("E");
1818 if (erasefn(flashctx, info->erase_start, erase_len))
1819 return 1;
1820 if (check_erased_range(flashctx, info->erase_start, erase_len)) {
1821 msg_cerr("ERASE FAILED!\n");
1822 return 1;
1823 }
1824 return 0;
1825}
1826
1827/**
1828 * @brief Erases the included layout regions.
1829 *
1830 * If there is no layout set in the given flash context, the whole chip will
1831 * be erased.
1832 *
1833 * @param flashctx Flash context to be used.
1834 * @param buffer Buffer of full chip size to read into.
1835 * @return 0 on success,
1836 * 1 if all available erase functions failed.
1837 */
1838int erase_by_layout(struct flashctx *const flashctx)
1839{
1840 struct walk_info info = { 0 };
1841 return walk_by_layout(flashctx, &info, &erase_block);
1842}
1843
1844static int read_erase_write_block(struct flashctx *const flashctx,
1845 const struct walk_info *const info, const erasefn_t erasefn)
1846{
1847 const chipsize_t erase_len = info->erase_end + 1 - info->erase_start;
1848 const bool region_unaligned = info->region_start > info->erase_start ||
1849 info->erase_end > info->region_end;
1850 const uint8_t *newcontents = NULL;
1851 int ret = 2;
1852
1853 /*
1854 * If the region is not erase-block aligned, merge current flash con-
1855 * tents into `info->curcontents` and a new buffer `newc`. The former
1856 * is necessary since we have no guarantee that the full erase block
1857 * was already read into `info->curcontents`. For the latter a new
1858 * buffer is used since `info->newcontents` might contain data for
1859 * other unaligned regions that touch this erase block too.
1860 */
1861 if (region_unaligned) {
1862 msg_cdbg("R");
1863 uint8_t *const newc = malloc(erase_len);
1864 if (!newc) {
1865 msg_cerr("Out of memory!\n");
1866 return 1;
1867 }
1868 memcpy(newc, info->newcontents + info->erase_start, erase_len);
1869
1870 /* Merge data preceding the current region. */
1871 if (info->region_start > info->erase_start) {
1872 const chipoff_t start = info->erase_start;
1873 const chipsize_t len = info->region_start - info->erase_start;
1874 if (flashctx->chip->read(flashctx, newc, start, len)) {
1875 msg_cerr("Can't read! Aborting.\n");
1876 goto _free_ret;
1877 }
1878 memcpy(info->curcontents + start, newc, len);
1879 }
1880 /* Merge data following the current region. */
1881 if (info->erase_end > info->region_end) {
1882 const chipoff_t start = info->region_end + 1;
1883 const chipoff_t rel_start = start - info->erase_start; /* within this erase block */
1884 const chipsize_t len = info->erase_end - info->region_end;
1885 if (flashctx->chip->read(flashctx, newc + rel_start, start, len)) {
1886 msg_cerr("Can't read! Aborting.\n");
1887 goto _free_ret;
1888 }
1889 memcpy(info->curcontents + start, newc + rel_start, len);
1890 }
1891
1892 newcontents = newc;
1893 } else {
1894 newcontents = info->newcontents + info->erase_start;
1895 }
1896
1897 ret = 1;
1898 bool skipped = true;
1899 uint8_t *const curcontents = info->curcontents + info->erase_start;
1900 if (need_erase(curcontents, newcontents, erase_len, flashctx->chip->gran)) {
1901 if (erase_block(flashctx, info, erasefn))
1902 goto _free_ret;
1903 /* Erase was successful. Adjust curcontents. */
1904 memset(curcontents, 0xff, erase_len);
1905 skipped = false;
1906 }
1907
1908 unsigned int starthere = 0, lenhere = 0, writecount = 0;
1909 /* get_next_write() sets starthere to a new value after the call. */
1910 while ((lenhere = get_next_write(curcontents + starthere, newcontents + starthere,
1911 erase_len - starthere, &starthere, flashctx->chip->gran))) {
1912 if (!writecount++)
1913 msg_cdbg("W");
1914 /* Needs the partial write function signature. */
1915 if (flashctx->chip->write(flashctx, newcontents + starthere,
1916 info->erase_start + starthere, lenhere))
1917 goto _free_ret;
1918 starthere += lenhere;
1919 skipped = false;
1920 }
1921 if (skipped)
1922 msg_cdbg("S");
1923 else
1924 all_skipped = false;
1925
1926 /* Update curcontents, other regions with overlapping erase blocks
1927 might rely on this. */
1928 memcpy(curcontents, newcontents, erase_len);
1929 ret = 0;
1930
1931_free_ret:
1932 if (region_unaligned)
1933 free((void *)newcontents);
1934 return ret;
1935}
1936
1937/**
1938 * @brief Writes the included layout regions from a given image.
1939 *
1940 * If there is no layout set in the given flash context, the whole image
1941 * will be written.
1942 *
1943 * @param flashctx Flash context to be used.
1944 * @param curcontents A buffer of full chip size with current chip contents of included regions.
1945 * @param newcontents The new image to be written.
1946 * @return 0 on success,
1947 * 1 if anything has gone wrong.
1948 */
1949int write_by_layout(struct flashctx *const flashctx,
1950 void *const curcontents, const void *const newcontents)
1951{
1952 struct walk_info info;
1953 info.curcontents = curcontents;
1954 info.newcontents = newcontents;
1955 return walk_by_layout(flashctx, &info, read_erase_write_block);
1956}
1957
1958/**
1959 * @brief Compares the included layout regions with content from a buffer.
1960 *
1961 * If there is no layout set in the given flash context, the whole chip's
1962 * contents will be compared.
1963 *
1964 * @param flashctx Flash context to be used.
1965 * @param curcontents A buffer of full chip size to read current chip contents into.
1966 * @param newcontents The new image to compare to.
1967 * @return 0 on success,
1968 * 1 if reading failed,
1969 * 3 if the contents don't match.
1970 */
1971int verify_by_layout(struct flashctx *const flashctx,
1972 void *const curcontents, const uint8_t *const newcontents)
1973{
1974 const struct flashrom_layout *const layout = get_layout(flashctx);
1975
1976 size_t i;
1977 for (i = 0; i < layout->num_entries; ++i) {
1978 if (!layout->entries[i].included)
1979 continue;
1980
1981 const chipoff_t region_start = layout->entries[i].start;
1982 const chipsize_t region_len = layout->entries[i].end - layout->entries[i].start + 1;
1983
1984 if (flashctx->chip->read(flashctx, curcontents + region_start, region_start, region_len))
1985 return 1;
1986 if (compare_range(newcontents + region_start, curcontents + region_start,
1987 region_start, region_len))
1988 return 3;
1989 }
1990 return 0;
1991}
1992
Stefan Tauner136388f2013-07-15 10:47:53 +00001993static void nonfatal_help_message(void)
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001994{
Stefan Taunera58f6e92014-05-10 09:25:44 +00001995 msg_gerr("Good, writing to the flash chip apparently didn't do anything.\n");
Stefan Tauner136388f2013-07-15 10:47:53 +00001996#if CONFIG_INTERNAL == 1
1997 if (programmer == PROGRAMMER_INTERNAL)
1998 msg_gerr("This means we have to add special support for your board, programmer or flash\n"
1999 "chip. Please report this on IRC at chat.freenode.net (channel #flashrom) or\n"
2000 "mail flashrom@flashrom.org, thanks!\n"
2001 "-------------------------------------------------------------------------------\n"
2002 "You may now reboot or simply leave the machine running.\n");
2003 else
2004#endif
2005 msg_gerr("Please check the connections (especially those to write protection pins) between\n"
2006 "the programmer and the flash chip. If you think the error is caused by flashrom\n"
2007 "please report this on IRC at chat.freenode.net (channel #flashrom) or\n"
2008 "mail flashrom@flashrom.org, thanks!\n");
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00002009}
2010
Stefan Tauner136388f2013-07-15 10:47:53 +00002011static void emergency_help_message(void)
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00002012{
Stefan Tauner136388f2013-07-15 10:47:53 +00002013 msg_gerr("Your flash chip is in an unknown state.\n");
2014#if CONFIG_INTERNAL == 1
2015 if (programmer == PROGRAMMER_INTERNAL)
2016 msg_gerr("Get help on IRC at chat.freenode.net (channel #flashrom) or\n"
2017 "mail flashrom@flashrom.org with the subject \"FAILED: <your board name>\"!\n"
2018 "-------------------------------------------------------------------------------\n"
2019 "DO NOT REBOOT OR POWEROFF!\n");
2020 else
2021#endif
2022 msg_gerr("Please report this on IRC at chat.freenode.net (channel #flashrom) or\n"
2023 "mail flashrom@flashrom.org, thanks!\n");
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00002024}
2025
Uwe Hermann91f4afa2011-07-28 08:13:25 +00002026/* The way to go if you want a delimited list of programmers */
Stefan Tauner66652442011-06-26 17:38:17 +00002027void list_programmers(const char *delim)
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00002028{
2029 enum programmer p;
2030 for (p = 0; p < PROGRAMMER_INVALID; p++) {
Sean Nelson316a29f2010-05-07 20:09:04 +00002031 msg_ginfo("%s", programmer_table[p].name);
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00002032 if (p < PROGRAMMER_INVALID - 1)
Sean Nelson316a29f2010-05-07 20:09:04 +00002033 msg_ginfo("%s", delim);
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00002034 }
Stefan Tauner23e10b82016-01-23 16:16:49 +00002035 msg_ginfo("\n");
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00002036}
2037
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00002038void list_programmers_linebreak(int startcol, int cols, int paren)
2039{
2040 const char *pname;
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +00002041 int pnamelen;
2042 int remaining = 0, firstline = 1;
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00002043 enum programmer p;
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +00002044 int i;
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00002045
2046 for (p = 0; p < PROGRAMMER_INVALID; p++) {
2047 pname = programmer_table[p].name;
2048 pnamelen = strlen(pname);
2049 if (remaining - pnamelen - 2 < 0) {
2050 if (firstline)
2051 firstline = 0;
2052 else
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00002053 msg_ginfo("\n");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00002054 for (i = 0; i < startcol; i++)
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00002055 msg_ginfo(" ");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00002056 remaining = cols - startcol;
2057 } else {
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00002058 msg_ginfo(" ");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00002059 remaining--;
2060 }
2061 if (paren && (p == 0)) {
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00002062 msg_ginfo("(");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00002063 remaining--;
2064 }
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00002065 msg_ginfo("%s", pname);
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00002066 remaining -= pnamelen;
2067 if (p < PROGRAMMER_INVALID - 1) {
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00002068 msg_ginfo(",");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00002069 remaining--;
2070 } else {
2071 if (paren)
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00002072 msg_ginfo(")");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00002073 }
2074 }
2075}
2076
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00002077void print_sysinfo(void)
2078{
Stefan Taunerb0eee9b2015-01-10 09:32:50 +00002079#if IS_WINDOWS
Carl-Daniel Hailfinger60d9bd22012-08-09 23:34:41 +00002080 SYSTEM_INFO si;
2081 OSVERSIONINFOEX osvi;
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00002082
Carl-Daniel Hailfinger60d9bd22012-08-09 23:34:41 +00002083 memset(&si, 0, sizeof(SYSTEM_INFO));
2084 memset(&osvi, 0, sizeof(OSVERSIONINFOEX));
2085 msg_ginfo(" on Windows");
2086 /* Tell Windows which version of the structure we want. */
2087 osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
2088 if (GetVersionEx((OSVERSIONINFO*) &osvi))
2089 msg_ginfo(" %lu.%lu", osvi.dwMajorVersion, osvi.dwMinorVersion);
2090 else
2091 msg_ginfo(" unknown version");
2092 GetSystemInfo(&si);
2093 switch (si.wProcessorArchitecture) {
2094 case PROCESSOR_ARCHITECTURE_AMD64:
2095 msg_ginfo(" (x86_64)");
2096 break;
2097 case PROCESSOR_ARCHITECTURE_INTEL:
2098 msg_ginfo(" (x86)");
2099 break;
2100 default:
2101 msg_ginfo(" (unknown arch)");
2102 break;
2103 }
2104#elif HAVE_UTSNAME == 1
2105 struct utsname osinfo;
2106
2107 uname(&osinfo);
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00002108 msg_ginfo(" on %s %s (%s)", osinfo.sysname, osinfo.release,
2109 osinfo.machine);
2110#else
2111 msg_ginfo(" on unknown machine");
2112#endif
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00002113}
2114
2115void print_buildinfo(void)
2116{
2117 msg_gdbg("flashrom was built with");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00002118#if NEED_PCI == 1
2119#ifdef PCILIB_VERSION
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00002120 msg_gdbg(" libpci %s,", PCILIB_VERSION);
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00002121#else
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00002122 msg_gdbg(" unknown PCI library,");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00002123#endif
2124#endif
2125#ifdef __clang__
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00002126 msg_gdbg(" LLVM Clang");
Carl-Daniel Hailfingerb51e58e2010-07-17 14:49:30 +00002127#ifdef __clang_version__
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00002128 msg_gdbg(" %s,", __clang_version__);
Carl-Daniel Hailfingerb51e58e2010-07-17 14:49:30 +00002129#else
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00002130 msg_gdbg(" unknown version (before r102686),");
Carl-Daniel Hailfingerb51e58e2010-07-17 14:49:30 +00002131#endif
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00002132#elif defined(__GNUC__)
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00002133 msg_gdbg(" GCC");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00002134#ifdef __VERSION__
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00002135 msg_gdbg(" %s,", __VERSION__);
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00002136#else
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00002137 msg_gdbg(" unknown version,");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00002138#endif
2139#else
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00002140 msg_gdbg(" unknown compiler,");
Carl-Daniel Hailfingercceafa22010-05-26 01:45:41 +00002141#endif
2142#if defined (__FLASHROM_LITTLE_ENDIAN__)
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00002143 msg_gdbg(" little endian");
Carl-Daniel Hailfinger06b9efa2012-08-07 11:59:59 +00002144#elif defined (__FLASHROM_BIG_ENDIAN__)
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00002145 msg_gdbg(" big endian");
Carl-Daniel Hailfinger06b9efa2012-08-07 11:59:59 +00002146#else
2147#error Endianness could not be determined
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00002148#endif
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00002149 msg_gdbg("\n");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00002150}
2151
Bernhard Walle201bde32008-01-21 15:24:22 +00002152void print_version(void)
2153{
Carl-Daniel Hailfinger8841d3e2010-05-15 15:04:37 +00002154 msg_ginfo("flashrom v%s", flashrom_version);
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00002155 print_sysinfo();
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00002156 msg_ginfo("\n");
Bernhard Walle201bde32008-01-21 15:24:22 +00002157}
2158
Carl-Daniel Hailfinger8841d3e2010-05-15 15:04:37 +00002159void print_banner(void)
2160{
2161 msg_ginfo("flashrom is free software, get the source code at "
Stefan Tauner4c723152016-01-14 22:47:55 +00002162 "https://flashrom.org\n");
Carl-Daniel Hailfinger8841d3e2010-05-15 15:04:37 +00002163 msg_ginfo("\n");
2164}
2165
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00002166int selfcheck(void)
2167{
Stefan Tauner96658be2014-05-26 22:05:31 +00002168 unsigned int i;
Stefan Taunera6d96482012-12-26 19:51:23 +00002169 int ret = 0;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00002170
2171 /* Safety check. Instead of aborting after the first error, check
2172 * if more errors exist.
2173 */
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00002174 if (ARRAY_SIZE(programmer_table) - 1 != PROGRAMMER_INVALID) {
Sean Nelson316a29f2010-05-07 20:09:04 +00002175 msg_gerr("Programmer table miscompilation!\n");
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00002176 ret = 1;
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00002177 }
Stefan Taunera6d96482012-12-26 19:51:23 +00002178 for (i = 0; i < PROGRAMMER_INVALID; i++) {
2179 const struct programmer_entry p = programmer_table[i];
2180 if (p.name == NULL) {
2181 msg_gerr("All programmers need a valid name, but the one with index %d does not!\n", i);
2182 ret = 1;
2183 /* This might hide other problems with this programmer, but allows for better error
2184 * messages below without jumping through hoops. */
2185 continue;
2186 }
Stefan Tauneraf358d62012-12-27 18:40:26 +00002187 switch (p.type) {
2188 case USB:
2189 case PCI:
2190 case OTHER:
2191 if (p.devs.note == NULL) {
2192 if (strcmp("internal", p.name) == 0)
2193 break; /* This one has its device list stored separately. */
2194 msg_gerr("Programmer %s has neither a device list nor a textual description!\n",
2195 p.name);
2196 ret = 1;
2197 }
2198 break;
2199 default:
2200 msg_gerr("Programmer %s does not have a valid type set!\n", p.name);
2201 ret = 1;
2202 break;
2203 }
Stefan Taunera6d96482012-12-26 19:51:23 +00002204 if (p.init == NULL) {
2205 msg_gerr("Programmer %s does not have a valid init function!\n", p.name);
2206 ret = 1;
2207 }
2208 if (p.delay == NULL) {
2209 msg_gerr("Programmer %s does not have a valid delay function!\n", p.name);
2210 ret = 1;
2211 }
2212 if (p.map_flash_region == NULL) {
2213 msg_gerr("Programmer %s does not have a valid map_flash_region function!\n", p.name);
2214 ret = 1;
2215 }
2216 if (p.unmap_flash_region == NULL) {
2217 msg_gerr("Programmer %s does not have a valid unmap_flash_region function!\n", p.name);
2218 ret = 1;
2219 }
2220 }
Stefan Tauner96658be2014-05-26 22:05:31 +00002221
2222 /* It would be favorable if we could check for the correct layout (especially termination) of various
2223 * constant arrays: flashchips, chipset_enables, board_matches, boards_known, laptops_known.
2224 * They are all defined as externs in this compilation unit so we don't know their sizes which vary
2225 * depending on compiler flags, e.g. the target architecture, and can sometimes be 0.
2226 * For 'flashchips' we export the size explicitly to work around this and to be able to implement the
2227 * checks below. */
Stefan Tauner6697f712014-08-06 15:09:15 +00002228 if (flashchips_size <= 1 || flashchips[flashchips_size - 1].name != NULL) {
Stefan Tauner7bcacb12011-05-26 01:35:19 +00002229 msg_gerr("Flashchips table miscompilation!\n");
2230 ret = 1;
Stefan Tauner96658be2014-05-26 22:05:31 +00002231 } else {
2232 for (i = 0; i < flashchips_size - 1; i++) {
2233 const struct flashchip *chip = &flashchips[i];
2234 if (chip->vendor == NULL || chip->name == NULL || chip->bustype == BUS_NONE) {
2235 ret = 1;
2236 msg_gerr("ERROR: Some field of flash chip #%d (%s) is misconfigured.\n"
2237 "Please report a bug at flashrom@flashrom.org\n", i,
2238 chip->name == NULL ? "unnamed" : chip->name);
2239 }
2240 if (selfcheck_eraseblocks(chip)) {
2241 ret = 1;
2242 }
2243 }
Stefan Tauner7bcacb12011-05-26 01:35:19 +00002244 }
Stefan Tauner7bcacb12011-05-26 01:35:19 +00002245
Stefan Tauner600576b2014-06-12 22:57:36 +00002246#if CONFIG_INTERNAL == 1
2247 ret |= selfcheck_board_enables();
2248#endif
2249
Stefan Tauner96658be2014-05-26 22:05:31 +00002250 /* TODO: implement similar sanity checks for other arrays where deemed necessary. */
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00002251 return ret;
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00002252}
2253
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00002254/* FIXME: This function signature needs to be improved once doit() has a better
2255 * function signature.
2256 */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00002257int chip_safety_check(const struct flashctx *flash, int force, int read_it, int write_it, int erase_it,
2258 int verify_it)
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00002259{
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00002260 const struct flashchip *chip = flash->chip;
2261
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00002262 if (!programmer_may_write && (write_it || erase_it)) {
2263 msg_perr("Write/erase is not working yet on your programmer in "
2264 "its current configuration.\n");
2265 /* --force is the wrong approach, but it's the best we can do
2266 * until the generic programmer parameter parser is merged.
2267 */
2268 if (!force)
2269 return 1;
2270 msg_cerr("Continuing anyway.\n");
2271 }
2272
2273 if (read_it || erase_it || write_it || verify_it) {
2274 /* Everything needs read. */
Stefan Tauner6455dff2014-05-26 00:36:24 +00002275 if (chip->tested.read == BAD) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00002276 msg_cerr("Read is not working on this chip. ");
2277 if (!force)
2278 return 1;
2279 msg_cerr("Continuing anyway.\n");
2280 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00002281 if (!chip->read) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00002282 msg_cerr("flashrom has no read function for this "
2283 "flash chip.\n");
2284 return 1;
2285 }
2286 }
2287 if (erase_it || write_it) {
2288 /* Write needs erase. */
Stefan Tauner6455dff2014-05-26 00:36:24 +00002289 if (chip->tested.erase == NA) {
2290 msg_cerr("Erase is not possible on this chip.\n");
2291 return 1;
2292 }
2293 if (chip->tested.erase == BAD) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00002294 msg_cerr("Erase is not working on this chip. ");
2295 if (!force)
2296 return 1;
2297 msg_cerr("Continuing anyway.\n");
2298 }
Sylvain "ythier" Hitier9db45512011-07-04 07:27:17 +00002299 if(count_usable_erasers(flash) == 0) {
Stefan Tauner5368dca2011-07-01 00:19:12 +00002300 msg_cerr("flashrom has no erase function for this "
2301 "flash chip.\n");
2302 return 1;
2303 }
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00002304 }
2305 if (write_it) {
Stefan Tauner6455dff2014-05-26 00:36:24 +00002306 if (chip->tested.write == NA) {
2307 msg_cerr("Write is not possible on this chip.\n");
2308 return 1;
2309 }
2310 if (chip->tested.write == BAD) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00002311 msg_cerr("Write is not working on this chip. ");
2312 if (!force)
2313 return 1;
2314 msg_cerr("Continuing anyway.\n");
2315 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00002316 if (!chip->write) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00002317 msg_cerr("flashrom has no write function for this "
2318 "flash chip.\n");
2319 return 1;
2320 }
2321 }
2322 return 0;
2323}
2324
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00002325/* This function signature is horrible. We need to design a better interface,
2326 * but right now it allows us to split off the CLI code.
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00002327 * Besides that, the function itself is a textbook example of abysmal code flow.
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00002328 */
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +00002329int doit(struct flashctx *flash, int force, const char *filename, int read_it,
2330 int write_it, int erase_it, int verify_it)
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00002331{
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00002332 uint8_t *oldcontents;
2333 uint8_t *newcontents;
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00002334 int ret = 0;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00002335 unsigned long size = flash->chip->total_size * 1024;
Stefan Tauner73f5bda2014-10-19 07:53:45 +00002336 int read_all_first = 1; /* FIXME: Make this configurable. */
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00002337
David Hendricks77f931a2011-05-18 01:30:56 +00002338 if (chip_safety_check(flash, force, read_it, write_it, erase_it, verify_it)) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00002339 msg_cerr("Aborting.\n");
Stefan Tauner20da4aa2014-05-07 22:07:23 +00002340 return 1;
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00002341 }
2342
Stefan Tauner8268fdb2013-09-23 14:21:06 +00002343 if (normalize_romentries(flash)) {
2344 msg_cerr("Requested regions can not be handled. Aborting.\n");
Stefan Tauner20da4aa2014-05-07 22:07:23 +00002345 return 1;
Stefan Tauner8268fdb2013-09-23 14:21:06 +00002346 }
2347
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00002348 /* Given the existence of read locks, we want to unlock for read,
2349 * erase and write.
2350 */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00002351 if (flash->chip->unlock)
2352 flash->chip->unlock(flash);
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00002353
2354 if (read_it) {
Stefan Tauner20da4aa2014-05-07 22:07:23 +00002355 return read_flash_to_file(flash, filename);
Carl-Daniel Hailfingerd1be52d2010-07-03 12:14:25 +00002356 }
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00002357
Stefan Tauner269de352011-07-12 22:35:21 +00002358 oldcontents = malloc(size);
2359 if (!oldcontents) {
2360 msg_gerr("Out of memory!\n");
2361 exit(1);
2362 }
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00002363 /* Assume worst case: All bits are 0. */
2364 memset(oldcontents, 0x00, size);
Stefan Tauner269de352011-07-12 22:35:21 +00002365 newcontents = malloc(size);
2366 if (!newcontents) {
2367 msg_gerr("Out of memory!\n");
2368 exit(1);
2369 }
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00002370 /* Assume best case: All bits should be 1. */
2371 memset(newcontents, 0xff, size);
2372 /* Side effect of the assumptions above: Default write action is erase
2373 * because newcontents looks like a completely erased chip, and
2374 * oldcontents being completely 0x00 means we have to erase everything
2375 * before we can write.
2376 */
2377
Ollie Lhoefa28582004-12-08 20:10:01 +00002378 if (erase_it) {
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00002379 /* FIXME: Do we really want the scary warning if erase failed?
2380 * After all, after erase the chip is either blank or partially
2381 * blank or it has the old contents. A blank chip won't boot,
2382 * so if the user wanted erase and reboots afterwards, the user
2383 * knows very well that booting won't work.
2384 */
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00002385 if (erase_and_write_flash(flash, oldcontents, newcontents)) {
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00002386 emergency_help_message();
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00002387 ret = 1;
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00002388 }
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00002389 goto out;
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00002390 }
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00002391
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00002392 if (write_it || verify_it) {
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00002393 if (read_buf_from_file(newcontents, size, filename)) {
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00002394 ret = 1;
2395 goto out;
Stefan Reinauer018aca82006-11-21 23:48:51 +00002396 }
2397
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +00002398#if CONFIG_INTERNAL == 1
Stefan Taunerb4e06bd2012-08-20 00:24:22 +00002399 if (programmer == PROGRAMMER_INTERNAL && cb_check_image(newcontents, size) < 0) {
2400 if (force_boardmismatch) {
2401 msg_pinfo("Proceeding anyway because user forced us to.\n");
2402 } else {
2403 msg_perr("Aborting. You can override this with "
2404 "-p internal:boardmismatch=force.\n");
Niklas Söderlund9e423762012-06-16 00:11:16 +00002405 ret = 1;
2406 goto out;
2407 }
Stefan Taunerb4e06bd2012-08-20 00:24:22 +00002408 }
Carl-Daniel Hailfinger66ef4e52009-12-13 22:28:00 +00002409#endif
Ollie Lhocbbf1252004-03-17 22:22:08 +00002410 }
2411
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00002412 /* Read the whole chip to be able to check whether regions need to be
2413 * erased and to give better diagnostics in case write fails.
Stefan Tauner73f5bda2014-10-19 07:53:45 +00002414 * The alternative is to read only the regions which are to be
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00002415 * preserved, but in that case we might perform unneeded erase which
2416 * takes time as well.
2417 */
Stefan Tauner73f5bda2014-10-19 07:53:45 +00002418 if (read_all_first) {
2419 msg_cinfo("Reading old flash chip contents... ");
2420 if (flash->chip->read(flash, oldcontents, 0, size)) {
2421 ret = 1;
2422 msg_cinfo("FAILED.\n");
2423 goto out;
2424 }
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00002425 }
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00002426 msg_cinfo("done.\n");
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00002427
Stefan Tauner8268fdb2013-09-23 14:21:06 +00002428 /* Build a new image taking the given layout into account. */
Stefan Tauner73f5bda2014-10-19 07:53:45 +00002429 if (build_new_image(flash, read_all_first, oldcontents, newcontents)) {
2430 msg_gerr("Could not prepare the data to be written, aborting.\n");
2431 ret = 1;
2432 goto out;
2433 }
Uwe Hermanna7e05482007-05-09 10:17:44 +00002434
Ollie Lho184a4042005-11-26 21:55:36 +00002435 // ////////////////////////////////////////////////////////////
Uwe Hermanna7e05482007-05-09 10:17:44 +00002436
Stefan Tauner73f5bda2014-10-19 07:53:45 +00002437 if (write_it && erase_and_write_flash(flash, oldcontents, newcontents)) {
Stefan Tauner5c316f92015-02-08 21:57:52 +00002438 msg_cerr("Uh oh. Erase/write failed. ");
Stefan Tauner73f5bda2014-10-19 07:53:45 +00002439 if (read_all_first) {
2440 msg_cerr("Checking if anything has changed.\n");
Stefan Taunera58f6e92014-05-10 09:25:44 +00002441 msg_cinfo("Reading current flash chip contents... ");
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00002442 if (!flash->chip->read(flash, newcontents, 0, size)) {
Stefan Taunera58f6e92014-05-10 09:25:44 +00002443 msg_cinfo("done.\n");
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00002444 if (!memcmp(oldcontents, newcontents, size)) {
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00002445 nonfatal_help_message();
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00002446 ret = 1;
2447 goto out;
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00002448 }
Stefan Taunera58f6e92014-05-10 09:25:44 +00002449 msg_cerr("Apparently at least some data has changed.\n");
2450 } else
2451 msg_cerr("Can't even read anymore!\n");
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00002452 emergency_help_message();
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00002453 ret = 1;
2454 goto out;
Stefan Tauner73f5bda2014-10-19 07:53:45 +00002455 } else
2456 msg_cerr("\n");
2457 emergency_help_message();
2458 ret = 1;
2459 goto out;
Peter Stugef31104c2008-04-28 14:47:30 +00002460 }
Ollie Lho184a4042005-11-26 21:55:36 +00002461
Stefan Taunerc4f44df2013-08-12 22:58:43 +00002462 /* Verify only if we either did not try to write (verify operation) or actually changed something. */
2463 if (verify_it && (!write_it || !all_skipped)) {
Stefan Tauner78ffbea2012-10-27 15:36:56 +00002464 msg_cinfo("Verifying flash... ");
2465
2466 if (write_it) {
2467 /* Work around chips which need some time to calm down. */
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00002468 programmer_delay(1000*1000);
Stefan Tauner78ffbea2012-10-27 15:36:56 +00002469 ret = verify_range(flash, newcontents, 0, size);
2470 /* If we tried to write, and verification now fails, we
2471 * might have an emergency situation.
2472 */
2473 if (ret)
2474 emergency_help_message();
2475 } else {
2476 ret = compare_range(newcontents, oldcontents, 0, size);
2477 }
2478 if (!ret)
2479 msg_cinfo("VERIFIED.\n");
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00002480 }
Ollie Lho184a4042005-11-26 21:55:36 +00002481
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00002482out:
2483 free(oldcontents);
2484 free(newcontents);
Stefan Reinauer143da0b2006-01-04 16:42:57 +00002485 return ret;
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00002486}