blob: c9c7e311397f90a732c03df540f984de782e2404 [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>
Ronald G. Minnicheaab50b2003-09-12 22:41:53 +000031#include <stdlib.h>
Stefan Tauner363fd7e2013-04-07 13:08:30 +000032#include <errno.h>
Carl-Daniel Hailfingerc2441382010-11-09 22:00:31 +000033#include <ctype.h>
Ollie Lho184a4042005-11-26 21:55:36 +000034#include <getopt.h>
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +000035#if HAVE_UTSNAME == 1
36#include <sys/utsname.h>
37#endif
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +000038#include "flash.h"
Carl-Daniel Hailfinger08454642009-06-15 14:14:48 +000039#include "flashchips.h"
Carl-Daniel Hailfinger5b997c32010-07-27 22:41:39 +000040#include "programmer.h"
Carl-Daniel Hailfinger06b9efa2012-08-07 11:59:59 +000041#include "hwaccess.h"
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +000042
Mathias Krausea60faab2011-01-17 07:50:42 +000043const char flashrom_version[] = FLASHROM_VERSION;
Nico Huberbcb2e5a2012-12-30 01:23:17 +000044const char *chip_to_probe = NULL;
Carl-Daniel Hailfinger66ef4e52009-12-13 22:28:00 +000045
Carl-Daniel Hailfinger2e681602011-09-08 00:00:29 +000046static enum programmer programmer = PROGRAMMER_INVALID;
Nico Huberbcb2e5a2012-12-30 01:23:17 +000047static const char *programmer_param = NULL;
Stefan Reinauer70385642007-04-06 11:58:03 +000048
Uwe Hermann48ec1b12010-08-08 17:01:18 +000049/*
Carl-Daniel Hailfinger66ef4e52009-12-13 22:28:00 +000050 * Programmers supporting multiple buses can have differing size limits on
51 * each bus. Store the limits for each bus in a common struct.
52 */
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +000053struct decode_sizes max_rom_decode;
54
55/* If nonzero, used as the start address of bottom-aligned flash. */
56unsigned long flashbase;
Carl-Daniel Hailfinger66ef4e52009-12-13 22:28:00 +000057
Carl-Daniel Hailfingerd1be52d2010-07-03 12:14:25 +000058/* Is writing allowed with this programmer? */
59int programmer_may_write;
60
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +000061const struct programmer_entry programmer_table[] = {
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +000062#if CONFIG_INTERNAL == 1
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +000063 {
Carl-Daniel Hailfinger37fc4692009-08-12 14:34:35 +000064 .name = "internal",
Stefan Tauneraf358d62012-12-27 18:40:26 +000065 .type = OTHER,
66 .devs.note = NULL,
Carl-Daniel Hailfinger1e334e62009-05-11 15:46:43 +000067 .init = internal_init,
Carl-Daniel Hailfinger1455b2b2009-05-11 14:13:25 +000068 .map_flash_region = physmap,
69 .unmap_flash_region = physunmap,
Carl-Daniel Hailfingerca8bfc62009-06-05 17:48:08 +000070 .delay = internal_delay,
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +000071 },
Carl-Daniel Hailfinger66ef4e52009-12-13 22:28:00 +000072#endif
Luc Verhaegen8e3a6002007-04-04 22:45:58 +000073
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +000074#if CONFIG_DUMMY == 1
Carl-Daniel Hailfingerc3129202009-05-09 00:54:55 +000075 {
Carl-Daniel Hailfinger37fc4692009-08-12 14:34:35 +000076 .name = "dummy",
Stefan Tauneraf358d62012-12-27 18:40:26 +000077 .type = OTHER,
78 /* FIXME */
79 .devs.note = "Dummy device, does nothing and logs all accesses\n",
Carl-Daniel Hailfinger1e334e62009-05-11 15:46:43 +000080 .init = dummy_init,
Carl-Daniel Hailfinger1455b2b2009-05-11 14:13:25 +000081 .map_flash_region = dummy_map,
82 .unmap_flash_region = dummy_unmap,
Carl-Daniel Hailfingerca8bfc62009-06-05 17:48:08 +000083 .delay = internal_delay,
Carl-Daniel Hailfingerc3129202009-05-09 00:54:55 +000084 },
Carl-Daniel Hailfinger4740c6f2009-09-16 10:09:21 +000085#endif
Carl-Daniel Hailfingerc3129202009-05-09 00:54:55 +000086
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +000087#if CONFIG_NIC3COM == 1
Uwe Hermannb4dcb712009-05-13 11:36:06 +000088 {
Carl-Daniel Hailfinger37fc4692009-08-12 14:34:35 +000089 .name = "nic3com",
Stefan Tauneraf358d62012-12-27 18:40:26 +000090 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +000091 .devs.dev = nics_3com,
Uwe Hermannb4dcb712009-05-13 11:36:06 +000092 .init = nic3com_init,
Uwe Hermannc6915932009-05-17 23:12:17 +000093 .map_flash_region = fallback_map,
94 .unmap_flash_region = fallback_unmap,
Carl-Daniel Hailfingerca8bfc62009-06-05 17:48:08 +000095 .delay = internal_delay,
Uwe Hermannb4dcb712009-05-13 11:36:06 +000096 },
Carl-Daniel Hailfinger4740c6f2009-09-16 10:09:21 +000097#endif
Uwe Hermannb4dcb712009-05-13 11:36:06 +000098
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +000099#if CONFIG_NICREALTEK == 1
Joerg Fischer5665ef32010-05-21 21:54:07 +0000100 {
Carl-Daniel Hailfinger40446ee2011-03-07 01:08:09 +0000101 /* This programmer works for Realtek RTL8139 and SMC 1211. */
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000102 .name = "nicrealtek",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000103 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000104 .devs.dev = nics_realtek,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000105 .init = nicrealtek_init,
106 .map_flash_region = fallback_map,
107 .unmap_flash_region = fallback_unmap,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000108 .delay = internal_delay,
Joerg Fischer5665ef32010-05-21 21:54:07 +0000109 },
Joerg Fischer5665ef32010-05-21 21:54:07 +0000110#endif
111
Andrew Morganc29c2e72010-06-07 22:37:54 +0000112#if CONFIG_NICNATSEMI == 1
113 {
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000114 .name = "nicnatsemi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000115 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000116 .devs.dev = nics_natsemi,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000117 .init = nicnatsemi_init,
118 .map_flash_region = fallback_map,
119 .unmap_flash_region = fallback_unmap,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000120 .delay = internal_delay,
Andrew Morganc29c2e72010-06-07 22:37:54 +0000121 },
122#endif
Joerg Fischer5665ef32010-05-21 21:54:07 +0000123
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000124#if CONFIG_GFXNVIDIA == 1
Uwe Hermann2bc98f62009-09-30 18:29:55 +0000125 {
126 .name = "gfxnvidia",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000127 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000128 .devs.dev = gfx_nvidia,
Uwe Hermann2bc98f62009-09-30 18:29:55 +0000129 .init = gfxnvidia_init,
Uwe Hermann2bc98f62009-09-30 18:29:55 +0000130 .map_flash_region = fallback_map,
131 .unmap_flash_region = fallback_unmap,
Uwe Hermann2bc98f62009-09-30 18:29:55 +0000132 .delay = internal_delay,
133 },
134#endif
135
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000136#if CONFIG_DRKAISER == 1
Rudolf Marek68720c72009-05-17 19:39:27 +0000137 {
TURBO Jb0912c02009-09-02 23:00:46 +0000138 .name = "drkaiser",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000139 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000140 .devs.dev = drkaiser_pcidev,
TURBO Jb0912c02009-09-02 23:00:46 +0000141 .init = drkaiser_init,
TURBO Jb0912c02009-09-02 23:00:46 +0000142 .map_flash_region = fallback_map,
143 .unmap_flash_region = fallback_unmap,
TURBO Jb0912c02009-09-02 23:00:46 +0000144 .delay = internal_delay,
145 },
Carl-Daniel Hailfinger4740c6f2009-09-16 10:09:21 +0000146#endif
TURBO Jb0912c02009-09-02 23:00:46 +0000147
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000148#if CONFIG_SATASII == 1
TURBO Jb0912c02009-09-02 23:00:46 +0000149 {
Carl-Daniel Hailfinger37fc4692009-08-12 14:34:35 +0000150 .name = "satasii",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000151 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000152 .devs.dev = satas_sii,
Rudolf Marek68720c72009-05-17 19:39:27 +0000153 .init = satasii_init,
Uwe Hermannc6915932009-05-17 23:12:17 +0000154 .map_flash_region = fallback_map,
155 .unmap_flash_region = fallback_unmap,
Carl-Daniel Hailfingerca8bfc62009-06-05 17:48:08 +0000156 .delay = internal_delay,
Rudolf Marek68720c72009-05-17 19:39:27 +0000157 },
Carl-Daniel Hailfinger4740c6f2009-09-16 10:09:21 +0000158#endif
Rudolf Marek68720c72009-05-17 19:39:27 +0000159
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000160#if CONFIG_ATAHPT == 1
Uwe Hermannddd5c9e2010-02-21 21:17:00 +0000161 {
162 .name = "atahpt",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000163 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000164 .devs.dev = ata_hpt,
Uwe Hermannddd5c9e2010-02-21 21:17:00 +0000165 .init = atahpt_init,
Uwe Hermannddd5c9e2010-02-21 21:17:00 +0000166 .map_flash_region = fallback_map,
167 .unmap_flash_region = fallback_unmap,
Uwe Hermannddd5c9e2010-02-21 21:17:00 +0000168 .delay = internal_delay,
169 },
170#endif
171
Jonathan Kollasch7f0f3fa2014-06-01 10:26:23 +0000172#if CONFIG_ATAVIA == 1
173 {
174 .name = "atavia",
175 .type = PCI,
176 .devs.dev = ata_via,
177 .init = atavia_init,
178 .map_flash_region = atavia_map,
179 .unmap_flash_region = fallback_unmap,
180 .delay = internal_delay,
181 },
182#endif
183
Kyösti Mälkki72d42f82014-06-01 23:48:31 +0000184#if CONFIG_IT8212 == 1
185 {
186 .name = "it8212",
187 .type = PCI,
188 .devs.dev = devs_it8212,
189 .init = it8212_init,
190 .map_flash_region = fallback_map,
191 .unmap_flash_region = fallback_unmap,
192 .delay = internal_delay,
193 },
194#endif
195
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000196#if CONFIG_FT2232_SPI == 1
Paul Fox05dfbe62009-06-16 21:08:06 +0000197 {
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000198 .name = "ft2232_spi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000199 .type = USB,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000200 .devs.dev = devs_ft2232spi,
Paul Fox05dfbe62009-06-16 21:08:06 +0000201 .init = ft2232_spi_init,
Carl-Daniel Hailfinger415e5132009-08-12 11:39:29 +0000202 .map_flash_region = fallback_map,
203 .unmap_flash_region = fallback_unmap,
Paul Fox05dfbe62009-06-16 21:08:06 +0000204 .delay = internal_delay,
205 },
Carl-Daniel Hailfinger3426ef62009-08-19 13:27:58 +0000206#endif
Carl-Daniel Hailfinger415e5132009-08-12 11:39:29 +0000207
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000208#if CONFIG_SERPROG == 1
Urja Rannikko22915352009-06-23 11:33:43 +0000209 {
Carl-Daniel Hailfinger37fc4692009-08-12 14:34:35 +0000210 .name = "serprog",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000211 .type = OTHER,
212 /* FIXME */
213 .devs.note = "All programmer devices speaking the serprog protocol\n",
Urja Rannikko22915352009-06-23 11:33:43 +0000214 .init = serprog_init,
Urja Rannikko0b4ffd52015-06-29 23:24:23 +0000215 .map_flash_region = serprog_map,
Urja Rannikko22915352009-06-23 11:33:43 +0000216 .unmap_flash_region = fallback_unmap,
Urja Rannikko22915352009-06-23 11:33:43 +0000217 .delay = serprog_delay,
218 },
Carl-Daniel Hailfinger6be74112009-08-12 16:17:41 +0000219#endif
Paul Fox05dfbe62009-06-16 21:08:06 +0000220
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000221#if CONFIG_BUSPIRATE_SPI == 1
Carl-Daniel Hailfinger5cca01f2009-11-24 00:20:03 +0000222 {
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000223 .name = "buspirate_spi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000224 .type = OTHER,
225 /* FIXME */
226 .devs.note = "Dangerous Prototypes Bus Pirate\n",
Carl-Daniel Hailfinger5cca01f2009-11-24 00:20:03 +0000227 .init = buspirate_spi_init,
Carl-Daniel Hailfinger5cca01f2009-11-24 00:20:03 +0000228 .map_flash_region = fallback_map,
229 .unmap_flash_region = fallback_unmap,
Carl-Daniel Hailfinger5cca01f2009-11-24 00:20:03 +0000230 .delay = internal_delay,
231 },
232#endif
233
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000234#if CONFIG_DEDIPROG == 1
Carl-Daniel Hailfingerd38fac82010-01-19 11:15:48 +0000235 {
236 .name = "dediprog",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000237 .type = OTHER,
238 /* FIXME */
239 .devs.note = "Dediprog SF100\n",
Carl-Daniel Hailfingerd38fac82010-01-19 11:15:48 +0000240 .init = dediprog_init,
Carl-Daniel Hailfingerd38fac82010-01-19 11:15:48 +0000241 .map_flash_region = fallback_map,
242 .unmap_flash_region = fallback_unmap,
Carl-Daniel Hailfingerd38fac82010-01-19 11:15:48 +0000243 .delay = internal_delay,
244 },
245#endif
246
Carl-Daniel Hailfingere7fdd6e2010-07-21 10:26:01 +0000247#if CONFIG_RAYER_SPI == 1
248 {
249 .name = "rayer_spi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000250 .type = OTHER,
251 /* FIXME */
252 .devs.note = "RayeR parallel port programmer\n",
Carl-Daniel Hailfingere7fdd6e2010-07-21 10:26:01 +0000253 .init = rayer_spi_init,
Carl-Daniel Hailfingere7fdd6e2010-07-21 10:26:01 +0000254 .map_flash_region = fallback_map,
255 .unmap_flash_region = fallback_unmap,
Carl-Daniel Hailfingere7fdd6e2010-07-21 10:26:01 +0000256 .delay = internal_delay,
257 },
258#endif
259
Virgil-Adrian Teacada7c5452012-04-30 23:11:06 +0000260#if CONFIG_PONY_SPI == 1
261 {
262 .name = "pony_spi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000263 .type = OTHER,
264 /* FIXME */
265 .devs.note = "Programmers compatible with SI-Prog, serbang or AJAWe\n",
Virgil-Adrian Teacada7c5452012-04-30 23:11:06 +0000266 .init = pony_spi_init,
267 .map_flash_region = fallback_map,
268 .unmap_flash_region = fallback_unmap,
269 .delay = internal_delay,
Stefan Tauneraf358d62012-12-27 18:40:26 +0000270 },
Virgil-Adrian Teacada7c5452012-04-30 23:11:06 +0000271#endif
272
Carl-Daniel Hailfingerb713d2e2011-05-08 00:24:18 +0000273#if CONFIG_NICINTEL == 1
274 {
275 .name = "nicintel",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000276 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000277 .devs.dev = nics_intel,
Carl-Daniel Hailfingerb713d2e2011-05-08 00:24:18 +0000278 .init = nicintel_init,
Carl-Daniel Hailfingerb713d2e2011-05-08 00:24:18 +0000279 .map_flash_region = fallback_map,
280 .unmap_flash_region = fallback_unmap,
Carl-Daniel Hailfingerb713d2e2011-05-08 00:24:18 +0000281 .delay = internal_delay,
282 },
283#endif
284
Idwer Vollering004f4b72010-09-03 18:21:21 +0000285#if CONFIG_NICINTEL_SPI == 1
286 {
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000287 .name = "nicintel_spi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000288 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000289 .devs.dev = nics_intel_spi,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000290 .init = nicintel_spi_init,
291 .map_flash_region = fallback_map,
292 .unmap_flash_region = fallback_unmap,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000293 .delay = internal_delay,
Idwer Vollering004f4b72010-09-03 18:21:21 +0000294 },
295#endif
296
Ricardo Ribalda Delgado2a41f0a2014-07-28 20:35:21 +0000297#if CONFIG_NICINTEL_EEPROM == 1
298 {
299 .name = "nicintel_eeprom",
300 .type = PCI,
301 .devs.dev = nics_intel_ee,
302 .init = nicintel_ee_init,
303 .map_flash_region = fallback_map,
304 .unmap_flash_region = fallback_unmap,
305 .delay = internal_delay,
306 },
307#endif
308
Mark Marshall90021f22010-12-03 14:48:11 +0000309#if CONFIG_OGP_SPI == 1
310 {
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000311 .name = "ogp_spi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000312 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000313 .devs.dev = ogp_spi,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000314 .init = ogp_spi_init,
315 .map_flash_region = fallback_map,
316 .unmap_flash_region = fallback_unmap,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000317 .delay = internal_delay,
Mark Marshall90021f22010-12-03 14:48:11 +0000318 },
319#endif
320
Carl-Daniel Hailfinger9a1105c2011-02-04 21:37:59 +0000321#if CONFIG_SATAMV == 1
322 {
323 .name = "satamv",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000324 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000325 .devs.dev = satas_mv,
Carl-Daniel Hailfinger9a1105c2011-02-04 21:37:59 +0000326 .init = satamv_init,
Carl-Daniel Hailfinger9a1105c2011-02-04 21:37:59 +0000327 .map_flash_region = fallback_map,
328 .unmap_flash_region = fallback_unmap,
Carl-Daniel Hailfinger9a1105c2011-02-04 21:37:59 +0000329 .delay = internal_delay,
330 },
331#endif
332
Sven Schnelle5ce5f702011-09-03 18:37:52 +0000333#if CONFIG_LINUX_SPI == 1
334 {
335 .name = "linux_spi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000336 .type = OTHER,
337 .devs.note = "Device files /dev/spidev*.*\n",
Sven Schnelle5ce5f702011-09-03 18:37:52 +0000338 .init = linux_spi_init,
339 .map_flash_region = fallback_map,
340 .unmap_flash_region = fallback_unmap,
Sven Schnelle5ce5f702011-09-03 18:37:52 +0000341 .delay = internal_delay,
342 },
343#endif
344
James Lairdc60de0e2013-03-27 13:00:23 +0000345#if CONFIG_USBBLASTER_SPI == 1
346 {
347 .name = "usbblaster_spi",
348 .type = USB,
349 .devs.dev = devs_usbblasterspi,
350 .init = usbblaster_spi_init,
351 .map_flash_region = fallback_map,
352 .unmap_flash_region = fallback_unmap,
353 .delay = internal_delay,
354 },
355#endif
356
Alexandre Boeglin80e64712014-12-20 20:25:19 +0000357#if CONFIG_MSTARDDC_SPI == 1
358 {
359 .name = "mstarddc_spi",
360 .type = OTHER,
361 .devs.note = "MSTAR DDC devices addressable via /dev/i2c-* on Linux.\n",
362 .init = mstarddc_spi_init,
363 .map_flash_region = fallback_map,
364 .unmap_flash_region = fallback_unmap,
365 .delay = internal_delay,
366 },
367#endif
368
Justin Chevrier66e554b2015-02-08 21:58:10 +0000369#if CONFIG_PICKIT2_SPI == 1
370 {
371 .name = "pickit2_spi",
372 .type = OTHER,
373 /* FIXME */
374 .devs.note = "Microchip PICkit2\n",
375 .init = pickit2_spi_init,
376 .map_flash_region = fallback_map,
377 .unmap_flash_region = fallback_unmap,
378 .delay = internal_delay,
379 },
380#endif
381
Carl-Daniel Hailfinger1c6d2ff2012-08-27 00:44:42 +0000382 {0}, /* This entry corresponds to PROGRAMMER_INVALID. */
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +0000383};
Luc Verhaegen8e3a6002007-04-04 22:45:58 +0000384
Carl-Daniel Hailfinger2bee8cf2010-11-10 15:25:18 +0000385#define SHUTDOWN_MAXFN 32
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000386static int shutdown_fn_count = 0;
387struct shutdown_func_data {
David Hendricks8bb20212011-06-14 01:35:36 +0000388 int (*func) (void *data);
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000389 void *data;
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000390} static shutdown_fn[SHUTDOWN_MAXFN];
391/* Initialize to 0 to make sure nobody registers a shutdown function before
392 * programmer init.
393 */
394static int may_register_shutdown = 0;
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000395
Stefan Taunerc4f44df2013-08-12 22:58:43 +0000396/* Did we change something or was every erase/write skipped (if any)? */
397static bool all_skipped = true;
398
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +0000399static int check_block_eraser(const struct flashctx *flash, int k, int log);
Stefan Tauner5368dca2011-07-01 00:19:12 +0000400
Stefan Tauner2a1ed772014-08-31 00:09:21 +0000401int shutdown_free(void *data)
402{
403 free(data);
404 return 0;
405}
406
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000407/* Register a function to be executed on programmer shutdown.
408 * The advantage over atexit() is that you can supply a void pointer which will
409 * be used as parameter to the registered function upon programmer shutdown.
410 * This pointer can point to arbitrary data used by said function, e.g. undo
411 * information for GPIO settings etc. If unneeded, set data=NULL.
412 * Please note that the first (void *data) belongs to the function signature of
413 * the function passed as first parameter.
414 */
David Hendricks8bb20212011-06-14 01:35:36 +0000415int register_shutdown(int (*function) (void *data), void *data)
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000416{
417 if (shutdown_fn_count >= SHUTDOWN_MAXFN) {
Carl-Daniel Hailfinger9f5f2152010-06-04 23:20:21 +0000418 msg_perr("Tried to register more than %i shutdown functions.\n",
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000419 SHUTDOWN_MAXFN);
420 return 1;
421 }
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000422 if (!may_register_shutdown) {
423 msg_perr("Tried to register a shutdown function before "
424 "programmer init.\n");
425 return 1;
426 }
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000427 shutdown_fn[shutdown_fn_count].func = function;
428 shutdown_fn[shutdown_fn_count].data = data;
429 shutdown_fn_count++;
430
431 return 0;
432}
433
Nico Huberbcb2e5a2012-12-30 01:23:17 +0000434int programmer_init(enum programmer prog, const char *param)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000435{
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000436 int ret;
Carl-Daniel Hailfinger2e681602011-09-08 00:00:29 +0000437
438 if (prog >= PROGRAMMER_INVALID) {
439 msg_perr("Invalid programmer specified!\n");
440 return -1;
441 }
442 programmer = prog;
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000443 /* Initialize all programmer specific data. */
444 /* Default to unlimited decode sizes. */
445 max_rom_decode = (const struct decode_sizes) {
446 .parallel = 0xffffffff,
447 .lpc = 0xffffffff,
448 .fwh = 0xffffffff,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000449 .spi = 0xffffffff,
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000450 };
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000451 /* Default to top aligned flash at 4 GB. */
452 flashbase = 0;
453 /* Registering shutdown functions is now allowed. */
454 may_register_shutdown = 1;
Carl-Daniel Hailfingerd1be52d2010-07-03 12:14:25 +0000455 /* Default to allowing writes. Broken programmers set this to 0. */
456 programmer_may_write = 1;
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000457
458 programmer_param = param;
Carl-Daniel Hailfinger20a36ba2013-08-13 07:09:57 +0000459 msg_pdbg("Initializing %s programmer\n", programmer_table[programmer].name);
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000460 ret = programmer_table[programmer].init();
461 if (programmer_param && strlen(programmer_param)) {
Carl-Daniel Hailfinger20a36ba2013-08-13 07:09:57 +0000462 if (ret != 0) {
463 /* It is quite possible that any unhandled programmer parameter would have been valid,
464 * but an error in actual programmer init happened before the parameter was evaluated.
465 */
466 msg_pwarn("Unhandled programmer parameters (possibly due to another failure): %s\n",
467 programmer_param);
468 } else {
469 /* Actual programmer init was successful, but the user specified an invalid or unusable
470 * (for the current programmer configuration) parameter.
471 */
472 msg_perr("Unhandled programmer parameters: %s\n", programmer_param);
473 msg_perr("Aborting.\n");
474 ret = ERROR_FATAL;
475 }
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000476 }
477 return ret;
Uwe Hermann09e04f72009-05-16 22:36:00 +0000478}
479
Stefan Tauner20da4aa2014-05-07 22:07:23 +0000480/** Calls registered shutdown functions and resets internal programmer-related variables.
481 * Calling it is safe even without previous initialization, but further interactions with programmer support
482 * require a call to programmer_init() (afterwards).
483 *
484 * @return The OR-ed result values of all shutdown functions (i.e. 0 on success). */
Uwe Hermann09e04f72009-05-16 22:36:00 +0000485int programmer_shutdown(void)
486{
David Hendricks8bb20212011-06-14 01:35:36 +0000487 int ret = 0;
488
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000489 /* Registering shutdown functions is no longer allowed. */
490 may_register_shutdown = 0;
491 while (shutdown_fn_count > 0) {
492 int i = --shutdown_fn_count;
David Hendricks8bb20212011-06-14 01:35:36 +0000493 ret |= shutdown_fn[i].func(shutdown_fn[i].data);
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000494 }
Stefan Taunere34e3e82013-01-01 00:06:51 +0000495
Stefan Taunerb8911d62012-12-26 07:55:00 +0000496 programmer_param = NULL;
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000497 registered_master_count = 0;
Stefan Taunere34e3e82013-01-01 00:06:51 +0000498
David Hendricks8bb20212011-06-14 01:35:36 +0000499 return ret;
Uwe Hermann09e04f72009-05-16 22:36:00 +0000500}
501
Stefan Tauner305e0b92013-07-17 23:46:44 +0000502void *programmer_map_flash_region(const char *descr, uintptr_t phys_addr, size_t len)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000503{
Stefan Tauner26e7a152013-09-13 17:21:05 +0000504 void *ret = programmer_table[programmer].map_flash_region(descr, phys_addr, len);
505 msg_gspew("%s: mapping %s from 0x%0*" PRIxPTR " to 0x%0*" PRIxPTR "\n",
506 __func__, descr, PRIxPTR_WIDTH, phys_addr, PRIxPTR_WIDTH, (uintptr_t) ret);
507 return ret;
Uwe Hermann09e04f72009-05-16 22:36:00 +0000508}
509
510void programmer_unmap_flash_region(void *virt_addr, size_t len)
511{
512 programmer_table[programmer].unmap_flash_region(virt_addr, len);
Stefan Tauner4e32ec12014-08-30 23:39:51 +0000513 msg_gspew("%s: unmapped 0x%0*" PRIxPTR "\n", __func__, PRIxPTR_WIDTH, (uintptr_t)virt_addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000514}
515
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000516void chip_writeb(const struct flashctx *flash, uint8_t val, chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000517{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000518 flash->mst->par.chip_writeb(flash, val, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000519}
520
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000521void chip_writew(const struct flashctx *flash, uint16_t val, chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000522{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000523 flash->mst->par.chip_writew(flash, val, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000524}
525
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000526void chip_writel(const struct flashctx *flash, uint32_t val, chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000527{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000528 flash->mst->par.chip_writel(flash, val, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000529}
530
Mark Marshallf20b7be2014-05-09 21:16:21 +0000531void chip_writen(const struct flashctx *flash, const uint8_t *buf, chipaddr addr, size_t len)
Carl-Daniel Hailfinger0bd2a2b2009-06-05 18:32:07 +0000532{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000533 flash->mst->par.chip_writen(flash, buf, addr, len);
Carl-Daniel Hailfinger0bd2a2b2009-06-05 18:32:07 +0000534}
535
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000536uint8_t chip_readb(const struct flashctx *flash, const chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000537{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000538 return flash->mst->par.chip_readb(flash, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000539}
540
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000541uint16_t chip_readw(const struct flashctx *flash, const chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000542{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000543 return flash->mst->par.chip_readw(flash, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000544}
545
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000546uint32_t chip_readl(const struct flashctx *flash, const chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000547{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000548 return flash->mst->par.chip_readl(flash, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000549}
550
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000551void chip_readn(const struct flashctx *flash, uint8_t *buf, chipaddr addr,
552 size_t len)
Carl-Daniel Hailfinger0bd2a2b2009-06-05 18:32:07 +0000553{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000554 flash->mst->par.chip_readn(flash, buf, addr, len);
Carl-Daniel Hailfinger0bd2a2b2009-06-05 18:32:07 +0000555}
556
Stefan Taunerf80419c2014-05-02 15:41:42 +0000557void programmer_delay(unsigned int usecs)
Carl-Daniel Hailfingerca8bfc62009-06-05 17:48:08 +0000558{
Urja Rannikko8d7ec2a2013-10-21 21:49:08 +0000559 if (usecs > 0)
560 programmer_table[programmer].delay(usecs);
Carl-Daniel Hailfingerca8bfc62009-06-05 17:48:08 +0000561}
562
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000563int read_memmapped(struct flashctx *flash, uint8_t *buf, unsigned int start,
564 int unsigned len)
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000565{
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000566 chip_readn(flash, buf, flash->virtual_memory + start, len);
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000567
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000568 return 0;
569}
570
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000571/* This is a somewhat hacked function similar in some ways to strtok().
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000572 * It will look for needle with a subsequent '=' in haystack, return a copy of
573 * needle and remove everything from the first occurrence of needle to the next
574 * delimiter from haystack.
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000575 */
Nico Huberbcb2e5a2012-12-30 01:23:17 +0000576char *extract_param(const char *const *haystack, const char *needle, const char *delim)
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000577{
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000578 char *param_pos, *opt_pos, *rest;
579 char *opt = NULL;
580 int optlen;
Carl-Daniel Hailfinger27023762010-04-28 15:22:14 +0000581 int needlelen;
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000582
Carl-Daniel Hailfinger27023762010-04-28 15:22:14 +0000583 needlelen = strlen(needle);
584 if (!needlelen) {
585 msg_gerr("%s: empty needle! Please report a bug at "
586 "flashrom@flashrom.org\n", __func__);
587 return NULL;
588 }
589 /* No programmer parameters given. */
590 if (*haystack == NULL)
591 return NULL;
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000592 param_pos = strstr(*haystack, needle);
593 do {
594 if (!param_pos)
595 return NULL;
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000596 /* Needle followed by '='? */
597 if (param_pos[needlelen] == '=') {
598
599 /* Beginning of the string? */
600 if (param_pos == *haystack)
601 break;
602 /* After a delimiter? */
603 if (strchr(delim, *(param_pos - 1)))
604 break;
605 }
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000606 /* Continue searching. */
607 param_pos++;
608 param_pos = strstr(param_pos, needle);
609 } while (1);
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000610
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000611 if (param_pos) {
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000612 /* Get the string after needle and '='. */
613 opt_pos = param_pos + needlelen + 1;
614 optlen = strcspn(opt_pos, delim);
615 /* Return an empty string if the parameter was empty. */
616 opt = malloc(optlen + 1);
617 if (!opt) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000618 msg_gerr("Out of memory!\n");
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000619 exit(1);
620 }
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000621 strncpy(opt, opt_pos, optlen);
622 opt[optlen] = '\0';
623 rest = opt_pos + optlen;
624 /* Skip all delimiters after the current parameter. */
625 rest += strspn(rest, delim);
626 memmove(param_pos, rest, strlen(rest) + 1);
627 /* We could shrink haystack, but the effort is not worth it. */
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000628 }
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000629
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000630 return opt;
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000631}
632
Stefan Tauner66652442011-06-26 17:38:17 +0000633char *extract_programmer_param(const char *param_name)
Carl-Daniel Hailfinger2b6dcb32010-07-08 10:13:37 +0000634{
635 return extract_param(&programmer_param, param_name, ",");
636}
637
Sylvain "ythier" Hitier9db45512011-07-04 07:27:17 +0000638/* Returns the number of well-defined erasers for a chip. */
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +0000639static unsigned int count_usable_erasers(const struct flashctx *flash)
Stefan Tauner5368dca2011-07-01 00:19:12 +0000640{
641 unsigned int usable_erasefunctions = 0;
642 int k;
643 for (k = 0; k < NUM_ERASEFUNCTIONS; k++) {
644 if (!check_block_eraser(flash, k, 0))
645 usable_erasefunctions++;
646 }
647 return usable_erasefunctions;
648}
649
Mark Marshallf20b7be2014-05-09 21:16:21 +0000650static int compare_range(const uint8_t *wantbuf, const uint8_t *havebuf, unsigned int start, unsigned int len)
Stefan Tauner78ffbea2012-10-27 15:36:56 +0000651{
652 int ret = 0, failcount = 0;
653 unsigned int i;
654 for (i = 0; i < len; i++) {
655 if (wantbuf[i] != havebuf[i]) {
656 /* Only print the first failure. */
657 if (!failcount++)
658 msg_cerr("FAILED at 0x%08x! Expected=0x%02x, Found=0x%02x,",
659 start + i, wantbuf[i], havebuf[i]);
660 }
661 }
662 if (failcount) {
663 msg_cerr(" failed byte count from 0x%08x-0x%08x: 0x%x\n",
664 start, start + len - 1, failcount);
665 ret = -1;
666 }
667 return ret;
668}
669
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000670/* start is an offset to the base address of the flash chip */
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000671int check_erased_range(struct flashctx *flash, unsigned int start,
672 unsigned int len)
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000673{
674 int ret;
675 uint8_t *cmpbuf = malloc(len);
676
677 if (!cmpbuf) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000678 msg_gerr("Could not allocate memory!\n");
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000679 exit(1);
680 }
681 memset(cmpbuf, 0xff, len);
Stefan Tauner78ffbea2012-10-27 15:36:56 +0000682 ret = verify_range(flash, cmpbuf, start, len);
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000683 free(cmpbuf);
684 return ret;
685}
686
Uwe Hermann48ec1b12010-08-08 17:01:18 +0000687/*
Carl-Daniel Hailfingerd0250a32009-11-25 17:05:52 +0000688 * @cmpbuf buffer to compare against, cmpbuf[0] is expected to match the
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000689 * flash content at location start
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000690 * @start offset to the base address of the flash chip
691 * @len length of the verified area
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000692 * @return 0 for success, -1 for failure
693 */
Mark Marshallf20b7be2014-05-09 21:16:21 +0000694int verify_range(struct flashctx *flash, const uint8_t *cmpbuf, unsigned int start, unsigned int len)
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000695{
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000696 if (!len)
Stefan Taunerdf64a422014-05-27 00:06:14 +0000697 return -1;
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000698
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +0000699 if (!flash->chip->read) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000700 msg_cerr("ERROR: flashrom has no read function for this flash chip.\n");
Stefan Taunerdf64a422014-05-27 00:06:14 +0000701 return -1;
Carl-Daniel Hailfinger23290662009-06-24 08:20:45 +0000702 }
Stefan Taunerdf64a422014-05-27 00:06:14 +0000703
704 uint8_t *readbuf = malloc(len);
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000705 if (!readbuf) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000706 msg_gerr("Could not allocate memory!\n");
Stefan Taunerdf64a422014-05-27 00:06:14 +0000707 return -1;
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000708 }
Stefan Taunerdf64a422014-05-27 00:06:14 +0000709 int ret = 0;
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000710
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +0000711 if (start + len > flash->chip->total_size * 1024) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000712 msg_gerr("Error: %s called with start 0x%x + len 0x%x >"
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000713 " total_size 0x%x\n", __func__, start, len,
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +0000714 flash->chip->total_size * 1024);
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000715 ret = -1;
716 goto out_free;
717 }
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000718
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +0000719 ret = flash->chip->read(flash, readbuf, start, len);
Carl-Daniel Hailfingerd8369412010-11-16 17:21:58 +0000720 if (ret) {
721 msg_gerr("Verification impossible because read failed "
722 "at 0x%x (len 0x%x)\n", start, len);
Stefan Taunerdf64a422014-05-27 00:06:14 +0000723 ret = -1;
724 goto out_free;
Carl-Daniel Hailfingerd8369412010-11-16 17:21:58 +0000725 }
726
Stefan Tauner78ffbea2012-10-27 15:36:56 +0000727 ret = compare_range(cmpbuf, readbuf, start, len);
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000728out_free:
729 free(readbuf);
730 return ret;
731}
732
Stefan Tauner02437452013-04-01 19:34:53 +0000733/* Helper function for need_erase() that focuses on granularities of gran bytes. */
Mark Marshallf20b7be2014-05-09 21:16:21 +0000734static 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 +0000735{
736 unsigned int i, j, limit;
737 for (j = 0; j < len / gran; j++) {
738 limit = min (gran, len - j * gran);
739 /* Are 'have' and 'want' identical? */
740 if (!memcmp(have + j * gran, want + j * gran, limit))
741 continue;
742 /* have needs to be in erased state. */
743 for (i = 0; i < limit; i++)
744 if (have[j * gran + i] != 0xff)
745 return 1;
746 }
747 return 0;
748}
749
Uwe Hermann48ec1b12010-08-08 17:01:18 +0000750/*
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000751 * Check if the buffer @have can be programmed to the content of @want without
752 * erasing. This is only possible if all chunks of size @gran are either kept
753 * as-is or changed from an all-ones state to any other state.
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000754 *
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000755 * Warning: This function assumes that @have and @want point to naturally
756 * aligned regions.
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000757 *
758 * @have buffer with current content
759 * @want buffer with desired content
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000760 * @len length of the checked area
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000761 * @gran write granularity (enum, not count)
762 * @return 0 if no erase is needed, 1 otherwise
763 */
Mark Marshallf20b7be2014-05-09 21:16:21 +0000764int 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 +0000765{
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +0000766 int result = 0;
Stefan Tauner02437452013-04-01 19:34:53 +0000767 unsigned int i;
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000768
769 switch (gran) {
770 case write_gran_1bit:
771 for (i = 0; i < len; i++)
772 if ((have[i] & want[i]) != want[i]) {
773 result = 1;
774 break;
775 }
776 break;
777 case write_gran_1byte:
778 for (i = 0; i < len; i++)
779 if ((have[i] != want[i]) && (have[i] != 0xff)) {
780 result = 1;
781 break;
782 }
783 break;
Paul Kocialkowskic8305e12015-10-16 02:16:20 +0000784 case write_gran_128bytes:
785 result = need_erase_gran_bytes(have, want, len, 128);
786 break;
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000787 case write_gran_256bytes:
Stefan Tauner02437452013-04-01 19:34:53 +0000788 result = need_erase_gran_bytes(have, want, len, 256);
789 break;
790 case write_gran_264bytes:
791 result = need_erase_gran_bytes(have, want, len, 264);
792 break;
793 case write_gran_512bytes:
794 result = need_erase_gran_bytes(have, want, len, 512);
795 break;
796 case write_gran_528bytes:
797 result = need_erase_gran_bytes(have, want, len, 528);
798 break;
799 case write_gran_1024bytes:
800 result = need_erase_gran_bytes(have, want, len, 1024);
801 break;
802 case write_gran_1056bytes:
803 result = need_erase_gran_bytes(have, want, len, 1056);
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000804 break;
Carl-Daniel Hailfinger1b0e9fc2014-06-16 22:36:17 +0000805 case write_gran_1byte_implicit_erase:
806 /* Do not erase, handle content changes from anything->0xff by writing 0xff. */
807 result = 0;
808 break;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000809 default:
810 msg_cerr("%s: Unsupported granularity! Please report a bug at "
811 "flashrom@flashrom.org\n", __func__);
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000812 }
813 return result;
814}
815
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000816/**
817 * Check if the buffer @have needs to be programmed to get the content of @want.
818 * If yes, return 1 and fill in first_start with the start address of the
819 * write operation and first_len with the length of the first to-be-written
820 * chunk. If not, return 0 and leave first_start and first_len undefined.
821 *
822 * Warning: This function assumes that @have and @want point to naturally
823 * aligned regions.
824 *
825 * @have buffer with current content
826 * @want buffer with desired content
827 * @len length of the checked area
828 * @gran write granularity (enum, not count)
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000829 * @first_start offset of the first byte which needs to be written (passed in
830 * value is increased by the offset of the first needed write
831 * relative to have/want or unchanged if no write is needed)
832 * @return length of the first contiguous area which needs to be written
833 * 0 if no write is needed
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000834 *
835 * FIXME: This function needs a parameter which tells it about coalescing
836 * in relation to the max write length of the programmer and the max write
837 * length of the chip.
838 */
Mark Marshallf20b7be2014-05-09 21:16:21 +0000839static unsigned int get_next_write(const uint8_t *have, const uint8_t *want, unsigned int len,
Stefan Taunerc69c9c82011-11-23 09:13:48 +0000840 unsigned int *first_start,
841 enum write_granularity gran)
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000842{
Stefan Taunerc69c9c82011-11-23 09:13:48 +0000843 int need_write = 0;
844 unsigned int rel_start = 0, first_len = 0;
845 unsigned int i, limit, stride;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000846
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000847 switch (gran) {
848 case write_gran_1bit:
849 case write_gran_1byte:
Carl-Daniel Hailfinger1b0e9fc2014-06-16 22:36:17 +0000850 case write_gran_1byte_implicit_erase:
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000851 stride = 1;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000852 break;
Paul Kocialkowskic8305e12015-10-16 02:16:20 +0000853 case write_gran_128bytes:
854 stride = 128;
855 break;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000856 case write_gran_256bytes:
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000857 stride = 256;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000858 break;
Stefan Tauner02437452013-04-01 19:34:53 +0000859 case write_gran_264bytes:
860 stride = 264;
861 break;
862 case write_gran_512bytes:
863 stride = 512;
864 break;
865 case write_gran_528bytes:
866 stride = 528;
867 break;
868 case write_gran_1024bytes:
869 stride = 1024;
870 break;
871 case write_gran_1056bytes:
872 stride = 1056;
873 break;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000874 default:
875 msg_cerr("%s: Unsupported granularity! Please report a bug at "
876 "flashrom@flashrom.org\n", __func__);
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000877 /* Claim that no write was needed. A write with unknown
878 * granularity is too dangerous to try.
879 */
880 return 0;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000881 }
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000882 for (i = 0; i < len / stride; i++) {
883 limit = min(stride, len - i * stride);
884 /* Are 'have' and 'want' identical? */
885 if (memcmp(have + i * stride, want + i * stride, limit)) {
886 if (!need_write) {
887 /* First location where have and want differ. */
888 need_write = 1;
889 rel_start = i * stride;
890 }
891 } else {
892 if (need_write) {
893 /* First location where have and want
894 * do not differ anymore.
895 */
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000896 break;
897 }
898 }
899 }
Carl-Daniel Hailfinger202bf532010-12-06 13:05:44 +0000900 if (need_write)
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000901 first_len = min(i * stride - rel_start, len);
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000902 *first_start += rel_start;
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000903 return first_len;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000904}
905
Carl-Daniel Hailfingereaac68b2009-11-23 12:55:31 +0000906/* This function generates various test patterns useful for testing controller
907 * and chip communication as well as chip behaviour.
908 *
909 * If a byte can be written multiple times, each time keeping 0-bits at 0
910 * and changing 1-bits to 0 if the new value for that bit is 0, the effect
911 * is essentially an AND operation. That's also the reason why this function
912 * provides the result of AND between various patterns.
913 *
914 * Below is a list of patterns (and their block length).
915 * Pattern 0 is 05 15 25 35 45 55 65 75 85 95 a5 b5 c5 d5 e5 f5 (16 Bytes)
916 * Pattern 1 is 0a 1a 2a 3a 4a 5a 6a 7a 8a 9a aa ba ca da ea fa (16 Bytes)
917 * Pattern 2 is 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f (16 Bytes)
918 * Pattern 3 is a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af (16 Bytes)
919 * Pattern 4 is 00 10 20 30 40 50 60 70 80 90 a0 b0 c0 d0 e0 f0 (16 Bytes)
920 * Pattern 5 is 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f (16 Bytes)
921 * Pattern 6 is 00 (1 Byte)
922 * Pattern 7 is ff (1 Byte)
923 * Patterns 0-7 have a big-endian block number in the last 2 bytes of each 256
924 * byte block.
925 *
926 * Pattern 8 is 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11... (256 B)
927 * Pattern 9 is ff fe fd fc fb fa f9 f8 f7 f6 f5 f4 f3 f2 f1 f0 ef ee... (256 B)
928 * Pattern 10 is 00 00 00 01 00 02 00 03 00 04... (128 kB big-endian counter)
929 * Pattern 11 is ff ff ff fe ff fd ff fc ff fb... (128 kB big-endian downwards)
930 * Pattern 12 is 00 (1 Byte)
931 * Pattern 13 is ff (1 Byte)
932 * Patterns 8-13 have no block number.
933 *
934 * Patterns 0-3 are created to detect and efficiently diagnose communication
935 * slips like missed bits or bytes and their repetitive nature gives good visual
936 * cues to the person inspecting the results. In addition, the following holds:
937 * AND Pattern 0/1 == Pattern 4
938 * AND Pattern 2/3 == Pattern 5
939 * AND Pattern 0/1/2/3 == AND Pattern 4/5 == Pattern 6
940 * A weakness of pattern 0-5 is the inability to detect swaps/copies between
941 * any two 16-byte blocks except for the last 16-byte block in a 256-byte bloc.
942 * They work perfectly for detecting any swaps/aliasing of blocks >= 256 bytes.
943 * 0x5 and 0xa were picked because they are 0101 and 1010 binary.
944 * Patterns 8-9 are best for detecting swaps/aliasing of blocks < 256 bytes.
945 * Besides that, they provide for bit testing of the last two bytes of every
946 * 256 byte block which contains the block number for patterns 0-6.
947 * Patterns 10-11 are special purpose for detecting subblock aliasing with
948 * block sizes >256 bytes (some Dataflash chips etc.)
949 * AND Pattern 8/9 == Pattern 12
950 * AND Pattern 10/11 == Pattern 12
951 * Pattern 13 is the completely erased state.
952 * None of the patterns can detect aliasing at boundaries which are a multiple
953 * of 16 MBytes (but such chips do not exist anyway for Parallel/LPC/FWH/SPI).
954 */
955int generate_testpattern(uint8_t *buf, uint32_t size, int variant)
956{
957 int i;
958
959 if (!buf) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000960 msg_gerr("Invalid buffer!\n");
Carl-Daniel Hailfingereaac68b2009-11-23 12:55:31 +0000961 return 1;
962 }
963
964 switch (variant) {
965 case 0:
966 for (i = 0; i < size; i++)
967 buf[i] = (i & 0xf) << 4 | 0x5;
968 break;
969 case 1:
970 for (i = 0; i < size; i++)
971 buf[i] = (i & 0xf) << 4 | 0xa;
972 break;
973 case 2:
974 for (i = 0; i < size; i++)
975 buf[i] = 0x50 | (i & 0xf);
976 break;
977 case 3:
978 for (i = 0; i < size; i++)
979 buf[i] = 0xa0 | (i & 0xf);
980 break;
981 case 4:
982 for (i = 0; i < size; i++)
983 buf[i] = (i & 0xf) << 4;
984 break;
985 case 5:
986 for (i = 0; i < size; i++)
987 buf[i] = i & 0xf;
988 break;
989 case 6:
990 memset(buf, 0x00, size);
991 break;
992 case 7:
993 memset(buf, 0xff, size);
994 break;
995 case 8:
996 for (i = 0; i < size; i++)
997 buf[i] = i & 0xff;
998 break;
999 case 9:
1000 for (i = 0; i < size; i++)
1001 buf[i] = ~(i & 0xff);
1002 break;
1003 case 10:
1004 for (i = 0; i < size % 2; i++) {
1005 buf[i * 2] = (i >> 8) & 0xff;
1006 buf[i * 2 + 1] = i & 0xff;
1007 }
1008 if (size & 0x1)
1009 buf[i * 2] = (i >> 8) & 0xff;
1010 break;
1011 case 11:
1012 for (i = 0; i < size % 2; i++) {
1013 buf[i * 2] = ~((i >> 8) & 0xff);
1014 buf[i * 2 + 1] = ~(i & 0xff);
1015 }
1016 if (size & 0x1)
1017 buf[i * 2] = ~((i >> 8) & 0xff);
1018 break;
1019 case 12:
1020 memset(buf, 0x00, size);
1021 break;
1022 case 13:
1023 memset(buf, 0xff, size);
1024 break;
1025 }
1026
1027 if ((variant >= 0) && (variant <= 7)) {
1028 /* Write block number in the last two bytes of each 256-byte
1029 * block, big endian for easier reading of the hexdump.
1030 * Note that this wraps around for chips larger than 2^24 bytes
1031 * (16 MB).
1032 */
1033 for (i = 0; i < size / 256; i++) {
1034 buf[i * 256 + 254] = (i >> 8) & 0xff;
1035 buf[i * 256 + 255] = i & 0xff;
1036 }
1037 }
1038
1039 return 0;
1040}
1041
Stefan Tauner9e3a6982014-08-15 17:17:59 +00001042/* Returns the number of busses commonly supported by the current programmer and flash chip where the latter
1043 * can not be completely accessed due to size/address limits of the programmer. */
1044unsigned int count_max_decode_exceedings(const struct flashctx *flash)
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001045{
Stefan Tauner9e3a6982014-08-15 17:17:59 +00001046 unsigned int limitexceeded = 0;
1047 uint32_t size = flash->chip->total_size * 1024;
1048 enum chipbustype buses = flash->mst->buses_supported & flash->chip->bustype;
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001049
1050 if ((buses & BUS_PARALLEL) && (max_rom_decode.parallel < size)) {
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001051 limitexceeded++;
Sean Nelson316a29f2010-05-07 20:09:04 +00001052 msg_pdbg("Chip size %u kB is bigger than supported "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001053 "size %u kB of chipset/board/programmer "
1054 "for %s interface, "
1055 "probe/read/erase/write may fail. ", size / 1024,
1056 max_rom_decode.parallel / 1024, "Parallel");
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001057 }
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001058 if ((buses & BUS_LPC) && (max_rom_decode.lpc < size)) {
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001059 limitexceeded++;
Sean Nelson316a29f2010-05-07 20:09:04 +00001060 msg_pdbg("Chip size %u kB is bigger than supported "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001061 "size %u kB of chipset/board/programmer "
1062 "for %s interface, "
1063 "probe/read/erase/write may fail. ", size / 1024,
1064 max_rom_decode.lpc / 1024, "LPC");
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001065 }
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001066 if ((buses & BUS_FWH) && (max_rom_decode.fwh < size)) {
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001067 limitexceeded++;
Sean Nelson316a29f2010-05-07 20:09:04 +00001068 msg_pdbg("Chip size %u kB is bigger than supported "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001069 "size %u kB of chipset/board/programmer "
1070 "for %s interface, "
1071 "probe/read/erase/write may fail. ", size / 1024,
1072 max_rom_decode.fwh / 1024, "FWH");
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001073 }
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001074 if ((buses & BUS_SPI) && (max_rom_decode.spi < size)) {
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001075 limitexceeded++;
Sean Nelson316a29f2010-05-07 20:09:04 +00001076 msg_pdbg("Chip size %u kB is bigger than supported "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001077 "size %u kB of chipset/board/programmer "
1078 "for %s interface, "
1079 "probe/read/erase/write may fail. ", size / 1024,
1080 max_rom_decode.spi / 1024, "SPI");
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001081 }
Stefan Tauner9e3a6982014-08-15 17:17:59 +00001082 return limitexceeded;
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001083}
1084
Stefan Tauner4e32ec12014-08-30 23:39:51 +00001085void unmap_flash(struct flashctx *flash)
1086{
1087 if (flash->virtual_registers != (chipaddr)ERROR_PTR) {
1088 programmer_unmap_flash_region((void *)flash->virtual_registers, flash->chip->total_size * 1024);
1089 flash->physical_registers = 0;
1090 flash->virtual_registers = (chipaddr)ERROR_PTR;
1091 }
1092
1093 if (flash->virtual_memory != (chipaddr)ERROR_PTR) {
1094 programmer_unmap_flash_region((void *)flash->virtual_memory, flash->chip->total_size * 1024);
1095 flash->physical_memory = 0;
1096 flash->virtual_memory = (chipaddr)ERROR_PTR;
1097 }
1098}
1099
1100int map_flash(struct flashctx *flash)
1101{
1102 /* Init pointers to the fail-safe state to distinguish them later from legit values. */
1103 flash->virtual_memory = (chipaddr)ERROR_PTR;
1104 flash->virtual_registers = (chipaddr)ERROR_PTR;
1105
1106 /* FIXME: This avoids mapping (and unmapping) of flash chip definitions with size 0.
1107 * These are used for various probing-related hacks that would not map successfully anyway and should be
1108 * removed ASAP. */
1109 if (flash->chip->total_size == 0)
1110 return 0;
1111
1112 const chipsize_t size = flash->chip->total_size * 1024;
1113 uintptr_t base = flashbase ? flashbase : (0xffffffff - size + 1);
1114 void *addr = programmer_map_flash_region(flash->chip->name, base, size);
1115 if (addr == ERROR_PTR) {
1116 msg_perr("Could not map flash chip %s at 0x%0*" PRIxPTR ".\n",
1117 flash->chip->name, PRIxPTR_WIDTH, base);
1118 return 1;
1119 }
1120 flash->physical_memory = base;
1121 flash->virtual_memory = (chipaddr)addr;
1122
1123 /* FIXME: Special function registers normally live 4 MByte below flash space, but it might be somewhere
1124 * completely different on some chips and programmers, or not mappable at all.
1125 * Ignore these problems for now and always report success. */
1126 if (flash->chip->feature_bits & FEATURE_REGISTERMAP) {
1127 base = 0xffffffff - size - 0x400000 + 1;
1128 addr = programmer_map_flash_region("flash chip registers", base, size);
1129 if (addr == ERROR_PTR) {
1130 msg_pdbg2("Could not map flash chip registers %s at 0x%0*" PRIxPTR ".\n",
1131 flash->chip->name, PRIxPTR_WIDTH, base);
1132 return 0;
1133 }
1134 flash->physical_registers = base;
1135 flash->virtual_registers = (chipaddr)addr;
1136 }
1137 return 0;
1138}
1139
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +00001140int probe_flash(struct registered_master *mst, int startchip, struct flashctx *flash, int force)
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001141{
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001142 const struct flashchip *chip;
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001143 enum chipbustype buses_common;
Carl-Daniel Hailfingerb22918c2009-06-01 02:08:58 +00001144 char *tmp;
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001145
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001146 for (chip = flashchips + startchip; chip && chip->name; chip++) {
1147 if (chip_to_probe && strcmp(chip->name, chip_to_probe) != 0)
Ollie Lhocbbf1252004-03-17 22:22:08 +00001148 continue;
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +00001149 buses_common = mst->buses_supported & chip->bustype;
Carl-Daniel Hailfingerc40cff72011-12-20 00:19:29 +00001150 if (!buses_common)
Carl-Daniel Hailfinger6573b742011-06-17 22:38:53 +00001151 continue;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001152 msg_gdbg("Probing for %s %s, %d kB: ", chip->vendor, chip->name, chip->total_size);
1153 if (!chip->probe && !force) {
1154 msg_gdbg("failed! flashrom has no probe function for this flash chip.\n");
Carl-Daniel Hailfingerb22918c2009-06-01 02:08:58 +00001155 continue;
1156 }
Stefan Reinauer70385642007-04-06 11:58:03 +00001157
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001158 /* Start filling in the dynamic data. */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001159 flash->chip = calloc(1, sizeof(struct flashchip));
1160 if (!flash->chip) {
1161 msg_gerr("Out of memory!\n");
1162 exit(1);
1163 }
1164 memcpy(flash->chip, chip, sizeof(struct flashchip));
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +00001165 flash->mst = mst;
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001166
Stefan Tauner4e32ec12014-08-30 23:39:51 +00001167 if (map_flash(flash) != 0)
1168 return -1;
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001169
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001170 /* We handle a forced match like a real match, we just avoid probing. Note that probe_flash()
1171 * is only called with force=1 after normal probing failed.
1172 */
Peter Stuge27c3e2d2008-07-02 17:15:47 +00001173 if (force)
1174 break;
Stefan Reinauerfcb63682006-03-16 16:57:41 +00001175
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001176 if (flash->chip->probe(flash) != 1)
Peter Stuge483b8f02008-09-03 23:10:05 +00001177 goto notfound;
1178
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001179 /* If this is the first chip found, accept it.
1180 * If this is not the first chip found, accept it only if it is
Stefan Taunerac1b4c82012-02-17 14:51:04 +00001181 * a non-generic match. SFDP and CFI are generic matches.
1182 * startchip==0 means this call to probe_flash() is the first
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +00001183 * one for this programmer interface (master) and thus no other chip has
Stefan Taunerac1b4c82012-02-17 14:51:04 +00001184 * been found on this interface.
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001185 */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001186 if (startchip == 0 && flash->chip->model_id == SFDP_DEVICE_ID) {
Stefan Taunerac1b4c82012-02-17 14:51:04 +00001187 msg_cinfo("===\n"
1188 "SFDP has autodetected a flash chip which is "
1189 "not natively supported by flashrom yet.\n");
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001190 if (count_usable_erasers(flash) == 0)
Stefan Taunerac1b4c82012-02-17 14:51:04 +00001191 msg_cinfo("The standard operations read and "
1192 "verify should work, but to support "
1193 "erase, write and all other "
1194 "possible features");
1195 else
1196 msg_cinfo("All standard operations (read, "
1197 "verify, erase and write) should "
1198 "work, but to support all possible "
1199 "features");
1200
Stefan Taunerb4e06bd2012-08-20 00:24:22 +00001201 msg_cinfo(" we need to add them manually.\n"
1202 "You can help us by mailing us the output of the following command to "
1203 "flashrom@flashrom.org:\n"
1204 "'flashrom -VV [plus the -p/--programmer parameter]'\n"
1205 "Thanks for your help!\n"
Stefan Taunerac1b4c82012-02-17 14:51:04 +00001206 "===\n");
1207 }
1208
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001209 /* First flash chip detected on this bus. */
1210 if (startchip == 0)
Peter Stuge27c3e2d2008-07-02 17:15:47 +00001211 break;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001212 /* Not the first flash chip detected on this bus, but not a generic match either. */
1213 if ((flash->chip->model_id != GENERIC_DEVICE_ID) && (flash->chip->model_id != SFDP_DEVICE_ID))
1214 break;
1215 /* 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 +00001216notfound:
Stefan Tauner4e32ec12014-08-30 23:39:51 +00001217 unmap_flash(flash);
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001218 free(flash->chip);
1219 flash->chip = NULL;
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001220 }
Uwe Hermannffec5f32007-08-23 16:08:21 +00001221
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001222 if (!flash->chip)
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001223 return -1;
Peter Stuge27c3e2d2008-07-02 17:15:47 +00001224
Stefan Reinauer051e2362011-01-19 06:21:54 +00001225
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001226 tmp = flashbuses_to_text(flash->chip->bustype);
Stefan Tauner4e32ec12014-08-30 23:39:51 +00001227 msg_cinfo("%s %s flash chip \"%s\" (%d kB, %s) ", force ? "Assuming" : "Found",
1228 flash->chip->vendor, flash->chip->name, flash->chip->total_size, tmp);
Stefan Tauner00155492011-06-26 20:45:35 +00001229 free(tmp);
Stefan Tauner4e32ec12014-08-30 23:39:51 +00001230#if CONFIG_INTERNAL == 1
1231 if (programmer_table[programmer].map_flash_region == physmap)
1232 msg_cinfo("mapped at physical address 0x%0*" PRIxPTR ".\n",
1233 PRIxPTR_WIDTH, flash->physical_memory);
1234 else
1235#endif
1236 msg_cinfo("on %s.\n", programmer_table[programmer].name);
Uwe Hermann9899cad2009-06-28 21:47:57 +00001237
Stefan Tauner4e32ec12014-08-30 23:39:51 +00001238 /* Flash registers may more likely not be mapped if the chip was forced.
1239 * Lock info may be stored in registers, so avoid lock info printing. */
Carl-Daniel Hailfinger859f3f02010-12-02 21:59:42 +00001240 if (!force)
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001241 if (flash->chip->printlock)
1242 flash->chip->printlock(flash);
Sean Nelson6e0b9122010-02-19 00:52:10 +00001243
Stefan Tauner4e32ec12014-08-30 23:39:51 +00001244 /* Get out of the way for later runs. */
1245 unmap_flash(flash);
1246
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001247 /* Return position of matching chip. */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001248 return chip - flashchips;
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001249}
1250
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001251int read_buf_from_file(unsigned char *buf, unsigned long size,
1252 const char *filename)
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001253{
Nico Huber7562f7d2013-08-30 21:29:45 +00001254#ifdef __LIBPAYLOAD__
1255 msg_gerr("Error: No file I/O support in libpayload\n");
1256 return 1;
1257#else
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001258 unsigned long numbytes;
1259 FILE *image;
1260 struct stat image_stat;
1261
1262 if ((image = fopen(filename, "rb")) == NULL) {
Stefan Tauner363fd7e2013-04-07 13:08:30 +00001263 msg_gerr("Error: opening file \"%s\" failed: %s\n", filename, strerror(errno));
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001264 return 1;
1265 }
1266 if (fstat(fileno(image), &image_stat) != 0) {
Stefan Tauner363fd7e2013-04-07 13:08:30 +00001267 msg_gerr("Error: getting metadata of file \"%s\" failed: %s\n", filename, strerror(errno));
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001268 fclose(image);
1269 return 1;
1270 }
1271 if (image_stat.st_size != size) {
Carl-Daniel Hailfinger11990da2013-07-13 23:21:05 +00001272 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 +00001273 (intmax_t)image_stat.st_size, size);
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001274 fclose(image);
1275 return 1;
1276 }
1277 numbytes = fread(buf, 1, size, image);
1278 if (fclose(image)) {
Stefan Tauner363fd7e2013-04-07 13:08:30 +00001279 msg_gerr("Error: closing file \"%s\" failed: %s\n", filename, strerror(errno));
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001280 return 1;
1281 }
1282 if (numbytes != size) {
1283 msg_gerr("Error: Failed to read complete file. Got %ld bytes, "
1284 "wanted %ld!\n", numbytes, size);
1285 return 1;
1286 }
1287 return 0;
Nico Huber7562f7d2013-08-30 21:29:45 +00001288#endif
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001289}
1290
Mark Marshallf20b7be2014-05-09 21:16:21 +00001291int write_buf_to_file(const unsigned char *buf, unsigned long size, const char *filename)
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001292{
Nico Huber7562f7d2013-08-30 21:29:45 +00001293#ifdef __LIBPAYLOAD__
1294 msg_gerr("Error: No file I/O support in libpayload\n");
1295 return 1;
1296#else
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001297 unsigned long numbytes;
1298 FILE *image;
Stephan Guilloux21dd55b2009-06-01 22:07:52 +00001299
1300 if (!filename) {
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001301 msg_gerr("No filename specified.\n");
Stephan Guilloux21dd55b2009-06-01 22:07:52 +00001302 return 1;
1303 }
Patrick Georgi0bf842d2010-01-25 22:55:33 +00001304 if ((image = fopen(filename, "wb")) == NULL) {
Stefan Tauner363fd7e2013-04-07 13:08:30 +00001305 msg_gerr("Error: opening file \"%s\" failed: %s\n", filename, strerror(errno));
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00001306 return 1;
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001307 }
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001308
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001309 numbytes = fwrite(buf, 1, size, image);
1310 fclose(image);
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001311 if (numbytes != size) {
1312 msg_gerr("File %s could not be written completely.\n",
1313 filename);
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001314 return 1;
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001315 }
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001316 return 0;
Nico Huber7562f7d2013-08-30 21:29:45 +00001317#endif
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001318}
1319
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001320int read_flash_to_file(struct flashctx *flash, const char *filename)
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001321{
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001322 unsigned long size = flash->chip->total_size * 1024;
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001323 unsigned char *buf = calloc(size, sizeof(char));
1324 int ret = 0;
1325
1326 msg_cinfo("Reading flash... ");
1327 if (!buf) {
1328 msg_gerr("Memory allocation failed!\n");
1329 msg_cinfo("FAILED.\n");
1330 return 1;
1331 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001332 if (!flash->chip->read) {
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001333 msg_cerr("No read function available for this flash chip.\n");
1334 ret = 1;
1335 goto out_free;
1336 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001337 if (flash->chip->read(flash, buf, 0, size)) {
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001338 msg_cerr("Read operation failed!\n");
1339 ret = 1;
1340 goto out_free;
1341 }
1342
Stefan Tauner355cbfd2011-05-28 02:37:14 +00001343 ret = write_buf_to_file(buf, size, filename);
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001344out_free:
1345 free(buf);
1346 msg_cinfo("%s.\n", ret ? "FAILED" : "done");
1347 return ret;
1348}
1349
Stefan Tauner96658be2014-05-26 22:05:31 +00001350/* Even if an error is found, the function will keep going and check the rest. */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001351static int selfcheck_eraseblocks(const struct flashchip *chip)
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001352{
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +00001353 int i, j, k;
1354 int ret = 0;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001355
1356 for (k = 0; k < NUM_ERASEFUNCTIONS; k++) {
1357 unsigned int done = 0;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001358 struct block_eraser eraser = chip->block_erasers[k];
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001359
1360 for (i = 0; i < NUM_ERASEREGIONS; i++) {
1361 /* Blocks with zero size are bugs in flashchips.c. */
1362 if (eraser.eraseblocks[i].count &&
1363 !eraser.eraseblocks[i].size) {
1364 msg_gerr("ERROR: Flash chip %s erase function "
1365 "%i region %i has size 0. Please report"
1366 " a bug at flashrom@flashrom.org\n",
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001367 chip->name, k, i);
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001368 ret = 1;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001369 }
1370 /* Blocks with zero count are bugs in flashchips.c. */
1371 if (!eraser.eraseblocks[i].count &&
1372 eraser.eraseblocks[i].size) {
1373 msg_gerr("ERROR: Flash chip %s erase function "
1374 "%i region %i has count 0. Please report"
1375 " a bug at flashrom@flashrom.org\n",
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001376 chip->name, k, i);
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001377 ret = 1;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001378 }
1379 done += eraser.eraseblocks[i].count *
1380 eraser.eraseblocks[i].size;
1381 }
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001382 /* Empty eraseblock definition with erase function. */
1383 if (!done && eraser.block_erase)
Sean Nelson316a29f2010-05-07 20:09:04 +00001384 msg_gspew("Strange: Empty eraseblock definition with "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001385 "non-empty erase function. Not an error.\n");
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001386 if (!done)
1387 continue;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001388 if (done != chip->total_size * 1024) {
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001389 msg_gerr("ERROR: Flash chip %s erase function %i "
1390 "region walking resulted in 0x%06x bytes total,"
1391 " expected 0x%06x bytes. Please report a bug at"
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001392 " flashrom@flashrom.org\n", chip->name, k,
1393 done, chip->total_size * 1024);
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001394 ret = 1;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001395 }
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001396 if (!eraser.block_erase)
1397 continue;
1398 /* Check if there are identical erase functions for different
1399 * layouts. That would imply "magic" erase functions. The
1400 * easiest way to check this is with function pointers.
1401 */
Uwe Hermann43959702010-03-13 17:28:29 +00001402 for (j = k + 1; j < NUM_ERASEFUNCTIONS; j++) {
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001403 if (eraser.block_erase ==
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001404 chip->block_erasers[j].block_erase) {
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001405 msg_gerr("ERROR: Flash chip %s erase function "
1406 "%i and %i are identical. Please report"
1407 " a bug at flashrom@flashrom.org\n",
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001408 chip->name, k, j);
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001409 ret = 1;
1410 }
Uwe Hermann43959702010-03-13 17:28:29 +00001411 }
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001412 }
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001413 return ret;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001414}
1415
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001416static int erase_and_write_block_helper(struct flashctx *flash,
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001417 unsigned int start, unsigned int len,
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001418 uint8_t *curcontents,
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001419 uint8_t *newcontents,
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001420 int (*erasefn) (struct flashctx *flash,
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001421 unsigned int addr,
1422 unsigned int len))
1423{
Stefan Taunerc69c9c82011-11-23 09:13:48 +00001424 unsigned int starthere = 0, lenhere = 0;
1425 int ret = 0, skip = 1, writecount = 0;
Stefan Tauner50d67aa2013-03-03 23:49:48 +00001426 enum write_granularity gran = flash->chip->gran;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001427
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001428 /* curcontents and newcontents are opaque to walk_eraseregions, and
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001429 * need to be adjusted here to keep the impression of proper abstraction
1430 */
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001431 curcontents += start;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001432 newcontents += start;
1433 msg_cdbg(":");
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001434 if (need_erase(curcontents, newcontents, len, gran)) {
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001435 msg_cdbg("E");
1436 ret = erasefn(flash, start, len);
1437 if (ret)
1438 return ret;
Carl-Daniel Hailfingerb4061f62011-06-26 17:04:16 +00001439 if (check_erased_range(flash, start, len)) {
1440 msg_cerr("ERASE FAILED!\n");
1441 return -1;
1442 }
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001443 /* Erase was successful. Adjust curcontents. */
1444 memset(curcontents, 0xff, len);
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001445 skip = 0;
1446 }
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001447 /* get_next_write() sets starthere to a new value after the call. */
1448 while ((lenhere = get_next_write(curcontents + starthere,
1449 newcontents + starthere,
1450 len - starthere, &starthere, gran))) {
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001451 if (!writecount++)
1452 msg_cdbg("W");
1453 /* Needs the partial write function signature. */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001454 ret = flash->chip->write(flash, newcontents + starthere,
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001455 start + starthere, lenhere);
1456 if (ret)
1457 return ret;
1458 starthere += lenhere;
1459 skip = 0;
1460 }
1461 if (skip)
1462 msg_cdbg("S");
Stefan Tauner682122b2013-06-23 22:15:39 +00001463 else
1464 all_skipped = false;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001465 return ret;
1466}
1467
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001468static int walk_eraseregions(struct flashctx *flash, int erasefunction,
1469 int (*do_something) (struct flashctx *flash,
Carl-Daniel Hailfinger4d3e9ca2010-07-13 00:42:00 +00001470 unsigned int addr,
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001471 unsigned int len,
1472 uint8_t *param1,
1473 uint8_t *param2,
1474 int (*erasefn) (
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001475 struct flashctx *flash,
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001476 unsigned int addr,
1477 unsigned int len)),
1478 void *param1, void *param2)
Carl-Daniel Hailfingera1223412010-07-13 00:37:19 +00001479{
1480 int i, j;
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +00001481 unsigned int start = 0;
1482 unsigned int len;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001483 struct block_eraser eraser = flash->chip->block_erasers[erasefunction];
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001484
Carl-Daniel Hailfingera1223412010-07-13 00:37:19 +00001485 for (i = 0; i < NUM_ERASEREGIONS; i++) {
1486 /* count==0 for all automatically initialized array
1487 * members so the loop below won't be executed for them.
1488 */
1489 len = eraser.eraseblocks[i].size;
1490 for (j = 0; j < eraser.eraseblocks[i].count; j++) {
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001491 /* Print this for every block except the first one. */
1492 if (i || j)
1493 msg_cdbg(", ");
1494 msg_cdbg("0x%06x-0x%06x", start,
Carl-Daniel Hailfingera1223412010-07-13 00:37:19 +00001495 start + len - 1);
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001496 if (do_something(flash, start, len, param1, param2,
1497 eraser.block_erase)) {
Carl-Daniel Hailfingera1223412010-07-13 00:37:19 +00001498 return 1;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001499 }
Carl-Daniel Hailfingera1223412010-07-13 00:37:19 +00001500 start += len;
1501 }
1502 }
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001503 msg_cdbg("\n");
Carl-Daniel Hailfingera1223412010-07-13 00:37:19 +00001504 return 0;
1505}
1506
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001507static int check_block_eraser(const struct flashctx *flash, int k, int log)
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001508{
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001509 struct block_eraser eraser = flash->chip->block_erasers[k];
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001510
1511 if (!eraser.block_erase && !eraser.eraseblocks[0].count) {
1512 if (log)
1513 msg_cdbg("not defined. ");
1514 return 1;
1515 }
1516 if (!eraser.block_erase && eraser.eraseblocks[0].count) {
1517 if (log)
1518 msg_cdbg("eraseblock layout is known, but matching "
Stefan Tauner355cbfd2011-05-28 02:37:14 +00001519 "block erase function is not implemented. ");
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001520 return 1;
1521 }
1522 if (eraser.block_erase && !eraser.eraseblocks[0].count) {
1523 if (log)
1524 msg_cdbg("block erase function found, but "
Stefan Tauner355cbfd2011-05-28 02:37:14 +00001525 "eraseblock layout is not defined. ");
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001526 return 1;
1527 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001528 // TODO: Once erase functions are annotated with allowed buses, check that as well.
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001529 return 0;
1530}
1531
Mark Marshallf20b7be2014-05-09 21:16:21 +00001532int erase_and_write_flash(struct flashctx *flash, uint8_t *oldcontents, uint8_t *newcontents)
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001533{
Carl-Daniel Hailfingerd8334db2011-07-21 21:21:04 +00001534 int k, ret = 1;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001535 uint8_t *curcontents;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001536 unsigned long size = flash->chip->total_size * 1024;
Sylvain "ythier" Hitier9db45512011-07-04 07:27:17 +00001537 unsigned int usable_erasefunctions = count_usable_erasers(flash);
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001538
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001539 msg_cinfo("Erasing and writing flash chip... ");
Stefan Tauner269de352011-07-12 22:35:21 +00001540 curcontents = malloc(size);
1541 if (!curcontents) {
1542 msg_gerr("Out of memory!\n");
1543 exit(1);
1544 }
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001545 /* Copy oldcontents to curcontents to avoid clobbering oldcontents. */
1546 memcpy(curcontents, oldcontents, size);
1547
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001548 for (k = 0; k < NUM_ERASEFUNCTIONS; k++) {
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001549 if (k != 0)
Stefan Tauner16878542014-07-13 23:53:40 +00001550 msg_cinfo("Looking for another erase function.\n");
Carl-Daniel Hailfingerd8334db2011-07-21 21:21:04 +00001551 if (!usable_erasefunctions) {
Stefan Tauner16878542014-07-13 23:53:40 +00001552 msg_cinfo("No usable erase functions left.\n");
Carl-Daniel Hailfingerd8334db2011-07-21 21:21:04 +00001553 break;
1554 }
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001555 msg_cdbg("Trying erase function %i... ", k);
1556 if (check_block_eraser(flash, k, 1))
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001557 continue;
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001558 usable_erasefunctions--;
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001559 ret = walk_eraseregions(flash, k, &erase_and_write_block_helper,
1560 curcontents, newcontents);
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001561 /* If everything is OK, don't try another erase function. */
1562 if (!ret)
1563 break;
Carl-Daniel Hailfingerb23b1eb2010-12-02 02:41:55 +00001564 /* Write/erase failed, so try to find out what the current chip
Carl-Daniel Hailfingerd8334db2011-07-21 21:21:04 +00001565 * contents are. If no usable erase functions remain, we can
1566 * skip this: the next iteration will break immediately anyway.
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001567 */
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001568 if (!usable_erasefunctions)
1569 continue;
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001570 /* Reading the whole chip may take a while, inform the user even
1571 * in non-verbose mode.
1572 */
1573 msg_cinfo("Reading current flash chip contents... ");
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001574 if (flash->chip->read(flash, curcontents, 0, size)) {
Carl-Daniel Hailfingerb23b1eb2010-12-02 02:41:55 +00001575 /* Now we are truly screwed. Read failed as well. */
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001576 msg_cerr("Can't read anymore! Aborting.\n");
Carl-Daniel Hailfingerb23b1eb2010-12-02 02:41:55 +00001577 /* We have no idea about the flash chip contents, so
1578 * retrying with another erase function is pointless.
1579 */
1580 break;
1581 }
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001582 msg_cinfo("done. ");
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001583 }
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001584 /* Free the scratchpad. */
1585 free(curcontents);
Carl-Daniel Hailfingerf160a122009-05-08 17:15:15 +00001586
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001587 if (ret) {
Sean Nelson316a29f2010-05-07 20:09:04 +00001588 msg_cerr("FAILED!\n");
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001589 } else {
Stefan Tauner682122b2013-06-23 22:15:39 +00001590 if (all_skipped)
1591 msg_cinfo("\nWarning: Chip content is identical to the requested image.\n");
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001592 msg_cinfo("Erase/write done.\n");
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001593 }
1594 return ret;
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001595}
1596
Stefan Tauner136388f2013-07-15 10:47:53 +00001597static void nonfatal_help_message(void)
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001598{
Stefan Taunera58f6e92014-05-10 09:25:44 +00001599 msg_gerr("Good, writing to the flash chip apparently didn't do anything.\n");
Stefan Tauner136388f2013-07-15 10:47:53 +00001600#if CONFIG_INTERNAL == 1
1601 if (programmer == PROGRAMMER_INTERNAL)
1602 msg_gerr("This means we have to add special support for your board, programmer or flash\n"
1603 "chip. Please report this on IRC at chat.freenode.net (channel #flashrom) or\n"
1604 "mail flashrom@flashrom.org, thanks!\n"
1605 "-------------------------------------------------------------------------------\n"
1606 "You may now reboot or simply leave the machine running.\n");
1607 else
1608#endif
1609 msg_gerr("Please check the connections (especially those to write protection pins) between\n"
1610 "the programmer and the flash chip. If you think the error is caused by flashrom\n"
1611 "please report this on IRC at chat.freenode.net (channel #flashrom) or\n"
1612 "mail flashrom@flashrom.org, thanks!\n");
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001613}
1614
Stefan Tauner136388f2013-07-15 10:47:53 +00001615static void emergency_help_message(void)
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00001616{
Stefan Tauner136388f2013-07-15 10:47:53 +00001617 msg_gerr("Your flash chip is in an unknown state.\n");
1618#if CONFIG_INTERNAL == 1
1619 if (programmer == PROGRAMMER_INTERNAL)
1620 msg_gerr("Get help on IRC at chat.freenode.net (channel #flashrom) or\n"
1621 "mail flashrom@flashrom.org with the subject \"FAILED: <your board name>\"!\n"
1622 "-------------------------------------------------------------------------------\n"
1623 "DO NOT REBOOT OR POWEROFF!\n");
1624 else
1625#endif
1626 msg_gerr("Please report this on IRC at chat.freenode.net (channel #flashrom) or\n"
1627 "mail flashrom@flashrom.org, thanks!\n");
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00001628}
1629
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001630/* The way to go if you want a delimited list of programmers */
Stefan Tauner66652442011-06-26 17:38:17 +00001631void list_programmers(const char *delim)
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001632{
1633 enum programmer p;
1634 for (p = 0; p < PROGRAMMER_INVALID; p++) {
Sean Nelson316a29f2010-05-07 20:09:04 +00001635 msg_ginfo("%s", programmer_table[p].name);
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001636 if (p < PROGRAMMER_INVALID - 1)
Sean Nelson316a29f2010-05-07 20:09:04 +00001637 msg_ginfo("%s", delim);
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001638 }
Sean Nelson316a29f2010-05-07 20:09:04 +00001639 msg_ginfo("\n");
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001640}
1641
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001642void list_programmers_linebreak(int startcol, int cols, int paren)
1643{
1644 const char *pname;
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +00001645 int pnamelen;
1646 int remaining = 0, firstline = 1;
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001647 enum programmer p;
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +00001648 int i;
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001649
1650 for (p = 0; p < PROGRAMMER_INVALID; p++) {
1651 pname = programmer_table[p].name;
1652 pnamelen = strlen(pname);
1653 if (remaining - pnamelen - 2 < 0) {
1654 if (firstline)
1655 firstline = 0;
1656 else
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001657 msg_ginfo("\n");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001658 for (i = 0; i < startcol; i++)
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001659 msg_ginfo(" ");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001660 remaining = cols - startcol;
1661 } else {
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001662 msg_ginfo(" ");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001663 remaining--;
1664 }
1665 if (paren && (p == 0)) {
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001666 msg_ginfo("(");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001667 remaining--;
1668 }
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001669 msg_ginfo("%s", pname);
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001670 remaining -= pnamelen;
1671 if (p < PROGRAMMER_INVALID - 1) {
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001672 msg_ginfo(",");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001673 remaining--;
1674 } else {
1675 if (paren)
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001676 msg_ginfo(")");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001677 }
1678 }
1679}
1680
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001681void print_sysinfo(void)
1682{
Stefan Taunerb0eee9b2015-01-10 09:32:50 +00001683#if IS_WINDOWS
Carl-Daniel Hailfinger60d9bd22012-08-09 23:34:41 +00001684 SYSTEM_INFO si;
1685 OSVERSIONINFOEX osvi;
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001686
Carl-Daniel Hailfinger60d9bd22012-08-09 23:34:41 +00001687 memset(&si, 0, sizeof(SYSTEM_INFO));
1688 memset(&osvi, 0, sizeof(OSVERSIONINFOEX));
1689 msg_ginfo(" on Windows");
1690 /* Tell Windows which version of the structure we want. */
1691 osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
1692 if (GetVersionEx((OSVERSIONINFO*) &osvi))
1693 msg_ginfo(" %lu.%lu", osvi.dwMajorVersion, osvi.dwMinorVersion);
1694 else
1695 msg_ginfo(" unknown version");
1696 GetSystemInfo(&si);
1697 switch (si.wProcessorArchitecture) {
1698 case PROCESSOR_ARCHITECTURE_AMD64:
1699 msg_ginfo(" (x86_64)");
1700 break;
1701 case PROCESSOR_ARCHITECTURE_INTEL:
1702 msg_ginfo(" (x86)");
1703 break;
1704 default:
1705 msg_ginfo(" (unknown arch)");
1706 break;
1707 }
1708#elif HAVE_UTSNAME == 1
1709 struct utsname osinfo;
1710
1711 uname(&osinfo);
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001712 msg_ginfo(" on %s %s (%s)", osinfo.sysname, osinfo.release,
1713 osinfo.machine);
1714#else
1715 msg_ginfo(" on unknown machine");
1716#endif
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001717}
1718
1719void print_buildinfo(void)
1720{
1721 msg_gdbg("flashrom was built with");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001722#if NEED_PCI == 1
1723#ifdef PCILIB_VERSION
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001724 msg_gdbg(" libpci %s,", PCILIB_VERSION);
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001725#else
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001726 msg_gdbg(" unknown PCI library,");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001727#endif
1728#endif
1729#ifdef __clang__
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001730 msg_gdbg(" LLVM Clang");
Carl-Daniel Hailfingerb51e58e2010-07-17 14:49:30 +00001731#ifdef __clang_version__
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001732 msg_gdbg(" %s,", __clang_version__);
Carl-Daniel Hailfingerb51e58e2010-07-17 14:49:30 +00001733#else
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001734 msg_gdbg(" unknown version (before r102686),");
Carl-Daniel Hailfingerb51e58e2010-07-17 14:49:30 +00001735#endif
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001736#elif defined(__GNUC__)
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001737 msg_gdbg(" GCC");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001738#ifdef __VERSION__
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001739 msg_gdbg(" %s,", __VERSION__);
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001740#else
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001741 msg_gdbg(" unknown version,");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001742#endif
1743#else
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001744 msg_gdbg(" unknown compiler,");
Carl-Daniel Hailfingercceafa22010-05-26 01:45:41 +00001745#endif
1746#if defined (__FLASHROM_LITTLE_ENDIAN__)
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001747 msg_gdbg(" little endian");
Carl-Daniel Hailfinger06b9efa2012-08-07 11:59:59 +00001748#elif defined (__FLASHROM_BIG_ENDIAN__)
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001749 msg_gdbg(" big endian");
Carl-Daniel Hailfinger06b9efa2012-08-07 11:59:59 +00001750#else
1751#error Endianness could not be determined
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001752#endif
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001753 msg_gdbg("\n");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001754}
1755
Bernhard Walle201bde32008-01-21 15:24:22 +00001756void print_version(void)
1757{
Carl-Daniel Hailfinger8841d3e2010-05-15 15:04:37 +00001758 msg_ginfo("flashrom v%s", flashrom_version);
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001759 print_sysinfo();
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001760 msg_ginfo("\n");
Bernhard Walle201bde32008-01-21 15:24:22 +00001761}
1762
Carl-Daniel Hailfinger8841d3e2010-05-15 15:04:37 +00001763void print_banner(void)
1764{
1765 msg_ginfo("flashrom is free software, get the source code at "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001766 "http://www.flashrom.org\n");
Carl-Daniel Hailfinger8841d3e2010-05-15 15:04:37 +00001767 msg_ginfo("\n");
1768}
1769
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001770int selfcheck(void)
1771{
Stefan Tauner96658be2014-05-26 22:05:31 +00001772 unsigned int i;
Stefan Taunera6d96482012-12-26 19:51:23 +00001773 int ret = 0;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001774
1775 /* Safety check. Instead of aborting after the first error, check
1776 * if more errors exist.
1777 */
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001778 if (ARRAY_SIZE(programmer_table) - 1 != PROGRAMMER_INVALID) {
Sean Nelson316a29f2010-05-07 20:09:04 +00001779 msg_gerr("Programmer table miscompilation!\n");
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001780 ret = 1;
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001781 }
Stefan Taunera6d96482012-12-26 19:51:23 +00001782 for (i = 0; i < PROGRAMMER_INVALID; i++) {
1783 const struct programmer_entry p = programmer_table[i];
1784 if (p.name == NULL) {
1785 msg_gerr("All programmers need a valid name, but the one with index %d does not!\n", i);
1786 ret = 1;
1787 /* This might hide other problems with this programmer, but allows for better error
1788 * messages below without jumping through hoops. */
1789 continue;
1790 }
Stefan Tauneraf358d62012-12-27 18:40:26 +00001791 switch (p.type) {
1792 case USB:
1793 case PCI:
1794 case OTHER:
1795 if (p.devs.note == NULL) {
1796 if (strcmp("internal", p.name) == 0)
1797 break; /* This one has its device list stored separately. */
1798 msg_gerr("Programmer %s has neither a device list nor a textual description!\n",
1799 p.name);
1800 ret = 1;
1801 }
1802 break;
1803 default:
1804 msg_gerr("Programmer %s does not have a valid type set!\n", p.name);
1805 ret = 1;
1806 break;
1807 }
Stefan Taunera6d96482012-12-26 19:51:23 +00001808 if (p.init == NULL) {
1809 msg_gerr("Programmer %s does not have a valid init function!\n", p.name);
1810 ret = 1;
1811 }
1812 if (p.delay == NULL) {
1813 msg_gerr("Programmer %s does not have a valid delay function!\n", p.name);
1814 ret = 1;
1815 }
1816 if (p.map_flash_region == NULL) {
1817 msg_gerr("Programmer %s does not have a valid map_flash_region function!\n", p.name);
1818 ret = 1;
1819 }
1820 if (p.unmap_flash_region == NULL) {
1821 msg_gerr("Programmer %s does not have a valid unmap_flash_region function!\n", p.name);
1822 ret = 1;
1823 }
1824 }
Stefan Tauner96658be2014-05-26 22:05:31 +00001825
1826 /* It would be favorable if we could check for the correct layout (especially termination) of various
1827 * constant arrays: flashchips, chipset_enables, board_matches, boards_known, laptops_known.
1828 * They are all defined as externs in this compilation unit so we don't know their sizes which vary
1829 * depending on compiler flags, e.g. the target architecture, and can sometimes be 0.
1830 * For 'flashchips' we export the size explicitly to work around this and to be able to implement the
1831 * checks below. */
Stefan Tauner6697f712014-08-06 15:09:15 +00001832 if (flashchips_size <= 1 || flashchips[flashchips_size - 1].name != NULL) {
Stefan Tauner7bcacb12011-05-26 01:35:19 +00001833 msg_gerr("Flashchips table miscompilation!\n");
1834 ret = 1;
Stefan Tauner96658be2014-05-26 22:05:31 +00001835 } else {
1836 for (i = 0; i < flashchips_size - 1; i++) {
1837 const struct flashchip *chip = &flashchips[i];
1838 if (chip->vendor == NULL || chip->name == NULL || chip->bustype == BUS_NONE) {
1839 ret = 1;
1840 msg_gerr("ERROR: Some field of flash chip #%d (%s) is misconfigured.\n"
1841 "Please report a bug at flashrom@flashrom.org\n", i,
1842 chip->name == NULL ? "unnamed" : chip->name);
1843 }
1844 if (selfcheck_eraseblocks(chip)) {
1845 ret = 1;
1846 }
1847 }
Stefan Tauner7bcacb12011-05-26 01:35:19 +00001848 }
Stefan Tauner7bcacb12011-05-26 01:35:19 +00001849
Stefan Tauner600576b2014-06-12 22:57:36 +00001850#if CONFIG_INTERNAL == 1
1851 ret |= selfcheck_board_enables();
1852#endif
1853
Stefan Tauner96658be2014-05-26 22:05:31 +00001854 /* TODO: implement similar sanity checks for other arrays where deemed necessary. */
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001855 return ret;
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001856}
1857
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001858/* FIXME: This function signature needs to be improved once doit() has a better
1859 * function signature.
1860 */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001861int chip_safety_check(const struct flashctx *flash, int force, int read_it, int write_it, int erase_it,
1862 int verify_it)
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001863{
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001864 const struct flashchip *chip = flash->chip;
1865
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001866 if (!programmer_may_write && (write_it || erase_it)) {
1867 msg_perr("Write/erase is not working yet on your programmer in "
1868 "its current configuration.\n");
1869 /* --force is the wrong approach, but it's the best we can do
1870 * until the generic programmer parameter parser is merged.
1871 */
1872 if (!force)
1873 return 1;
1874 msg_cerr("Continuing anyway.\n");
1875 }
1876
1877 if (read_it || erase_it || write_it || verify_it) {
1878 /* Everything needs read. */
Stefan Tauner6455dff2014-05-26 00:36:24 +00001879 if (chip->tested.read == BAD) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001880 msg_cerr("Read is not working on this chip. ");
1881 if (!force)
1882 return 1;
1883 msg_cerr("Continuing anyway.\n");
1884 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001885 if (!chip->read) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001886 msg_cerr("flashrom has no read function for this "
1887 "flash chip.\n");
1888 return 1;
1889 }
1890 }
1891 if (erase_it || write_it) {
1892 /* Write needs erase. */
Stefan Tauner6455dff2014-05-26 00:36:24 +00001893 if (chip->tested.erase == NA) {
1894 msg_cerr("Erase is not possible on this chip.\n");
1895 return 1;
1896 }
1897 if (chip->tested.erase == BAD) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001898 msg_cerr("Erase is not working on this chip. ");
1899 if (!force)
1900 return 1;
1901 msg_cerr("Continuing anyway.\n");
1902 }
Sylvain "ythier" Hitier9db45512011-07-04 07:27:17 +00001903 if(count_usable_erasers(flash) == 0) {
Stefan Tauner5368dca2011-07-01 00:19:12 +00001904 msg_cerr("flashrom has no erase function for this "
1905 "flash chip.\n");
1906 return 1;
1907 }
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001908 }
1909 if (write_it) {
Stefan Tauner6455dff2014-05-26 00:36:24 +00001910 if (chip->tested.write == NA) {
1911 msg_cerr("Write is not possible on this chip.\n");
1912 return 1;
1913 }
1914 if (chip->tested.write == BAD) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001915 msg_cerr("Write is not working on this chip. ");
1916 if (!force)
1917 return 1;
1918 msg_cerr("Continuing anyway.\n");
1919 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001920 if (!chip->write) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001921 msg_cerr("flashrom has no write function for this "
1922 "flash chip.\n");
1923 return 1;
1924 }
1925 }
1926 return 0;
1927}
1928
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001929/* This function signature is horrible. We need to design a better interface,
1930 * but right now it allows us to split off the CLI code.
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00001931 * Besides that, the function itself is a textbook example of abysmal code flow.
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001932 */
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +00001933int doit(struct flashctx *flash, int force, const char *filename, int read_it,
1934 int write_it, int erase_it, int verify_it)
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001935{
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001936 uint8_t *oldcontents;
1937 uint8_t *newcontents;
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001938 int ret = 0;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001939 unsigned long size = flash->chip->total_size * 1024;
Stefan Tauner73f5bda2014-10-19 07:53:45 +00001940 int read_all_first = 1; /* FIXME: Make this configurable. */
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001941
David Hendricks77f931a2011-05-18 01:30:56 +00001942 if (chip_safety_check(flash, force, read_it, write_it, erase_it, verify_it)) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001943 msg_cerr("Aborting.\n");
Stefan Tauner20da4aa2014-05-07 22:07:23 +00001944 return 1;
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001945 }
1946
Stefan Tauner8268fdb2013-09-23 14:21:06 +00001947 if (normalize_romentries(flash)) {
1948 msg_cerr("Requested regions can not be handled. Aborting.\n");
Stefan Tauner20da4aa2014-05-07 22:07:23 +00001949 return 1;
Stefan Tauner8268fdb2013-09-23 14:21:06 +00001950 }
1951
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001952 /* Given the existence of read locks, we want to unlock for read,
1953 * erase and write.
1954 */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001955 if (flash->chip->unlock)
1956 flash->chip->unlock(flash);
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001957
1958 if (read_it) {
Stefan Tauner20da4aa2014-05-07 22:07:23 +00001959 return read_flash_to_file(flash, filename);
Carl-Daniel Hailfingerd1be52d2010-07-03 12:14:25 +00001960 }
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001961
Stefan Tauner269de352011-07-12 22:35:21 +00001962 oldcontents = malloc(size);
1963 if (!oldcontents) {
1964 msg_gerr("Out of memory!\n");
1965 exit(1);
1966 }
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001967 /* Assume worst case: All bits are 0. */
1968 memset(oldcontents, 0x00, size);
Stefan Tauner269de352011-07-12 22:35:21 +00001969 newcontents = malloc(size);
1970 if (!newcontents) {
1971 msg_gerr("Out of memory!\n");
1972 exit(1);
1973 }
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001974 /* Assume best case: All bits should be 1. */
1975 memset(newcontents, 0xff, size);
1976 /* Side effect of the assumptions above: Default write action is erase
1977 * because newcontents looks like a completely erased chip, and
1978 * oldcontents being completely 0x00 means we have to erase everything
1979 * before we can write.
1980 */
1981
Ollie Lhoefa28582004-12-08 20:10:01 +00001982 if (erase_it) {
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001983 /* FIXME: Do we really want the scary warning if erase failed?
1984 * After all, after erase the chip is either blank or partially
1985 * blank or it has the old contents. A blank chip won't boot,
1986 * so if the user wanted erase and reboots afterwards, the user
1987 * knows very well that booting won't work.
1988 */
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001989 if (erase_and_write_flash(flash, oldcontents, newcontents)) {
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00001990 emergency_help_message();
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001991 ret = 1;
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00001992 }
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001993 goto out;
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00001994 }
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001995
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00001996 if (write_it || verify_it) {
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001997 if (read_buf_from_file(newcontents, size, filename)) {
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001998 ret = 1;
1999 goto out;
Stefan Reinauer018aca82006-11-21 23:48:51 +00002000 }
2001
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +00002002#if CONFIG_INTERNAL == 1
Stefan Taunerb4e06bd2012-08-20 00:24:22 +00002003 if (programmer == PROGRAMMER_INTERNAL && cb_check_image(newcontents, size) < 0) {
2004 if (force_boardmismatch) {
2005 msg_pinfo("Proceeding anyway because user forced us to.\n");
2006 } else {
2007 msg_perr("Aborting. You can override this with "
2008 "-p internal:boardmismatch=force.\n");
Niklas Söderlund9e423762012-06-16 00:11:16 +00002009 ret = 1;
2010 goto out;
2011 }
Stefan Taunerb4e06bd2012-08-20 00:24:22 +00002012 }
Carl-Daniel Hailfinger66ef4e52009-12-13 22:28:00 +00002013#endif
Ollie Lhocbbf1252004-03-17 22:22:08 +00002014 }
2015
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00002016 /* Read the whole chip to be able to check whether regions need to be
2017 * erased and to give better diagnostics in case write fails.
Stefan Tauner73f5bda2014-10-19 07:53:45 +00002018 * The alternative is to read only the regions which are to be
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00002019 * preserved, but in that case we might perform unneeded erase which
2020 * takes time as well.
2021 */
Stefan Tauner73f5bda2014-10-19 07:53:45 +00002022 if (read_all_first) {
2023 msg_cinfo("Reading old flash chip contents... ");
2024 if (flash->chip->read(flash, oldcontents, 0, size)) {
2025 ret = 1;
2026 msg_cinfo("FAILED.\n");
2027 goto out;
2028 }
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00002029 }
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00002030 msg_cinfo("done.\n");
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00002031
Stefan Tauner8268fdb2013-09-23 14:21:06 +00002032 /* Build a new image taking the given layout into account. */
Stefan Tauner73f5bda2014-10-19 07:53:45 +00002033 if (build_new_image(flash, read_all_first, oldcontents, newcontents)) {
2034 msg_gerr("Could not prepare the data to be written, aborting.\n");
2035 ret = 1;
2036 goto out;
2037 }
Uwe Hermanna7e05482007-05-09 10:17:44 +00002038
Ollie Lho184a4042005-11-26 21:55:36 +00002039 // ////////////////////////////////////////////////////////////
Uwe Hermanna7e05482007-05-09 10:17:44 +00002040
Stefan Tauner73f5bda2014-10-19 07:53:45 +00002041 if (write_it && erase_and_write_flash(flash, oldcontents, newcontents)) {
Stefan Tauner5c316f92015-02-08 21:57:52 +00002042 msg_cerr("Uh oh. Erase/write failed. ");
Stefan Tauner73f5bda2014-10-19 07:53:45 +00002043 if (read_all_first) {
2044 msg_cerr("Checking if anything has changed.\n");
Stefan Taunera58f6e92014-05-10 09:25:44 +00002045 msg_cinfo("Reading current flash chip contents... ");
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00002046 if (!flash->chip->read(flash, newcontents, 0, size)) {
Stefan Taunera58f6e92014-05-10 09:25:44 +00002047 msg_cinfo("done.\n");
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00002048 if (!memcmp(oldcontents, newcontents, size)) {
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00002049 nonfatal_help_message();
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00002050 ret = 1;
2051 goto out;
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00002052 }
Stefan Taunera58f6e92014-05-10 09:25:44 +00002053 msg_cerr("Apparently at least some data has changed.\n");
2054 } else
2055 msg_cerr("Can't even read anymore!\n");
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00002056 emergency_help_message();
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00002057 ret = 1;
2058 goto out;
Stefan Tauner73f5bda2014-10-19 07:53:45 +00002059 } else
2060 msg_cerr("\n");
2061 emergency_help_message();
2062 ret = 1;
2063 goto out;
Peter Stugef31104c2008-04-28 14:47:30 +00002064 }
Ollie Lho184a4042005-11-26 21:55:36 +00002065
Stefan Taunerc4f44df2013-08-12 22:58:43 +00002066 /* Verify only if we either did not try to write (verify operation) or actually changed something. */
2067 if (verify_it && (!write_it || !all_skipped)) {
Stefan Tauner78ffbea2012-10-27 15:36:56 +00002068 msg_cinfo("Verifying flash... ");
2069
2070 if (write_it) {
2071 /* Work around chips which need some time to calm down. */
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00002072 programmer_delay(1000*1000);
Stefan Tauner78ffbea2012-10-27 15:36:56 +00002073 ret = verify_range(flash, newcontents, 0, size);
2074 /* If we tried to write, and verification now fails, we
2075 * might have an emergency situation.
2076 */
2077 if (ret)
2078 emergency_help_message();
2079 } else {
2080 ret = compare_range(newcontents, oldcontents, 0, size);
2081 }
2082 if (!ret)
2083 msg_cinfo("VERIFIED.\n");
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00002084 }
Ollie Lho184a4042005-11-26 21:55:36 +00002085
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00002086out:
2087 free(oldcontents);
2088 free(newcontents);
Stefan Reinauer143da0b2006-01-04 16:42:57 +00002089 return ret;
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00002090}