blob: 094630ccfbb23a53c59771aeb2d1661329d9121a [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 */
21
Carl-Daniel Hailfinger831e8f42010-05-30 22:24:40 +000022#include <stdio.h>
Stefan Reinauer018aca82006-11-21 23:48:51 +000023#include <sys/types.h>
Patrick Georgia9095a92010-09-30 17:03:32 +000024#ifndef __LIBPAYLOAD__
25#include <fcntl.h>
Stefan Reinauer018aca82006-11-21 23:48:51 +000026#include <sys/stat.h>
Patrick Georgia9095a92010-09-30 17:03:32 +000027#endif
Ronald G. Minnichceec4202003-07-25 04:37:41 +000028#include <string.h>
Stefan Tauner16687702015-12-25 21:59:45 +000029#include <unistd.h>
Ronald G. Minnicheaab50b2003-09-12 22:41:53 +000030#include <stdlib.h>
Stefan Tauner363fd7e2013-04-07 13:08:30 +000031#include <errno.h>
Carl-Daniel Hailfingerc2441382010-11-09 22:00:31 +000032#include <ctype.h>
Ollie Lho184a4042005-11-26 21:55:36 +000033#include <getopt.h>
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +000034#if HAVE_UTSNAME == 1
35#include <sys/utsname.h>
36#endif
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +000037#include "flash.h"
Carl-Daniel Hailfinger08454642009-06-15 14:14:48 +000038#include "flashchips.h"
Carl-Daniel Hailfinger5b997c32010-07-27 22:41:39 +000039#include "programmer.h"
Carl-Daniel Hailfinger06b9efa2012-08-07 11:59:59 +000040#include "hwaccess.h"
Nico Huberfe34d2a2017-11-10 21:10:20 +010041#include "chipdrivers.h"
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +000042
Mathias Krausea60faab2011-01-17 07:50:42 +000043const char flashrom_version[] = FLASHROM_VERSION;
Nico Huberbcb2e5a2012-12-30 01:23:17 +000044const char *chip_to_probe = NULL;
Carl-Daniel Hailfinger66ef4e52009-12-13 22:28:00 +000045
Carl-Daniel Hailfinger2e681602011-09-08 00:00:29 +000046static enum programmer programmer = PROGRAMMER_INVALID;
Nico Huberbcb2e5a2012-12-30 01:23:17 +000047static const char *programmer_param = NULL;
Stefan Reinauer70385642007-04-06 11:58:03 +000048
Uwe Hermann48ec1b12010-08-08 17:01:18 +000049/*
Carl-Daniel Hailfinger66ef4e52009-12-13 22:28:00 +000050 * Programmers supporting multiple buses can have differing size limits on
51 * each bus. Store the limits for each bus in a common struct.
52 */
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +000053struct decode_sizes max_rom_decode;
54
55/* If nonzero, used as the start address of bottom-aligned flash. */
56unsigned long flashbase;
Carl-Daniel Hailfinger66ef4e52009-12-13 22:28:00 +000057
Carl-Daniel Hailfingerd1be52d2010-07-03 12:14:25 +000058/* Is writing allowed with this programmer? */
59int programmer_may_write;
60
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +000061const struct programmer_entry programmer_table[] = {
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +000062#if CONFIG_INTERNAL == 1
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +000063 {
Carl-Daniel Hailfinger37fc4692009-08-12 14:34:35 +000064 .name = "internal",
Stefan Tauneraf358d62012-12-27 18:40:26 +000065 .type = OTHER,
66 .devs.note = NULL,
Carl-Daniel Hailfinger1e334e62009-05-11 15:46:43 +000067 .init = internal_init,
Carl-Daniel Hailfinger1455b2b2009-05-11 14:13:25 +000068 .map_flash_region = physmap,
69 .unmap_flash_region = physunmap,
Carl-Daniel Hailfingerca8bfc62009-06-05 17:48:08 +000070 .delay = internal_delay,
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +000071 },
Carl-Daniel Hailfinger66ef4e52009-12-13 22:28:00 +000072#endif
Luc Verhaegen8e3a6002007-04-04 22:45:58 +000073
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +000074#if CONFIG_DUMMY == 1
Carl-Daniel Hailfingerc3129202009-05-09 00:54:55 +000075 {
Carl-Daniel Hailfinger37fc4692009-08-12 14:34:35 +000076 .name = "dummy",
Stefan Tauneraf358d62012-12-27 18:40:26 +000077 .type = OTHER,
78 /* FIXME */
79 .devs.note = "Dummy device, does nothing and logs all accesses\n",
Carl-Daniel Hailfinger1e334e62009-05-11 15:46:43 +000080 .init = dummy_init,
Carl-Daniel Hailfinger1455b2b2009-05-11 14:13:25 +000081 .map_flash_region = dummy_map,
82 .unmap_flash_region = dummy_unmap,
Carl-Daniel Hailfingerca8bfc62009-06-05 17:48:08 +000083 .delay = internal_delay,
Carl-Daniel Hailfingerc3129202009-05-09 00:54:55 +000084 },
Carl-Daniel Hailfinger4740c6f2009-09-16 10:09:21 +000085#endif
Carl-Daniel Hailfingerc3129202009-05-09 00:54:55 +000086
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +000087#if CONFIG_NIC3COM == 1
Uwe Hermannb4dcb712009-05-13 11:36:06 +000088 {
Carl-Daniel Hailfinger37fc4692009-08-12 14:34:35 +000089 .name = "nic3com",
Stefan Tauneraf358d62012-12-27 18:40:26 +000090 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +000091 .devs.dev = nics_3com,
Uwe Hermannb4dcb712009-05-13 11:36:06 +000092 .init = nic3com_init,
Uwe Hermannc6915932009-05-17 23:12:17 +000093 .map_flash_region = fallback_map,
94 .unmap_flash_region = fallback_unmap,
Carl-Daniel Hailfingerca8bfc62009-06-05 17:48:08 +000095 .delay = internal_delay,
Uwe Hermannb4dcb712009-05-13 11:36:06 +000096 },
Carl-Daniel Hailfinger4740c6f2009-09-16 10:09:21 +000097#endif
Uwe Hermannb4dcb712009-05-13 11:36:06 +000098
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +000099#if CONFIG_NICREALTEK == 1
Joerg Fischer5665ef32010-05-21 21:54:07 +0000100 {
Carl-Daniel Hailfinger40446ee2011-03-07 01:08:09 +0000101 /* This programmer works for Realtek RTL8139 and SMC 1211. */
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000102 .name = "nicrealtek",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000103 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000104 .devs.dev = nics_realtek,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000105 .init = nicrealtek_init,
106 .map_flash_region = fallback_map,
107 .unmap_flash_region = fallback_unmap,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000108 .delay = internal_delay,
Joerg Fischer5665ef32010-05-21 21:54:07 +0000109 },
Joerg Fischer5665ef32010-05-21 21:54:07 +0000110#endif
111
Andrew Morganc29c2e72010-06-07 22:37:54 +0000112#if CONFIG_NICNATSEMI == 1
113 {
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000114 .name = "nicnatsemi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000115 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000116 .devs.dev = nics_natsemi,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000117 .init = nicnatsemi_init,
118 .map_flash_region = fallback_map,
119 .unmap_flash_region = fallback_unmap,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000120 .delay = internal_delay,
Andrew Morganc29c2e72010-06-07 22:37:54 +0000121 },
122#endif
Joerg Fischer5665ef32010-05-21 21:54:07 +0000123
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000124#if CONFIG_GFXNVIDIA == 1
Uwe Hermann2bc98f62009-09-30 18:29:55 +0000125 {
126 .name = "gfxnvidia",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000127 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000128 .devs.dev = gfx_nvidia,
Uwe Hermann2bc98f62009-09-30 18:29:55 +0000129 .init = gfxnvidia_init,
Uwe Hermann2bc98f62009-09-30 18:29:55 +0000130 .map_flash_region = fallback_map,
131 .unmap_flash_region = fallback_unmap,
Uwe Hermann2bc98f62009-09-30 18:29:55 +0000132 .delay = internal_delay,
133 },
134#endif
135
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000136#if CONFIG_DRKAISER == 1
Rudolf Marek68720c72009-05-17 19:39:27 +0000137 {
TURBO Jb0912c02009-09-02 23:00:46 +0000138 .name = "drkaiser",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000139 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000140 .devs.dev = drkaiser_pcidev,
TURBO Jb0912c02009-09-02 23:00:46 +0000141 .init = drkaiser_init,
TURBO Jb0912c02009-09-02 23:00:46 +0000142 .map_flash_region = fallback_map,
143 .unmap_flash_region = fallback_unmap,
TURBO Jb0912c02009-09-02 23:00:46 +0000144 .delay = internal_delay,
145 },
Carl-Daniel Hailfinger4740c6f2009-09-16 10:09:21 +0000146#endif
TURBO Jb0912c02009-09-02 23:00:46 +0000147
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000148#if CONFIG_SATASII == 1
TURBO Jb0912c02009-09-02 23:00:46 +0000149 {
Carl-Daniel Hailfinger37fc4692009-08-12 14:34:35 +0000150 .name = "satasii",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000151 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000152 .devs.dev = satas_sii,
Rudolf Marek68720c72009-05-17 19:39:27 +0000153 .init = satasii_init,
Uwe Hermannc6915932009-05-17 23:12:17 +0000154 .map_flash_region = fallback_map,
155 .unmap_flash_region = fallback_unmap,
Carl-Daniel Hailfingerca8bfc62009-06-05 17:48:08 +0000156 .delay = internal_delay,
Rudolf Marek68720c72009-05-17 19:39:27 +0000157 },
Carl-Daniel Hailfinger4740c6f2009-09-16 10:09:21 +0000158#endif
Rudolf Marek68720c72009-05-17 19:39:27 +0000159
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000160#if CONFIG_ATAHPT == 1
Uwe Hermannddd5c9e2010-02-21 21:17:00 +0000161 {
162 .name = "atahpt",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000163 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000164 .devs.dev = ata_hpt,
Uwe Hermannddd5c9e2010-02-21 21:17:00 +0000165 .init = atahpt_init,
Uwe Hermannddd5c9e2010-02-21 21:17:00 +0000166 .map_flash_region = fallback_map,
167 .unmap_flash_region = fallback_unmap,
Uwe Hermannddd5c9e2010-02-21 21:17:00 +0000168 .delay = internal_delay,
169 },
170#endif
171
Jonathan Kollasch7f0f3fa2014-06-01 10:26:23 +0000172#if CONFIG_ATAVIA == 1
173 {
174 .name = "atavia",
175 .type = PCI,
176 .devs.dev = ata_via,
177 .init = atavia_init,
178 .map_flash_region = atavia_map,
179 .unmap_flash_region = fallback_unmap,
180 .delay = internal_delay,
181 },
182#endif
183
Joseph C. Lehnerc2644a32016-01-16 23:45:25 +0000184#if CONFIG_ATAPROMISE == 1
185 {
186 .name = "atapromise",
187 .type = PCI,
188 .devs.dev = ata_promise,
189 .init = atapromise_init,
190 .map_flash_region = atapromise_map,
191 .unmap_flash_region = fallback_unmap,
192 .delay = internal_delay,
193 },
194#endif
195
Kyösti Mälkki72d42f82014-06-01 23:48:31 +0000196#if CONFIG_IT8212 == 1
197 {
198 .name = "it8212",
199 .type = PCI,
200 .devs.dev = devs_it8212,
201 .init = it8212_init,
202 .map_flash_region = fallback_map,
203 .unmap_flash_region = fallback_unmap,
204 .delay = internal_delay,
205 },
206#endif
207
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000208#if CONFIG_FT2232_SPI == 1
Paul Fox05dfbe62009-06-16 21:08:06 +0000209 {
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000210 .name = "ft2232_spi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000211 .type = USB,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000212 .devs.dev = devs_ft2232spi,
Paul Fox05dfbe62009-06-16 21:08:06 +0000213 .init = ft2232_spi_init,
Carl-Daniel Hailfinger415e5132009-08-12 11:39:29 +0000214 .map_flash_region = fallback_map,
215 .unmap_flash_region = fallback_unmap,
Paul Fox05dfbe62009-06-16 21:08:06 +0000216 .delay = internal_delay,
217 },
Carl-Daniel Hailfinger3426ef62009-08-19 13:27:58 +0000218#endif
Carl-Daniel Hailfinger415e5132009-08-12 11:39:29 +0000219
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000220#if CONFIG_SERPROG == 1
Urja Rannikko22915352009-06-23 11:33:43 +0000221 {
Carl-Daniel Hailfinger37fc4692009-08-12 14:34:35 +0000222 .name = "serprog",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000223 .type = OTHER,
224 /* FIXME */
225 .devs.note = "All programmer devices speaking the serprog protocol\n",
Urja Rannikko22915352009-06-23 11:33:43 +0000226 .init = serprog_init,
Urja Rannikko0b4ffd52015-06-29 23:24:23 +0000227 .map_flash_region = serprog_map,
Urja Rannikko22915352009-06-23 11:33:43 +0000228 .unmap_flash_region = fallback_unmap,
Urja Rannikko22915352009-06-23 11:33:43 +0000229 .delay = serprog_delay,
230 },
Carl-Daniel Hailfinger6be74112009-08-12 16:17:41 +0000231#endif
Paul Fox05dfbe62009-06-16 21:08:06 +0000232
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000233#if CONFIG_BUSPIRATE_SPI == 1
Carl-Daniel Hailfinger5cca01f2009-11-24 00:20:03 +0000234 {
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000235 .name = "buspirate_spi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000236 .type = OTHER,
237 /* FIXME */
238 .devs.note = "Dangerous Prototypes Bus Pirate\n",
Carl-Daniel Hailfinger5cca01f2009-11-24 00:20:03 +0000239 .init = buspirate_spi_init,
Carl-Daniel Hailfinger5cca01f2009-11-24 00:20:03 +0000240 .map_flash_region = fallback_map,
241 .unmap_flash_region = fallback_unmap,
Carl-Daniel Hailfinger5cca01f2009-11-24 00:20:03 +0000242 .delay = internal_delay,
243 },
244#endif
245
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000246#if CONFIG_DEDIPROG == 1
Carl-Daniel Hailfingerd38fac82010-01-19 11:15:48 +0000247 {
248 .name = "dediprog",
Stefan Taunerfdec7472016-02-22 08:59:27 +0000249 .type = USB,
250 .devs.dev = devs_dediprog,
Carl-Daniel Hailfingerd38fac82010-01-19 11:15:48 +0000251 .init = dediprog_init,
Carl-Daniel Hailfingerd38fac82010-01-19 11:15:48 +0000252 .map_flash_region = fallback_map,
253 .unmap_flash_region = fallback_unmap,
Carl-Daniel Hailfingerd38fac82010-01-19 11:15:48 +0000254 .delay = internal_delay,
255 },
256#endif
257
Daniel Thompson45e91a22018-06-04 13:46:29 +0100258#if CONFIG_DEVELOPERBOX_SPI == 1
259 {
260 .name = "developerbox",
261 .type = USB,
262 .devs.dev = devs_developerbox_spi,
263 .init = developerbox_spi_init,
264 .map_flash_region = fallback_map,
265 .unmap_flash_region = fallback_unmap,
266 .delay = internal_delay,
267 },
268#endif
269
Carl-Daniel Hailfingere7fdd6e2010-07-21 10:26:01 +0000270#if CONFIG_RAYER_SPI == 1
271 {
272 .name = "rayer_spi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000273 .type = OTHER,
274 /* FIXME */
275 .devs.note = "RayeR parallel port programmer\n",
Carl-Daniel Hailfingere7fdd6e2010-07-21 10:26:01 +0000276 .init = rayer_spi_init,
Carl-Daniel Hailfingere7fdd6e2010-07-21 10:26:01 +0000277 .map_flash_region = fallback_map,
278 .unmap_flash_region = fallback_unmap,
Carl-Daniel Hailfingere7fdd6e2010-07-21 10:26:01 +0000279 .delay = internal_delay,
280 },
281#endif
282
Virgil-Adrian Teacada7c5452012-04-30 23:11:06 +0000283#if CONFIG_PONY_SPI == 1
284 {
285 .name = "pony_spi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000286 .type = OTHER,
287 /* FIXME */
288 .devs.note = "Programmers compatible with SI-Prog, serbang or AJAWe\n",
Virgil-Adrian Teacada7c5452012-04-30 23:11:06 +0000289 .init = pony_spi_init,
290 .map_flash_region = fallback_map,
291 .unmap_flash_region = fallback_unmap,
292 .delay = internal_delay,
Stefan Tauneraf358d62012-12-27 18:40:26 +0000293 },
Virgil-Adrian Teacada7c5452012-04-30 23:11:06 +0000294#endif
295
Carl-Daniel Hailfingerb713d2e2011-05-08 00:24:18 +0000296#if CONFIG_NICINTEL == 1
297 {
298 .name = "nicintel",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000299 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000300 .devs.dev = nics_intel,
Carl-Daniel Hailfingerb713d2e2011-05-08 00:24:18 +0000301 .init = nicintel_init,
Carl-Daniel Hailfingerb713d2e2011-05-08 00:24:18 +0000302 .map_flash_region = fallback_map,
303 .unmap_flash_region = fallback_unmap,
Carl-Daniel Hailfingerb713d2e2011-05-08 00:24:18 +0000304 .delay = internal_delay,
305 },
306#endif
307
Idwer Vollering004f4b72010-09-03 18:21:21 +0000308#if CONFIG_NICINTEL_SPI == 1
309 {
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000310 .name = "nicintel_spi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000311 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000312 .devs.dev = nics_intel_spi,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000313 .init = nicintel_spi_init,
314 .map_flash_region = fallback_map,
315 .unmap_flash_region = fallback_unmap,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000316 .delay = internal_delay,
Idwer Vollering004f4b72010-09-03 18:21:21 +0000317 },
318#endif
319
Ricardo Ribalda Delgado2a41f0a2014-07-28 20:35:21 +0000320#if CONFIG_NICINTEL_EEPROM == 1
321 {
322 .name = "nicintel_eeprom",
323 .type = PCI,
324 .devs.dev = nics_intel_ee,
325 .init = nicintel_ee_init,
326 .map_flash_region = fallback_map,
327 .unmap_flash_region = fallback_unmap,
328 .delay = internal_delay,
329 },
330#endif
331
Mark Marshall90021f22010-12-03 14:48:11 +0000332#if CONFIG_OGP_SPI == 1
333 {
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000334 .name = "ogp_spi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000335 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000336 .devs.dev = ogp_spi,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000337 .init = ogp_spi_init,
338 .map_flash_region = fallback_map,
339 .unmap_flash_region = fallback_unmap,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000340 .delay = internal_delay,
Mark Marshall90021f22010-12-03 14:48:11 +0000341 },
342#endif
343
Carl-Daniel Hailfinger9a1105c2011-02-04 21:37:59 +0000344#if CONFIG_SATAMV == 1
345 {
346 .name = "satamv",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000347 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000348 .devs.dev = satas_mv,
Carl-Daniel Hailfinger9a1105c2011-02-04 21:37:59 +0000349 .init = satamv_init,
Carl-Daniel Hailfinger9a1105c2011-02-04 21:37:59 +0000350 .map_flash_region = fallback_map,
351 .unmap_flash_region = fallback_unmap,
Carl-Daniel Hailfinger9a1105c2011-02-04 21:37:59 +0000352 .delay = internal_delay,
353 },
354#endif
355
David Hendricksf9a30552015-05-23 20:30:30 -0700356#if CONFIG_LINUX_MTD == 1
357 {
358 .name = "linux_mtd",
359 .type = OTHER,
360 .devs.note = "Device files /dev/mtd*\n",
361 .init = linux_mtd_init,
362 .map_flash_region = fallback_map,
363 .unmap_flash_region = fallback_unmap,
364 .delay = internal_delay,
365 },
366#endif
367
Sven Schnelle5ce5f702011-09-03 18:37:52 +0000368#if CONFIG_LINUX_SPI == 1
369 {
370 .name = "linux_spi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000371 .type = OTHER,
372 .devs.note = "Device files /dev/spidev*.*\n",
Sven Schnelle5ce5f702011-09-03 18:37:52 +0000373 .init = linux_spi_init,
374 .map_flash_region = fallback_map,
375 .unmap_flash_region = fallback_unmap,
Sven Schnelle5ce5f702011-09-03 18:37:52 +0000376 .delay = internal_delay,
377 },
378#endif
379
James Lairdc60de0e2013-03-27 13:00:23 +0000380#if CONFIG_USBBLASTER_SPI == 1
381 {
382 .name = "usbblaster_spi",
383 .type = USB,
384 .devs.dev = devs_usbblasterspi,
385 .init = usbblaster_spi_init,
386 .map_flash_region = fallback_map,
387 .unmap_flash_region = fallback_unmap,
388 .delay = internal_delay,
389 },
390#endif
391
Alexandre Boeglin80e64712014-12-20 20:25:19 +0000392#if CONFIG_MSTARDDC_SPI == 1
393 {
394 .name = "mstarddc_spi",
395 .type = OTHER,
396 .devs.note = "MSTAR DDC devices addressable via /dev/i2c-* on Linux.\n",
397 .init = mstarddc_spi_init,
398 .map_flash_region = fallback_map,
399 .unmap_flash_region = fallback_unmap,
400 .delay = internal_delay,
401 },
402#endif
403
Justin Chevrier66e554b2015-02-08 21:58:10 +0000404#if CONFIG_PICKIT2_SPI == 1
405 {
406 .name = "pickit2_spi",
Stefan Taunerf31fe842016-02-22 08:59:15 +0000407 .type = USB,
408 .devs.dev = devs_pickit2_spi,
Justin Chevrier66e554b2015-02-08 21:58:10 +0000409 .init = pickit2_spi_init,
410 .map_flash_region = fallback_map,
411 .unmap_flash_region = fallback_unmap,
412 .delay = internal_delay,
413 },
414#endif
415
Urja Rannikko0870b022016-01-31 22:10:29 +0000416#if CONFIG_CH341A_SPI == 1
417 {
418 .name = "ch341a_spi",
419 .type = USB,
420 .devs.dev = devs_ch341a_spi,
421 .init = ch341a_spi_init,
422 .map_flash_region = fallback_map,
423 .unmap_flash_region = fallback_unmap,
424 .delay = ch341a_spi_delay,
425 },
426#endif
427
Lubomir Rintelb2154e82018-01-14 17:35:33 +0100428#if CONFIG_DIGILENT_SPI == 1
429 {
430 .name = "digilent_spi",
431 .type = USB,
432 .devs.dev = devs_digilent_spi,
433 .init = digilent_spi_init,
434 .map_flash_region = fallback_map,
435 .unmap_flash_region = fallback_unmap,
436 .delay = internal_delay,
437 },
438#endif
439
Carl-Daniel Hailfinger1c6d2ff2012-08-27 00:44:42 +0000440 {0}, /* This entry corresponds to PROGRAMMER_INVALID. */
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +0000441};
Luc Verhaegen8e3a6002007-04-04 22:45:58 +0000442
Carl-Daniel Hailfinger2bee8cf2010-11-10 15:25:18 +0000443#define SHUTDOWN_MAXFN 32
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000444static int shutdown_fn_count = 0;
Nico Huber454f6132012-12-10 13:34:10 +0000445/** @private */
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000446struct shutdown_func_data {
David Hendricks8bb20212011-06-14 01:35:36 +0000447 int (*func) (void *data);
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000448 void *data;
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000449} static shutdown_fn[SHUTDOWN_MAXFN];
450/* Initialize to 0 to make sure nobody registers a shutdown function before
451 * programmer init.
452 */
453static int may_register_shutdown = 0;
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000454
Stefan Taunerc4f44df2013-08-12 22:58:43 +0000455/* Did we change something or was every erase/write skipped (if any)? */
456static bool all_skipped = true;
457
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +0000458static int check_block_eraser(const struct flashctx *flash, int k, int log);
Stefan Tauner5368dca2011-07-01 00:19:12 +0000459
Stefan Tauner2a1ed772014-08-31 00:09:21 +0000460int shutdown_free(void *data)
461{
462 free(data);
463 return 0;
464}
465
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000466/* Register a function to be executed on programmer shutdown.
467 * The advantage over atexit() is that you can supply a void pointer which will
468 * be used as parameter to the registered function upon programmer shutdown.
469 * This pointer can point to arbitrary data used by said function, e.g. undo
470 * information for GPIO settings etc. If unneeded, set data=NULL.
471 * Please note that the first (void *data) belongs to the function signature of
472 * the function passed as first parameter.
473 */
David Hendricks8bb20212011-06-14 01:35:36 +0000474int register_shutdown(int (*function) (void *data), void *data)
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000475{
476 if (shutdown_fn_count >= SHUTDOWN_MAXFN) {
Carl-Daniel Hailfinger9f5f2152010-06-04 23:20:21 +0000477 msg_perr("Tried to register more than %i shutdown functions.\n",
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000478 SHUTDOWN_MAXFN);
479 return 1;
480 }
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000481 if (!may_register_shutdown) {
482 msg_perr("Tried to register a shutdown function before "
483 "programmer init.\n");
484 return 1;
485 }
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000486 shutdown_fn[shutdown_fn_count].func = function;
487 shutdown_fn[shutdown_fn_count].data = data;
488 shutdown_fn_count++;
489
490 return 0;
491}
492
Nico Huberbcb2e5a2012-12-30 01:23:17 +0000493int programmer_init(enum programmer prog, const char *param)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000494{
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000495 int ret;
Carl-Daniel Hailfinger2e681602011-09-08 00:00:29 +0000496
497 if (prog >= PROGRAMMER_INVALID) {
498 msg_perr("Invalid programmer specified!\n");
499 return -1;
500 }
501 programmer = prog;
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000502 /* Initialize all programmer specific data. */
503 /* Default to unlimited decode sizes. */
504 max_rom_decode = (const struct decode_sizes) {
505 .parallel = 0xffffffff,
506 .lpc = 0xffffffff,
507 .fwh = 0xffffffff,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000508 .spi = 0xffffffff,
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000509 };
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000510 /* Default to top aligned flash at 4 GB. */
511 flashbase = 0;
512 /* Registering shutdown functions is now allowed. */
513 may_register_shutdown = 1;
Carl-Daniel Hailfingerd1be52d2010-07-03 12:14:25 +0000514 /* Default to allowing writes. Broken programmers set this to 0. */
515 programmer_may_write = 1;
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000516
517 programmer_param = param;
Carl-Daniel Hailfinger20a36ba2013-08-13 07:09:57 +0000518 msg_pdbg("Initializing %s programmer\n", programmer_table[programmer].name);
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000519 ret = programmer_table[programmer].init();
520 if (programmer_param && strlen(programmer_param)) {
Carl-Daniel Hailfinger20a36ba2013-08-13 07:09:57 +0000521 if (ret != 0) {
522 /* It is quite possible that any unhandled programmer parameter would have been valid,
523 * but an error in actual programmer init happened before the parameter was evaluated.
524 */
525 msg_pwarn("Unhandled programmer parameters (possibly due to another failure): %s\n",
526 programmer_param);
527 } else {
528 /* Actual programmer init was successful, but the user specified an invalid or unusable
529 * (for the current programmer configuration) parameter.
530 */
531 msg_perr("Unhandled programmer parameters: %s\n", programmer_param);
532 msg_perr("Aborting.\n");
533 ret = ERROR_FATAL;
534 }
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000535 }
536 return ret;
Uwe Hermann09e04f72009-05-16 22:36:00 +0000537}
538
Stefan Tauner20da4aa2014-05-07 22:07:23 +0000539/** Calls registered shutdown functions and resets internal programmer-related variables.
540 * Calling it is safe even without previous initialization, but further interactions with programmer support
541 * require a call to programmer_init() (afterwards).
542 *
543 * @return The OR-ed result values of all shutdown functions (i.e. 0 on success). */
Uwe Hermann09e04f72009-05-16 22:36:00 +0000544int programmer_shutdown(void)
545{
David Hendricks8bb20212011-06-14 01:35:36 +0000546 int ret = 0;
547
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000548 /* Registering shutdown functions is no longer allowed. */
549 may_register_shutdown = 0;
550 while (shutdown_fn_count > 0) {
551 int i = --shutdown_fn_count;
David Hendricks8bb20212011-06-14 01:35:36 +0000552 ret |= shutdown_fn[i].func(shutdown_fn[i].data);
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000553 }
Stefan Taunere34e3e82013-01-01 00:06:51 +0000554
Stefan Taunerb8911d62012-12-26 07:55:00 +0000555 programmer_param = NULL;
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000556 registered_master_count = 0;
Stefan Taunere34e3e82013-01-01 00:06:51 +0000557
David Hendricks8bb20212011-06-14 01:35:36 +0000558 return ret;
Uwe Hermann09e04f72009-05-16 22:36:00 +0000559}
560
Stefan Tauner305e0b92013-07-17 23:46:44 +0000561void *programmer_map_flash_region(const char *descr, uintptr_t phys_addr, size_t len)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000562{
Stefan Tauner26e7a152013-09-13 17:21:05 +0000563 void *ret = programmer_table[programmer].map_flash_region(descr, phys_addr, len);
564 msg_gspew("%s: mapping %s from 0x%0*" PRIxPTR " to 0x%0*" PRIxPTR "\n",
565 __func__, descr, PRIxPTR_WIDTH, phys_addr, PRIxPTR_WIDTH, (uintptr_t) ret);
566 return ret;
Uwe Hermann09e04f72009-05-16 22:36:00 +0000567}
568
569void programmer_unmap_flash_region(void *virt_addr, size_t len)
570{
571 programmer_table[programmer].unmap_flash_region(virt_addr, len);
Stefan Tauner4e32ec12014-08-30 23:39:51 +0000572 msg_gspew("%s: unmapped 0x%0*" PRIxPTR "\n", __func__, PRIxPTR_WIDTH, (uintptr_t)virt_addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000573}
574
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000575void chip_writeb(const struct flashctx *flash, uint8_t val, chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000576{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000577 flash->mst->par.chip_writeb(flash, val, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000578}
579
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000580void chip_writew(const struct flashctx *flash, uint16_t val, chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000581{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000582 flash->mst->par.chip_writew(flash, val, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000583}
584
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000585void chip_writel(const struct flashctx *flash, uint32_t val, chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000586{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000587 flash->mst->par.chip_writel(flash, val, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000588}
589
Mark Marshallf20b7be2014-05-09 21:16:21 +0000590void chip_writen(const struct flashctx *flash, const uint8_t *buf, chipaddr addr, size_t len)
Carl-Daniel Hailfinger0bd2a2b2009-06-05 18:32:07 +0000591{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000592 flash->mst->par.chip_writen(flash, buf, addr, len);
Carl-Daniel Hailfinger0bd2a2b2009-06-05 18:32:07 +0000593}
594
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000595uint8_t chip_readb(const struct flashctx *flash, const chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000596{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000597 return flash->mst->par.chip_readb(flash, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000598}
599
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000600uint16_t chip_readw(const struct flashctx *flash, const chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000601{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000602 return flash->mst->par.chip_readw(flash, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000603}
604
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000605uint32_t chip_readl(const struct flashctx *flash, const chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000606{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000607 return flash->mst->par.chip_readl(flash, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000608}
609
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000610void chip_readn(const struct flashctx *flash, uint8_t *buf, chipaddr addr,
611 size_t len)
Carl-Daniel Hailfinger0bd2a2b2009-06-05 18:32:07 +0000612{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000613 flash->mst->par.chip_readn(flash, buf, addr, len);
Carl-Daniel Hailfinger0bd2a2b2009-06-05 18:32:07 +0000614}
615
Stefan Taunerf80419c2014-05-02 15:41:42 +0000616void programmer_delay(unsigned int usecs)
Carl-Daniel Hailfingerca8bfc62009-06-05 17:48:08 +0000617{
Urja Rannikko8d7ec2a2013-10-21 21:49:08 +0000618 if (usecs > 0)
619 programmer_table[programmer].delay(usecs);
Carl-Daniel Hailfingerca8bfc62009-06-05 17:48:08 +0000620}
621
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000622int read_memmapped(struct flashctx *flash, uint8_t *buf, unsigned int start,
623 int unsigned len)
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000624{
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000625 chip_readn(flash, buf, flash->virtual_memory + start, len);
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000626
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000627 return 0;
628}
629
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000630/* This is a somewhat hacked function similar in some ways to strtok().
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000631 * It will look for needle with a subsequent '=' in haystack, return a copy of
632 * needle and remove everything from the first occurrence of needle to the next
633 * delimiter from haystack.
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000634 */
Nico Huberbcb2e5a2012-12-30 01:23:17 +0000635char *extract_param(const char *const *haystack, const char *needle, const char *delim)
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000636{
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000637 char *param_pos, *opt_pos, *rest;
638 char *opt = NULL;
639 int optlen;
Carl-Daniel Hailfinger27023762010-04-28 15:22:14 +0000640 int needlelen;
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000641
Carl-Daniel Hailfinger27023762010-04-28 15:22:14 +0000642 needlelen = strlen(needle);
643 if (!needlelen) {
644 msg_gerr("%s: empty needle! Please report a bug at "
645 "flashrom@flashrom.org\n", __func__);
646 return NULL;
647 }
648 /* No programmer parameters given. */
649 if (*haystack == NULL)
650 return NULL;
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000651 param_pos = strstr(*haystack, needle);
652 do {
653 if (!param_pos)
654 return NULL;
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000655 /* Needle followed by '='? */
656 if (param_pos[needlelen] == '=') {
657
658 /* Beginning of the string? */
659 if (param_pos == *haystack)
660 break;
661 /* After a delimiter? */
662 if (strchr(delim, *(param_pos - 1)))
663 break;
664 }
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000665 /* Continue searching. */
666 param_pos++;
667 param_pos = strstr(param_pos, needle);
668 } while (1);
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000669
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000670 if (param_pos) {
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000671 /* Get the string after needle and '='. */
672 opt_pos = param_pos + needlelen + 1;
673 optlen = strcspn(opt_pos, delim);
674 /* Return an empty string if the parameter was empty. */
675 opt = malloc(optlen + 1);
676 if (!opt) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000677 msg_gerr("Out of memory!\n");
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000678 exit(1);
679 }
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000680 strncpy(opt, opt_pos, optlen);
681 opt[optlen] = '\0';
682 rest = opt_pos + optlen;
683 /* Skip all delimiters after the current parameter. */
684 rest += strspn(rest, delim);
685 memmove(param_pos, rest, strlen(rest) + 1);
686 /* We could shrink haystack, but the effort is not worth it. */
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000687 }
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000688
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000689 return opt;
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000690}
691
Stefan Tauner66652442011-06-26 17:38:17 +0000692char *extract_programmer_param(const char *param_name)
Carl-Daniel Hailfinger2b6dcb32010-07-08 10:13:37 +0000693{
694 return extract_param(&programmer_param, param_name, ",");
695}
696
Sylvain "ythier" Hitier9db45512011-07-04 07:27:17 +0000697/* Returns the number of well-defined erasers for a chip. */
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +0000698static unsigned int count_usable_erasers(const struct flashctx *flash)
Stefan Tauner5368dca2011-07-01 00:19:12 +0000699{
700 unsigned int usable_erasefunctions = 0;
701 int k;
702 for (k = 0; k < NUM_ERASEFUNCTIONS; k++) {
703 if (!check_block_eraser(flash, k, 0))
704 usable_erasefunctions++;
705 }
706 return usable_erasefunctions;
707}
708
Mark Marshallf20b7be2014-05-09 21:16:21 +0000709static int compare_range(const uint8_t *wantbuf, const uint8_t *havebuf, unsigned int start, unsigned int len)
Stefan Tauner78ffbea2012-10-27 15:36:56 +0000710{
711 int ret = 0, failcount = 0;
712 unsigned int i;
713 for (i = 0; i < len; i++) {
714 if (wantbuf[i] != havebuf[i]) {
715 /* Only print the first failure. */
716 if (!failcount++)
717 msg_cerr("FAILED at 0x%08x! Expected=0x%02x, Found=0x%02x,",
718 start + i, wantbuf[i], havebuf[i]);
719 }
720 }
721 if (failcount) {
722 msg_cerr(" failed byte count from 0x%08x-0x%08x: 0x%x\n",
723 start, start + len - 1, failcount);
724 ret = -1;
725 }
726 return ret;
727}
728
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000729/* start is an offset to the base address of the flash chip */
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000730int check_erased_range(struct flashctx *flash, unsigned int start,
731 unsigned int len)
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000732{
733 int ret;
734 uint8_t *cmpbuf = malloc(len);
Paul Kocialkowski995f7552018-01-15 01:06:09 +0300735 const uint8_t erased_value = ERASED_VALUE(flash);
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000736
737 if (!cmpbuf) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000738 msg_gerr("Could not allocate memory!\n");
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000739 exit(1);
740 }
Paul Kocialkowski995f7552018-01-15 01:06:09 +0300741 memset(cmpbuf, erased_value, len);
Stefan Tauner78ffbea2012-10-27 15:36:56 +0000742 ret = verify_range(flash, cmpbuf, start, len);
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000743 free(cmpbuf);
744 return ret;
745}
746
Uwe Hermann48ec1b12010-08-08 17:01:18 +0000747/*
Carl-Daniel Hailfingerd0250a32009-11-25 17:05:52 +0000748 * @cmpbuf buffer to compare against, cmpbuf[0] is expected to match the
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000749 * flash content at location start
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000750 * @start offset to the base address of the flash chip
751 * @len length of the verified area
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000752 * @return 0 for success, -1 for failure
753 */
Mark Marshallf20b7be2014-05-09 21:16:21 +0000754int verify_range(struct flashctx *flash, const uint8_t *cmpbuf, unsigned int start, unsigned int len)
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000755{
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000756 if (!len)
Stefan Taunerdf64a422014-05-27 00:06:14 +0000757 return -1;
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000758
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +0000759 if (!flash->chip->read) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000760 msg_cerr("ERROR: flashrom has no read function for this flash chip.\n");
Stefan Taunerdf64a422014-05-27 00:06:14 +0000761 return -1;
Carl-Daniel Hailfinger23290662009-06-24 08:20:45 +0000762 }
Stefan Taunerdf64a422014-05-27 00:06:14 +0000763
764 uint8_t *readbuf = malloc(len);
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000765 if (!readbuf) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000766 msg_gerr("Could not allocate memory!\n");
Stefan Taunerdf64a422014-05-27 00:06:14 +0000767 return -1;
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000768 }
Stefan Taunerdf64a422014-05-27 00:06:14 +0000769 int ret = 0;
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000770
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +0000771 if (start + len > flash->chip->total_size * 1024) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000772 msg_gerr("Error: %s called with start 0x%x + len 0x%x >"
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000773 " total_size 0x%x\n", __func__, start, len,
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +0000774 flash->chip->total_size * 1024);
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000775 ret = -1;
776 goto out_free;
777 }
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000778
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +0000779 ret = flash->chip->read(flash, readbuf, start, len);
Carl-Daniel Hailfingerd8369412010-11-16 17:21:58 +0000780 if (ret) {
781 msg_gerr("Verification impossible because read failed "
782 "at 0x%x (len 0x%x)\n", start, len);
Stefan Taunerdf64a422014-05-27 00:06:14 +0000783 ret = -1;
784 goto out_free;
Carl-Daniel Hailfingerd8369412010-11-16 17:21:58 +0000785 }
786
Stefan Tauner78ffbea2012-10-27 15:36:56 +0000787 ret = compare_range(cmpbuf, readbuf, start, len);
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000788out_free:
789 free(readbuf);
790 return ret;
791}
792
Stefan Tauner02437452013-04-01 19:34:53 +0000793/* Helper function for need_erase() that focuses on granularities of gran bytes. */
Paul Kocialkowski995f7552018-01-15 01:06:09 +0300794static int need_erase_gran_bytes(const uint8_t *have, const uint8_t *want, unsigned int len,
795 unsigned int gran, const uint8_t erased_value)
Stefan Tauner02437452013-04-01 19:34:53 +0000796{
797 unsigned int i, j, limit;
798 for (j = 0; j < len / gran; j++) {
799 limit = min (gran, len - j * gran);
800 /* Are 'have' and 'want' identical? */
801 if (!memcmp(have + j * gran, want + j * gran, limit))
802 continue;
803 /* have needs to be in erased state. */
804 for (i = 0; i < limit; i++)
Paul Kocialkowski995f7552018-01-15 01:06:09 +0300805 if (have[j * gran + i] != erased_value)
Stefan Tauner02437452013-04-01 19:34:53 +0000806 return 1;
807 }
808 return 0;
809}
810
Uwe Hermann48ec1b12010-08-08 17:01:18 +0000811/*
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000812 * Check if the buffer @have can be programmed to the content of @want without
813 * erasing. This is only possible if all chunks of size @gran are either kept
814 * as-is or changed from an all-ones state to any other state.
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000815 *
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000816 * Warning: This function assumes that @have and @want point to naturally
817 * aligned regions.
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000818 *
819 * @have buffer with current content
820 * @want buffer with desired content
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000821 * @len length of the checked area
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000822 * @gran write granularity (enum, not count)
823 * @return 0 if no erase is needed, 1 otherwise
824 */
Paul Kocialkowski995f7552018-01-15 01:06:09 +0300825int need_erase(const uint8_t *have, const uint8_t *want, unsigned int len,
826 enum write_granularity gran, const uint8_t erased_value)
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000827{
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +0000828 int result = 0;
Stefan Tauner02437452013-04-01 19:34:53 +0000829 unsigned int i;
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000830
831 switch (gran) {
832 case write_gran_1bit:
833 for (i = 0; i < len; i++)
834 if ((have[i] & want[i]) != want[i]) {
835 result = 1;
836 break;
837 }
838 break;
839 case write_gran_1byte:
840 for (i = 0; i < len; i++)
Paul Kocialkowski995f7552018-01-15 01:06:09 +0300841 if ((have[i] != want[i]) && (have[i] != erased_value)) {
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000842 result = 1;
843 break;
844 }
845 break;
Paul Kocialkowskic8305e12015-10-16 02:16:20 +0000846 case write_gran_128bytes:
Paul Kocialkowski995f7552018-01-15 01:06:09 +0300847 result = need_erase_gran_bytes(have, want, len, 128, erased_value);
Paul Kocialkowskic8305e12015-10-16 02:16:20 +0000848 break;
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000849 case write_gran_256bytes:
Paul Kocialkowski995f7552018-01-15 01:06:09 +0300850 result = need_erase_gran_bytes(have, want, len, 256, erased_value);
Stefan Tauner02437452013-04-01 19:34:53 +0000851 break;
852 case write_gran_264bytes:
Paul Kocialkowski995f7552018-01-15 01:06:09 +0300853 result = need_erase_gran_bytes(have, want, len, 264, erased_value);
Stefan Tauner02437452013-04-01 19:34:53 +0000854 break;
855 case write_gran_512bytes:
Paul Kocialkowski995f7552018-01-15 01:06:09 +0300856 result = need_erase_gran_bytes(have, want, len, 512, erased_value);
Stefan Tauner02437452013-04-01 19:34:53 +0000857 break;
858 case write_gran_528bytes:
Paul Kocialkowski995f7552018-01-15 01:06:09 +0300859 result = need_erase_gran_bytes(have, want, len, 528, erased_value);
Stefan Tauner02437452013-04-01 19:34:53 +0000860 break;
861 case write_gran_1024bytes:
Paul Kocialkowski995f7552018-01-15 01:06:09 +0300862 result = need_erase_gran_bytes(have, want, len, 1024, erased_value);
Stefan Tauner02437452013-04-01 19:34:53 +0000863 break;
864 case write_gran_1056bytes:
Paul Kocialkowski995f7552018-01-15 01:06:09 +0300865 result = need_erase_gran_bytes(have, want, len, 1056, erased_value);
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000866 break;
Carl-Daniel Hailfinger1b0e9fc2014-06-16 22:36:17 +0000867 case write_gran_1byte_implicit_erase:
868 /* Do not erase, handle content changes from anything->0xff by writing 0xff. */
869 result = 0;
870 break;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000871 default:
872 msg_cerr("%s: Unsupported granularity! Please report a bug at "
873 "flashrom@flashrom.org\n", __func__);
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000874 }
875 return result;
876}
877
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000878/**
879 * Check if the buffer @have needs to be programmed to get the content of @want.
880 * If yes, return 1 and fill in first_start with the start address of the
881 * write operation and first_len with the length of the first to-be-written
882 * chunk. If not, return 0 and leave first_start and first_len undefined.
883 *
884 * Warning: This function assumes that @have and @want point to naturally
885 * aligned regions.
886 *
887 * @have buffer with current content
888 * @want buffer with desired content
889 * @len length of the checked area
890 * @gran write granularity (enum, not count)
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000891 * @first_start offset of the first byte which needs to be written (passed in
892 * value is increased by the offset of the first needed write
893 * relative to have/want or unchanged if no write is needed)
894 * @return length of the first contiguous area which needs to be written
895 * 0 if no write is needed
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000896 *
897 * FIXME: This function needs a parameter which tells it about coalescing
898 * in relation to the max write length of the programmer and the max write
899 * length of the chip.
900 */
Mark Marshallf20b7be2014-05-09 21:16:21 +0000901static unsigned int get_next_write(const uint8_t *have, const uint8_t *want, unsigned int len,
Stefan Taunerc69c9c82011-11-23 09:13:48 +0000902 unsigned int *first_start,
903 enum write_granularity gran)
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000904{
Stefan Taunerc69c9c82011-11-23 09:13:48 +0000905 int need_write = 0;
906 unsigned int rel_start = 0, first_len = 0;
907 unsigned int i, limit, stride;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000908
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000909 switch (gran) {
910 case write_gran_1bit:
911 case write_gran_1byte:
Carl-Daniel Hailfinger1b0e9fc2014-06-16 22:36:17 +0000912 case write_gran_1byte_implicit_erase:
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000913 stride = 1;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000914 break;
Paul Kocialkowskic8305e12015-10-16 02:16:20 +0000915 case write_gran_128bytes:
916 stride = 128;
917 break;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000918 case write_gran_256bytes:
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000919 stride = 256;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000920 break;
Stefan Tauner02437452013-04-01 19:34:53 +0000921 case write_gran_264bytes:
922 stride = 264;
923 break;
924 case write_gran_512bytes:
925 stride = 512;
926 break;
927 case write_gran_528bytes:
928 stride = 528;
929 break;
930 case write_gran_1024bytes:
931 stride = 1024;
932 break;
933 case write_gran_1056bytes:
934 stride = 1056;
935 break;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000936 default:
937 msg_cerr("%s: Unsupported granularity! Please report a bug at "
938 "flashrom@flashrom.org\n", __func__);
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000939 /* Claim that no write was needed. A write with unknown
940 * granularity is too dangerous to try.
941 */
942 return 0;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000943 }
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000944 for (i = 0; i < len / stride; i++) {
945 limit = min(stride, len - i * stride);
946 /* Are 'have' and 'want' identical? */
947 if (memcmp(have + i * stride, want + i * stride, limit)) {
948 if (!need_write) {
949 /* First location where have and want differ. */
950 need_write = 1;
951 rel_start = i * stride;
952 }
953 } else {
954 if (need_write) {
955 /* First location where have and want
956 * do not differ anymore.
957 */
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000958 break;
959 }
960 }
961 }
Carl-Daniel Hailfinger202bf532010-12-06 13:05:44 +0000962 if (need_write)
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000963 first_len = min(i * stride - rel_start, len);
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000964 *first_start += rel_start;
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000965 return first_len;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000966}
967
Carl-Daniel Hailfingereaac68b2009-11-23 12:55:31 +0000968/* This function generates various test patterns useful for testing controller
969 * and chip communication as well as chip behaviour.
970 *
971 * If a byte can be written multiple times, each time keeping 0-bits at 0
972 * and changing 1-bits to 0 if the new value for that bit is 0, the effect
973 * is essentially an AND operation. That's also the reason why this function
974 * provides the result of AND between various patterns.
975 *
976 * Below is a list of patterns (and their block length).
977 * Pattern 0 is 05 15 25 35 45 55 65 75 85 95 a5 b5 c5 d5 e5 f5 (16 Bytes)
978 * Pattern 1 is 0a 1a 2a 3a 4a 5a 6a 7a 8a 9a aa ba ca da ea fa (16 Bytes)
979 * Pattern 2 is 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f (16 Bytes)
980 * Pattern 3 is a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af (16 Bytes)
981 * Pattern 4 is 00 10 20 30 40 50 60 70 80 90 a0 b0 c0 d0 e0 f0 (16 Bytes)
982 * Pattern 5 is 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f (16 Bytes)
983 * Pattern 6 is 00 (1 Byte)
984 * Pattern 7 is ff (1 Byte)
985 * Patterns 0-7 have a big-endian block number in the last 2 bytes of each 256
986 * byte block.
987 *
988 * Pattern 8 is 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11... (256 B)
989 * Pattern 9 is ff fe fd fc fb fa f9 f8 f7 f6 f5 f4 f3 f2 f1 f0 ef ee... (256 B)
990 * Pattern 10 is 00 00 00 01 00 02 00 03 00 04... (128 kB big-endian counter)
991 * Pattern 11 is ff ff ff fe ff fd ff fc ff fb... (128 kB big-endian downwards)
992 * Pattern 12 is 00 (1 Byte)
993 * Pattern 13 is ff (1 Byte)
994 * Patterns 8-13 have no block number.
995 *
996 * Patterns 0-3 are created to detect and efficiently diagnose communication
997 * slips like missed bits or bytes and their repetitive nature gives good visual
998 * cues to the person inspecting the results. In addition, the following holds:
999 * AND Pattern 0/1 == Pattern 4
1000 * AND Pattern 2/3 == Pattern 5
1001 * AND Pattern 0/1/2/3 == AND Pattern 4/5 == Pattern 6
1002 * A weakness of pattern 0-5 is the inability to detect swaps/copies between
1003 * any two 16-byte blocks except for the last 16-byte block in a 256-byte bloc.
1004 * They work perfectly for detecting any swaps/aliasing of blocks >= 256 bytes.
1005 * 0x5 and 0xa were picked because they are 0101 and 1010 binary.
1006 * Patterns 8-9 are best for detecting swaps/aliasing of blocks < 256 bytes.
1007 * Besides that, they provide for bit testing of the last two bytes of every
1008 * 256 byte block which contains the block number for patterns 0-6.
1009 * Patterns 10-11 are special purpose for detecting subblock aliasing with
1010 * block sizes >256 bytes (some Dataflash chips etc.)
1011 * AND Pattern 8/9 == Pattern 12
1012 * AND Pattern 10/11 == Pattern 12
1013 * Pattern 13 is the completely erased state.
1014 * None of the patterns can detect aliasing at boundaries which are a multiple
1015 * of 16 MBytes (but such chips do not exist anyway for Parallel/LPC/FWH/SPI).
1016 */
1017int generate_testpattern(uint8_t *buf, uint32_t size, int variant)
1018{
1019 int i;
1020
1021 if (!buf) {
Sean Nelson316a29f2010-05-07 20:09:04 +00001022 msg_gerr("Invalid buffer!\n");
Carl-Daniel Hailfingereaac68b2009-11-23 12:55:31 +00001023 return 1;
1024 }
1025
1026 switch (variant) {
1027 case 0:
1028 for (i = 0; i < size; i++)
1029 buf[i] = (i & 0xf) << 4 | 0x5;
1030 break;
1031 case 1:
1032 for (i = 0; i < size; i++)
1033 buf[i] = (i & 0xf) << 4 | 0xa;
1034 break;
1035 case 2:
1036 for (i = 0; i < size; i++)
1037 buf[i] = 0x50 | (i & 0xf);
1038 break;
1039 case 3:
1040 for (i = 0; i < size; i++)
1041 buf[i] = 0xa0 | (i & 0xf);
1042 break;
1043 case 4:
1044 for (i = 0; i < size; i++)
1045 buf[i] = (i & 0xf) << 4;
1046 break;
1047 case 5:
1048 for (i = 0; i < size; i++)
1049 buf[i] = i & 0xf;
1050 break;
1051 case 6:
1052 memset(buf, 0x00, size);
1053 break;
1054 case 7:
1055 memset(buf, 0xff, size);
1056 break;
1057 case 8:
1058 for (i = 0; i < size; i++)
1059 buf[i] = i & 0xff;
1060 break;
1061 case 9:
1062 for (i = 0; i < size; i++)
1063 buf[i] = ~(i & 0xff);
1064 break;
1065 case 10:
1066 for (i = 0; i < size % 2; i++) {
1067 buf[i * 2] = (i >> 8) & 0xff;
1068 buf[i * 2 + 1] = i & 0xff;
1069 }
1070 if (size & 0x1)
1071 buf[i * 2] = (i >> 8) & 0xff;
1072 break;
1073 case 11:
1074 for (i = 0; i < size % 2; i++) {
1075 buf[i * 2] = ~((i >> 8) & 0xff);
1076 buf[i * 2 + 1] = ~(i & 0xff);
1077 }
1078 if (size & 0x1)
1079 buf[i * 2] = ~((i >> 8) & 0xff);
1080 break;
1081 case 12:
1082 memset(buf, 0x00, size);
1083 break;
1084 case 13:
1085 memset(buf, 0xff, size);
1086 break;
1087 }
1088
1089 if ((variant >= 0) && (variant <= 7)) {
1090 /* Write block number in the last two bytes of each 256-byte
1091 * block, big endian for easier reading of the hexdump.
1092 * Note that this wraps around for chips larger than 2^24 bytes
1093 * (16 MB).
1094 */
1095 for (i = 0; i < size / 256; i++) {
1096 buf[i * 256 + 254] = (i >> 8) & 0xff;
1097 buf[i * 256 + 255] = i & 0xff;
1098 }
1099 }
1100
1101 return 0;
1102}
1103
Stefan Tauner9e3a6982014-08-15 17:17:59 +00001104/* Returns the number of busses commonly supported by the current programmer and flash chip where the latter
1105 * can not be completely accessed due to size/address limits of the programmer. */
1106unsigned int count_max_decode_exceedings(const struct flashctx *flash)
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001107{
Stefan Tauner9e3a6982014-08-15 17:17:59 +00001108 unsigned int limitexceeded = 0;
1109 uint32_t size = flash->chip->total_size * 1024;
1110 enum chipbustype buses = flash->mst->buses_supported & flash->chip->bustype;
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001111
1112 if ((buses & BUS_PARALLEL) && (max_rom_decode.parallel < size)) {
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001113 limitexceeded++;
Sean Nelson316a29f2010-05-07 20:09:04 +00001114 msg_pdbg("Chip size %u kB is bigger than supported "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001115 "size %u kB of chipset/board/programmer "
1116 "for %s interface, "
1117 "probe/read/erase/write may fail. ", size / 1024,
1118 max_rom_decode.parallel / 1024, "Parallel");
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001119 }
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001120 if ((buses & BUS_LPC) && (max_rom_decode.lpc < size)) {
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001121 limitexceeded++;
Sean Nelson316a29f2010-05-07 20:09:04 +00001122 msg_pdbg("Chip size %u kB is bigger than supported "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001123 "size %u kB of chipset/board/programmer "
1124 "for %s interface, "
1125 "probe/read/erase/write may fail. ", size / 1024,
1126 max_rom_decode.lpc / 1024, "LPC");
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001127 }
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001128 if ((buses & BUS_FWH) && (max_rom_decode.fwh < size)) {
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001129 limitexceeded++;
Sean Nelson316a29f2010-05-07 20:09:04 +00001130 msg_pdbg("Chip size %u kB is bigger than supported "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001131 "size %u kB of chipset/board/programmer "
1132 "for %s interface, "
1133 "probe/read/erase/write may fail. ", size / 1024,
1134 max_rom_decode.fwh / 1024, "FWH");
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001135 }
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001136 if ((buses & BUS_SPI) && (max_rom_decode.spi < size)) {
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001137 limitexceeded++;
Sean Nelson316a29f2010-05-07 20:09:04 +00001138 msg_pdbg("Chip size %u kB is bigger than supported "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001139 "size %u kB of chipset/board/programmer "
1140 "for %s interface, "
1141 "probe/read/erase/write may fail. ", size / 1024,
1142 max_rom_decode.spi / 1024, "SPI");
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001143 }
Stefan Tauner9e3a6982014-08-15 17:17:59 +00001144 return limitexceeded;
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001145}
1146
Stefan Tauner4e32ec12014-08-30 23:39:51 +00001147void unmap_flash(struct flashctx *flash)
1148{
1149 if (flash->virtual_registers != (chipaddr)ERROR_PTR) {
1150 programmer_unmap_flash_region((void *)flash->virtual_registers, flash->chip->total_size * 1024);
1151 flash->physical_registers = 0;
1152 flash->virtual_registers = (chipaddr)ERROR_PTR;
1153 }
1154
1155 if (flash->virtual_memory != (chipaddr)ERROR_PTR) {
1156 programmer_unmap_flash_region((void *)flash->virtual_memory, flash->chip->total_size * 1024);
1157 flash->physical_memory = 0;
1158 flash->virtual_memory = (chipaddr)ERROR_PTR;
1159 }
1160}
1161
1162int map_flash(struct flashctx *flash)
1163{
1164 /* Init pointers to the fail-safe state to distinguish them later from legit values. */
1165 flash->virtual_memory = (chipaddr)ERROR_PTR;
1166 flash->virtual_registers = (chipaddr)ERROR_PTR;
1167
1168 /* FIXME: This avoids mapping (and unmapping) of flash chip definitions with size 0.
1169 * These are used for various probing-related hacks that would not map successfully anyway and should be
1170 * removed ASAP. */
1171 if (flash->chip->total_size == 0)
1172 return 0;
1173
1174 const chipsize_t size = flash->chip->total_size * 1024;
1175 uintptr_t base = flashbase ? flashbase : (0xffffffff - size + 1);
1176 void *addr = programmer_map_flash_region(flash->chip->name, base, size);
1177 if (addr == ERROR_PTR) {
1178 msg_perr("Could not map flash chip %s at 0x%0*" PRIxPTR ".\n",
1179 flash->chip->name, PRIxPTR_WIDTH, base);
1180 return 1;
1181 }
1182 flash->physical_memory = base;
1183 flash->virtual_memory = (chipaddr)addr;
1184
1185 /* FIXME: Special function registers normally live 4 MByte below flash space, but it might be somewhere
1186 * completely different on some chips and programmers, or not mappable at all.
1187 * Ignore these problems for now and always report success. */
1188 if (flash->chip->feature_bits & FEATURE_REGISTERMAP) {
1189 base = 0xffffffff - size - 0x400000 + 1;
1190 addr = programmer_map_flash_region("flash chip registers", base, size);
1191 if (addr == ERROR_PTR) {
1192 msg_pdbg2("Could not map flash chip registers %s at 0x%0*" PRIxPTR ".\n",
1193 flash->chip->name, PRIxPTR_WIDTH, base);
1194 return 0;
1195 }
1196 flash->physical_registers = base;
1197 flash->virtual_registers = (chipaddr)addr;
1198 }
1199 return 0;
1200}
1201
Nico Huber2d625722016-05-03 10:48:02 +02001202/*
1203 * Return a string corresponding to the bustype parameter.
1204 * Memory is obtained with malloc() and must be freed with free() by the caller.
1205 */
1206char *flashbuses_to_text(enum chipbustype bustype)
1207{
1208 char *ret = calloc(1, 1);
1209 /*
1210 * FIXME: Once all chipsets and flash chips have been updated, NONSPI
1211 * will cease to exist and should be eliminated here as well.
1212 */
1213 if (bustype == BUS_NONSPI) {
1214 ret = strcat_realloc(ret, "Non-SPI, ");
1215 } else {
1216 if (bustype & BUS_PARALLEL)
1217 ret = strcat_realloc(ret, "Parallel, ");
1218 if (bustype & BUS_LPC)
1219 ret = strcat_realloc(ret, "LPC, ");
1220 if (bustype & BUS_FWH)
1221 ret = strcat_realloc(ret, "FWH, ");
1222 if (bustype & BUS_SPI)
1223 ret = strcat_realloc(ret, "SPI, ");
1224 if (bustype & BUS_PROG)
1225 ret = strcat_realloc(ret, "Programmer-specific, ");
1226 if (bustype == BUS_NONE)
1227 ret = strcat_realloc(ret, "None, ");
1228 }
1229 /* Kill last comma. */
1230 ret[strlen(ret) - 2] = '\0';
1231 ret = realloc(ret, strlen(ret) + 1);
1232 return ret;
1233}
1234
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +00001235int probe_flash(struct registered_master *mst, int startchip, struct flashctx *flash, int force)
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001236{
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001237 const struct flashchip *chip;
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001238 enum chipbustype buses_common;
Carl-Daniel Hailfingerb22918c2009-06-01 02:08:58 +00001239 char *tmp;
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001240
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001241 for (chip = flashchips + startchip; chip && chip->name; chip++) {
1242 if (chip_to_probe && strcmp(chip->name, chip_to_probe) != 0)
Ollie Lhocbbf1252004-03-17 22:22:08 +00001243 continue;
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +00001244 buses_common = mst->buses_supported & chip->bustype;
Carl-Daniel Hailfingerc40cff72011-12-20 00:19:29 +00001245 if (!buses_common)
Carl-Daniel Hailfinger6573b742011-06-17 22:38:53 +00001246 continue;
Mike Banon31b5e3b2018-01-15 01:10:00 +03001247 /* Only probe for SPI25 chips by default. */
1248 if (chip->bustype == BUS_SPI && !chip_to_probe && chip->spi_cmd_set != SPI25)
1249 continue;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001250 msg_gdbg("Probing for %s %s, %d kB: ", chip->vendor, chip->name, chip->total_size);
1251 if (!chip->probe && !force) {
1252 msg_gdbg("failed! flashrom has no probe function for this flash chip.\n");
Carl-Daniel Hailfingerb22918c2009-06-01 02:08:58 +00001253 continue;
1254 }
Stefan Reinauer70385642007-04-06 11:58:03 +00001255
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001256 /* Start filling in the dynamic data. */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001257 flash->chip = calloc(1, sizeof(struct flashchip));
1258 if (!flash->chip) {
1259 msg_gerr("Out of memory!\n");
1260 exit(1);
1261 }
1262 memcpy(flash->chip, chip, sizeof(struct flashchip));
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +00001263 flash->mst = mst;
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001264
Stefan Tauner4e32ec12014-08-30 23:39:51 +00001265 if (map_flash(flash) != 0)
Martin Schiller57a3b732017-11-23 06:24:57 +01001266 goto notfound;
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001267
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001268 /* We handle a forced match like a real match, we just avoid probing. Note that probe_flash()
1269 * is only called with force=1 after normal probing failed.
1270 */
Peter Stuge27c3e2d2008-07-02 17:15:47 +00001271 if (force)
1272 break;
Stefan Reinauerfcb63682006-03-16 16:57:41 +00001273
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001274 if (flash->chip->probe(flash) != 1)
Peter Stuge483b8f02008-09-03 23:10:05 +00001275 goto notfound;
1276
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001277 /* If this is the first chip found, accept it.
1278 * If this is not the first chip found, accept it only if it is
Stefan Taunerac1b4c82012-02-17 14:51:04 +00001279 * a non-generic match. SFDP and CFI are generic matches.
1280 * startchip==0 means this call to probe_flash() is the first
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +00001281 * one for this programmer interface (master) and thus no other chip has
Stefan Taunerac1b4c82012-02-17 14:51:04 +00001282 * been found on this interface.
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001283 */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001284 if (startchip == 0 && flash->chip->model_id == SFDP_DEVICE_ID) {
Stefan Taunerac1b4c82012-02-17 14:51:04 +00001285 msg_cinfo("===\n"
1286 "SFDP has autodetected a flash chip which is "
1287 "not natively supported by flashrom yet.\n");
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001288 if (count_usable_erasers(flash) == 0)
Stefan Taunerac1b4c82012-02-17 14:51:04 +00001289 msg_cinfo("The standard operations read and "
1290 "verify should work, but to support "
1291 "erase, write and all other "
1292 "possible features");
1293 else
1294 msg_cinfo("All standard operations (read, "
1295 "verify, erase and write) should "
1296 "work, but to support all possible "
1297 "features");
1298
Stefan Taunerb4e06bd2012-08-20 00:24:22 +00001299 msg_cinfo(" we need to add them manually.\n"
1300 "You can help us by mailing us the output of the following command to "
1301 "flashrom@flashrom.org:\n"
1302 "'flashrom -VV [plus the -p/--programmer parameter]'\n"
1303 "Thanks for your help!\n"
Stefan Taunerac1b4c82012-02-17 14:51:04 +00001304 "===\n");
1305 }
1306
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001307 /* First flash chip detected on this bus. */
1308 if (startchip == 0)
Peter Stuge27c3e2d2008-07-02 17:15:47 +00001309 break;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001310 /* Not the first flash chip detected on this bus, but not a generic match either. */
1311 if ((flash->chip->model_id != GENERIC_DEVICE_ID) && (flash->chip->model_id != SFDP_DEVICE_ID))
1312 break;
1313 /* 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 +00001314notfound:
Stefan Tauner4e32ec12014-08-30 23:39:51 +00001315 unmap_flash(flash);
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001316 free(flash->chip);
1317 flash->chip = NULL;
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001318 }
Uwe Hermannffec5f32007-08-23 16:08:21 +00001319
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001320 if (!flash->chip)
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001321 return -1;
Peter Stuge27c3e2d2008-07-02 17:15:47 +00001322
Nico Huber7af0e792016-04-29 16:40:15 +02001323 /* Fill fallback layout covering the whole chip. */
1324 struct single_layout *const fallback = &flash->fallback_layout;
1325 fallback->base.entries = &fallback->entry;
1326 fallback->base.num_entries = 1;
1327 fallback->entry.start = 0;
1328 fallback->entry.end = flash->chip->total_size * 1024 - 1;
1329 fallback->entry.included = true;
1330 strcpy(fallback->entry.name, "complete flash");
Stefan Reinauer051e2362011-01-19 06:21:54 +00001331
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001332 tmp = flashbuses_to_text(flash->chip->bustype);
Stefan Tauner4e32ec12014-08-30 23:39:51 +00001333 msg_cinfo("%s %s flash chip \"%s\" (%d kB, %s) ", force ? "Assuming" : "Found",
1334 flash->chip->vendor, flash->chip->name, flash->chip->total_size, tmp);
Stefan Tauner00155492011-06-26 20:45:35 +00001335 free(tmp);
Stefan Tauner4e32ec12014-08-30 23:39:51 +00001336#if CONFIG_INTERNAL == 1
1337 if (programmer_table[programmer].map_flash_region == physmap)
1338 msg_cinfo("mapped at physical address 0x%0*" PRIxPTR ".\n",
1339 PRIxPTR_WIDTH, flash->physical_memory);
1340 else
1341#endif
1342 msg_cinfo("on %s.\n", programmer_table[programmer].name);
Uwe Hermann9899cad2009-06-28 21:47:57 +00001343
Stefan Tauner4e32ec12014-08-30 23:39:51 +00001344 /* Flash registers may more likely not be mapped if the chip was forced.
1345 * Lock info may be stored in registers, so avoid lock info printing. */
Carl-Daniel Hailfinger859f3f02010-12-02 21:59:42 +00001346 if (!force)
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001347 if (flash->chip->printlock)
1348 flash->chip->printlock(flash);
Sean Nelson6e0b9122010-02-19 00:52:10 +00001349
Stefan Tauner4e32ec12014-08-30 23:39:51 +00001350 /* Get out of the way for later runs. */
1351 unmap_flash(flash);
1352
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001353 /* Return position of matching chip. */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001354 return chip - flashchips;
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001355}
1356
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001357int read_buf_from_file(unsigned char *buf, unsigned long size,
1358 const char *filename)
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001359{
Nico Huber7562f7d2013-08-30 21:29:45 +00001360#ifdef __LIBPAYLOAD__
1361 msg_gerr("Error: No file I/O support in libpayload\n");
1362 return 1;
1363#else
Stefan Tauner16687702015-12-25 21:59:45 +00001364 int ret = 0;
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001365
Stefan Tauner16687702015-12-25 21:59:45 +00001366 FILE *image;
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001367 if ((image = fopen(filename, "rb")) == NULL) {
Stefan Tauner363fd7e2013-04-07 13:08:30 +00001368 msg_gerr("Error: opening file \"%s\" failed: %s\n", filename, strerror(errno));
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001369 return 1;
1370 }
Stefan Tauner16687702015-12-25 21:59:45 +00001371
1372 struct stat image_stat;
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001373 if (fstat(fileno(image), &image_stat) != 0) {
Stefan Tauner363fd7e2013-04-07 13:08:30 +00001374 msg_gerr("Error: getting metadata of file \"%s\" failed: %s\n", filename, strerror(errno));
Stefan Tauner16687702015-12-25 21:59:45 +00001375 ret = 1;
1376 goto out;
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001377 }
1378 if (image_stat.st_size != size) {
Carl-Daniel Hailfinger11990da2013-07-13 23:21:05 +00001379 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 +00001380 (intmax_t)image_stat.st_size, size);
Stefan Tauner16687702015-12-25 21:59:45 +00001381 ret = 1;
1382 goto out;
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001383 }
Stefan Tauner16687702015-12-25 21:59:45 +00001384
1385 unsigned long numbytes = fread(buf, 1, size, image);
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001386 if (numbytes != size) {
1387 msg_gerr("Error: Failed to read complete file. Got %ld bytes, "
1388 "wanted %ld!\n", numbytes, size);
Stefan Tauner16687702015-12-25 21:59:45 +00001389 ret = 1;
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001390 }
Stefan Tauner16687702015-12-25 21:59:45 +00001391out:
1392 (void)fclose(image);
1393 return ret;
Nico Huber7562f7d2013-08-30 21:29:45 +00001394#endif
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001395}
1396
Mark Marshallf20b7be2014-05-09 21:16:21 +00001397int write_buf_to_file(const unsigned char *buf, unsigned long size, const char *filename)
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001398{
Nico Huber7562f7d2013-08-30 21:29:45 +00001399#ifdef __LIBPAYLOAD__
1400 msg_gerr("Error: No file I/O support in libpayload\n");
1401 return 1;
1402#else
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001403 FILE *image;
Stefan Tauner16687702015-12-25 21:59:45 +00001404 int ret = 0;
Stephan Guilloux21dd55b2009-06-01 22:07:52 +00001405
1406 if (!filename) {
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001407 msg_gerr("No filename specified.\n");
Stephan Guilloux21dd55b2009-06-01 22:07:52 +00001408 return 1;
1409 }
Patrick Georgi0bf842d2010-01-25 22:55:33 +00001410 if ((image = fopen(filename, "wb")) == NULL) {
Stefan Tauner363fd7e2013-04-07 13:08:30 +00001411 msg_gerr("Error: opening file \"%s\" failed: %s\n", filename, strerror(errno));
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00001412 return 1;
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001413 }
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001414
Stefan Tauner16687702015-12-25 21:59:45 +00001415 unsigned long numbytes = fwrite(buf, 1, size, image);
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001416 if (numbytes != size) {
Stefan Tauner16687702015-12-25 21:59:45 +00001417 msg_gerr("Error: file %s could not be written completely.\n", filename);
1418 ret = 1;
1419 goto out;
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001420 }
Stefan Tauner16687702015-12-25 21:59:45 +00001421 if (fflush(image)) {
1422 msg_gerr("Error: flushing file \"%s\" failed: %s\n", filename, strerror(errno));
1423 ret = 1;
1424 }
1425 // Try to fsync() only regular files and if that function is available at all (e.g. not on MinGW).
1426#if defined(_POSIX_FSYNC) && (_POSIX_FSYNC != -1)
1427 struct stat image_stat;
1428 if (fstat(fileno(image), &image_stat) != 0) {
1429 msg_gerr("Error: getting metadata of file \"%s\" failed: %s\n", filename, strerror(errno));
1430 ret = 1;
1431 goto out;
1432 }
1433 if (S_ISREG(image_stat.st_mode)) {
1434 if (fsync(fileno(image))) {
1435 msg_gerr("Error: fsyncing file \"%s\" failed: %s\n", filename, strerror(errno));
1436 ret = 1;
1437 }
1438 }
1439#endif
1440out:
1441 if (fclose(image)) {
1442 msg_gerr("Error: closing file \"%s\" failed: %s\n", filename, strerror(errno));
1443 ret = 1;
1444 }
1445 return ret;
Nico Huber7562f7d2013-08-30 21:29:45 +00001446#endif
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001447}
1448
Nico Huber899e4ec2016-04-29 18:39:01 +02001449static int read_by_layout(struct flashctx *, uint8_t *);
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001450int read_flash_to_file(struct flashctx *flash, const char *filename)
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001451{
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001452 unsigned long size = flash->chip->total_size * 1024;
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001453 unsigned char *buf = calloc(size, sizeof(char));
1454 int ret = 0;
1455
1456 msg_cinfo("Reading flash... ");
1457 if (!buf) {
1458 msg_gerr("Memory allocation failed!\n");
1459 msg_cinfo("FAILED.\n");
1460 return 1;
1461 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001462 if (!flash->chip->read) {
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001463 msg_cerr("No read function available for this flash chip.\n");
1464 ret = 1;
1465 goto out_free;
1466 }
Nico Huber899e4ec2016-04-29 18:39:01 +02001467 if (read_by_layout(flash, buf)) {
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001468 msg_cerr("Read operation failed!\n");
1469 ret = 1;
1470 goto out_free;
1471 }
1472
Stefan Tauner355cbfd2011-05-28 02:37:14 +00001473 ret = write_buf_to_file(buf, size, filename);
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001474out_free:
1475 free(buf);
1476 msg_cinfo("%s.\n", ret ? "FAILED" : "done");
1477 return ret;
1478}
1479
Stefan Tauner96658be2014-05-26 22:05:31 +00001480/* Even if an error is found, the function will keep going and check the rest. */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001481static int selfcheck_eraseblocks(const struct flashchip *chip)
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001482{
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +00001483 int i, j, k;
1484 int ret = 0;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001485
1486 for (k = 0; k < NUM_ERASEFUNCTIONS; k++) {
1487 unsigned int done = 0;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001488 struct block_eraser eraser = chip->block_erasers[k];
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001489
1490 for (i = 0; i < NUM_ERASEREGIONS; i++) {
1491 /* Blocks with zero size are bugs in flashchips.c. */
1492 if (eraser.eraseblocks[i].count &&
1493 !eraser.eraseblocks[i].size) {
1494 msg_gerr("ERROR: Flash chip %s erase function "
1495 "%i region %i has size 0. Please report"
1496 " a bug at flashrom@flashrom.org\n",
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001497 chip->name, k, i);
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001498 ret = 1;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001499 }
1500 /* Blocks with zero count are bugs in flashchips.c. */
1501 if (!eraser.eraseblocks[i].count &&
1502 eraser.eraseblocks[i].size) {
1503 msg_gerr("ERROR: Flash chip %s erase function "
1504 "%i region %i has count 0. Please report"
1505 " a bug at flashrom@flashrom.org\n",
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001506 chip->name, k, i);
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001507 ret = 1;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001508 }
1509 done += eraser.eraseblocks[i].count *
1510 eraser.eraseblocks[i].size;
1511 }
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001512 /* Empty eraseblock definition with erase function. */
1513 if (!done && eraser.block_erase)
Sean Nelson316a29f2010-05-07 20:09:04 +00001514 msg_gspew("Strange: Empty eraseblock definition with "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001515 "non-empty erase function. Not an error.\n");
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001516 if (!done)
1517 continue;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001518 if (done != chip->total_size * 1024) {
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001519 msg_gerr("ERROR: Flash chip %s erase function %i "
1520 "region walking resulted in 0x%06x bytes total,"
1521 " expected 0x%06x bytes. Please report a bug at"
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001522 " flashrom@flashrom.org\n", chip->name, k,
1523 done, chip->total_size * 1024);
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001524 ret = 1;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001525 }
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001526 if (!eraser.block_erase)
1527 continue;
1528 /* Check if there are identical erase functions for different
1529 * layouts. That would imply "magic" erase functions. The
1530 * easiest way to check this is with function pointers.
1531 */
Uwe Hermann43959702010-03-13 17:28:29 +00001532 for (j = k + 1; j < NUM_ERASEFUNCTIONS; j++) {
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001533 if (eraser.block_erase ==
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001534 chip->block_erasers[j].block_erase) {
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001535 msg_gerr("ERROR: Flash chip %s erase function "
1536 "%i and %i are identical. Please report"
1537 " a bug at flashrom@flashrom.org\n",
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001538 chip->name, k, j);
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001539 ret = 1;
1540 }
Uwe Hermann43959702010-03-13 17:28:29 +00001541 }
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001542 }
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001543 return ret;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001544}
1545
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001546static int check_block_eraser(const struct flashctx *flash, int k, int log)
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001547{
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001548 struct block_eraser eraser = flash->chip->block_erasers[k];
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001549
1550 if (!eraser.block_erase && !eraser.eraseblocks[0].count) {
1551 if (log)
1552 msg_cdbg("not defined. ");
1553 return 1;
1554 }
1555 if (!eraser.block_erase && eraser.eraseblocks[0].count) {
1556 if (log)
1557 msg_cdbg("eraseblock layout is known, but matching "
Stefan Tauner355cbfd2011-05-28 02:37:14 +00001558 "block erase function is not implemented. ");
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001559 return 1;
1560 }
1561 if (eraser.block_erase && !eraser.eraseblocks[0].count) {
1562 if (log)
1563 msg_cdbg("block erase function found, but "
Stefan Tauner355cbfd2011-05-28 02:37:14 +00001564 "eraseblock layout is not defined. ");
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001565 return 1;
1566 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001567 // TODO: Once erase functions are annotated with allowed buses, check that as well.
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001568 return 0;
1569}
1570
Nico Huber7af0e792016-04-29 16:40:15 +02001571/**
1572 * @brief Reads the included layout regions into a buffer.
1573 *
1574 * If there is no layout set in the given flash context, the whole chip will
1575 * be read.
1576 *
1577 * @param flashctx Flash context to be used.
1578 * @param buffer Buffer of full chip size to read into.
1579 * @return 0 on success,
1580 * 1 if any read fails.
1581 */
1582static int read_by_layout(struct flashctx *const flashctx, uint8_t *const buffer)
1583{
1584 const struct flashrom_layout *const layout = get_layout(flashctx);
1585
1586 size_t i;
1587 for (i = 0; i < layout->num_entries; ++i) {
1588 if (!layout->entries[i].included)
1589 continue;
1590
1591 const chipoff_t region_start = layout->entries[i].start;
1592 const chipsize_t region_len = layout->entries[i].end - layout->entries[i].start + 1;
1593
1594 if (flashctx->chip->read(flashctx, buffer + region_start, region_start, region_len))
1595 return 1;
1596 }
1597 return 0;
1598}
1599
1600typedef int (*erasefn_t)(struct flashctx *, unsigned int addr, unsigned int len);
1601/**
1602 * @private
1603 *
1604 * For read-erase-write, `curcontents` and `newcontents` shall point
1605 * to buffers of the chip's size. Both are supposed to be prefilled
1606 * with at least the included layout regions of the current flash
1607 * contents (`curcontents`) and the data to be written to the flash
1608 * (`newcontents`).
1609 *
1610 * For erase, `curcontents` and `newcontents` shall be NULL-pointers.
1611 *
1612 * The `chipoff_t` values are used internally by `walk_by_layout()`.
1613 */
1614struct walk_info {
1615 uint8_t *curcontents;
1616 const uint8_t *newcontents;
1617 chipoff_t region_start;
1618 chipoff_t region_end;
1619 chipoff_t erase_start;
1620 chipoff_t erase_end;
1621};
1622/* returns 0 on success, 1 to retry with another erase function, 2 for immediate abort */
1623typedef int (*per_blockfn_t)(struct flashctx *, const struct walk_info *, erasefn_t);
1624
1625static int walk_eraseblocks(struct flashctx *const flashctx,
1626 struct walk_info *const info,
1627 const size_t erasefunction, const per_blockfn_t per_blockfn)
1628{
1629 int ret;
1630 size_t i, j;
1631 bool first = true;
1632 struct block_eraser *const eraser = &flashctx->chip->block_erasers[erasefunction];
1633
1634 info->erase_start = 0;
1635 for (i = 0; i < NUM_ERASEREGIONS; ++i) {
1636 /* count==0 for all automatically initialized array
1637 members so the loop below won't be executed for them. */
1638 for (j = 0; j < eraser->eraseblocks[i].count; ++j, info->erase_start = info->erase_end + 1) {
1639 info->erase_end = info->erase_start + eraser->eraseblocks[i].size - 1;
1640
1641 /* Skip any eraseblock that is completely outside the current region. */
1642 if (info->erase_end < info->region_start)
1643 continue;
1644 if (info->region_end < info->erase_start)
1645 break;
1646
1647 /* Print this for every block except the first one. */
1648 if (first)
1649 first = false;
1650 else
1651 msg_cdbg(", ");
1652 msg_cdbg("0x%06x-0x%06x:", info->erase_start, info->erase_end);
1653
1654 ret = per_blockfn(flashctx, info, eraser->block_erase);
1655 if (ret)
1656 return ret;
1657 }
1658 if (info->region_end < info->erase_start)
1659 break;
1660 }
1661 msg_cdbg("\n");
1662 return 0;
1663}
1664
1665static int walk_by_layout(struct flashctx *const flashctx, struct walk_info *const info,
1666 const per_blockfn_t per_blockfn)
1667{
1668 const struct flashrom_layout *const layout = get_layout(flashctx);
1669
1670 all_skipped = true;
1671 msg_cinfo("Erasing and writing flash chip... ");
1672
1673 size_t i;
1674 for (i = 0; i < layout->num_entries; ++i) {
1675 if (!layout->entries[i].included)
1676 continue;
1677
1678 info->region_start = layout->entries[i].start;
1679 info->region_end = layout->entries[i].end;
1680
1681 size_t j;
1682 int error = 1; /* retry as long as it's 1 */
1683 for (j = 0; j < NUM_ERASEFUNCTIONS; ++j) {
1684 if (j != 0)
1685 msg_cinfo("Looking for another erase function.\n");
1686 msg_cdbg("Trying erase function %zi... ", j);
1687 if (check_block_eraser(flashctx, j, 1))
1688 continue;
1689
1690 error = walk_eraseblocks(flashctx, info, j, per_blockfn);
1691 if (error != 1)
1692 break;
1693
1694 if (info->curcontents) {
1695 msg_cinfo("Reading current flash chip contents... ");
1696 if (read_by_layout(flashctx, info->curcontents)) {
1697 /* Now we are truly screwed. Read failed as well. */
1698 msg_cerr("Can't read anymore! Aborting.\n");
1699 /* We have no idea about the flash chip contents, so
1700 retrying with another erase function is pointless. */
1701 error = 2;
1702 break;
1703 }
1704 msg_cinfo("done. ");
1705 }
1706 }
1707 if (error == 1)
1708 msg_cinfo("No usable erase functions left.\n");
1709 if (error) {
1710 msg_cerr("FAILED!\n");
1711 return 1;
1712 }
1713 }
1714 if (all_skipped)
1715 msg_cinfo("\nWarning: Chip content is identical to the requested image.\n");
1716 msg_cinfo("Erase/write done.\n");
1717 return 0;
1718}
1719
1720static int erase_block(struct flashctx *const flashctx,
1721 const struct walk_info *const info, const erasefn_t erasefn)
1722{
1723 const unsigned int erase_len = info->erase_end + 1 - info->erase_start;
1724
1725 all_skipped = false;
1726
1727 msg_cdbg("E");
1728 if (erasefn(flashctx, info->erase_start, erase_len))
1729 return 1;
1730 if (check_erased_range(flashctx, info->erase_start, erase_len)) {
1731 msg_cerr("ERASE FAILED!\n");
1732 return 1;
1733 }
1734 return 0;
1735}
1736
1737/**
1738 * @brief Erases the included layout regions.
1739 *
1740 * If there is no layout set in the given flash context, the whole chip will
1741 * be erased.
1742 *
1743 * @param flashctx Flash context to be used.
1744 * @param buffer Buffer of full chip size to read into.
1745 * @return 0 on success,
1746 * 1 if all available erase functions failed.
1747 */
Nico Huber454f6132012-12-10 13:34:10 +00001748static int erase_by_layout(struct flashctx *const flashctx)
Nico Huber7af0e792016-04-29 16:40:15 +02001749{
1750 struct walk_info info = { 0 };
1751 return walk_by_layout(flashctx, &info, &erase_block);
1752}
1753
1754static int read_erase_write_block(struct flashctx *const flashctx,
1755 const struct walk_info *const info, const erasefn_t erasefn)
1756{
1757 const chipsize_t erase_len = info->erase_end + 1 - info->erase_start;
1758 const bool region_unaligned = info->region_start > info->erase_start ||
1759 info->erase_end > info->region_end;
1760 const uint8_t *newcontents = NULL;
1761 int ret = 2;
1762
1763 /*
1764 * If the region is not erase-block aligned, merge current flash con-
1765 * tents into `info->curcontents` and a new buffer `newc`. The former
1766 * is necessary since we have no guarantee that the full erase block
1767 * was already read into `info->curcontents`. For the latter a new
1768 * buffer is used since `info->newcontents` might contain data for
1769 * other unaligned regions that touch this erase block too.
1770 */
1771 if (region_unaligned) {
1772 msg_cdbg("R");
1773 uint8_t *const newc = malloc(erase_len);
1774 if (!newc) {
1775 msg_cerr("Out of memory!\n");
1776 return 1;
1777 }
1778 memcpy(newc, info->newcontents + info->erase_start, erase_len);
1779
1780 /* Merge data preceding the current region. */
1781 if (info->region_start > info->erase_start) {
1782 const chipoff_t start = info->erase_start;
1783 const chipsize_t len = info->region_start - info->erase_start;
1784 if (flashctx->chip->read(flashctx, newc, start, len)) {
1785 msg_cerr("Can't read! Aborting.\n");
1786 goto _free_ret;
1787 }
1788 memcpy(info->curcontents + start, newc, len);
1789 }
1790 /* Merge data following the current region. */
1791 if (info->erase_end > info->region_end) {
1792 const chipoff_t start = info->region_end + 1;
1793 const chipoff_t rel_start = start - info->erase_start; /* within this erase block */
1794 const chipsize_t len = info->erase_end - info->region_end;
1795 if (flashctx->chip->read(flashctx, newc + rel_start, start, len)) {
1796 msg_cerr("Can't read! Aborting.\n");
1797 goto _free_ret;
1798 }
1799 memcpy(info->curcontents + start, newc + rel_start, len);
1800 }
1801
1802 newcontents = newc;
1803 } else {
1804 newcontents = info->newcontents + info->erase_start;
1805 }
1806
1807 ret = 1;
1808 bool skipped = true;
1809 uint8_t *const curcontents = info->curcontents + info->erase_start;
Paul Kocialkowski995f7552018-01-15 01:06:09 +03001810 const uint8_t erased_value = ERASED_VALUE(flashctx);
David Hendricksf9a30552015-05-23 20:30:30 -07001811 if (!(flashctx->chip->feature_bits & FEATURE_NO_ERASE) &&
1812 need_erase(curcontents, newcontents, erase_len, flashctx->chip->gran, erased_value)) {
Nico Huber7af0e792016-04-29 16:40:15 +02001813 if (erase_block(flashctx, info, erasefn))
1814 goto _free_ret;
1815 /* Erase was successful. Adjust curcontents. */
Paul Kocialkowski995f7552018-01-15 01:06:09 +03001816 memset(curcontents, erased_value, erase_len);
Nico Huber7af0e792016-04-29 16:40:15 +02001817 skipped = false;
1818 }
1819
1820 unsigned int starthere = 0, lenhere = 0, writecount = 0;
1821 /* get_next_write() sets starthere to a new value after the call. */
1822 while ((lenhere = get_next_write(curcontents + starthere, newcontents + starthere,
1823 erase_len - starthere, &starthere, flashctx->chip->gran))) {
1824 if (!writecount++)
1825 msg_cdbg("W");
1826 /* Needs the partial write function signature. */
1827 if (flashctx->chip->write(flashctx, newcontents + starthere,
1828 info->erase_start + starthere, lenhere))
1829 goto _free_ret;
1830 starthere += lenhere;
1831 skipped = false;
1832 }
1833 if (skipped)
1834 msg_cdbg("S");
1835 else
1836 all_skipped = false;
1837
1838 /* Update curcontents, other regions with overlapping erase blocks
1839 might rely on this. */
1840 memcpy(curcontents, newcontents, erase_len);
1841 ret = 0;
1842
1843_free_ret:
1844 if (region_unaligned)
1845 free((void *)newcontents);
1846 return ret;
1847}
1848
1849/**
1850 * @brief Writes the included layout regions from a given image.
1851 *
1852 * If there is no layout set in the given flash context, the whole image
1853 * will be written.
1854 *
1855 * @param flashctx Flash context to be used.
1856 * @param curcontents A buffer of full chip size with current chip contents of included regions.
1857 * @param newcontents The new image to be written.
1858 * @return 0 on success,
1859 * 1 if anything has gone wrong.
1860 */
Nico Huber454f6132012-12-10 13:34:10 +00001861static int write_by_layout(struct flashctx *const flashctx,
1862 void *const curcontents, const void *const newcontents)
Nico Huber7af0e792016-04-29 16:40:15 +02001863{
1864 struct walk_info info;
1865 info.curcontents = curcontents;
1866 info.newcontents = newcontents;
1867 return walk_by_layout(flashctx, &info, read_erase_write_block);
1868}
1869
1870/**
1871 * @brief Compares the included layout regions with content from a buffer.
1872 *
1873 * If there is no layout set in the given flash context, the whole chip's
1874 * contents will be compared.
1875 *
1876 * @param flashctx Flash context to be used.
1877 * @param curcontents A buffer of full chip size to read current chip contents into.
1878 * @param newcontents The new image to compare to.
1879 * @return 0 on success,
1880 * 1 if reading failed,
1881 * 3 if the contents don't match.
1882 */
Nico Huber454f6132012-12-10 13:34:10 +00001883static int verify_by_layout(struct flashctx *const flashctx,
1884 void *const curcontents, const uint8_t *const newcontents)
Nico Huber7af0e792016-04-29 16:40:15 +02001885{
1886 const struct flashrom_layout *const layout = get_layout(flashctx);
1887
1888 size_t i;
1889 for (i = 0; i < layout->num_entries; ++i) {
1890 if (!layout->entries[i].included)
1891 continue;
1892
1893 const chipoff_t region_start = layout->entries[i].start;
1894 const chipsize_t region_len = layout->entries[i].end - layout->entries[i].start + 1;
1895
1896 if (flashctx->chip->read(flashctx, curcontents + region_start, region_start, region_len))
1897 return 1;
1898 if (compare_range(newcontents + region_start, curcontents + region_start,
1899 region_start, region_len))
1900 return 3;
1901 }
1902 return 0;
1903}
1904
Stefan Tauner136388f2013-07-15 10:47:53 +00001905static void nonfatal_help_message(void)
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001906{
Stefan Taunera58f6e92014-05-10 09:25:44 +00001907 msg_gerr("Good, writing to the flash chip apparently didn't do anything.\n");
Stefan Tauner136388f2013-07-15 10:47:53 +00001908#if CONFIG_INTERNAL == 1
1909 if (programmer == PROGRAMMER_INTERNAL)
1910 msg_gerr("This means we have to add special support for your board, programmer or flash\n"
1911 "chip. Please report this on IRC at chat.freenode.net (channel #flashrom) or\n"
1912 "mail flashrom@flashrom.org, thanks!\n"
1913 "-------------------------------------------------------------------------------\n"
1914 "You may now reboot or simply leave the machine running.\n");
1915 else
1916#endif
1917 msg_gerr("Please check the connections (especially those to write protection pins) between\n"
1918 "the programmer and the flash chip. If you think the error is caused by flashrom\n"
1919 "please report this on IRC at chat.freenode.net (channel #flashrom) or\n"
1920 "mail flashrom@flashrom.org, thanks!\n");
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001921}
1922
Stefan Tauner136388f2013-07-15 10:47:53 +00001923static void emergency_help_message(void)
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00001924{
Stefan Tauner136388f2013-07-15 10:47:53 +00001925 msg_gerr("Your flash chip is in an unknown state.\n");
1926#if CONFIG_INTERNAL == 1
1927 if (programmer == PROGRAMMER_INTERNAL)
1928 msg_gerr("Get help on IRC at chat.freenode.net (channel #flashrom) or\n"
1929 "mail flashrom@flashrom.org with the subject \"FAILED: <your board name>\"!\n"
1930 "-------------------------------------------------------------------------------\n"
1931 "DO NOT REBOOT OR POWEROFF!\n");
1932 else
1933#endif
1934 msg_gerr("Please report this on IRC at chat.freenode.net (channel #flashrom) or\n"
1935 "mail flashrom@flashrom.org, thanks!\n");
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00001936}
1937
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001938/* The way to go if you want a delimited list of programmers */
Stefan Tauner66652442011-06-26 17:38:17 +00001939void list_programmers(const char *delim)
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001940{
1941 enum programmer p;
1942 for (p = 0; p < PROGRAMMER_INVALID; p++) {
Sean Nelson316a29f2010-05-07 20:09:04 +00001943 msg_ginfo("%s", programmer_table[p].name);
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001944 if (p < PROGRAMMER_INVALID - 1)
Sean Nelson316a29f2010-05-07 20:09:04 +00001945 msg_ginfo("%s", delim);
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001946 }
Stefan Tauner23e10b82016-01-23 16:16:49 +00001947 msg_ginfo("\n");
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001948}
1949
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001950void list_programmers_linebreak(int startcol, int cols, int paren)
1951{
1952 const char *pname;
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +00001953 int pnamelen;
1954 int remaining = 0, firstline = 1;
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001955 enum programmer p;
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +00001956 int i;
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001957
1958 for (p = 0; p < PROGRAMMER_INVALID; p++) {
1959 pname = programmer_table[p].name;
1960 pnamelen = strlen(pname);
1961 if (remaining - pnamelen - 2 < 0) {
1962 if (firstline)
1963 firstline = 0;
1964 else
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001965 msg_ginfo("\n");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001966 for (i = 0; i < startcol; i++)
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001967 msg_ginfo(" ");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001968 remaining = cols - startcol;
1969 } else {
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001970 msg_ginfo(" ");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001971 remaining--;
1972 }
1973 if (paren && (p == 0)) {
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001974 msg_ginfo("(");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001975 remaining--;
1976 }
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001977 msg_ginfo("%s", pname);
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001978 remaining -= pnamelen;
1979 if (p < PROGRAMMER_INVALID - 1) {
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001980 msg_ginfo(",");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001981 remaining--;
1982 } else {
1983 if (paren)
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001984 msg_ginfo(")");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001985 }
1986 }
1987}
1988
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001989void print_sysinfo(void)
1990{
Stefan Taunerb0eee9b2015-01-10 09:32:50 +00001991#if IS_WINDOWS
Carl-Daniel Hailfinger60d9bd22012-08-09 23:34:41 +00001992 SYSTEM_INFO si;
1993 OSVERSIONINFOEX osvi;
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001994
Carl-Daniel Hailfinger60d9bd22012-08-09 23:34:41 +00001995 memset(&si, 0, sizeof(SYSTEM_INFO));
1996 memset(&osvi, 0, sizeof(OSVERSIONINFOEX));
1997 msg_ginfo(" on Windows");
1998 /* Tell Windows which version of the structure we want. */
1999 osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
2000 if (GetVersionEx((OSVERSIONINFO*) &osvi))
2001 msg_ginfo(" %lu.%lu", osvi.dwMajorVersion, osvi.dwMinorVersion);
2002 else
2003 msg_ginfo(" unknown version");
2004 GetSystemInfo(&si);
2005 switch (si.wProcessorArchitecture) {
2006 case PROCESSOR_ARCHITECTURE_AMD64:
2007 msg_ginfo(" (x86_64)");
2008 break;
2009 case PROCESSOR_ARCHITECTURE_INTEL:
2010 msg_ginfo(" (x86)");
2011 break;
2012 default:
2013 msg_ginfo(" (unknown arch)");
2014 break;
2015 }
2016#elif HAVE_UTSNAME == 1
2017 struct utsname osinfo;
2018
2019 uname(&osinfo);
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00002020 msg_ginfo(" on %s %s (%s)", osinfo.sysname, osinfo.release,
2021 osinfo.machine);
2022#else
2023 msg_ginfo(" on unknown machine");
2024#endif
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00002025}
2026
2027void print_buildinfo(void)
2028{
2029 msg_gdbg("flashrom was built with");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00002030#if NEED_PCI == 1
2031#ifdef PCILIB_VERSION
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00002032 msg_gdbg(" libpci %s,", PCILIB_VERSION);
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00002033#else
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00002034 msg_gdbg(" unknown PCI library,");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00002035#endif
2036#endif
2037#ifdef __clang__
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00002038 msg_gdbg(" LLVM Clang");
Carl-Daniel Hailfingerb51e58e2010-07-17 14:49:30 +00002039#ifdef __clang_version__
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00002040 msg_gdbg(" %s,", __clang_version__);
Carl-Daniel Hailfingerb51e58e2010-07-17 14:49:30 +00002041#else
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00002042 msg_gdbg(" unknown version (before r102686),");
Carl-Daniel Hailfingerb51e58e2010-07-17 14:49:30 +00002043#endif
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00002044#elif defined(__GNUC__)
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00002045 msg_gdbg(" GCC");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00002046#ifdef __VERSION__
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00002047 msg_gdbg(" %s,", __VERSION__);
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00002048#else
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00002049 msg_gdbg(" unknown version,");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00002050#endif
2051#else
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00002052 msg_gdbg(" unknown compiler,");
Carl-Daniel Hailfingercceafa22010-05-26 01:45:41 +00002053#endif
2054#if defined (__FLASHROM_LITTLE_ENDIAN__)
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00002055 msg_gdbg(" little endian");
Carl-Daniel Hailfinger06b9efa2012-08-07 11:59:59 +00002056#elif defined (__FLASHROM_BIG_ENDIAN__)
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00002057 msg_gdbg(" big endian");
Carl-Daniel Hailfinger06b9efa2012-08-07 11:59:59 +00002058#else
2059#error Endianness could not be determined
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00002060#endif
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00002061 msg_gdbg("\n");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00002062}
2063
Bernhard Walle201bde32008-01-21 15:24:22 +00002064void print_version(void)
2065{
Stefan Tauner76347082016-11-27 17:45:49 +01002066 msg_ginfo("flashrom %s", flashrom_version);
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00002067 print_sysinfo();
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00002068 msg_ginfo("\n");
Bernhard Walle201bde32008-01-21 15:24:22 +00002069}
2070
Carl-Daniel Hailfinger8841d3e2010-05-15 15:04:37 +00002071void print_banner(void)
2072{
2073 msg_ginfo("flashrom is free software, get the source code at "
Stefan Tauner4c723152016-01-14 22:47:55 +00002074 "https://flashrom.org\n");
Carl-Daniel Hailfinger8841d3e2010-05-15 15:04:37 +00002075 msg_ginfo("\n");
2076}
2077
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00002078int selfcheck(void)
2079{
Stefan Tauner96658be2014-05-26 22:05:31 +00002080 unsigned int i;
Stefan Taunera6d96482012-12-26 19:51:23 +00002081 int ret = 0;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00002082
2083 /* Safety check. Instead of aborting after the first error, check
2084 * if more errors exist.
2085 */
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00002086 if (ARRAY_SIZE(programmer_table) - 1 != PROGRAMMER_INVALID) {
Sean Nelson316a29f2010-05-07 20:09:04 +00002087 msg_gerr("Programmer table miscompilation!\n");
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00002088 ret = 1;
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00002089 }
Stefan Taunera6d96482012-12-26 19:51:23 +00002090 for (i = 0; i < PROGRAMMER_INVALID; i++) {
2091 const struct programmer_entry p = programmer_table[i];
2092 if (p.name == NULL) {
2093 msg_gerr("All programmers need a valid name, but the one with index %d does not!\n", i);
2094 ret = 1;
2095 /* This might hide other problems with this programmer, but allows for better error
2096 * messages below without jumping through hoops. */
2097 continue;
2098 }
Stefan Tauneraf358d62012-12-27 18:40:26 +00002099 switch (p.type) {
2100 case USB:
2101 case PCI:
2102 case OTHER:
2103 if (p.devs.note == NULL) {
2104 if (strcmp("internal", p.name) == 0)
2105 break; /* This one has its device list stored separately. */
2106 msg_gerr("Programmer %s has neither a device list nor a textual description!\n",
2107 p.name);
2108 ret = 1;
2109 }
2110 break;
2111 default:
2112 msg_gerr("Programmer %s does not have a valid type set!\n", p.name);
2113 ret = 1;
2114 break;
2115 }
Stefan Taunera6d96482012-12-26 19:51:23 +00002116 if (p.init == NULL) {
2117 msg_gerr("Programmer %s does not have a valid init function!\n", p.name);
2118 ret = 1;
2119 }
2120 if (p.delay == NULL) {
2121 msg_gerr("Programmer %s does not have a valid delay function!\n", p.name);
2122 ret = 1;
2123 }
2124 if (p.map_flash_region == NULL) {
2125 msg_gerr("Programmer %s does not have a valid map_flash_region function!\n", p.name);
2126 ret = 1;
2127 }
2128 if (p.unmap_flash_region == NULL) {
2129 msg_gerr("Programmer %s does not have a valid unmap_flash_region function!\n", p.name);
2130 ret = 1;
2131 }
2132 }
Stefan Tauner96658be2014-05-26 22:05:31 +00002133
2134 /* It would be favorable if we could check for the correct layout (especially termination) of various
2135 * constant arrays: flashchips, chipset_enables, board_matches, boards_known, laptops_known.
2136 * They are all defined as externs in this compilation unit so we don't know their sizes which vary
2137 * depending on compiler flags, e.g. the target architecture, and can sometimes be 0.
2138 * For 'flashchips' we export the size explicitly to work around this and to be able to implement the
2139 * checks below. */
Stefan Tauner6697f712014-08-06 15:09:15 +00002140 if (flashchips_size <= 1 || flashchips[flashchips_size - 1].name != NULL) {
Stefan Tauner7bcacb12011-05-26 01:35:19 +00002141 msg_gerr("Flashchips table miscompilation!\n");
2142 ret = 1;
Stefan Tauner96658be2014-05-26 22:05:31 +00002143 } else {
2144 for (i = 0; i < flashchips_size - 1; i++) {
2145 const struct flashchip *chip = &flashchips[i];
2146 if (chip->vendor == NULL || chip->name == NULL || chip->bustype == BUS_NONE) {
2147 ret = 1;
2148 msg_gerr("ERROR: Some field of flash chip #%d (%s) is misconfigured.\n"
2149 "Please report a bug at flashrom@flashrom.org\n", i,
2150 chip->name == NULL ? "unnamed" : chip->name);
2151 }
2152 if (selfcheck_eraseblocks(chip)) {
2153 ret = 1;
2154 }
2155 }
Stefan Tauner7bcacb12011-05-26 01:35:19 +00002156 }
Stefan Tauner7bcacb12011-05-26 01:35:19 +00002157
Stefan Tauner600576b2014-06-12 22:57:36 +00002158#if CONFIG_INTERNAL == 1
2159 ret |= selfcheck_board_enables();
2160#endif
2161
Stefan Tauner96658be2014-05-26 22:05:31 +00002162 /* TODO: implement similar sanity checks for other arrays where deemed necessary. */
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00002163 return ret;
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00002164}
2165
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00002166/* FIXME: This function signature needs to be improved once doit() has a better
2167 * function signature.
2168 */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00002169int chip_safety_check(const struct flashctx *flash, int force, int read_it, int write_it, int erase_it,
2170 int verify_it)
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00002171{
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00002172 const struct flashchip *chip = flash->chip;
2173
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00002174 if (!programmer_may_write && (write_it || erase_it)) {
2175 msg_perr("Write/erase is not working yet on your programmer in "
2176 "its current configuration.\n");
2177 /* --force is the wrong approach, but it's the best we can do
2178 * until the generic programmer parameter parser is merged.
2179 */
2180 if (!force)
2181 return 1;
2182 msg_cerr("Continuing anyway.\n");
2183 }
2184
2185 if (read_it || erase_it || write_it || verify_it) {
2186 /* Everything needs read. */
Stefan Tauner6455dff2014-05-26 00:36:24 +00002187 if (chip->tested.read == BAD) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00002188 msg_cerr("Read is not working on this chip. ");
2189 if (!force)
2190 return 1;
2191 msg_cerr("Continuing anyway.\n");
2192 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00002193 if (!chip->read) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00002194 msg_cerr("flashrom has no read function for this "
2195 "flash chip.\n");
2196 return 1;
2197 }
2198 }
2199 if (erase_it || write_it) {
2200 /* Write needs erase. */
Stefan Tauner6455dff2014-05-26 00:36:24 +00002201 if (chip->tested.erase == NA) {
2202 msg_cerr("Erase is not possible on this chip.\n");
2203 return 1;
2204 }
2205 if (chip->tested.erase == BAD) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00002206 msg_cerr("Erase is not working on this chip. ");
2207 if (!force)
2208 return 1;
2209 msg_cerr("Continuing anyway.\n");
2210 }
Sylvain "ythier" Hitier9db45512011-07-04 07:27:17 +00002211 if(count_usable_erasers(flash) == 0) {
Stefan Tauner5368dca2011-07-01 00:19:12 +00002212 msg_cerr("flashrom has no erase function for this "
2213 "flash chip.\n");
2214 return 1;
2215 }
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00002216 }
2217 if (write_it) {
Stefan Tauner6455dff2014-05-26 00:36:24 +00002218 if (chip->tested.write == NA) {
2219 msg_cerr("Write is not possible on this chip.\n");
2220 return 1;
2221 }
2222 if (chip->tested.write == BAD) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00002223 msg_cerr("Write is not working on this chip. ");
2224 if (!force)
2225 return 1;
2226 msg_cerr("Continuing anyway.\n");
2227 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00002228 if (!chip->write) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00002229 msg_cerr("flashrom has no write function for this "
2230 "flash chip.\n");
2231 return 1;
2232 }
2233 }
2234 return 0;
2235}
2236
Nico Huber305f4172013-06-14 11:55:26 +02002237int prepare_flash_access(struct flashctx *const flash,
2238 const bool read_it, const bool write_it,
2239 const bool erase_it, const bool verify_it)
Nico Huber454f6132012-12-10 13:34:10 +00002240{
2241 if (chip_safety_check(flash, flash->flags.force, read_it, write_it, erase_it, verify_it)) {
2242 msg_cerr("Aborting.\n");
2243 return 1;
2244 }
2245
2246 if (flash->layout == get_global_layout() && normalize_romentries(flash)) {
2247 msg_cerr("Requested regions can not be handled. Aborting.\n");
2248 return 1;
2249 }
2250
2251 if (map_flash(flash) != 0)
2252 return 1;
2253
2254 /* Given the existence of read locks, we want to unlock for read,
2255 erase and write. */
2256 if (flash->chip->unlock)
2257 flash->chip->unlock(flash);
2258
Nico Huberf43c6542017-10-14 17:47:28 +02002259 flash->address_high_byte = -1;
2260 flash->in_4ba_mode = false;
2261
Ed Swierkcc20a9b2017-07-03 13:17:18 -07002262 /* Enable/disable 4-byte addressing mode if flash chip supports it */
Nico Huberfe34d2a2017-11-10 21:10:20 +01002263 if (flash->chip->feature_bits & (FEATURE_4BA_ENTER | FEATURE_4BA_ENTER_WREN)) {
2264 int ret;
2265 if (spi_master_4ba(flash))
2266 ret = spi_enter_4ba(flash);
2267 else
2268 ret = spi_exit_4ba(flash);
2269 if (ret) {
2270 msg_cerr("Failed to set correct 4BA mode! Aborting.\n");
Ed Swierkcc20a9b2017-07-03 13:17:18 -07002271 return 1;
Boris Baykov7fe85692016-06-11 18:29:03 +02002272 }
Boris Baykov99127182016-06-11 18:29:00 +02002273 }
2274
Nico Huber454f6132012-12-10 13:34:10 +00002275 return 0;
2276}
2277
Nico Huber305f4172013-06-14 11:55:26 +02002278void finalize_flash_access(struct flashctx *const flash)
Nico Huber454f6132012-12-10 13:34:10 +00002279{
2280 unmap_flash(flash);
2281}
2282
2283/**
2284 * @addtogroup flashrom-flash
2285 * @{
2286 */
2287
2288/**
2289 * @brief Erase the specified ROM chip.
2290 *
2291 * If a layout is set in the given flash context, only included regions
2292 * will be erased.
2293 *
2294 * @param flashctx The context of the flash chip to erase.
2295 * @return 0 on success.
2296 */
2297int flashrom_flash_erase(struct flashctx *const flashctx)
2298{
2299 if (prepare_flash_access(flashctx, false, false, true, false))
2300 return 1;
2301
2302 const int ret = erase_by_layout(flashctx);
2303
2304 finalize_flash_access(flashctx);
2305
2306 return ret;
2307}
2308
2309/** @} */ /* end flashrom-flash */
2310
2311/**
2312 * @defgroup flashrom-ops Operations
2313 * @{
2314 */
2315
2316/**
2317 * @brief Read the current image from the specified ROM chip.
2318 *
2319 * If a layout is set in the specified flash context, only included regions
2320 * will be read.
2321 *
2322 * @param flashctx The context of the flash chip.
2323 * @param buffer Target buffer to write image to.
2324 * @param buffer_len Size of target buffer in bytes.
2325 * @return 0 on success,
2326 * 2 if buffer_len is too short for the flash chip's contents,
2327 * or 1 on any other failure.
2328 */
2329int flashrom_image_read(struct flashctx *const flashctx, void *const buffer, const size_t buffer_len)
2330{
2331 const size_t flash_size = flashctx->chip->total_size * 1024;
2332
2333 if (flash_size > buffer_len)
2334 return 2;
2335
2336 if (prepare_flash_access(flashctx, true, false, false, false))
2337 return 1;
2338
2339 msg_cinfo("Reading flash... ");
2340
2341 int ret = 1;
2342 if (read_by_layout(flashctx, buffer)) {
2343 msg_cerr("Read operation failed!\n");
2344 msg_cinfo("FAILED.\n");
2345 goto _finalize_ret;
2346 }
2347 msg_cinfo("done.\n");
2348 ret = 0;
2349
2350_finalize_ret:
2351 finalize_flash_access(flashctx);
2352 return ret;
2353}
2354
2355static void combine_image_by_layout(const struct flashctx *const flashctx,
2356 uint8_t *const newcontents, const uint8_t *const oldcontents)
2357{
2358 const struct flashrom_layout *const layout = get_layout(flashctx);
2359
2360 size_t i;
2361 for (i = 0; i < layout->num_entries; ++i) {
2362 if (layout->entries[i].included)
2363 continue;
2364
2365 const chipoff_t region_start = layout->entries[i].start;
2366 const chipsize_t region_len = layout->entries[i].end - layout->entries[i].start + 1;
2367
2368 memcpy(newcontents + region_start, oldcontents + region_start, region_len);
2369 }
2370}
2371
2372/**
2373 * @brief Write the specified image to the ROM chip.
2374 *
2375 * If a layout is set in the specified flash context, only erase blocks
2376 * containing included regions will be touched.
2377 *
2378 * @param flashctx The context of the flash chip.
Nico Huber1b172f22017-06-19 12:35:24 +02002379 * @param buffer Source buffer to read image from (may be altered for full verification).
Nico Huber454f6132012-12-10 13:34:10 +00002380 * @param buffer_len Size of source buffer in bytes.
Paul Kocialkowskif701f342018-01-15 01:10:36 +03002381 * @param refbuffer If given, assume flash chip contains same data as `refbuffer`.
Nico Huber454f6132012-12-10 13:34:10 +00002382 * @return 0 on success,
2383 * 4 if buffer_len doesn't match the size of the flash chip,
2384 * 3 if write was tried but nothing has changed,
2385 * 2 if write failed and flash contents changed,
2386 * or 1 on any other failure.
2387 */
Paul Kocialkowskif701f342018-01-15 01:10:36 +03002388int flashrom_image_write(struct flashctx *const flashctx, void *const buffer, const size_t buffer_len,
2389 const void *const refbuffer)
Nico Huber454f6132012-12-10 13:34:10 +00002390{
2391 const size_t flash_size = flashctx->chip->total_size * 1024;
2392 const bool verify_all = flashctx->flags.verify_whole_chip;
2393 const bool verify = flashctx->flags.verify_after_write;
2394
2395 if (buffer_len != flash_size)
2396 return 4;
2397
2398 int ret = 1;
2399
2400 uint8_t *const newcontents = buffer;
Paul Kocialkowskif701f342018-01-15 01:10:36 +03002401 const uint8_t *const refcontents = refbuffer;
Nico Huber454f6132012-12-10 13:34:10 +00002402 uint8_t *const curcontents = malloc(flash_size);
2403 uint8_t *oldcontents = NULL;
2404 if (verify_all)
2405 oldcontents = malloc(flash_size);
2406 if (!curcontents || (verify_all && !oldcontents)) {
2407 msg_gerr("Out of memory!\n");
2408 goto _free_ret;
2409 }
2410
2411#if CONFIG_INTERNAL == 1
2412 if (programmer == PROGRAMMER_INTERNAL && cb_check_image(newcontents, flash_size) < 0) {
2413 if (flashctx->flags.force_boardmismatch) {
2414 msg_pinfo("Proceeding anyway because user forced us to.\n");
2415 } else {
2416 msg_perr("Aborting. You can override this with "
2417 "-p internal:boardmismatch=force.\n");
2418 goto _free_ret;
2419 }
2420 }
2421#endif
2422
2423 if (prepare_flash_access(flashctx, false, true, false, verify))
2424 goto _free_ret;
2425
Paul Kocialkowskif701f342018-01-15 01:10:36 +03002426 /* If given, assume flash chip contains same data as `refcontents`. */
2427 if (refcontents) {
2428 msg_cinfo("Assuming old flash chip contents as ref-file...\n");
2429 memcpy(curcontents, refcontents, flash_size);
2430 if (oldcontents)
2431 memcpy(oldcontents, refcontents, flash_size);
Nico Huber454f6132012-12-10 13:34:10 +00002432 } else {
Paul Kocialkowskif701f342018-01-15 01:10:36 +03002433 /*
2434 * Read the whole chip to be able to check whether regions need to be
2435 * erased and to give better diagnostics in case write fails.
2436 * The alternative is to read only the regions which are to be
2437 * preserved, but in that case we might perform unneeded erase which
2438 * takes time as well.
2439 */
2440 msg_cinfo("Reading old flash chip contents... ");
2441 if (verify_all) {
2442 if (flashctx->chip->read(flashctx, oldcontents, 0, flash_size)) {
2443 msg_cinfo("FAILED.\n");
2444 goto _finalize_ret;
2445 }
2446 memcpy(curcontents, oldcontents, flash_size);
2447 } else {
2448 if (read_by_layout(flashctx, curcontents)) {
2449 msg_cinfo("FAILED.\n");
2450 goto _finalize_ret;
2451 }
Nico Huber454f6132012-12-10 13:34:10 +00002452 }
Paul Kocialkowskif701f342018-01-15 01:10:36 +03002453 msg_cinfo("done.\n");
Nico Huber454f6132012-12-10 13:34:10 +00002454 }
Nico Huber454f6132012-12-10 13:34:10 +00002455
2456 if (write_by_layout(flashctx, curcontents, newcontents)) {
2457 msg_cerr("Uh oh. Erase/write failed. ");
2458 ret = 2;
2459 if (verify_all) {
2460 msg_cerr("Checking if anything has changed.\n");
2461 msg_cinfo("Reading current flash chip contents... ");
2462 if (!flashctx->chip->read(flashctx, curcontents, 0, flash_size)) {
2463 msg_cinfo("done.\n");
2464 if (!memcmp(oldcontents, curcontents, flash_size)) {
2465 nonfatal_help_message();
2466 goto _finalize_ret;
2467 }
2468 msg_cerr("Apparently at least some data has changed.\n");
2469 } else
2470 msg_cerr("Can't even read anymore!\n");
2471 emergency_help_message();
2472 goto _finalize_ret;
2473 } else {
2474 msg_cerr("\n");
2475 }
2476 emergency_help_message();
2477 goto _finalize_ret;
2478 }
2479
2480 /* Verify only if we actually changed something. */
2481 if (verify && !all_skipped) {
2482 const struct flashrom_layout *const layout_bak = flashctx->layout;
2483
2484 msg_cinfo("Verifying flash... ");
2485
2486 /* Work around chips which need some time to calm down. */
2487 programmer_delay(1000*1000);
2488
2489 if (verify_all) {
2490 combine_image_by_layout(flashctx, newcontents, oldcontents);
2491 flashctx->layout = NULL;
2492 }
2493 ret = verify_by_layout(flashctx, curcontents, newcontents);
2494 flashctx->layout = layout_bak;
2495 /* If we tried to write, and verification now fails, we
2496 might have an emergency situation. */
2497 if (ret)
2498 emergency_help_message();
2499 else
2500 msg_cinfo("VERIFIED.\n");
2501 } else {
2502 /* We didn't change anything. */
2503 ret = 0;
2504 }
2505
2506_finalize_ret:
2507 finalize_flash_access(flashctx);
2508_free_ret:
2509 free(oldcontents);
2510 free(curcontents);
2511 return ret;
2512}
2513
2514/**
2515 * @brief Verify the ROM chip's contents with the specified image.
2516 *
2517 * If a layout is set in the specified flash context, only included regions
2518 * will be verified.
2519 *
2520 * @param flashctx The context of the flash chip.
2521 * @param buffer Source buffer to verify with.
2522 * @param buffer_len Size of source buffer in bytes.
2523 * @return 0 on success,
2524 * 3 if the chip's contents don't match,
2525 * 2 if buffer_len doesn't match the size of the flash chip,
2526 * or 1 on any other failure.
2527 */
2528int flashrom_image_verify(struct flashctx *const flashctx, const void *const buffer, const size_t buffer_len)
2529{
2530 const size_t flash_size = flashctx->chip->total_size * 1024;
2531
2532 if (buffer_len != flash_size)
2533 return 2;
2534
2535 const uint8_t *const newcontents = buffer;
2536 uint8_t *const curcontents = malloc(flash_size);
2537 if (!curcontents) {
2538 msg_gerr("Out of memory!\n");
2539 return 1;
2540 }
2541
2542 int ret = 1;
2543
2544 if (prepare_flash_access(flashctx, false, false, false, true))
2545 goto _free_ret;
2546
2547 msg_cinfo("Verifying flash... ");
2548 ret = verify_by_layout(flashctx, curcontents, newcontents);
2549 if (!ret)
2550 msg_cinfo("VERIFIED.\n");
2551
2552 finalize_flash_access(flashctx);
2553_free_ret:
2554 free(curcontents);
2555 return ret;
2556}
2557
2558/** @} */ /* end flashrom-ops */
Nico Huber899e4ec2016-04-29 18:39:01 +02002559
2560int do_read(struct flashctx *const flash, const char *const filename)
2561{
2562 if (prepare_flash_access(flash, true, false, false, false))
2563 return 1;
2564
2565 const int ret = read_flash_to_file(flash, filename);
2566
2567 finalize_flash_access(flash);
2568
2569 return ret;
2570}
2571
2572int do_erase(struct flashctx *const flash)
2573{
2574 const int ret = flashrom_flash_erase(flash);
2575
2576 /*
2577 * FIXME: Do we really want the scary warning if erase failed?
2578 * After all, after erase the chip is either blank or partially
2579 * blank or it has the old contents. A blank chip won't boot,
2580 * so if the user wanted erase and reboots afterwards, the user
2581 * knows very well that booting won't work.
2582 */
2583 if (ret)
2584 emergency_help_message();
2585
2586 return ret;
2587}
2588
Paul Kocialkowskif701f342018-01-15 01:10:36 +03002589int do_write(struct flashctx *const flash, const char *const filename, const char *const referencefile)
Nico Huber899e4ec2016-04-29 18:39:01 +02002590{
2591 const size_t flash_size = flash->chip->total_size * 1024;
2592 int ret = 1;
2593
2594 uint8_t *const newcontents = malloc(flash_size);
Paul Kocialkowskif701f342018-01-15 01:10:36 +03002595 uint8_t *const refcontents = referencefile ? malloc(flash_size) : NULL;
2596
2597 if (!newcontents || (referencefile && !refcontents)) {
Nico Huber899e4ec2016-04-29 18:39:01 +02002598 msg_gerr("Out of memory!\n");
2599 goto _free_ret;
2600 }
2601
2602 if (read_buf_from_file(newcontents, flash_size, filename))
2603 goto _free_ret;
2604
Paul Kocialkowskif701f342018-01-15 01:10:36 +03002605 if (referencefile) {
2606 if (read_buf_from_file(refcontents, flash_size, referencefile))
2607 goto _free_ret;
2608 }
2609
2610 ret = flashrom_image_write(flash, newcontents, flash_size, refcontents);
Nico Huber899e4ec2016-04-29 18:39:01 +02002611
2612_free_ret:
Paul Kocialkowskif701f342018-01-15 01:10:36 +03002613 free(refcontents);
Nico Huber899e4ec2016-04-29 18:39:01 +02002614 free(newcontents);
2615 return ret;
2616}
2617
2618int do_verify(struct flashctx *const flash, const char *const filename)
2619{
2620 const size_t flash_size = flash->chip->total_size * 1024;
2621 int ret = 1;
2622
2623 uint8_t *const newcontents = malloc(flash_size);
2624 if (!newcontents) {
2625 msg_gerr("Out of memory!\n");
2626 goto _free_ret;
2627 }
2628
2629 if (read_buf_from_file(newcontents, flash_size, filename))
2630 goto _free_ret;
2631
2632 ret = flashrom_image_verify(flash, newcontents, flash_size);
2633
2634_free_ret:
2635 free(newcontents);
2636 return ret;
2637}