blob: b47d0a2ce536705891739e09bbdab931b8d2d2ed [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
Marc Schink3578ec62016-03-17 16:23:03 +0100440#if CONFIG_JLINK_SPI == 1
441 {
442 .name = "jlink_spi",
443 .type = OTHER,
444 .init = jlink_spi_init,
445 .devs.note = "SEGGER J-Link and compatible devices\n",
446 .map_flash_region = fallback_map,
447 .unmap_flash_region = fallback_unmap,
448 .delay = internal_delay,
449 },
450#endif
451
Carl-Daniel Hailfinger1c6d2ff2012-08-27 00:44:42 +0000452 {0}, /* This entry corresponds to PROGRAMMER_INVALID. */
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +0000453};
Luc Verhaegen8e3a6002007-04-04 22:45:58 +0000454
Carl-Daniel Hailfinger2bee8cf2010-11-10 15:25:18 +0000455#define SHUTDOWN_MAXFN 32
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000456static int shutdown_fn_count = 0;
Nico Huber454f6132012-12-10 13:34:10 +0000457/** @private */
Richard Hughes93e16252018-12-19 11:54:47 +0000458static struct shutdown_func_data {
David Hendricks8bb20212011-06-14 01:35:36 +0000459 int (*func) (void *data);
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000460 void *data;
Richard Hughes93e16252018-12-19 11:54:47 +0000461} shutdown_fn[SHUTDOWN_MAXFN];
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000462/* Initialize to 0 to make sure nobody registers a shutdown function before
463 * programmer init.
464 */
465static int may_register_shutdown = 0;
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000466
Stefan Taunerc4f44df2013-08-12 22:58:43 +0000467/* Did we change something or was every erase/write skipped (if any)? */
468static bool all_skipped = true;
469
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +0000470static int check_block_eraser(const struct flashctx *flash, int k, int log);
Stefan Tauner5368dca2011-07-01 00:19:12 +0000471
Stefan Tauner2a1ed772014-08-31 00:09:21 +0000472int shutdown_free(void *data)
473{
474 free(data);
475 return 0;
476}
477
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000478/* Register a function to be executed on programmer shutdown.
479 * The advantage over atexit() is that you can supply a void pointer which will
480 * be used as parameter to the registered function upon programmer shutdown.
481 * This pointer can point to arbitrary data used by said function, e.g. undo
482 * information for GPIO settings etc. If unneeded, set data=NULL.
483 * Please note that the first (void *data) belongs to the function signature of
484 * the function passed as first parameter.
485 */
David Hendricks8bb20212011-06-14 01:35:36 +0000486int register_shutdown(int (*function) (void *data), void *data)
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000487{
488 if (shutdown_fn_count >= SHUTDOWN_MAXFN) {
Carl-Daniel Hailfinger9f5f2152010-06-04 23:20:21 +0000489 msg_perr("Tried to register more than %i shutdown functions.\n",
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000490 SHUTDOWN_MAXFN);
491 return 1;
492 }
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000493 if (!may_register_shutdown) {
494 msg_perr("Tried to register a shutdown function before "
495 "programmer init.\n");
496 return 1;
497 }
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000498 shutdown_fn[shutdown_fn_count].func = function;
499 shutdown_fn[shutdown_fn_count].data = data;
500 shutdown_fn_count++;
501
502 return 0;
503}
504
Nico Huberbcb2e5a2012-12-30 01:23:17 +0000505int programmer_init(enum programmer prog, const char *param)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000506{
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000507 int ret;
Carl-Daniel Hailfinger2e681602011-09-08 00:00:29 +0000508
509 if (prog >= PROGRAMMER_INVALID) {
510 msg_perr("Invalid programmer specified!\n");
511 return -1;
512 }
513 programmer = prog;
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000514 /* Initialize all programmer specific data. */
515 /* Default to unlimited decode sizes. */
516 max_rom_decode = (const struct decode_sizes) {
517 .parallel = 0xffffffff,
518 .lpc = 0xffffffff,
519 .fwh = 0xffffffff,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000520 .spi = 0xffffffff,
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000521 };
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000522 /* Default to top aligned flash at 4 GB. */
523 flashbase = 0;
524 /* Registering shutdown functions is now allowed. */
525 may_register_shutdown = 1;
Carl-Daniel Hailfingerd1be52d2010-07-03 12:14:25 +0000526 /* Default to allowing writes. Broken programmers set this to 0. */
527 programmer_may_write = 1;
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000528
529 programmer_param = param;
Carl-Daniel Hailfinger20a36ba2013-08-13 07:09:57 +0000530 msg_pdbg("Initializing %s programmer\n", programmer_table[programmer].name);
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000531 ret = programmer_table[programmer].init();
532 if (programmer_param && strlen(programmer_param)) {
Carl-Daniel Hailfinger20a36ba2013-08-13 07:09:57 +0000533 if (ret != 0) {
534 /* It is quite possible that any unhandled programmer parameter would have been valid,
535 * but an error in actual programmer init happened before the parameter was evaluated.
536 */
537 msg_pwarn("Unhandled programmer parameters (possibly due to another failure): %s\n",
538 programmer_param);
539 } else {
540 /* Actual programmer init was successful, but the user specified an invalid or unusable
541 * (for the current programmer configuration) parameter.
542 */
543 msg_perr("Unhandled programmer parameters: %s\n", programmer_param);
544 msg_perr("Aborting.\n");
545 ret = ERROR_FATAL;
546 }
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000547 }
548 return ret;
Uwe Hermann09e04f72009-05-16 22:36:00 +0000549}
550
Stefan Tauner20da4aa2014-05-07 22:07:23 +0000551/** Calls registered shutdown functions and resets internal programmer-related variables.
552 * Calling it is safe even without previous initialization, but further interactions with programmer support
553 * require a call to programmer_init() (afterwards).
554 *
555 * @return The OR-ed result values of all shutdown functions (i.e. 0 on success). */
Uwe Hermann09e04f72009-05-16 22:36:00 +0000556int programmer_shutdown(void)
557{
David Hendricks8bb20212011-06-14 01:35:36 +0000558 int ret = 0;
559
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000560 /* Registering shutdown functions is no longer allowed. */
561 may_register_shutdown = 0;
562 while (shutdown_fn_count > 0) {
563 int i = --shutdown_fn_count;
David Hendricks8bb20212011-06-14 01:35:36 +0000564 ret |= shutdown_fn[i].func(shutdown_fn[i].data);
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000565 }
Stefan Taunere34e3e82013-01-01 00:06:51 +0000566
Stefan Taunerb8911d62012-12-26 07:55:00 +0000567 programmer_param = NULL;
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000568 registered_master_count = 0;
Stefan Taunere34e3e82013-01-01 00:06:51 +0000569
David Hendricks8bb20212011-06-14 01:35:36 +0000570 return ret;
Uwe Hermann09e04f72009-05-16 22:36:00 +0000571}
572
Stefan Tauner305e0b92013-07-17 23:46:44 +0000573void *programmer_map_flash_region(const char *descr, uintptr_t phys_addr, size_t len)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000574{
Stefan Tauner26e7a152013-09-13 17:21:05 +0000575 void *ret = programmer_table[programmer].map_flash_region(descr, phys_addr, len);
576 msg_gspew("%s: mapping %s from 0x%0*" PRIxPTR " to 0x%0*" PRIxPTR "\n",
577 __func__, descr, PRIxPTR_WIDTH, phys_addr, PRIxPTR_WIDTH, (uintptr_t) ret);
578 return ret;
Uwe Hermann09e04f72009-05-16 22:36:00 +0000579}
580
581void programmer_unmap_flash_region(void *virt_addr, size_t len)
582{
583 programmer_table[programmer].unmap_flash_region(virt_addr, len);
Stefan Tauner4e32ec12014-08-30 23:39:51 +0000584 msg_gspew("%s: unmapped 0x%0*" PRIxPTR "\n", __func__, PRIxPTR_WIDTH, (uintptr_t)virt_addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000585}
586
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000587void chip_writeb(const struct flashctx *flash, uint8_t val, chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000588{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000589 flash->mst->par.chip_writeb(flash, val, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000590}
591
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000592void chip_writew(const struct flashctx *flash, uint16_t val, chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000593{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000594 flash->mst->par.chip_writew(flash, val, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000595}
596
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000597void chip_writel(const struct flashctx *flash, uint32_t val, chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000598{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000599 flash->mst->par.chip_writel(flash, val, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000600}
601
Mark Marshallf20b7be2014-05-09 21:16:21 +0000602void chip_writen(const struct flashctx *flash, const uint8_t *buf, chipaddr addr, size_t len)
Carl-Daniel Hailfinger0bd2a2b2009-06-05 18:32:07 +0000603{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000604 flash->mst->par.chip_writen(flash, buf, addr, len);
Carl-Daniel Hailfinger0bd2a2b2009-06-05 18:32:07 +0000605}
606
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000607uint8_t chip_readb(const struct flashctx *flash, const chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000608{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000609 return flash->mst->par.chip_readb(flash, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000610}
611
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000612uint16_t chip_readw(const struct flashctx *flash, const chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000613{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000614 return flash->mst->par.chip_readw(flash, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000615}
616
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000617uint32_t chip_readl(const struct flashctx *flash, const chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000618{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000619 return flash->mst->par.chip_readl(flash, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000620}
621
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000622void chip_readn(const struct flashctx *flash, uint8_t *buf, chipaddr addr,
623 size_t len)
Carl-Daniel Hailfinger0bd2a2b2009-06-05 18:32:07 +0000624{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000625 flash->mst->par.chip_readn(flash, buf, addr, len);
Carl-Daniel Hailfinger0bd2a2b2009-06-05 18:32:07 +0000626}
627
Stefan Taunerf80419c2014-05-02 15:41:42 +0000628void programmer_delay(unsigned int usecs)
Carl-Daniel Hailfingerca8bfc62009-06-05 17:48:08 +0000629{
Urja Rannikko8d7ec2a2013-10-21 21:49:08 +0000630 if (usecs > 0)
631 programmer_table[programmer].delay(usecs);
Carl-Daniel Hailfingerca8bfc62009-06-05 17:48:08 +0000632}
633
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000634int read_memmapped(struct flashctx *flash, uint8_t *buf, unsigned int start,
635 int unsigned len)
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000636{
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000637 chip_readn(flash, buf, flash->virtual_memory + start, len);
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000638
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000639 return 0;
640}
641
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000642/* This is a somewhat hacked function similar in some ways to strtok().
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000643 * It will look for needle with a subsequent '=' in haystack, return a copy of
644 * needle and remove everything from the first occurrence of needle to the next
645 * delimiter from haystack.
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000646 */
Nico Huberbcb2e5a2012-12-30 01:23:17 +0000647char *extract_param(const char *const *haystack, const char *needle, const char *delim)
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000648{
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000649 char *param_pos, *opt_pos, *rest;
650 char *opt = NULL;
651 int optlen;
Carl-Daniel Hailfinger27023762010-04-28 15:22:14 +0000652 int needlelen;
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000653
Carl-Daniel Hailfinger27023762010-04-28 15:22:14 +0000654 needlelen = strlen(needle);
655 if (!needlelen) {
656 msg_gerr("%s: empty needle! Please report a bug at "
657 "flashrom@flashrom.org\n", __func__);
658 return NULL;
659 }
660 /* No programmer parameters given. */
661 if (*haystack == NULL)
662 return NULL;
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000663 param_pos = strstr(*haystack, needle);
664 do {
665 if (!param_pos)
666 return NULL;
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000667 /* Needle followed by '='? */
668 if (param_pos[needlelen] == '=') {
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000669 /* Beginning of the string? */
670 if (param_pos == *haystack)
671 break;
672 /* After a delimiter? */
673 if (strchr(delim, *(param_pos - 1)))
674 break;
675 }
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000676 /* Continue searching. */
677 param_pos++;
678 param_pos = strstr(param_pos, needle);
679 } while (1);
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000680
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000681 if (param_pos) {
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000682 /* Get the string after needle and '='. */
683 opt_pos = param_pos + needlelen + 1;
684 optlen = strcspn(opt_pos, delim);
685 /* Return an empty string if the parameter was empty. */
686 opt = malloc(optlen + 1);
687 if (!opt) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000688 msg_gerr("Out of memory!\n");
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000689 exit(1);
690 }
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000691 strncpy(opt, opt_pos, optlen);
692 opt[optlen] = '\0';
693 rest = opt_pos + optlen;
694 /* Skip all delimiters after the current parameter. */
695 rest += strspn(rest, delim);
696 memmove(param_pos, rest, strlen(rest) + 1);
697 /* We could shrink haystack, but the effort is not worth it. */
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000698 }
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000699
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000700 return opt;
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000701}
702
Stefan Tauner66652442011-06-26 17:38:17 +0000703char *extract_programmer_param(const char *param_name)
Carl-Daniel Hailfinger2b6dcb32010-07-08 10:13:37 +0000704{
705 return extract_param(&programmer_param, param_name, ",");
706}
707
Sylvain "ythier" Hitier9db45512011-07-04 07:27:17 +0000708/* Returns the number of well-defined erasers for a chip. */
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +0000709static unsigned int count_usable_erasers(const struct flashctx *flash)
Stefan Tauner5368dca2011-07-01 00:19:12 +0000710{
711 unsigned int usable_erasefunctions = 0;
712 int k;
713 for (k = 0; k < NUM_ERASEFUNCTIONS; k++) {
714 if (!check_block_eraser(flash, k, 0))
715 usable_erasefunctions++;
716 }
717 return usable_erasefunctions;
718}
719
Mark Marshallf20b7be2014-05-09 21:16:21 +0000720static int compare_range(const uint8_t *wantbuf, const uint8_t *havebuf, unsigned int start, unsigned int len)
Stefan Tauner78ffbea2012-10-27 15:36:56 +0000721{
722 int ret = 0, failcount = 0;
723 unsigned int i;
724 for (i = 0; i < len; i++) {
725 if (wantbuf[i] != havebuf[i]) {
726 /* Only print the first failure. */
727 if (!failcount++)
728 msg_cerr("FAILED at 0x%08x! Expected=0x%02x, Found=0x%02x,",
729 start + i, wantbuf[i], havebuf[i]);
730 }
731 }
732 if (failcount) {
733 msg_cerr(" failed byte count from 0x%08x-0x%08x: 0x%x\n",
734 start, start + len - 1, failcount);
735 ret = -1;
736 }
737 return ret;
738}
739
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000740/* start is an offset to the base address of the flash chip */
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000741int check_erased_range(struct flashctx *flash, unsigned int start,
742 unsigned int len)
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000743{
744 int ret;
745 uint8_t *cmpbuf = malloc(len);
Paul Kocialkowski995f7552018-01-15 01:06:09 +0300746 const uint8_t erased_value = ERASED_VALUE(flash);
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000747
748 if (!cmpbuf) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000749 msg_gerr("Could not allocate memory!\n");
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000750 exit(1);
751 }
Paul Kocialkowski995f7552018-01-15 01:06:09 +0300752 memset(cmpbuf, erased_value, len);
Stefan Tauner78ffbea2012-10-27 15:36:56 +0000753 ret = verify_range(flash, cmpbuf, start, len);
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000754 free(cmpbuf);
755 return ret;
756}
757
Uwe Hermann48ec1b12010-08-08 17:01:18 +0000758/*
Carl-Daniel Hailfingerd0250a32009-11-25 17:05:52 +0000759 * @cmpbuf buffer to compare against, cmpbuf[0] is expected to match the
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000760 * flash content at location start
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000761 * @start offset to the base address of the flash chip
762 * @len length of the verified area
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000763 * @return 0 for success, -1 for failure
764 */
Mark Marshallf20b7be2014-05-09 21:16:21 +0000765int verify_range(struct flashctx *flash, const uint8_t *cmpbuf, unsigned int start, unsigned int len)
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000766{
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000767 if (!len)
Stefan Taunerdf64a422014-05-27 00:06:14 +0000768 return -1;
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000769
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +0000770 if (!flash->chip->read) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000771 msg_cerr("ERROR: flashrom has no read function for this flash chip.\n");
Stefan Taunerdf64a422014-05-27 00:06:14 +0000772 return -1;
Carl-Daniel Hailfinger23290662009-06-24 08:20:45 +0000773 }
Stefan Taunerdf64a422014-05-27 00:06:14 +0000774
775 uint8_t *readbuf = malloc(len);
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000776 if (!readbuf) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000777 msg_gerr("Could not allocate memory!\n");
Stefan Taunerdf64a422014-05-27 00:06:14 +0000778 return -1;
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000779 }
Stefan Taunerdf64a422014-05-27 00:06:14 +0000780 int ret = 0;
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000781
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +0000782 if (start + len > flash->chip->total_size * 1024) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000783 msg_gerr("Error: %s called with start 0x%x + len 0x%x >"
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000784 " total_size 0x%x\n", __func__, start, len,
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +0000785 flash->chip->total_size * 1024);
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000786 ret = -1;
787 goto out_free;
788 }
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000789
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +0000790 ret = flash->chip->read(flash, readbuf, start, len);
Carl-Daniel Hailfingerd8369412010-11-16 17:21:58 +0000791 if (ret) {
792 msg_gerr("Verification impossible because read failed "
793 "at 0x%x (len 0x%x)\n", start, len);
Stefan Taunerdf64a422014-05-27 00:06:14 +0000794 ret = -1;
795 goto out_free;
Carl-Daniel Hailfingerd8369412010-11-16 17:21:58 +0000796 }
797
Stefan Tauner78ffbea2012-10-27 15:36:56 +0000798 ret = compare_range(cmpbuf, readbuf, start, len);
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000799out_free:
800 free(readbuf);
801 return ret;
802}
803
Stefan Tauner02437452013-04-01 19:34:53 +0000804/* Helper function for need_erase() that focuses on granularities of gran bytes. */
Paul Kocialkowski995f7552018-01-15 01:06:09 +0300805static int need_erase_gran_bytes(const uint8_t *have, const uint8_t *want, unsigned int len,
806 unsigned int gran, const uint8_t erased_value)
Stefan Tauner02437452013-04-01 19:34:53 +0000807{
808 unsigned int i, j, limit;
809 for (j = 0; j < len / gran; j++) {
810 limit = min (gran, len - j * gran);
811 /* Are 'have' and 'want' identical? */
812 if (!memcmp(have + j * gran, want + j * gran, limit))
813 continue;
814 /* have needs to be in erased state. */
815 for (i = 0; i < limit; i++)
Paul Kocialkowski995f7552018-01-15 01:06:09 +0300816 if (have[j * gran + i] != erased_value)
Stefan Tauner02437452013-04-01 19:34:53 +0000817 return 1;
818 }
819 return 0;
820}
821
Uwe Hermann48ec1b12010-08-08 17:01:18 +0000822/*
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000823 * Check if the buffer @have can be programmed to the content of @want without
824 * erasing. This is only possible if all chunks of size @gran are either kept
825 * as-is or changed from an all-ones state to any other state.
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000826 *
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000827 * Warning: This function assumes that @have and @want point to naturally
828 * aligned regions.
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000829 *
830 * @have buffer with current content
831 * @want buffer with desired content
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000832 * @len length of the checked area
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000833 * @gran write granularity (enum, not count)
834 * @return 0 if no erase is needed, 1 otherwise
835 */
Paul Kocialkowski995f7552018-01-15 01:06:09 +0300836int need_erase(const uint8_t *have, const uint8_t *want, unsigned int len,
837 enum write_granularity gran, const uint8_t erased_value)
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000838{
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +0000839 int result = 0;
Stefan Tauner02437452013-04-01 19:34:53 +0000840 unsigned int i;
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000841
842 switch (gran) {
843 case write_gran_1bit:
844 for (i = 0; i < len; i++)
845 if ((have[i] & want[i]) != want[i]) {
846 result = 1;
847 break;
848 }
849 break;
850 case write_gran_1byte:
851 for (i = 0; i < len; i++)
Paul Kocialkowski995f7552018-01-15 01:06:09 +0300852 if ((have[i] != want[i]) && (have[i] != erased_value)) {
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000853 result = 1;
854 break;
855 }
856 break;
Paul Kocialkowskic8305e12015-10-16 02:16:20 +0000857 case write_gran_128bytes:
Paul Kocialkowski995f7552018-01-15 01:06:09 +0300858 result = need_erase_gran_bytes(have, want, len, 128, erased_value);
Paul Kocialkowskic8305e12015-10-16 02:16:20 +0000859 break;
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000860 case write_gran_256bytes:
Paul Kocialkowski995f7552018-01-15 01:06:09 +0300861 result = need_erase_gran_bytes(have, want, len, 256, erased_value);
Stefan Tauner02437452013-04-01 19:34:53 +0000862 break;
863 case write_gran_264bytes:
Paul Kocialkowski995f7552018-01-15 01:06:09 +0300864 result = need_erase_gran_bytes(have, want, len, 264, erased_value);
Stefan Tauner02437452013-04-01 19:34:53 +0000865 break;
866 case write_gran_512bytes:
Paul Kocialkowski995f7552018-01-15 01:06:09 +0300867 result = need_erase_gran_bytes(have, want, len, 512, erased_value);
Stefan Tauner02437452013-04-01 19:34:53 +0000868 break;
869 case write_gran_528bytes:
Paul Kocialkowski995f7552018-01-15 01:06:09 +0300870 result = need_erase_gran_bytes(have, want, len, 528, erased_value);
Stefan Tauner02437452013-04-01 19:34:53 +0000871 break;
872 case write_gran_1024bytes:
Paul Kocialkowski995f7552018-01-15 01:06:09 +0300873 result = need_erase_gran_bytes(have, want, len, 1024, erased_value);
Stefan Tauner02437452013-04-01 19:34:53 +0000874 break;
875 case write_gran_1056bytes:
Paul Kocialkowski995f7552018-01-15 01:06:09 +0300876 result = need_erase_gran_bytes(have, want, len, 1056, erased_value);
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000877 break;
Carl-Daniel Hailfinger1b0e9fc2014-06-16 22:36:17 +0000878 case write_gran_1byte_implicit_erase:
879 /* Do not erase, handle content changes from anything->0xff by writing 0xff. */
880 result = 0;
881 break;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000882 default:
883 msg_cerr("%s: Unsupported granularity! Please report a bug at "
884 "flashrom@flashrom.org\n", __func__);
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000885 }
886 return result;
887}
888
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000889/**
890 * Check if the buffer @have needs to be programmed to get the content of @want.
891 * If yes, return 1 and fill in first_start with the start address of the
892 * write operation and first_len with the length of the first to-be-written
893 * chunk. If not, return 0 and leave first_start and first_len undefined.
894 *
895 * Warning: This function assumes that @have and @want point to naturally
896 * aligned regions.
897 *
898 * @have buffer with current content
899 * @want buffer with desired content
900 * @len length of the checked area
901 * @gran write granularity (enum, not count)
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000902 * @first_start offset of the first byte which needs to be written (passed in
903 * value is increased by the offset of the first needed write
904 * relative to have/want or unchanged if no write is needed)
905 * @return length of the first contiguous area which needs to be written
906 * 0 if no write is needed
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000907 *
908 * FIXME: This function needs a parameter which tells it about coalescing
909 * in relation to the max write length of the programmer and the max write
910 * length of the chip.
911 */
Mark Marshallf20b7be2014-05-09 21:16:21 +0000912static unsigned int get_next_write(const uint8_t *have, const uint8_t *want, unsigned int len,
Stefan Taunerc69c9c82011-11-23 09:13:48 +0000913 unsigned int *first_start,
914 enum write_granularity gran)
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000915{
Stefan Taunerc69c9c82011-11-23 09:13:48 +0000916 int need_write = 0;
917 unsigned int rel_start = 0, first_len = 0;
918 unsigned int i, limit, stride;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000919
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000920 switch (gran) {
921 case write_gran_1bit:
922 case write_gran_1byte:
Carl-Daniel Hailfinger1b0e9fc2014-06-16 22:36:17 +0000923 case write_gran_1byte_implicit_erase:
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000924 stride = 1;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000925 break;
Paul Kocialkowskic8305e12015-10-16 02:16:20 +0000926 case write_gran_128bytes:
927 stride = 128;
928 break;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000929 case write_gran_256bytes:
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000930 stride = 256;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000931 break;
Stefan Tauner02437452013-04-01 19:34:53 +0000932 case write_gran_264bytes:
933 stride = 264;
934 break;
935 case write_gran_512bytes:
936 stride = 512;
937 break;
938 case write_gran_528bytes:
939 stride = 528;
940 break;
941 case write_gran_1024bytes:
942 stride = 1024;
943 break;
944 case write_gran_1056bytes:
945 stride = 1056;
946 break;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000947 default:
948 msg_cerr("%s: Unsupported granularity! Please report a bug at "
949 "flashrom@flashrom.org\n", __func__);
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000950 /* Claim that no write was needed. A write with unknown
951 * granularity is too dangerous to try.
952 */
953 return 0;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000954 }
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000955 for (i = 0; i < len / stride; i++) {
956 limit = min(stride, len - i * stride);
957 /* Are 'have' and 'want' identical? */
958 if (memcmp(have + i * stride, want + i * stride, limit)) {
959 if (!need_write) {
960 /* First location where have and want differ. */
961 need_write = 1;
962 rel_start = i * stride;
963 }
964 } else {
965 if (need_write) {
966 /* First location where have and want
967 * do not differ anymore.
968 */
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000969 break;
970 }
971 }
972 }
Carl-Daniel Hailfinger202bf532010-12-06 13:05:44 +0000973 if (need_write)
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000974 first_len = min(i * stride - rel_start, len);
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000975 *first_start += rel_start;
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000976 return first_len;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000977}
978
Carl-Daniel Hailfingereaac68b2009-11-23 12:55:31 +0000979/* This function generates various test patterns useful for testing controller
980 * and chip communication as well as chip behaviour.
981 *
982 * If a byte can be written multiple times, each time keeping 0-bits at 0
983 * and changing 1-bits to 0 if the new value for that bit is 0, the effect
984 * is essentially an AND operation. That's also the reason why this function
985 * provides the result of AND between various patterns.
986 *
987 * Below is a list of patterns (and their block length).
988 * Pattern 0 is 05 15 25 35 45 55 65 75 85 95 a5 b5 c5 d5 e5 f5 (16 Bytes)
989 * Pattern 1 is 0a 1a 2a 3a 4a 5a 6a 7a 8a 9a aa ba ca da ea fa (16 Bytes)
990 * Pattern 2 is 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f (16 Bytes)
991 * Pattern 3 is a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af (16 Bytes)
992 * Pattern 4 is 00 10 20 30 40 50 60 70 80 90 a0 b0 c0 d0 e0 f0 (16 Bytes)
993 * Pattern 5 is 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f (16 Bytes)
994 * Pattern 6 is 00 (1 Byte)
995 * Pattern 7 is ff (1 Byte)
996 * Patterns 0-7 have a big-endian block number in the last 2 bytes of each 256
997 * byte block.
998 *
999 * Pattern 8 is 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11... (256 B)
1000 * Pattern 9 is ff fe fd fc fb fa f9 f8 f7 f6 f5 f4 f3 f2 f1 f0 ef ee... (256 B)
1001 * Pattern 10 is 00 00 00 01 00 02 00 03 00 04... (128 kB big-endian counter)
1002 * Pattern 11 is ff ff ff fe ff fd ff fc ff fb... (128 kB big-endian downwards)
1003 * Pattern 12 is 00 (1 Byte)
1004 * Pattern 13 is ff (1 Byte)
1005 * Patterns 8-13 have no block number.
1006 *
1007 * Patterns 0-3 are created to detect and efficiently diagnose communication
1008 * slips like missed bits or bytes and their repetitive nature gives good visual
1009 * cues to the person inspecting the results. In addition, the following holds:
1010 * AND Pattern 0/1 == Pattern 4
1011 * AND Pattern 2/3 == Pattern 5
1012 * AND Pattern 0/1/2/3 == AND Pattern 4/5 == Pattern 6
1013 * A weakness of pattern 0-5 is the inability to detect swaps/copies between
1014 * any two 16-byte blocks except for the last 16-byte block in a 256-byte bloc.
1015 * They work perfectly for detecting any swaps/aliasing of blocks >= 256 bytes.
1016 * 0x5 and 0xa were picked because they are 0101 and 1010 binary.
1017 * Patterns 8-9 are best for detecting swaps/aliasing of blocks < 256 bytes.
1018 * Besides that, they provide for bit testing of the last two bytes of every
1019 * 256 byte block which contains the block number for patterns 0-6.
1020 * Patterns 10-11 are special purpose for detecting subblock aliasing with
1021 * block sizes >256 bytes (some Dataflash chips etc.)
1022 * AND Pattern 8/9 == Pattern 12
1023 * AND Pattern 10/11 == Pattern 12
1024 * Pattern 13 is the completely erased state.
1025 * None of the patterns can detect aliasing at boundaries which are a multiple
1026 * of 16 MBytes (but such chips do not exist anyway for Parallel/LPC/FWH/SPI).
1027 */
1028int generate_testpattern(uint8_t *buf, uint32_t size, int variant)
1029{
1030 int i;
1031
1032 if (!buf) {
Sean Nelson316a29f2010-05-07 20:09:04 +00001033 msg_gerr("Invalid buffer!\n");
Carl-Daniel Hailfingereaac68b2009-11-23 12:55:31 +00001034 return 1;
1035 }
1036
1037 switch (variant) {
1038 case 0:
1039 for (i = 0; i < size; i++)
1040 buf[i] = (i & 0xf) << 4 | 0x5;
1041 break;
1042 case 1:
1043 for (i = 0; i < size; i++)
1044 buf[i] = (i & 0xf) << 4 | 0xa;
1045 break;
1046 case 2:
1047 for (i = 0; i < size; i++)
1048 buf[i] = 0x50 | (i & 0xf);
1049 break;
1050 case 3:
1051 for (i = 0; i < size; i++)
1052 buf[i] = 0xa0 | (i & 0xf);
1053 break;
1054 case 4:
1055 for (i = 0; i < size; i++)
1056 buf[i] = (i & 0xf) << 4;
1057 break;
1058 case 5:
1059 for (i = 0; i < size; i++)
1060 buf[i] = i & 0xf;
1061 break;
1062 case 6:
1063 memset(buf, 0x00, size);
1064 break;
1065 case 7:
1066 memset(buf, 0xff, size);
1067 break;
1068 case 8:
1069 for (i = 0; i < size; i++)
1070 buf[i] = i & 0xff;
1071 break;
1072 case 9:
1073 for (i = 0; i < size; i++)
1074 buf[i] = ~(i & 0xff);
1075 break;
1076 case 10:
1077 for (i = 0; i < size % 2; i++) {
1078 buf[i * 2] = (i >> 8) & 0xff;
1079 buf[i * 2 + 1] = i & 0xff;
1080 }
1081 if (size & 0x1)
1082 buf[i * 2] = (i >> 8) & 0xff;
1083 break;
1084 case 11:
1085 for (i = 0; i < size % 2; i++) {
1086 buf[i * 2] = ~((i >> 8) & 0xff);
1087 buf[i * 2 + 1] = ~(i & 0xff);
1088 }
1089 if (size & 0x1)
1090 buf[i * 2] = ~((i >> 8) & 0xff);
1091 break;
1092 case 12:
1093 memset(buf, 0x00, size);
1094 break;
1095 case 13:
1096 memset(buf, 0xff, size);
1097 break;
1098 }
1099
1100 if ((variant >= 0) && (variant <= 7)) {
1101 /* Write block number in the last two bytes of each 256-byte
1102 * block, big endian for easier reading of the hexdump.
1103 * Note that this wraps around for chips larger than 2^24 bytes
1104 * (16 MB).
1105 */
1106 for (i = 0; i < size / 256; i++) {
1107 buf[i * 256 + 254] = (i >> 8) & 0xff;
1108 buf[i * 256 + 255] = i & 0xff;
1109 }
1110 }
1111
1112 return 0;
1113}
1114
Stefan Tauner9e3a6982014-08-15 17:17:59 +00001115/* Returns the number of busses commonly supported by the current programmer and flash chip where the latter
1116 * can not be completely accessed due to size/address limits of the programmer. */
1117unsigned int count_max_decode_exceedings(const struct flashctx *flash)
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001118{
Stefan Tauner9e3a6982014-08-15 17:17:59 +00001119 unsigned int limitexceeded = 0;
1120 uint32_t size = flash->chip->total_size * 1024;
1121 enum chipbustype buses = flash->mst->buses_supported & flash->chip->bustype;
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001122
1123 if ((buses & BUS_PARALLEL) && (max_rom_decode.parallel < size)) {
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001124 limitexceeded++;
Sean Nelson316a29f2010-05-07 20:09:04 +00001125 msg_pdbg("Chip size %u kB is bigger than supported "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001126 "size %u kB of chipset/board/programmer "
1127 "for %s interface, "
1128 "probe/read/erase/write may fail. ", size / 1024,
1129 max_rom_decode.parallel / 1024, "Parallel");
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001130 }
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001131 if ((buses & BUS_LPC) && (max_rom_decode.lpc < size)) {
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001132 limitexceeded++;
Sean Nelson316a29f2010-05-07 20:09:04 +00001133 msg_pdbg("Chip size %u kB is bigger than supported "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001134 "size %u kB of chipset/board/programmer "
1135 "for %s interface, "
1136 "probe/read/erase/write may fail. ", size / 1024,
1137 max_rom_decode.lpc / 1024, "LPC");
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001138 }
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001139 if ((buses & BUS_FWH) && (max_rom_decode.fwh < size)) {
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001140 limitexceeded++;
Sean Nelson316a29f2010-05-07 20:09:04 +00001141 msg_pdbg("Chip size %u kB is bigger than supported "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001142 "size %u kB of chipset/board/programmer "
1143 "for %s interface, "
1144 "probe/read/erase/write may fail. ", size / 1024,
1145 max_rom_decode.fwh / 1024, "FWH");
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001146 }
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001147 if ((buses & BUS_SPI) && (max_rom_decode.spi < size)) {
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001148 limitexceeded++;
Sean Nelson316a29f2010-05-07 20:09:04 +00001149 msg_pdbg("Chip size %u kB is bigger than supported "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001150 "size %u kB of chipset/board/programmer "
1151 "for %s interface, "
1152 "probe/read/erase/write may fail. ", size / 1024,
1153 max_rom_decode.spi / 1024, "SPI");
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001154 }
Stefan Tauner9e3a6982014-08-15 17:17:59 +00001155 return limitexceeded;
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001156}
1157
Stefan Tauner4e32ec12014-08-30 23:39:51 +00001158void unmap_flash(struct flashctx *flash)
1159{
1160 if (flash->virtual_registers != (chipaddr)ERROR_PTR) {
1161 programmer_unmap_flash_region((void *)flash->virtual_registers, flash->chip->total_size * 1024);
1162 flash->physical_registers = 0;
1163 flash->virtual_registers = (chipaddr)ERROR_PTR;
1164 }
1165
1166 if (flash->virtual_memory != (chipaddr)ERROR_PTR) {
1167 programmer_unmap_flash_region((void *)flash->virtual_memory, flash->chip->total_size * 1024);
1168 flash->physical_memory = 0;
1169 flash->virtual_memory = (chipaddr)ERROR_PTR;
1170 }
1171}
1172
1173int map_flash(struct flashctx *flash)
1174{
1175 /* Init pointers to the fail-safe state to distinguish them later from legit values. */
1176 flash->virtual_memory = (chipaddr)ERROR_PTR;
1177 flash->virtual_registers = (chipaddr)ERROR_PTR;
1178
1179 /* FIXME: This avoids mapping (and unmapping) of flash chip definitions with size 0.
1180 * These are used for various probing-related hacks that would not map successfully anyway and should be
1181 * removed ASAP. */
1182 if (flash->chip->total_size == 0)
1183 return 0;
1184
1185 const chipsize_t size = flash->chip->total_size * 1024;
1186 uintptr_t base = flashbase ? flashbase : (0xffffffff - size + 1);
1187 void *addr = programmer_map_flash_region(flash->chip->name, base, size);
1188 if (addr == ERROR_PTR) {
1189 msg_perr("Could not map flash chip %s at 0x%0*" PRIxPTR ".\n",
1190 flash->chip->name, PRIxPTR_WIDTH, base);
1191 return 1;
1192 }
1193 flash->physical_memory = base;
1194 flash->virtual_memory = (chipaddr)addr;
1195
1196 /* FIXME: Special function registers normally live 4 MByte below flash space, but it might be somewhere
1197 * completely different on some chips and programmers, or not mappable at all.
1198 * Ignore these problems for now and always report success. */
1199 if (flash->chip->feature_bits & FEATURE_REGISTERMAP) {
1200 base = 0xffffffff - size - 0x400000 + 1;
1201 addr = programmer_map_flash_region("flash chip registers", base, size);
1202 if (addr == ERROR_PTR) {
1203 msg_pdbg2("Could not map flash chip registers %s at 0x%0*" PRIxPTR ".\n",
1204 flash->chip->name, PRIxPTR_WIDTH, base);
1205 return 0;
1206 }
1207 flash->physical_registers = base;
1208 flash->virtual_registers = (chipaddr)addr;
1209 }
1210 return 0;
1211}
1212
Nico Huber2d625722016-05-03 10:48:02 +02001213/*
1214 * Return a string corresponding to the bustype parameter.
1215 * Memory is obtained with malloc() and must be freed with free() by the caller.
1216 */
1217char *flashbuses_to_text(enum chipbustype bustype)
1218{
1219 char *ret = calloc(1, 1);
1220 /*
1221 * FIXME: Once all chipsets and flash chips have been updated, NONSPI
1222 * will cease to exist and should be eliminated here as well.
1223 */
1224 if (bustype == BUS_NONSPI) {
1225 ret = strcat_realloc(ret, "Non-SPI, ");
1226 } else {
1227 if (bustype & BUS_PARALLEL)
1228 ret = strcat_realloc(ret, "Parallel, ");
1229 if (bustype & BUS_LPC)
1230 ret = strcat_realloc(ret, "LPC, ");
1231 if (bustype & BUS_FWH)
1232 ret = strcat_realloc(ret, "FWH, ");
1233 if (bustype & BUS_SPI)
1234 ret = strcat_realloc(ret, "SPI, ");
1235 if (bustype & BUS_PROG)
1236 ret = strcat_realloc(ret, "Programmer-specific, ");
1237 if (bustype == BUS_NONE)
1238 ret = strcat_realloc(ret, "None, ");
1239 }
1240 /* Kill last comma. */
1241 ret[strlen(ret) - 2] = '\0';
1242 ret = realloc(ret, strlen(ret) + 1);
1243 return ret;
1244}
1245
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +00001246int probe_flash(struct registered_master *mst, int startchip, struct flashctx *flash, int force)
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001247{
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001248 const struct flashchip *chip;
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001249 enum chipbustype buses_common;
Carl-Daniel Hailfingerb22918c2009-06-01 02:08:58 +00001250 char *tmp;
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001251
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001252 for (chip = flashchips + startchip; chip && chip->name; chip++) {
1253 if (chip_to_probe && strcmp(chip->name, chip_to_probe) != 0)
Ollie Lhocbbf1252004-03-17 22:22:08 +00001254 continue;
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +00001255 buses_common = mst->buses_supported & chip->bustype;
Carl-Daniel Hailfingerc40cff72011-12-20 00:19:29 +00001256 if (!buses_common)
Carl-Daniel Hailfinger6573b742011-06-17 22:38:53 +00001257 continue;
Mike Banon31b5e3b2018-01-15 01:10:00 +03001258 /* Only probe for SPI25 chips by default. */
1259 if (chip->bustype == BUS_SPI && !chip_to_probe && chip->spi_cmd_set != SPI25)
1260 continue;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001261 msg_gdbg("Probing for %s %s, %d kB: ", chip->vendor, chip->name, chip->total_size);
1262 if (!chip->probe && !force) {
1263 msg_gdbg("failed! flashrom has no probe function for this flash chip.\n");
Carl-Daniel Hailfingerb22918c2009-06-01 02:08:58 +00001264 continue;
1265 }
Stefan Reinauer70385642007-04-06 11:58:03 +00001266
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001267 /* Start filling in the dynamic data. */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001268 flash->chip = calloc(1, sizeof(struct flashchip));
1269 if (!flash->chip) {
1270 msg_gerr("Out of memory!\n");
1271 exit(1);
1272 }
1273 memcpy(flash->chip, chip, sizeof(struct flashchip));
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +00001274 flash->mst = mst;
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001275
Stefan Tauner4e32ec12014-08-30 23:39:51 +00001276 if (map_flash(flash) != 0)
Martin Schiller57a3b732017-11-23 06:24:57 +01001277 goto notfound;
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001278
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001279 /* We handle a forced match like a real match, we just avoid probing. Note that probe_flash()
1280 * is only called with force=1 after normal probing failed.
1281 */
Peter Stuge27c3e2d2008-07-02 17:15:47 +00001282 if (force)
1283 break;
Stefan Reinauerfcb63682006-03-16 16:57:41 +00001284
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001285 if (flash->chip->probe(flash) != 1)
Peter Stuge483b8f02008-09-03 23:10:05 +00001286 goto notfound;
1287
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001288 /* If this is the first chip found, accept it.
1289 * If this is not the first chip found, accept it only if it is
Stefan Taunerac1b4c82012-02-17 14:51:04 +00001290 * a non-generic match. SFDP and CFI are generic matches.
1291 * startchip==0 means this call to probe_flash() is the first
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +00001292 * one for this programmer interface (master) and thus no other chip has
Stefan Taunerac1b4c82012-02-17 14:51:04 +00001293 * been found on this interface.
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001294 */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001295 if (startchip == 0 && flash->chip->model_id == SFDP_DEVICE_ID) {
Stefan Taunerac1b4c82012-02-17 14:51:04 +00001296 msg_cinfo("===\n"
1297 "SFDP has autodetected a flash chip which is "
1298 "not natively supported by flashrom yet.\n");
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001299 if (count_usable_erasers(flash) == 0)
Stefan Taunerac1b4c82012-02-17 14:51:04 +00001300 msg_cinfo("The standard operations read and "
1301 "verify should work, but to support "
1302 "erase, write and all other "
1303 "possible features");
1304 else
1305 msg_cinfo("All standard operations (read, "
1306 "verify, erase and write) should "
1307 "work, but to support all possible "
1308 "features");
1309
Stefan Taunerb4e06bd2012-08-20 00:24:22 +00001310 msg_cinfo(" we need to add them manually.\n"
1311 "You can help us by mailing us the output of the following command to "
1312 "flashrom@flashrom.org:\n"
1313 "'flashrom -VV [plus the -p/--programmer parameter]'\n"
1314 "Thanks for your help!\n"
Stefan Taunerac1b4c82012-02-17 14:51:04 +00001315 "===\n");
1316 }
1317
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001318 /* First flash chip detected on this bus. */
1319 if (startchip == 0)
Peter Stuge27c3e2d2008-07-02 17:15:47 +00001320 break;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001321 /* Not the first flash chip detected on this bus, but not a generic match either. */
1322 if ((flash->chip->model_id != GENERIC_DEVICE_ID) && (flash->chip->model_id != SFDP_DEVICE_ID))
1323 break;
1324 /* 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 +00001325notfound:
Stefan Tauner4e32ec12014-08-30 23:39:51 +00001326 unmap_flash(flash);
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001327 free(flash->chip);
1328 flash->chip = NULL;
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001329 }
Uwe Hermannffec5f32007-08-23 16:08:21 +00001330
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001331 if (!flash->chip)
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001332 return -1;
Peter Stuge27c3e2d2008-07-02 17:15:47 +00001333
Nico Huber7af0e792016-04-29 16:40:15 +02001334 /* Fill fallback layout covering the whole chip. */
1335 struct single_layout *const fallback = &flash->fallback_layout;
1336 fallback->base.entries = &fallback->entry;
1337 fallback->base.num_entries = 1;
1338 fallback->entry.start = 0;
1339 fallback->entry.end = flash->chip->total_size * 1024 - 1;
1340 fallback->entry.included = true;
Nico Huber70461a92019-06-15 14:56:19 +02001341 fallback->entry.name = strdup("complete flash");
1342 if (!fallback->entry.name) {
1343 msg_cerr("Failed to probe chip: %s\n", strerror(errno));
1344 return -1;
1345 }
Stefan Reinauer051e2362011-01-19 06:21:54 +00001346
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001347 tmp = flashbuses_to_text(flash->chip->bustype);
Stefan Tauner4e32ec12014-08-30 23:39:51 +00001348 msg_cinfo("%s %s flash chip \"%s\" (%d kB, %s) ", force ? "Assuming" : "Found",
1349 flash->chip->vendor, flash->chip->name, flash->chip->total_size, tmp);
Stefan Tauner00155492011-06-26 20:45:35 +00001350 free(tmp);
Stefan Tauner4e32ec12014-08-30 23:39:51 +00001351#if CONFIG_INTERNAL == 1
1352 if (programmer_table[programmer].map_flash_region == physmap)
1353 msg_cinfo("mapped at physical address 0x%0*" PRIxPTR ".\n",
1354 PRIxPTR_WIDTH, flash->physical_memory);
1355 else
1356#endif
1357 msg_cinfo("on %s.\n", programmer_table[programmer].name);
Uwe Hermann9899cad2009-06-28 21:47:57 +00001358
Stefan Tauner4e32ec12014-08-30 23:39:51 +00001359 /* Flash registers may more likely not be mapped if the chip was forced.
1360 * Lock info may be stored in registers, so avoid lock info printing. */
Carl-Daniel Hailfinger859f3f02010-12-02 21:59:42 +00001361 if (!force)
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001362 if (flash->chip->printlock)
1363 flash->chip->printlock(flash);
Sean Nelson6e0b9122010-02-19 00:52:10 +00001364
Stefan Tauner4e32ec12014-08-30 23:39:51 +00001365 /* Get out of the way for later runs. */
1366 unmap_flash(flash);
1367
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001368 /* Return position of matching chip. */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001369 return chip - flashchips;
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001370}
1371
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001372int read_buf_from_file(unsigned char *buf, unsigned long size,
1373 const char *filename)
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001374{
Nico Huber7562f7d2013-08-30 21:29:45 +00001375#ifdef __LIBPAYLOAD__
1376 msg_gerr("Error: No file I/O support in libpayload\n");
1377 return 1;
1378#else
Stefan Tauner16687702015-12-25 21:59:45 +00001379 int ret = 0;
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001380
Stefan Tauner16687702015-12-25 21:59:45 +00001381 FILE *image;
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001382 if ((image = fopen(filename, "rb")) == NULL) {
Stefan Tauner363fd7e2013-04-07 13:08:30 +00001383 msg_gerr("Error: opening file \"%s\" failed: %s\n", filename, strerror(errno));
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001384 return 1;
1385 }
Stefan Tauner16687702015-12-25 21:59:45 +00001386
1387 struct stat image_stat;
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001388 if (fstat(fileno(image), &image_stat) != 0) {
Stefan Tauner363fd7e2013-04-07 13:08:30 +00001389 msg_gerr("Error: getting metadata of file \"%s\" failed: %s\n", filename, strerror(errno));
Stefan Tauner16687702015-12-25 21:59:45 +00001390 ret = 1;
1391 goto out;
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001392 }
1393 if (image_stat.st_size != size) {
Carl-Daniel Hailfinger11990da2013-07-13 23:21:05 +00001394 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 +00001395 (intmax_t)image_stat.st_size, size);
Stefan Tauner16687702015-12-25 21:59:45 +00001396 ret = 1;
1397 goto out;
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001398 }
Stefan Tauner16687702015-12-25 21:59:45 +00001399
1400 unsigned long numbytes = fread(buf, 1, size, image);
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001401 if (numbytes != size) {
1402 msg_gerr("Error: Failed to read complete file. Got %ld bytes, "
1403 "wanted %ld!\n", numbytes, size);
Stefan Tauner16687702015-12-25 21:59:45 +00001404 ret = 1;
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001405 }
Stefan Tauner16687702015-12-25 21:59:45 +00001406out:
1407 (void)fclose(image);
1408 return ret;
Nico Huber7562f7d2013-08-30 21:29:45 +00001409#endif
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001410}
1411
Mark Marshallf20b7be2014-05-09 21:16:21 +00001412int write_buf_to_file(const unsigned char *buf, unsigned long size, const char *filename)
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001413{
Nico Huber7562f7d2013-08-30 21:29:45 +00001414#ifdef __LIBPAYLOAD__
1415 msg_gerr("Error: No file I/O support in libpayload\n");
1416 return 1;
1417#else
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001418 FILE *image;
Stefan Tauner16687702015-12-25 21:59:45 +00001419 int ret = 0;
Stephan Guilloux21dd55b2009-06-01 22:07:52 +00001420
1421 if (!filename) {
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001422 msg_gerr("No filename specified.\n");
Stephan Guilloux21dd55b2009-06-01 22:07:52 +00001423 return 1;
1424 }
Patrick Georgi0bf842d2010-01-25 22:55:33 +00001425 if ((image = fopen(filename, "wb")) == NULL) {
Stefan Tauner363fd7e2013-04-07 13:08:30 +00001426 msg_gerr("Error: opening file \"%s\" failed: %s\n", filename, strerror(errno));
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00001427 return 1;
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001428 }
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001429
Stefan Tauner16687702015-12-25 21:59:45 +00001430 unsigned long numbytes = fwrite(buf, 1, size, image);
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001431 if (numbytes != size) {
Stefan Tauner16687702015-12-25 21:59:45 +00001432 msg_gerr("Error: file %s could not be written completely.\n", filename);
1433 ret = 1;
1434 goto out;
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001435 }
Stefan Tauner16687702015-12-25 21:59:45 +00001436 if (fflush(image)) {
1437 msg_gerr("Error: flushing file \"%s\" failed: %s\n", filename, strerror(errno));
1438 ret = 1;
1439 }
1440 // Try to fsync() only regular files and if that function is available at all (e.g. not on MinGW).
1441#if defined(_POSIX_FSYNC) && (_POSIX_FSYNC != -1)
1442 struct stat image_stat;
1443 if (fstat(fileno(image), &image_stat) != 0) {
1444 msg_gerr("Error: getting metadata of file \"%s\" failed: %s\n", filename, strerror(errno));
1445 ret = 1;
1446 goto out;
1447 }
1448 if (S_ISREG(image_stat.st_mode)) {
1449 if (fsync(fileno(image))) {
1450 msg_gerr("Error: fsyncing file \"%s\" failed: %s\n", filename, strerror(errno));
1451 ret = 1;
1452 }
1453 }
1454#endif
1455out:
1456 if (fclose(image)) {
1457 msg_gerr("Error: closing file \"%s\" failed: %s\n", filename, strerror(errno));
1458 ret = 1;
1459 }
1460 return ret;
Nico Huber7562f7d2013-08-30 21:29:45 +00001461#endif
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001462}
1463
Nico Huber899e4ec2016-04-29 18:39:01 +02001464static int read_by_layout(struct flashctx *, uint8_t *);
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001465int read_flash_to_file(struct flashctx *flash, const char *filename)
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001466{
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001467 unsigned long size = flash->chip->total_size * 1024;
Richard Hughes84b453e2018-12-19 15:30:39 +00001468 unsigned char *buf = calloc(size, sizeof(unsigned char));
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001469 int ret = 0;
1470
1471 msg_cinfo("Reading flash... ");
1472 if (!buf) {
1473 msg_gerr("Memory allocation failed!\n");
1474 msg_cinfo("FAILED.\n");
1475 return 1;
1476 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001477 if (!flash->chip->read) {
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001478 msg_cerr("No read function available for this flash chip.\n");
1479 ret = 1;
1480 goto out_free;
1481 }
Nico Huber899e4ec2016-04-29 18:39:01 +02001482 if (read_by_layout(flash, buf)) {
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001483 msg_cerr("Read operation failed!\n");
1484 ret = 1;
1485 goto out_free;
1486 }
1487
Stefan Tauner355cbfd2011-05-28 02:37:14 +00001488 ret = write_buf_to_file(buf, size, filename);
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001489out_free:
1490 free(buf);
1491 msg_cinfo("%s.\n", ret ? "FAILED" : "done");
1492 return ret;
1493}
1494
Stefan Tauner96658be2014-05-26 22:05:31 +00001495/* Even if an error is found, the function will keep going and check the rest. */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001496static int selfcheck_eraseblocks(const struct flashchip *chip)
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001497{
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +00001498 int i, j, k;
1499 int ret = 0;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001500
1501 for (k = 0; k < NUM_ERASEFUNCTIONS; k++) {
1502 unsigned int done = 0;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001503 struct block_eraser eraser = chip->block_erasers[k];
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001504
1505 for (i = 0; i < NUM_ERASEREGIONS; i++) {
1506 /* Blocks with zero size are bugs in flashchips.c. */
1507 if (eraser.eraseblocks[i].count &&
1508 !eraser.eraseblocks[i].size) {
1509 msg_gerr("ERROR: Flash chip %s erase function "
1510 "%i region %i has size 0. Please report"
1511 " a bug at flashrom@flashrom.org\n",
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001512 chip->name, k, i);
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001513 ret = 1;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001514 }
1515 /* Blocks with zero count are bugs in flashchips.c. */
1516 if (!eraser.eraseblocks[i].count &&
1517 eraser.eraseblocks[i].size) {
1518 msg_gerr("ERROR: Flash chip %s erase function "
1519 "%i region %i has count 0. Please report"
1520 " a bug at flashrom@flashrom.org\n",
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001521 chip->name, k, i);
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001522 ret = 1;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001523 }
1524 done += eraser.eraseblocks[i].count *
1525 eraser.eraseblocks[i].size;
1526 }
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001527 /* Empty eraseblock definition with erase function. */
1528 if (!done && eraser.block_erase)
Sean Nelson316a29f2010-05-07 20:09:04 +00001529 msg_gspew("Strange: Empty eraseblock definition with "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001530 "non-empty erase function. Not an error.\n");
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001531 if (!done)
1532 continue;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001533 if (done != chip->total_size * 1024) {
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001534 msg_gerr("ERROR: Flash chip %s erase function %i "
1535 "region walking resulted in 0x%06x bytes total,"
1536 " expected 0x%06x bytes. Please report a bug at"
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001537 " flashrom@flashrom.org\n", chip->name, k,
1538 done, chip->total_size * 1024);
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001539 ret = 1;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001540 }
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001541 if (!eraser.block_erase)
1542 continue;
1543 /* Check if there are identical erase functions for different
1544 * layouts. That would imply "magic" erase functions. The
1545 * easiest way to check this is with function pointers.
1546 */
Uwe Hermann43959702010-03-13 17:28:29 +00001547 for (j = k + 1; j < NUM_ERASEFUNCTIONS; j++) {
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001548 if (eraser.block_erase ==
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001549 chip->block_erasers[j].block_erase) {
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001550 msg_gerr("ERROR: Flash chip %s erase function "
1551 "%i and %i are identical. Please report"
1552 " a bug at flashrom@flashrom.org\n",
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001553 chip->name, k, j);
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001554 ret = 1;
1555 }
Uwe Hermann43959702010-03-13 17:28:29 +00001556 }
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001557 }
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001558 return ret;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001559}
1560
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001561static int check_block_eraser(const struct flashctx *flash, int k, int log)
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001562{
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001563 struct block_eraser eraser = flash->chip->block_erasers[k];
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001564
1565 if (!eraser.block_erase && !eraser.eraseblocks[0].count) {
1566 if (log)
1567 msg_cdbg("not defined. ");
1568 return 1;
1569 }
1570 if (!eraser.block_erase && eraser.eraseblocks[0].count) {
1571 if (log)
1572 msg_cdbg("eraseblock layout is known, but matching "
Stefan Tauner355cbfd2011-05-28 02:37:14 +00001573 "block erase function is not implemented. ");
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001574 return 1;
1575 }
1576 if (eraser.block_erase && !eraser.eraseblocks[0].count) {
1577 if (log)
1578 msg_cdbg("block erase function found, but "
Stefan Tauner355cbfd2011-05-28 02:37:14 +00001579 "eraseblock layout is not defined. ");
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001580 return 1;
1581 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001582 // TODO: Once erase functions are annotated with allowed buses, check that as well.
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001583 return 0;
1584}
1585
Nico Huber7af0e792016-04-29 16:40:15 +02001586/**
1587 * @brief Reads the included layout regions into a buffer.
1588 *
1589 * If there is no layout set in the given flash context, the whole chip will
1590 * be read.
1591 *
1592 * @param flashctx Flash context to be used.
1593 * @param buffer Buffer of full chip size to read into.
1594 * @return 0 on success,
1595 * 1 if any read fails.
1596 */
1597static int read_by_layout(struct flashctx *const flashctx, uint8_t *const buffer)
1598{
1599 const struct flashrom_layout *const layout = get_layout(flashctx);
Nico Huber5ca55232019-06-15 22:29:08 +02001600 const struct romentry *entry = NULL;
Nico Huber7af0e792016-04-29 16:40:15 +02001601
Nico Huber5ca55232019-06-15 22:29:08 +02001602 while ((entry = layout_next_included(layout, entry))) {
1603 const chipoff_t region_start = entry->start;
1604 const chipsize_t region_len = entry->end - entry->start + 1;
Nico Huber7af0e792016-04-29 16:40:15 +02001605
1606 if (flashctx->chip->read(flashctx, buffer + region_start, region_start, region_len))
1607 return 1;
1608 }
1609 return 0;
1610}
1611
1612typedef int (*erasefn_t)(struct flashctx *, unsigned int addr, unsigned int len);
1613/**
1614 * @private
1615 *
1616 * For read-erase-write, `curcontents` and `newcontents` shall point
1617 * to buffers of the chip's size. Both are supposed to be prefilled
1618 * with at least the included layout regions of the current flash
1619 * contents (`curcontents`) and the data to be written to the flash
1620 * (`newcontents`).
1621 *
1622 * For erase, `curcontents` and `newcontents` shall be NULL-pointers.
1623 *
1624 * The `chipoff_t` values are used internally by `walk_by_layout()`.
1625 */
1626struct walk_info {
1627 uint8_t *curcontents;
1628 const uint8_t *newcontents;
1629 chipoff_t region_start;
1630 chipoff_t region_end;
1631 chipoff_t erase_start;
1632 chipoff_t erase_end;
1633};
1634/* returns 0 on success, 1 to retry with another erase function, 2 for immediate abort */
1635typedef int (*per_blockfn_t)(struct flashctx *, const struct walk_info *, erasefn_t);
1636
1637static int walk_eraseblocks(struct flashctx *const flashctx,
1638 struct walk_info *const info,
1639 const size_t erasefunction, const per_blockfn_t per_blockfn)
1640{
1641 int ret;
1642 size_t i, j;
1643 bool first = true;
1644 struct block_eraser *const eraser = &flashctx->chip->block_erasers[erasefunction];
1645
1646 info->erase_start = 0;
1647 for (i = 0; i < NUM_ERASEREGIONS; ++i) {
1648 /* count==0 for all automatically initialized array
1649 members so the loop below won't be executed for them. */
1650 for (j = 0; j < eraser->eraseblocks[i].count; ++j, info->erase_start = info->erase_end + 1) {
1651 info->erase_end = info->erase_start + eraser->eraseblocks[i].size - 1;
1652
1653 /* Skip any eraseblock that is completely outside the current region. */
1654 if (info->erase_end < info->region_start)
1655 continue;
1656 if (info->region_end < info->erase_start)
1657 break;
1658
1659 /* Print this for every block except the first one. */
1660 if (first)
1661 first = false;
1662 else
1663 msg_cdbg(", ");
1664 msg_cdbg("0x%06x-0x%06x:", info->erase_start, info->erase_end);
1665
1666 ret = per_blockfn(flashctx, info, eraser->block_erase);
1667 if (ret)
1668 return ret;
1669 }
1670 if (info->region_end < info->erase_start)
1671 break;
1672 }
1673 msg_cdbg("\n");
1674 return 0;
1675}
1676
1677static int walk_by_layout(struct flashctx *const flashctx, struct walk_info *const info,
1678 const per_blockfn_t per_blockfn)
1679{
1680 const struct flashrom_layout *const layout = get_layout(flashctx);
Nico Huber5ca55232019-06-15 22:29:08 +02001681 const struct romentry *entry = NULL;
Nico Huber7af0e792016-04-29 16:40:15 +02001682
1683 all_skipped = true;
1684 msg_cinfo("Erasing and writing flash chip... ");
1685
Nico Huber5ca55232019-06-15 22:29:08 +02001686 while ((entry = layout_next_included(layout, entry))) {
1687 info->region_start = entry->start;
1688 info->region_end = entry->end;
Nico Huber7af0e792016-04-29 16:40:15 +02001689
1690 size_t j;
1691 int error = 1; /* retry as long as it's 1 */
1692 for (j = 0; j < NUM_ERASEFUNCTIONS; ++j) {
1693 if (j != 0)
1694 msg_cinfo("Looking for another erase function.\n");
1695 msg_cdbg("Trying erase function %zi... ", j);
1696 if (check_block_eraser(flashctx, j, 1))
1697 continue;
1698
1699 error = walk_eraseblocks(flashctx, info, j, per_blockfn);
1700 if (error != 1)
1701 break;
1702
1703 if (info->curcontents) {
1704 msg_cinfo("Reading current flash chip contents... ");
1705 if (read_by_layout(flashctx, info->curcontents)) {
1706 /* Now we are truly screwed. Read failed as well. */
1707 msg_cerr("Can't read anymore! Aborting.\n");
1708 /* We have no idea about the flash chip contents, so
1709 retrying with another erase function is pointless. */
1710 error = 2;
1711 break;
1712 }
1713 msg_cinfo("done. ");
1714 }
1715 }
1716 if (error == 1)
1717 msg_cinfo("No usable erase functions left.\n");
1718 if (error) {
1719 msg_cerr("FAILED!\n");
1720 return 1;
1721 }
1722 }
1723 if (all_skipped)
1724 msg_cinfo("\nWarning: Chip content is identical to the requested image.\n");
1725 msg_cinfo("Erase/write done.\n");
1726 return 0;
1727}
1728
1729static int erase_block(struct flashctx *const flashctx,
1730 const struct walk_info *const info, const erasefn_t erasefn)
1731{
1732 const unsigned int erase_len = info->erase_end + 1 - info->erase_start;
Nico Huber6e61e0c2019-01-23 17:07:49 +01001733 const bool region_unaligned = info->region_start > info->erase_start ||
1734 info->erase_end > info->region_end;
1735 uint8_t *backup_contents = NULL, *erased_contents = NULL;
1736 int ret = 2;
Nico Huber7af0e792016-04-29 16:40:15 +02001737
Nico Huber6e61e0c2019-01-23 17:07:49 +01001738 /*
1739 * If the region is not erase-block aligned, merge current flash con-
1740 * tents into a new buffer `backup_contents`.
1741 */
1742 if (region_unaligned) {
1743 backup_contents = malloc(erase_len);
1744 erased_contents = malloc(erase_len);
1745 if (!backup_contents || !erased_contents) {
1746 msg_cerr("Out of memory!\n");
1747 ret = 1;
1748 goto _free_ret;
1749 }
1750 memset(backup_contents, ERASED_VALUE(flashctx), erase_len);
1751 memset(erased_contents, ERASED_VALUE(flashctx), erase_len);
1752
1753 msg_cdbg("R");
1754 /* Merge data preceding the current region. */
1755 if (info->region_start > info->erase_start) {
1756 const chipoff_t start = info->erase_start;
1757 const chipsize_t len = info->region_start - info->erase_start;
1758 if (flashctx->chip->read(flashctx, backup_contents, start, len)) {
1759 msg_cerr("Can't read! Aborting.\n");
1760 goto _free_ret;
1761 }
1762 }
1763 /* Merge data following the current region. */
1764 if (info->erase_end > info->region_end) {
1765 const chipoff_t start = info->region_end + 1;
1766 const chipoff_t rel_start = start - info->erase_start; /* within this erase block */
1767 const chipsize_t len = info->erase_end - info->region_end;
1768 if (flashctx->chip->read(flashctx, backup_contents + rel_start, start, len)) {
1769 msg_cerr("Can't read! Aborting.\n");
1770 goto _free_ret;
1771 }
1772 }
1773 }
1774
1775 ret = 1;
Nico Huber7af0e792016-04-29 16:40:15 +02001776 all_skipped = false;
1777
1778 msg_cdbg("E");
1779 if (erasefn(flashctx, info->erase_start, erase_len))
Nico Huber6e61e0c2019-01-23 17:07:49 +01001780 goto _free_ret;
Nico Huber7af0e792016-04-29 16:40:15 +02001781 if (check_erased_range(flashctx, info->erase_start, erase_len)) {
1782 msg_cerr("ERASE FAILED!\n");
Nico Huber6e61e0c2019-01-23 17:07:49 +01001783 goto _free_ret;
Nico Huber7af0e792016-04-29 16:40:15 +02001784 }
Nico Huber6e61e0c2019-01-23 17:07:49 +01001785
1786 if (region_unaligned) {
1787 unsigned int starthere = 0, lenhere = 0, writecount = 0;
1788 /* get_next_write() sets starthere to a new value after the call. */
1789 while ((lenhere = get_next_write(erased_contents + starthere, backup_contents + starthere,
1790 erase_len - starthere, &starthere, flashctx->chip->gran))) {
1791 if (!writecount++)
1792 msg_cdbg("W");
1793 /* Needs the partial write function signature. */
1794 if (flashctx->chip->write(flashctx, backup_contents + starthere,
1795 info->erase_start + starthere, lenhere))
1796 goto _free_ret;
1797 starthere += lenhere;
1798 }
1799 }
1800
1801 ret = 0;
1802
1803_free_ret:
1804 free(erased_contents);
1805 free(backup_contents);
1806 return ret;
Nico Huber7af0e792016-04-29 16:40:15 +02001807}
1808
1809/**
1810 * @brief Erases the included layout regions.
1811 *
1812 * If there is no layout set in the given flash context, the whole chip will
1813 * be erased.
1814 *
1815 * @param flashctx Flash context to be used.
1816 * @param buffer Buffer of full chip size to read into.
1817 * @return 0 on success,
1818 * 1 if all available erase functions failed.
1819 */
Nico Huber454f6132012-12-10 13:34:10 +00001820static int erase_by_layout(struct flashctx *const flashctx)
Nico Huber7af0e792016-04-29 16:40:15 +02001821{
1822 struct walk_info info = { 0 };
1823 return walk_by_layout(flashctx, &info, &erase_block);
1824}
1825
1826static int read_erase_write_block(struct flashctx *const flashctx,
1827 const struct walk_info *const info, const erasefn_t erasefn)
1828{
1829 const chipsize_t erase_len = info->erase_end + 1 - info->erase_start;
1830 const bool region_unaligned = info->region_start > info->erase_start ||
1831 info->erase_end > info->region_end;
1832 const uint8_t *newcontents = NULL;
1833 int ret = 2;
1834
1835 /*
1836 * If the region is not erase-block aligned, merge current flash con-
1837 * tents into `info->curcontents` and a new buffer `newc`. The former
1838 * is necessary since we have no guarantee that the full erase block
1839 * was already read into `info->curcontents`. For the latter a new
1840 * buffer is used since `info->newcontents` might contain data for
1841 * other unaligned regions that touch this erase block too.
1842 */
1843 if (region_unaligned) {
1844 msg_cdbg("R");
1845 uint8_t *const newc = malloc(erase_len);
1846 if (!newc) {
1847 msg_cerr("Out of memory!\n");
1848 return 1;
1849 }
1850 memcpy(newc, info->newcontents + info->erase_start, erase_len);
1851
1852 /* Merge data preceding the current region. */
1853 if (info->region_start > info->erase_start) {
1854 const chipoff_t start = info->erase_start;
1855 const chipsize_t len = info->region_start - info->erase_start;
1856 if (flashctx->chip->read(flashctx, newc, start, len)) {
1857 msg_cerr("Can't read! Aborting.\n");
1858 goto _free_ret;
1859 }
1860 memcpy(info->curcontents + start, newc, len);
1861 }
1862 /* Merge data following the current region. */
1863 if (info->erase_end > info->region_end) {
1864 const chipoff_t start = info->region_end + 1;
1865 const chipoff_t rel_start = start - info->erase_start; /* within this erase block */
1866 const chipsize_t len = info->erase_end - info->region_end;
1867 if (flashctx->chip->read(flashctx, newc + rel_start, start, len)) {
1868 msg_cerr("Can't read! Aborting.\n");
1869 goto _free_ret;
1870 }
1871 memcpy(info->curcontents + start, newc + rel_start, len);
1872 }
1873
1874 newcontents = newc;
1875 } else {
1876 newcontents = info->newcontents + info->erase_start;
1877 }
1878
1879 ret = 1;
1880 bool skipped = true;
1881 uint8_t *const curcontents = info->curcontents + info->erase_start;
Paul Kocialkowski995f7552018-01-15 01:06:09 +03001882 const uint8_t erased_value = ERASED_VALUE(flashctx);
David Hendricksf9a30552015-05-23 20:30:30 -07001883 if (!(flashctx->chip->feature_bits & FEATURE_NO_ERASE) &&
1884 need_erase(curcontents, newcontents, erase_len, flashctx->chip->gran, erased_value)) {
Nico Huber7af0e792016-04-29 16:40:15 +02001885 if (erase_block(flashctx, info, erasefn))
1886 goto _free_ret;
1887 /* Erase was successful. Adjust curcontents. */
Paul Kocialkowski995f7552018-01-15 01:06:09 +03001888 memset(curcontents, erased_value, erase_len);
Nico Huber7af0e792016-04-29 16:40:15 +02001889 skipped = false;
1890 }
1891
1892 unsigned int starthere = 0, lenhere = 0, writecount = 0;
1893 /* get_next_write() sets starthere to a new value after the call. */
1894 while ((lenhere = get_next_write(curcontents + starthere, newcontents + starthere,
1895 erase_len - starthere, &starthere, flashctx->chip->gran))) {
1896 if (!writecount++)
1897 msg_cdbg("W");
1898 /* Needs the partial write function signature. */
1899 if (flashctx->chip->write(flashctx, newcontents + starthere,
1900 info->erase_start + starthere, lenhere))
1901 goto _free_ret;
1902 starthere += lenhere;
1903 skipped = false;
1904 }
1905 if (skipped)
1906 msg_cdbg("S");
1907 else
1908 all_skipped = false;
1909
1910 /* Update curcontents, other regions with overlapping erase blocks
1911 might rely on this. */
1912 memcpy(curcontents, newcontents, erase_len);
1913 ret = 0;
1914
1915_free_ret:
1916 if (region_unaligned)
1917 free((void *)newcontents);
1918 return ret;
1919}
1920
1921/**
1922 * @brief Writes the included layout regions from a given image.
1923 *
1924 * If there is no layout set in the given flash context, the whole image
1925 * will be written.
1926 *
1927 * @param flashctx Flash context to be used.
1928 * @param curcontents A buffer of full chip size with current chip contents of included regions.
1929 * @param newcontents The new image to be written.
1930 * @return 0 on success,
1931 * 1 if anything has gone wrong.
1932 */
Nico Huber454f6132012-12-10 13:34:10 +00001933static int write_by_layout(struct flashctx *const flashctx,
1934 void *const curcontents, const void *const newcontents)
Nico Huber7af0e792016-04-29 16:40:15 +02001935{
1936 struct walk_info info;
1937 info.curcontents = curcontents;
1938 info.newcontents = newcontents;
1939 return walk_by_layout(flashctx, &info, read_erase_write_block);
1940}
1941
1942/**
1943 * @brief Compares the included layout regions with content from a buffer.
1944 *
1945 * If there is no layout set in the given flash context, the whole chip's
1946 * contents will be compared.
1947 *
1948 * @param flashctx Flash context to be used.
1949 * @param curcontents A buffer of full chip size to read current chip contents into.
1950 * @param newcontents The new image to compare to.
1951 * @return 0 on success,
1952 * 1 if reading failed,
1953 * 3 if the contents don't match.
1954 */
Nico Huber454f6132012-12-10 13:34:10 +00001955static int verify_by_layout(struct flashctx *const flashctx,
1956 void *const curcontents, const uint8_t *const newcontents)
Nico Huber7af0e792016-04-29 16:40:15 +02001957{
1958 const struct flashrom_layout *const layout = get_layout(flashctx);
Nico Huber5ca55232019-06-15 22:29:08 +02001959 const struct romentry *entry = NULL;
Nico Huber7af0e792016-04-29 16:40:15 +02001960
Nico Huber5ca55232019-06-15 22:29:08 +02001961 while ((entry = layout_next_included(layout, entry))) {
1962 const chipoff_t region_start = entry->start;
1963 const chipsize_t region_len = entry->end - entry->start + 1;
Nico Huber7af0e792016-04-29 16:40:15 +02001964
1965 if (flashctx->chip->read(flashctx, curcontents + region_start, region_start, region_len))
1966 return 1;
1967 if (compare_range(newcontents + region_start, curcontents + region_start,
1968 region_start, region_len))
1969 return 3;
1970 }
1971 return 0;
1972}
1973
Stefan Tauner136388f2013-07-15 10:47:53 +00001974static void nonfatal_help_message(void)
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001975{
Stefan Taunera58f6e92014-05-10 09:25:44 +00001976 msg_gerr("Good, writing to the flash chip apparently didn't do anything.\n");
Stefan Tauner136388f2013-07-15 10:47:53 +00001977#if CONFIG_INTERNAL == 1
1978 if (programmer == PROGRAMMER_INTERNAL)
1979 msg_gerr("This means we have to add special support for your board, programmer or flash\n"
1980 "chip. Please report this on IRC at chat.freenode.net (channel #flashrom) or\n"
1981 "mail flashrom@flashrom.org, thanks!\n"
1982 "-------------------------------------------------------------------------------\n"
1983 "You may now reboot or simply leave the machine running.\n");
1984 else
1985#endif
1986 msg_gerr("Please check the connections (especially those to write protection pins) between\n"
1987 "the programmer and the flash chip. If you think the error is caused by flashrom\n"
1988 "please report this on IRC at chat.freenode.net (channel #flashrom) or\n"
1989 "mail flashrom@flashrom.org, thanks!\n");
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001990}
1991
Stefan Tauner136388f2013-07-15 10:47:53 +00001992static void emergency_help_message(void)
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00001993{
Stefan Tauner136388f2013-07-15 10:47:53 +00001994 msg_gerr("Your flash chip is in an unknown state.\n");
1995#if CONFIG_INTERNAL == 1
1996 if (programmer == PROGRAMMER_INTERNAL)
1997 msg_gerr("Get help on IRC at chat.freenode.net (channel #flashrom) or\n"
1998 "mail flashrom@flashrom.org with the subject \"FAILED: <your board name>\"!\n"
1999 "-------------------------------------------------------------------------------\n"
2000 "DO NOT REBOOT OR POWEROFF!\n");
2001 else
2002#endif
2003 msg_gerr("Please report this on IRC at chat.freenode.net (channel #flashrom) or\n"
2004 "mail flashrom@flashrom.org, thanks!\n");
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00002005}
2006
Uwe Hermann91f4afa2011-07-28 08:13:25 +00002007/* The way to go if you want a delimited list of programmers */
Stefan Tauner66652442011-06-26 17:38:17 +00002008void list_programmers(const char *delim)
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00002009{
2010 enum programmer p;
2011 for (p = 0; p < PROGRAMMER_INVALID; p++) {
Sean Nelson316a29f2010-05-07 20:09:04 +00002012 msg_ginfo("%s", programmer_table[p].name);
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00002013 if (p < PROGRAMMER_INVALID - 1)
Sean Nelson316a29f2010-05-07 20:09:04 +00002014 msg_ginfo("%s", delim);
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00002015 }
Stefan Tauner23e10b82016-01-23 16:16:49 +00002016 msg_ginfo("\n");
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00002017}
2018
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00002019void list_programmers_linebreak(int startcol, int cols, int paren)
2020{
2021 const char *pname;
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +00002022 int pnamelen;
2023 int remaining = 0, firstline = 1;
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00002024 enum programmer p;
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +00002025 int i;
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00002026
2027 for (p = 0; p < PROGRAMMER_INVALID; p++) {
2028 pname = programmer_table[p].name;
2029 pnamelen = strlen(pname);
2030 if (remaining - pnamelen - 2 < 0) {
2031 if (firstline)
2032 firstline = 0;
2033 else
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00002034 msg_ginfo("\n");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00002035 for (i = 0; i < startcol; i++)
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00002036 msg_ginfo(" ");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00002037 remaining = cols - startcol;
2038 } else {
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00002039 msg_ginfo(" ");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00002040 remaining--;
2041 }
2042 if (paren && (p == 0)) {
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00002043 msg_ginfo("(");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00002044 remaining--;
2045 }
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00002046 msg_ginfo("%s", pname);
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00002047 remaining -= pnamelen;
2048 if (p < PROGRAMMER_INVALID - 1) {
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00002049 msg_ginfo(",");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00002050 remaining--;
2051 } else {
2052 if (paren)
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00002053 msg_ginfo(")");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00002054 }
2055 }
2056}
2057
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00002058void print_sysinfo(void)
2059{
Stefan Taunerb0eee9b2015-01-10 09:32:50 +00002060#if IS_WINDOWS
Carl-Daniel Hailfinger60d9bd22012-08-09 23:34:41 +00002061 SYSTEM_INFO si;
2062 OSVERSIONINFOEX osvi;
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00002063
Carl-Daniel Hailfinger60d9bd22012-08-09 23:34:41 +00002064 memset(&si, 0, sizeof(SYSTEM_INFO));
2065 memset(&osvi, 0, sizeof(OSVERSIONINFOEX));
2066 msg_ginfo(" on Windows");
2067 /* Tell Windows which version of the structure we want. */
2068 osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
2069 if (GetVersionEx((OSVERSIONINFO*) &osvi))
2070 msg_ginfo(" %lu.%lu", osvi.dwMajorVersion, osvi.dwMinorVersion);
2071 else
2072 msg_ginfo(" unknown version");
2073 GetSystemInfo(&si);
2074 switch (si.wProcessorArchitecture) {
2075 case PROCESSOR_ARCHITECTURE_AMD64:
2076 msg_ginfo(" (x86_64)");
2077 break;
2078 case PROCESSOR_ARCHITECTURE_INTEL:
2079 msg_ginfo(" (x86)");
2080 break;
2081 default:
2082 msg_ginfo(" (unknown arch)");
2083 break;
2084 }
2085#elif HAVE_UTSNAME == 1
2086 struct utsname osinfo;
2087
2088 uname(&osinfo);
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00002089 msg_ginfo(" on %s %s (%s)", osinfo.sysname, osinfo.release,
2090 osinfo.machine);
2091#else
2092 msg_ginfo(" on unknown machine");
2093#endif
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00002094}
2095
2096void print_buildinfo(void)
2097{
2098 msg_gdbg("flashrom was built with");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00002099#if NEED_PCI == 1
2100#ifdef PCILIB_VERSION
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00002101 msg_gdbg(" libpci %s,", PCILIB_VERSION);
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00002102#else
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00002103 msg_gdbg(" unknown PCI library,");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00002104#endif
2105#endif
2106#ifdef __clang__
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00002107 msg_gdbg(" LLVM Clang");
Carl-Daniel Hailfingerb51e58e2010-07-17 14:49:30 +00002108#ifdef __clang_version__
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00002109 msg_gdbg(" %s,", __clang_version__);
Carl-Daniel Hailfingerb51e58e2010-07-17 14:49:30 +00002110#else
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00002111 msg_gdbg(" unknown version (before r102686),");
Carl-Daniel Hailfingerb51e58e2010-07-17 14:49:30 +00002112#endif
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00002113#elif defined(__GNUC__)
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00002114 msg_gdbg(" GCC");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00002115#ifdef __VERSION__
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00002116 msg_gdbg(" %s,", __VERSION__);
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00002117#else
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00002118 msg_gdbg(" unknown version,");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00002119#endif
2120#else
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00002121 msg_gdbg(" unknown compiler,");
Carl-Daniel Hailfingercceafa22010-05-26 01:45:41 +00002122#endif
2123#if defined (__FLASHROM_LITTLE_ENDIAN__)
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00002124 msg_gdbg(" little endian");
Carl-Daniel Hailfinger06b9efa2012-08-07 11:59:59 +00002125#elif defined (__FLASHROM_BIG_ENDIAN__)
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00002126 msg_gdbg(" big endian");
Carl-Daniel Hailfinger06b9efa2012-08-07 11:59:59 +00002127#else
2128#error Endianness could not be determined
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00002129#endif
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00002130 msg_gdbg("\n");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00002131}
2132
Bernhard Walle201bde32008-01-21 15:24:22 +00002133void print_version(void)
2134{
Stefan Tauner76347082016-11-27 17:45:49 +01002135 msg_ginfo("flashrom %s", flashrom_version);
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00002136 print_sysinfo();
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00002137 msg_ginfo("\n");
Bernhard Walle201bde32008-01-21 15:24:22 +00002138}
2139
Carl-Daniel Hailfinger8841d3e2010-05-15 15:04:37 +00002140void print_banner(void)
2141{
2142 msg_ginfo("flashrom is free software, get the source code at "
Stefan Tauner4c723152016-01-14 22:47:55 +00002143 "https://flashrom.org\n");
Carl-Daniel Hailfinger8841d3e2010-05-15 15:04:37 +00002144 msg_ginfo("\n");
2145}
2146
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00002147int selfcheck(void)
2148{
Stefan Tauner96658be2014-05-26 22:05:31 +00002149 unsigned int i;
Stefan Taunera6d96482012-12-26 19:51:23 +00002150 int ret = 0;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00002151
2152 /* Safety check. Instead of aborting after the first error, check
2153 * if more errors exist.
2154 */
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00002155 if (ARRAY_SIZE(programmer_table) - 1 != PROGRAMMER_INVALID) {
Sean Nelson316a29f2010-05-07 20:09:04 +00002156 msg_gerr("Programmer table miscompilation!\n");
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00002157 ret = 1;
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00002158 }
Stefan Taunera6d96482012-12-26 19:51:23 +00002159 for (i = 0; i < PROGRAMMER_INVALID; i++) {
2160 const struct programmer_entry p = programmer_table[i];
2161 if (p.name == NULL) {
2162 msg_gerr("All programmers need a valid name, but the one with index %d does not!\n", i);
2163 ret = 1;
2164 /* This might hide other problems with this programmer, but allows for better error
2165 * messages below without jumping through hoops. */
2166 continue;
2167 }
Stefan Tauneraf358d62012-12-27 18:40:26 +00002168 switch (p.type) {
2169 case USB:
2170 case PCI:
2171 case OTHER:
2172 if (p.devs.note == NULL) {
2173 if (strcmp("internal", p.name) == 0)
2174 break; /* This one has its device list stored separately. */
2175 msg_gerr("Programmer %s has neither a device list nor a textual description!\n",
2176 p.name);
2177 ret = 1;
2178 }
2179 break;
2180 default:
2181 msg_gerr("Programmer %s does not have a valid type set!\n", p.name);
2182 ret = 1;
2183 break;
2184 }
Stefan Taunera6d96482012-12-26 19:51:23 +00002185 if (p.init == NULL) {
2186 msg_gerr("Programmer %s does not have a valid init function!\n", p.name);
2187 ret = 1;
2188 }
2189 if (p.delay == NULL) {
2190 msg_gerr("Programmer %s does not have a valid delay function!\n", p.name);
2191 ret = 1;
2192 }
2193 if (p.map_flash_region == NULL) {
2194 msg_gerr("Programmer %s does not have a valid map_flash_region function!\n", p.name);
2195 ret = 1;
2196 }
2197 if (p.unmap_flash_region == NULL) {
2198 msg_gerr("Programmer %s does not have a valid unmap_flash_region function!\n", p.name);
2199 ret = 1;
2200 }
2201 }
Stefan Tauner96658be2014-05-26 22:05:31 +00002202
2203 /* It would be favorable if we could check for the correct layout (especially termination) of various
2204 * constant arrays: flashchips, chipset_enables, board_matches, boards_known, laptops_known.
2205 * They are all defined as externs in this compilation unit so we don't know their sizes which vary
2206 * depending on compiler flags, e.g. the target architecture, and can sometimes be 0.
2207 * For 'flashchips' we export the size explicitly to work around this and to be able to implement the
2208 * checks below. */
Stefan Tauner6697f712014-08-06 15:09:15 +00002209 if (flashchips_size <= 1 || flashchips[flashchips_size - 1].name != NULL) {
Stefan Tauner7bcacb12011-05-26 01:35:19 +00002210 msg_gerr("Flashchips table miscompilation!\n");
2211 ret = 1;
Stefan Tauner96658be2014-05-26 22:05:31 +00002212 } else {
2213 for (i = 0; i < flashchips_size - 1; i++) {
2214 const struct flashchip *chip = &flashchips[i];
2215 if (chip->vendor == NULL || chip->name == NULL || chip->bustype == BUS_NONE) {
2216 ret = 1;
2217 msg_gerr("ERROR: Some field of flash chip #%d (%s) is misconfigured.\n"
2218 "Please report a bug at flashrom@flashrom.org\n", i,
2219 chip->name == NULL ? "unnamed" : chip->name);
2220 }
2221 if (selfcheck_eraseblocks(chip)) {
2222 ret = 1;
2223 }
2224 }
Stefan Tauner7bcacb12011-05-26 01:35:19 +00002225 }
Stefan Tauner7bcacb12011-05-26 01:35:19 +00002226
Stefan Tauner600576b2014-06-12 22:57:36 +00002227#if CONFIG_INTERNAL == 1
2228 ret |= selfcheck_board_enables();
2229#endif
2230
Stefan Tauner96658be2014-05-26 22:05:31 +00002231 /* TODO: implement similar sanity checks for other arrays where deemed necessary. */
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00002232 return ret;
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00002233}
2234
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00002235/* FIXME: This function signature needs to be improved once doit() has a better
2236 * function signature.
2237 */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00002238int chip_safety_check(const struct flashctx *flash, int force, int read_it, int write_it, int erase_it,
2239 int verify_it)
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00002240{
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00002241 const struct flashchip *chip = flash->chip;
2242
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00002243 if (!programmer_may_write && (write_it || erase_it)) {
2244 msg_perr("Write/erase is not working yet on your programmer in "
2245 "its current configuration.\n");
2246 /* --force is the wrong approach, but it's the best we can do
2247 * until the generic programmer parameter parser is merged.
2248 */
2249 if (!force)
2250 return 1;
2251 msg_cerr("Continuing anyway.\n");
2252 }
2253
2254 if (read_it || erase_it || write_it || verify_it) {
2255 /* Everything needs read. */
Stefan Tauner6455dff2014-05-26 00:36:24 +00002256 if (chip->tested.read == BAD) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00002257 msg_cerr("Read is not working on this chip. ");
2258 if (!force)
2259 return 1;
2260 msg_cerr("Continuing anyway.\n");
2261 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00002262 if (!chip->read) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00002263 msg_cerr("flashrom has no read function for this "
2264 "flash chip.\n");
2265 return 1;
2266 }
2267 }
2268 if (erase_it || write_it) {
2269 /* Write needs erase. */
Stefan Tauner6455dff2014-05-26 00:36:24 +00002270 if (chip->tested.erase == NA) {
2271 msg_cerr("Erase is not possible on this chip.\n");
2272 return 1;
2273 }
2274 if (chip->tested.erase == BAD) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00002275 msg_cerr("Erase is not working on this chip. ");
2276 if (!force)
2277 return 1;
2278 msg_cerr("Continuing anyway.\n");
2279 }
Sylvain "ythier" Hitier9db45512011-07-04 07:27:17 +00002280 if(count_usable_erasers(flash) == 0) {
Stefan Tauner5368dca2011-07-01 00:19:12 +00002281 msg_cerr("flashrom has no erase function for this "
2282 "flash chip.\n");
2283 return 1;
2284 }
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00002285 }
2286 if (write_it) {
Stefan Tauner6455dff2014-05-26 00:36:24 +00002287 if (chip->tested.write == NA) {
2288 msg_cerr("Write is not possible on this chip.\n");
2289 return 1;
2290 }
2291 if (chip->tested.write == BAD) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00002292 msg_cerr("Write is not working on this chip. ");
2293 if (!force)
2294 return 1;
2295 msg_cerr("Continuing anyway.\n");
2296 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00002297 if (!chip->write) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00002298 msg_cerr("flashrom has no write function for this "
2299 "flash chip.\n");
2300 return 1;
2301 }
2302 }
2303 return 0;
2304}
2305
Nico Huber305f4172013-06-14 11:55:26 +02002306int prepare_flash_access(struct flashctx *const flash,
2307 const bool read_it, const bool write_it,
2308 const bool erase_it, const bool verify_it)
Nico Huber454f6132012-12-10 13:34:10 +00002309{
2310 if (chip_safety_check(flash, flash->flags.force, read_it, write_it, erase_it, verify_it)) {
2311 msg_cerr("Aborting.\n");
2312 return 1;
2313 }
2314
2315 if (flash->layout == get_global_layout() && normalize_romentries(flash)) {
2316 msg_cerr("Requested regions can not be handled. Aborting.\n");
2317 return 1;
2318 }
2319
2320 if (map_flash(flash) != 0)
2321 return 1;
2322
2323 /* Given the existence of read locks, we want to unlock for read,
2324 erase and write. */
2325 if (flash->chip->unlock)
2326 flash->chip->unlock(flash);
2327
Nico Huberf43c6542017-10-14 17:47:28 +02002328 flash->address_high_byte = -1;
2329 flash->in_4ba_mode = false;
2330
Nico Huberdc5af542018-12-22 16:54:59 +01002331 /* Be careful about 4BA chips and broken masters */
2332 if (flash->chip->total_size > 16 * 1024 && spi_master_no_4ba_modes(flash)) {
2333 /* If we can't use native instructions, bail out */
2334 if ((flash->chip->feature_bits & FEATURE_4BA_NATIVE) != FEATURE_4BA_NATIVE
2335 || !spi_master_4ba(flash)) {
2336 msg_cerr("Programmer doesn't support this chip. Aborting.\n");
2337 return 1;
2338 }
2339 }
2340
Ed Swierkcc20a9b2017-07-03 13:17:18 -07002341 /* Enable/disable 4-byte addressing mode if flash chip supports it */
Nico Huber86bddb52018-03-13 18:14:52 +01002342 if (flash->chip->feature_bits & (FEATURE_4BA_ENTER | FEATURE_4BA_ENTER_WREN | FEATURE_4BA_ENTER_EAR7)) {
Nico Huberfe34d2a2017-11-10 21:10:20 +01002343 int ret;
2344 if (spi_master_4ba(flash))
2345 ret = spi_enter_4ba(flash);
2346 else
2347 ret = spi_exit_4ba(flash);
2348 if (ret) {
2349 msg_cerr("Failed to set correct 4BA mode! Aborting.\n");
Ed Swierkcc20a9b2017-07-03 13:17:18 -07002350 return 1;
Boris Baykov7fe85692016-06-11 18:29:03 +02002351 }
Boris Baykov99127182016-06-11 18:29:00 +02002352 }
2353
Nico Huber454f6132012-12-10 13:34:10 +00002354 return 0;
2355}
2356
Nico Huber305f4172013-06-14 11:55:26 +02002357void finalize_flash_access(struct flashctx *const flash)
Nico Huber454f6132012-12-10 13:34:10 +00002358{
2359 unmap_flash(flash);
2360}
2361
2362/**
2363 * @addtogroup flashrom-flash
2364 * @{
2365 */
2366
2367/**
2368 * @brief Erase the specified ROM chip.
2369 *
2370 * If a layout is set in the given flash context, only included regions
2371 * will be erased.
2372 *
2373 * @param flashctx The context of the flash chip to erase.
2374 * @return 0 on success.
2375 */
2376int flashrom_flash_erase(struct flashctx *const flashctx)
2377{
2378 if (prepare_flash_access(flashctx, false, false, true, false))
2379 return 1;
2380
2381 const int ret = erase_by_layout(flashctx);
2382
2383 finalize_flash_access(flashctx);
2384
2385 return ret;
2386}
2387
2388/** @} */ /* end flashrom-flash */
2389
2390/**
2391 * @defgroup flashrom-ops Operations
2392 * @{
2393 */
2394
2395/**
2396 * @brief Read the current image from the specified ROM chip.
2397 *
2398 * If a layout is set in the specified flash context, only included regions
2399 * will be read.
2400 *
2401 * @param flashctx The context of the flash chip.
2402 * @param buffer Target buffer to write image to.
2403 * @param buffer_len Size of target buffer in bytes.
2404 * @return 0 on success,
2405 * 2 if buffer_len is too short for the flash chip's contents,
2406 * or 1 on any other failure.
2407 */
2408int flashrom_image_read(struct flashctx *const flashctx, void *const buffer, const size_t buffer_len)
2409{
2410 const size_t flash_size = flashctx->chip->total_size * 1024;
2411
2412 if (flash_size > buffer_len)
2413 return 2;
2414
2415 if (prepare_flash_access(flashctx, true, false, false, false))
2416 return 1;
2417
2418 msg_cinfo("Reading flash... ");
2419
2420 int ret = 1;
2421 if (read_by_layout(flashctx, buffer)) {
2422 msg_cerr("Read operation failed!\n");
2423 msg_cinfo("FAILED.\n");
2424 goto _finalize_ret;
2425 }
2426 msg_cinfo("done.\n");
2427 ret = 0;
2428
2429_finalize_ret:
2430 finalize_flash_access(flashctx);
2431 return ret;
2432}
2433
2434static void combine_image_by_layout(const struct flashctx *const flashctx,
2435 uint8_t *const newcontents, const uint8_t *const oldcontents)
2436{
2437 const struct flashrom_layout *const layout = get_layout(flashctx);
Nico Huber3d7b1e32018-12-22 00:53:14 +01002438 const struct romentry *included;
2439 chipoff_t start = 0;
Nico Huber454f6132012-12-10 13:34:10 +00002440
Nico Huber3d7b1e32018-12-22 00:53:14 +01002441 while ((included = layout_next_included_region(layout, start))) {
2442 if (included->start > start) {
2443 /* copy everything up to the start of this included region */
2444 memcpy(newcontents + start, oldcontents + start, included->start - start);
2445 }
2446 /* skip this included region */
2447 start = included->end + 1;
2448 if (start == 0)
2449 return;
Nico Huber454f6132012-12-10 13:34:10 +00002450 }
Nico Huber3d7b1e32018-12-22 00:53:14 +01002451
2452 /* copy the rest of the chip */
2453 const chipsize_t copy_len = flashctx->chip->total_size * 1024 - start;
2454 memcpy(newcontents + start, oldcontents + start, copy_len);
Nico Huber454f6132012-12-10 13:34:10 +00002455}
2456
2457/**
2458 * @brief Write the specified image to the ROM chip.
2459 *
2460 * If a layout is set in the specified flash context, only erase blocks
2461 * containing included regions will be touched.
2462 *
2463 * @param flashctx The context of the flash chip.
Nico Huber1b172f22017-06-19 12:35:24 +02002464 * @param buffer Source buffer to read image from (may be altered for full verification).
Nico Huber454f6132012-12-10 13:34:10 +00002465 * @param buffer_len Size of source buffer in bytes.
Paul Kocialkowskif701f342018-01-15 01:10:36 +03002466 * @param refbuffer If given, assume flash chip contains same data as `refbuffer`.
Nico Huber454f6132012-12-10 13:34:10 +00002467 * @return 0 on success,
2468 * 4 if buffer_len doesn't match the size of the flash chip,
2469 * 3 if write was tried but nothing has changed,
2470 * 2 if write failed and flash contents changed,
2471 * or 1 on any other failure.
2472 */
Paul Kocialkowskif701f342018-01-15 01:10:36 +03002473int flashrom_image_write(struct flashctx *const flashctx, void *const buffer, const size_t buffer_len,
2474 const void *const refbuffer)
Nico Huber454f6132012-12-10 13:34:10 +00002475{
2476 const size_t flash_size = flashctx->chip->total_size * 1024;
2477 const bool verify_all = flashctx->flags.verify_whole_chip;
2478 const bool verify = flashctx->flags.verify_after_write;
2479
2480 if (buffer_len != flash_size)
2481 return 4;
2482
2483 int ret = 1;
2484
2485 uint8_t *const newcontents = buffer;
Paul Kocialkowskif701f342018-01-15 01:10:36 +03002486 const uint8_t *const refcontents = refbuffer;
Nico Huber454f6132012-12-10 13:34:10 +00002487 uint8_t *const curcontents = malloc(flash_size);
2488 uint8_t *oldcontents = NULL;
2489 if (verify_all)
2490 oldcontents = malloc(flash_size);
2491 if (!curcontents || (verify_all && !oldcontents)) {
2492 msg_gerr("Out of memory!\n");
2493 goto _free_ret;
2494 }
2495
2496#if CONFIG_INTERNAL == 1
2497 if (programmer == PROGRAMMER_INTERNAL && cb_check_image(newcontents, flash_size) < 0) {
2498 if (flashctx->flags.force_boardmismatch) {
2499 msg_pinfo("Proceeding anyway because user forced us to.\n");
2500 } else {
2501 msg_perr("Aborting. You can override this with "
2502 "-p internal:boardmismatch=force.\n");
2503 goto _free_ret;
2504 }
2505 }
2506#endif
2507
2508 if (prepare_flash_access(flashctx, false, true, false, verify))
2509 goto _free_ret;
2510
Paul Kocialkowskif701f342018-01-15 01:10:36 +03002511 /* If given, assume flash chip contains same data as `refcontents`. */
2512 if (refcontents) {
2513 msg_cinfo("Assuming old flash chip contents as ref-file...\n");
2514 memcpy(curcontents, refcontents, flash_size);
2515 if (oldcontents)
2516 memcpy(oldcontents, refcontents, flash_size);
Nico Huber454f6132012-12-10 13:34:10 +00002517 } else {
Paul Kocialkowskif701f342018-01-15 01:10:36 +03002518 /*
2519 * Read the whole chip to be able to check whether regions need to be
2520 * erased and to give better diagnostics in case write fails.
2521 * The alternative is to read only the regions which are to be
2522 * preserved, but in that case we might perform unneeded erase which
2523 * takes time as well.
2524 */
2525 msg_cinfo("Reading old flash chip contents... ");
2526 if (verify_all) {
2527 if (flashctx->chip->read(flashctx, oldcontents, 0, flash_size)) {
2528 msg_cinfo("FAILED.\n");
2529 goto _finalize_ret;
2530 }
2531 memcpy(curcontents, oldcontents, flash_size);
2532 } else {
2533 if (read_by_layout(flashctx, curcontents)) {
2534 msg_cinfo("FAILED.\n");
2535 goto _finalize_ret;
2536 }
Nico Huber454f6132012-12-10 13:34:10 +00002537 }
Paul Kocialkowskif701f342018-01-15 01:10:36 +03002538 msg_cinfo("done.\n");
Nico Huber454f6132012-12-10 13:34:10 +00002539 }
Nico Huber454f6132012-12-10 13:34:10 +00002540
2541 if (write_by_layout(flashctx, curcontents, newcontents)) {
2542 msg_cerr("Uh oh. Erase/write failed. ");
2543 ret = 2;
2544 if (verify_all) {
2545 msg_cerr("Checking if anything has changed.\n");
2546 msg_cinfo("Reading current flash chip contents... ");
2547 if (!flashctx->chip->read(flashctx, curcontents, 0, flash_size)) {
2548 msg_cinfo("done.\n");
2549 if (!memcmp(oldcontents, curcontents, flash_size)) {
2550 nonfatal_help_message();
2551 goto _finalize_ret;
2552 }
2553 msg_cerr("Apparently at least some data has changed.\n");
2554 } else
2555 msg_cerr("Can't even read anymore!\n");
2556 emergency_help_message();
2557 goto _finalize_ret;
2558 } else {
2559 msg_cerr("\n");
2560 }
2561 emergency_help_message();
2562 goto _finalize_ret;
2563 }
2564
2565 /* Verify only if we actually changed something. */
2566 if (verify && !all_skipped) {
2567 const struct flashrom_layout *const layout_bak = flashctx->layout;
2568
2569 msg_cinfo("Verifying flash... ");
2570
2571 /* Work around chips which need some time to calm down. */
2572 programmer_delay(1000*1000);
2573
2574 if (verify_all) {
2575 combine_image_by_layout(flashctx, newcontents, oldcontents);
2576 flashctx->layout = NULL;
2577 }
2578 ret = verify_by_layout(flashctx, curcontents, newcontents);
2579 flashctx->layout = layout_bak;
2580 /* If we tried to write, and verification now fails, we
2581 might have an emergency situation. */
2582 if (ret)
2583 emergency_help_message();
2584 else
2585 msg_cinfo("VERIFIED.\n");
2586 } else {
2587 /* We didn't change anything. */
2588 ret = 0;
2589 }
2590
2591_finalize_ret:
2592 finalize_flash_access(flashctx);
2593_free_ret:
2594 free(oldcontents);
2595 free(curcontents);
2596 return ret;
2597}
2598
2599/**
2600 * @brief Verify the ROM chip's contents with the specified image.
2601 *
2602 * If a layout is set in the specified flash context, only included regions
2603 * will be verified.
2604 *
2605 * @param flashctx The context of the flash chip.
2606 * @param buffer Source buffer to verify with.
2607 * @param buffer_len Size of source buffer in bytes.
2608 * @return 0 on success,
2609 * 3 if the chip's contents don't match,
2610 * 2 if buffer_len doesn't match the size of the flash chip,
2611 * or 1 on any other failure.
2612 */
2613int flashrom_image_verify(struct flashctx *const flashctx, const void *const buffer, const size_t buffer_len)
2614{
2615 const size_t flash_size = flashctx->chip->total_size * 1024;
2616
2617 if (buffer_len != flash_size)
2618 return 2;
2619
2620 const uint8_t *const newcontents = buffer;
2621 uint8_t *const curcontents = malloc(flash_size);
2622 if (!curcontents) {
2623 msg_gerr("Out of memory!\n");
2624 return 1;
2625 }
2626
2627 int ret = 1;
2628
2629 if (prepare_flash_access(flashctx, false, false, false, true))
2630 goto _free_ret;
2631
2632 msg_cinfo("Verifying flash... ");
2633 ret = verify_by_layout(flashctx, curcontents, newcontents);
2634 if (!ret)
2635 msg_cinfo("VERIFIED.\n");
2636
2637 finalize_flash_access(flashctx);
2638_free_ret:
2639 free(curcontents);
2640 return ret;
2641}
2642
2643/** @} */ /* end flashrom-ops */
Nico Huber899e4ec2016-04-29 18:39:01 +02002644
2645int do_read(struct flashctx *const flash, const char *const filename)
2646{
2647 if (prepare_flash_access(flash, true, false, false, false))
2648 return 1;
2649
2650 const int ret = read_flash_to_file(flash, filename);
2651
2652 finalize_flash_access(flash);
2653
2654 return ret;
2655}
2656
2657int do_erase(struct flashctx *const flash)
2658{
2659 const int ret = flashrom_flash_erase(flash);
2660
2661 /*
2662 * FIXME: Do we really want the scary warning if erase failed?
2663 * After all, after erase the chip is either blank or partially
2664 * blank or it has the old contents. A blank chip won't boot,
2665 * so if the user wanted erase and reboots afterwards, the user
2666 * knows very well that booting won't work.
2667 */
2668 if (ret)
2669 emergency_help_message();
2670
2671 return ret;
2672}
2673
Paul Kocialkowskif701f342018-01-15 01:10:36 +03002674int do_write(struct flashctx *const flash, const char *const filename, const char *const referencefile)
Nico Huber899e4ec2016-04-29 18:39:01 +02002675{
2676 const size_t flash_size = flash->chip->total_size * 1024;
2677 int ret = 1;
2678
2679 uint8_t *const newcontents = malloc(flash_size);
Paul Kocialkowskif701f342018-01-15 01:10:36 +03002680 uint8_t *const refcontents = referencefile ? malloc(flash_size) : NULL;
2681
2682 if (!newcontents || (referencefile && !refcontents)) {
Nico Huber899e4ec2016-04-29 18:39:01 +02002683 msg_gerr("Out of memory!\n");
2684 goto _free_ret;
2685 }
2686
2687 if (read_buf_from_file(newcontents, flash_size, filename))
2688 goto _free_ret;
2689
Paul Kocialkowskif701f342018-01-15 01:10:36 +03002690 if (referencefile) {
2691 if (read_buf_from_file(refcontents, flash_size, referencefile))
2692 goto _free_ret;
2693 }
2694
2695 ret = flashrom_image_write(flash, newcontents, flash_size, refcontents);
Nico Huber899e4ec2016-04-29 18:39:01 +02002696
2697_free_ret:
Paul Kocialkowskif701f342018-01-15 01:10:36 +03002698 free(refcontents);
Nico Huber899e4ec2016-04-29 18:39:01 +02002699 free(newcontents);
2700 return ret;
2701}
2702
2703int do_verify(struct flashctx *const flash, const char *const filename)
2704{
2705 const size_t flash_size = flash->chip->total_size * 1024;
2706 int ret = 1;
2707
2708 uint8_t *const newcontents = malloc(flash_size);
2709 if (!newcontents) {
2710 msg_gerr("Out of memory!\n");
2711 goto _free_ret;
2712 }
2713
2714 if (read_buf_from_file(newcontents, flash_size, filename))
2715 goto _free_ret;
2716
2717 ret = flashrom_image_verify(flash, newcontents, flash_size);
2718
2719_free_ret:
2720 free(newcontents);
2721 return ret;
2722}