blob: a7de995dd25ed654aefa5e12f3e61cbb5cee2f3f [file] [log] [blame]
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001/*
Uwe Hermannd1107642007-08-29 17:52:32 +00002 * This file is part of the flashrom project.
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00003 *
Uwe Hermannd22a1d42007-09-09 20:21:05 +00004 * Copyright (C) 2000 Silicon Integrated System Corporation
5 * Copyright (C) 2004 Tyan Corp <yhlu@tyan.com>
Uwe Hermannc7e8a0c2009-05-19 14:14:21 +00006 * Copyright (C) 2005-2008 coresystems GmbH
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007 * Copyright (C) 2008,2009 Carl-Daniel Hailfinger
Nico Huber7af0e792016-04-29 16:40:15 +02008 * Copyright (C) 2016 secunet Security Networks AG
9 * (Written by Nico Huber <nico.huber@secunet.com> for secunet)
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +000010 *
Uwe Hermannd1107642007-08-29 17:52:32 +000011 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +000015 *
Uwe Hermannd1107642007-08-29 17:52:32 +000016 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +000020 *
Uwe Hermannd1107642007-08-29 17:52:32 +000021 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, write to the Free Software
23 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +000024 */
25
Carl-Daniel Hailfinger831e8f42010-05-30 22:24:40 +000026#include <stdio.h>
Stefan Reinauer018aca82006-11-21 23:48:51 +000027#include <sys/types.h>
Patrick Georgia9095a92010-09-30 17:03:32 +000028#ifndef __LIBPAYLOAD__
29#include <fcntl.h>
Stefan Reinauer018aca82006-11-21 23:48:51 +000030#include <sys/stat.h>
Patrick Georgia9095a92010-09-30 17:03:32 +000031#endif
Ronald G. Minnichceec4202003-07-25 04:37:41 +000032#include <string.h>
Stefan Tauner16687702015-12-25 21:59:45 +000033#include <unistd.h>
Ronald G. Minnicheaab50b2003-09-12 22:41:53 +000034#include <stdlib.h>
Stefan Tauner363fd7e2013-04-07 13:08:30 +000035#include <errno.h>
Carl-Daniel Hailfingerc2441382010-11-09 22:00:31 +000036#include <ctype.h>
Ollie Lho184a4042005-11-26 21:55:36 +000037#include <getopt.h>
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +000038#if HAVE_UTSNAME == 1
39#include <sys/utsname.h>
40#endif
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +000041#include "flash.h"
Carl-Daniel Hailfinger08454642009-06-15 14:14:48 +000042#include "flashchips.h"
Carl-Daniel Hailfinger5b997c32010-07-27 22:41:39 +000043#include "programmer.h"
Carl-Daniel Hailfinger06b9efa2012-08-07 11:59:59 +000044#include "hwaccess.h"
Nico Huberfe34d2a2017-11-10 21:10:20 +010045#include "chipdrivers.h"
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +000046
Mathias Krausea60faab2011-01-17 07:50:42 +000047const char flashrom_version[] = FLASHROM_VERSION;
Nico Huberbcb2e5a2012-12-30 01:23:17 +000048const char *chip_to_probe = NULL;
Carl-Daniel Hailfinger66ef4e52009-12-13 22:28:00 +000049
Carl-Daniel Hailfinger2e681602011-09-08 00:00:29 +000050static enum programmer programmer = PROGRAMMER_INVALID;
Nico Huberbcb2e5a2012-12-30 01:23:17 +000051static const char *programmer_param = NULL;
Stefan Reinauer70385642007-04-06 11:58:03 +000052
Uwe Hermann48ec1b12010-08-08 17:01:18 +000053/*
Carl-Daniel Hailfinger66ef4e52009-12-13 22:28:00 +000054 * Programmers supporting multiple buses can have differing size limits on
55 * each bus. Store the limits for each bus in a common struct.
56 */
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +000057struct decode_sizes max_rom_decode;
58
59/* If nonzero, used as the start address of bottom-aligned flash. */
60unsigned long flashbase;
Carl-Daniel Hailfinger66ef4e52009-12-13 22:28:00 +000061
Carl-Daniel Hailfingerd1be52d2010-07-03 12:14:25 +000062/* Is writing allowed with this programmer? */
63int programmer_may_write;
64
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +000065const struct programmer_entry programmer_table[] = {
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +000066#if CONFIG_INTERNAL == 1
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +000067 {
Carl-Daniel Hailfinger37fc4692009-08-12 14:34:35 +000068 .name = "internal",
Stefan Tauneraf358d62012-12-27 18:40:26 +000069 .type = OTHER,
70 .devs.note = NULL,
Carl-Daniel Hailfinger1e334e62009-05-11 15:46:43 +000071 .init = internal_init,
Carl-Daniel Hailfinger1455b2b2009-05-11 14:13:25 +000072 .map_flash_region = physmap,
73 .unmap_flash_region = physunmap,
Carl-Daniel Hailfingerca8bfc62009-06-05 17:48:08 +000074 .delay = internal_delay,
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +000075 },
Carl-Daniel Hailfinger66ef4e52009-12-13 22:28:00 +000076#endif
Luc Verhaegen8e3a6002007-04-04 22:45:58 +000077
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +000078#if CONFIG_DUMMY == 1
Carl-Daniel Hailfingerc3129202009-05-09 00:54:55 +000079 {
Carl-Daniel Hailfinger37fc4692009-08-12 14:34:35 +000080 .name = "dummy",
Stefan Tauneraf358d62012-12-27 18:40:26 +000081 .type = OTHER,
82 /* FIXME */
83 .devs.note = "Dummy device, does nothing and logs all accesses\n",
Carl-Daniel Hailfinger1e334e62009-05-11 15:46:43 +000084 .init = dummy_init,
Carl-Daniel Hailfinger1455b2b2009-05-11 14:13:25 +000085 .map_flash_region = dummy_map,
86 .unmap_flash_region = dummy_unmap,
Carl-Daniel Hailfingerca8bfc62009-06-05 17:48:08 +000087 .delay = internal_delay,
Carl-Daniel Hailfingerc3129202009-05-09 00:54:55 +000088 },
Carl-Daniel Hailfinger4740c6f2009-09-16 10:09:21 +000089#endif
Carl-Daniel Hailfingerc3129202009-05-09 00:54:55 +000090
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +000091#if CONFIG_NIC3COM == 1
Uwe Hermannb4dcb712009-05-13 11:36:06 +000092 {
Carl-Daniel Hailfinger37fc4692009-08-12 14:34:35 +000093 .name = "nic3com",
Stefan Tauneraf358d62012-12-27 18:40:26 +000094 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +000095 .devs.dev = nics_3com,
Uwe Hermannb4dcb712009-05-13 11:36:06 +000096 .init = nic3com_init,
Uwe Hermannc6915932009-05-17 23:12:17 +000097 .map_flash_region = fallback_map,
98 .unmap_flash_region = fallback_unmap,
Carl-Daniel Hailfingerca8bfc62009-06-05 17:48:08 +000099 .delay = internal_delay,
Uwe Hermannb4dcb712009-05-13 11:36:06 +0000100 },
Carl-Daniel Hailfinger4740c6f2009-09-16 10:09:21 +0000101#endif
Uwe Hermannb4dcb712009-05-13 11:36:06 +0000102
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000103#if CONFIG_NICREALTEK == 1
Joerg Fischer5665ef32010-05-21 21:54:07 +0000104 {
Carl-Daniel Hailfinger40446ee2011-03-07 01:08:09 +0000105 /* This programmer works for Realtek RTL8139 and SMC 1211. */
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000106 .name = "nicrealtek",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000107 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000108 .devs.dev = nics_realtek,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000109 .init = nicrealtek_init,
110 .map_flash_region = fallback_map,
111 .unmap_flash_region = fallback_unmap,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000112 .delay = internal_delay,
Joerg Fischer5665ef32010-05-21 21:54:07 +0000113 },
Joerg Fischer5665ef32010-05-21 21:54:07 +0000114#endif
115
Andrew Morganc29c2e72010-06-07 22:37:54 +0000116#if CONFIG_NICNATSEMI == 1
117 {
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000118 .name = "nicnatsemi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000119 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000120 .devs.dev = nics_natsemi,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000121 .init = nicnatsemi_init,
122 .map_flash_region = fallback_map,
123 .unmap_flash_region = fallback_unmap,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000124 .delay = internal_delay,
Andrew Morganc29c2e72010-06-07 22:37:54 +0000125 },
126#endif
Joerg Fischer5665ef32010-05-21 21:54:07 +0000127
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000128#if CONFIG_GFXNVIDIA == 1
Uwe Hermann2bc98f62009-09-30 18:29:55 +0000129 {
130 .name = "gfxnvidia",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000131 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000132 .devs.dev = gfx_nvidia,
Uwe Hermann2bc98f62009-09-30 18:29:55 +0000133 .init = gfxnvidia_init,
Uwe Hermann2bc98f62009-09-30 18:29:55 +0000134 .map_flash_region = fallback_map,
135 .unmap_flash_region = fallback_unmap,
Uwe Hermann2bc98f62009-09-30 18:29:55 +0000136 .delay = internal_delay,
137 },
138#endif
139
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000140#if CONFIG_DRKAISER == 1
Rudolf Marek68720c72009-05-17 19:39:27 +0000141 {
TURBO Jb0912c02009-09-02 23:00:46 +0000142 .name = "drkaiser",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000143 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000144 .devs.dev = drkaiser_pcidev,
TURBO Jb0912c02009-09-02 23:00:46 +0000145 .init = drkaiser_init,
TURBO Jb0912c02009-09-02 23:00:46 +0000146 .map_flash_region = fallback_map,
147 .unmap_flash_region = fallback_unmap,
TURBO Jb0912c02009-09-02 23:00:46 +0000148 .delay = internal_delay,
149 },
Carl-Daniel Hailfinger4740c6f2009-09-16 10:09:21 +0000150#endif
TURBO Jb0912c02009-09-02 23:00:46 +0000151
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000152#if CONFIG_SATASII == 1
TURBO Jb0912c02009-09-02 23:00:46 +0000153 {
Carl-Daniel Hailfinger37fc4692009-08-12 14:34:35 +0000154 .name = "satasii",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000155 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000156 .devs.dev = satas_sii,
Rudolf Marek68720c72009-05-17 19:39:27 +0000157 .init = satasii_init,
Uwe Hermannc6915932009-05-17 23:12:17 +0000158 .map_flash_region = fallback_map,
159 .unmap_flash_region = fallback_unmap,
Carl-Daniel Hailfingerca8bfc62009-06-05 17:48:08 +0000160 .delay = internal_delay,
Rudolf Marek68720c72009-05-17 19:39:27 +0000161 },
Carl-Daniel Hailfinger4740c6f2009-09-16 10:09:21 +0000162#endif
Rudolf Marek68720c72009-05-17 19:39:27 +0000163
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000164#if CONFIG_ATAHPT == 1
Uwe Hermannddd5c9e2010-02-21 21:17:00 +0000165 {
166 .name = "atahpt",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000167 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000168 .devs.dev = ata_hpt,
Uwe Hermannddd5c9e2010-02-21 21:17:00 +0000169 .init = atahpt_init,
Uwe Hermannddd5c9e2010-02-21 21:17:00 +0000170 .map_flash_region = fallback_map,
171 .unmap_flash_region = fallback_unmap,
Uwe Hermannddd5c9e2010-02-21 21:17:00 +0000172 .delay = internal_delay,
173 },
174#endif
175
Jonathan Kollasch7f0f3fa2014-06-01 10:26:23 +0000176#if CONFIG_ATAVIA == 1
177 {
178 .name = "atavia",
179 .type = PCI,
180 .devs.dev = ata_via,
181 .init = atavia_init,
182 .map_flash_region = atavia_map,
183 .unmap_flash_region = fallback_unmap,
184 .delay = internal_delay,
185 },
186#endif
187
Joseph C. Lehnerc2644a32016-01-16 23:45:25 +0000188#if CONFIG_ATAPROMISE == 1
189 {
190 .name = "atapromise",
191 .type = PCI,
192 .devs.dev = ata_promise,
193 .init = atapromise_init,
194 .map_flash_region = atapromise_map,
195 .unmap_flash_region = fallback_unmap,
196 .delay = internal_delay,
197 },
198#endif
199
Kyösti Mälkki72d42f82014-06-01 23:48:31 +0000200#if CONFIG_IT8212 == 1
201 {
202 .name = "it8212",
203 .type = PCI,
204 .devs.dev = devs_it8212,
205 .init = it8212_init,
206 .map_flash_region = fallback_map,
207 .unmap_flash_region = fallback_unmap,
208 .delay = internal_delay,
209 },
210#endif
211
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000212#if CONFIG_FT2232_SPI == 1
Paul Fox05dfbe62009-06-16 21:08:06 +0000213 {
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000214 .name = "ft2232_spi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000215 .type = USB,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000216 .devs.dev = devs_ft2232spi,
Paul Fox05dfbe62009-06-16 21:08:06 +0000217 .init = ft2232_spi_init,
Carl-Daniel Hailfinger415e5132009-08-12 11:39:29 +0000218 .map_flash_region = fallback_map,
219 .unmap_flash_region = fallback_unmap,
Paul Fox05dfbe62009-06-16 21:08:06 +0000220 .delay = internal_delay,
221 },
Carl-Daniel Hailfinger3426ef62009-08-19 13:27:58 +0000222#endif
Carl-Daniel Hailfinger415e5132009-08-12 11:39:29 +0000223
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000224#if CONFIG_SERPROG == 1
Urja Rannikko22915352009-06-23 11:33:43 +0000225 {
Carl-Daniel Hailfinger37fc4692009-08-12 14:34:35 +0000226 .name = "serprog",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000227 .type = OTHER,
228 /* FIXME */
229 .devs.note = "All programmer devices speaking the serprog protocol\n",
Urja Rannikko22915352009-06-23 11:33:43 +0000230 .init = serprog_init,
Urja Rannikko0b4ffd52015-06-29 23:24:23 +0000231 .map_flash_region = serprog_map,
Urja Rannikko22915352009-06-23 11:33:43 +0000232 .unmap_flash_region = fallback_unmap,
Urja Rannikko22915352009-06-23 11:33:43 +0000233 .delay = serprog_delay,
234 },
Carl-Daniel Hailfinger6be74112009-08-12 16:17:41 +0000235#endif
Paul Fox05dfbe62009-06-16 21:08:06 +0000236
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000237#if CONFIG_BUSPIRATE_SPI == 1
Carl-Daniel Hailfinger5cca01f2009-11-24 00:20:03 +0000238 {
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000239 .name = "buspirate_spi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000240 .type = OTHER,
241 /* FIXME */
242 .devs.note = "Dangerous Prototypes Bus Pirate\n",
Carl-Daniel Hailfinger5cca01f2009-11-24 00:20:03 +0000243 .init = buspirate_spi_init,
Carl-Daniel Hailfinger5cca01f2009-11-24 00:20:03 +0000244 .map_flash_region = fallback_map,
245 .unmap_flash_region = fallback_unmap,
Carl-Daniel Hailfinger5cca01f2009-11-24 00:20:03 +0000246 .delay = internal_delay,
247 },
248#endif
249
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000250#if CONFIG_DEDIPROG == 1
Carl-Daniel Hailfingerd38fac82010-01-19 11:15:48 +0000251 {
252 .name = "dediprog",
Stefan Taunerfdec7472016-02-22 08:59:27 +0000253 .type = USB,
254 .devs.dev = devs_dediprog,
Carl-Daniel Hailfingerd38fac82010-01-19 11:15:48 +0000255 .init = dediprog_init,
Carl-Daniel Hailfingerd38fac82010-01-19 11:15:48 +0000256 .map_flash_region = fallback_map,
257 .unmap_flash_region = fallback_unmap,
Carl-Daniel Hailfingerd38fac82010-01-19 11:15:48 +0000258 .delay = internal_delay,
259 },
260#endif
261
Carl-Daniel Hailfingere7fdd6e2010-07-21 10:26:01 +0000262#if CONFIG_RAYER_SPI == 1
263 {
264 .name = "rayer_spi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000265 .type = OTHER,
266 /* FIXME */
267 .devs.note = "RayeR parallel port programmer\n",
Carl-Daniel Hailfingere7fdd6e2010-07-21 10:26:01 +0000268 .init = rayer_spi_init,
Carl-Daniel Hailfingere7fdd6e2010-07-21 10:26:01 +0000269 .map_flash_region = fallback_map,
270 .unmap_flash_region = fallback_unmap,
Carl-Daniel Hailfingere7fdd6e2010-07-21 10:26:01 +0000271 .delay = internal_delay,
272 },
273#endif
274
Virgil-Adrian Teacada7c5452012-04-30 23:11:06 +0000275#if CONFIG_PONY_SPI == 1
276 {
277 .name = "pony_spi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000278 .type = OTHER,
279 /* FIXME */
280 .devs.note = "Programmers compatible with SI-Prog, serbang or AJAWe\n",
Virgil-Adrian Teacada7c5452012-04-30 23:11:06 +0000281 .init = pony_spi_init,
282 .map_flash_region = fallback_map,
283 .unmap_flash_region = fallback_unmap,
284 .delay = internal_delay,
Stefan Tauneraf358d62012-12-27 18:40:26 +0000285 },
Virgil-Adrian Teacada7c5452012-04-30 23:11:06 +0000286#endif
287
Carl-Daniel Hailfingerb713d2e2011-05-08 00:24:18 +0000288#if CONFIG_NICINTEL == 1
289 {
290 .name = "nicintel",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000291 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000292 .devs.dev = nics_intel,
Carl-Daniel Hailfingerb713d2e2011-05-08 00:24:18 +0000293 .init = nicintel_init,
Carl-Daniel Hailfingerb713d2e2011-05-08 00:24:18 +0000294 .map_flash_region = fallback_map,
295 .unmap_flash_region = fallback_unmap,
Carl-Daniel Hailfingerb713d2e2011-05-08 00:24:18 +0000296 .delay = internal_delay,
297 },
298#endif
299
Idwer Vollering004f4b72010-09-03 18:21:21 +0000300#if CONFIG_NICINTEL_SPI == 1
301 {
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000302 .name = "nicintel_spi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000303 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000304 .devs.dev = nics_intel_spi,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000305 .init = nicintel_spi_init,
306 .map_flash_region = fallback_map,
307 .unmap_flash_region = fallback_unmap,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000308 .delay = internal_delay,
Idwer Vollering004f4b72010-09-03 18:21:21 +0000309 },
310#endif
311
Ricardo Ribalda Delgado2a41f0a2014-07-28 20:35:21 +0000312#if CONFIG_NICINTEL_EEPROM == 1
313 {
314 .name = "nicintel_eeprom",
315 .type = PCI,
316 .devs.dev = nics_intel_ee,
317 .init = nicintel_ee_init,
318 .map_flash_region = fallback_map,
319 .unmap_flash_region = fallback_unmap,
320 .delay = internal_delay,
321 },
322#endif
323
Mark Marshall90021f22010-12-03 14:48:11 +0000324#if CONFIG_OGP_SPI == 1
325 {
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000326 .name = "ogp_spi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000327 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000328 .devs.dev = ogp_spi,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000329 .init = ogp_spi_init,
330 .map_flash_region = fallback_map,
331 .unmap_flash_region = fallback_unmap,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000332 .delay = internal_delay,
Mark Marshall90021f22010-12-03 14:48:11 +0000333 },
334#endif
335
Carl-Daniel Hailfinger9a1105c2011-02-04 21:37:59 +0000336#if CONFIG_SATAMV == 1
337 {
338 .name = "satamv",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000339 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000340 .devs.dev = satas_mv,
Carl-Daniel Hailfinger9a1105c2011-02-04 21:37:59 +0000341 .init = satamv_init,
Carl-Daniel Hailfinger9a1105c2011-02-04 21:37:59 +0000342 .map_flash_region = fallback_map,
343 .unmap_flash_region = fallback_unmap,
Carl-Daniel Hailfinger9a1105c2011-02-04 21:37:59 +0000344 .delay = internal_delay,
345 },
346#endif
347
Sven Schnelle5ce5f702011-09-03 18:37:52 +0000348#if CONFIG_LINUX_SPI == 1
349 {
350 .name = "linux_spi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000351 .type = OTHER,
352 .devs.note = "Device files /dev/spidev*.*\n",
Sven Schnelle5ce5f702011-09-03 18:37:52 +0000353 .init = linux_spi_init,
354 .map_flash_region = fallback_map,
355 .unmap_flash_region = fallback_unmap,
Sven Schnelle5ce5f702011-09-03 18:37:52 +0000356 .delay = internal_delay,
357 },
358#endif
359
James Lairdc60de0e2013-03-27 13:00:23 +0000360#if CONFIG_USBBLASTER_SPI == 1
361 {
362 .name = "usbblaster_spi",
363 .type = USB,
364 .devs.dev = devs_usbblasterspi,
365 .init = usbblaster_spi_init,
366 .map_flash_region = fallback_map,
367 .unmap_flash_region = fallback_unmap,
368 .delay = internal_delay,
369 },
370#endif
371
Alexandre Boeglin80e64712014-12-20 20:25:19 +0000372#if CONFIG_MSTARDDC_SPI == 1
373 {
374 .name = "mstarddc_spi",
375 .type = OTHER,
376 .devs.note = "MSTAR DDC devices addressable via /dev/i2c-* on Linux.\n",
377 .init = mstarddc_spi_init,
378 .map_flash_region = fallback_map,
379 .unmap_flash_region = fallback_unmap,
380 .delay = internal_delay,
381 },
382#endif
383
Justin Chevrier66e554b2015-02-08 21:58:10 +0000384#if CONFIG_PICKIT2_SPI == 1
385 {
386 .name = "pickit2_spi",
Stefan Taunerf31fe842016-02-22 08:59:15 +0000387 .type = USB,
388 .devs.dev = devs_pickit2_spi,
Justin Chevrier66e554b2015-02-08 21:58:10 +0000389 .init = pickit2_spi_init,
390 .map_flash_region = fallback_map,
391 .unmap_flash_region = fallback_unmap,
392 .delay = internal_delay,
393 },
394#endif
395
Urja Rannikko0870b022016-01-31 22:10:29 +0000396#if CONFIG_CH341A_SPI == 1
397 {
398 .name = "ch341a_spi",
399 .type = USB,
400 .devs.dev = devs_ch341a_spi,
401 .init = ch341a_spi_init,
402 .map_flash_region = fallback_map,
403 .unmap_flash_region = fallback_unmap,
404 .delay = ch341a_spi_delay,
405 },
406#endif
407
Carl-Daniel Hailfinger1c6d2ff2012-08-27 00:44:42 +0000408 {0}, /* This entry corresponds to PROGRAMMER_INVALID. */
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +0000409};
Luc Verhaegen8e3a6002007-04-04 22:45:58 +0000410
Carl-Daniel Hailfinger2bee8cf2010-11-10 15:25:18 +0000411#define SHUTDOWN_MAXFN 32
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000412static int shutdown_fn_count = 0;
Nico Huber454f6132012-12-10 13:34:10 +0000413/** @private */
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000414struct shutdown_func_data {
David Hendricks8bb20212011-06-14 01:35:36 +0000415 int (*func) (void *data);
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000416 void *data;
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000417} static shutdown_fn[SHUTDOWN_MAXFN];
418/* Initialize to 0 to make sure nobody registers a shutdown function before
419 * programmer init.
420 */
421static int may_register_shutdown = 0;
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000422
Stefan Taunerc4f44df2013-08-12 22:58:43 +0000423/* Did we change something or was every erase/write skipped (if any)? */
424static bool all_skipped = true;
425
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +0000426static int check_block_eraser(const struct flashctx *flash, int k, int log);
Stefan Tauner5368dca2011-07-01 00:19:12 +0000427
Stefan Tauner2a1ed772014-08-31 00:09:21 +0000428int shutdown_free(void *data)
429{
430 free(data);
431 return 0;
432}
433
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000434/* Register a function to be executed on programmer shutdown.
435 * The advantage over atexit() is that you can supply a void pointer which will
436 * be used as parameter to the registered function upon programmer shutdown.
437 * This pointer can point to arbitrary data used by said function, e.g. undo
438 * information for GPIO settings etc. If unneeded, set data=NULL.
439 * Please note that the first (void *data) belongs to the function signature of
440 * the function passed as first parameter.
441 */
David Hendricks8bb20212011-06-14 01:35:36 +0000442int register_shutdown(int (*function) (void *data), void *data)
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000443{
444 if (shutdown_fn_count >= SHUTDOWN_MAXFN) {
Carl-Daniel Hailfinger9f5f2152010-06-04 23:20:21 +0000445 msg_perr("Tried to register more than %i shutdown functions.\n",
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000446 SHUTDOWN_MAXFN);
447 return 1;
448 }
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000449 if (!may_register_shutdown) {
450 msg_perr("Tried to register a shutdown function before "
451 "programmer init.\n");
452 return 1;
453 }
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000454 shutdown_fn[shutdown_fn_count].func = function;
455 shutdown_fn[shutdown_fn_count].data = data;
456 shutdown_fn_count++;
457
458 return 0;
459}
460
Nico Huberbcb2e5a2012-12-30 01:23:17 +0000461int programmer_init(enum programmer prog, const char *param)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000462{
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000463 int ret;
Carl-Daniel Hailfinger2e681602011-09-08 00:00:29 +0000464
465 if (prog >= PROGRAMMER_INVALID) {
466 msg_perr("Invalid programmer specified!\n");
467 return -1;
468 }
469 programmer = prog;
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000470 /* Initialize all programmer specific data. */
471 /* Default to unlimited decode sizes. */
472 max_rom_decode = (const struct decode_sizes) {
473 .parallel = 0xffffffff,
474 .lpc = 0xffffffff,
475 .fwh = 0xffffffff,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000476 .spi = 0xffffffff,
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000477 };
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000478 /* Default to top aligned flash at 4 GB. */
479 flashbase = 0;
480 /* Registering shutdown functions is now allowed. */
481 may_register_shutdown = 1;
Carl-Daniel Hailfingerd1be52d2010-07-03 12:14:25 +0000482 /* Default to allowing writes. Broken programmers set this to 0. */
483 programmer_may_write = 1;
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000484
485 programmer_param = param;
Carl-Daniel Hailfinger20a36ba2013-08-13 07:09:57 +0000486 msg_pdbg("Initializing %s programmer\n", programmer_table[programmer].name);
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000487 ret = programmer_table[programmer].init();
488 if (programmer_param && strlen(programmer_param)) {
Carl-Daniel Hailfinger20a36ba2013-08-13 07:09:57 +0000489 if (ret != 0) {
490 /* It is quite possible that any unhandled programmer parameter would have been valid,
491 * but an error in actual programmer init happened before the parameter was evaluated.
492 */
493 msg_pwarn("Unhandled programmer parameters (possibly due to another failure): %s\n",
494 programmer_param);
495 } else {
496 /* Actual programmer init was successful, but the user specified an invalid or unusable
497 * (for the current programmer configuration) parameter.
498 */
499 msg_perr("Unhandled programmer parameters: %s\n", programmer_param);
500 msg_perr("Aborting.\n");
501 ret = ERROR_FATAL;
502 }
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000503 }
504 return ret;
Uwe Hermann09e04f72009-05-16 22:36:00 +0000505}
506
Stefan Tauner20da4aa2014-05-07 22:07:23 +0000507/** Calls registered shutdown functions and resets internal programmer-related variables.
508 * Calling it is safe even without previous initialization, but further interactions with programmer support
509 * require a call to programmer_init() (afterwards).
510 *
511 * @return The OR-ed result values of all shutdown functions (i.e. 0 on success). */
Uwe Hermann09e04f72009-05-16 22:36:00 +0000512int programmer_shutdown(void)
513{
David Hendricks8bb20212011-06-14 01:35:36 +0000514 int ret = 0;
515
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000516 /* Registering shutdown functions is no longer allowed. */
517 may_register_shutdown = 0;
518 while (shutdown_fn_count > 0) {
519 int i = --shutdown_fn_count;
David Hendricks8bb20212011-06-14 01:35:36 +0000520 ret |= shutdown_fn[i].func(shutdown_fn[i].data);
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000521 }
Stefan Taunere34e3e82013-01-01 00:06:51 +0000522
Stefan Taunerb8911d62012-12-26 07:55:00 +0000523 programmer_param = NULL;
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000524 registered_master_count = 0;
Stefan Taunere34e3e82013-01-01 00:06:51 +0000525
David Hendricks8bb20212011-06-14 01:35:36 +0000526 return ret;
Uwe Hermann09e04f72009-05-16 22:36:00 +0000527}
528
Stefan Tauner305e0b92013-07-17 23:46:44 +0000529void *programmer_map_flash_region(const char *descr, uintptr_t phys_addr, size_t len)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000530{
Stefan Tauner26e7a152013-09-13 17:21:05 +0000531 void *ret = programmer_table[programmer].map_flash_region(descr, phys_addr, len);
532 msg_gspew("%s: mapping %s from 0x%0*" PRIxPTR " to 0x%0*" PRIxPTR "\n",
533 __func__, descr, PRIxPTR_WIDTH, phys_addr, PRIxPTR_WIDTH, (uintptr_t) ret);
534 return ret;
Uwe Hermann09e04f72009-05-16 22:36:00 +0000535}
536
537void programmer_unmap_flash_region(void *virt_addr, size_t len)
538{
539 programmer_table[programmer].unmap_flash_region(virt_addr, len);
Stefan Tauner4e32ec12014-08-30 23:39:51 +0000540 msg_gspew("%s: unmapped 0x%0*" PRIxPTR "\n", __func__, PRIxPTR_WIDTH, (uintptr_t)virt_addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000541}
542
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000543void chip_writeb(const struct flashctx *flash, uint8_t val, chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000544{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000545 flash->mst->par.chip_writeb(flash, val, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000546}
547
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000548void chip_writew(const struct flashctx *flash, uint16_t val, chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000549{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000550 flash->mst->par.chip_writew(flash, val, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000551}
552
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000553void chip_writel(const struct flashctx *flash, uint32_t val, chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000554{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000555 flash->mst->par.chip_writel(flash, val, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000556}
557
Mark Marshallf20b7be2014-05-09 21:16:21 +0000558void chip_writen(const struct flashctx *flash, const uint8_t *buf, chipaddr addr, size_t len)
Carl-Daniel Hailfinger0bd2a2b2009-06-05 18:32:07 +0000559{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000560 flash->mst->par.chip_writen(flash, buf, addr, len);
Carl-Daniel Hailfinger0bd2a2b2009-06-05 18:32:07 +0000561}
562
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000563uint8_t chip_readb(const struct flashctx *flash, const chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000564{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000565 return flash->mst->par.chip_readb(flash, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000566}
567
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000568uint16_t chip_readw(const struct flashctx *flash, const chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000569{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000570 return flash->mst->par.chip_readw(flash, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000571}
572
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000573uint32_t chip_readl(const struct flashctx *flash, const chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000574{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000575 return flash->mst->par.chip_readl(flash, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000576}
577
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000578void chip_readn(const struct flashctx *flash, uint8_t *buf, chipaddr addr,
579 size_t len)
Carl-Daniel Hailfinger0bd2a2b2009-06-05 18:32:07 +0000580{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000581 flash->mst->par.chip_readn(flash, buf, addr, len);
Carl-Daniel Hailfinger0bd2a2b2009-06-05 18:32:07 +0000582}
583
Stefan Taunerf80419c2014-05-02 15:41:42 +0000584void programmer_delay(unsigned int usecs)
Carl-Daniel Hailfingerca8bfc62009-06-05 17:48:08 +0000585{
Urja Rannikko8d7ec2a2013-10-21 21:49:08 +0000586 if (usecs > 0)
587 programmer_table[programmer].delay(usecs);
Carl-Daniel Hailfingerca8bfc62009-06-05 17:48:08 +0000588}
589
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000590int read_memmapped(struct flashctx *flash, uint8_t *buf, unsigned int start,
591 int unsigned len)
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000592{
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000593 chip_readn(flash, buf, flash->virtual_memory + start, len);
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000594
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000595 return 0;
596}
597
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000598/* This is a somewhat hacked function similar in some ways to strtok().
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000599 * It will look for needle with a subsequent '=' in haystack, return a copy of
600 * needle and remove everything from the first occurrence of needle to the next
601 * delimiter from haystack.
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000602 */
Nico Huberbcb2e5a2012-12-30 01:23:17 +0000603char *extract_param(const char *const *haystack, const char *needle, const char *delim)
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000604{
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000605 char *param_pos, *opt_pos, *rest;
606 char *opt = NULL;
607 int optlen;
Carl-Daniel Hailfinger27023762010-04-28 15:22:14 +0000608 int needlelen;
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000609
Carl-Daniel Hailfinger27023762010-04-28 15:22:14 +0000610 needlelen = strlen(needle);
611 if (!needlelen) {
612 msg_gerr("%s: empty needle! Please report a bug at "
613 "flashrom@flashrom.org\n", __func__);
614 return NULL;
615 }
616 /* No programmer parameters given. */
617 if (*haystack == NULL)
618 return NULL;
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000619 param_pos = strstr(*haystack, needle);
620 do {
621 if (!param_pos)
622 return NULL;
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000623 /* Needle followed by '='? */
624 if (param_pos[needlelen] == '=') {
625
626 /* Beginning of the string? */
627 if (param_pos == *haystack)
628 break;
629 /* After a delimiter? */
630 if (strchr(delim, *(param_pos - 1)))
631 break;
632 }
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000633 /* Continue searching. */
634 param_pos++;
635 param_pos = strstr(param_pos, needle);
636 } while (1);
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000637
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000638 if (param_pos) {
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000639 /* Get the string after needle and '='. */
640 opt_pos = param_pos + needlelen + 1;
641 optlen = strcspn(opt_pos, delim);
642 /* Return an empty string if the parameter was empty. */
643 opt = malloc(optlen + 1);
644 if (!opt) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000645 msg_gerr("Out of memory!\n");
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000646 exit(1);
647 }
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000648 strncpy(opt, opt_pos, optlen);
649 opt[optlen] = '\0';
650 rest = opt_pos + optlen;
651 /* Skip all delimiters after the current parameter. */
652 rest += strspn(rest, delim);
653 memmove(param_pos, rest, strlen(rest) + 1);
654 /* We could shrink haystack, but the effort is not worth it. */
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000655 }
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000656
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000657 return opt;
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000658}
659
Stefan Tauner66652442011-06-26 17:38:17 +0000660char *extract_programmer_param(const char *param_name)
Carl-Daniel Hailfinger2b6dcb32010-07-08 10:13:37 +0000661{
662 return extract_param(&programmer_param, param_name, ",");
663}
664
Sylvain "ythier" Hitier9db45512011-07-04 07:27:17 +0000665/* Returns the number of well-defined erasers for a chip. */
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +0000666static unsigned int count_usable_erasers(const struct flashctx *flash)
Stefan Tauner5368dca2011-07-01 00:19:12 +0000667{
668 unsigned int usable_erasefunctions = 0;
669 int k;
670 for (k = 0; k < NUM_ERASEFUNCTIONS; k++) {
671 if (!check_block_eraser(flash, k, 0))
672 usable_erasefunctions++;
673 }
674 return usable_erasefunctions;
675}
676
Mark Marshallf20b7be2014-05-09 21:16:21 +0000677static int compare_range(const uint8_t *wantbuf, const uint8_t *havebuf, unsigned int start, unsigned int len)
Stefan Tauner78ffbea2012-10-27 15:36:56 +0000678{
679 int ret = 0, failcount = 0;
680 unsigned int i;
681 for (i = 0; i < len; i++) {
682 if (wantbuf[i] != havebuf[i]) {
683 /* Only print the first failure. */
684 if (!failcount++)
685 msg_cerr("FAILED at 0x%08x! Expected=0x%02x, Found=0x%02x,",
686 start + i, wantbuf[i], havebuf[i]);
687 }
688 }
689 if (failcount) {
690 msg_cerr(" failed byte count from 0x%08x-0x%08x: 0x%x\n",
691 start, start + len - 1, failcount);
692 ret = -1;
693 }
694 return ret;
695}
696
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000697/* start is an offset to the base address of the flash chip */
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000698int check_erased_range(struct flashctx *flash, unsigned int start,
699 unsigned int len)
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000700{
701 int ret;
702 uint8_t *cmpbuf = malloc(len);
703
704 if (!cmpbuf) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000705 msg_gerr("Could not allocate memory!\n");
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000706 exit(1);
707 }
708 memset(cmpbuf, 0xff, len);
Stefan Tauner78ffbea2012-10-27 15:36:56 +0000709 ret = verify_range(flash, cmpbuf, start, len);
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000710 free(cmpbuf);
711 return ret;
712}
713
Uwe Hermann48ec1b12010-08-08 17:01:18 +0000714/*
Carl-Daniel Hailfingerd0250a32009-11-25 17:05:52 +0000715 * @cmpbuf buffer to compare against, cmpbuf[0] is expected to match the
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000716 * flash content at location start
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000717 * @start offset to the base address of the flash chip
718 * @len length of the verified area
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000719 * @return 0 for success, -1 for failure
720 */
Mark Marshallf20b7be2014-05-09 21:16:21 +0000721int verify_range(struct flashctx *flash, const uint8_t *cmpbuf, unsigned int start, unsigned int len)
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000722{
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000723 if (!len)
Stefan Taunerdf64a422014-05-27 00:06:14 +0000724 return -1;
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000725
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +0000726 if (!flash->chip->read) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000727 msg_cerr("ERROR: flashrom has no read function for this flash chip.\n");
Stefan Taunerdf64a422014-05-27 00:06:14 +0000728 return -1;
Carl-Daniel Hailfinger23290662009-06-24 08:20:45 +0000729 }
Stefan Taunerdf64a422014-05-27 00:06:14 +0000730
731 uint8_t *readbuf = malloc(len);
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000732 if (!readbuf) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000733 msg_gerr("Could not allocate memory!\n");
Stefan Taunerdf64a422014-05-27 00:06:14 +0000734 return -1;
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000735 }
Stefan Taunerdf64a422014-05-27 00:06:14 +0000736 int ret = 0;
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000737
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +0000738 if (start + len > flash->chip->total_size * 1024) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000739 msg_gerr("Error: %s called with start 0x%x + len 0x%x >"
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000740 " total_size 0x%x\n", __func__, start, len,
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +0000741 flash->chip->total_size * 1024);
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000742 ret = -1;
743 goto out_free;
744 }
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000745
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +0000746 ret = flash->chip->read(flash, readbuf, start, len);
Carl-Daniel Hailfingerd8369412010-11-16 17:21:58 +0000747 if (ret) {
748 msg_gerr("Verification impossible because read failed "
749 "at 0x%x (len 0x%x)\n", start, len);
Stefan Taunerdf64a422014-05-27 00:06:14 +0000750 ret = -1;
751 goto out_free;
Carl-Daniel Hailfingerd8369412010-11-16 17:21:58 +0000752 }
753
Stefan Tauner78ffbea2012-10-27 15:36:56 +0000754 ret = compare_range(cmpbuf, readbuf, start, len);
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000755out_free:
756 free(readbuf);
757 return ret;
758}
759
Stefan Tauner02437452013-04-01 19:34:53 +0000760/* Helper function for need_erase() that focuses on granularities of gran bytes. */
Mark Marshallf20b7be2014-05-09 21:16:21 +0000761static int need_erase_gran_bytes(const uint8_t *have, const uint8_t *want, unsigned int len, unsigned int gran)
Stefan Tauner02437452013-04-01 19:34:53 +0000762{
763 unsigned int i, j, limit;
764 for (j = 0; j < len / gran; j++) {
765 limit = min (gran, len - j * gran);
766 /* Are 'have' and 'want' identical? */
767 if (!memcmp(have + j * gran, want + j * gran, limit))
768 continue;
769 /* have needs to be in erased state. */
770 for (i = 0; i < limit; i++)
771 if (have[j * gran + i] != 0xff)
772 return 1;
773 }
774 return 0;
775}
776
Uwe Hermann48ec1b12010-08-08 17:01:18 +0000777/*
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000778 * Check if the buffer @have can be programmed to the content of @want without
779 * erasing. This is only possible if all chunks of size @gran are either kept
780 * as-is or changed from an all-ones state to any other state.
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000781 *
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000782 * Warning: This function assumes that @have and @want point to naturally
783 * aligned regions.
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000784 *
785 * @have buffer with current content
786 * @want buffer with desired content
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000787 * @len length of the checked area
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000788 * @gran write granularity (enum, not count)
789 * @return 0 if no erase is needed, 1 otherwise
790 */
Mark Marshallf20b7be2014-05-09 21:16:21 +0000791int need_erase(const uint8_t *have, const uint8_t *want, unsigned int len, enum write_granularity gran)
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000792{
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +0000793 int result = 0;
Stefan Tauner02437452013-04-01 19:34:53 +0000794 unsigned int i;
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000795
796 switch (gran) {
797 case write_gran_1bit:
798 for (i = 0; i < len; i++)
799 if ((have[i] & want[i]) != want[i]) {
800 result = 1;
801 break;
802 }
803 break;
804 case write_gran_1byte:
805 for (i = 0; i < len; i++)
806 if ((have[i] != want[i]) && (have[i] != 0xff)) {
807 result = 1;
808 break;
809 }
810 break;
Paul Kocialkowskic8305e12015-10-16 02:16:20 +0000811 case write_gran_128bytes:
812 result = need_erase_gran_bytes(have, want, len, 128);
813 break;
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000814 case write_gran_256bytes:
Stefan Tauner02437452013-04-01 19:34:53 +0000815 result = need_erase_gran_bytes(have, want, len, 256);
816 break;
817 case write_gran_264bytes:
818 result = need_erase_gran_bytes(have, want, len, 264);
819 break;
820 case write_gran_512bytes:
821 result = need_erase_gran_bytes(have, want, len, 512);
822 break;
823 case write_gran_528bytes:
824 result = need_erase_gran_bytes(have, want, len, 528);
825 break;
826 case write_gran_1024bytes:
827 result = need_erase_gran_bytes(have, want, len, 1024);
828 break;
829 case write_gran_1056bytes:
830 result = need_erase_gran_bytes(have, want, len, 1056);
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000831 break;
Carl-Daniel Hailfinger1b0e9fc2014-06-16 22:36:17 +0000832 case write_gran_1byte_implicit_erase:
833 /* Do not erase, handle content changes from anything->0xff by writing 0xff. */
834 result = 0;
835 break;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000836 default:
837 msg_cerr("%s: Unsupported granularity! Please report a bug at "
838 "flashrom@flashrom.org\n", __func__);
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000839 }
840 return result;
841}
842
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000843/**
844 * Check if the buffer @have needs to be programmed to get the content of @want.
845 * If yes, return 1 and fill in first_start with the start address of the
846 * write operation and first_len with the length of the first to-be-written
847 * chunk. If not, return 0 and leave first_start and first_len undefined.
848 *
849 * Warning: This function assumes that @have and @want point to naturally
850 * aligned regions.
851 *
852 * @have buffer with current content
853 * @want buffer with desired content
854 * @len length of the checked area
855 * @gran write granularity (enum, not count)
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000856 * @first_start offset of the first byte which needs to be written (passed in
857 * value is increased by the offset of the first needed write
858 * relative to have/want or unchanged if no write is needed)
859 * @return length of the first contiguous area which needs to be written
860 * 0 if no write is needed
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000861 *
862 * FIXME: This function needs a parameter which tells it about coalescing
863 * in relation to the max write length of the programmer and the max write
864 * length of the chip.
865 */
Mark Marshallf20b7be2014-05-09 21:16:21 +0000866static unsigned int get_next_write(const uint8_t *have, const uint8_t *want, unsigned int len,
Stefan Taunerc69c9c82011-11-23 09:13:48 +0000867 unsigned int *first_start,
868 enum write_granularity gran)
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000869{
Stefan Taunerc69c9c82011-11-23 09:13:48 +0000870 int need_write = 0;
871 unsigned int rel_start = 0, first_len = 0;
872 unsigned int i, limit, stride;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000873
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000874 switch (gran) {
875 case write_gran_1bit:
876 case write_gran_1byte:
Carl-Daniel Hailfinger1b0e9fc2014-06-16 22:36:17 +0000877 case write_gran_1byte_implicit_erase:
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000878 stride = 1;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000879 break;
Paul Kocialkowskic8305e12015-10-16 02:16:20 +0000880 case write_gran_128bytes:
881 stride = 128;
882 break;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000883 case write_gran_256bytes:
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000884 stride = 256;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000885 break;
Stefan Tauner02437452013-04-01 19:34:53 +0000886 case write_gran_264bytes:
887 stride = 264;
888 break;
889 case write_gran_512bytes:
890 stride = 512;
891 break;
892 case write_gran_528bytes:
893 stride = 528;
894 break;
895 case write_gran_1024bytes:
896 stride = 1024;
897 break;
898 case write_gran_1056bytes:
899 stride = 1056;
900 break;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000901 default:
902 msg_cerr("%s: Unsupported granularity! Please report a bug at "
903 "flashrom@flashrom.org\n", __func__);
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000904 /* Claim that no write was needed. A write with unknown
905 * granularity is too dangerous to try.
906 */
907 return 0;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000908 }
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000909 for (i = 0; i < len / stride; i++) {
910 limit = min(stride, len - i * stride);
911 /* Are 'have' and 'want' identical? */
912 if (memcmp(have + i * stride, want + i * stride, limit)) {
913 if (!need_write) {
914 /* First location where have and want differ. */
915 need_write = 1;
916 rel_start = i * stride;
917 }
918 } else {
919 if (need_write) {
920 /* First location where have and want
921 * do not differ anymore.
922 */
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000923 break;
924 }
925 }
926 }
Carl-Daniel Hailfinger202bf532010-12-06 13:05:44 +0000927 if (need_write)
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000928 first_len = min(i * stride - rel_start, len);
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000929 *first_start += rel_start;
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000930 return first_len;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000931}
932
Carl-Daniel Hailfingereaac68b2009-11-23 12:55:31 +0000933/* This function generates various test patterns useful for testing controller
934 * and chip communication as well as chip behaviour.
935 *
936 * If a byte can be written multiple times, each time keeping 0-bits at 0
937 * and changing 1-bits to 0 if the new value for that bit is 0, the effect
938 * is essentially an AND operation. That's also the reason why this function
939 * provides the result of AND between various patterns.
940 *
941 * Below is a list of patterns (and their block length).
942 * Pattern 0 is 05 15 25 35 45 55 65 75 85 95 a5 b5 c5 d5 e5 f5 (16 Bytes)
943 * Pattern 1 is 0a 1a 2a 3a 4a 5a 6a 7a 8a 9a aa ba ca da ea fa (16 Bytes)
944 * Pattern 2 is 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f (16 Bytes)
945 * Pattern 3 is a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af (16 Bytes)
946 * Pattern 4 is 00 10 20 30 40 50 60 70 80 90 a0 b0 c0 d0 e0 f0 (16 Bytes)
947 * Pattern 5 is 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f (16 Bytes)
948 * Pattern 6 is 00 (1 Byte)
949 * Pattern 7 is ff (1 Byte)
950 * Patterns 0-7 have a big-endian block number in the last 2 bytes of each 256
951 * byte block.
952 *
953 * Pattern 8 is 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11... (256 B)
954 * Pattern 9 is ff fe fd fc fb fa f9 f8 f7 f6 f5 f4 f3 f2 f1 f0 ef ee... (256 B)
955 * Pattern 10 is 00 00 00 01 00 02 00 03 00 04... (128 kB big-endian counter)
956 * Pattern 11 is ff ff ff fe ff fd ff fc ff fb... (128 kB big-endian downwards)
957 * Pattern 12 is 00 (1 Byte)
958 * Pattern 13 is ff (1 Byte)
959 * Patterns 8-13 have no block number.
960 *
961 * Patterns 0-3 are created to detect and efficiently diagnose communication
962 * slips like missed bits or bytes and their repetitive nature gives good visual
963 * cues to the person inspecting the results. In addition, the following holds:
964 * AND Pattern 0/1 == Pattern 4
965 * AND Pattern 2/3 == Pattern 5
966 * AND Pattern 0/1/2/3 == AND Pattern 4/5 == Pattern 6
967 * A weakness of pattern 0-5 is the inability to detect swaps/copies between
968 * any two 16-byte blocks except for the last 16-byte block in a 256-byte bloc.
969 * They work perfectly for detecting any swaps/aliasing of blocks >= 256 bytes.
970 * 0x5 and 0xa were picked because they are 0101 and 1010 binary.
971 * Patterns 8-9 are best for detecting swaps/aliasing of blocks < 256 bytes.
972 * Besides that, they provide for bit testing of the last two bytes of every
973 * 256 byte block which contains the block number for patterns 0-6.
974 * Patterns 10-11 are special purpose for detecting subblock aliasing with
975 * block sizes >256 bytes (some Dataflash chips etc.)
976 * AND Pattern 8/9 == Pattern 12
977 * AND Pattern 10/11 == Pattern 12
978 * Pattern 13 is the completely erased state.
979 * None of the patterns can detect aliasing at boundaries which are a multiple
980 * of 16 MBytes (but such chips do not exist anyway for Parallel/LPC/FWH/SPI).
981 */
982int generate_testpattern(uint8_t *buf, uint32_t size, int variant)
983{
984 int i;
985
986 if (!buf) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000987 msg_gerr("Invalid buffer!\n");
Carl-Daniel Hailfingereaac68b2009-11-23 12:55:31 +0000988 return 1;
989 }
990
991 switch (variant) {
992 case 0:
993 for (i = 0; i < size; i++)
994 buf[i] = (i & 0xf) << 4 | 0x5;
995 break;
996 case 1:
997 for (i = 0; i < size; i++)
998 buf[i] = (i & 0xf) << 4 | 0xa;
999 break;
1000 case 2:
1001 for (i = 0; i < size; i++)
1002 buf[i] = 0x50 | (i & 0xf);
1003 break;
1004 case 3:
1005 for (i = 0; i < size; i++)
1006 buf[i] = 0xa0 | (i & 0xf);
1007 break;
1008 case 4:
1009 for (i = 0; i < size; i++)
1010 buf[i] = (i & 0xf) << 4;
1011 break;
1012 case 5:
1013 for (i = 0; i < size; i++)
1014 buf[i] = i & 0xf;
1015 break;
1016 case 6:
1017 memset(buf, 0x00, size);
1018 break;
1019 case 7:
1020 memset(buf, 0xff, size);
1021 break;
1022 case 8:
1023 for (i = 0; i < size; i++)
1024 buf[i] = i & 0xff;
1025 break;
1026 case 9:
1027 for (i = 0; i < size; i++)
1028 buf[i] = ~(i & 0xff);
1029 break;
1030 case 10:
1031 for (i = 0; i < size % 2; i++) {
1032 buf[i * 2] = (i >> 8) & 0xff;
1033 buf[i * 2 + 1] = i & 0xff;
1034 }
1035 if (size & 0x1)
1036 buf[i * 2] = (i >> 8) & 0xff;
1037 break;
1038 case 11:
1039 for (i = 0; i < size % 2; i++) {
1040 buf[i * 2] = ~((i >> 8) & 0xff);
1041 buf[i * 2 + 1] = ~(i & 0xff);
1042 }
1043 if (size & 0x1)
1044 buf[i * 2] = ~((i >> 8) & 0xff);
1045 break;
1046 case 12:
1047 memset(buf, 0x00, size);
1048 break;
1049 case 13:
1050 memset(buf, 0xff, size);
1051 break;
1052 }
1053
1054 if ((variant >= 0) && (variant <= 7)) {
1055 /* Write block number in the last two bytes of each 256-byte
1056 * block, big endian for easier reading of the hexdump.
1057 * Note that this wraps around for chips larger than 2^24 bytes
1058 * (16 MB).
1059 */
1060 for (i = 0; i < size / 256; i++) {
1061 buf[i * 256 + 254] = (i >> 8) & 0xff;
1062 buf[i * 256 + 255] = i & 0xff;
1063 }
1064 }
1065
1066 return 0;
1067}
1068
Stefan Tauner9e3a6982014-08-15 17:17:59 +00001069/* Returns the number of busses commonly supported by the current programmer and flash chip where the latter
1070 * can not be completely accessed due to size/address limits of the programmer. */
1071unsigned int count_max_decode_exceedings(const struct flashctx *flash)
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001072{
Stefan Tauner9e3a6982014-08-15 17:17:59 +00001073 unsigned int limitexceeded = 0;
1074 uint32_t size = flash->chip->total_size * 1024;
1075 enum chipbustype buses = flash->mst->buses_supported & flash->chip->bustype;
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001076
1077 if ((buses & BUS_PARALLEL) && (max_rom_decode.parallel < size)) {
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001078 limitexceeded++;
Sean Nelson316a29f2010-05-07 20:09:04 +00001079 msg_pdbg("Chip size %u kB is bigger than supported "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001080 "size %u kB of chipset/board/programmer "
1081 "for %s interface, "
1082 "probe/read/erase/write may fail. ", size / 1024,
1083 max_rom_decode.parallel / 1024, "Parallel");
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001084 }
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001085 if ((buses & BUS_LPC) && (max_rom_decode.lpc < size)) {
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001086 limitexceeded++;
Sean Nelson316a29f2010-05-07 20:09:04 +00001087 msg_pdbg("Chip size %u kB is bigger than supported "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001088 "size %u kB of chipset/board/programmer "
1089 "for %s interface, "
1090 "probe/read/erase/write may fail. ", size / 1024,
1091 max_rom_decode.lpc / 1024, "LPC");
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001092 }
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001093 if ((buses & BUS_FWH) && (max_rom_decode.fwh < size)) {
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001094 limitexceeded++;
Sean Nelson316a29f2010-05-07 20:09:04 +00001095 msg_pdbg("Chip size %u kB is bigger than supported "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001096 "size %u kB of chipset/board/programmer "
1097 "for %s interface, "
1098 "probe/read/erase/write may fail. ", size / 1024,
1099 max_rom_decode.fwh / 1024, "FWH");
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001100 }
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001101 if ((buses & BUS_SPI) && (max_rom_decode.spi < size)) {
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001102 limitexceeded++;
Sean Nelson316a29f2010-05-07 20:09:04 +00001103 msg_pdbg("Chip size %u kB is bigger than supported "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001104 "size %u kB of chipset/board/programmer "
1105 "for %s interface, "
1106 "probe/read/erase/write may fail. ", size / 1024,
1107 max_rom_decode.spi / 1024, "SPI");
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001108 }
Stefan Tauner9e3a6982014-08-15 17:17:59 +00001109 return limitexceeded;
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001110}
1111
Stefan Tauner4e32ec12014-08-30 23:39:51 +00001112void unmap_flash(struct flashctx *flash)
1113{
1114 if (flash->virtual_registers != (chipaddr)ERROR_PTR) {
1115 programmer_unmap_flash_region((void *)flash->virtual_registers, flash->chip->total_size * 1024);
1116 flash->physical_registers = 0;
1117 flash->virtual_registers = (chipaddr)ERROR_PTR;
1118 }
1119
1120 if (flash->virtual_memory != (chipaddr)ERROR_PTR) {
1121 programmer_unmap_flash_region((void *)flash->virtual_memory, flash->chip->total_size * 1024);
1122 flash->physical_memory = 0;
1123 flash->virtual_memory = (chipaddr)ERROR_PTR;
1124 }
1125}
1126
1127int map_flash(struct flashctx *flash)
1128{
1129 /* Init pointers to the fail-safe state to distinguish them later from legit values. */
1130 flash->virtual_memory = (chipaddr)ERROR_PTR;
1131 flash->virtual_registers = (chipaddr)ERROR_PTR;
1132
1133 /* FIXME: This avoids mapping (and unmapping) of flash chip definitions with size 0.
1134 * These are used for various probing-related hacks that would not map successfully anyway and should be
1135 * removed ASAP. */
1136 if (flash->chip->total_size == 0)
1137 return 0;
1138
1139 const chipsize_t size = flash->chip->total_size * 1024;
1140 uintptr_t base = flashbase ? flashbase : (0xffffffff - size + 1);
1141 void *addr = programmer_map_flash_region(flash->chip->name, base, size);
1142 if (addr == ERROR_PTR) {
1143 msg_perr("Could not map flash chip %s at 0x%0*" PRIxPTR ".\n",
1144 flash->chip->name, PRIxPTR_WIDTH, base);
1145 return 1;
1146 }
1147 flash->physical_memory = base;
1148 flash->virtual_memory = (chipaddr)addr;
1149
1150 /* FIXME: Special function registers normally live 4 MByte below flash space, but it might be somewhere
1151 * completely different on some chips and programmers, or not mappable at all.
1152 * Ignore these problems for now and always report success. */
1153 if (flash->chip->feature_bits & FEATURE_REGISTERMAP) {
1154 base = 0xffffffff - size - 0x400000 + 1;
1155 addr = programmer_map_flash_region("flash chip registers", base, size);
1156 if (addr == ERROR_PTR) {
1157 msg_pdbg2("Could not map flash chip registers %s at 0x%0*" PRIxPTR ".\n",
1158 flash->chip->name, PRIxPTR_WIDTH, base);
1159 return 0;
1160 }
1161 flash->physical_registers = base;
1162 flash->virtual_registers = (chipaddr)addr;
1163 }
1164 return 0;
1165}
1166
Nico Huber2d625722016-05-03 10:48:02 +02001167/*
1168 * Return a string corresponding to the bustype parameter.
1169 * Memory is obtained with malloc() and must be freed with free() by the caller.
1170 */
1171char *flashbuses_to_text(enum chipbustype bustype)
1172{
1173 char *ret = calloc(1, 1);
1174 /*
1175 * FIXME: Once all chipsets and flash chips have been updated, NONSPI
1176 * will cease to exist and should be eliminated here as well.
1177 */
1178 if (bustype == BUS_NONSPI) {
1179 ret = strcat_realloc(ret, "Non-SPI, ");
1180 } else {
1181 if (bustype & BUS_PARALLEL)
1182 ret = strcat_realloc(ret, "Parallel, ");
1183 if (bustype & BUS_LPC)
1184 ret = strcat_realloc(ret, "LPC, ");
1185 if (bustype & BUS_FWH)
1186 ret = strcat_realloc(ret, "FWH, ");
1187 if (bustype & BUS_SPI)
1188 ret = strcat_realloc(ret, "SPI, ");
1189 if (bustype & BUS_PROG)
1190 ret = strcat_realloc(ret, "Programmer-specific, ");
1191 if (bustype == BUS_NONE)
1192 ret = strcat_realloc(ret, "None, ");
1193 }
1194 /* Kill last comma. */
1195 ret[strlen(ret) - 2] = '\0';
1196 ret = realloc(ret, strlen(ret) + 1);
1197 return ret;
1198}
1199
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +00001200int probe_flash(struct registered_master *mst, int startchip, struct flashctx *flash, int force)
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001201{
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001202 const struct flashchip *chip;
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001203 enum chipbustype buses_common;
Carl-Daniel Hailfingerb22918c2009-06-01 02:08:58 +00001204 char *tmp;
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001205
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001206 for (chip = flashchips + startchip; chip && chip->name; chip++) {
1207 if (chip_to_probe && strcmp(chip->name, chip_to_probe) != 0)
Ollie Lhocbbf1252004-03-17 22:22:08 +00001208 continue;
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +00001209 buses_common = mst->buses_supported & chip->bustype;
Carl-Daniel Hailfingerc40cff72011-12-20 00:19:29 +00001210 if (!buses_common)
Carl-Daniel Hailfinger6573b742011-06-17 22:38:53 +00001211 continue;
Mike Banon31b5e3b2018-01-15 01:10:00 +03001212 /* Only probe for SPI25 chips by default. */
1213 if (chip->bustype == BUS_SPI && !chip_to_probe && chip->spi_cmd_set != SPI25)
1214 continue;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001215 msg_gdbg("Probing for %s %s, %d kB: ", chip->vendor, chip->name, chip->total_size);
1216 if (!chip->probe && !force) {
1217 msg_gdbg("failed! flashrom has no probe function for this flash chip.\n");
Carl-Daniel Hailfingerb22918c2009-06-01 02:08:58 +00001218 continue;
1219 }
Stefan Reinauer70385642007-04-06 11:58:03 +00001220
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001221 /* Start filling in the dynamic data. */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001222 flash->chip = calloc(1, sizeof(struct flashchip));
1223 if (!flash->chip) {
1224 msg_gerr("Out of memory!\n");
1225 exit(1);
1226 }
1227 memcpy(flash->chip, chip, sizeof(struct flashchip));
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +00001228 flash->mst = mst;
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001229
Stefan Tauner4e32ec12014-08-30 23:39:51 +00001230 if (map_flash(flash) != 0)
Martin Schiller57a3b732017-11-23 06:24:57 +01001231 goto notfound;
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001232
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001233 /* We handle a forced match like a real match, we just avoid probing. Note that probe_flash()
1234 * is only called with force=1 after normal probing failed.
1235 */
Peter Stuge27c3e2d2008-07-02 17:15:47 +00001236 if (force)
1237 break;
Stefan Reinauerfcb63682006-03-16 16:57:41 +00001238
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001239 if (flash->chip->probe(flash) != 1)
Peter Stuge483b8f02008-09-03 23:10:05 +00001240 goto notfound;
1241
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001242 /* If this is the first chip found, accept it.
1243 * If this is not the first chip found, accept it only if it is
Stefan Taunerac1b4c82012-02-17 14:51:04 +00001244 * a non-generic match. SFDP and CFI are generic matches.
1245 * startchip==0 means this call to probe_flash() is the first
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +00001246 * one for this programmer interface (master) and thus no other chip has
Stefan Taunerac1b4c82012-02-17 14:51:04 +00001247 * been found on this interface.
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001248 */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001249 if (startchip == 0 && flash->chip->model_id == SFDP_DEVICE_ID) {
Stefan Taunerac1b4c82012-02-17 14:51:04 +00001250 msg_cinfo("===\n"
1251 "SFDP has autodetected a flash chip which is "
1252 "not natively supported by flashrom yet.\n");
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001253 if (count_usable_erasers(flash) == 0)
Stefan Taunerac1b4c82012-02-17 14:51:04 +00001254 msg_cinfo("The standard operations read and "
1255 "verify should work, but to support "
1256 "erase, write and all other "
1257 "possible features");
1258 else
1259 msg_cinfo("All standard operations (read, "
1260 "verify, erase and write) should "
1261 "work, but to support all possible "
1262 "features");
1263
Stefan Taunerb4e06bd2012-08-20 00:24:22 +00001264 msg_cinfo(" we need to add them manually.\n"
1265 "You can help us by mailing us the output of the following command to "
1266 "flashrom@flashrom.org:\n"
1267 "'flashrom -VV [plus the -p/--programmer parameter]'\n"
1268 "Thanks for your help!\n"
Stefan Taunerac1b4c82012-02-17 14:51:04 +00001269 "===\n");
1270 }
1271
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001272 /* First flash chip detected on this bus. */
1273 if (startchip == 0)
Peter Stuge27c3e2d2008-07-02 17:15:47 +00001274 break;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001275 /* Not the first flash chip detected on this bus, but not a generic match either. */
1276 if ((flash->chip->model_id != GENERIC_DEVICE_ID) && (flash->chip->model_id != SFDP_DEVICE_ID))
1277 break;
1278 /* 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 +00001279notfound:
Stefan Tauner4e32ec12014-08-30 23:39:51 +00001280 unmap_flash(flash);
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001281 free(flash->chip);
1282 flash->chip = NULL;
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001283 }
Uwe Hermannffec5f32007-08-23 16:08:21 +00001284
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001285 if (!flash->chip)
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001286 return -1;
Peter Stuge27c3e2d2008-07-02 17:15:47 +00001287
Nico Huber7af0e792016-04-29 16:40:15 +02001288 /* Fill fallback layout covering the whole chip. */
1289 struct single_layout *const fallback = &flash->fallback_layout;
1290 fallback->base.entries = &fallback->entry;
1291 fallback->base.num_entries = 1;
1292 fallback->entry.start = 0;
1293 fallback->entry.end = flash->chip->total_size * 1024 - 1;
1294 fallback->entry.included = true;
1295 strcpy(fallback->entry.name, "complete flash");
Stefan Reinauer051e2362011-01-19 06:21:54 +00001296
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001297 tmp = flashbuses_to_text(flash->chip->bustype);
Stefan Tauner4e32ec12014-08-30 23:39:51 +00001298 msg_cinfo("%s %s flash chip \"%s\" (%d kB, %s) ", force ? "Assuming" : "Found",
1299 flash->chip->vendor, flash->chip->name, flash->chip->total_size, tmp);
Stefan Tauner00155492011-06-26 20:45:35 +00001300 free(tmp);
Stefan Tauner4e32ec12014-08-30 23:39:51 +00001301#if CONFIG_INTERNAL == 1
1302 if (programmer_table[programmer].map_flash_region == physmap)
1303 msg_cinfo("mapped at physical address 0x%0*" PRIxPTR ".\n",
1304 PRIxPTR_WIDTH, flash->physical_memory);
1305 else
1306#endif
1307 msg_cinfo("on %s.\n", programmer_table[programmer].name);
Uwe Hermann9899cad2009-06-28 21:47:57 +00001308
Stefan Tauner4e32ec12014-08-30 23:39:51 +00001309 /* Flash registers may more likely not be mapped if the chip was forced.
1310 * Lock info may be stored in registers, so avoid lock info printing. */
Carl-Daniel Hailfinger859f3f02010-12-02 21:59:42 +00001311 if (!force)
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001312 if (flash->chip->printlock)
1313 flash->chip->printlock(flash);
Sean Nelson6e0b9122010-02-19 00:52:10 +00001314
Stefan Tauner4e32ec12014-08-30 23:39:51 +00001315 /* Get out of the way for later runs. */
1316 unmap_flash(flash);
1317
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001318 /* Return position of matching chip. */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001319 return chip - flashchips;
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001320}
1321
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001322int read_buf_from_file(unsigned char *buf, unsigned long size,
1323 const char *filename)
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001324{
Nico Huber7562f7d2013-08-30 21:29:45 +00001325#ifdef __LIBPAYLOAD__
1326 msg_gerr("Error: No file I/O support in libpayload\n");
1327 return 1;
1328#else
Stefan Tauner16687702015-12-25 21:59:45 +00001329 int ret = 0;
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001330
Stefan Tauner16687702015-12-25 21:59:45 +00001331 FILE *image;
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001332 if ((image = fopen(filename, "rb")) == NULL) {
Stefan Tauner363fd7e2013-04-07 13:08:30 +00001333 msg_gerr("Error: opening file \"%s\" failed: %s\n", filename, strerror(errno));
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001334 return 1;
1335 }
Stefan Tauner16687702015-12-25 21:59:45 +00001336
1337 struct stat image_stat;
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001338 if (fstat(fileno(image), &image_stat) != 0) {
Stefan Tauner363fd7e2013-04-07 13:08:30 +00001339 msg_gerr("Error: getting metadata of file \"%s\" failed: %s\n", filename, strerror(errno));
Stefan Tauner16687702015-12-25 21:59:45 +00001340 ret = 1;
1341 goto out;
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001342 }
1343 if (image_stat.st_size != size) {
Carl-Daniel Hailfinger11990da2013-07-13 23:21:05 +00001344 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 +00001345 (intmax_t)image_stat.st_size, size);
Stefan Tauner16687702015-12-25 21:59:45 +00001346 ret = 1;
1347 goto out;
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001348 }
Stefan Tauner16687702015-12-25 21:59:45 +00001349
1350 unsigned long numbytes = fread(buf, 1, size, image);
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001351 if (numbytes != size) {
1352 msg_gerr("Error: Failed to read complete file. Got %ld bytes, "
1353 "wanted %ld!\n", numbytes, size);
Stefan Tauner16687702015-12-25 21:59:45 +00001354 ret = 1;
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001355 }
Stefan Tauner16687702015-12-25 21:59:45 +00001356out:
1357 (void)fclose(image);
1358 return ret;
Nico Huber7562f7d2013-08-30 21:29:45 +00001359#endif
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001360}
1361
Mark Marshallf20b7be2014-05-09 21:16:21 +00001362int write_buf_to_file(const unsigned char *buf, unsigned long size, const char *filename)
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001363{
Nico Huber7562f7d2013-08-30 21:29:45 +00001364#ifdef __LIBPAYLOAD__
1365 msg_gerr("Error: No file I/O support in libpayload\n");
1366 return 1;
1367#else
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001368 FILE *image;
Stefan Tauner16687702015-12-25 21:59:45 +00001369 int ret = 0;
Stephan Guilloux21dd55b2009-06-01 22:07:52 +00001370
1371 if (!filename) {
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001372 msg_gerr("No filename specified.\n");
Stephan Guilloux21dd55b2009-06-01 22:07:52 +00001373 return 1;
1374 }
Patrick Georgi0bf842d2010-01-25 22:55:33 +00001375 if ((image = fopen(filename, "wb")) == NULL) {
Stefan Tauner363fd7e2013-04-07 13:08:30 +00001376 msg_gerr("Error: opening file \"%s\" failed: %s\n", filename, strerror(errno));
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00001377 return 1;
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001378 }
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001379
Stefan Tauner16687702015-12-25 21:59:45 +00001380 unsigned long numbytes = fwrite(buf, 1, size, image);
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001381 if (numbytes != size) {
Stefan Tauner16687702015-12-25 21:59:45 +00001382 msg_gerr("Error: file %s could not be written completely.\n", filename);
1383 ret = 1;
1384 goto out;
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001385 }
Stefan Tauner16687702015-12-25 21:59:45 +00001386 if (fflush(image)) {
1387 msg_gerr("Error: flushing file \"%s\" failed: %s\n", filename, strerror(errno));
1388 ret = 1;
1389 }
1390 // Try to fsync() only regular files and if that function is available at all (e.g. not on MinGW).
1391#if defined(_POSIX_FSYNC) && (_POSIX_FSYNC != -1)
1392 struct stat image_stat;
1393 if (fstat(fileno(image), &image_stat) != 0) {
1394 msg_gerr("Error: getting metadata of file \"%s\" failed: %s\n", filename, strerror(errno));
1395 ret = 1;
1396 goto out;
1397 }
1398 if (S_ISREG(image_stat.st_mode)) {
1399 if (fsync(fileno(image))) {
1400 msg_gerr("Error: fsyncing file \"%s\" failed: %s\n", filename, strerror(errno));
1401 ret = 1;
1402 }
1403 }
1404#endif
1405out:
1406 if (fclose(image)) {
1407 msg_gerr("Error: closing file \"%s\" failed: %s\n", filename, strerror(errno));
1408 ret = 1;
1409 }
1410 return ret;
Nico Huber7562f7d2013-08-30 21:29:45 +00001411#endif
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001412}
1413
Nico Huber899e4ec2016-04-29 18:39:01 +02001414static int read_by_layout(struct flashctx *, uint8_t *);
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001415int read_flash_to_file(struct flashctx *flash, const char *filename)
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001416{
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001417 unsigned long size = flash->chip->total_size * 1024;
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001418 unsigned char *buf = calloc(size, sizeof(char));
1419 int ret = 0;
1420
1421 msg_cinfo("Reading flash... ");
1422 if (!buf) {
1423 msg_gerr("Memory allocation failed!\n");
1424 msg_cinfo("FAILED.\n");
1425 return 1;
1426 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001427 if (!flash->chip->read) {
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001428 msg_cerr("No read function available for this flash chip.\n");
1429 ret = 1;
1430 goto out_free;
1431 }
Nico Huber899e4ec2016-04-29 18:39:01 +02001432 if (read_by_layout(flash, buf)) {
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001433 msg_cerr("Read operation failed!\n");
1434 ret = 1;
1435 goto out_free;
1436 }
1437
Stefan Tauner355cbfd2011-05-28 02:37:14 +00001438 ret = write_buf_to_file(buf, size, filename);
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001439out_free:
1440 free(buf);
1441 msg_cinfo("%s.\n", ret ? "FAILED" : "done");
1442 return ret;
1443}
1444
Stefan Tauner96658be2014-05-26 22:05:31 +00001445/* Even if an error is found, the function will keep going and check the rest. */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001446static int selfcheck_eraseblocks(const struct flashchip *chip)
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001447{
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +00001448 int i, j, k;
1449 int ret = 0;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001450
1451 for (k = 0; k < NUM_ERASEFUNCTIONS; k++) {
1452 unsigned int done = 0;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001453 struct block_eraser eraser = chip->block_erasers[k];
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001454
1455 for (i = 0; i < NUM_ERASEREGIONS; i++) {
1456 /* Blocks with zero size are bugs in flashchips.c. */
1457 if (eraser.eraseblocks[i].count &&
1458 !eraser.eraseblocks[i].size) {
1459 msg_gerr("ERROR: Flash chip %s erase function "
1460 "%i region %i has size 0. Please report"
1461 " a bug at flashrom@flashrom.org\n",
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001462 chip->name, k, i);
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001463 ret = 1;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001464 }
1465 /* Blocks with zero count are bugs in flashchips.c. */
1466 if (!eraser.eraseblocks[i].count &&
1467 eraser.eraseblocks[i].size) {
1468 msg_gerr("ERROR: Flash chip %s erase function "
1469 "%i region %i has count 0. Please report"
1470 " a bug at flashrom@flashrom.org\n",
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001471 chip->name, k, i);
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001472 ret = 1;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001473 }
1474 done += eraser.eraseblocks[i].count *
1475 eraser.eraseblocks[i].size;
1476 }
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001477 /* Empty eraseblock definition with erase function. */
1478 if (!done && eraser.block_erase)
Sean Nelson316a29f2010-05-07 20:09:04 +00001479 msg_gspew("Strange: Empty eraseblock definition with "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001480 "non-empty erase function. Not an error.\n");
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001481 if (!done)
1482 continue;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001483 if (done != chip->total_size * 1024) {
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001484 msg_gerr("ERROR: Flash chip %s erase function %i "
1485 "region walking resulted in 0x%06x bytes total,"
1486 " expected 0x%06x bytes. Please report a bug at"
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001487 " flashrom@flashrom.org\n", chip->name, k,
1488 done, chip->total_size * 1024);
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001489 ret = 1;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001490 }
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001491 if (!eraser.block_erase)
1492 continue;
1493 /* Check if there are identical erase functions for different
1494 * layouts. That would imply "magic" erase functions. The
1495 * easiest way to check this is with function pointers.
1496 */
Uwe Hermann43959702010-03-13 17:28:29 +00001497 for (j = k + 1; j < NUM_ERASEFUNCTIONS; j++) {
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001498 if (eraser.block_erase ==
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001499 chip->block_erasers[j].block_erase) {
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001500 msg_gerr("ERROR: Flash chip %s erase function "
1501 "%i and %i are identical. Please report"
1502 " a bug at flashrom@flashrom.org\n",
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001503 chip->name, k, j);
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001504 ret = 1;
1505 }
Uwe Hermann43959702010-03-13 17:28:29 +00001506 }
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001507 }
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001508 return ret;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001509}
1510
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001511static int check_block_eraser(const struct flashctx *flash, int k, int log)
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001512{
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001513 struct block_eraser eraser = flash->chip->block_erasers[k];
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001514
1515 if (!eraser.block_erase && !eraser.eraseblocks[0].count) {
1516 if (log)
1517 msg_cdbg("not defined. ");
1518 return 1;
1519 }
1520 if (!eraser.block_erase && eraser.eraseblocks[0].count) {
1521 if (log)
1522 msg_cdbg("eraseblock layout is known, but matching "
Stefan Tauner355cbfd2011-05-28 02:37:14 +00001523 "block erase function is not implemented. ");
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001524 return 1;
1525 }
1526 if (eraser.block_erase && !eraser.eraseblocks[0].count) {
1527 if (log)
1528 msg_cdbg("block erase function found, but "
Stefan Tauner355cbfd2011-05-28 02:37:14 +00001529 "eraseblock layout is not defined. ");
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001530 return 1;
1531 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001532 // TODO: Once erase functions are annotated with allowed buses, check that as well.
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001533 return 0;
1534}
1535
Nico Huber7af0e792016-04-29 16:40:15 +02001536/**
1537 * @brief Reads the included layout regions into a buffer.
1538 *
1539 * If there is no layout set in the given flash context, the whole chip will
1540 * be read.
1541 *
1542 * @param flashctx Flash context to be used.
1543 * @param buffer Buffer of full chip size to read into.
1544 * @return 0 on success,
1545 * 1 if any read fails.
1546 */
1547static int read_by_layout(struct flashctx *const flashctx, uint8_t *const buffer)
1548{
1549 const struct flashrom_layout *const layout = get_layout(flashctx);
1550
1551 size_t i;
1552 for (i = 0; i < layout->num_entries; ++i) {
1553 if (!layout->entries[i].included)
1554 continue;
1555
1556 const chipoff_t region_start = layout->entries[i].start;
1557 const chipsize_t region_len = layout->entries[i].end - layout->entries[i].start + 1;
1558
1559 if (flashctx->chip->read(flashctx, buffer + region_start, region_start, region_len))
1560 return 1;
1561 }
1562 return 0;
1563}
1564
1565typedef int (*erasefn_t)(struct flashctx *, unsigned int addr, unsigned int len);
1566/**
1567 * @private
1568 *
1569 * For read-erase-write, `curcontents` and `newcontents` shall point
1570 * to buffers of the chip's size. Both are supposed to be prefilled
1571 * with at least the included layout regions of the current flash
1572 * contents (`curcontents`) and the data to be written to the flash
1573 * (`newcontents`).
1574 *
1575 * For erase, `curcontents` and `newcontents` shall be NULL-pointers.
1576 *
1577 * The `chipoff_t` values are used internally by `walk_by_layout()`.
1578 */
1579struct walk_info {
1580 uint8_t *curcontents;
1581 const uint8_t *newcontents;
1582 chipoff_t region_start;
1583 chipoff_t region_end;
1584 chipoff_t erase_start;
1585 chipoff_t erase_end;
1586};
1587/* returns 0 on success, 1 to retry with another erase function, 2 for immediate abort */
1588typedef int (*per_blockfn_t)(struct flashctx *, const struct walk_info *, erasefn_t);
1589
1590static int walk_eraseblocks(struct flashctx *const flashctx,
1591 struct walk_info *const info,
1592 const size_t erasefunction, const per_blockfn_t per_blockfn)
1593{
1594 int ret;
1595 size_t i, j;
1596 bool first = true;
1597 struct block_eraser *const eraser = &flashctx->chip->block_erasers[erasefunction];
1598
1599 info->erase_start = 0;
1600 for (i = 0; i < NUM_ERASEREGIONS; ++i) {
1601 /* count==0 for all automatically initialized array
1602 members so the loop below won't be executed for them. */
1603 for (j = 0; j < eraser->eraseblocks[i].count; ++j, info->erase_start = info->erase_end + 1) {
1604 info->erase_end = info->erase_start + eraser->eraseblocks[i].size - 1;
1605
1606 /* Skip any eraseblock that is completely outside the current region. */
1607 if (info->erase_end < info->region_start)
1608 continue;
1609 if (info->region_end < info->erase_start)
1610 break;
1611
1612 /* Print this for every block except the first one. */
1613 if (first)
1614 first = false;
1615 else
1616 msg_cdbg(", ");
1617 msg_cdbg("0x%06x-0x%06x:", info->erase_start, info->erase_end);
1618
1619 ret = per_blockfn(flashctx, info, eraser->block_erase);
1620 if (ret)
1621 return ret;
1622 }
1623 if (info->region_end < info->erase_start)
1624 break;
1625 }
1626 msg_cdbg("\n");
1627 return 0;
1628}
1629
1630static int walk_by_layout(struct flashctx *const flashctx, struct walk_info *const info,
1631 const per_blockfn_t per_blockfn)
1632{
1633 const struct flashrom_layout *const layout = get_layout(flashctx);
1634
1635 all_skipped = true;
1636 msg_cinfo("Erasing and writing flash chip... ");
1637
1638 size_t i;
1639 for (i = 0; i < layout->num_entries; ++i) {
1640 if (!layout->entries[i].included)
1641 continue;
1642
1643 info->region_start = layout->entries[i].start;
1644 info->region_end = layout->entries[i].end;
1645
1646 size_t j;
1647 int error = 1; /* retry as long as it's 1 */
1648 for (j = 0; j < NUM_ERASEFUNCTIONS; ++j) {
1649 if (j != 0)
1650 msg_cinfo("Looking for another erase function.\n");
1651 msg_cdbg("Trying erase function %zi... ", j);
1652 if (check_block_eraser(flashctx, j, 1))
1653 continue;
1654
1655 error = walk_eraseblocks(flashctx, info, j, per_blockfn);
1656 if (error != 1)
1657 break;
1658
1659 if (info->curcontents) {
1660 msg_cinfo("Reading current flash chip contents... ");
1661 if (read_by_layout(flashctx, info->curcontents)) {
1662 /* Now we are truly screwed. Read failed as well. */
1663 msg_cerr("Can't read anymore! Aborting.\n");
1664 /* We have no idea about the flash chip contents, so
1665 retrying with another erase function is pointless. */
1666 error = 2;
1667 break;
1668 }
1669 msg_cinfo("done. ");
1670 }
1671 }
1672 if (error == 1)
1673 msg_cinfo("No usable erase functions left.\n");
1674 if (error) {
1675 msg_cerr("FAILED!\n");
1676 return 1;
1677 }
1678 }
1679 if (all_skipped)
1680 msg_cinfo("\nWarning: Chip content is identical to the requested image.\n");
1681 msg_cinfo("Erase/write done.\n");
1682 return 0;
1683}
1684
1685static int erase_block(struct flashctx *const flashctx,
1686 const struct walk_info *const info, const erasefn_t erasefn)
1687{
1688 const unsigned int erase_len = info->erase_end + 1 - info->erase_start;
1689
1690 all_skipped = false;
1691
1692 msg_cdbg("E");
1693 if (erasefn(flashctx, info->erase_start, erase_len))
1694 return 1;
1695 if (check_erased_range(flashctx, info->erase_start, erase_len)) {
1696 msg_cerr("ERASE FAILED!\n");
1697 return 1;
1698 }
1699 return 0;
1700}
1701
1702/**
1703 * @brief Erases the included layout regions.
1704 *
1705 * If there is no layout set in the given flash context, the whole chip will
1706 * be erased.
1707 *
1708 * @param flashctx Flash context to be used.
1709 * @param buffer Buffer of full chip size to read into.
1710 * @return 0 on success,
1711 * 1 if all available erase functions failed.
1712 */
Nico Huber454f6132012-12-10 13:34:10 +00001713static int erase_by_layout(struct flashctx *const flashctx)
Nico Huber7af0e792016-04-29 16:40:15 +02001714{
1715 struct walk_info info = { 0 };
1716 return walk_by_layout(flashctx, &info, &erase_block);
1717}
1718
1719static int read_erase_write_block(struct flashctx *const flashctx,
1720 const struct walk_info *const info, const erasefn_t erasefn)
1721{
1722 const chipsize_t erase_len = info->erase_end + 1 - info->erase_start;
1723 const bool region_unaligned = info->region_start > info->erase_start ||
1724 info->erase_end > info->region_end;
1725 const uint8_t *newcontents = NULL;
1726 int ret = 2;
1727
1728 /*
1729 * If the region is not erase-block aligned, merge current flash con-
1730 * tents into `info->curcontents` and a new buffer `newc`. The former
1731 * is necessary since we have no guarantee that the full erase block
1732 * was already read into `info->curcontents`. For the latter a new
1733 * buffer is used since `info->newcontents` might contain data for
1734 * other unaligned regions that touch this erase block too.
1735 */
1736 if (region_unaligned) {
1737 msg_cdbg("R");
1738 uint8_t *const newc = malloc(erase_len);
1739 if (!newc) {
1740 msg_cerr("Out of memory!\n");
1741 return 1;
1742 }
1743 memcpy(newc, info->newcontents + info->erase_start, erase_len);
1744
1745 /* Merge data preceding the current region. */
1746 if (info->region_start > info->erase_start) {
1747 const chipoff_t start = info->erase_start;
1748 const chipsize_t len = info->region_start - info->erase_start;
1749 if (flashctx->chip->read(flashctx, newc, start, len)) {
1750 msg_cerr("Can't read! Aborting.\n");
1751 goto _free_ret;
1752 }
1753 memcpy(info->curcontents + start, newc, len);
1754 }
1755 /* Merge data following the current region. */
1756 if (info->erase_end > info->region_end) {
1757 const chipoff_t start = info->region_end + 1;
1758 const chipoff_t rel_start = start - info->erase_start; /* within this erase block */
1759 const chipsize_t len = info->erase_end - info->region_end;
1760 if (flashctx->chip->read(flashctx, newc + rel_start, start, len)) {
1761 msg_cerr("Can't read! Aborting.\n");
1762 goto _free_ret;
1763 }
1764 memcpy(info->curcontents + start, newc + rel_start, len);
1765 }
1766
1767 newcontents = newc;
1768 } else {
1769 newcontents = info->newcontents + info->erase_start;
1770 }
1771
1772 ret = 1;
1773 bool skipped = true;
1774 uint8_t *const curcontents = info->curcontents + info->erase_start;
1775 if (need_erase(curcontents, newcontents, erase_len, flashctx->chip->gran)) {
1776 if (erase_block(flashctx, info, erasefn))
1777 goto _free_ret;
1778 /* Erase was successful. Adjust curcontents. */
1779 memset(curcontents, 0xff, erase_len);
1780 skipped = false;
1781 }
1782
1783 unsigned int starthere = 0, lenhere = 0, writecount = 0;
1784 /* get_next_write() sets starthere to a new value after the call. */
1785 while ((lenhere = get_next_write(curcontents + starthere, newcontents + starthere,
1786 erase_len - starthere, &starthere, flashctx->chip->gran))) {
1787 if (!writecount++)
1788 msg_cdbg("W");
1789 /* Needs the partial write function signature. */
1790 if (flashctx->chip->write(flashctx, newcontents + starthere,
1791 info->erase_start + starthere, lenhere))
1792 goto _free_ret;
1793 starthere += lenhere;
1794 skipped = false;
1795 }
1796 if (skipped)
1797 msg_cdbg("S");
1798 else
1799 all_skipped = false;
1800
1801 /* Update curcontents, other regions with overlapping erase blocks
1802 might rely on this. */
1803 memcpy(curcontents, newcontents, erase_len);
1804 ret = 0;
1805
1806_free_ret:
1807 if (region_unaligned)
1808 free((void *)newcontents);
1809 return ret;
1810}
1811
1812/**
1813 * @brief Writes the included layout regions from a given image.
1814 *
1815 * If there is no layout set in the given flash context, the whole image
1816 * will be written.
1817 *
1818 * @param flashctx Flash context to be used.
1819 * @param curcontents A buffer of full chip size with current chip contents of included regions.
1820 * @param newcontents The new image to be written.
1821 * @return 0 on success,
1822 * 1 if anything has gone wrong.
1823 */
Nico Huber454f6132012-12-10 13:34:10 +00001824static int write_by_layout(struct flashctx *const flashctx,
1825 void *const curcontents, const void *const newcontents)
Nico Huber7af0e792016-04-29 16:40:15 +02001826{
1827 struct walk_info info;
1828 info.curcontents = curcontents;
1829 info.newcontents = newcontents;
1830 return walk_by_layout(flashctx, &info, read_erase_write_block);
1831}
1832
1833/**
1834 * @brief Compares the included layout regions with content from a buffer.
1835 *
1836 * If there is no layout set in the given flash context, the whole chip's
1837 * contents will be compared.
1838 *
1839 * @param flashctx Flash context to be used.
1840 * @param curcontents A buffer of full chip size to read current chip contents into.
1841 * @param newcontents The new image to compare to.
1842 * @return 0 on success,
1843 * 1 if reading failed,
1844 * 3 if the contents don't match.
1845 */
Nico Huber454f6132012-12-10 13:34:10 +00001846static int verify_by_layout(struct flashctx *const flashctx,
1847 void *const curcontents, const uint8_t *const newcontents)
Nico Huber7af0e792016-04-29 16:40:15 +02001848{
1849 const struct flashrom_layout *const layout = get_layout(flashctx);
1850
1851 size_t i;
1852 for (i = 0; i < layout->num_entries; ++i) {
1853 if (!layout->entries[i].included)
1854 continue;
1855
1856 const chipoff_t region_start = layout->entries[i].start;
1857 const chipsize_t region_len = layout->entries[i].end - layout->entries[i].start + 1;
1858
1859 if (flashctx->chip->read(flashctx, curcontents + region_start, region_start, region_len))
1860 return 1;
1861 if (compare_range(newcontents + region_start, curcontents + region_start,
1862 region_start, region_len))
1863 return 3;
1864 }
1865 return 0;
1866}
1867
Stefan Tauner136388f2013-07-15 10:47:53 +00001868static void nonfatal_help_message(void)
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001869{
Stefan Taunera58f6e92014-05-10 09:25:44 +00001870 msg_gerr("Good, writing to the flash chip apparently didn't do anything.\n");
Stefan Tauner136388f2013-07-15 10:47:53 +00001871#if CONFIG_INTERNAL == 1
1872 if (programmer == PROGRAMMER_INTERNAL)
1873 msg_gerr("This means we have to add special support for your board, programmer or flash\n"
1874 "chip. Please report this on IRC at chat.freenode.net (channel #flashrom) or\n"
1875 "mail flashrom@flashrom.org, thanks!\n"
1876 "-------------------------------------------------------------------------------\n"
1877 "You may now reboot or simply leave the machine running.\n");
1878 else
1879#endif
1880 msg_gerr("Please check the connections (especially those to write protection pins) between\n"
1881 "the programmer and the flash chip. If you think the error is caused by flashrom\n"
1882 "please report this on IRC at chat.freenode.net (channel #flashrom) or\n"
1883 "mail flashrom@flashrom.org, thanks!\n");
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001884}
1885
Stefan Tauner136388f2013-07-15 10:47:53 +00001886static void emergency_help_message(void)
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00001887{
Stefan Tauner136388f2013-07-15 10:47:53 +00001888 msg_gerr("Your flash chip is in an unknown state.\n");
1889#if CONFIG_INTERNAL == 1
1890 if (programmer == PROGRAMMER_INTERNAL)
1891 msg_gerr("Get help on IRC at chat.freenode.net (channel #flashrom) or\n"
1892 "mail flashrom@flashrom.org with the subject \"FAILED: <your board name>\"!\n"
1893 "-------------------------------------------------------------------------------\n"
1894 "DO NOT REBOOT OR POWEROFF!\n");
1895 else
1896#endif
1897 msg_gerr("Please report this on IRC at chat.freenode.net (channel #flashrom) or\n"
1898 "mail flashrom@flashrom.org, thanks!\n");
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00001899}
1900
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001901/* The way to go if you want a delimited list of programmers */
Stefan Tauner66652442011-06-26 17:38:17 +00001902void list_programmers(const char *delim)
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001903{
1904 enum programmer p;
1905 for (p = 0; p < PROGRAMMER_INVALID; p++) {
Sean Nelson316a29f2010-05-07 20:09:04 +00001906 msg_ginfo("%s", programmer_table[p].name);
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001907 if (p < PROGRAMMER_INVALID - 1)
Sean Nelson316a29f2010-05-07 20:09:04 +00001908 msg_ginfo("%s", delim);
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001909 }
Stefan Tauner23e10b82016-01-23 16:16:49 +00001910 msg_ginfo("\n");
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001911}
1912
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001913void list_programmers_linebreak(int startcol, int cols, int paren)
1914{
1915 const char *pname;
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +00001916 int pnamelen;
1917 int remaining = 0, firstline = 1;
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001918 enum programmer p;
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +00001919 int i;
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001920
1921 for (p = 0; p < PROGRAMMER_INVALID; p++) {
1922 pname = programmer_table[p].name;
1923 pnamelen = strlen(pname);
1924 if (remaining - pnamelen - 2 < 0) {
1925 if (firstline)
1926 firstline = 0;
1927 else
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001928 msg_ginfo("\n");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001929 for (i = 0; i < startcol; i++)
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001930 msg_ginfo(" ");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001931 remaining = cols - startcol;
1932 } else {
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001933 msg_ginfo(" ");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001934 remaining--;
1935 }
1936 if (paren && (p == 0)) {
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001937 msg_ginfo("(");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001938 remaining--;
1939 }
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001940 msg_ginfo("%s", pname);
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001941 remaining -= pnamelen;
1942 if (p < PROGRAMMER_INVALID - 1) {
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001943 msg_ginfo(",");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001944 remaining--;
1945 } else {
1946 if (paren)
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001947 msg_ginfo(")");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001948 }
1949 }
1950}
1951
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001952void print_sysinfo(void)
1953{
Stefan Taunerb0eee9b2015-01-10 09:32:50 +00001954#if IS_WINDOWS
Carl-Daniel Hailfinger60d9bd22012-08-09 23:34:41 +00001955 SYSTEM_INFO si;
1956 OSVERSIONINFOEX osvi;
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001957
Carl-Daniel Hailfinger60d9bd22012-08-09 23:34:41 +00001958 memset(&si, 0, sizeof(SYSTEM_INFO));
1959 memset(&osvi, 0, sizeof(OSVERSIONINFOEX));
1960 msg_ginfo(" on Windows");
1961 /* Tell Windows which version of the structure we want. */
1962 osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
1963 if (GetVersionEx((OSVERSIONINFO*) &osvi))
1964 msg_ginfo(" %lu.%lu", osvi.dwMajorVersion, osvi.dwMinorVersion);
1965 else
1966 msg_ginfo(" unknown version");
1967 GetSystemInfo(&si);
1968 switch (si.wProcessorArchitecture) {
1969 case PROCESSOR_ARCHITECTURE_AMD64:
1970 msg_ginfo(" (x86_64)");
1971 break;
1972 case PROCESSOR_ARCHITECTURE_INTEL:
1973 msg_ginfo(" (x86)");
1974 break;
1975 default:
1976 msg_ginfo(" (unknown arch)");
1977 break;
1978 }
1979#elif HAVE_UTSNAME == 1
1980 struct utsname osinfo;
1981
1982 uname(&osinfo);
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001983 msg_ginfo(" on %s %s (%s)", osinfo.sysname, osinfo.release,
1984 osinfo.machine);
1985#else
1986 msg_ginfo(" on unknown machine");
1987#endif
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001988}
1989
1990void print_buildinfo(void)
1991{
1992 msg_gdbg("flashrom was built with");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001993#if NEED_PCI == 1
1994#ifdef PCILIB_VERSION
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001995 msg_gdbg(" libpci %s,", PCILIB_VERSION);
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001996#else
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001997 msg_gdbg(" unknown PCI library,");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001998#endif
1999#endif
2000#ifdef __clang__
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00002001 msg_gdbg(" LLVM Clang");
Carl-Daniel Hailfingerb51e58e2010-07-17 14:49:30 +00002002#ifdef __clang_version__
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00002003 msg_gdbg(" %s,", __clang_version__);
Carl-Daniel Hailfingerb51e58e2010-07-17 14:49:30 +00002004#else
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00002005 msg_gdbg(" unknown version (before r102686),");
Carl-Daniel Hailfingerb51e58e2010-07-17 14:49:30 +00002006#endif
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00002007#elif defined(__GNUC__)
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00002008 msg_gdbg(" GCC");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00002009#ifdef __VERSION__
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00002010 msg_gdbg(" %s,", __VERSION__);
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00002011#else
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00002012 msg_gdbg(" unknown version,");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00002013#endif
2014#else
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00002015 msg_gdbg(" unknown compiler,");
Carl-Daniel Hailfingercceafa22010-05-26 01:45:41 +00002016#endif
2017#if defined (__FLASHROM_LITTLE_ENDIAN__)
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00002018 msg_gdbg(" little endian");
Carl-Daniel Hailfinger06b9efa2012-08-07 11:59:59 +00002019#elif defined (__FLASHROM_BIG_ENDIAN__)
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00002020 msg_gdbg(" big endian");
Carl-Daniel Hailfinger06b9efa2012-08-07 11:59:59 +00002021#else
2022#error Endianness could not be determined
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00002023#endif
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00002024 msg_gdbg("\n");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00002025}
2026
Bernhard Walle201bde32008-01-21 15:24:22 +00002027void print_version(void)
2028{
Stefan Tauner76347082016-11-27 17:45:49 +01002029 msg_ginfo("flashrom %s", flashrom_version);
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00002030 print_sysinfo();
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00002031 msg_ginfo("\n");
Bernhard Walle201bde32008-01-21 15:24:22 +00002032}
2033
Carl-Daniel Hailfinger8841d3e2010-05-15 15:04:37 +00002034void print_banner(void)
2035{
2036 msg_ginfo("flashrom is free software, get the source code at "
Stefan Tauner4c723152016-01-14 22:47:55 +00002037 "https://flashrom.org\n");
Carl-Daniel Hailfinger8841d3e2010-05-15 15:04:37 +00002038 msg_ginfo("\n");
2039}
2040
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00002041int selfcheck(void)
2042{
Stefan Tauner96658be2014-05-26 22:05:31 +00002043 unsigned int i;
Stefan Taunera6d96482012-12-26 19:51:23 +00002044 int ret = 0;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00002045
2046 /* Safety check. Instead of aborting after the first error, check
2047 * if more errors exist.
2048 */
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00002049 if (ARRAY_SIZE(programmer_table) - 1 != PROGRAMMER_INVALID) {
Sean Nelson316a29f2010-05-07 20:09:04 +00002050 msg_gerr("Programmer table miscompilation!\n");
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00002051 ret = 1;
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00002052 }
Stefan Taunera6d96482012-12-26 19:51:23 +00002053 for (i = 0; i < PROGRAMMER_INVALID; i++) {
2054 const struct programmer_entry p = programmer_table[i];
2055 if (p.name == NULL) {
2056 msg_gerr("All programmers need a valid name, but the one with index %d does not!\n", i);
2057 ret = 1;
2058 /* This might hide other problems with this programmer, but allows for better error
2059 * messages below without jumping through hoops. */
2060 continue;
2061 }
Stefan Tauneraf358d62012-12-27 18:40:26 +00002062 switch (p.type) {
2063 case USB:
2064 case PCI:
2065 case OTHER:
2066 if (p.devs.note == NULL) {
2067 if (strcmp("internal", p.name) == 0)
2068 break; /* This one has its device list stored separately. */
2069 msg_gerr("Programmer %s has neither a device list nor a textual description!\n",
2070 p.name);
2071 ret = 1;
2072 }
2073 break;
2074 default:
2075 msg_gerr("Programmer %s does not have a valid type set!\n", p.name);
2076 ret = 1;
2077 break;
2078 }
Stefan Taunera6d96482012-12-26 19:51:23 +00002079 if (p.init == NULL) {
2080 msg_gerr("Programmer %s does not have a valid init function!\n", p.name);
2081 ret = 1;
2082 }
2083 if (p.delay == NULL) {
2084 msg_gerr("Programmer %s does not have a valid delay function!\n", p.name);
2085 ret = 1;
2086 }
2087 if (p.map_flash_region == NULL) {
2088 msg_gerr("Programmer %s does not have a valid map_flash_region function!\n", p.name);
2089 ret = 1;
2090 }
2091 if (p.unmap_flash_region == NULL) {
2092 msg_gerr("Programmer %s does not have a valid unmap_flash_region function!\n", p.name);
2093 ret = 1;
2094 }
2095 }
Stefan Tauner96658be2014-05-26 22:05:31 +00002096
2097 /* It would be favorable if we could check for the correct layout (especially termination) of various
2098 * constant arrays: flashchips, chipset_enables, board_matches, boards_known, laptops_known.
2099 * They are all defined as externs in this compilation unit so we don't know their sizes which vary
2100 * depending on compiler flags, e.g. the target architecture, and can sometimes be 0.
2101 * For 'flashchips' we export the size explicitly to work around this and to be able to implement the
2102 * checks below. */
Stefan Tauner6697f712014-08-06 15:09:15 +00002103 if (flashchips_size <= 1 || flashchips[flashchips_size - 1].name != NULL) {
Stefan Tauner7bcacb12011-05-26 01:35:19 +00002104 msg_gerr("Flashchips table miscompilation!\n");
2105 ret = 1;
Stefan Tauner96658be2014-05-26 22:05:31 +00002106 } else {
2107 for (i = 0; i < flashchips_size - 1; i++) {
2108 const struct flashchip *chip = &flashchips[i];
2109 if (chip->vendor == NULL || chip->name == NULL || chip->bustype == BUS_NONE) {
2110 ret = 1;
2111 msg_gerr("ERROR: Some field of flash chip #%d (%s) is misconfigured.\n"
2112 "Please report a bug at flashrom@flashrom.org\n", i,
2113 chip->name == NULL ? "unnamed" : chip->name);
2114 }
2115 if (selfcheck_eraseblocks(chip)) {
2116 ret = 1;
2117 }
2118 }
Stefan Tauner7bcacb12011-05-26 01:35:19 +00002119 }
Stefan Tauner7bcacb12011-05-26 01:35:19 +00002120
Stefan Tauner600576b2014-06-12 22:57:36 +00002121#if CONFIG_INTERNAL == 1
2122 ret |= selfcheck_board_enables();
2123#endif
2124
Stefan Tauner96658be2014-05-26 22:05:31 +00002125 /* TODO: implement similar sanity checks for other arrays where deemed necessary. */
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00002126 return ret;
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00002127}
2128
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00002129/* FIXME: This function signature needs to be improved once doit() has a better
2130 * function signature.
2131 */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00002132int chip_safety_check(const struct flashctx *flash, int force, int read_it, int write_it, int erase_it,
2133 int verify_it)
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00002134{
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00002135 const struct flashchip *chip = flash->chip;
2136
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00002137 if (!programmer_may_write && (write_it || erase_it)) {
2138 msg_perr("Write/erase is not working yet on your programmer in "
2139 "its current configuration.\n");
2140 /* --force is the wrong approach, but it's the best we can do
2141 * until the generic programmer parameter parser is merged.
2142 */
2143 if (!force)
2144 return 1;
2145 msg_cerr("Continuing anyway.\n");
2146 }
2147
2148 if (read_it || erase_it || write_it || verify_it) {
2149 /* Everything needs read. */
Stefan Tauner6455dff2014-05-26 00:36:24 +00002150 if (chip->tested.read == BAD) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00002151 msg_cerr("Read is not working on this chip. ");
2152 if (!force)
2153 return 1;
2154 msg_cerr("Continuing anyway.\n");
2155 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00002156 if (!chip->read) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00002157 msg_cerr("flashrom has no read function for this "
2158 "flash chip.\n");
2159 return 1;
2160 }
2161 }
2162 if (erase_it || write_it) {
2163 /* Write needs erase. */
Stefan Tauner6455dff2014-05-26 00:36:24 +00002164 if (chip->tested.erase == NA) {
2165 msg_cerr("Erase is not possible on this chip.\n");
2166 return 1;
2167 }
2168 if (chip->tested.erase == BAD) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00002169 msg_cerr("Erase is not working on this chip. ");
2170 if (!force)
2171 return 1;
2172 msg_cerr("Continuing anyway.\n");
2173 }
Sylvain "ythier" Hitier9db45512011-07-04 07:27:17 +00002174 if(count_usable_erasers(flash) == 0) {
Stefan Tauner5368dca2011-07-01 00:19:12 +00002175 msg_cerr("flashrom has no erase function for this "
2176 "flash chip.\n");
2177 return 1;
2178 }
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00002179 }
2180 if (write_it) {
Stefan Tauner6455dff2014-05-26 00:36:24 +00002181 if (chip->tested.write == NA) {
2182 msg_cerr("Write is not possible on this chip.\n");
2183 return 1;
2184 }
2185 if (chip->tested.write == BAD) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00002186 msg_cerr("Write is not working on this chip. ");
2187 if (!force)
2188 return 1;
2189 msg_cerr("Continuing anyway.\n");
2190 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00002191 if (!chip->write) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00002192 msg_cerr("flashrom has no write function for this "
2193 "flash chip.\n");
2194 return 1;
2195 }
2196 }
2197 return 0;
2198}
2199
Nico Huber305f4172013-06-14 11:55:26 +02002200int prepare_flash_access(struct flashctx *const flash,
2201 const bool read_it, const bool write_it,
2202 const bool erase_it, const bool verify_it)
Nico Huber454f6132012-12-10 13:34:10 +00002203{
2204 if (chip_safety_check(flash, flash->flags.force, read_it, write_it, erase_it, verify_it)) {
2205 msg_cerr("Aborting.\n");
2206 return 1;
2207 }
2208
2209 if (flash->layout == get_global_layout() && normalize_romentries(flash)) {
2210 msg_cerr("Requested regions can not be handled. Aborting.\n");
2211 return 1;
2212 }
2213
2214 if (map_flash(flash) != 0)
2215 return 1;
2216
2217 /* Given the existence of read locks, we want to unlock for read,
2218 erase and write. */
2219 if (flash->chip->unlock)
2220 flash->chip->unlock(flash);
2221
Nico Huberf43c6542017-10-14 17:47:28 +02002222 flash->address_high_byte = -1;
2223 flash->in_4ba_mode = false;
2224
Ed Swierkcc20a9b2017-07-03 13:17:18 -07002225 /* Enable/disable 4-byte addressing mode if flash chip supports it */
Nico Huberfe34d2a2017-11-10 21:10:20 +01002226 if (flash->chip->feature_bits & (FEATURE_4BA_ENTER | FEATURE_4BA_ENTER_WREN)) {
2227 int ret;
2228 if (spi_master_4ba(flash))
2229 ret = spi_enter_4ba(flash);
2230 else
2231 ret = spi_exit_4ba(flash);
2232 if (ret) {
2233 msg_cerr("Failed to set correct 4BA mode! Aborting.\n");
Ed Swierkcc20a9b2017-07-03 13:17:18 -07002234 return 1;
Boris Baykov7fe85692016-06-11 18:29:03 +02002235 }
Boris Baykov99127182016-06-11 18:29:00 +02002236 }
2237
Nico Huber454f6132012-12-10 13:34:10 +00002238 return 0;
2239}
2240
Nico Huber305f4172013-06-14 11:55:26 +02002241void finalize_flash_access(struct flashctx *const flash)
Nico Huber454f6132012-12-10 13:34:10 +00002242{
2243 unmap_flash(flash);
2244}
2245
2246/**
2247 * @addtogroup flashrom-flash
2248 * @{
2249 */
2250
2251/**
2252 * @brief Erase the specified ROM chip.
2253 *
2254 * If a layout is set in the given flash context, only included regions
2255 * will be erased.
2256 *
2257 * @param flashctx The context of the flash chip to erase.
2258 * @return 0 on success.
2259 */
2260int flashrom_flash_erase(struct flashctx *const flashctx)
2261{
2262 if (prepare_flash_access(flashctx, false, false, true, false))
2263 return 1;
2264
2265 const int ret = erase_by_layout(flashctx);
2266
2267 finalize_flash_access(flashctx);
2268
2269 return ret;
2270}
2271
2272/** @} */ /* end flashrom-flash */
2273
2274/**
2275 * @defgroup flashrom-ops Operations
2276 * @{
2277 */
2278
2279/**
2280 * @brief Read the current image from the specified ROM chip.
2281 *
2282 * If a layout is set in the specified flash context, only included regions
2283 * will be read.
2284 *
2285 * @param flashctx The context of the flash chip.
2286 * @param buffer Target buffer to write image to.
2287 * @param buffer_len Size of target buffer in bytes.
2288 * @return 0 on success,
2289 * 2 if buffer_len is too short for the flash chip's contents,
2290 * or 1 on any other failure.
2291 */
2292int flashrom_image_read(struct flashctx *const flashctx, void *const buffer, const size_t buffer_len)
2293{
2294 const size_t flash_size = flashctx->chip->total_size * 1024;
2295
2296 if (flash_size > buffer_len)
2297 return 2;
2298
2299 if (prepare_flash_access(flashctx, true, false, false, false))
2300 return 1;
2301
2302 msg_cinfo("Reading flash... ");
2303
2304 int ret = 1;
2305 if (read_by_layout(flashctx, buffer)) {
2306 msg_cerr("Read operation failed!\n");
2307 msg_cinfo("FAILED.\n");
2308 goto _finalize_ret;
2309 }
2310 msg_cinfo("done.\n");
2311 ret = 0;
2312
2313_finalize_ret:
2314 finalize_flash_access(flashctx);
2315 return ret;
2316}
2317
2318static void combine_image_by_layout(const struct flashctx *const flashctx,
2319 uint8_t *const newcontents, const uint8_t *const oldcontents)
2320{
2321 const struct flashrom_layout *const layout = get_layout(flashctx);
2322
2323 size_t i;
2324 for (i = 0; i < layout->num_entries; ++i) {
2325 if (layout->entries[i].included)
2326 continue;
2327
2328 const chipoff_t region_start = layout->entries[i].start;
2329 const chipsize_t region_len = layout->entries[i].end - layout->entries[i].start + 1;
2330
2331 memcpy(newcontents + region_start, oldcontents + region_start, region_len);
2332 }
2333}
2334
2335/**
2336 * @brief Write the specified image to the ROM chip.
2337 *
2338 * If a layout is set in the specified flash context, only erase blocks
2339 * containing included regions will be touched.
2340 *
2341 * @param flashctx The context of the flash chip.
Nico Huber1b172f22017-06-19 12:35:24 +02002342 * @param buffer Source buffer to read image from (may be altered for full verification).
Nico Huber454f6132012-12-10 13:34:10 +00002343 * @param buffer_len Size of source buffer in bytes.
2344 * @return 0 on success,
2345 * 4 if buffer_len doesn't match the size of the flash chip,
2346 * 3 if write was tried but nothing has changed,
2347 * 2 if write failed and flash contents changed,
2348 * or 1 on any other failure.
2349 */
2350int flashrom_image_write(struct flashctx *const flashctx, void *const buffer, const size_t buffer_len)
2351{
2352 const size_t flash_size = flashctx->chip->total_size * 1024;
2353 const bool verify_all = flashctx->flags.verify_whole_chip;
2354 const bool verify = flashctx->flags.verify_after_write;
2355
2356 if (buffer_len != flash_size)
2357 return 4;
2358
2359 int ret = 1;
2360
2361 uint8_t *const newcontents = buffer;
2362 uint8_t *const curcontents = malloc(flash_size);
2363 uint8_t *oldcontents = NULL;
2364 if (verify_all)
2365 oldcontents = malloc(flash_size);
2366 if (!curcontents || (verify_all && !oldcontents)) {
2367 msg_gerr("Out of memory!\n");
2368 goto _free_ret;
2369 }
2370
2371#if CONFIG_INTERNAL == 1
2372 if (programmer == PROGRAMMER_INTERNAL && cb_check_image(newcontents, flash_size) < 0) {
2373 if (flashctx->flags.force_boardmismatch) {
2374 msg_pinfo("Proceeding anyway because user forced us to.\n");
2375 } else {
2376 msg_perr("Aborting. You can override this with "
2377 "-p internal:boardmismatch=force.\n");
2378 goto _free_ret;
2379 }
2380 }
2381#endif
2382
2383 if (prepare_flash_access(flashctx, false, true, false, verify))
2384 goto _free_ret;
2385
2386 /*
2387 * Read the whole chip to be able to check whether regions need to be
2388 * erased and to give better diagnostics in case write fails.
2389 * The alternative is to read only the regions which are to be
2390 * preserved, but in that case we might perform unneeded erase which
2391 * takes time as well.
2392 */
2393 msg_cinfo("Reading old flash chip contents... ");
2394 if (verify_all) {
2395 if (flashctx->chip->read(flashctx, oldcontents, 0, flash_size)) {
2396 msg_cinfo("FAILED.\n");
2397 goto _finalize_ret;
2398 }
2399 memcpy(curcontents, oldcontents, flash_size);
2400 } else {
2401 if (read_by_layout(flashctx, curcontents)) {
2402 msg_cinfo("FAILED.\n");
2403 goto _finalize_ret;
2404 }
2405 }
2406 msg_cinfo("done.\n");
2407
2408 if (write_by_layout(flashctx, curcontents, newcontents)) {
2409 msg_cerr("Uh oh. Erase/write failed. ");
2410 ret = 2;
2411 if (verify_all) {
2412 msg_cerr("Checking if anything has changed.\n");
2413 msg_cinfo("Reading current flash chip contents... ");
2414 if (!flashctx->chip->read(flashctx, curcontents, 0, flash_size)) {
2415 msg_cinfo("done.\n");
2416 if (!memcmp(oldcontents, curcontents, flash_size)) {
2417 nonfatal_help_message();
2418 goto _finalize_ret;
2419 }
2420 msg_cerr("Apparently at least some data has changed.\n");
2421 } else
2422 msg_cerr("Can't even read anymore!\n");
2423 emergency_help_message();
2424 goto _finalize_ret;
2425 } else {
2426 msg_cerr("\n");
2427 }
2428 emergency_help_message();
2429 goto _finalize_ret;
2430 }
2431
2432 /* Verify only if we actually changed something. */
2433 if (verify && !all_skipped) {
2434 const struct flashrom_layout *const layout_bak = flashctx->layout;
2435
2436 msg_cinfo("Verifying flash... ");
2437
2438 /* Work around chips which need some time to calm down. */
2439 programmer_delay(1000*1000);
2440
2441 if (verify_all) {
2442 combine_image_by_layout(flashctx, newcontents, oldcontents);
2443 flashctx->layout = NULL;
2444 }
2445 ret = verify_by_layout(flashctx, curcontents, newcontents);
2446 flashctx->layout = layout_bak;
2447 /* If we tried to write, and verification now fails, we
2448 might have an emergency situation. */
2449 if (ret)
2450 emergency_help_message();
2451 else
2452 msg_cinfo("VERIFIED.\n");
2453 } else {
2454 /* We didn't change anything. */
2455 ret = 0;
2456 }
2457
2458_finalize_ret:
2459 finalize_flash_access(flashctx);
2460_free_ret:
2461 free(oldcontents);
2462 free(curcontents);
2463 return ret;
2464}
2465
2466/**
2467 * @brief Verify the ROM chip's contents with the specified image.
2468 *
2469 * If a layout is set in the specified flash context, only included regions
2470 * will be verified.
2471 *
2472 * @param flashctx The context of the flash chip.
2473 * @param buffer Source buffer to verify with.
2474 * @param buffer_len Size of source buffer in bytes.
2475 * @return 0 on success,
2476 * 3 if the chip's contents don't match,
2477 * 2 if buffer_len doesn't match the size of the flash chip,
2478 * or 1 on any other failure.
2479 */
2480int flashrom_image_verify(struct flashctx *const flashctx, const void *const buffer, const size_t buffer_len)
2481{
2482 const size_t flash_size = flashctx->chip->total_size * 1024;
2483
2484 if (buffer_len != flash_size)
2485 return 2;
2486
2487 const uint8_t *const newcontents = buffer;
2488 uint8_t *const curcontents = malloc(flash_size);
2489 if (!curcontents) {
2490 msg_gerr("Out of memory!\n");
2491 return 1;
2492 }
2493
2494 int ret = 1;
2495
2496 if (prepare_flash_access(flashctx, false, false, false, true))
2497 goto _free_ret;
2498
2499 msg_cinfo("Verifying flash... ");
2500 ret = verify_by_layout(flashctx, curcontents, newcontents);
2501 if (!ret)
2502 msg_cinfo("VERIFIED.\n");
2503
2504 finalize_flash_access(flashctx);
2505_free_ret:
2506 free(curcontents);
2507 return ret;
2508}
2509
2510/** @} */ /* end flashrom-ops */
Nico Huber899e4ec2016-04-29 18:39:01 +02002511
2512int do_read(struct flashctx *const flash, const char *const filename)
2513{
2514 if (prepare_flash_access(flash, true, false, false, false))
2515 return 1;
2516
2517 const int ret = read_flash_to_file(flash, filename);
2518
2519 finalize_flash_access(flash);
2520
2521 return ret;
2522}
2523
2524int do_erase(struct flashctx *const flash)
2525{
2526 const int ret = flashrom_flash_erase(flash);
2527
2528 /*
2529 * FIXME: Do we really want the scary warning if erase failed?
2530 * After all, after erase the chip is either blank or partially
2531 * blank or it has the old contents. A blank chip won't boot,
2532 * so if the user wanted erase and reboots afterwards, the user
2533 * knows very well that booting won't work.
2534 */
2535 if (ret)
2536 emergency_help_message();
2537
2538 return ret;
2539}
2540
2541int do_write(struct flashctx *const flash, const char *const filename)
2542{
2543 const size_t flash_size = flash->chip->total_size * 1024;
2544 int ret = 1;
2545
2546 uint8_t *const newcontents = malloc(flash_size);
2547 if (!newcontents) {
2548 msg_gerr("Out of memory!\n");
2549 goto _free_ret;
2550 }
2551
2552 if (read_buf_from_file(newcontents, flash_size, filename))
2553 goto _free_ret;
2554
2555 ret = flashrom_image_write(flash, newcontents, flash_size);
2556
2557_free_ret:
2558 free(newcontents);
2559 return ret;
2560}
2561
2562int do_verify(struct flashctx *const flash, const char *const filename)
2563{
2564 const size_t flash_size = flash->chip->total_size * 1024;
2565 int ret = 1;
2566
2567 uint8_t *const newcontents = malloc(flash_size);
2568 if (!newcontents) {
2569 msg_gerr("Out of memory!\n");
2570 goto _free_ret;
2571 }
2572
2573 if (read_buf_from_file(newcontents, flash_size, filename))
2574 goto _free_ret;
2575
2576 ret = flashrom_image_verify(flash, newcontents, flash_size);
2577
2578_free_ret:
2579 free(newcontents);
2580 return ret;
2581}