blob: e67270195d1acf44d508c023d6ff90a14471183d [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 Tauneraf358d62012-12-27 18:40:26 +0000250 .type = OTHER,
251 /* FIXME */
252 .devs.note = "Dediprog SF100\n",
Carl-Daniel Hailfingerd38fac82010-01-19 11:15:48 +0000253 .init = dediprog_init,
Carl-Daniel Hailfingerd38fac82010-01-19 11:15:48 +0000254 .map_flash_region = fallback_map,
255 .unmap_flash_region = fallback_unmap,
Carl-Daniel Hailfingerd38fac82010-01-19 11:15:48 +0000256 .delay = internal_delay,
257 },
258#endif
259
Carl-Daniel Hailfingere7fdd6e2010-07-21 10:26:01 +0000260#if CONFIG_RAYER_SPI == 1
261 {
262 .name = "rayer_spi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000263 .type = OTHER,
264 /* FIXME */
265 .devs.note = "RayeR parallel port programmer\n",
Carl-Daniel Hailfingere7fdd6e2010-07-21 10:26:01 +0000266 .init = rayer_spi_init,
Carl-Daniel Hailfingere7fdd6e2010-07-21 10:26:01 +0000267 .map_flash_region = fallback_map,
268 .unmap_flash_region = fallback_unmap,
Carl-Daniel Hailfingere7fdd6e2010-07-21 10:26:01 +0000269 .delay = internal_delay,
270 },
271#endif
272
Virgil-Adrian Teacada7c5452012-04-30 23:11:06 +0000273#if CONFIG_PONY_SPI == 1
274 {
275 .name = "pony_spi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000276 .type = OTHER,
277 /* FIXME */
278 .devs.note = "Programmers compatible with SI-Prog, serbang or AJAWe\n",
Virgil-Adrian Teacada7c5452012-04-30 23:11:06 +0000279 .init = pony_spi_init,
280 .map_flash_region = fallback_map,
281 .unmap_flash_region = fallback_unmap,
282 .delay = internal_delay,
Stefan Tauneraf358d62012-12-27 18:40:26 +0000283 },
Virgil-Adrian Teacada7c5452012-04-30 23:11:06 +0000284#endif
285
Carl-Daniel Hailfingerb713d2e2011-05-08 00:24:18 +0000286#if CONFIG_NICINTEL == 1
287 {
288 .name = "nicintel",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000289 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000290 .devs.dev = nics_intel,
Carl-Daniel Hailfingerb713d2e2011-05-08 00:24:18 +0000291 .init = nicintel_init,
Carl-Daniel Hailfingerb713d2e2011-05-08 00:24:18 +0000292 .map_flash_region = fallback_map,
293 .unmap_flash_region = fallback_unmap,
Carl-Daniel Hailfingerb713d2e2011-05-08 00:24:18 +0000294 .delay = internal_delay,
295 },
296#endif
297
Idwer Vollering004f4b72010-09-03 18:21:21 +0000298#if CONFIG_NICINTEL_SPI == 1
299 {
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000300 .name = "nicintel_spi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000301 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000302 .devs.dev = nics_intel_spi,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000303 .init = nicintel_spi_init,
304 .map_flash_region = fallback_map,
305 .unmap_flash_region = fallback_unmap,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000306 .delay = internal_delay,
Idwer Vollering004f4b72010-09-03 18:21:21 +0000307 },
308#endif
309
Ricardo Ribalda Delgado2a41f0a2014-07-28 20:35:21 +0000310#if CONFIG_NICINTEL_EEPROM == 1
311 {
312 .name = "nicintel_eeprom",
313 .type = PCI,
314 .devs.dev = nics_intel_ee,
315 .init = nicintel_ee_init,
316 .map_flash_region = fallback_map,
317 .unmap_flash_region = fallback_unmap,
318 .delay = internal_delay,
319 },
320#endif
321
Mark Marshall90021f22010-12-03 14:48:11 +0000322#if CONFIG_OGP_SPI == 1
323 {
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000324 .name = "ogp_spi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000325 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000326 .devs.dev = ogp_spi,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000327 .init = ogp_spi_init,
328 .map_flash_region = fallback_map,
329 .unmap_flash_region = fallback_unmap,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000330 .delay = internal_delay,
Mark Marshall90021f22010-12-03 14:48:11 +0000331 },
332#endif
333
Carl-Daniel Hailfinger9a1105c2011-02-04 21:37:59 +0000334#if CONFIG_SATAMV == 1
335 {
336 .name = "satamv",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000337 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000338 .devs.dev = satas_mv,
Carl-Daniel Hailfinger9a1105c2011-02-04 21:37:59 +0000339 .init = satamv_init,
Carl-Daniel Hailfinger9a1105c2011-02-04 21:37:59 +0000340 .map_flash_region = fallback_map,
341 .unmap_flash_region = fallback_unmap,
Carl-Daniel Hailfinger9a1105c2011-02-04 21:37:59 +0000342 .delay = internal_delay,
343 },
344#endif
345
Sven Schnelle5ce5f702011-09-03 18:37:52 +0000346#if CONFIG_LINUX_SPI == 1
347 {
348 .name = "linux_spi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000349 .type = OTHER,
350 .devs.note = "Device files /dev/spidev*.*\n",
Sven Schnelle5ce5f702011-09-03 18:37:52 +0000351 .init = linux_spi_init,
352 .map_flash_region = fallback_map,
353 .unmap_flash_region = fallback_unmap,
Sven Schnelle5ce5f702011-09-03 18:37:52 +0000354 .delay = internal_delay,
355 },
356#endif
357
James Lairdc60de0e2013-03-27 13:00:23 +0000358#if CONFIG_USBBLASTER_SPI == 1
359 {
360 .name = "usbblaster_spi",
361 .type = USB,
362 .devs.dev = devs_usbblasterspi,
363 .init = usbblaster_spi_init,
364 .map_flash_region = fallback_map,
365 .unmap_flash_region = fallback_unmap,
366 .delay = internal_delay,
367 },
368#endif
369
Alexandre Boeglin80e64712014-12-20 20:25:19 +0000370#if CONFIG_MSTARDDC_SPI == 1
371 {
372 .name = "mstarddc_spi",
373 .type = OTHER,
374 .devs.note = "MSTAR DDC devices addressable via /dev/i2c-* on Linux.\n",
375 .init = mstarddc_spi_init,
376 .map_flash_region = fallback_map,
377 .unmap_flash_region = fallback_unmap,
378 .delay = internal_delay,
379 },
380#endif
381
Justin Chevrier66e554b2015-02-08 21:58:10 +0000382#if CONFIG_PICKIT2_SPI == 1
383 {
384 .name = "pickit2_spi",
385 .type = OTHER,
386 /* FIXME */
387 .devs.note = "Microchip PICkit2\n",
388 .init = pickit2_spi_init,
389 .map_flash_region = fallback_map,
390 .unmap_flash_region = fallback_unmap,
391 .delay = internal_delay,
392 },
393#endif
394
Carl-Daniel Hailfinger1c6d2ff2012-08-27 00:44:42 +0000395 {0}, /* This entry corresponds to PROGRAMMER_INVALID. */
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +0000396};
Luc Verhaegen8e3a6002007-04-04 22:45:58 +0000397
Carl-Daniel Hailfinger2bee8cf2010-11-10 15:25:18 +0000398#define SHUTDOWN_MAXFN 32
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000399static int shutdown_fn_count = 0;
400struct shutdown_func_data {
David Hendricks8bb20212011-06-14 01:35:36 +0000401 int (*func) (void *data);
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000402 void *data;
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000403} static shutdown_fn[SHUTDOWN_MAXFN];
404/* Initialize to 0 to make sure nobody registers a shutdown function before
405 * programmer init.
406 */
407static int may_register_shutdown = 0;
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000408
Stefan Taunerc4f44df2013-08-12 22:58:43 +0000409/* Did we change something or was every erase/write skipped (if any)? */
410static bool all_skipped = true;
411
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +0000412static int check_block_eraser(const struct flashctx *flash, int k, int log);
Stefan Tauner5368dca2011-07-01 00:19:12 +0000413
Stefan Tauner2a1ed772014-08-31 00:09:21 +0000414int shutdown_free(void *data)
415{
416 free(data);
417 return 0;
418}
419
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000420/* Register a function to be executed on programmer shutdown.
421 * The advantage over atexit() is that you can supply a void pointer which will
422 * be used as parameter to the registered function upon programmer shutdown.
423 * This pointer can point to arbitrary data used by said function, e.g. undo
424 * information for GPIO settings etc. If unneeded, set data=NULL.
425 * Please note that the first (void *data) belongs to the function signature of
426 * the function passed as first parameter.
427 */
David Hendricks8bb20212011-06-14 01:35:36 +0000428int register_shutdown(int (*function) (void *data), void *data)
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000429{
430 if (shutdown_fn_count >= SHUTDOWN_MAXFN) {
Carl-Daniel Hailfinger9f5f2152010-06-04 23:20:21 +0000431 msg_perr("Tried to register more than %i shutdown functions.\n",
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000432 SHUTDOWN_MAXFN);
433 return 1;
434 }
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000435 if (!may_register_shutdown) {
436 msg_perr("Tried to register a shutdown function before "
437 "programmer init.\n");
438 return 1;
439 }
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000440 shutdown_fn[shutdown_fn_count].func = function;
441 shutdown_fn[shutdown_fn_count].data = data;
442 shutdown_fn_count++;
443
444 return 0;
445}
446
Nico Huberbcb2e5a2012-12-30 01:23:17 +0000447int programmer_init(enum programmer prog, const char *param)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000448{
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000449 int ret;
Carl-Daniel Hailfinger2e681602011-09-08 00:00:29 +0000450
451 if (prog >= PROGRAMMER_INVALID) {
452 msg_perr("Invalid programmer specified!\n");
453 return -1;
454 }
455 programmer = prog;
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000456 /* Initialize all programmer specific data. */
457 /* Default to unlimited decode sizes. */
458 max_rom_decode = (const struct decode_sizes) {
459 .parallel = 0xffffffff,
460 .lpc = 0xffffffff,
461 .fwh = 0xffffffff,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000462 .spi = 0xffffffff,
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000463 };
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000464 /* Default to top aligned flash at 4 GB. */
465 flashbase = 0;
466 /* Registering shutdown functions is now allowed. */
467 may_register_shutdown = 1;
Carl-Daniel Hailfingerd1be52d2010-07-03 12:14:25 +0000468 /* Default to allowing writes. Broken programmers set this to 0. */
469 programmer_may_write = 1;
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000470
471 programmer_param = param;
Carl-Daniel Hailfinger20a36ba2013-08-13 07:09:57 +0000472 msg_pdbg("Initializing %s programmer\n", programmer_table[programmer].name);
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000473 ret = programmer_table[programmer].init();
474 if (programmer_param && strlen(programmer_param)) {
Carl-Daniel Hailfinger20a36ba2013-08-13 07:09:57 +0000475 if (ret != 0) {
476 /* It is quite possible that any unhandled programmer parameter would have been valid,
477 * but an error in actual programmer init happened before the parameter was evaluated.
478 */
479 msg_pwarn("Unhandled programmer parameters (possibly due to another failure): %s\n",
480 programmer_param);
481 } else {
482 /* Actual programmer init was successful, but the user specified an invalid or unusable
483 * (for the current programmer configuration) parameter.
484 */
485 msg_perr("Unhandled programmer parameters: %s\n", programmer_param);
486 msg_perr("Aborting.\n");
487 ret = ERROR_FATAL;
488 }
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000489 }
490 return ret;
Uwe Hermann09e04f72009-05-16 22:36:00 +0000491}
492
Stefan Tauner20da4aa2014-05-07 22:07:23 +0000493/** Calls registered shutdown functions and resets internal programmer-related variables.
494 * Calling it is safe even without previous initialization, but further interactions with programmer support
495 * require a call to programmer_init() (afterwards).
496 *
497 * @return The OR-ed result values of all shutdown functions (i.e. 0 on success). */
Uwe Hermann09e04f72009-05-16 22:36:00 +0000498int programmer_shutdown(void)
499{
David Hendricks8bb20212011-06-14 01:35:36 +0000500 int ret = 0;
501
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000502 /* Registering shutdown functions is no longer allowed. */
503 may_register_shutdown = 0;
504 while (shutdown_fn_count > 0) {
505 int i = --shutdown_fn_count;
David Hendricks8bb20212011-06-14 01:35:36 +0000506 ret |= shutdown_fn[i].func(shutdown_fn[i].data);
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000507 }
Stefan Taunere34e3e82013-01-01 00:06:51 +0000508
Stefan Taunerb8911d62012-12-26 07:55:00 +0000509 programmer_param = NULL;
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000510 registered_master_count = 0;
Stefan Taunere34e3e82013-01-01 00:06:51 +0000511
David Hendricks8bb20212011-06-14 01:35:36 +0000512 return ret;
Uwe Hermann09e04f72009-05-16 22:36:00 +0000513}
514
Stefan Tauner305e0b92013-07-17 23:46:44 +0000515void *programmer_map_flash_region(const char *descr, uintptr_t phys_addr, size_t len)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000516{
Stefan Tauner26e7a152013-09-13 17:21:05 +0000517 void *ret = programmer_table[programmer].map_flash_region(descr, phys_addr, len);
518 msg_gspew("%s: mapping %s from 0x%0*" PRIxPTR " to 0x%0*" PRIxPTR "\n",
519 __func__, descr, PRIxPTR_WIDTH, phys_addr, PRIxPTR_WIDTH, (uintptr_t) ret);
520 return ret;
Uwe Hermann09e04f72009-05-16 22:36:00 +0000521}
522
523void programmer_unmap_flash_region(void *virt_addr, size_t len)
524{
525 programmer_table[programmer].unmap_flash_region(virt_addr, len);
Stefan Tauner4e32ec12014-08-30 23:39:51 +0000526 msg_gspew("%s: unmapped 0x%0*" PRIxPTR "\n", __func__, PRIxPTR_WIDTH, (uintptr_t)virt_addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000527}
528
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000529void chip_writeb(const struct flashctx *flash, uint8_t val, chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000530{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000531 flash->mst->par.chip_writeb(flash, val, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000532}
533
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000534void chip_writew(const struct flashctx *flash, uint16_t val, chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000535{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000536 flash->mst->par.chip_writew(flash, val, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000537}
538
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000539void chip_writel(const struct flashctx *flash, uint32_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_writel(flash, val, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000542}
543
Mark Marshallf20b7be2014-05-09 21:16:21 +0000544void chip_writen(const struct flashctx *flash, const uint8_t *buf, chipaddr addr, size_t len)
Carl-Daniel Hailfinger0bd2a2b2009-06-05 18:32:07 +0000545{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000546 flash->mst->par.chip_writen(flash, buf, addr, len);
Carl-Daniel Hailfinger0bd2a2b2009-06-05 18:32:07 +0000547}
548
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000549uint8_t chip_readb(const struct flashctx *flash, const chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000550{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000551 return flash->mst->par.chip_readb(flash, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000552}
553
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000554uint16_t chip_readw(const struct flashctx *flash, const chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000555{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000556 return flash->mst->par.chip_readw(flash, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000557}
558
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000559uint32_t chip_readl(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_readl(flash, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000562}
563
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000564void chip_readn(const struct flashctx *flash, uint8_t *buf, chipaddr addr,
565 size_t len)
Carl-Daniel Hailfinger0bd2a2b2009-06-05 18:32:07 +0000566{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000567 flash->mst->par.chip_readn(flash, buf, addr, len);
Carl-Daniel Hailfinger0bd2a2b2009-06-05 18:32:07 +0000568}
569
Stefan Taunerf80419c2014-05-02 15:41:42 +0000570void programmer_delay(unsigned int usecs)
Carl-Daniel Hailfingerca8bfc62009-06-05 17:48:08 +0000571{
Urja Rannikko8d7ec2a2013-10-21 21:49:08 +0000572 if (usecs > 0)
573 programmer_table[programmer].delay(usecs);
Carl-Daniel Hailfingerca8bfc62009-06-05 17:48:08 +0000574}
575
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000576int read_memmapped(struct flashctx *flash, uint8_t *buf, unsigned int start,
577 int unsigned len)
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000578{
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000579 chip_readn(flash, buf, flash->virtual_memory + start, len);
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000580
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000581 return 0;
582}
583
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000584/* This is a somewhat hacked function similar in some ways to strtok().
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000585 * It will look for needle with a subsequent '=' in haystack, return a copy of
586 * needle and remove everything from the first occurrence of needle to the next
587 * delimiter from haystack.
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000588 */
Nico Huberbcb2e5a2012-12-30 01:23:17 +0000589char *extract_param(const char *const *haystack, const char *needle, const char *delim)
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000590{
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000591 char *param_pos, *opt_pos, *rest;
592 char *opt = NULL;
593 int optlen;
Carl-Daniel Hailfinger27023762010-04-28 15:22:14 +0000594 int needlelen;
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000595
Carl-Daniel Hailfinger27023762010-04-28 15:22:14 +0000596 needlelen = strlen(needle);
597 if (!needlelen) {
598 msg_gerr("%s: empty needle! Please report a bug at "
599 "flashrom@flashrom.org\n", __func__);
600 return NULL;
601 }
602 /* No programmer parameters given. */
603 if (*haystack == NULL)
604 return NULL;
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000605 param_pos = strstr(*haystack, needle);
606 do {
607 if (!param_pos)
608 return NULL;
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000609 /* Needle followed by '='? */
610 if (param_pos[needlelen] == '=') {
611
612 /* Beginning of the string? */
613 if (param_pos == *haystack)
614 break;
615 /* After a delimiter? */
616 if (strchr(delim, *(param_pos - 1)))
617 break;
618 }
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000619 /* Continue searching. */
620 param_pos++;
621 param_pos = strstr(param_pos, needle);
622 } while (1);
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000623
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000624 if (param_pos) {
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000625 /* Get the string after needle and '='. */
626 opt_pos = param_pos + needlelen + 1;
627 optlen = strcspn(opt_pos, delim);
628 /* Return an empty string if the parameter was empty. */
629 opt = malloc(optlen + 1);
630 if (!opt) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000631 msg_gerr("Out of memory!\n");
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000632 exit(1);
633 }
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000634 strncpy(opt, opt_pos, optlen);
635 opt[optlen] = '\0';
636 rest = opt_pos + optlen;
637 /* Skip all delimiters after the current parameter. */
638 rest += strspn(rest, delim);
639 memmove(param_pos, rest, strlen(rest) + 1);
640 /* We could shrink haystack, but the effort is not worth it. */
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000641 }
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000642
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000643 return opt;
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000644}
645
Stefan Tauner66652442011-06-26 17:38:17 +0000646char *extract_programmer_param(const char *param_name)
Carl-Daniel Hailfinger2b6dcb32010-07-08 10:13:37 +0000647{
648 return extract_param(&programmer_param, param_name, ",");
649}
650
Sylvain "ythier" Hitier9db45512011-07-04 07:27:17 +0000651/* Returns the number of well-defined erasers for a chip. */
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +0000652static unsigned int count_usable_erasers(const struct flashctx *flash)
Stefan Tauner5368dca2011-07-01 00:19:12 +0000653{
654 unsigned int usable_erasefunctions = 0;
655 int k;
656 for (k = 0; k < NUM_ERASEFUNCTIONS; k++) {
657 if (!check_block_eraser(flash, k, 0))
658 usable_erasefunctions++;
659 }
660 return usable_erasefunctions;
661}
662
Mark Marshallf20b7be2014-05-09 21:16:21 +0000663static int compare_range(const uint8_t *wantbuf, const uint8_t *havebuf, unsigned int start, unsigned int len)
Stefan Tauner78ffbea2012-10-27 15:36:56 +0000664{
665 int ret = 0, failcount = 0;
666 unsigned int i;
667 for (i = 0; i < len; i++) {
668 if (wantbuf[i] != havebuf[i]) {
669 /* Only print the first failure. */
670 if (!failcount++)
671 msg_cerr("FAILED at 0x%08x! Expected=0x%02x, Found=0x%02x,",
672 start + i, wantbuf[i], havebuf[i]);
673 }
674 }
675 if (failcount) {
676 msg_cerr(" failed byte count from 0x%08x-0x%08x: 0x%x\n",
677 start, start + len - 1, failcount);
678 ret = -1;
679 }
680 return ret;
681}
682
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000683/* start is an offset to the base address of the flash chip */
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000684int check_erased_range(struct flashctx *flash, unsigned int start,
685 unsigned int len)
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000686{
687 int ret;
688 uint8_t *cmpbuf = malloc(len);
689
690 if (!cmpbuf) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000691 msg_gerr("Could not allocate memory!\n");
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000692 exit(1);
693 }
694 memset(cmpbuf, 0xff, len);
Stefan Tauner78ffbea2012-10-27 15:36:56 +0000695 ret = verify_range(flash, cmpbuf, start, len);
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000696 free(cmpbuf);
697 return ret;
698}
699
Uwe Hermann48ec1b12010-08-08 17:01:18 +0000700/*
Carl-Daniel Hailfingerd0250a32009-11-25 17:05:52 +0000701 * @cmpbuf buffer to compare against, cmpbuf[0] is expected to match the
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000702 * flash content at location start
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000703 * @start offset to the base address of the flash chip
704 * @len length of the verified area
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000705 * @return 0 for success, -1 for failure
706 */
Mark Marshallf20b7be2014-05-09 21:16:21 +0000707int verify_range(struct flashctx *flash, const uint8_t *cmpbuf, unsigned int start, unsigned int len)
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000708{
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000709 if (!len)
Stefan Taunerdf64a422014-05-27 00:06:14 +0000710 return -1;
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000711
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +0000712 if (!flash->chip->read) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000713 msg_cerr("ERROR: flashrom has no read function for this flash chip.\n");
Stefan Taunerdf64a422014-05-27 00:06:14 +0000714 return -1;
Carl-Daniel Hailfinger23290662009-06-24 08:20:45 +0000715 }
Stefan Taunerdf64a422014-05-27 00:06:14 +0000716
717 uint8_t *readbuf = malloc(len);
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000718 if (!readbuf) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000719 msg_gerr("Could not allocate memory!\n");
Stefan Taunerdf64a422014-05-27 00:06:14 +0000720 return -1;
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000721 }
Stefan Taunerdf64a422014-05-27 00:06:14 +0000722 int ret = 0;
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000723
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +0000724 if (start + len > flash->chip->total_size * 1024) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000725 msg_gerr("Error: %s called with start 0x%x + len 0x%x >"
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000726 " total_size 0x%x\n", __func__, start, len,
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +0000727 flash->chip->total_size * 1024);
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000728 ret = -1;
729 goto out_free;
730 }
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000731
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +0000732 ret = flash->chip->read(flash, readbuf, start, len);
Carl-Daniel Hailfingerd8369412010-11-16 17:21:58 +0000733 if (ret) {
734 msg_gerr("Verification impossible because read failed "
735 "at 0x%x (len 0x%x)\n", start, len);
Stefan Taunerdf64a422014-05-27 00:06:14 +0000736 ret = -1;
737 goto out_free;
Carl-Daniel Hailfingerd8369412010-11-16 17:21:58 +0000738 }
739
Stefan Tauner78ffbea2012-10-27 15:36:56 +0000740 ret = compare_range(cmpbuf, readbuf, start, len);
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000741out_free:
742 free(readbuf);
743 return ret;
744}
745
Stefan Tauner02437452013-04-01 19:34:53 +0000746/* Helper function for need_erase() that focuses on granularities of gran bytes. */
Mark Marshallf20b7be2014-05-09 21:16:21 +0000747static 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 +0000748{
749 unsigned int i, j, limit;
750 for (j = 0; j < len / gran; j++) {
751 limit = min (gran, len - j * gran);
752 /* Are 'have' and 'want' identical? */
753 if (!memcmp(have + j * gran, want + j * gran, limit))
754 continue;
755 /* have needs to be in erased state. */
756 for (i = 0; i < limit; i++)
757 if (have[j * gran + i] != 0xff)
758 return 1;
759 }
760 return 0;
761}
762
Uwe Hermann48ec1b12010-08-08 17:01:18 +0000763/*
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000764 * Check if the buffer @have can be programmed to the content of @want without
765 * erasing. This is only possible if all chunks of size @gran are either kept
766 * as-is or changed from an all-ones state to any other state.
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000767 *
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000768 * Warning: This function assumes that @have and @want point to naturally
769 * aligned regions.
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000770 *
771 * @have buffer with current content
772 * @want buffer with desired content
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000773 * @len length of the checked area
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000774 * @gran write granularity (enum, not count)
775 * @return 0 if no erase is needed, 1 otherwise
776 */
Mark Marshallf20b7be2014-05-09 21:16:21 +0000777int 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 +0000778{
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +0000779 int result = 0;
Stefan Tauner02437452013-04-01 19:34:53 +0000780 unsigned int i;
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000781
782 switch (gran) {
783 case write_gran_1bit:
784 for (i = 0; i < len; i++)
785 if ((have[i] & want[i]) != want[i]) {
786 result = 1;
787 break;
788 }
789 break;
790 case write_gran_1byte:
791 for (i = 0; i < len; i++)
792 if ((have[i] != want[i]) && (have[i] != 0xff)) {
793 result = 1;
794 break;
795 }
796 break;
Paul Kocialkowskic8305e12015-10-16 02:16:20 +0000797 case write_gran_128bytes:
798 result = need_erase_gran_bytes(have, want, len, 128);
799 break;
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000800 case write_gran_256bytes:
Stefan Tauner02437452013-04-01 19:34:53 +0000801 result = need_erase_gran_bytes(have, want, len, 256);
802 break;
803 case write_gran_264bytes:
804 result = need_erase_gran_bytes(have, want, len, 264);
805 break;
806 case write_gran_512bytes:
807 result = need_erase_gran_bytes(have, want, len, 512);
808 break;
809 case write_gran_528bytes:
810 result = need_erase_gran_bytes(have, want, len, 528);
811 break;
812 case write_gran_1024bytes:
813 result = need_erase_gran_bytes(have, want, len, 1024);
814 break;
815 case write_gran_1056bytes:
816 result = need_erase_gran_bytes(have, want, len, 1056);
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000817 break;
Carl-Daniel Hailfinger1b0e9fc2014-06-16 22:36:17 +0000818 case write_gran_1byte_implicit_erase:
819 /* Do not erase, handle content changes from anything->0xff by writing 0xff. */
820 result = 0;
821 break;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000822 default:
823 msg_cerr("%s: Unsupported granularity! Please report a bug at "
824 "flashrom@flashrom.org\n", __func__);
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000825 }
826 return result;
827}
828
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000829/**
830 * Check if the buffer @have needs to be programmed to get the content of @want.
831 * If yes, return 1 and fill in first_start with the start address of the
832 * write operation and first_len with the length of the first to-be-written
833 * chunk. If not, return 0 and leave first_start and first_len undefined.
834 *
835 * Warning: This function assumes that @have and @want point to naturally
836 * aligned regions.
837 *
838 * @have buffer with current content
839 * @want buffer with desired content
840 * @len length of the checked area
841 * @gran write granularity (enum, not count)
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000842 * @first_start offset of the first byte which needs to be written (passed in
843 * value is increased by the offset of the first needed write
844 * relative to have/want or unchanged if no write is needed)
845 * @return length of the first contiguous area which needs to be written
846 * 0 if no write is needed
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000847 *
848 * FIXME: This function needs a parameter which tells it about coalescing
849 * in relation to the max write length of the programmer and the max write
850 * length of the chip.
851 */
Mark Marshallf20b7be2014-05-09 21:16:21 +0000852static unsigned int get_next_write(const uint8_t *have, const uint8_t *want, unsigned int len,
Stefan Taunerc69c9c82011-11-23 09:13:48 +0000853 unsigned int *first_start,
854 enum write_granularity gran)
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000855{
Stefan Taunerc69c9c82011-11-23 09:13:48 +0000856 int need_write = 0;
857 unsigned int rel_start = 0, first_len = 0;
858 unsigned int i, limit, stride;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000859
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000860 switch (gran) {
861 case write_gran_1bit:
862 case write_gran_1byte:
Carl-Daniel Hailfinger1b0e9fc2014-06-16 22:36:17 +0000863 case write_gran_1byte_implicit_erase:
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000864 stride = 1;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000865 break;
Paul Kocialkowskic8305e12015-10-16 02:16:20 +0000866 case write_gran_128bytes:
867 stride = 128;
868 break;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000869 case write_gran_256bytes:
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000870 stride = 256;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000871 break;
Stefan Tauner02437452013-04-01 19:34:53 +0000872 case write_gran_264bytes:
873 stride = 264;
874 break;
875 case write_gran_512bytes:
876 stride = 512;
877 break;
878 case write_gran_528bytes:
879 stride = 528;
880 break;
881 case write_gran_1024bytes:
882 stride = 1024;
883 break;
884 case write_gran_1056bytes:
885 stride = 1056;
886 break;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000887 default:
888 msg_cerr("%s: Unsupported granularity! Please report a bug at "
889 "flashrom@flashrom.org\n", __func__);
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000890 /* Claim that no write was needed. A write with unknown
891 * granularity is too dangerous to try.
892 */
893 return 0;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000894 }
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000895 for (i = 0; i < len / stride; i++) {
896 limit = min(stride, len - i * stride);
897 /* Are 'have' and 'want' identical? */
898 if (memcmp(have + i * stride, want + i * stride, limit)) {
899 if (!need_write) {
900 /* First location where have and want differ. */
901 need_write = 1;
902 rel_start = i * stride;
903 }
904 } else {
905 if (need_write) {
906 /* First location where have and want
907 * do not differ anymore.
908 */
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000909 break;
910 }
911 }
912 }
Carl-Daniel Hailfinger202bf532010-12-06 13:05:44 +0000913 if (need_write)
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000914 first_len = min(i * stride - rel_start, len);
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000915 *first_start += rel_start;
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000916 return first_len;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000917}
918
Carl-Daniel Hailfingereaac68b2009-11-23 12:55:31 +0000919/* This function generates various test patterns useful for testing controller
920 * and chip communication as well as chip behaviour.
921 *
922 * If a byte can be written multiple times, each time keeping 0-bits at 0
923 * and changing 1-bits to 0 if the new value for that bit is 0, the effect
924 * is essentially an AND operation. That's also the reason why this function
925 * provides the result of AND between various patterns.
926 *
927 * Below is a list of patterns (and their block length).
928 * Pattern 0 is 05 15 25 35 45 55 65 75 85 95 a5 b5 c5 d5 e5 f5 (16 Bytes)
929 * Pattern 1 is 0a 1a 2a 3a 4a 5a 6a 7a 8a 9a aa ba ca da ea fa (16 Bytes)
930 * Pattern 2 is 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f (16 Bytes)
931 * Pattern 3 is a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af (16 Bytes)
932 * Pattern 4 is 00 10 20 30 40 50 60 70 80 90 a0 b0 c0 d0 e0 f0 (16 Bytes)
933 * Pattern 5 is 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f (16 Bytes)
934 * Pattern 6 is 00 (1 Byte)
935 * Pattern 7 is ff (1 Byte)
936 * Patterns 0-7 have a big-endian block number in the last 2 bytes of each 256
937 * byte block.
938 *
939 * Pattern 8 is 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11... (256 B)
940 * Pattern 9 is ff fe fd fc fb fa f9 f8 f7 f6 f5 f4 f3 f2 f1 f0 ef ee... (256 B)
941 * Pattern 10 is 00 00 00 01 00 02 00 03 00 04... (128 kB big-endian counter)
942 * Pattern 11 is ff ff ff fe ff fd ff fc ff fb... (128 kB big-endian downwards)
943 * Pattern 12 is 00 (1 Byte)
944 * Pattern 13 is ff (1 Byte)
945 * Patterns 8-13 have no block number.
946 *
947 * Patterns 0-3 are created to detect and efficiently diagnose communication
948 * slips like missed bits or bytes and their repetitive nature gives good visual
949 * cues to the person inspecting the results. In addition, the following holds:
950 * AND Pattern 0/1 == Pattern 4
951 * AND Pattern 2/3 == Pattern 5
952 * AND Pattern 0/1/2/3 == AND Pattern 4/5 == Pattern 6
953 * A weakness of pattern 0-5 is the inability to detect swaps/copies between
954 * any two 16-byte blocks except for the last 16-byte block in a 256-byte bloc.
955 * They work perfectly for detecting any swaps/aliasing of blocks >= 256 bytes.
956 * 0x5 and 0xa were picked because they are 0101 and 1010 binary.
957 * Patterns 8-9 are best for detecting swaps/aliasing of blocks < 256 bytes.
958 * Besides that, they provide for bit testing of the last two bytes of every
959 * 256 byte block which contains the block number for patterns 0-6.
960 * Patterns 10-11 are special purpose for detecting subblock aliasing with
961 * block sizes >256 bytes (some Dataflash chips etc.)
962 * AND Pattern 8/9 == Pattern 12
963 * AND Pattern 10/11 == Pattern 12
964 * Pattern 13 is the completely erased state.
965 * None of the patterns can detect aliasing at boundaries which are a multiple
966 * of 16 MBytes (but such chips do not exist anyway for Parallel/LPC/FWH/SPI).
967 */
968int generate_testpattern(uint8_t *buf, uint32_t size, int variant)
969{
970 int i;
971
972 if (!buf) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000973 msg_gerr("Invalid buffer!\n");
Carl-Daniel Hailfingereaac68b2009-11-23 12:55:31 +0000974 return 1;
975 }
976
977 switch (variant) {
978 case 0:
979 for (i = 0; i < size; i++)
980 buf[i] = (i & 0xf) << 4 | 0x5;
981 break;
982 case 1:
983 for (i = 0; i < size; i++)
984 buf[i] = (i & 0xf) << 4 | 0xa;
985 break;
986 case 2:
987 for (i = 0; i < size; i++)
988 buf[i] = 0x50 | (i & 0xf);
989 break;
990 case 3:
991 for (i = 0; i < size; i++)
992 buf[i] = 0xa0 | (i & 0xf);
993 break;
994 case 4:
995 for (i = 0; i < size; i++)
996 buf[i] = (i & 0xf) << 4;
997 break;
998 case 5:
999 for (i = 0; i < size; i++)
1000 buf[i] = i & 0xf;
1001 break;
1002 case 6:
1003 memset(buf, 0x00, size);
1004 break;
1005 case 7:
1006 memset(buf, 0xff, size);
1007 break;
1008 case 8:
1009 for (i = 0; i < size; i++)
1010 buf[i] = i & 0xff;
1011 break;
1012 case 9:
1013 for (i = 0; i < size; i++)
1014 buf[i] = ~(i & 0xff);
1015 break;
1016 case 10:
1017 for (i = 0; i < size % 2; i++) {
1018 buf[i * 2] = (i >> 8) & 0xff;
1019 buf[i * 2 + 1] = i & 0xff;
1020 }
1021 if (size & 0x1)
1022 buf[i * 2] = (i >> 8) & 0xff;
1023 break;
1024 case 11:
1025 for (i = 0; i < size % 2; i++) {
1026 buf[i * 2] = ~((i >> 8) & 0xff);
1027 buf[i * 2 + 1] = ~(i & 0xff);
1028 }
1029 if (size & 0x1)
1030 buf[i * 2] = ~((i >> 8) & 0xff);
1031 break;
1032 case 12:
1033 memset(buf, 0x00, size);
1034 break;
1035 case 13:
1036 memset(buf, 0xff, size);
1037 break;
1038 }
1039
1040 if ((variant >= 0) && (variant <= 7)) {
1041 /* Write block number in the last two bytes of each 256-byte
1042 * block, big endian for easier reading of the hexdump.
1043 * Note that this wraps around for chips larger than 2^24 bytes
1044 * (16 MB).
1045 */
1046 for (i = 0; i < size / 256; i++) {
1047 buf[i * 256 + 254] = (i >> 8) & 0xff;
1048 buf[i * 256 + 255] = i & 0xff;
1049 }
1050 }
1051
1052 return 0;
1053}
1054
Stefan Tauner9e3a6982014-08-15 17:17:59 +00001055/* Returns the number of busses commonly supported by the current programmer and flash chip where the latter
1056 * can not be completely accessed due to size/address limits of the programmer. */
1057unsigned int count_max_decode_exceedings(const struct flashctx *flash)
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001058{
Stefan Tauner9e3a6982014-08-15 17:17:59 +00001059 unsigned int limitexceeded = 0;
1060 uint32_t size = flash->chip->total_size * 1024;
1061 enum chipbustype buses = flash->mst->buses_supported & flash->chip->bustype;
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001062
1063 if ((buses & BUS_PARALLEL) && (max_rom_decode.parallel < size)) {
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001064 limitexceeded++;
Sean Nelson316a29f2010-05-07 20:09:04 +00001065 msg_pdbg("Chip size %u kB is bigger than supported "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001066 "size %u kB of chipset/board/programmer "
1067 "for %s interface, "
1068 "probe/read/erase/write may fail. ", size / 1024,
1069 max_rom_decode.parallel / 1024, "Parallel");
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001070 }
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001071 if ((buses & BUS_LPC) && (max_rom_decode.lpc < size)) {
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001072 limitexceeded++;
Sean Nelson316a29f2010-05-07 20:09:04 +00001073 msg_pdbg("Chip size %u kB is bigger than supported "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001074 "size %u kB of chipset/board/programmer "
1075 "for %s interface, "
1076 "probe/read/erase/write may fail. ", size / 1024,
1077 max_rom_decode.lpc / 1024, "LPC");
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001078 }
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001079 if ((buses & BUS_FWH) && (max_rom_decode.fwh < size)) {
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001080 limitexceeded++;
Sean Nelson316a29f2010-05-07 20:09:04 +00001081 msg_pdbg("Chip size %u kB is bigger than supported "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001082 "size %u kB of chipset/board/programmer "
1083 "for %s interface, "
1084 "probe/read/erase/write may fail. ", size / 1024,
1085 max_rom_decode.fwh / 1024, "FWH");
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001086 }
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001087 if ((buses & BUS_SPI) && (max_rom_decode.spi < size)) {
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001088 limitexceeded++;
Sean Nelson316a29f2010-05-07 20:09:04 +00001089 msg_pdbg("Chip size %u kB is bigger than supported "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001090 "size %u kB of chipset/board/programmer "
1091 "for %s interface, "
1092 "probe/read/erase/write may fail. ", size / 1024,
1093 max_rom_decode.spi / 1024, "SPI");
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001094 }
Stefan Tauner9e3a6982014-08-15 17:17:59 +00001095 return limitexceeded;
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001096}
1097
Stefan Tauner4e32ec12014-08-30 23:39:51 +00001098void unmap_flash(struct flashctx *flash)
1099{
1100 if (flash->virtual_registers != (chipaddr)ERROR_PTR) {
1101 programmer_unmap_flash_region((void *)flash->virtual_registers, flash->chip->total_size * 1024);
1102 flash->physical_registers = 0;
1103 flash->virtual_registers = (chipaddr)ERROR_PTR;
1104 }
1105
1106 if (flash->virtual_memory != (chipaddr)ERROR_PTR) {
1107 programmer_unmap_flash_region((void *)flash->virtual_memory, flash->chip->total_size * 1024);
1108 flash->physical_memory = 0;
1109 flash->virtual_memory = (chipaddr)ERROR_PTR;
1110 }
1111}
1112
1113int map_flash(struct flashctx *flash)
1114{
1115 /* Init pointers to the fail-safe state to distinguish them later from legit values. */
1116 flash->virtual_memory = (chipaddr)ERROR_PTR;
1117 flash->virtual_registers = (chipaddr)ERROR_PTR;
1118
1119 /* FIXME: This avoids mapping (and unmapping) of flash chip definitions with size 0.
1120 * These are used for various probing-related hacks that would not map successfully anyway and should be
1121 * removed ASAP. */
1122 if (flash->chip->total_size == 0)
1123 return 0;
1124
1125 const chipsize_t size = flash->chip->total_size * 1024;
1126 uintptr_t base = flashbase ? flashbase : (0xffffffff - size + 1);
1127 void *addr = programmer_map_flash_region(flash->chip->name, base, size);
1128 if (addr == ERROR_PTR) {
1129 msg_perr("Could not map flash chip %s at 0x%0*" PRIxPTR ".\n",
1130 flash->chip->name, PRIxPTR_WIDTH, base);
1131 return 1;
1132 }
1133 flash->physical_memory = base;
1134 flash->virtual_memory = (chipaddr)addr;
1135
1136 /* FIXME: Special function registers normally live 4 MByte below flash space, but it might be somewhere
1137 * completely different on some chips and programmers, or not mappable at all.
1138 * Ignore these problems for now and always report success. */
1139 if (flash->chip->feature_bits & FEATURE_REGISTERMAP) {
1140 base = 0xffffffff - size - 0x400000 + 1;
1141 addr = programmer_map_flash_region("flash chip registers", base, size);
1142 if (addr == ERROR_PTR) {
1143 msg_pdbg2("Could not map flash chip registers %s at 0x%0*" PRIxPTR ".\n",
1144 flash->chip->name, PRIxPTR_WIDTH, base);
1145 return 0;
1146 }
1147 flash->physical_registers = base;
1148 flash->virtual_registers = (chipaddr)addr;
1149 }
1150 return 0;
1151}
1152
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +00001153int probe_flash(struct registered_master *mst, int startchip, struct flashctx *flash, int force)
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001154{
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001155 const struct flashchip *chip;
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001156 enum chipbustype buses_common;
Carl-Daniel Hailfingerb22918c2009-06-01 02:08:58 +00001157 char *tmp;
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001158
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001159 for (chip = flashchips + startchip; chip && chip->name; chip++) {
1160 if (chip_to_probe && strcmp(chip->name, chip_to_probe) != 0)
Ollie Lhocbbf1252004-03-17 22:22:08 +00001161 continue;
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +00001162 buses_common = mst->buses_supported & chip->bustype;
Carl-Daniel Hailfingerc40cff72011-12-20 00:19:29 +00001163 if (!buses_common)
Carl-Daniel Hailfinger6573b742011-06-17 22:38:53 +00001164 continue;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001165 msg_gdbg("Probing for %s %s, %d kB: ", chip->vendor, chip->name, chip->total_size);
1166 if (!chip->probe && !force) {
1167 msg_gdbg("failed! flashrom has no probe function for this flash chip.\n");
Carl-Daniel Hailfingerb22918c2009-06-01 02:08:58 +00001168 continue;
1169 }
Stefan Reinauer70385642007-04-06 11:58:03 +00001170
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001171 /* Start filling in the dynamic data. */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001172 flash->chip = calloc(1, sizeof(struct flashchip));
1173 if (!flash->chip) {
1174 msg_gerr("Out of memory!\n");
1175 exit(1);
1176 }
1177 memcpy(flash->chip, chip, sizeof(struct flashchip));
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +00001178 flash->mst = mst;
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001179
Stefan Tauner4e32ec12014-08-30 23:39:51 +00001180 if (map_flash(flash) != 0)
1181 return -1;
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001182
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001183 /* We handle a forced match like a real match, we just avoid probing. Note that probe_flash()
1184 * is only called with force=1 after normal probing failed.
1185 */
Peter Stuge27c3e2d2008-07-02 17:15:47 +00001186 if (force)
1187 break;
Stefan Reinauerfcb63682006-03-16 16:57:41 +00001188
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001189 if (flash->chip->probe(flash) != 1)
Peter Stuge483b8f02008-09-03 23:10:05 +00001190 goto notfound;
1191
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001192 /* If this is the first chip found, accept it.
1193 * If this is not the first chip found, accept it only if it is
Stefan Taunerac1b4c82012-02-17 14:51:04 +00001194 * a non-generic match. SFDP and CFI are generic matches.
1195 * startchip==0 means this call to probe_flash() is the first
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +00001196 * one for this programmer interface (master) and thus no other chip has
Stefan Taunerac1b4c82012-02-17 14:51:04 +00001197 * been found on this interface.
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001198 */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001199 if (startchip == 0 && flash->chip->model_id == SFDP_DEVICE_ID) {
Stefan Taunerac1b4c82012-02-17 14:51:04 +00001200 msg_cinfo("===\n"
1201 "SFDP has autodetected a flash chip which is "
1202 "not natively supported by flashrom yet.\n");
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001203 if (count_usable_erasers(flash) == 0)
Stefan Taunerac1b4c82012-02-17 14:51:04 +00001204 msg_cinfo("The standard operations read and "
1205 "verify should work, but to support "
1206 "erase, write and all other "
1207 "possible features");
1208 else
1209 msg_cinfo("All standard operations (read, "
1210 "verify, erase and write) should "
1211 "work, but to support all possible "
1212 "features");
1213
Stefan Taunerb4e06bd2012-08-20 00:24:22 +00001214 msg_cinfo(" we need to add them manually.\n"
1215 "You can help us by mailing us the output of the following command to "
1216 "flashrom@flashrom.org:\n"
1217 "'flashrom -VV [plus the -p/--programmer parameter]'\n"
1218 "Thanks for your help!\n"
Stefan Taunerac1b4c82012-02-17 14:51:04 +00001219 "===\n");
1220 }
1221
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001222 /* First flash chip detected on this bus. */
1223 if (startchip == 0)
Peter Stuge27c3e2d2008-07-02 17:15:47 +00001224 break;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001225 /* Not the first flash chip detected on this bus, but not a generic match either. */
1226 if ((flash->chip->model_id != GENERIC_DEVICE_ID) && (flash->chip->model_id != SFDP_DEVICE_ID))
1227 break;
1228 /* 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 +00001229notfound:
Stefan Tauner4e32ec12014-08-30 23:39:51 +00001230 unmap_flash(flash);
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001231 free(flash->chip);
1232 flash->chip = NULL;
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001233 }
Uwe Hermannffec5f32007-08-23 16:08:21 +00001234
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001235 if (!flash->chip)
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001236 return -1;
Peter Stuge27c3e2d2008-07-02 17:15:47 +00001237
Stefan Reinauer051e2362011-01-19 06:21:54 +00001238
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001239 tmp = flashbuses_to_text(flash->chip->bustype);
Stefan Tauner4e32ec12014-08-30 23:39:51 +00001240 msg_cinfo("%s %s flash chip \"%s\" (%d kB, %s) ", force ? "Assuming" : "Found",
1241 flash->chip->vendor, flash->chip->name, flash->chip->total_size, tmp);
Stefan Tauner00155492011-06-26 20:45:35 +00001242 free(tmp);
Stefan Tauner4e32ec12014-08-30 23:39:51 +00001243#if CONFIG_INTERNAL == 1
1244 if (programmer_table[programmer].map_flash_region == physmap)
1245 msg_cinfo("mapped at physical address 0x%0*" PRIxPTR ".\n",
1246 PRIxPTR_WIDTH, flash->physical_memory);
1247 else
1248#endif
1249 msg_cinfo("on %s.\n", programmer_table[programmer].name);
Uwe Hermann9899cad2009-06-28 21:47:57 +00001250
Stefan Tauner4e32ec12014-08-30 23:39:51 +00001251 /* Flash registers may more likely not be mapped if the chip was forced.
1252 * Lock info may be stored in registers, so avoid lock info printing. */
Carl-Daniel Hailfinger859f3f02010-12-02 21:59:42 +00001253 if (!force)
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001254 if (flash->chip->printlock)
1255 flash->chip->printlock(flash);
Sean Nelson6e0b9122010-02-19 00:52:10 +00001256
Stefan Tauner4e32ec12014-08-30 23:39:51 +00001257 /* Get out of the way for later runs. */
1258 unmap_flash(flash);
1259
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001260 /* Return position of matching chip. */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001261 return chip - flashchips;
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001262}
1263
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001264int read_buf_from_file(unsigned char *buf, unsigned long size,
1265 const char *filename)
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001266{
Nico Huber7562f7d2013-08-30 21:29:45 +00001267#ifdef __LIBPAYLOAD__
1268 msg_gerr("Error: No file I/O support in libpayload\n");
1269 return 1;
1270#else
Stefan Tauner16687702015-12-25 21:59:45 +00001271 int ret = 0;
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001272
Stefan Tauner16687702015-12-25 21:59:45 +00001273 FILE *image;
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001274 if ((image = fopen(filename, "rb")) == NULL) {
Stefan Tauner363fd7e2013-04-07 13:08:30 +00001275 msg_gerr("Error: opening file \"%s\" failed: %s\n", filename, strerror(errno));
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001276 return 1;
1277 }
Stefan Tauner16687702015-12-25 21:59:45 +00001278
1279 struct stat image_stat;
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001280 if (fstat(fileno(image), &image_stat) != 0) {
Stefan Tauner363fd7e2013-04-07 13:08:30 +00001281 msg_gerr("Error: getting metadata of file \"%s\" failed: %s\n", filename, strerror(errno));
Stefan Tauner16687702015-12-25 21:59:45 +00001282 ret = 1;
1283 goto out;
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001284 }
1285 if (image_stat.st_size != size) {
Carl-Daniel Hailfinger11990da2013-07-13 23:21:05 +00001286 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 +00001287 (intmax_t)image_stat.st_size, size);
Stefan Tauner16687702015-12-25 21:59:45 +00001288 ret = 1;
1289 goto out;
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001290 }
Stefan Tauner16687702015-12-25 21:59:45 +00001291
1292 unsigned long numbytes = fread(buf, 1, size, image);
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001293 if (numbytes != size) {
1294 msg_gerr("Error: Failed to read complete file. Got %ld bytes, "
1295 "wanted %ld!\n", numbytes, size);
Stefan Tauner16687702015-12-25 21:59:45 +00001296 ret = 1;
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001297 }
Stefan Tauner16687702015-12-25 21:59:45 +00001298out:
1299 (void)fclose(image);
1300 return ret;
Nico Huber7562f7d2013-08-30 21:29:45 +00001301#endif
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001302}
1303
Mark Marshallf20b7be2014-05-09 21:16:21 +00001304int write_buf_to_file(const unsigned char *buf, unsigned long size, const char *filename)
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001305{
Nico Huber7562f7d2013-08-30 21:29:45 +00001306#ifdef __LIBPAYLOAD__
1307 msg_gerr("Error: No file I/O support in libpayload\n");
1308 return 1;
1309#else
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001310 FILE *image;
Stefan Tauner16687702015-12-25 21:59:45 +00001311 int ret = 0;
Stephan Guilloux21dd55b2009-06-01 22:07:52 +00001312
1313 if (!filename) {
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001314 msg_gerr("No filename specified.\n");
Stephan Guilloux21dd55b2009-06-01 22:07:52 +00001315 return 1;
1316 }
Patrick Georgi0bf842d2010-01-25 22:55:33 +00001317 if ((image = fopen(filename, "wb")) == NULL) {
Stefan Tauner363fd7e2013-04-07 13:08:30 +00001318 msg_gerr("Error: opening file \"%s\" failed: %s\n", filename, strerror(errno));
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00001319 return 1;
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001320 }
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001321
Stefan Tauner16687702015-12-25 21:59:45 +00001322 unsigned long numbytes = fwrite(buf, 1, size, image);
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001323 if (numbytes != size) {
Stefan Tauner16687702015-12-25 21:59:45 +00001324 msg_gerr("Error: file %s could not be written completely.\n", filename);
1325 ret = 1;
1326 goto out;
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001327 }
Stefan Tauner16687702015-12-25 21:59:45 +00001328 if (fflush(image)) {
1329 msg_gerr("Error: flushing file \"%s\" failed: %s\n", filename, strerror(errno));
1330 ret = 1;
1331 }
1332 // Try to fsync() only regular files and if that function is available at all (e.g. not on MinGW).
1333#if defined(_POSIX_FSYNC) && (_POSIX_FSYNC != -1)
1334 struct stat image_stat;
1335 if (fstat(fileno(image), &image_stat) != 0) {
1336 msg_gerr("Error: getting metadata of file \"%s\" failed: %s\n", filename, strerror(errno));
1337 ret = 1;
1338 goto out;
1339 }
1340 if (S_ISREG(image_stat.st_mode)) {
1341 if (fsync(fileno(image))) {
1342 msg_gerr("Error: fsyncing file \"%s\" failed: %s\n", filename, strerror(errno));
1343 ret = 1;
1344 }
1345 }
1346#endif
1347out:
1348 if (fclose(image)) {
1349 msg_gerr("Error: closing file \"%s\" failed: %s\n", filename, strerror(errno));
1350 ret = 1;
1351 }
1352 return ret;
Nico Huber7562f7d2013-08-30 21:29:45 +00001353#endif
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001354}
1355
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001356int read_flash_to_file(struct flashctx *flash, const char *filename)
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001357{
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001358 unsigned long size = flash->chip->total_size * 1024;
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001359 unsigned char *buf = calloc(size, sizeof(char));
1360 int ret = 0;
1361
1362 msg_cinfo("Reading flash... ");
1363 if (!buf) {
1364 msg_gerr("Memory allocation failed!\n");
1365 msg_cinfo("FAILED.\n");
1366 return 1;
1367 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001368 if (!flash->chip->read) {
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001369 msg_cerr("No read function available for this flash chip.\n");
1370 ret = 1;
1371 goto out_free;
1372 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001373 if (flash->chip->read(flash, buf, 0, size)) {
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001374 msg_cerr("Read operation failed!\n");
1375 ret = 1;
1376 goto out_free;
1377 }
1378
Stefan Tauner355cbfd2011-05-28 02:37:14 +00001379 ret = write_buf_to_file(buf, size, filename);
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001380out_free:
1381 free(buf);
1382 msg_cinfo("%s.\n", ret ? "FAILED" : "done");
1383 return ret;
1384}
1385
Stefan Tauner96658be2014-05-26 22:05:31 +00001386/* Even if an error is found, the function will keep going and check the rest. */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001387static int selfcheck_eraseblocks(const struct flashchip *chip)
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001388{
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +00001389 int i, j, k;
1390 int ret = 0;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001391
1392 for (k = 0; k < NUM_ERASEFUNCTIONS; k++) {
1393 unsigned int done = 0;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001394 struct block_eraser eraser = chip->block_erasers[k];
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001395
1396 for (i = 0; i < NUM_ERASEREGIONS; i++) {
1397 /* Blocks with zero size are bugs in flashchips.c. */
1398 if (eraser.eraseblocks[i].count &&
1399 !eraser.eraseblocks[i].size) {
1400 msg_gerr("ERROR: Flash chip %s erase function "
1401 "%i region %i has size 0. Please report"
1402 " a bug at flashrom@flashrom.org\n",
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001403 chip->name, k, i);
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001404 ret = 1;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001405 }
1406 /* Blocks with zero count are bugs in flashchips.c. */
1407 if (!eraser.eraseblocks[i].count &&
1408 eraser.eraseblocks[i].size) {
1409 msg_gerr("ERROR: Flash chip %s erase function "
1410 "%i region %i has count 0. Please report"
1411 " a bug at flashrom@flashrom.org\n",
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001412 chip->name, k, i);
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001413 ret = 1;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001414 }
1415 done += eraser.eraseblocks[i].count *
1416 eraser.eraseblocks[i].size;
1417 }
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001418 /* Empty eraseblock definition with erase function. */
1419 if (!done && eraser.block_erase)
Sean Nelson316a29f2010-05-07 20:09:04 +00001420 msg_gspew("Strange: Empty eraseblock definition with "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001421 "non-empty erase function. Not an error.\n");
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001422 if (!done)
1423 continue;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001424 if (done != chip->total_size * 1024) {
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001425 msg_gerr("ERROR: Flash chip %s erase function %i "
1426 "region walking resulted in 0x%06x bytes total,"
1427 " expected 0x%06x bytes. Please report a bug at"
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001428 " flashrom@flashrom.org\n", chip->name, k,
1429 done, chip->total_size * 1024);
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001430 ret = 1;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001431 }
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001432 if (!eraser.block_erase)
1433 continue;
1434 /* Check if there are identical erase functions for different
1435 * layouts. That would imply "magic" erase functions. The
1436 * easiest way to check this is with function pointers.
1437 */
Uwe Hermann43959702010-03-13 17:28:29 +00001438 for (j = k + 1; j < NUM_ERASEFUNCTIONS; j++) {
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001439 if (eraser.block_erase ==
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001440 chip->block_erasers[j].block_erase) {
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001441 msg_gerr("ERROR: Flash chip %s erase function "
1442 "%i and %i are identical. Please report"
1443 " a bug at flashrom@flashrom.org\n",
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001444 chip->name, k, j);
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001445 ret = 1;
1446 }
Uwe Hermann43959702010-03-13 17:28:29 +00001447 }
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001448 }
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001449 return ret;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001450}
1451
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001452static int erase_and_write_block_helper(struct flashctx *flash,
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001453 unsigned int start, unsigned int len,
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001454 uint8_t *curcontents,
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001455 uint8_t *newcontents,
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001456 int (*erasefn) (struct flashctx *flash,
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001457 unsigned int addr,
1458 unsigned int len))
1459{
Stefan Taunerc69c9c82011-11-23 09:13:48 +00001460 unsigned int starthere = 0, lenhere = 0;
1461 int ret = 0, skip = 1, writecount = 0;
Stefan Tauner50d67aa2013-03-03 23:49:48 +00001462 enum write_granularity gran = flash->chip->gran;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001463
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001464 /* curcontents and newcontents are opaque to walk_eraseregions, and
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001465 * need to be adjusted here to keep the impression of proper abstraction
1466 */
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001467 curcontents += start;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001468 newcontents += start;
1469 msg_cdbg(":");
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001470 if (need_erase(curcontents, newcontents, len, gran)) {
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001471 msg_cdbg("E");
1472 ret = erasefn(flash, start, len);
1473 if (ret)
1474 return ret;
Carl-Daniel Hailfingerb4061f62011-06-26 17:04:16 +00001475 if (check_erased_range(flash, start, len)) {
1476 msg_cerr("ERASE FAILED!\n");
1477 return -1;
1478 }
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001479 /* Erase was successful. Adjust curcontents. */
1480 memset(curcontents, 0xff, len);
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001481 skip = 0;
1482 }
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001483 /* get_next_write() sets starthere to a new value after the call. */
1484 while ((lenhere = get_next_write(curcontents + starthere,
1485 newcontents + starthere,
1486 len - starthere, &starthere, gran))) {
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001487 if (!writecount++)
1488 msg_cdbg("W");
1489 /* Needs the partial write function signature. */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001490 ret = flash->chip->write(flash, newcontents + starthere,
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001491 start + starthere, lenhere);
1492 if (ret)
1493 return ret;
1494 starthere += lenhere;
1495 skip = 0;
1496 }
1497 if (skip)
1498 msg_cdbg("S");
Stefan Tauner682122b2013-06-23 22:15:39 +00001499 else
1500 all_skipped = false;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001501 return ret;
1502}
1503
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001504static int walk_eraseregions(struct flashctx *flash, int erasefunction,
1505 int (*do_something) (struct flashctx *flash,
Carl-Daniel Hailfinger4d3e9ca2010-07-13 00:42:00 +00001506 unsigned int addr,
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001507 unsigned int len,
1508 uint8_t *param1,
1509 uint8_t *param2,
1510 int (*erasefn) (
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001511 struct flashctx *flash,
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001512 unsigned int addr,
1513 unsigned int len)),
1514 void *param1, void *param2)
Carl-Daniel Hailfingera1223412010-07-13 00:37:19 +00001515{
1516 int i, j;
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +00001517 unsigned int start = 0;
1518 unsigned int len;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001519 struct block_eraser eraser = flash->chip->block_erasers[erasefunction];
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001520
Carl-Daniel Hailfingera1223412010-07-13 00:37:19 +00001521 for (i = 0; i < NUM_ERASEREGIONS; i++) {
1522 /* count==0 for all automatically initialized array
1523 * members so the loop below won't be executed for them.
1524 */
1525 len = eraser.eraseblocks[i].size;
1526 for (j = 0; j < eraser.eraseblocks[i].count; j++) {
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001527 /* Print this for every block except the first one. */
1528 if (i || j)
1529 msg_cdbg(", ");
1530 msg_cdbg("0x%06x-0x%06x", start,
Carl-Daniel Hailfingera1223412010-07-13 00:37:19 +00001531 start + len - 1);
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001532 if (do_something(flash, start, len, param1, param2,
1533 eraser.block_erase)) {
Carl-Daniel Hailfingera1223412010-07-13 00:37:19 +00001534 return 1;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001535 }
Carl-Daniel Hailfingera1223412010-07-13 00:37:19 +00001536 start += len;
1537 }
1538 }
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001539 msg_cdbg("\n");
Carl-Daniel Hailfingera1223412010-07-13 00:37:19 +00001540 return 0;
1541}
1542
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001543static int check_block_eraser(const struct flashctx *flash, int k, int log)
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001544{
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001545 struct block_eraser eraser = flash->chip->block_erasers[k];
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001546
1547 if (!eraser.block_erase && !eraser.eraseblocks[0].count) {
1548 if (log)
1549 msg_cdbg("not defined. ");
1550 return 1;
1551 }
1552 if (!eraser.block_erase && eraser.eraseblocks[0].count) {
1553 if (log)
1554 msg_cdbg("eraseblock layout is known, but matching "
Stefan Tauner355cbfd2011-05-28 02:37:14 +00001555 "block erase function is not implemented. ");
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001556 return 1;
1557 }
1558 if (eraser.block_erase && !eraser.eraseblocks[0].count) {
1559 if (log)
1560 msg_cdbg("block erase function found, but "
Stefan Tauner355cbfd2011-05-28 02:37:14 +00001561 "eraseblock layout is not defined. ");
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001562 return 1;
1563 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001564 // TODO: Once erase functions are annotated with allowed buses, check that as well.
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001565 return 0;
1566}
1567
Mark Marshallf20b7be2014-05-09 21:16:21 +00001568int erase_and_write_flash(struct flashctx *flash, uint8_t *oldcontents, uint8_t *newcontents)
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001569{
Carl-Daniel Hailfingerd8334db2011-07-21 21:21:04 +00001570 int k, ret = 1;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001571 uint8_t *curcontents;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001572 unsigned long size = flash->chip->total_size * 1024;
Sylvain "ythier" Hitier9db45512011-07-04 07:27:17 +00001573 unsigned int usable_erasefunctions = count_usable_erasers(flash);
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001574
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001575 msg_cinfo("Erasing and writing flash chip... ");
Stefan Tauner269de352011-07-12 22:35:21 +00001576 curcontents = malloc(size);
1577 if (!curcontents) {
1578 msg_gerr("Out of memory!\n");
1579 exit(1);
1580 }
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001581 /* Copy oldcontents to curcontents to avoid clobbering oldcontents. */
1582 memcpy(curcontents, oldcontents, size);
1583
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001584 for (k = 0; k < NUM_ERASEFUNCTIONS; k++) {
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001585 if (k != 0)
Stefan Tauner16878542014-07-13 23:53:40 +00001586 msg_cinfo("Looking for another erase function.\n");
Carl-Daniel Hailfingerd8334db2011-07-21 21:21:04 +00001587 if (!usable_erasefunctions) {
Stefan Tauner16878542014-07-13 23:53:40 +00001588 msg_cinfo("No usable erase functions left.\n");
Carl-Daniel Hailfingerd8334db2011-07-21 21:21:04 +00001589 break;
1590 }
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001591 msg_cdbg("Trying erase function %i... ", k);
1592 if (check_block_eraser(flash, k, 1))
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001593 continue;
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001594 usable_erasefunctions--;
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001595 ret = walk_eraseregions(flash, k, &erase_and_write_block_helper,
1596 curcontents, newcontents);
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001597 /* If everything is OK, don't try another erase function. */
1598 if (!ret)
1599 break;
Carl-Daniel Hailfingerb23b1eb2010-12-02 02:41:55 +00001600 /* Write/erase failed, so try to find out what the current chip
Carl-Daniel Hailfingerd8334db2011-07-21 21:21:04 +00001601 * contents are. If no usable erase functions remain, we can
1602 * skip this: the next iteration will break immediately anyway.
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001603 */
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001604 if (!usable_erasefunctions)
1605 continue;
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001606 /* Reading the whole chip may take a while, inform the user even
1607 * in non-verbose mode.
1608 */
1609 msg_cinfo("Reading current flash chip contents... ");
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001610 if (flash->chip->read(flash, curcontents, 0, size)) {
Carl-Daniel Hailfingerb23b1eb2010-12-02 02:41:55 +00001611 /* Now we are truly screwed. Read failed as well. */
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001612 msg_cerr("Can't read anymore! Aborting.\n");
Carl-Daniel Hailfingerb23b1eb2010-12-02 02:41:55 +00001613 /* We have no idea about the flash chip contents, so
1614 * retrying with another erase function is pointless.
1615 */
1616 break;
1617 }
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001618 msg_cinfo("done. ");
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001619 }
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001620 /* Free the scratchpad. */
1621 free(curcontents);
Carl-Daniel Hailfingerf160a122009-05-08 17:15:15 +00001622
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001623 if (ret) {
Sean Nelson316a29f2010-05-07 20:09:04 +00001624 msg_cerr("FAILED!\n");
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001625 } else {
Stefan Tauner682122b2013-06-23 22:15:39 +00001626 if (all_skipped)
1627 msg_cinfo("\nWarning: Chip content is identical to the requested image.\n");
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001628 msg_cinfo("Erase/write done.\n");
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001629 }
1630 return ret;
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001631}
1632
Stefan Tauner136388f2013-07-15 10:47:53 +00001633static void nonfatal_help_message(void)
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001634{
Stefan Taunera58f6e92014-05-10 09:25:44 +00001635 msg_gerr("Good, writing to the flash chip apparently didn't do anything.\n");
Stefan Tauner136388f2013-07-15 10:47:53 +00001636#if CONFIG_INTERNAL == 1
1637 if (programmer == PROGRAMMER_INTERNAL)
1638 msg_gerr("This means we have to add special support for your board, programmer or flash\n"
1639 "chip. Please report this on IRC at chat.freenode.net (channel #flashrom) or\n"
1640 "mail flashrom@flashrom.org, thanks!\n"
1641 "-------------------------------------------------------------------------------\n"
1642 "You may now reboot or simply leave the machine running.\n");
1643 else
1644#endif
1645 msg_gerr("Please check the connections (especially those to write protection pins) between\n"
1646 "the programmer and the flash chip. If you think the error is caused by flashrom\n"
1647 "please report this on IRC at chat.freenode.net (channel #flashrom) or\n"
1648 "mail flashrom@flashrom.org, thanks!\n");
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001649}
1650
Stefan Tauner136388f2013-07-15 10:47:53 +00001651static void emergency_help_message(void)
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00001652{
Stefan Tauner136388f2013-07-15 10:47:53 +00001653 msg_gerr("Your flash chip is in an unknown state.\n");
1654#if CONFIG_INTERNAL == 1
1655 if (programmer == PROGRAMMER_INTERNAL)
1656 msg_gerr("Get help on IRC at chat.freenode.net (channel #flashrom) or\n"
1657 "mail flashrom@flashrom.org with the subject \"FAILED: <your board name>\"!\n"
1658 "-------------------------------------------------------------------------------\n"
1659 "DO NOT REBOOT OR POWEROFF!\n");
1660 else
1661#endif
1662 msg_gerr("Please report this on IRC at chat.freenode.net (channel #flashrom) or\n"
1663 "mail flashrom@flashrom.org, thanks!\n");
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00001664}
1665
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001666/* The way to go if you want a delimited list of programmers */
Stefan Tauner66652442011-06-26 17:38:17 +00001667void list_programmers(const char *delim)
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001668{
1669 enum programmer p;
1670 for (p = 0; p < PROGRAMMER_INVALID; p++) {
Sean Nelson316a29f2010-05-07 20:09:04 +00001671 msg_ginfo("%s", programmer_table[p].name);
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001672 if (p < PROGRAMMER_INVALID - 1)
Sean Nelson316a29f2010-05-07 20:09:04 +00001673 msg_ginfo("%s", delim);
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001674 }
Stefan Tauner23e10b82016-01-23 16:16:49 +00001675 msg_ginfo("\n");
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001676}
1677
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001678void list_programmers_linebreak(int startcol, int cols, int paren)
1679{
1680 const char *pname;
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +00001681 int pnamelen;
1682 int remaining = 0, firstline = 1;
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001683 enum programmer p;
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +00001684 int i;
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001685
1686 for (p = 0; p < PROGRAMMER_INVALID; p++) {
1687 pname = programmer_table[p].name;
1688 pnamelen = strlen(pname);
1689 if (remaining - pnamelen - 2 < 0) {
1690 if (firstline)
1691 firstline = 0;
1692 else
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001693 msg_ginfo("\n");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001694 for (i = 0; i < startcol; i++)
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001695 msg_ginfo(" ");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001696 remaining = cols - startcol;
1697 } else {
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001698 msg_ginfo(" ");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001699 remaining--;
1700 }
1701 if (paren && (p == 0)) {
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001702 msg_ginfo("(");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001703 remaining--;
1704 }
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001705 msg_ginfo("%s", pname);
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001706 remaining -= pnamelen;
1707 if (p < PROGRAMMER_INVALID - 1) {
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001708 msg_ginfo(",");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001709 remaining--;
1710 } else {
1711 if (paren)
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001712 msg_ginfo(")");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001713 }
1714 }
1715}
1716
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001717void print_sysinfo(void)
1718{
Stefan Taunerb0eee9b2015-01-10 09:32:50 +00001719#if IS_WINDOWS
Carl-Daniel Hailfinger60d9bd22012-08-09 23:34:41 +00001720 SYSTEM_INFO si;
1721 OSVERSIONINFOEX osvi;
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001722
Carl-Daniel Hailfinger60d9bd22012-08-09 23:34:41 +00001723 memset(&si, 0, sizeof(SYSTEM_INFO));
1724 memset(&osvi, 0, sizeof(OSVERSIONINFOEX));
1725 msg_ginfo(" on Windows");
1726 /* Tell Windows which version of the structure we want. */
1727 osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
1728 if (GetVersionEx((OSVERSIONINFO*) &osvi))
1729 msg_ginfo(" %lu.%lu", osvi.dwMajorVersion, osvi.dwMinorVersion);
1730 else
1731 msg_ginfo(" unknown version");
1732 GetSystemInfo(&si);
1733 switch (si.wProcessorArchitecture) {
1734 case PROCESSOR_ARCHITECTURE_AMD64:
1735 msg_ginfo(" (x86_64)");
1736 break;
1737 case PROCESSOR_ARCHITECTURE_INTEL:
1738 msg_ginfo(" (x86)");
1739 break;
1740 default:
1741 msg_ginfo(" (unknown arch)");
1742 break;
1743 }
1744#elif HAVE_UTSNAME == 1
1745 struct utsname osinfo;
1746
1747 uname(&osinfo);
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001748 msg_ginfo(" on %s %s (%s)", osinfo.sysname, osinfo.release,
1749 osinfo.machine);
1750#else
1751 msg_ginfo(" on unknown machine");
1752#endif
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001753}
1754
1755void print_buildinfo(void)
1756{
1757 msg_gdbg("flashrom was built with");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001758#if NEED_PCI == 1
1759#ifdef PCILIB_VERSION
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001760 msg_gdbg(" libpci %s,", PCILIB_VERSION);
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001761#else
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001762 msg_gdbg(" unknown PCI library,");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001763#endif
1764#endif
1765#ifdef __clang__
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001766 msg_gdbg(" LLVM Clang");
Carl-Daniel Hailfingerb51e58e2010-07-17 14:49:30 +00001767#ifdef __clang_version__
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001768 msg_gdbg(" %s,", __clang_version__);
Carl-Daniel Hailfingerb51e58e2010-07-17 14:49:30 +00001769#else
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001770 msg_gdbg(" unknown version (before r102686),");
Carl-Daniel Hailfingerb51e58e2010-07-17 14:49:30 +00001771#endif
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001772#elif defined(__GNUC__)
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001773 msg_gdbg(" GCC");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001774#ifdef __VERSION__
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001775 msg_gdbg(" %s,", __VERSION__);
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001776#else
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001777 msg_gdbg(" unknown version,");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001778#endif
1779#else
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001780 msg_gdbg(" unknown compiler,");
Carl-Daniel Hailfingercceafa22010-05-26 01:45:41 +00001781#endif
1782#if defined (__FLASHROM_LITTLE_ENDIAN__)
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001783 msg_gdbg(" little endian");
Carl-Daniel Hailfinger06b9efa2012-08-07 11:59:59 +00001784#elif defined (__FLASHROM_BIG_ENDIAN__)
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001785 msg_gdbg(" big endian");
Carl-Daniel Hailfinger06b9efa2012-08-07 11:59:59 +00001786#else
1787#error Endianness could not be determined
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001788#endif
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001789 msg_gdbg("\n");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001790}
1791
Bernhard Walle201bde32008-01-21 15:24:22 +00001792void print_version(void)
1793{
Carl-Daniel Hailfinger8841d3e2010-05-15 15:04:37 +00001794 msg_ginfo("flashrom v%s", flashrom_version);
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001795 print_sysinfo();
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001796 msg_ginfo("\n");
Bernhard Walle201bde32008-01-21 15:24:22 +00001797}
1798
Carl-Daniel Hailfinger8841d3e2010-05-15 15:04:37 +00001799void print_banner(void)
1800{
1801 msg_ginfo("flashrom is free software, get the source code at "
Stefan Tauner4c723152016-01-14 22:47:55 +00001802 "https://flashrom.org\n");
Carl-Daniel Hailfinger8841d3e2010-05-15 15:04:37 +00001803 msg_ginfo("\n");
1804}
1805
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001806int selfcheck(void)
1807{
Stefan Tauner96658be2014-05-26 22:05:31 +00001808 unsigned int i;
Stefan Taunera6d96482012-12-26 19:51:23 +00001809 int ret = 0;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001810
1811 /* Safety check. Instead of aborting after the first error, check
1812 * if more errors exist.
1813 */
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001814 if (ARRAY_SIZE(programmer_table) - 1 != PROGRAMMER_INVALID) {
Sean Nelson316a29f2010-05-07 20:09:04 +00001815 msg_gerr("Programmer table miscompilation!\n");
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001816 ret = 1;
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001817 }
Stefan Taunera6d96482012-12-26 19:51:23 +00001818 for (i = 0; i < PROGRAMMER_INVALID; i++) {
1819 const struct programmer_entry p = programmer_table[i];
1820 if (p.name == NULL) {
1821 msg_gerr("All programmers need a valid name, but the one with index %d does not!\n", i);
1822 ret = 1;
1823 /* This might hide other problems with this programmer, but allows for better error
1824 * messages below without jumping through hoops. */
1825 continue;
1826 }
Stefan Tauneraf358d62012-12-27 18:40:26 +00001827 switch (p.type) {
1828 case USB:
1829 case PCI:
1830 case OTHER:
1831 if (p.devs.note == NULL) {
1832 if (strcmp("internal", p.name) == 0)
1833 break; /* This one has its device list stored separately. */
1834 msg_gerr("Programmer %s has neither a device list nor a textual description!\n",
1835 p.name);
1836 ret = 1;
1837 }
1838 break;
1839 default:
1840 msg_gerr("Programmer %s does not have a valid type set!\n", p.name);
1841 ret = 1;
1842 break;
1843 }
Stefan Taunera6d96482012-12-26 19:51:23 +00001844 if (p.init == NULL) {
1845 msg_gerr("Programmer %s does not have a valid init function!\n", p.name);
1846 ret = 1;
1847 }
1848 if (p.delay == NULL) {
1849 msg_gerr("Programmer %s does not have a valid delay function!\n", p.name);
1850 ret = 1;
1851 }
1852 if (p.map_flash_region == NULL) {
1853 msg_gerr("Programmer %s does not have a valid map_flash_region function!\n", p.name);
1854 ret = 1;
1855 }
1856 if (p.unmap_flash_region == NULL) {
1857 msg_gerr("Programmer %s does not have a valid unmap_flash_region function!\n", p.name);
1858 ret = 1;
1859 }
1860 }
Stefan Tauner96658be2014-05-26 22:05:31 +00001861
1862 /* It would be favorable if we could check for the correct layout (especially termination) of various
1863 * constant arrays: flashchips, chipset_enables, board_matches, boards_known, laptops_known.
1864 * They are all defined as externs in this compilation unit so we don't know their sizes which vary
1865 * depending on compiler flags, e.g. the target architecture, and can sometimes be 0.
1866 * For 'flashchips' we export the size explicitly to work around this and to be able to implement the
1867 * checks below. */
Stefan Tauner6697f712014-08-06 15:09:15 +00001868 if (flashchips_size <= 1 || flashchips[flashchips_size - 1].name != NULL) {
Stefan Tauner7bcacb12011-05-26 01:35:19 +00001869 msg_gerr("Flashchips table miscompilation!\n");
1870 ret = 1;
Stefan Tauner96658be2014-05-26 22:05:31 +00001871 } else {
1872 for (i = 0; i < flashchips_size - 1; i++) {
1873 const struct flashchip *chip = &flashchips[i];
1874 if (chip->vendor == NULL || chip->name == NULL || chip->bustype == BUS_NONE) {
1875 ret = 1;
1876 msg_gerr("ERROR: Some field of flash chip #%d (%s) is misconfigured.\n"
1877 "Please report a bug at flashrom@flashrom.org\n", i,
1878 chip->name == NULL ? "unnamed" : chip->name);
1879 }
1880 if (selfcheck_eraseblocks(chip)) {
1881 ret = 1;
1882 }
1883 }
Stefan Tauner7bcacb12011-05-26 01:35:19 +00001884 }
Stefan Tauner7bcacb12011-05-26 01:35:19 +00001885
Stefan Tauner600576b2014-06-12 22:57:36 +00001886#if CONFIG_INTERNAL == 1
1887 ret |= selfcheck_board_enables();
1888#endif
1889
Stefan Tauner96658be2014-05-26 22:05:31 +00001890 /* TODO: implement similar sanity checks for other arrays where deemed necessary. */
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001891 return ret;
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001892}
1893
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001894/* FIXME: This function signature needs to be improved once doit() has a better
1895 * function signature.
1896 */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001897int chip_safety_check(const struct flashctx *flash, int force, int read_it, int write_it, int erase_it,
1898 int verify_it)
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001899{
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001900 const struct flashchip *chip = flash->chip;
1901
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001902 if (!programmer_may_write && (write_it || erase_it)) {
1903 msg_perr("Write/erase is not working yet on your programmer in "
1904 "its current configuration.\n");
1905 /* --force is the wrong approach, but it's the best we can do
1906 * until the generic programmer parameter parser is merged.
1907 */
1908 if (!force)
1909 return 1;
1910 msg_cerr("Continuing anyway.\n");
1911 }
1912
1913 if (read_it || erase_it || write_it || verify_it) {
1914 /* Everything needs read. */
Stefan Tauner6455dff2014-05-26 00:36:24 +00001915 if (chip->tested.read == BAD) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001916 msg_cerr("Read is not working on this chip. ");
1917 if (!force)
1918 return 1;
1919 msg_cerr("Continuing anyway.\n");
1920 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001921 if (!chip->read) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001922 msg_cerr("flashrom has no read function for this "
1923 "flash chip.\n");
1924 return 1;
1925 }
1926 }
1927 if (erase_it || write_it) {
1928 /* Write needs erase. */
Stefan Tauner6455dff2014-05-26 00:36:24 +00001929 if (chip->tested.erase == NA) {
1930 msg_cerr("Erase is not possible on this chip.\n");
1931 return 1;
1932 }
1933 if (chip->tested.erase == BAD) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001934 msg_cerr("Erase is not working on this chip. ");
1935 if (!force)
1936 return 1;
1937 msg_cerr("Continuing anyway.\n");
1938 }
Sylvain "ythier" Hitier9db45512011-07-04 07:27:17 +00001939 if(count_usable_erasers(flash) == 0) {
Stefan Tauner5368dca2011-07-01 00:19:12 +00001940 msg_cerr("flashrom has no erase function for this "
1941 "flash chip.\n");
1942 return 1;
1943 }
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001944 }
1945 if (write_it) {
Stefan Tauner6455dff2014-05-26 00:36:24 +00001946 if (chip->tested.write == NA) {
1947 msg_cerr("Write is not possible on this chip.\n");
1948 return 1;
1949 }
1950 if (chip->tested.write == BAD) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001951 msg_cerr("Write is not working on this chip. ");
1952 if (!force)
1953 return 1;
1954 msg_cerr("Continuing anyway.\n");
1955 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001956 if (!chip->write) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001957 msg_cerr("flashrom has no write function for this "
1958 "flash chip.\n");
1959 return 1;
1960 }
1961 }
1962 return 0;
1963}
1964
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001965/* This function signature is horrible. We need to design a better interface,
1966 * but right now it allows us to split off the CLI code.
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00001967 * Besides that, the function itself is a textbook example of abysmal code flow.
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001968 */
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +00001969int doit(struct flashctx *flash, int force, const char *filename, int read_it,
1970 int write_it, int erase_it, int verify_it)
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001971{
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001972 uint8_t *oldcontents;
1973 uint8_t *newcontents;
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001974 int ret = 0;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001975 unsigned long size = flash->chip->total_size * 1024;
Stefan Tauner73f5bda2014-10-19 07:53:45 +00001976 int read_all_first = 1; /* FIXME: Make this configurable. */
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001977
David Hendricks77f931a2011-05-18 01:30:56 +00001978 if (chip_safety_check(flash, force, read_it, write_it, erase_it, verify_it)) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001979 msg_cerr("Aborting.\n");
Stefan Tauner20da4aa2014-05-07 22:07:23 +00001980 return 1;
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001981 }
1982
Stefan Tauner8268fdb2013-09-23 14:21:06 +00001983 if (normalize_romentries(flash)) {
1984 msg_cerr("Requested regions can not be handled. Aborting.\n");
Stefan Tauner20da4aa2014-05-07 22:07:23 +00001985 return 1;
Stefan Tauner8268fdb2013-09-23 14:21:06 +00001986 }
1987
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001988 /* Given the existence of read locks, we want to unlock for read,
1989 * erase and write.
1990 */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001991 if (flash->chip->unlock)
1992 flash->chip->unlock(flash);
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001993
1994 if (read_it) {
Stefan Tauner20da4aa2014-05-07 22:07:23 +00001995 return read_flash_to_file(flash, filename);
Carl-Daniel Hailfingerd1be52d2010-07-03 12:14:25 +00001996 }
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001997
Stefan Tauner269de352011-07-12 22:35:21 +00001998 oldcontents = malloc(size);
1999 if (!oldcontents) {
2000 msg_gerr("Out of memory!\n");
2001 exit(1);
2002 }
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00002003 /* Assume worst case: All bits are 0. */
2004 memset(oldcontents, 0x00, size);
Stefan Tauner269de352011-07-12 22:35:21 +00002005 newcontents = malloc(size);
2006 if (!newcontents) {
2007 msg_gerr("Out of memory!\n");
2008 exit(1);
2009 }
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00002010 /* Assume best case: All bits should be 1. */
2011 memset(newcontents, 0xff, size);
2012 /* Side effect of the assumptions above: Default write action is erase
2013 * because newcontents looks like a completely erased chip, and
2014 * oldcontents being completely 0x00 means we have to erase everything
2015 * before we can write.
2016 */
2017
Ollie Lhoefa28582004-12-08 20:10:01 +00002018 if (erase_it) {
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00002019 /* FIXME: Do we really want the scary warning if erase failed?
2020 * After all, after erase the chip is either blank or partially
2021 * blank or it has the old contents. A blank chip won't boot,
2022 * so if the user wanted erase and reboots afterwards, the user
2023 * knows very well that booting won't work.
2024 */
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00002025 if (erase_and_write_flash(flash, oldcontents, newcontents)) {
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00002026 emergency_help_message();
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00002027 ret = 1;
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00002028 }
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00002029 goto out;
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00002030 }
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00002031
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00002032 if (write_it || verify_it) {
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00002033 if (read_buf_from_file(newcontents, size, filename)) {
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00002034 ret = 1;
2035 goto out;
Stefan Reinauer018aca82006-11-21 23:48:51 +00002036 }
2037
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +00002038#if CONFIG_INTERNAL == 1
Stefan Taunerb4e06bd2012-08-20 00:24:22 +00002039 if (programmer == PROGRAMMER_INTERNAL && cb_check_image(newcontents, size) < 0) {
2040 if (force_boardmismatch) {
2041 msg_pinfo("Proceeding anyway because user forced us to.\n");
2042 } else {
2043 msg_perr("Aborting. You can override this with "
2044 "-p internal:boardmismatch=force.\n");
Niklas Söderlund9e423762012-06-16 00:11:16 +00002045 ret = 1;
2046 goto out;
2047 }
Stefan Taunerb4e06bd2012-08-20 00:24:22 +00002048 }
Carl-Daniel Hailfinger66ef4e52009-12-13 22:28:00 +00002049#endif
Ollie Lhocbbf1252004-03-17 22:22:08 +00002050 }
2051
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00002052 /* Read the whole chip to be able to check whether regions need to be
2053 * erased and to give better diagnostics in case write fails.
Stefan Tauner73f5bda2014-10-19 07:53:45 +00002054 * The alternative is to read only the regions which are to be
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00002055 * preserved, but in that case we might perform unneeded erase which
2056 * takes time as well.
2057 */
Stefan Tauner73f5bda2014-10-19 07:53:45 +00002058 if (read_all_first) {
2059 msg_cinfo("Reading old flash chip contents... ");
2060 if (flash->chip->read(flash, oldcontents, 0, size)) {
2061 ret = 1;
2062 msg_cinfo("FAILED.\n");
2063 goto out;
2064 }
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00002065 }
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00002066 msg_cinfo("done.\n");
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00002067
Stefan Tauner8268fdb2013-09-23 14:21:06 +00002068 /* Build a new image taking the given layout into account. */
Stefan Tauner73f5bda2014-10-19 07:53:45 +00002069 if (build_new_image(flash, read_all_first, oldcontents, newcontents)) {
2070 msg_gerr("Could not prepare the data to be written, aborting.\n");
2071 ret = 1;
2072 goto out;
2073 }
Uwe Hermanna7e05482007-05-09 10:17:44 +00002074
Ollie Lho184a4042005-11-26 21:55:36 +00002075 // ////////////////////////////////////////////////////////////
Uwe Hermanna7e05482007-05-09 10:17:44 +00002076
Stefan Tauner73f5bda2014-10-19 07:53:45 +00002077 if (write_it && erase_and_write_flash(flash, oldcontents, newcontents)) {
Stefan Tauner5c316f92015-02-08 21:57:52 +00002078 msg_cerr("Uh oh. Erase/write failed. ");
Stefan Tauner73f5bda2014-10-19 07:53:45 +00002079 if (read_all_first) {
2080 msg_cerr("Checking if anything has changed.\n");
Stefan Taunera58f6e92014-05-10 09:25:44 +00002081 msg_cinfo("Reading current flash chip contents... ");
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00002082 if (!flash->chip->read(flash, newcontents, 0, size)) {
Stefan Taunera58f6e92014-05-10 09:25:44 +00002083 msg_cinfo("done.\n");
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00002084 if (!memcmp(oldcontents, newcontents, size)) {
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00002085 nonfatal_help_message();
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00002086 ret = 1;
2087 goto out;
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00002088 }
Stefan Taunera58f6e92014-05-10 09:25:44 +00002089 msg_cerr("Apparently at least some data has changed.\n");
2090 } else
2091 msg_cerr("Can't even read anymore!\n");
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00002092 emergency_help_message();
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00002093 ret = 1;
2094 goto out;
Stefan Tauner73f5bda2014-10-19 07:53:45 +00002095 } else
2096 msg_cerr("\n");
2097 emergency_help_message();
2098 ret = 1;
2099 goto out;
Peter Stugef31104c2008-04-28 14:47:30 +00002100 }
Ollie Lho184a4042005-11-26 21:55:36 +00002101
Stefan Taunerc4f44df2013-08-12 22:58:43 +00002102 /* Verify only if we either did not try to write (verify operation) or actually changed something. */
2103 if (verify_it && (!write_it || !all_skipped)) {
Stefan Tauner78ffbea2012-10-27 15:36:56 +00002104 msg_cinfo("Verifying flash... ");
2105
2106 if (write_it) {
2107 /* Work around chips which need some time to calm down. */
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00002108 programmer_delay(1000*1000);
Stefan Tauner78ffbea2012-10-27 15:36:56 +00002109 ret = verify_range(flash, newcontents, 0, size);
2110 /* If we tried to write, and verification now fails, we
2111 * might have an emergency situation.
2112 */
2113 if (ret)
2114 emergency_help_message();
2115 } else {
2116 ret = compare_range(newcontents, oldcontents, 0, size);
2117 }
2118 if (!ret)
2119 msg_cinfo("VERIFIED.\n");
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00002120 }
Ollie Lho184a4042005-11-26 21:55:36 +00002121
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00002122out:
2123 free(oldcontents);
2124 free(newcontents);
Stefan Reinauer143da0b2006-01-04 16:42:57 +00002125 return ret;
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00002126}