blob: 25e53f20c0591596bb0152ebe26f7e1fcad94962 [file] [log] [blame]
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001/*
Uwe Hermannd1107642007-08-29 17:52:32 +00002 * This file is part of the flashrom project.
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00003 *
Uwe Hermannd22a1d42007-09-09 20:21:05 +00004 * Copyright (C) 2000 Silicon Integrated System Corporation
5 * Copyright (C) 2004 Tyan Corp <yhlu@tyan.com>
Uwe Hermannc7e8a0c2009-05-19 14:14:21 +00006 * Copyright (C) 2005-2008 coresystems GmbH
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007 * Copyright (C) 2008,2009 Carl-Daniel Hailfinger
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00008 *
Uwe Hermannd1107642007-08-29 17:52:32 +00009 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +000013 *
Uwe Hermannd1107642007-08-29 17:52:32 +000014 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +000018 *
Uwe Hermannd1107642007-08-29 17:52:32 +000019 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +000022 */
23
Carl-Daniel Hailfinger831e8f42010-05-30 22:24:40 +000024#include <stdio.h>
Stefan Reinauer018aca82006-11-21 23:48:51 +000025#include <sys/types.h>
Patrick Georgia9095a92010-09-30 17:03:32 +000026#ifndef __LIBPAYLOAD__
27#include <fcntl.h>
Stefan Reinauer018aca82006-11-21 23:48:51 +000028#include <sys/stat.h>
Patrick Georgia9095a92010-09-30 17:03:32 +000029#endif
Ronald G. Minnichceec4202003-07-25 04:37:41 +000030#include <string.h>
Stefan Tauner16687702015-12-25 21:59:45 +000031#include <unistd.h>
Ronald G. Minnicheaab50b2003-09-12 22:41:53 +000032#include <stdlib.h>
Stefan Tauner363fd7e2013-04-07 13:08:30 +000033#include <errno.h>
Carl-Daniel Hailfingerc2441382010-11-09 22:00:31 +000034#include <ctype.h>
Ollie Lho184a4042005-11-26 21:55:36 +000035#include <getopt.h>
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +000036#if HAVE_UTSNAME == 1
37#include <sys/utsname.h>
38#endif
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +000039#include "flash.h"
Carl-Daniel Hailfinger08454642009-06-15 14:14:48 +000040#include "flashchips.h"
Carl-Daniel Hailfinger5b997c32010-07-27 22:41:39 +000041#include "programmer.h"
Carl-Daniel Hailfinger06b9efa2012-08-07 11:59:59 +000042#include "hwaccess.h"
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +000043
Mathias Krausea60faab2011-01-17 07:50:42 +000044const char flashrom_version[] = FLASHROM_VERSION;
Nico Huberbcb2e5a2012-12-30 01:23:17 +000045const char *chip_to_probe = NULL;
Carl-Daniel Hailfinger66ef4e52009-12-13 22:28:00 +000046
Carl-Daniel Hailfinger2e681602011-09-08 00:00:29 +000047static enum programmer programmer = PROGRAMMER_INVALID;
Nico Huberbcb2e5a2012-12-30 01:23:17 +000048static const char *programmer_param = NULL;
Stefan Reinauer70385642007-04-06 11:58:03 +000049
Uwe Hermann48ec1b12010-08-08 17:01:18 +000050/*
Carl-Daniel Hailfinger66ef4e52009-12-13 22:28:00 +000051 * Programmers supporting multiple buses can have differing size limits on
52 * each bus. Store the limits for each bus in a common struct.
53 */
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +000054struct decode_sizes max_rom_decode;
55
56/* If nonzero, used as the start address of bottom-aligned flash. */
57unsigned long flashbase;
Carl-Daniel Hailfinger66ef4e52009-12-13 22:28:00 +000058
Carl-Daniel Hailfingerd1be52d2010-07-03 12:14:25 +000059/* Is writing allowed with this programmer? */
60int programmer_may_write;
61
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +000062const struct programmer_entry programmer_table[] = {
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +000063#if CONFIG_INTERNAL == 1
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +000064 {
Carl-Daniel Hailfinger37fc4692009-08-12 14:34:35 +000065 .name = "internal",
Stefan Tauneraf358d62012-12-27 18:40:26 +000066 .type = OTHER,
67 .devs.note = NULL,
Carl-Daniel Hailfinger1e334e62009-05-11 15:46:43 +000068 .init = internal_init,
Carl-Daniel Hailfinger1455b2b2009-05-11 14:13:25 +000069 .map_flash_region = physmap,
70 .unmap_flash_region = physunmap,
Carl-Daniel Hailfingerca8bfc62009-06-05 17:48:08 +000071 .delay = internal_delay,
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +000072 },
Carl-Daniel Hailfinger66ef4e52009-12-13 22:28:00 +000073#endif
Luc Verhaegen8e3a6002007-04-04 22:45:58 +000074
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +000075#if CONFIG_DUMMY == 1
Carl-Daniel Hailfingerc3129202009-05-09 00:54:55 +000076 {
Carl-Daniel Hailfinger37fc4692009-08-12 14:34:35 +000077 .name = "dummy",
Stefan Tauneraf358d62012-12-27 18:40:26 +000078 .type = OTHER,
79 /* FIXME */
80 .devs.note = "Dummy device, does nothing and logs all accesses\n",
Carl-Daniel Hailfinger1e334e62009-05-11 15:46:43 +000081 .init = dummy_init,
Carl-Daniel Hailfinger1455b2b2009-05-11 14:13:25 +000082 .map_flash_region = dummy_map,
83 .unmap_flash_region = dummy_unmap,
Carl-Daniel Hailfingerca8bfc62009-06-05 17:48:08 +000084 .delay = internal_delay,
Carl-Daniel Hailfingerc3129202009-05-09 00:54:55 +000085 },
Carl-Daniel Hailfinger4740c6f2009-09-16 10:09:21 +000086#endif
Carl-Daniel Hailfingerc3129202009-05-09 00:54:55 +000087
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +000088#if CONFIG_NIC3COM == 1
Uwe Hermannb4dcb712009-05-13 11:36:06 +000089 {
Carl-Daniel Hailfinger37fc4692009-08-12 14:34:35 +000090 .name = "nic3com",
Stefan Tauneraf358d62012-12-27 18:40:26 +000091 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +000092 .devs.dev = nics_3com,
Uwe Hermannb4dcb712009-05-13 11:36:06 +000093 .init = nic3com_init,
Uwe Hermannc6915932009-05-17 23:12:17 +000094 .map_flash_region = fallback_map,
95 .unmap_flash_region = fallback_unmap,
Carl-Daniel Hailfingerca8bfc62009-06-05 17:48:08 +000096 .delay = internal_delay,
Uwe Hermannb4dcb712009-05-13 11:36:06 +000097 },
Carl-Daniel Hailfinger4740c6f2009-09-16 10:09:21 +000098#endif
Uwe Hermannb4dcb712009-05-13 11:36:06 +000099
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000100#if CONFIG_NICREALTEK == 1
Joerg Fischer5665ef32010-05-21 21:54:07 +0000101 {
Carl-Daniel Hailfinger40446ee2011-03-07 01:08:09 +0000102 /* This programmer works for Realtek RTL8139 and SMC 1211. */
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000103 .name = "nicrealtek",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000104 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000105 .devs.dev = nics_realtek,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000106 .init = nicrealtek_init,
107 .map_flash_region = fallback_map,
108 .unmap_flash_region = fallback_unmap,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000109 .delay = internal_delay,
Joerg Fischer5665ef32010-05-21 21:54:07 +0000110 },
Joerg Fischer5665ef32010-05-21 21:54:07 +0000111#endif
112
Andrew Morganc29c2e72010-06-07 22:37:54 +0000113#if CONFIG_NICNATSEMI == 1
114 {
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000115 .name = "nicnatsemi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000116 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000117 .devs.dev = nics_natsemi,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000118 .init = nicnatsemi_init,
119 .map_flash_region = fallback_map,
120 .unmap_flash_region = fallback_unmap,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000121 .delay = internal_delay,
Andrew Morganc29c2e72010-06-07 22:37:54 +0000122 },
123#endif
Joerg Fischer5665ef32010-05-21 21:54:07 +0000124
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000125#if CONFIG_GFXNVIDIA == 1
Uwe Hermann2bc98f62009-09-30 18:29:55 +0000126 {
127 .name = "gfxnvidia",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000128 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000129 .devs.dev = gfx_nvidia,
Uwe Hermann2bc98f62009-09-30 18:29:55 +0000130 .init = gfxnvidia_init,
Uwe Hermann2bc98f62009-09-30 18:29:55 +0000131 .map_flash_region = fallback_map,
132 .unmap_flash_region = fallback_unmap,
Uwe Hermann2bc98f62009-09-30 18:29:55 +0000133 .delay = internal_delay,
134 },
135#endif
136
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000137#if CONFIG_DRKAISER == 1
Rudolf Marek68720c72009-05-17 19:39:27 +0000138 {
TURBO Jb0912c02009-09-02 23:00:46 +0000139 .name = "drkaiser",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000140 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000141 .devs.dev = drkaiser_pcidev,
TURBO Jb0912c02009-09-02 23:00:46 +0000142 .init = drkaiser_init,
TURBO Jb0912c02009-09-02 23:00:46 +0000143 .map_flash_region = fallback_map,
144 .unmap_flash_region = fallback_unmap,
TURBO Jb0912c02009-09-02 23:00:46 +0000145 .delay = internal_delay,
146 },
Carl-Daniel Hailfinger4740c6f2009-09-16 10:09:21 +0000147#endif
TURBO Jb0912c02009-09-02 23:00:46 +0000148
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000149#if CONFIG_SATASII == 1
TURBO Jb0912c02009-09-02 23:00:46 +0000150 {
Carl-Daniel Hailfinger37fc4692009-08-12 14:34:35 +0000151 .name = "satasii",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000152 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000153 .devs.dev = satas_sii,
Rudolf Marek68720c72009-05-17 19:39:27 +0000154 .init = satasii_init,
Uwe Hermannc6915932009-05-17 23:12:17 +0000155 .map_flash_region = fallback_map,
156 .unmap_flash_region = fallback_unmap,
Carl-Daniel Hailfingerca8bfc62009-06-05 17:48:08 +0000157 .delay = internal_delay,
Rudolf Marek68720c72009-05-17 19:39:27 +0000158 },
Carl-Daniel Hailfinger4740c6f2009-09-16 10:09:21 +0000159#endif
Rudolf Marek68720c72009-05-17 19:39:27 +0000160
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000161#if CONFIG_ATAHPT == 1
Uwe Hermannddd5c9e2010-02-21 21:17:00 +0000162 {
163 .name = "atahpt",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000164 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000165 .devs.dev = ata_hpt,
Uwe Hermannddd5c9e2010-02-21 21:17:00 +0000166 .init = atahpt_init,
Uwe Hermannddd5c9e2010-02-21 21:17:00 +0000167 .map_flash_region = fallback_map,
168 .unmap_flash_region = fallback_unmap,
Uwe Hermannddd5c9e2010-02-21 21:17:00 +0000169 .delay = internal_delay,
170 },
171#endif
172
Jonathan Kollasch7f0f3fa2014-06-01 10:26:23 +0000173#if CONFIG_ATAVIA == 1
174 {
175 .name = "atavia",
176 .type = PCI,
177 .devs.dev = ata_via,
178 .init = atavia_init,
179 .map_flash_region = atavia_map,
180 .unmap_flash_region = fallback_unmap,
181 .delay = internal_delay,
182 },
183#endif
184
Joseph C. Lehnerc2644a32016-01-16 23:45:25 +0000185#if CONFIG_ATAPROMISE == 1
186 {
187 .name = "atapromise",
188 .type = PCI,
189 .devs.dev = ata_promise,
190 .init = atapromise_init,
191 .map_flash_region = atapromise_map,
192 .unmap_flash_region = fallback_unmap,
193 .delay = internal_delay,
194 },
195#endif
196
Kyösti Mälkki72d42f82014-06-01 23:48:31 +0000197#if CONFIG_IT8212 == 1
198 {
199 .name = "it8212",
200 .type = PCI,
201 .devs.dev = devs_it8212,
202 .init = it8212_init,
203 .map_flash_region = fallback_map,
204 .unmap_flash_region = fallback_unmap,
205 .delay = internal_delay,
206 },
207#endif
208
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000209#if CONFIG_FT2232_SPI == 1
Paul Fox05dfbe62009-06-16 21:08:06 +0000210 {
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000211 .name = "ft2232_spi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000212 .type = USB,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000213 .devs.dev = devs_ft2232spi,
Paul Fox05dfbe62009-06-16 21:08:06 +0000214 .init = ft2232_spi_init,
Carl-Daniel Hailfinger415e5132009-08-12 11:39:29 +0000215 .map_flash_region = fallback_map,
216 .unmap_flash_region = fallback_unmap,
Paul Fox05dfbe62009-06-16 21:08:06 +0000217 .delay = internal_delay,
218 },
Carl-Daniel Hailfinger3426ef62009-08-19 13:27:58 +0000219#endif
Carl-Daniel Hailfinger415e5132009-08-12 11:39:29 +0000220
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000221#if CONFIG_SERPROG == 1
Urja Rannikko22915352009-06-23 11:33:43 +0000222 {
Carl-Daniel Hailfinger37fc4692009-08-12 14:34:35 +0000223 .name = "serprog",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000224 .type = OTHER,
225 /* FIXME */
226 .devs.note = "All programmer devices speaking the serprog protocol\n",
Urja Rannikko22915352009-06-23 11:33:43 +0000227 .init = serprog_init,
Urja Rannikko0b4ffd52015-06-29 23:24:23 +0000228 .map_flash_region = serprog_map,
Urja Rannikko22915352009-06-23 11:33:43 +0000229 .unmap_flash_region = fallback_unmap,
Urja Rannikko22915352009-06-23 11:33:43 +0000230 .delay = serprog_delay,
231 },
Carl-Daniel Hailfinger6be74112009-08-12 16:17:41 +0000232#endif
Paul Fox05dfbe62009-06-16 21:08:06 +0000233
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000234#if CONFIG_BUSPIRATE_SPI == 1
Carl-Daniel Hailfinger5cca01f2009-11-24 00:20:03 +0000235 {
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000236 .name = "buspirate_spi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000237 .type = OTHER,
238 /* FIXME */
239 .devs.note = "Dangerous Prototypes Bus Pirate\n",
Carl-Daniel Hailfinger5cca01f2009-11-24 00:20:03 +0000240 .init = buspirate_spi_init,
Carl-Daniel Hailfinger5cca01f2009-11-24 00:20:03 +0000241 .map_flash_region = fallback_map,
242 .unmap_flash_region = fallback_unmap,
Carl-Daniel Hailfinger5cca01f2009-11-24 00:20:03 +0000243 .delay = internal_delay,
244 },
245#endif
246
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000247#if CONFIG_DEDIPROG == 1
Carl-Daniel Hailfingerd38fac82010-01-19 11:15:48 +0000248 {
249 .name = "dediprog",
Stefan Taunerfdec7472016-02-22 08:59:27 +0000250 .type = USB,
251 .devs.dev = devs_dediprog,
Carl-Daniel Hailfingerd38fac82010-01-19 11:15:48 +0000252 .init = dediprog_init,
Carl-Daniel Hailfingerd38fac82010-01-19 11:15:48 +0000253 .map_flash_region = fallback_map,
254 .unmap_flash_region = fallback_unmap,
Carl-Daniel Hailfingerd38fac82010-01-19 11:15:48 +0000255 .delay = internal_delay,
256 },
257#endif
258
Carl-Daniel Hailfingere7fdd6e2010-07-21 10:26:01 +0000259#if CONFIG_RAYER_SPI == 1
260 {
261 .name = "rayer_spi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000262 .type = OTHER,
263 /* FIXME */
264 .devs.note = "RayeR parallel port programmer\n",
Carl-Daniel Hailfingere7fdd6e2010-07-21 10:26:01 +0000265 .init = rayer_spi_init,
Carl-Daniel Hailfingere7fdd6e2010-07-21 10:26:01 +0000266 .map_flash_region = fallback_map,
267 .unmap_flash_region = fallback_unmap,
Carl-Daniel Hailfingere7fdd6e2010-07-21 10:26:01 +0000268 .delay = internal_delay,
269 },
270#endif
271
Virgil-Adrian Teacada7c5452012-04-30 23:11:06 +0000272#if CONFIG_PONY_SPI == 1
273 {
274 .name = "pony_spi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000275 .type = OTHER,
276 /* FIXME */
277 .devs.note = "Programmers compatible with SI-Prog, serbang or AJAWe\n",
Virgil-Adrian Teacada7c5452012-04-30 23:11:06 +0000278 .init = pony_spi_init,
279 .map_flash_region = fallback_map,
280 .unmap_flash_region = fallback_unmap,
281 .delay = internal_delay,
Stefan Tauneraf358d62012-12-27 18:40:26 +0000282 },
Virgil-Adrian Teacada7c5452012-04-30 23:11:06 +0000283#endif
284
Carl-Daniel Hailfingerb713d2e2011-05-08 00:24:18 +0000285#if CONFIG_NICINTEL == 1
286 {
287 .name = "nicintel",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000288 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000289 .devs.dev = nics_intel,
Carl-Daniel Hailfingerb713d2e2011-05-08 00:24:18 +0000290 .init = nicintel_init,
Carl-Daniel Hailfingerb713d2e2011-05-08 00:24:18 +0000291 .map_flash_region = fallback_map,
292 .unmap_flash_region = fallback_unmap,
Carl-Daniel Hailfingerb713d2e2011-05-08 00:24:18 +0000293 .delay = internal_delay,
294 },
295#endif
296
Idwer Vollering004f4b72010-09-03 18:21:21 +0000297#if CONFIG_NICINTEL_SPI == 1
298 {
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000299 .name = "nicintel_spi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000300 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000301 .devs.dev = nics_intel_spi,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000302 .init = nicintel_spi_init,
303 .map_flash_region = fallback_map,
304 .unmap_flash_region = fallback_unmap,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000305 .delay = internal_delay,
Idwer Vollering004f4b72010-09-03 18:21:21 +0000306 },
307#endif
308
Ricardo Ribalda Delgado2a41f0a2014-07-28 20:35:21 +0000309#if CONFIG_NICINTEL_EEPROM == 1
310 {
311 .name = "nicintel_eeprom",
312 .type = PCI,
313 .devs.dev = nics_intel_ee,
314 .init = nicintel_ee_init,
315 .map_flash_region = fallback_map,
316 .unmap_flash_region = fallback_unmap,
317 .delay = internal_delay,
318 },
319#endif
320
Mark Marshall90021f22010-12-03 14:48:11 +0000321#if CONFIG_OGP_SPI == 1
322 {
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000323 .name = "ogp_spi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000324 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000325 .devs.dev = ogp_spi,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000326 .init = ogp_spi_init,
327 .map_flash_region = fallback_map,
328 .unmap_flash_region = fallback_unmap,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000329 .delay = internal_delay,
Mark Marshall90021f22010-12-03 14:48:11 +0000330 },
331#endif
332
Carl-Daniel Hailfinger9a1105c2011-02-04 21:37:59 +0000333#if CONFIG_SATAMV == 1
334 {
335 .name = "satamv",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000336 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000337 .devs.dev = satas_mv,
Carl-Daniel Hailfinger9a1105c2011-02-04 21:37:59 +0000338 .init = satamv_init,
Carl-Daniel Hailfinger9a1105c2011-02-04 21:37:59 +0000339 .map_flash_region = fallback_map,
340 .unmap_flash_region = fallback_unmap,
Carl-Daniel Hailfinger9a1105c2011-02-04 21:37:59 +0000341 .delay = internal_delay,
342 },
343#endif
344
Sven Schnelle5ce5f702011-09-03 18:37:52 +0000345#if CONFIG_LINUX_SPI == 1
346 {
347 .name = "linux_spi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000348 .type = OTHER,
349 .devs.note = "Device files /dev/spidev*.*\n",
Sven Schnelle5ce5f702011-09-03 18:37:52 +0000350 .init = linux_spi_init,
351 .map_flash_region = fallback_map,
352 .unmap_flash_region = fallback_unmap,
Sven Schnelle5ce5f702011-09-03 18:37:52 +0000353 .delay = internal_delay,
354 },
355#endif
356
James Lairdc60de0e2013-03-27 13:00:23 +0000357#if CONFIG_USBBLASTER_SPI == 1
358 {
359 .name = "usbblaster_spi",
360 .type = USB,
361 .devs.dev = devs_usbblasterspi,
362 .init = usbblaster_spi_init,
363 .map_flash_region = fallback_map,
364 .unmap_flash_region = fallback_unmap,
365 .delay = internal_delay,
366 },
367#endif
368
Alexandre Boeglin80e64712014-12-20 20:25:19 +0000369#if CONFIG_MSTARDDC_SPI == 1
370 {
371 .name = "mstarddc_spi",
372 .type = OTHER,
373 .devs.note = "MSTAR DDC devices addressable via /dev/i2c-* on Linux.\n",
374 .init = mstarddc_spi_init,
375 .map_flash_region = fallback_map,
376 .unmap_flash_region = fallback_unmap,
377 .delay = internal_delay,
378 },
379#endif
380
Justin Chevrier66e554b2015-02-08 21:58:10 +0000381#if CONFIG_PICKIT2_SPI == 1
382 {
383 .name = "pickit2_spi",
Stefan Taunerf31fe842016-02-22 08:59:15 +0000384 .type = USB,
385 .devs.dev = devs_pickit2_spi,
Justin Chevrier66e554b2015-02-08 21:58:10 +0000386 .init = pickit2_spi_init,
387 .map_flash_region = fallback_map,
388 .unmap_flash_region = fallback_unmap,
389 .delay = internal_delay,
390 },
391#endif
392
Urja Rannikko0870b022016-01-31 22:10:29 +0000393#if CONFIG_CH341A_SPI == 1
394 {
395 .name = "ch341a_spi",
396 .type = USB,
397 .devs.dev = devs_ch341a_spi,
398 .init = ch341a_spi_init,
399 .map_flash_region = fallback_map,
400 .unmap_flash_region = fallback_unmap,
401 .delay = ch341a_spi_delay,
402 },
403#endif
404
Carl-Daniel Hailfinger1c6d2ff2012-08-27 00:44:42 +0000405 {0}, /* This entry corresponds to PROGRAMMER_INVALID. */
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +0000406};
Luc Verhaegen8e3a6002007-04-04 22:45:58 +0000407
Carl-Daniel Hailfinger2bee8cf2010-11-10 15:25:18 +0000408#define SHUTDOWN_MAXFN 32
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000409static int shutdown_fn_count = 0;
410struct shutdown_func_data {
David Hendricks8bb20212011-06-14 01:35:36 +0000411 int (*func) (void *data);
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000412 void *data;
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000413} static shutdown_fn[SHUTDOWN_MAXFN];
414/* Initialize to 0 to make sure nobody registers a shutdown function before
415 * programmer init.
416 */
417static int may_register_shutdown = 0;
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000418
Stefan Taunerc4f44df2013-08-12 22:58:43 +0000419/* Did we change something or was every erase/write skipped (if any)? */
420static bool all_skipped = true;
421
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +0000422static int check_block_eraser(const struct flashctx *flash, int k, int log);
Stefan Tauner5368dca2011-07-01 00:19:12 +0000423
Stefan Tauner2a1ed772014-08-31 00:09:21 +0000424int shutdown_free(void *data)
425{
426 free(data);
427 return 0;
428}
429
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000430/* Register a function to be executed on programmer shutdown.
431 * The advantage over atexit() is that you can supply a void pointer which will
432 * be used as parameter to the registered function upon programmer shutdown.
433 * This pointer can point to arbitrary data used by said function, e.g. undo
434 * information for GPIO settings etc. If unneeded, set data=NULL.
435 * Please note that the first (void *data) belongs to the function signature of
436 * the function passed as first parameter.
437 */
David Hendricks8bb20212011-06-14 01:35:36 +0000438int register_shutdown(int (*function) (void *data), void *data)
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000439{
440 if (shutdown_fn_count >= SHUTDOWN_MAXFN) {
Carl-Daniel Hailfinger9f5f2152010-06-04 23:20:21 +0000441 msg_perr("Tried to register more than %i shutdown functions.\n",
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000442 SHUTDOWN_MAXFN);
443 return 1;
444 }
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000445 if (!may_register_shutdown) {
446 msg_perr("Tried to register a shutdown function before "
447 "programmer init.\n");
448 return 1;
449 }
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000450 shutdown_fn[shutdown_fn_count].func = function;
451 shutdown_fn[shutdown_fn_count].data = data;
452 shutdown_fn_count++;
453
454 return 0;
455}
456
Nico Huberbcb2e5a2012-12-30 01:23:17 +0000457int programmer_init(enum programmer prog, const char *param)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000458{
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000459 int ret;
Carl-Daniel Hailfinger2e681602011-09-08 00:00:29 +0000460
461 if (prog >= PROGRAMMER_INVALID) {
462 msg_perr("Invalid programmer specified!\n");
463 return -1;
464 }
465 programmer = prog;
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000466 /* Initialize all programmer specific data. */
467 /* Default to unlimited decode sizes. */
468 max_rom_decode = (const struct decode_sizes) {
469 .parallel = 0xffffffff,
470 .lpc = 0xffffffff,
471 .fwh = 0xffffffff,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000472 .spi = 0xffffffff,
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000473 };
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000474 /* Default to top aligned flash at 4 GB. */
475 flashbase = 0;
476 /* Registering shutdown functions is now allowed. */
477 may_register_shutdown = 1;
Carl-Daniel Hailfingerd1be52d2010-07-03 12:14:25 +0000478 /* Default to allowing writes. Broken programmers set this to 0. */
479 programmer_may_write = 1;
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000480
481 programmer_param = param;
Carl-Daniel Hailfinger20a36ba2013-08-13 07:09:57 +0000482 msg_pdbg("Initializing %s programmer\n", programmer_table[programmer].name);
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000483 ret = programmer_table[programmer].init();
484 if (programmer_param && strlen(programmer_param)) {
Carl-Daniel Hailfinger20a36ba2013-08-13 07:09:57 +0000485 if (ret != 0) {
486 /* It is quite possible that any unhandled programmer parameter would have been valid,
487 * but an error in actual programmer init happened before the parameter was evaluated.
488 */
489 msg_pwarn("Unhandled programmer parameters (possibly due to another failure): %s\n",
490 programmer_param);
491 } else {
492 /* Actual programmer init was successful, but the user specified an invalid or unusable
493 * (for the current programmer configuration) parameter.
494 */
495 msg_perr("Unhandled programmer parameters: %s\n", programmer_param);
496 msg_perr("Aborting.\n");
497 ret = ERROR_FATAL;
498 }
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000499 }
500 return ret;
Uwe Hermann09e04f72009-05-16 22:36:00 +0000501}
502
Stefan Tauner20da4aa2014-05-07 22:07:23 +0000503/** Calls registered shutdown functions and resets internal programmer-related variables.
504 * Calling it is safe even without previous initialization, but further interactions with programmer support
505 * require a call to programmer_init() (afterwards).
506 *
507 * @return The OR-ed result values of all shutdown functions (i.e. 0 on success). */
Uwe Hermann09e04f72009-05-16 22:36:00 +0000508int programmer_shutdown(void)
509{
David Hendricks8bb20212011-06-14 01:35:36 +0000510 int ret = 0;
511
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000512 /* Registering shutdown functions is no longer allowed. */
513 may_register_shutdown = 0;
514 while (shutdown_fn_count > 0) {
515 int i = --shutdown_fn_count;
David Hendricks8bb20212011-06-14 01:35:36 +0000516 ret |= shutdown_fn[i].func(shutdown_fn[i].data);
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000517 }
Stefan Taunere34e3e82013-01-01 00:06:51 +0000518
Stefan Taunerb8911d62012-12-26 07:55:00 +0000519 programmer_param = NULL;
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000520 registered_master_count = 0;
Stefan Taunere34e3e82013-01-01 00:06:51 +0000521
David Hendricks8bb20212011-06-14 01:35:36 +0000522 return ret;
Uwe Hermann09e04f72009-05-16 22:36:00 +0000523}
524
Stefan Tauner305e0b92013-07-17 23:46:44 +0000525void *programmer_map_flash_region(const char *descr, uintptr_t phys_addr, size_t len)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000526{
Stefan Tauner26e7a152013-09-13 17:21:05 +0000527 void *ret = programmer_table[programmer].map_flash_region(descr, phys_addr, len);
528 msg_gspew("%s: mapping %s from 0x%0*" PRIxPTR " to 0x%0*" PRIxPTR "\n",
529 __func__, descr, PRIxPTR_WIDTH, phys_addr, PRIxPTR_WIDTH, (uintptr_t) ret);
530 return ret;
Uwe Hermann09e04f72009-05-16 22:36:00 +0000531}
532
533void programmer_unmap_flash_region(void *virt_addr, size_t len)
534{
535 programmer_table[programmer].unmap_flash_region(virt_addr, len);
Stefan Tauner4e32ec12014-08-30 23:39:51 +0000536 msg_gspew("%s: unmapped 0x%0*" PRIxPTR "\n", __func__, PRIxPTR_WIDTH, (uintptr_t)virt_addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000537}
538
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000539void chip_writeb(const struct flashctx *flash, uint8_t val, chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000540{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000541 flash->mst->par.chip_writeb(flash, val, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000542}
543
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000544void chip_writew(const struct flashctx *flash, uint16_t val, chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000545{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000546 flash->mst->par.chip_writew(flash, val, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000547}
548
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000549void chip_writel(const struct flashctx *flash, uint32_t val, chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000550{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000551 flash->mst->par.chip_writel(flash, val, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000552}
553
Mark Marshallf20b7be2014-05-09 21:16:21 +0000554void chip_writen(const struct flashctx *flash, const uint8_t *buf, chipaddr addr, size_t len)
Carl-Daniel Hailfinger0bd2a2b2009-06-05 18:32:07 +0000555{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000556 flash->mst->par.chip_writen(flash, buf, addr, len);
Carl-Daniel Hailfinger0bd2a2b2009-06-05 18:32:07 +0000557}
558
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000559uint8_t chip_readb(const struct flashctx *flash, const chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000560{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000561 return flash->mst->par.chip_readb(flash, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000562}
563
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000564uint16_t chip_readw(const struct flashctx *flash, const chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000565{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000566 return flash->mst->par.chip_readw(flash, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000567}
568
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000569uint32_t chip_readl(const struct flashctx *flash, const chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000570{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000571 return flash->mst->par.chip_readl(flash, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000572}
573
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000574void chip_readn(const struct flashctx *flash, uint8_t *buf, chipaddr addr,
575 size_t len)
Carl-Daniel Hailfinger0bd2a2b2009-06-05 18:32:07 +0000576{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000577 flash->mst->par.chip_readn(flash, buf, addr, len);
Carl-Daniel Hailfinger0bd2a2b2009-06-05 18:32:07 +0000578}
579
Stefan Taunerf80419c2014-05-02 15:41:42 +0000580void programmer_delay(unsigned int usecs)
Carl-Daniel Hailfingerca8bfc62009-06-05 17:48:08 +0000581{
Urja Rannikko8d7ec2a2013-10-21 21:49:08 +0000582 if (usecs > 0)
583 programmer_table[programmer].delay(usecs);
Carl-Daniel Hailfingerca8bfc62009-06-05 17:48:08 +0000584}
585
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000586int read_memmapped(struct flashctx *flash, uint8_t *buf, unsigned int start,
587 int unsigned len)
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000588{
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000589 chip_readn(flash, buf, flash->virtual_memory + start, len);
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000590
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000591 return 0;
592}
593
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000594/* This is a somewhat hacked function similar in some ways to strtok().
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000595 * It will look for needle with a subsequent '=' in haystack, return a copy of
596 * needle and remove everything from the first occurrence of needle to the next
597 * delimiter from haystack.
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000598 */
Nico Huberbcb2e5a2012-12-30 01:23:17 +0000599char *extract_param(const char *const *haystack, const char *needle, const char *delim)
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000600{
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000601 char *param_pos, *opt_pos, *rest;
602 char *opt = NULL;
603 int optlen;
Carl-Daniel Hailfinger27023762010-04-28 15:22:14 +0000604 int needlelen;
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000605
Carl-Daniel Hailfinger27023762010-04-28 15:22:14 +0000606 needlelen = strlen(needle);
607 if (!needlelen) {
608 msg_gerr("%s: empty needle! Please report a bug at "
609 "flashrom@flashrom.org\n", __func__);
610 return NULL;
611 }
612 /* No programmer parameters given. */
613 if (*haystack == NULL)
614 return NULL;
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000615 param_pos = strstr(*haystack, needle);
616 do {
617 if (!param_pos)
618 return NULL;
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000619 /* Needle followed by '='? */
620 if (param_pos[needlelen] == '=') {
621
622 /* Beginning of the string? */
623 if (param_pos == *haystack)
624 break;
625 /* After a delimiter? */
626 if (strchr(delim, *(param_pos - 1)))
627 break;
628 }
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000629 /* Continue searching. */
630 param_pos++;
631 param_pos = strstr(param_pos, needle);
632 } while (1);
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000633
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000634 if (param_pos) {
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000635 /* Get the string after needle and '='. */
636 opt_pos = param_pos + needlelen + 1;
637 optlen = strcspn(opt_pos, delim);
638 /* Return an empty string if the parameter was empty. */
639 opt = malloc(optlen + 1);
640 if (!opt) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000641 msg_gerr("Out of memory!\n");
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000642 exit(1);
643 }
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000644 strncpy(opt, opt_pos, optlen);
645 opt[optlen] = '\0';
646 rest = opt_pos + optlen;
647 /* Skip all delimiters after the current parameter. */
648 rest += strspn(rest, delim);
649 memmove(param_pos, rest, strlen(rest) + 1);
650 /* We could shrink haystack, but the effort is not worth it. */
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000651 }
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000652
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000653 return opt;
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000654}
655
Stefan Tauner66652442011-06-26 17:38:17 +0000656char *extract_programmer_param(const char *param_name)
Carl-Daniel Hailfinger2b6dcb32010-07-08 10:13:37 +0000657{
658 return extract_param(&programmer_param, param_name, ",");
659}
660
Sylvain "ythier" Hitier9db45512011-07-04 07:27:17 +0000661/* Returns the number of well-defined erasers for a chip. */
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +0000662static unsigned int count_usable_erasers(const struct flashctx *flash)
Stefan Tauner5368dca2011-07-01 00:19:12 +0000663{
664 unsigned int usable_erasefunctions = 0;
665 int k;
666 for (k = 0; k < NUM_ERASEFUNCTIONS; k++) {
667 if (!check_block_eraser(flash, k, 0))
668 usable_erasefunctions++;
669 }
670 return usable_erasefunctions;
671}
672
Mark Marshallf20b7be2014-05-09 21:16:21 +0000673static int compare_range(const uint8_t *wantbuf, const uint8_t *havebuf, unsigned int start, unsigned int len)
Stefan Tauner78ffbea2012-10-27 15:36:56 +0000674{
675 int ret = 0, failcount = 0;
676 unsigned int i;
677 for (i = 0; i < len; i++) {
678 if (wantbuf[i] != havebuf[i]) {
679 /* Only print the first failure. */
680 if (!failcount++)
681 msg_cerr("FAILED at 0x%08x! Expected=0x%02x, Found=0x%02x,",
682 start + i, wantbuf[i], havebuf[i]);
683 }
684 }
685 if (failcount) {
686 msg_cerr(" failed byte count from 0x%08x-0x%08x: 0x%x\n",
687 start, start + len - 1, failcount);
688 ret = -1;
689 }
690 return ret;
691}
692
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000693/* start is an offset to the base address of the flash chip */
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000694int check_erased_range(struct flashctx *flash, unsigned int start,
695 unsigned int len)
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000696{
697 int ret;
698 uint8_t *cmpbuf = malloc(len);
699
700 if (!cmpbuf) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000701 msg_gerr("Could not allocate memory!\n");
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000702 exit(1);
703 }
704 memset(cmpbuf, 0xff, len);
Stefan Tauner78ffbea2012-10-27 15:36:56 +0000705 ret = verify_range(flash, cmpbuf, start, len);
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000706 free(cmpbuf);
707 return ret;
708}
709
Uwe Hermann48ec1b12010-08-08 17:01:18 +0000710/*
Carl-Daniel Hailfingerd0250a32009-11-25 17:05:52 +0000711 * @cmpbuf buffer to compare against, cmpbuf[0] is expected to match the
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000712 * flash content at location start
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000713 * @start offset to the base address of the flash chip
714 * @len length of the verified area
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000715 * @return 0 for success, -1 for failure
716 */
Mark Marshallf20b7be2014-05-09 21:16:21 +0000717int verify_range(struct flashctx *flash, const uint8_t *cmpbuf, unsigned int start, unsigned int len)
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000718{
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000719 if (!len)
Stefan Taunerdf64a422014-05-27 00:06:14 +0000720 return -1;
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000721
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +0000722 if (!flash->chip->read) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000723 msg_cerr("ERROR: flashrom has no read function for this flash chip.\n");
Stefan Taunerdf64a422014-05-27 00:06:14 +0000724 return -1;
Carl-Daniel Hailfinger23290662009-06-24 08:20:45 +0000725 }
Stefan Taunerdf64a422014-05-27 00:06:14 +0000726
727 uint8_t *readbuf = malloc(len);
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000728 if (!readbuf) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000729 msg_gerr("Could not allocate memory!\n");
Stefan Taunerdf64a422014-05-27 00:06:14 +0000730 return -1;
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000731 }
Stefan Taunerdf64a422014-05-27 00:06:14 +0000732 int ret = 0;
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000733
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +0000734 if (start + len > flash->chip->total_size * 1024) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000735 msg_gerr("Error: %s called with start 0x%x + len 0x%x >"
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000736 " total_size 0x%x\n", __func__, start, len,
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +0000737 flash->chip->total_size * 1024);
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000738 ret = -1;
739 goto out_free;
740 }
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000741
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +0000742 ret = flash->chip->read(flash, readbuf, start, len);
Carl-Daniel Hailfingerd8369412010-11-16 17:21:58 +0000743 if (ret) {
744 msg_gerr("Verification impossible because read failed "
745 "at 0x%x (len 0x%x)\n", start, len);
Stefan Taunerdf64a422014-05-27 00:06:14 +0000746 ret = -1;
747 goto out_free;
Carl-Daniel Hailfingerd8369412010-11-16 17:21:58 +0000748 }
749
Stefan Tauner78ffbea2012-10-27 15:36:56 +0000750 ret = compare_range(cmpbuf, readbuf, start, len);
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000751out_free:
752 free(readbuf);
753 return ret;
754}
755
Stefan Tauner02437452013-04-01 19:34:53 +0000756/* Helper function for need_erase() that focuses on granularities of gran bytes. */
Mark Marshallf20b7be2014-05-09 21:16:21 +0000757static 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 +0000758{
759 unsigned int i, j, limit;
760 for (j = 0; j < len / gran; j++) {
761 limit = min (gran, len - j * gran);
762 /* Are 'have' and 'want' identical? */
763 if (!memcmp(have + j * gran, want + j * gran, limit))
764 continue;
765 /* have needs to be in erased state. */
766 for (i = 0; i < limit; i++)
767 if (have[j * gran + i] != 0xff)
768 return 1;
769 }
770 return 0;
771}
772
Uwe Hermann48ec1b12010-08-08 17:01:18 +0000773/*
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000774 * Check if the buffer @have can be programmed to the content of @want without
775 * erasing. This is only possible if all chunks of size @gran are either kept
776 * as-is or changed from an all-ones state to any other state.
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000777 *
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000778 * Warning: This function assumes that @have and @want point to naturally
779 * aligned regions.
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000780 *
781 * @have buffer with current content
782 * @want buffer with desired content
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000783 * @len length of the checked area
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000784 * @gran write granularity (enum, not count)
785 * @return 0 if no erase is needed, 1 otherwise
786 */
Mark Marshallf20b7be2014-05-09 21:16:21 +0000787int 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 +0000788{
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +0000789 int result = 0;
Stefan Tauner02437452013-04-01 19:34:53 +0000790 unsigned int i;
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000791
792 switch (gran) {
793 case write_gran_1bit:
794 for (i = 0; i < len; i++)
795 if ((have[i] & want[i]) != want[i]) {
796 result = 1;
797 break;
798 }
799 break;
800 case write_gran_1byte:
801 for (i = 0; i < len; i++)
802 if ((have[i] != want[i]) && (have[i] != 0xff)) {
803 result = 1;
804 break;
805 }
806 break;
Paul Kocialkowskic8305e12015-10-16 02:16:20 +0000807 case write_gran_128bytes:
808 result = need_erase_gran_bytes(have, want, len, 128);
809 break;
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000810 case write_gran_256bytes:
Stefan Tauner02437452013-04-01 19:34:53 +0000811 result = need_erase_gran_bytes(have, want, len, 256);
812 break;
813 case write_gran_264bytes:
814 result = need_erase_gran_bytes(have, want, len, 264);
815 break;
816 case write_gran_512bytes:
817 result = need_erase_gran_bytes(have, want, len, 512);
818 break;
819 case write_gran_528bytes:
820 result = need_erase_gran_bytes(have, want, len, 528);
821 break;
822 case write_gran_1024bytes:
823 result = need_erase_gran_bytes(have, want, len, 1024);
824 break;
825 case write_gran_1056bytes:
826 result = need_erase_gran_bytes(have, want, len, 1056);
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000827 break;
Carl-Daniel Hailfinger1b0e9fc2014-06-16 22:36:17 +0000828 case write_gran_1byte_implicit_erase:
829 /* Do not erase, handle content changes from anything->0xff by writing 0xff. */
830 result = 0;
831 break;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000832 default:
833 msg_cerr("%s: Unsupported granularity! Please report a bug at "
834 "flashrom@flashrom.org\n", __func__);
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000835 }
836 return result;
837}
838
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000839/**
840 * Check if the buffer @have needs to be programmed to get the content of @want.
841 * If yes, return 1 and fill in first_start with the start address of the
842 * write operation and first_len with the length of the first to-be-written
843 * chunk. If not, return 0 and leave first_start and first_len undefined.
844 *
845 * Warning: This function assumes that @have and @want point to naturally
846 * aligned regions.
847 *
848 * @have buffer with current content
849 * @want buffer with desired content
850 * @len length of the checked area
851 * @gran write granularity (enum, not count)
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000852 * @first_start offset of the first byte which needs to be written (passed in
853 * value is increased by the offset of the first needed write
854 * relative to have/want or unchanged if no write is needed)
855 * @return length of the first contiguous area which needs to be written
856 * 0 if no write is needed
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000857 *
858 * FIXME: This function needs a parameter which tells it about coalescing
859 * in relation to the max write length of the programmer and the max write
860 * length of the chip.
861 */
Mark Marshallf20b7be2014-05-09 21:16:21 +0000862static unsigned int get_next_write(const uint8_t *have, const uint8_t *want, unsigned int len,
Stefan Taunerc69c9c82011-11-23 09:13:48 +0000863 unsigned int *first_start,
864 enum write_granularity gran)
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000865{
Stefan Taunerc69c9c82011-11-23 09:13:48 +0000866 int need_write = 0;
867 unsigned int rel_start = 0, first_len = 0;
868 unsigned int i, limit, stride;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000869
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000870 switch (gran) {
871 case write_gran_1bit:
872 case write_gran_1byte:
Carl-Daniel Hailfinger1b0e9fc2014-06-16 22:36:17 +0000873 case write_gran_1byte_implicit_erase:
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000874 stride = 1;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000875 break;
Paul Kocialkowskic8305e12015-10-16 02:16:20 +0000876 case write_gran_128bytes:
877 stride = 128;
878 break;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000879 case write_gran_256bytes:
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000880 stride = 256;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000881 break;
Stefan Tauner02437452013-04-01 19:34:53 +0000882 case write_gran_264bytes:
883 stride = 264;
884 break;
885 case write_gran_512bytes:
886 stride = 512;
887 break;
888 case write_gran_528bytes:
889 stride = 528;
890 break;
891 case write_gran_1024bytes:
892 stride = 1024;
893 break;
894 case write_gran_1056bytes:
895 stride = 1056;
896 break;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000897 default:
898 msg_cerr("%s: Unsupported granularity! Please report a bug at "
899 "flashrom@flashrom.org\n", __func__);
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000900 /* Claim that no write was needed. A write with unknown
901 * granularity is too dangerous to try.
902 */
903 return 0;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000904 }
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000905 for (i = 0; i < len / stride; i++) {
906 limit = min(stride, len - i * stride);
907 /* Are 'have' and 'want' identical? */
908 if (memcmp(have + i * stride, want + i * stride, limit)) {
909 if (!need_write) {
910 /* First location where have and want differ. */
911 need_write = 1;
912 rel_start = i * stride;
913 }
914 } else {
915 if (need_write) {
916 /* First location where have and want
917 * do not differ anymore.
918 */
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000919 break;
920 }
921 }
922 }
Carl-Daniel Hailfinger202bf532010-12-06 13:05:44 +0000923 if (need_write)
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000924 first_len = min(i * stride - rel_start, len);
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000925 *first_start += rel_start;
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000926 return first_len;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000927}
928
Carl-Daniel Hailfingereaac68b2009-11-23 12:55:31 +0000929/* This function generates various test patterns useful for testing controller
930 * and chip communication as well as chip behaviour.
931 *
932 * If a byte can be written multiple times, each time keeping 0-bits at 0
933 * and changing 1-bits to 0 if the new value for that bit is 0, the effect
934 * is essentially an AND operation. That's also the reason why this function
935 * provides the result of AND between various patterns.
936 *
937 * Below is a list of patterns (and their block length).
938 * Pattern 0 is 05 15 25 35 45 55 65 75 85 95 a5 b5 c5 d5 e5 f5 (16 Bytes)
939 * Pattern 1 is 0a 1a 2a 3a 4a 5a 6a 7a 8a 9a aa ba ca da ea fa (16 Bytes)
940 * Pattern 2 is 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f (16 Bytes)
941 * Pattern 3 is a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af (16 Bytes)
942 * Pattern 4 is 00 10 20 30 40 50 60 70 80 90 a0 b0 c0 d0 e0 f0 (16 Bytes)
943 * Pattern 5 is 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f (16 Bytes)
944 * Pattern 6 is 00 (1 Byte)
945 * Pattern 7 is ff (1 Byte)
946 * Patterns 0-7 have a big-endian block number in the last 2 bytes of each 256
947 * byte block.
948 *
949 * Pattern 8 is 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11... (256 B)
950 * Pattern 9 is ff fe fd fc fb fa f9 f8 f7 f6 f5 f4 f3 f2 f1 f0 ef ee... (256 B)
951 * Pattern 10 is 00 00 00 01 00 02 00 03 00 04... (128 kB big-endian counter)
952 * Pattern 11 is ff ff ff fe ff fd ff fc ff fb... (128 kB big-endian downwards)
953 * Pattern 12 is 00 (1 Byte)
954 * Pattern 13 is ff (1 Byte)
955 * Patterns 8-13 have no block number.
956 *
957 * Patterns 0-3 are created to detect and efficiently diagnose communication
958 * slips like missed bits or bytes and their repetitive nature gives good visual
959 * cues to the person inspecting the results. In addition, the following holds:
960 * AND Pattern 0/1 == Pattern 4
961 * AND Pattern 2/3 == Pattern 5
962 * AND Pattern 0/1/2/3 == AND Pattern 4/5 == Pattern 6
963 * A weakness of pattern 0-5 is the inability to detect swaps/copies between
964 * any two 16-byte blocks except for the last 16-byte block in a 256-byte bloc.
965 * They work perfectly for detecting any swaps/aliasing of blocks >= 256 bytes.
966 * 0x5 and 0xa were picked because they are 0101 and 1010 binary.
967 * Patterns 8-9 are best for detecting swaps/aliasing of blocks < 256 bytes.
968 * Besides that, they provide for bit testing of the last two bytes of every
969 * 256 byte block which contains the block number for patterns 0-6.
970 * Patterns 10-11 are special purpose for detecting subblock aliasing with
971 * block sizes >256 bytes (some Dataflash chips etc.)
972 * AND Pattern 8/9 == Pattern 12
973 * AND Pattern 10/11 == Pattern 12
974 * Pattern 13 is the completely erased state.
975 * None of the patterns can detect aliasing at boundaries which are a multiple
976 * of 16 MBytes (but such chips do not exist anyway for Parallel/LPC/FWH/SPI).
977 */
978int generate_testpattern(uint8_t *buf, uint32_t size, int variant)
979{
980 int i;
981
982 if (!buf) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000983 msg_gerr("Invalid buffer!\n");
Carl-Daniel Hailfingereaac68b2009-11-23 12:55:31 +0000984 return 1;
985 }
986
987 switch (variant) {
988 case 0:
989 for (i = 0; i < size; i++)
990 buf[i] = (i & 0xf) << 4 | 0x5;
991 break;
992 case 1:
993 for (i = 0; i < size; i++)
994 buf[i] = (i & 0xf) << 4 | 0xa;
995 break;
996 case 2:
997 for (i = 0; i < size; i++)
998 buf[i] = 0x50 | (i & 0xf);
999 break;
1000 case 3:
1001 for (i = 0; i < size; i++)
1002 buf[i] = 0xa0 | (i & 0xf);
1003 break;
1004 case 4:
1005 for (i = 0; i < size; i++)
1006 buf[i] = (i & 0xf) << 4;
1007 break;
1008 case 5:
1009 for (i = 0; i < size; i++)
1010 buf[i] = i & 0xf;
1011 break;
1012 case 6:
1013 memset(buf, 0x00, size);
1014 break;
1015 case 7:
1016 memset(buf, 0xff, size);
1017 break;
1018 case 8:
1019 for (i = 0; i < size; i++)
1020 buf[i] = i & 0xff;
1021 break;
1022 case 9:
1023 for (i = 0; i < size; i++)
1024 buf[i] = ~(i & 0xff);
1025 break;
1026 case 10:
1027 for (i = 0; i < size % 2; i++) {
1028 buf[i * 2] = (i >> 8) & 0xff;
1029 buf[i * 2 + 1] = i & 0xff;
1030 }
1031 if (size & 0x1)
1032 buf[i * 2] = (i >> 8) & 0xff;
1033 break;
1034 case 11:
1035 for (i = 0; i < size % 2; i++) {
1036 buf[i * 2] = ~((i >> 8) & 0xff);
1037 buf[i * 2 + 1] = ~(i & 0xff);
1038 }
1039 if (size & 0x1)
1040 buf[i * 2] = ~((i >> 8) & 0xff);
1041 break;
1042 case 12:
1043 memset(buf, 0x00, size);
1044 break;
1045 case 13:
1046 memset(buf, 0xff, size);
1047 break;
1048 }
1049
1050 if ((variant >= 0) && (variant <= 7)) {
1051 /* Write block number in the last two bytes of each 256-byte
1052 * block, big endian for easier reading of the hexdump.
1053 * Note that this wraps around for chips larger than 2^24 bytes
1054 * (16 MB).
1055 */
1056 for (i = 0; i < size / 256; i++) {
1057 buf[i * 256 + 254] = (i >> 8) & 0xff;
1058 buf[i * 256 + 255] = i & 0xff;
1059 }
1060 }
1061
1062 return 0;
1063}
1064
Stefan Tauner9e3a6982014-08-15 17:17:59 +00001065/* Returns the number of busses commonly supported by the current programmer and flash chip where the latter
1066 * can not be completely accessed due to size/address limits of the programmer. */
1067unsigned int count_max_decode_exceedings(const struct flashctx *flash)
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001068{
Stefan Tauner9e3a6982014-08-15 17:17:59 +00001069 unsigned int limitexceeded = 0;
1070 uint32_t size = flash->chip->total_size * 1024;
1071 enum chipbustype buses = flash->mst->buses_supported & flash->chip->bustype;
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001072
1073 if ((buses & BUS_PARALLEL) && (max_rom_decode.parallel < size)) {
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001074 limitexceeded++;
Sean Nelson316a29f2010-05-07 20:09:04 +00001075 msg_pdbg("Chip size %u kB is bigger than supported "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001076 "size %u kB of chipset/board/programmer "
1077 "for %s interface, "
1078 "probe/read/erase/write may fail. ", size / 1024,
1079 max_rom_decode.parallel / 1024, "Parallel");
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001080 }
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001081 if ((buses & BUS_LPC) && (max_rom_decode.lpc < size)) {
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001082 limitexceeded++;
Sean Nelson316a29f2010-05-07 20:09:04 +00001083 msg_pdbg("Chip size %u kB is bigger than supported "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001084 "size %u kB of chipset/board/programmer "
1085 "for %s interface, "
1086 "probe/read/erase/write may fail. ", size / 1024,
1087 max_rom_decode.lpc / 1024, "LPC");
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001088 }
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001089 if ((buses & BUS_FWH) && (max_rom_decode.fwh < size)) {
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001090 limitexceeded++;
Sean Nelson316a29f2010-05-07 20:09:04 +00001091 msg_pdbg("Chip size %u kB is bigger than supported "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001092 "size %u kB of chipset/board/programmer "
1093 "for %s interface, "
1094 "probe/read/erase/write may fail. ", size / 1024,
1095 max_rom_decode.fwh / 1024, "FWH");
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001096 }
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001097 if ((buses & BUS_SPI) && (max_rom_decode.spi < size)) {
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001098 limitexceeded++;
Sean Nelson316a29f2010-05-07 20:09:04 +00001099 msg_pdbg("Chip size %u kB is bigger than supported "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001100 "size %u kB of chipset/board/programmer "
1101 "for %s interface, "
1102 "probe/read/erase/write may fail. ", size / 1024,
1103 max_rom_decode.spi / 1024, "SPI");
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001104 }
Stefan Tauner9e3a6982014-08-15 17:17:59 +00001105 return limitexceeded;
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001106}
1107
Stefan Tauner4e32ec12014-08-30 23:39:51 +00001108void unmap_flash(struct flashctx *flash)
1109{
1110 if (flash->virtual_registers != (chipaddr)ERROR_PTR) {
1111 programmer_unmap_flash_region((void *)flash->virtual_registers, flash->chip->total_size * 1024);
1112 flash->physical_registers = 0;
1113 flash->virtual_registers = (chipaddr)ERROR_PTR;
1114 }
1115
1116 if (flash->virtual_memory != (chipaddr)ERROR_PTR) {
1117 programmer_unmap_flash_region((void *)flash->virtual_memory, flash->chip->total_size * 1024);
1118 flash->physical_memory = 0;
1119 flash->virtual_memory = (chipaddr)ERROR_PTR;
1120 }
1121}
1122
1123int map_flash(struct flashctx *flash)
1124{
1125 /* Init pointers to the fail-safe state to distinguish them later from legit values. */
1126 flash->virtual_memory = (chipaddr)ERROR_PTR;
1127 flash->virtual_registers = (chipaddr)ERROR_PTR;
1128
1129 /* FIXME: This avoids mapping (and unmapping) of flash chip definitions with size 0.
1130 * These are used for various probing-related hacks that would not map successfully anyway and should be
1131 * removed ASAP. */
1132 if (flash->chip->total_size == 0)
1133 return 0;
1134
1135 const chipsize_t size = flash->chip->total_size * 1024;
1136 uintptr_t base = flashbase ? flashbase : (0xffffffff - size + 1);
1137 void *addr = programmer_map_flash_region(flash->chip->name, base, size);
1138 if (addr == ERROR_PTR) {
1139 msg_perr("Could not map flash chip %s at 0x%0*" PRIxPTR ".\n",
1140 flash->chip->name, PRIxPTR_WIDTH, base);
1141 return 1;
1142 }
1143 flash->physical_memory = base;
1144 flash->virtual_memory = (chipaddr)addr;
1145
1146 /* FIXME: Special function registers normally live 4 MByte below flash space, but it might be somewhere
1147 * completely different on some chips and programmers, or not mappable at all.
1148 * Ignore these problems for now and always report success. */
1149 if (flash->chip->feature_bits & FEATURE_REGISTERMAP) {
1150 base = 0xffffffff - size - 0x400000 + 1;
1151 addr = programmer_map_flash_region("flash chip registers", base, size);
1152 if (addr == ERROR_PTR) {
1153 msg_pdbg2("Could not map flash chip registers %s at 0x%0*" PRIxPTR ".\n",
1154 flash->chip->name, PRIxPTR_WIDTH, base);
1155 return 0;
1156 }
1157 flash->physical_registers = base;
1158 flash->virtual_registers = (chipaddr)addr;
1159 }
1160 return 0;
1161}
1162
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +00001163int probe_flash(struct registered_master *mst, int startchip, struct flashctx *flash, int force)
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001164{
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001165 const struct flashchip *chip;
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001166 enum chipbustype buses_common;
Carl-Daniel Hailfingerb22918c2009-06-01 02:08:58 +00001167 char *tmp;
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001168
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001169 for (chip = flashchips + startchip; chip && chip->name; chip++) {
1170 if (chip_to_probe && strcmp(chip->name, chip_to_probe) != 0)
Ollie Lhocbbf1252004-03-17 22:22:08 +00001171 continue;
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +00001172 buses_common = mst->buses_supported & chip->bustype;
Carl-Daniel Hailfingerc40cff72011-12-20 00:19:29 +00001173 if (!buses_common)
Carl-Daniel Hailfinger6573b742011-06-17 22:38:53 +00001174 continue;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001175 msg_gdbg("Probing for %s %s, %d kB: ", chip->vendor, chip->name, chip->total_size);
1176 if (!chip->probe && !force) {
1177 msg_gdbg("failed! flashrom has no probe function for this flash chip.\n");
Carl-Daniel Hailfingerb22918c2009-06-01 02:08:58 +00001178 continue;
1179 }
Stefan Reinauer70385642007-04-06 11:58:03 +00001180
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001181 /* Start filling in the dynamic data. */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001182 flash->chip = calloc(1, sizeof(struct flashchip));
1183 if (!flash->chip) {
1184 msg_gerr("Out of memory!\n");
1185 exit(1);
1186 }
1187 memcpy(flash->chip, chip, sizeof(struct flashchip));
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +00001188 flash->mst = mst;
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001189
Stefan Tauner4e32ec12014-08-30 23:39:51 +00001190 if (map_flash(flash) != 0)
1191 return -1;
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001192
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001193 /* We handle a forced match like a real match, we just avoid probing. Note that probe_flash()
1194 * is only called with force=1 after normal probing failed.
1195 */
Peter Stuge27c3e2d2008-07-02 17:15:47 +00001196 if (force)
1197 break;
Stefan Reinauerfcb63682006-03-16 16:57:41 +00001198
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001199 if (flash->chip->probe(flash) != 1)
Peter Stuge483b8f02008-09-03 23:10:05 +00001200 goto notfound;
1201
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001202 /* If this is the first chip found, accept it.
1203 * If this is not the first chip found, accept it only if it is
Stefan Taunerac1b4c82012-02-17 14:51:04 +00001204 * a non-generic match. SFDP and CFI are generic matches.
1205 * startchip==0 means this call to probe_flash() is the first
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +00001206 * one for this programmer interface (master) and thus no other chip has
Stefan Taunerac1b4c82012-02-17 14:51:04 +00001207 * been found on this interface.
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001208 */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001209 if (startchip == 0 && flash->chip->model_id == SFDP_DEVICE_ID) {
Stefan Taunerac1b4c82012-02-17 14:51:04 +00001210 msg_cinfo("===\n"
1211 "SFDP has autodetected a flash chip which is "
1212 "not natively supported by flashrom yet.\n");
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001213 if (count_usable_erasers(flash) == 0)
Stefan Taunerac1b4c82012-02-17 14:51:04 +00001214 msg_cinfo("The standard operations read and "
1215 "verify should work, but to support "
1216 "erase, write and all other "
1217 "possible features");
1218 else
1219 msg_cinfo("All standard operations (read, "
1220 "verify, erase and write) should "
1221 "work, but to support all possible "
1222 "features");
1223
Stefan Taunerb4e06bd2012-08-20 00:24:22 +00001224 msg_cinfo(" we need to add them manually.\n"
1225 "You can help us by mailing us the output of the following command to "
1226 "flashrom@flashrom.org:\n"
1227 "'flashrom -VV [plus the -p/--programmer parameter]'\n"
1228 "Thanks for your help!\n"
Stefan Taunerac1b4c82012-02-17 14:51:04 +00001229 "===\n");
1230 }
1231
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001232 /* First flash chip detected on this bus. */
1233 if (startchip == 0)
Peter Stuge27c3e2d2008-07-02 17:15:47 +00001234 break;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001235 /* Not the first flash chip detected on this bus, but not a generic match either. */
1236 if ((flash->chip->model_id != GENERIC_DEVICE_ID) && (flash->chip->model_id != SFDP_DEVICE_ID))
1237 break;
1238 /* 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 +00001239notfound:
Stefan Tauner4e32ec12014-08-30 23:39:51 +00001240 unmap_flash(flash);
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001241 free(flash->chip);
1242 flash->chip = NULL;
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001243 }
Uwe Hermannffec5f32007-08-23 16:08:21 +00001244
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001245 if (!flash->chip)
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001246 return -1;
Peter Stuge27c3e2d2008-07-02 17:15:47 +00001247
Stefan Reinauer051e2362011-01-19 06:21:54 +00001248
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001249 tmp = flashbuses_to_text(flash->chip->bustype);
Stefan Tauner4e32ec12014-08-30 23:39:51 +00001250 msg_cinfo("%s %s flash chip \"%s\" (%d kB, %s) ", force ? "Assuming" : "Found",
1251 flash->chip->vendor, flash->chip->name, flash->chip->total_size, tmp);
Stefan Tauner00155492011-06-26 20:45:35 +00001252 free(tmp);
Stefan Tauner4e32ec12014-08-30 23:39:51 +00001253#if CONFIG_INTERNAL == 1
1254 if (programmer_table[programmer].map_flash_region == physmap)
1255 msg_cinfo("mapped at physical address 0x%0*" PRIxPTR ".\n",
1256 PRIxPTR_WIDTH, flash->physical_memory);
1257 else
1258#endif
1259 msg_cinfo("on %s.\n", programmer_table[programmer].name);
Uwe Hermann9899cad2009-06-28 21:47:57 +00001260
Stefan Tauner4e32ec12014-08-30 23:39:51 +00001261 /* Flash registers may more likely not be mapped if the chip was forced.
1262 * Lock info may be stored in registers, so avoid lock info printing. */
Carl-Daniel Hailfinger859f3f02010-12-02 21:59:42 +00001263 if (!force)
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001264 if (flash->chip->printlock)
1265 flash->chip->printlock(flash);
Sean Nelson6e0b9122010-02-19 00:52:10 +00001266
Stefan Tauner4e32ec12014-08-30 23:39:51 +00001267 /* Get out of the way for later runs. */
1268 unmap_flash(flash);
1269
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001270 /* Return position of matching chip. */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001271 return chip - flashchips;
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001272}
1273
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001274int read_buf_from_file(unsigned char *buf, unsigned long size,
1275 const char *filename)
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001276{
Nico Huber7562f7d2013-08-30 21:29:45 +00001277#ifdef __LIBPAYLOAD__
1278 msg_gerr("Error: No file I/O support in libpayload\n");
1279 return 1;
1280#else
Stefan Tauner16687702015-12-25 21:59:45 +00001281 int ret = 0;
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001282
Stefan Tauner16687702015-12-25 21:59:45 +00001283 FILE *image;
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001284 if ((image = fopen(filename, "rb")) == NULL) {
Stefan Tauner363fd7e2013-04-07 13:08:30 +00001285 msg_gerr("Error: opening file \"%s\" failed: %s\n", filename, strerror(errno));
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001286 return 1;
1287 }
Stefan Tauner16687702015-12-25 21:59:45 +00001288
1289 struct stat image_stat;
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001290 if (fstat(fileno(image), &image_stat) != 0) {
Stefan Tauner363fd7e2013-04-07 13:08:30 +00001291 msg_gerr("Error: getting metadata of file \"%s\" failed: %s\n", filename, strerror(errno));
Stefan Tauner16687702015-12-25 21:59:45 +00001292 ret = 1;
1293 goto out;
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001294 }
1295 if (image_stat.st_size != size) {
Carl-Daniel Hailfinger11990da2013-07-13 23:21:05 +00001296 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 +00001297 (intmax_t)image_stat.st_size, size);
Stefan Tauner16687702015-12-25 21:59:45 +00001298 ret = 1;
1299 goto out;
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001300 }
Stefan Tauner16687702015-12-25 21:59:45 +00001301
1302 unsigned long numbytes = fread(buf, 1, size, image);
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001303 if (numbytes != size) {
1304 msg_gerr("Error: Failed to read complete file. Got %ld bytes, "
1305 "wanted %ld!\n", numbytes, size);
Stefan Tauner16687702015-12-25 21:59:45 +00001306 ret = 1;
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001307 }
Stefan Tauner16687702015-12-25 21:59:45 +00001308out:
1309 (void)fclose(image);
1310 return ret;
Nico Huber7562f7d2013-08-30 21:29:45 +00001311#endif
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001312}
1313
Mark Marshallf20b7be2014-05-09 21:16:21 +00001314int write_buf_to_file(const unsigned char *buf, unsigned long size, const char *filename)
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001315{
Nico Huber7562f7d2013-08-30 21:29:45 +00001316#ifdef __LIBPAYLOAD__
1317 msg_gerr("Error: No file I/O support in libpayload\n");
1318 return 1;
1319#else
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001320 FILE *image;
Stefan Tauner16687702015-12-25 21:59:45 +00001321 int ret = 0;
Stephan Guilloux21dd55b2009-06-01 22:07:52 +00001322
1323 if (!filename) {
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001324 msg_gerr("No filename specified.\n");
Stephan Guilloux21dd55b2009-06-01 22:07:52 +00001325 return 1;
1326 }
Patrick Georgi0bf842d2010-01-25 22:55:33 +00001327 if ((image = fopen(filename, "wb")) == NULL) {
Stefan Tauner363fd7e2013-04-07 13:08:30 +00001328 msg_gerr("Error: opening file \"%s\" failed: %s\n", filename, strerror(errno));
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00001329 return 1;
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001330 }
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001331
Stefan Tauner16687702015-12-25 21:59:45 +00001332 unsigned long numbytes = fwrite(buf, 1, size, image);
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001333 if (numbytes != size) {
Stefan Tauner16687702015-12-25 21:59:45 +00001334 msg_gerr("Error: file %s could not be written completely.\n", filename);
1335 ret = 1;
1336 goto out;
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001337 }
Stefan Tauner16687702015-12-25 21:59:45 +00001338 if (fflush(image)) {
1339 msg_gerr("Error: flushing file \"%s\" failed: %s\n", filename, strerror(errno));
1340 ret = 1;
1341 }
1342 // Try to fsync() only regular files and if that function is available at all (e.g. not on MinGW).
1343#if defined(_POSIX_FSYNC) && (_POSIX_FSYNC != -1)
1344 struct stat image_stat;
1345 if (fstat(fileno(image), &image_stat) != 0) {
1346 msg_gerr("Error: getting metadata of file \"%s\" failed: %s\n", filename, strerror(errno));
1347 ret = 1;
1348 goto out;
1349 }
1350 if (S_ISREG(image_stat.st_mode)) {
1351 if (fsync(fileno(image))) {
1352 msg_gerr("Error: fsyncing file \"%s\" failed: %s\n", filename, strerror(errno));
1353 ret = 1;
1354 }
1355 }
1356#endif
1357out:
1358 if (fclose(image)) {
1359 msg_gerr("Error: closing file \"%s\" failed: %s\n", filename, strerror(errno));
1360 ret = 1;
1361 }
1362 return ret;
Nico Huber7562f7d2013-08-30 21:29:45 +00001363#endif
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001364}
1365
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001366int read_flash_to_file(struct flashctx *flash, const char *filename)
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001367{
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001368 unsigned long size = flash->chip->total_size * 1024;
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001369 unsigned char *buf = calloc(size, sizeof(char));
1370 int ret = 0;
1371
1372 msg_cinfo("Reading flash... ");
1373 if (!buf) {
1374 msg_gerr("Memory allocation failed!\n");
1375 msg_cinfo("FAILED.\n");
1376 return 1;
1377 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001378 if (!flash->chip->read) {
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001379 msg_cerr("No read function available for this flash chip.\n");
1380 ret = 1;
1381 goto out_free;
1382 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001383 if (flash->chip->read(flash, buf, 0, size)) {
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001384 msg_cerr("Read operation failed!\n");
1385 ret = 1;
1386 goto out_free;
1387 }
1388
Stefan Tauner355cbfd2011-05-28 02:37:14 +00001389 ret = write_buf_to_file(buf, size, filename);
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001390out_free:
1391 free(buf);
1392 msg_cinfo("%s.\n", ret ? "FAILED" : "done");
1393 return ret;
1394}
1395
Stefan Tauner96658be2014-05-26 22:05:31 +00001396/* Even if an error is found, the function will keep going and check the rest. */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001397static int selfcheck_eraseblocks(const struct flashchip *chip)
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001398{
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +00001399 int i, j, k;
1400 int ret = 0;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001401
1402 for (k = 0; k < NUM_ERASEFUNCTIONS; k++) {
1403 unsigned int done = 0;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001404 struct block_eraser eraser = chip->block_erasers[k];
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001405
1406 for (i = 0; i < NUM_ERASEREGIONS; i++) {
1407 /* Blocks with zero size are bugs in flashchips.c. */
1408 if (eraser.eraseblocks[i].count &&
1409 !eraser.eraseblocks[i].size) {
1410 msg_gerr("ERROR: Flash chip %s erase function "
1411 "%i region %i has size 0. Please report"
1412 " a bug at flashrom@flashrom.org\n",
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001413 chip->name, k, i);
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001414 ret = 1;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001415 }
1416 /* Blocks with zero count are bugs in flashchips.c. */
1417 if (!eraser.eraseblocks[i].count &&
1418 eraser.eraseblocks[i].size) {
1419 msg_gerr("ERROR: Flash chip %s erase function "
1420 "%i region %i has count 0. Please report"
1421 " a bug at flashrom@flashrom.org\n",
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001422 chip->name, k, i);
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001423 ret = 1;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001424 }
1425 done += eraser.eraseblocks[i].count *
1426 eraser.eraseblocks[i].size;
1427 }
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001428 /* Empty eraseblock definition with erase function. */
1429 if (!done && eraser.block_erase)
Sean Nelson316a29f2010-05-07 20:09:04 +00001430 msg_gspew("Strange: Empty eraseblock definition with "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001431 "non-empty erase function. Not an error.\n");
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001432 if (!done)
1433 continue;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001434 if (done != chip->total_size * 1024) {
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001435 msg_gerr("ERROR: Flash chip %s erase function %i "
1436 "region walking resulted in 0x%06x bytes total,"
1437 " expected 0x%06x bytes. Please report a bug at"
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001438 " flashrom@flashrom.org\n", chip->name, k,
1439 done, chip->total_size * 1024);
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001440 ret = 1;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001441 }
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001442 if (!eraser.block_erase)
1443 continue;
1444 /* Check if there are identical erase functions for different
1445 * layouts. That would imply "magic" erase functions. The
1446 * easiest way to check this is with function pointers.
1447 */
Uwe Hermann43959702010-03-13 17:28:29 +00001448 for (j = k + 1; j < NUM_ERASEFUNCTIONS; j++) {
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001449 if (eraser.block_erase ==
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001450 chip->block_erasers[j].block_erase) {
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001451 msg_gerr("ERROR: Flash chip %s erase function "
1452 "%i and %i are identical. Please report"
1453 " a bug at flashrom@flashrom.org\n",
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001454 chip->name, k, j);
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001455 ret = 1;
1456 }
Uwe Hermann43959702010-03-13 17:28:29 +00001457 }
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001458 }
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001459 return ret;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001460}
1461
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001462static int erase_and_write_block_helper(struct flashctx *flash,
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001463 unsigned int start, unsigned int len,
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001464 uint8_t *curcontents,
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001465 uint8_t *newcontents,
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001466 int (*erasefn) (struct flashctx *flash,
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001467 unsigned int addr,
1468 unsigned int len))
1469{
Stefan Taunerc69c9c82011-11-23 09:13:48 +00001470 unsigned int starthere = 0, lenhere = 0;
1471 int ret = 0, skip = 1, writecount = 0;
Stefan Tauner50d67aa2013-03-03 23:49:48 +00001472 enum write_granularity gran = flash->chip->gran;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001473
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001474 /* curcontents and newcontents are opaque to walk_eraseregions, and
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001475 * need to be adjusted here to keep the impression of proper abstraction
1476 */
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001477 curcontents += start;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001478 newcontents += start;
1479 msg_cdbg(":");
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001480 if (need_erase(curcontents, newcontents, len, gran)) {
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001481 msg_cdbg("E");
1482 ret = erasefn(flash, start, len);
1483 if (ret)
1484 return ret;
Carl-Daniel Hailfingerb4061f62011-06-26 17:04:16 +00001485 if (check_erased_range(flash, start, len)) {
1486 msg_cerr("ERASE FAILED!\n");
1487 return -1;
1488 }
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001489 /* Erase was successful. Adjust curcontents. */
1490 memset(curcontents, 0xff, len);
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001491 skip = 0;
1492 }
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001493 /* get_next_write() sets starthere to a new value after the call. */
1494 while ((lenhere = get_next_write(curcontents + starthere,
1495 newcontents + starthere,
1496 len - starthere, &starthere, gran))) {
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001497 if (!writecount++)
1498 msg_cdbg("W");
1499 /* Needs the partial write function signature. */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001500 ret = flash->chip->write(flash, newcontents + starthere,
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001501 start + starthere, lenhere);
1502 if (ret)
1503 return ret;
1504 starthere += lenhere;
1505 skip = 0;
1506 }
1507 if (skip)
1508 msg_cdbg("S");
Stefan Tauner682122b2013-06-23 22:15:39 +00001509 else
1510 all_skipped = false;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001511 return ret;
1512}
1513
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001514static int walk_eraseregions(struct flashctx *flash, int erasefunction,
1515 int (*do_something) (struct flashctx *flash,
Carl-Daniel Hailfinger4d3e9ca2010-07-13 00:42:00 +00001516 unsigned int addr,
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001517 unsigned int len,
1518 uint8_t *param1,
1519 uint8_t *param2,
1520 int (*erasefn) (
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001521 struct flashctx *flash,
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001522 unsigned int addr,
1523 unsigned int len)),
1524 void *param1, void *param2)
Carl-Daniel Hailfingera1223412010-07-13 00:37:19 +00001525{
1526 int i, j;
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +00001527 unsigned int start = 0;
1528 unsigned int len;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001529 struct block_eraser eraser = flash->chip->block_erasers[erasefunction];
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001530
Carl-Daniel Hailfingera1223412010-07-13 00:37:19 +00001531 for (i = 0; i < NUM_ERASEREGIONS; i++) {
1532 /* count==0 for all automatically initialized array
1533 * members so the loop below won't be executed for them.
1534 */
1535 len = eraser.eraseblocks[i].size;
1536 for (j = 0; j < eraser.eraseblocks[i].count; j++) {
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001537 /* Print this for every block except the first one. */
1538 if (i || j)
1539 msg_cdbg(", ");
1540 msg_cdbg("0x%06x-0x%06x", start,
Carl-Daniel Hailfingera1223412010-07-13 00:37:19 +00001541 start + len - 1);
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001542 if (do_something(flash, start, len, param1, param2,
1543 eraser.block_erase)) {
Carl-Daniel Hailfingera1223412010-07-13 00:37:19 +00001544 return 1;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001545 }
Carl-Daniel Hailfingera1223412010-07-13 00:37:19 +00001546 start += len;
1547 }
1548 }
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001549 msg_cdbg("\n");
Carl-Daniel Hailfingera1223412010-07-13 00:37:19 +00001550 return 0;
1551}
1552
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001553static int check_block_eraser(const struct flashctx *flash, int k, int log)
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001554{
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001555 struct block_eraser eraser = flash->chip->block_erasers[k];
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001556
1557 if (!eraser.block_erase && !eraser.eraseblocks[0].count) {
1558 if (log)
1559 msg_cdbg("not defined. ");
1560 return 1;
1561 }
1562 if (!eraser.block_erase && eraser.eraseblocks[0].count) {
1563 if (log)
1564 msg_cdbg("eraseblock layout is known, but matching "
Stefan Tauner355cbfd2011-05-28 02:37:14 +00001565 "block erase function is not implemented. ");
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001566 return 1;
1567 }
1568 if (eraser.block_erase && !eraser.eraseblocks[0].count) {
1569 if (log)
1570 msg_cdbg("block erase function found, but "
Stefan Tauner355cbfd2011-05-28 02:37:14 +00001571 "eraseblock layout is not defined. ");
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001572 return 1;
1573 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001574 // TODO: Once erase functions are annotated with allowed buses, check that as well.
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001575 return 0;
1576}
1577
Mark Marshallf20b7be2014-05-09 21:16:21 +00001578int erase_and_write_flash(struct flashctx *flash, uint8_t *oldcontents, uint8_t *newcontents)
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001579{
Carl-Daniel Hailfingerd8334db2011-07-21 21:21:04 +00001580 int k, ret = 1;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001581 uint8_t *curcontents;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001582 unsigned long size = flash->chip->total_size * 1024;
Sylvain "ythier" Hitier9db45512011-07-04 07:27:17 +00001583 unsigned int usable_erasefunctions = count_usable_erasers(flash);
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001584
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001585 msg_cinfo("Erasing and writing flash chip... ");
Stefan Tauner269de352011-07-12 22:35:21 +00001586 curcontents = malloc(size);
1587 if (!curcontents) {
1588 msg_gerr("Out of memory!\n");
1589 exit(1);
1590 }
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001591 /* Copy oldcontents to curcontents to avoid clobbering oldcontents. */
1592 memcpy(curcontents, oldcontents, size);
1593
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001594 for (k = 0; k < NUM_ERASEFUNCTIONS; k++) {
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001595 if (k != 0)
Stefan Tauner16878542014-07-13 23:53:40 +00001596 msg_cinfo("Looking for another erase function.\n");
Carl-Daniel Hailfingerd8334db2011-07-21 21:21:04 +00001597 if (!usable_erasefunctions) {
Stefan Tauner16878542014-07-13 23:53:40 +00001598 msg_cinfo("No usable erase functions left.\n");
Carl-Daniel Hailfingerd8334db2011-07-21 21:21:04 +00001599 break;
1600 }
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001601 msg_cdbg("Trying erase function %i... ", k);
1602 if (check_block_eraser(flash, k, 1))
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001603 continue;
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001604 usable_erasefunctions--;
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001605 ret = walk_eraseregions(flash, k, &erase_and_write_block_helper,
1606 curcontents, newcontents);
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001607 /* If everything is OK, don't try another erase function. */
1608 if (!ret)
1609 break;
Carl-Daniel Hailfingerb23b1eb2010-12-02 02:41:55 +00001610 /* Write/erase failed, so try to find out what the current chip
Carl-Daniel Hailfingerd8334db2011-07-21 21:21:04 +00001611 * contents are. If no usable erase functions remain, we can
1612 * skip this: the next iteration will break immediately anyway.
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001613 */
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001614 if (!usable_erasefunctions)
1615 continue;
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001616 /* Reading the whole chip may take a while, inform the user even
1617 * in non-verbose mode.
1618 */
1619 msg_cinfo("Reading current flash chip contents... ");
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001620 if (flash->chip->read(flash, curcontents, 0, size)) {
Carl-Daniel Hailfingerb23b1eb2010-12-02 02:41:55 +00001621 /* Now we are truly screwed. Read failed as well. */
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001622 msg_cerr("Can't read anymore! Aborting.\n");
Carl-Daniel Hailfingerb23b1eb2010-12-02 02:41:55 +00001623 /* We have no idea about the flash chip contents, so
1624 * retrying with another erase function is pointless.
1625 */
1626 break;
1627 }
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001628 msg_cinfo("done. ");
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001629 }
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001630 /* Free the scratchpad. */
1631 free(curcontents);
Carl-Daniel Hailfingerf160a122009-05-08 17:15:15 +00001632
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001633 if (ret) {
Sean Nelson316a29f2010-05-07 20:09:04 +00001634 msg_cerr("FAILED!\n");
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001635 } else {
Stefan Tauner682122b2013-06-23 22:15:39 +00001636 if (all_skipped)
1637 msg_cinfo("\nWarning: Chip content is identical to the requested image.\n");
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001638 msg_cinfo("Erase/write done.\n");
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001639 }
1640 return ret;
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001641}
1642
Stefan Tauner136388f2013-07-15 10:47:53 +00001643static void nonfatal_help_message(void)
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001644{
Stefan Taunera58f6e92014-05-10 09:25:44 +00001645 msg_gerr("Good, writing to the flash chip apparently didn't do anything.\n");
Stefan Tauner136388f2013-07-15 10:47:53 +00001646#if CONFIG_INTERNAL == 1
1647 if (programmer == PROGRAMMER_INTERNAL)
1648 msg_gerr("This means we have to add special support for your board, programmer or flash\n"
1649 "chip. Please report this on IRC at chat.freenode.net (channel #flashrom) or\n"
1650 "mail flashrom@flashrom.org, thanks!\n"
1651 "-------------------------------------------------------------------------------\n"
1652 "You may now reboot or simply leave the machine running.\n");
1653 else
1654#endif
1655 msg_gerr("Please check the connections (especially those to write protection pins) between\n"
1656 "the programmer and the flash chip. If you think the error is caused by flashrom\n"
1657 "please report this on IRC at chat.freenode.net (channel #flashrom) or\n"
1658 "mail flashrom@flashrom.org, thanks!\n");
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001659}
1660
Stefan Tauner136388f2013-07-15 10:47:53 +00001661static void emergency_help_message(void)
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00001662{
Stefan Tauner136388f2013-07-15 10:47:53 +00001663 msg_gerr("Your flash chip is in an unknown state.\n");
1664#if CONFIG_INTERNAL == 1
1665 if (programmer == PROGRAMMER_INTERNAL)
1666 msg_gerr("Get help on IRC at chat.freenode.net (channel #flashrom) or\n"
1667 "mail flashrom@flashrom.org with the subject \"FAILED: <your board name>\"!\n"
1668 "-------------------------------------------------------------------------------\n"
1669 "DO NOT REBOOT OR POWEROFF!\n");
1670 else
1671#endif
1672 msg_gerr("Please report this on IRC at chat.freenode.net (channel #flashrom) or\n"
1673 "mail flashrom@flashrom.org, thanks!\n");
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00001674}
1675
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001676/* The way to go if you want a delimited list of programmers */
Stefan Tauner66652442011-06-26 17:38:17 +00001677void list_programmers(const char *delim)
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001678{
1679 enum programmer p;
1680 for (p = 0; p < PROGRAMMER_INVALID; p++) {
Sean Nelson316a29f2010-05-07 20:09:04 +00001681 msg_ginfo("%s", programmer_table[p].name);
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001682 if (p < PROGRAMMER_INVALID - 1)
Sean Nelson316a29f2010-05-07 20:09:04 +00001683 msg_ginfo("%s", delim);
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001684 }
Stefan Tauner23e10b82016-01-23 16:16:49 +00001685 msg_ginfo("\n");
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001686}
1687
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001688void list_programmers_linebreak(int startcol, int cols, int paren)
1689{
1690 const char *pname;
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +00001691 int pnamelen;
1692 int remaining = 0, firstline = 1;
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001693 enum programmer p;
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +00001694 int i;
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001695
1696 for (p = 0; p < PROGRAMMER_INVALID; p++) {
1697 pname = programmer_table[p].name;
1698 pnamelen = strlen(pname);
1699 if (remaining - pnamelen - 2 < 0) {
1700 if (firstline)
1701 firstline = 0;
1702 else
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001703 msg_ginfo("\n");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001704 for (i = 0; i < startcol; i++)
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001705 msg_ginfo(" ");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001706 remaining = cols - startcol;
1707 } else {
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001708 msg_ginfo(" ");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001709 remaining--;
1710 }
1711 if (paren && (p == 0)) {
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001712 msg_ginfo("(");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001713 remaining--;
1714 }
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001715 msg_ginfo("%s", pname);
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001716 remaining -= pnamelen;
1717 if (p < PROGRAMMER_INVALID - 1) {
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001718 msg_ginfo(",");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001719 remaining--;
1720 } else {
1721 if (paren)
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001722 msg_ginfo(")");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001723 }
1724 }
1725}
1726
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001727void print_sysinfo(void)
1728{
Stefan Taunerb0eee9b2015-01-10 09:32:50 +00001729#if IS_WINDOWS
Carl-Daniel Hailfinger60d9bd22012-08-09 23:34:41 +00001730 SYSTEM_INFO si;
1731 OSVERSIONINFOEX osvi;
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001732
Carl-Daniel Hailfinger60d9bd22012-08-09 23:34:41 +00001733 memset(&si, 0, sizeof(SYSTEM_INFO));
1734 memset(&osvi, 0, sizeof(OSVERSIONINFOEX));
1735 msg_ginfo(" on Windows");
1736 /* Tell Windows which version of the structure we want. */
1737 osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
1738 if (GetVersionEx((OSVERSIONINFO*) &osvi))
1739 msg_ginfo(" %lu.%lu", osvi.dwMajorVersion, osvi.dwMinorVersion);
1740 else
1741 msg_ginfo(" unknown version");
1742 GetSystemInfo(&si);
1743 switch (si.wProcessorArchitecture) {
1744 case PROCESSOR_ARCHITECTURE_AMD64:
1745 msg_ginfo(" (x86_64)");
1746 break;
1747 case PROCESSOR_ARCHITECTURE_INTEL:
1748 msg_ginfo(" (x86)");
1749 break;
1750 default:
1751 msg_ginfo(" (unknown arch)");
1752 break;
1753 }
1754#elif HAVE_UTSNAME == 1
1755 struct utsname osinfo;
1756
1757 uname(&osinfo);
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001758 msg_ginfo(" on %s %s (%s)", osinfo.sysname, osinfo.release,
1759 osinfo.machine);
1760#else
1761 msg_ginfo(" on unknown machine");
1762#endif
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001763}
1764
1765void print_buildinfo(void)
1766{
1767 msg_gdbg("flashrom was built with");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001768#if NEED_PCI == 1
1769#ifdef PCILIB_VERSION
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001770 msg_gdbg(" libpci %s,", PCILIB_VERSION);
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001771#else
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001772 msg_gdbg(" unknown PCI library,");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001773#endif
1774#endif
1775#ifdef __clang__
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001776 msg_gdbg(" LLVM Clang");
Carl-Daniel Hailfingerb51e58e2010-07-17 14:49:30 +00001777#ifdef __clang_version__
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001778 msg_gdbg(" %s,", __clang_version__);
Carl-Daniel Hailfingerb51e58e2010-07-17 14:49:30 +00001779#else
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001780 msg_gdbg(" unknown version (before r102686),");
Carl-Daniel Hailfingerb51e58e2010-07-17 14:49:30 +00001781#endif
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001782#elif defined(__GNUC__)
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001783 msg_gdbg(" GCC");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001784#ifdef __VERSION__
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001785 msg_gdbg(" %s,", __VERSION__);
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001786#else
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001787 msg_gdbg(" unknown version,");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001788#endif
1789#else
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001790 msg_gdbg(" unknown compiler,");
Carl-Daniel Hailfingercceafa22010-05-26 01:45:41 +00001791#endif
1792#if defined (__FLASHROM_LITTLE_ENDIAN__)
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001793 msg_gdbg(" little endian");
Carl-Daniel Hailfinger06b9efa2012-08-07 11:59:59 +00001794#elif defined (__FLASHROM_BIG_ENDIAN__)
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001795 msg_gdbg(" big endian");
Carl-Daniel Hailfinger06b9efa2012-08-07 11:59:59 +00001796#else
1797#error Endianness could not be determined
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001798#endif
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001799 msg_gdbg("\n");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001800}
1801
Bernhard Walle201bde32008-01-21 15:24:22 +00001802void print_version(void)
1803{
Carl-Daniel Hailfinger8841d3e2010-05-15 15:04:37 +00001804 msg_ginfo("flashrom v%s", flashrom_version);
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001805 print_sysinfo();
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001806 msg_ginfo("\n");
Bernhard Walle201bde32008-01-21 15:24:22 +00001807}
1808
Carl-Daniel Hailfinger8841d3e2010-05-15 15:04:37 +00001809void print_banner(void)
1810{
1811 msg_ginfo("flashrom is free software, get the source code at "
Stefan Tauner4c723152016-01-14 22:47:55 +00001812 "https://flashrom.org\n");
Carl-Daniel Hailfinger8841d3e2010-05-15 15:04:37 +00001813 msg_ginfo("\n");
1814}
1815
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001816int selfcheck(void)
1817{
Stefan Tauner96658be2014-05-26 22:05:31 +00001818 unsigned int i;
Stefan Taunera6d96482012-12-26 19:51:23 +00001819 int ret = 0;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001820
1821 /* Safety check. Instead of aborting after the first error, check
1822 * if more errors exist.
1823 */
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001824 if (ARRAY_SIZE(programmer_table) - 1 != PROGRAMMER_INVALID) {
Sean Nelson316a29f2010-05-07 20:09:04 +00001825 msg_gerr("Programmer table miscompilation!\n");
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001826 ret = 1;
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001827 }
Stefan Taunera6d96482012-12-26 19:51:23 +00001828 for (i = 0; i < PROGRAMMER_INVALID; i++) {
1829 const struct programmer_entry p = programmer_table[i];
1830 if (p.name == NULL) {
1831 msg_gerr("All programmers need a valid name, but the one with index %d does not!\n", i);
1832 ret = 1;
1833 /* This might hide other problems with this programmer, but allows for better error
1834 * messages below without jumping through hoops. */
1835 continue;
1836 }
Stefan Tauneraf358d62012-12-27 18:40:26 +00001837 switch (p.type) {
1838 case USB:
1839 case PCI:
1840 case OTHER:
1841 if (p.devs.note == NULL) {
1842 if (strcmp("internal", p.name) == 0)
1843 break; /* This one has its device list stored separately. */
1844 msg_gerr("Programmer %s has neither a device list nor a textual description!\n",
1845 p.name);
1846 ret = 1;
1847 }
1848 break;
1849 default:
1850 msg_gerr("Programmer %s does not have a valid type set!\n", p.name);
1851 ret = 1;
1852 break;
1853 }
Stefan Taunera6d96482012-12-26 19:51:23 +00001854 if (p.init == NULL) {
1855 msg_gerr("Programmer %s does not have a valid init function!\n", p.name);
1856 ret = 1;
1857 }
1858 if (p.delay == NULL) {
1859 msg_gerr("Programmer %s does not have a valid delay function!\n", p.name);
1860 ret = 1;
1861 }
1862 if (p.map_flash_region == NULL) {
1863 msg_gerr("Programmer %s does not have a valid map_flash_region function!\n", p.name);
1864 ret = 1;
1865 }
1866 if (p.unmap_flash_region == NULL) {
1867 msg_gerr("Programmer %s does not have a valid unmap_flash_region function!\n", p.name);
1868 ret = 1;
1869 }
1870 }
Stefan Tauner96658be2014-05-26 22:05:31 +00001871
1872 /* It would be favorable if we could check for the correct layout (especially termination) of various
1873 * constant arrays: flashchips, chipset_enables, board_matches, boards_known, laptops_known.
1874 * They are all defined as externs in this compilation unit so we don't know their sizes which vary
1875 * depending on compiler flags, e.g. the target architecture, and can sometimes be 0.
1876 * For 'flashchips' we export the size explicitly to work around this and to be able to implement the
1877 * checks below. */
Stefan Tauner6697f712014-08-06 15:09:15 +00001878 if (flashchips_size <= 1 || flashchips[flashchips_size - 1].name != NULL) {
Stefan Tauner7bcacb12011-05-26 01:35:19 +00001879 msg_gerr("Flashchips table miscompilation!\n");
1880 ret = 1;
Stefan Tauner96658be2014-05-26 22:05:31 +00001881 } else {
1882 for (i = 0; i < flashchips_size - 1; i++) {
1883 const struct flashchip *chip = &flashchips[i];
1884 if (chip->vendor == NULL || chip->name == NULL || chip->bustype == BUS_NONE) {
1885 ret = 1;
1886 msg_gerr("ERROR: Some field of flash chip #%d (%s) is misconfigured.\n"
1887 "Please report a bug at flashrom@flashrom.org\n", i,
1888 chip->name == NULL ? "unnamed" : chip->name);
1889 }
1890 if (selfcheck_eraseblocks(chip)) {
1891 ret = 1;
1892 }
1893 }
Stefan Tauner7bcacb12011-05-26 01:35:19 +00001894 }
Stefan Tauner7bcacb12011-05-26 01:35:19 +00001895
Stefan Tauner600576b2014-06-12 22:57:36 +00001896#if CONFIG_INTERNAL == 1
1897 ret |= selfcheck_board_enables();
1898#endif
1899
Stefan Tauner96658be2014-05-26 22:05:31 +00001900 /* TODO: implement similar sanity checks for other arrays where deemed necessary. */
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001901 return ret;
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001902}
1903
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001904/* FIXME: This function signature needs to be improved once doit() has a better
1905 * function signature.
1906 */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001907int chip_safety_check(const struct flashctx *flash, int force, int read_it, int write_it, int erase_it,
1908 int verify_it)
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001909{
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001910 const struct flashchip *chip = flash->chip;
1911
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001912 if (!programmer_may_write && (write_it || erase_it)) {
1913 msg_perr("Write/erase is not working yet on your programmer in "
1914 "its current configuration.\n");
1915 /* --force is the wrong approach, but it's the best we can do
1916 * until the generic programmer parameter parser is merged.
1917 */
1918 if (!force)
1919 return 1;
1920 msg_cerr("Continuing anyway.\n");
1921 }
1922
1923 if (read_it || erase_it || write_it || verify_it) {
1924 /* Everything needs read. */
Stefan Tauner6455dff2014-05-26 00:36:24 +00001925 if (chip->tested.read == BAD) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001926 msg_cerr("Read is not working on this chip. ");
1927 if (!force)
1928 return 1;
1929 msg_cerr("Continuing anyway.\n");
1930 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001931 if (!chip->read) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001932 msg_cerr("flashrom has no read function for this "
1933 "flash chip.\n");
1934 return 1;
1935 }
1936 }
1937 if (erase_it || write_it) {
1938 /* Write needs erase. */
Stefan Tauner6455dff2014-05-26 00:36:24 +00001939 if (chip->tested.erase == NA) {
1940 msg_cerr("Erase is not possible on this chip.\n");
1941 return 1;
1942 }
1943 if (chip->tested.erase == BAD) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001944 msg_cerr("Erase is not working on this chip. ");
1945 if (!force)
1946 return 1;
1947 msg_cerr("Continuing anyway.\n");
1948 }
Sylvain "ythier" Hitier9db45512011-07-04 07:27:17 +00001949 if(count_usable_erasers(flash) == 0) {
Stefan Tauner5368dca2011-07-01 00:19:12 +00001950 msg_cerr("flashrom has no erase function for this "
1951 "flash chip.\n");
1952 return 1;
1953 }
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001954 }
1955 if (write_it) {
Stefan Tauner6455dff2014-05-26 00:36:24 +00001956 if (chip->tested.write == NA) {
1957 msg_cerr("Write is not possible on this chip.\n");
1958 return 1;
1959 }
1960 if (chip->tested.write == BAD) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001961 msg_cerr("Write is not working on this chip. ");
1962 if (!force)
1963 return 1;
1964 msg_cerr("Continuing anyway.\n");
1965 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001966 if (!chip->write) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001967 msg_cerr("flashrom has no write function for this "
1968 "flash chip.\n");
1969 return 1;
1970 }
1971 }
1972 return 0;
1973}
1974
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001975/* This function signature is horrible. We need to design a better interface,
1976 * but right now it allows us to split off the CLI code.
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00001977 * Besides that, the function itself is a textbook example of abysmal code flow.
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001978 */
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +00001979int doit(struct flashctx *flash, int force, const char *filename, int read_it,
1980 int write_it, int erase_it, int verify_it)
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001981{
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001982 uint8_t *oldcontents;
1983 uint8_t *newcontents;
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001984 int ret = 0;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001985 unsigned long size = flash->chip->total_size * 1024;
Stefan Tauner73f5bda2014-10-19 07:53:45 +00001986 int read_all_first = 1; /* FIXME: Make this configurable. */
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001987
David Hendricks77f931a2011-05-18 01:30:56 +00001988 if (chip_safety_check(flash, force, read_it, write_it, erase_it, verify_it)) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001989 msg_cerr("Aborting.\n");
Stefan Tauner20da4aa2014-05-07 22:07:23 +00001990 return 1;
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001991 }
1992
Stefan Tauner8268fdb2013-09-23 14:21:06 +00001993 if (normalize_romentries(flash)) {
1994 msg_cerr("Requested regions can not be handled. Aborting.\n");
Stefan Tauner20da4aa2014-05-07 22:07:23 +00001995 return 1;
Stefan Tauner8268fdb2013-09-23 14:21:06 +00001996 }
1997
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001998 /* Given the existence of read locks, we want to unlock for read,
1999 * erase and write.
2000 */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00002001 if (flash->chip->unlock)
2002 flash->chip->unlock(flash);
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00002003
2004 if (read_it) {
Stefan Tauner20da4aa2014-05-07 22:07:23 +00002005 return read_flash_to_file(flash, filename);
Carl-Daniel Hailfingerd1be52d2010-07-03 12:14:25 +00002006 }
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00002007
Stefan Tauner269de352011-07-12 22:35:21 +00002008 oldcontents = malloc(size);
2009 if (!oldcontents) {
2010 msg_gerr("Out of memory!\n");
2011 exit(1);
2012 }
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00002013 /* Assume worst case: All bits are 0. */
2014 memset(oldcontents, 0x00, size);
Stefan Tauner269de352011-07-12 22:35:21 +00002015 newcontents = malloc(size);
2016 if (!newcontents) {
2017 msg_gerr("Out of memory!\n");
2018 exit(1);
2019 }
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00002020 /* Assume best case: All bits should be 1. */
2021 memset(newcontents, 0xff, size);
2022 /* Side effect of the assumptions above: Default write action is erase
2023 * because newcontents looks like a completely erased chip, and
2024 * oldcontents being completely 0x00 means we have to erase everything
2025 * before we can write.
2026 */
2027
Ollie Lhoefa28582004-12-08 20:10:01 +00002028 if (erase_it) {
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00002029 /* FIXME: Do we really want the scary warning if erase failed?
2030 * After all, after erase the chip is either blank or partially
2031 * blank or it has the old contents. A blank chip won't boot,
2032 * so if the user wanted erase and reboots afterwards, the user
2033 * knows very well that booting won't work.
2034 */
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00002035 if (erase_and_write_flash(flash, oldcontents, newcontents)) {
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00002036 emergency_help_message();
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00002037 ret = 1;
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00002038 }
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00002039 goto out;
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00002040 }
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00002041
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00002042 if (write_it || verify_it) {
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00002043 if (read_buf_from_file(newcontents, size, filename)) {
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00002044 ret = 1;
2045 goto out;
Stefan Reinauer018aca82006-11-21 23:48:51 +00002046 }
2047
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +00002048#if CONFIG_INTERNAL == 1
Stefan Taunerb4e06bd2012-08-20 00:24:22 +00002049 if (programmer == PROGRAMMER_INTERNAL && cb_check_image(newcontents, size) < 0) {
2050 if (force_boardmismatch) {
2051 msg_pinfo("Proceeding anyway because user forced us to.\n");
2052 } else {
2053 msg_perr("Aborting. You can override this with "
2054 "-p internal:boardmismatch=force.\n");
Niklas Söderlund9e423762012-06-16 00:11:16 +00002055 ret = 1;
2056 goto out;
2057 }
Stefan Taunerb4e06bd2012-08-20 00:24:22 +00002058 }
Carl-Daniel Hailfinger66ef4e52009-12-13 22:28:00 +00002059#endif
Ollie Lhocbbf1252004-03-17 22:22:08 +00002060 }
2061
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00002062 /* Read the whole chip to be able to check whether regions need to be
2063 * erased and to give better diagnostics in case write fails.
Stefan Tauner73f5bda2014-10-19 07:53:45 +00002064 * The alternative is to read only the regions which are to be
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00002065 * preserved, but in that case we might perform unneeded erase which
2066 * takes time as well.
2067 */
Stefan Tauner73f5bda2014-10-19 07:53:45 +00002068 if (read_all_first) {
2069 msg_cinfo("Reading old flash chip contents... ");
2070 if (flash->chip->read(flash, oldcontents, 0, size)) {
2071 ret = 1;
2072 msg_cinfo("FAILED.\n");
2073 goto out;
2074 }
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00002075 }
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00002076 msg_cinfo("done.\n");
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00002077
Stefan Tauner8268fdb2013-09-23 14:21:06 +00002078 /* Build a new image taking the given layout into account. */
Stefan Tauner73f5bda2014-10-19 07:53:45 +00002079 if (build_new_image(flash, read_all_first, oldcontents, newcontents)) {
2080 msg_gerr("Could not prepare the data to be written, aborting.\n");
2081 ret = 1;
2082 goto out;
2083 }
Uwe Hermanna7e05482007-05-09 10:17:44 +00002084
Ollie Lho184a4042005-11-26 21:55:36 +00002085 // ////////////////////////////////////////////////////////////
Uwe Hermanna7e05482007-05-09 10:17:44 +00002086
Stefan Tauner73f5bda2014-10-19 07:53:45 +00002087 if (write_it && erase_and_write_flash(flash, oldcontents, newcontents)) {
Stefan Tauner5c316f92015-02-08 21:57:52 +00002088 msg_cerr("Uh oh. Erase/write failed. ");
Stefan Tauner73f5bda2014-10-19 07:53:45 +00002089 if (read_all_first) {
2090 msg_cerr("Checking if anything has changed.\n");
Stefan Taunera58f6e92014-05-10 09:25:44 +00002091 msg_cinfo("Reading current flash chip contents... ");
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00002092 if (!flash->chip->read(flash, newcontents, 0, size)) {
Stefan Taunera58f6e92014-05-10 09:25:44 +00002093 msg_cinfo("done.\n");
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00002094 if (!memcmp(oldcontents, newcontents, size)) {
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00002095 nonfatal_help_message();
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00002096 ret = 1;
2097 goto out;
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00002098 }
Stefan Taunera58f6e92014-05-10 09:25:44 +00002099 msg_cerr("Apparently at least some data has changed.\n");
2100 } else
2101 msg_cerr("Can't even read anymore!\n");
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00002102 emergency_help_message();
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00002103 ret = 1;
2104 goto out;
Stefan Tauner73f5bda2014-10-19 07:53:45 +00002105 } else
2106 msg_cerr("\n");
2107 emergency_help_message();
2108 ret = 1;
2109 goto out;
Peter Stugef31104c2008-04-28 14:47:30 +00002110 }
Ollie Lho184a4042005-11-26 21:55:36 +00002111
Stefan Taunerc4f44df2013-08-12 22:58:43 +00002112 /* Verify only if we either did not try to write (verify operation) or actually changed something. */
2113 if (verify_it && (!write_it || !all_skipped)) {
Stefan Tauner78ffbea2012-10-27 15:36:56 +00002114 msg_cinfo("Verifying flash... ");
2115
2116 if (write_it) {
2117 /* Work around chips which need some time to calm down. */
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00002118 programmer_delay(1000*1000);
Stefan Tauner78ffbea2012-10-27 15:36:56 +00002119 ret = verify_range(flash, newcontents, 0, size);
2120 /* If we tried to write, and verification now fails, we
2121 * might have an emergency situation.
2122 */
2123 if (ret)
2124 emergency_help_message();
2125 } else {
2126 ret = compare_range(newcontents, oldcontents, 0, size);
2127 }
2128 if (!ret)
2129 msg_cinfo("VERIFIED.\n");
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00002130 }
Ollie Lho184a4042005-11-26 21:55:36 +00002131
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00002132out:
2133 free(oldcontents);
2134 free(newcontents);
Stefan Reinauer143da0b2006-01-04 16:42:57 +00002135 return ret;
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00002136}