blob: 113a05b46685d9e289abd65b5d6469a8abcf120f [file] [log] [blame]
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001/*
Uwe Hermannd1107642007-08-29 17:52:32 +00002 * This file is part of the flashrom project.
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00003 *
Uwe Hermannd22a1d42007-09-09 20:21:05 +00004 * Copyright (C) 2000 Silicon Integrated System Corporation
5 * Copyright (C) 2004 Tyan Corp <yhlu@tyan.com>
Uwe Hermannc7e8a0c2009-05-19 14:14:21 +00006 * Copyright (C) 2005-2008 coresystems GmbH
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007 * Copyright (C) 2008,2009 Carl-Daniel Hailfinger
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00008 *
Uwe Hermannd1107642007-08-29 17:52:32 +00009 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +000013 *
Uwe Hermannd1107642007-08-29 17:52:32 +000014 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +000018 *
Uwe Hermannd1107642007-08-29 17:52:32 +000019 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +000022 */
23
Carl-Daniel Hailfinger831e8f42010-05-30 22:24:40 +000024#include <stdio.h>
Stefan Reinauer018aca82006-11-21 23:48:51 +000025#include <sys/types.h>
Patrick Georgia9095a92010-09-30 17:03:32 +000026#ifndef __LIBPAYLOAD__
27#include <fcntl.h>
Stefan Reinauer018aca82006-11-21 23:48:51 +000028#include <sys/stat.h>
Patrick Georgia9095a92010-09-30 17:03:32 +000029#endif
Ronald G. Minnichceec4202003-07-25 04:37:41 +000030#include <string.h>
Stefan Tauner16687702015-12-25 21:59:45 +000031#include <unistd.h>
Ronald G. Minnicheaab50b2003-09-12 22:41:53 +000032#include <stdlib.h>
Stefan Tauner363fd7e2013-04-07 13:08:30 +000033#include <errno.h>
Carl-Daniel Hailfingerc2441382010-11-09 22:00:31 +000034#include <ctype.h>
Ollie Lho184a4042005-11-26 21:55:36 +000035#include <getopt.h>
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +000036#if HAVE_UTSNAME == 1
37#include <sys/utsname.h>
38#endif
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +000039#include "flash.h"
Carl-Daniel Hailfinger08454642009-06-15 14:14:48 +000040#include "flashchips.h"
Carl-Daniel Hailfinger5b997c32010-07-27 22:41:39 +000041#include "programmer.h"
Carl-Daniel Hailfinger06b9efa2012-08-07 11:59:59 +000042#include "hwaccess.h"
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +000043
Mathias Krausea60faab2011-01-17 07:50:42 +000044const char flashrom_version[] = FLASHROM_VERSION;
Nico Huberbcb2e5a2012-12-30 01:23:17 +000045const char *chip_to_probe = NULL;
Carl-Daniel Hailfinger66ef4e52009-12-13 22:28:00 +000046
Carl-Daniel Hailfinger2e681602011-09-08 00:00:29 +000047static enum programmer programmer = PROGRAMMER_INVALID;
Nico Huberbcb2e5a2012-12-30 01:23:17 +000048static const char *programmer_param = NULL;
Stefan Reinauer70385642007-04-06 11:58:03 +000049
Uwe Hermann48ec1b12010-08-08 17:01:18 +000050/*
Carl-Daniel Hailfinger66ef4e52009-12-13 22:28:00 +000051 * Programmers supporting multiple buses can have differing size limits on
52 * each bus. Store the limits for each bus in a common struct.
53 */
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +000054struct decode_sizes max_rom_decode;
55
56/* If nonzero, used as the start address of bottom-aligned flash. */
57unsigned long flashbase;
Carl-Daniel Hailfinger66ef4e52009-12-13 22:28:00 +000058
Carl-Daniel Hailfingerd1be52d2010-07-03 12:14:25 +000059/* Is writing allowed with this programmer? */
60int programmer_may_write;
61
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +000062const struct programmer_entry programmer_table[] = {
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +000063#if CONFIG_INTERNAL == 1
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +000064 {
Carl-Daniel Hailfinger37fc4692009-08-12 14:34:35 +000065 .name = "internal",
Stefan Tauneraf358d62012-12-27 18:40:26 +000066 .type = OTHER,
67 .devs.note = NULL,
Carl-Daniel Hailfinger1e334e62009-05-11 15:46:43 +000068 .init = internal_init,
Carl-Daniel Hailfinger1455b2b2009-05-11 14:13:25 +000069 .map_flash_region = physmap,
70 .unmap_flash_region = physunmap,
Carl-Daniel Hailfingerca8bfc62009-06-05 17:48:08 +000071 .delay = internal_delay,
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +000072 },
Carl-Daniel Hailfinger66ef4e52009-12-13 22:28:00 +000073#endif
Luc Verhaegen8e3a6002007-04-04 22:45:58 +000074
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +000075#if CONFIG_DUMMY == 1
Carl-Daniel Hailfingerc3129202009-05-09 00:54:55 +000076 {
Carl-Daniel Hailfinger37fc4692009-08-12 14:34:35 +000077 .name = "dummy",
Stefan Tauneraf358d62012-12-27 18:40:26 +000078 .type = OTHER,
79 /* FIXME */
80 .devs.note = "Dummy device, does nothing and logs all accesses\n",
Carl-Daniel Hailfinger1e334e62009-05-11 15:46:43 +000081 .init = dummy_init,
Carl-Daniel Hailfinger1455b2b2009-05-11 14:13:25 +000082 .map_flash_region = dummy_map,
83 .unmap_flash_region = dummy_unmap,
Carl-Daniel Hailfingerca8bfc62009-06-05 17:48:08 +000084 .delay = internal_delay,
Carl-Daniel Hailfingerc3129202009-05-09 00:54:55 +000085 },
Carl-Daniel Hailfinger4740c6f2009-09-16 10:09:21 +000086#endif
Carl-Daniel Hailfingerc3129202009-05-09 00:54:55 +000087
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +000088#if CONFIG_NIC3COM == 1
Uwe Hermannb4dcb712009-05-13 11:36:06 +000089 {
Carl-Daniel Hailfinger37fc4692009-08-12 14:34:35 +000090 .name = "nic3com",
Stefan Tauneraf358d62012-12-27 18:40:26 +000091 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +000092 .devs.dev = nics_3com,
Uwe Hermannb4dcb712009-05-13 11:36:06 +000093 .init = nic3com_init,
Uwe Hermannc6915932009-05-17 23:12:17 +000094 .map_flash_region = fallback_map,
95 .unmap_flash_region = fallback_unmap,
Carl-Daniel Hailfingerca8bfc62009-06-05 17:48:08 +000096 .delay = internal_delay,
Uwe Hermannb4dcb712009-05-13 11:36:06 +000097 },
Carl-Daniel Hailfinger4740c6f2009-09-16 10:09:21 +000098#endif
Uwe Hermannb4dcb712009-05-13 11:36:06 +000099
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000100#if CONFIG_NICREALTEK == 1
Joerg Fischer5665ef32010-05-21 21:54:07 +0000101 {
Carl-Daniel Hailfinger40446ee2011-03-07 01:08:09 +0000102 /* This programmer works for Realtek RTL8139 and SMC 1211. */
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000103 .name = "nicrealtek",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000104 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000105 .devs.dev = nics_realtek,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000106 .init = nicrealtek_init,
107 .map_flash_region = fallback_map,
108 .unmap_flash_region = fallback_unmap,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000109 .delay = internal_delay,
Joerg Fischer5665ef32010-05-21 21:54:07 +0000110 },
Joerg Fischer5665ef32010-05-21 21:54:07 +0000111#endif
112
Andrew Morganc29c2e72010-06-07 22:37:54 +0000113#if CONFIG_NICNATSEMI == 1
114 {
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000115 .name = "nicnatsemi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000116 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000117 .devs.dev = nics_natsemi,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000118 .init = nicnatsemi_init,
119 .map_flash_region = fallback_map,
120 .unmap_flash_region = fallback_unmap,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000121 .delay = internal_delay,
Andrew Morganc29c2e72010-06-07 22:37:54 +0000122 },
123#endif
Joerg Fischer5665ef32010-05-21 21:54:07 +0000124
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000125#if CONFIG_GFXNVIDIA == 1
Uwe Hermann2bc98f62009-09-30 18:29:55 +0000126 {
127 .name = "gfxnvidia",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000128 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000129 .devs.dev = gfx_nvidia,
Uwe Hermann2bc98f62009-09-30 18:29:55 +0000130 .init = gfxnvidia_init,
Uwe Hermann2bc98f62009-09-30 18:29:55 +0000131 .map_flash_region = fallback_map,
132 .unmap_flash_region = fallback_unmap,
Uwe Hermann2bc98f62009-09-30 18:29:55 +0000133 .delay = internal_delay,
134 },
135#endif
136
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000137#if CONFIG_DRKAISER == 1
Rudolf Marek68720c72009-05-17 19:39:27 +0000138 {
TURBO Jb0912c02009-09-02 23:00:46 +0000139 .name = "drkaiser",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000140 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000141 .devs.dev = drkaiser_pcidev,
TURBO Jb0912c02009-09-02 23:00:46 +0000142 .init = drkaiser_init,
TURBO Jb0912c02009-09-02 23:00:46 +0000143 .map_flash_region = fallback_map,
144 .unmap_flash_region = fallback_unmap,
TURBO Jb0912c02009-09-02 23:00:46 +0000145 .delay = internal_delay,
146 },
Carl-Daniel Hailfinger4740c6f2009-09-16 10:09:21 +0000147#endif
TURBO Jb0912c02009-09-02 23:00:46 +0000148
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000149#if CONFIG_SATASII == 1
TURBO Jb0912c02009-09-02 23:00:46 +0000150 {
Carl-Daniel Hailfinger37fc4692009-08-12 14:34:35 +0000151 .name = "satasii",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000152 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000153 .devs.dev = satas_sii,
Rudolf Marek68720c72009-05-17 19:39:27 +0000154 .init = satasii_init,
Uwe Hermannc6915932009-05-17 23:12:17 +0000155 .map_flash_region = fallback_map,
156 .unmap_flash_region = fallback_unmap,
Carl-Daniel Hailfingerca8bfc62009-06-05 17:48:08 +0000157 .delay = internal_delay,
Rudolf Marek68720c72009-05-17 19:39:27 +0000158 },
Carl-Daniel Hailfinger4740c6f2009-09-16 10:09:21 +0000159#endif
Rudolf Marek68720c72009-05-17 19:39:27 +0000160
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000161#if CONFIG_ATAHPT == 1
Uwe Hermannddd5c9e2010-02-21 21:17:00 +0000162 {
163 .name = "atahpt",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000164 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000165 .devs.dev = ata_hpt,
Uwe Hermannddd5c9e2010-02-21 21:17:00 +0000166 .init = atahpt_init,
Uwe Hermannddd5c9e2010-02-21 21:17:00 +0000167 .map_flash_region = fallback_map,
168 .unmap_flash_region = fallback_unmap,
Uwe Hermannddd5c9e2010-02-21 21:17:00 +0000169 .delay = internal_delay,
170 },
171#endif
172
Jonathan Kollasch7f0f3fa2014-06-01 10:26:23 +0000173#if CONFIG_ATAVIA == 1
174 {
175 .name = "atavia",
176 .type = PCI,
177 .devs.dev = ata_via,
178 .init = atavia_init,
179 .map_flash_region = atavia_map,
180 .unmap_flash_region = fallback_unmap,
181 .delay = internal_delay,
182 },
183#endif
184
Kyösti Mälkki72d42f82014-06-01 23:48:31 +0000185#if CONFIG_IT8212 == 1
186 {
187 .name = "it8212",
188 .type = PCI,
189 .devs.dev = devs_it8212,
190 .init = it8212_init,
191 .map_flash_region = fallback_map,
192 .unmap_flash_region = fallback_unmap,
193 .delay = internal_delay,
194 },
195#endif
196
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000197#if CONFIG_FT2232_SPI == 1
Paul Fox05dfbe62009-06-16 21:08:06 +0000198 {
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000199 .name = "ft2232_spi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000200 .type = USB,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000201 .devs.dev = devs_ft2232spi,
Paul Fox05dfbe62009-06-16 21:08:06 +0000202 .init = ft2232_spi_init,
Carl-Daniel Hailfinger415e5132009-08-12 11:39:29 +0000203 .map_flash_region = fallback_map,
204 .unmap_flash_region = fallback_unmap,
Paul Fox05dfbe62009-06-16 21:08:06 +0000205 .delay = internal_delay,
206 },
Carl-Daniel Hailfinger3426ef62009-08-19 13:27:58 +0000207#endif
Carl-Daniel Hailfinger415e5132009-08-12 11:39:29 +0000208
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000209#if CONFIG_SERPROG == 1
Urja Rannikko22915352009-06-23 11:33:43 +0000210 {
Carl-Daniel Hailfinger37fc4692009-08-12 14:34:35 +0000211 .name = "serprog",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000212 .type = OTHER,
213 /* FIXME */
214 .devs.note = "All programmer devices speaking the serprog protocol\n",
Urja Rannikko22915352009-06-23 11:33:43 +0000215 .init = serprog_init,
Urja Rannikko0b4ffd52015-06-29 23:24:23 +0000216 .map_flash_region = serprog_map,
Urja Rannikko22915352009-06-23 11:33:43 +0000217 .unmap_flash_region = fallback_unmap,
Urja Rannikko22915352009-06-23 11:33:43 +0000218 .delay = serprog_delay,
219 },
Carl-Daniel Hailfinger6be74112009-08-12 16:17:41 +0000220#endif
Paul Fox05dfbe62009-06-16 21:08:06 +0000221
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000222#if CONFIG_BUSPIRATE_SPI == 1
Carl-Daniel Hailfinger5cca01f2009-11-24 00:20:03 +0000223 {
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000224 .name = "buspirate_spi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000225 .type = OTHER,
226 /* FIXME */
227 .devs.note = "Dangerous Prototypes Bus Pirate\n",
Carl-Daniel Hailfinger5cca01f2009-11-24 00:20:03 +0000228 .init = buspirate_spi_init,
Carl-Daniel Hailfinger5cca01f2009-11-24 00:20:03 +0000229 .map_flash_region = fallback_map,
230 .unmap_flash_region = fallback_unmap,
Carl-Daniel Hailfinger5cca01f2009-11-24 00:20:03 +0000231 .delay = internal_delay,
232 },
233#endif
234
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000235#if CONFIG_DEDIPROG == 1
Carl-Daniel Hailfingerd38fac82010-01-19 11:15:48 +0000236 {
237 .name = "dediprog",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000238 .type = OTHER,
239 /* FIXME */
240 .devs.note = "Dediprog SF100\n",
Carl-Daniel Hailfingerd38fac82010-01-19 11:15:48 +0000241 .init = dediprog_init,
Carl-Daniel Hailfingerd38fac82010-01-19 11:15:48 +0000242 .map_flash_region = fallback_map,
243 .unmap_flash_region = fallback_unmap,
Carl-Daniel Hailfingerd38fac82010-01-19 11:15:48 +0000244 .delay = internal_delay,
245 },
246#endif
247
Carl-Daniel Hailfingere7fdd6e2010-07-21 10:26:01 +0000248#if CONFIG_RAYER_SPI == 1
249 {
250 .name = "rayer_spi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000251 .type = OTHER,
252 /* FIXME */
253 .devs.note = "RayeR parallel port programmer\n",
Carl-Daniel Hailfingere7fdd6e2010-07-21 10:26:01 +0000254 .init = rayer_spi_init,
Carl-Daniel Hailfingere7fdd6e2010-07-21 10:26:01 +0000255 .map_flash_region = fallback_map,
256 .unmap_flash_region = fallback_unmap,
Carl-Daniel Hailfingere7fdd6e2010-07-21 10:26:01 +0000257 .delay = internal_delay,
258 },
259#endif
260
Virgil-Adrian Teacada7c5452012-04-30 23:11:06 +0000261#if CONFIG_PONY_SPI == 1
262 {
263 .name = "pony_spi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000264 .type = OTHER,
265 /* FIXME */
266 .devs.note = "Programmers compatible with SI-Prog, serbang or AJAWe\n",
Virgil-Adrian Teacada7c5452012-04-30 23:11:06 +0000267 .init = pony_spi_init,
268 .map_flash_region = fallback_map,
269 .unmap_flash_region = fallback_unmap,
270 .delay = internal_delay,
Stefan Tauneraf358d62012-12-27 18:40:26 +0000271 },
Virgil-Adrian Teacada7c5452012-04-30 23:11:06 +0000272#endif
273
Carl-Daniel Hailfingerb713d2e2011-05-08 00:24:18 +0000274#if CONFIG_NICINTEL == 1
275 {
276 .name = "nicintel",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000277 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000278 .devs.dev = nics_intel,
Carl-Daniel Hailfingerb713d2e2011-05-08 00:24:18 +0000279 .init = nicintel_init,
Carl-Daniel Hailfingerb713d2e2011-05-08 00:24:18 +0000280 .map_flash_region = fallback_map,
281 .unmap_flash_region = fallback_unmap,
Carl-Daniel Hailfingerb713d2e2011-05-08 00:24:18 +0000282 .delay = internal_delay,
283 },
284#endif
285
Idwer Vollering004f4b72010-09-03 18:21:21 +0000286#if CONFIG_NICINTEL_SPI == 1
287 {
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000288 .name = "nicintel_spi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000289 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000290 .devs.dev = nics_intel_spi,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000291 .init = nicintel_spi_init,
292 .map_flash_region = fallback_map,
293 .unmap_flash_region = fallback_unmap,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000294 .delay = internal_delay,
Idwer Vollering004f4b72010-09-03 18:21:21 +0000295 },
296#endif
297
Ricardo Ribalda Delgado2a41f0a2014-07-28 20:35:21 +0000298#if CONFIG_NICINTEL_EEPROM == 1
299 {
300 .name = "nicintel_eeprom",
301 .type = PCI,
302 .devs.dev = nics_intel_ee,
303 .init = nicintel_ee_init,
304 .map_flash_region = fallback_map,
305 .unmap_flash_region = fallback_unmap,
306 .delay = internal_delay,
307 },
308#endif
309
Mark Marshall90021f22010-12-03 14:48:11 +0000310#if CONFIG_OGP_SPI == 1
311 {
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000312 .name = "ogp_spi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000313 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000314 .devs.dev = ogp_spi,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000315 .init = ogp_spi_init,
316 .map_flash_region = fallback_map,
317 .unmap_flash_region = fallback_unmap,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000318 .delay = internal_delay,
Mark Marshall90021f22010-12-03 14:48:11 +0000319 },
320#endif
321
Carl-Daniel Hailfinger9a1105c2011-02-04 21:37:59 +0000322#if CONFIG_SATAMV == 1
323 {
324 .name = "satamv",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000325 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000326 .devs.dev = satas_mv,
Carl-Daniel Hailfinger9a1105c2011-02-04 21:37:59 +0000327 .init = satamv_init,
Carl-Daniel Hailfinger9a1105c2011-02-04 21:37:59 +0000328 .map_flash_region = fallback_map,
329 .unmap_flash_region = fallback_unmap,
Carl-Daniel Hailfinger9a1105c2011-02-04 21:37:59 +0000330 .delay = internal_delay,
331 },
332#endif
333
Sven Schnelle5ce5f702011-09-03 18:37:52 +0000334#if CONFIG_LINUX_SPI == 1
335 {
336 .name = "linux_spi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000337 .type = OTHER,
338 .devs.note = "Device files /dev/spidev*.*\n",
Sven Schnelle5ce5f702011-09-03 18:37:52 +0000339 .init = linux_spi_init,
340 .map_flash_region = fallback_map,
341 .unmap_flash_region = fallback_unmap,
Sven Schnelle5ce5f702011-09-03 18:37:52 +0000342 .delay = internal_delay,
343 },
344#endif
345
James Lairdc60de0e2013-03-27 13:00:23 +0000346#if CONFIG_USBBLASTER_SPI == 1
347 {
348 .name = "usbblaster_spi",
349 .type = USB,
350 .devs.dev = devs_usbblasterspi,
351 .init = usbblaster_spi_init,
352 .map_flash_region = fallback_map,
353 .unmap_flash_region = fallback_unmap,
354 .delay = internal_delay,
355 },
356#endif
357
Alexandre Boeglin80e64712014-12-20 20:25:19 +0000358#if CONFIG_MSTARDDC_SPI == 1
359 {
360 .name = "mstarddc_spi",
361 .type = OTHER,
362 .devs.note = "MSTAR DDC devices addressable via /dev/i2c-* on Linux.\n",
363 .init = mstarddc_spi_init,
364 .map_flash_region = fallback_map,
365 .unmap_flash_region = fallback_unmap,
366 .delay = internal_delay,
367 },
368#endif
369
Justin Chevrier66e554b2015-02-08 21:58:10 +0000370#if CONFIG_PICKIT2_SPI == 1
371 {
372 .name = "pickit2_spi",
373 .type = OTHER,
374 /* FIXME */
375 .devs.note = "Microchip PICkit2\n",
376 .init = pickit2_spi_init,
377 .map_flash_region = fallback_map,
378 .unmap_flash_region = fallback_unmap,
379 .delay = internal_delay,
380 },
381#endif
382
Carl-Daniel Hailfinger1c6d2ff2012-08-27 00:44:42 +0000383 {0}, /* This entry corresponds to PROGRAMMER_INVALID. */
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +0000384};
Luc Verhaegen8e3a6002007-04-04 22:45:58 +0000385
Carl-Daniel Hailfinger2bee8cf2010-11-10 15:25:18 +0000386#define SHUTDOWN_MAXFN 32
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000387static int shutdown_fn_count = 0;
388struct shutdown_func_data {
David Hendricks8bb20212011-06-14 01:35:36 +0000389 int (*func) (void *data);
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000390 void *data;
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000391} static shutdown_fn[SHUTDOWN_MAXFN];
392/* Initialize to 0 to make sure nobody registers a shutdown function before
393 * programmer init.
394 */
395static int may_register_shutdown = 0;
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000396
Stefan Taunerc4f44df2013-08-12 22:58:43 +0000397/* Did we change something or was every erase/write skipped (if any)? */
398static bool all_skipped = true;
399
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +0000400static int check_block_eraser(const struct flashctx *flash, int k, int log);
Stefan Tauner5368dca2011-07-01 00:19:12 +0000401
Stefan Tauner2a1ed772014-08-31 00:09:21 +0000402int shutdown_free(void *data)
403{
404 free(data);
405 return 0;
406}
407
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000408/* Register a function to be executed on programmer shutdown.
409 * The advantage over atexit() is that you can supply a void pointer which will
410 * be used as parameter to the registered function upon programmer shutdown.
411 * This pointer can point to arbitrary data used by said function, e.g. undo
412 * information for GPIO settings etc. If unneeded, set data=NULL.
413 * Please note that the first (void *data) belongs to the function signature of
414 * the function passed as first parameter.
415 */
David Hendricks8bb20212011-06-14 01:35:36 +0000416int register_shutdown(int (*function) (void *data), void *data)
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000417{
418 if (shutdown_fn_count >= SHUTDOWN_MAXFN) {
Carl-Daniel Hailfinger9f5f2152010-06-04 23:20:21 +0000419 msg_perr("Tried to register more than %i shutdown functions.\n",
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000420 SHUTDOWN_MAXFN);
421 return 1;
422 }
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000423 if (!may_register_shutdown) {
424 msg_perr("Tried to register a shutdown function before "
425 "programmer init.\n");
426 return 1;
427 }
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000428 shutdown_fn[shutdown_fn_count].func = function;
429 shutdown_fn[shutdown_fn_count].data = data;
430 shutdown_fn_count++;
431
432 return 0;
433}
434
Nico Huberbcb2e5a2012-12-30 01:23:17 +0000435int programmer_init(enum programmer prog, const char *param)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000436{
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000437 int ret;
Carl-Daniel Hailfinger2e681602011-09-08 00:00:29 +0000438
439 if (prog >= PROGRAMMER_INVALID) {
440 msg_perr("Invalid programmer specified!\n");
441 return -1;
442 }
443 programmer = prog;
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000444 /* Initialize all programmer specific data. */
445 /* Default to unlimited decode sizes. */
446 max_rom_decode = (const struct decode_sizes) {
447 .parallel = 0xffffffff,
448 .lpc = 0xffffffff,
449 .fwh = 0xffffffff,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000450 .spi = 0xffffffff,
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000451 };
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000452 /* Default to top aligned flash at 4 GB. */
453 flashbase = 0;
454 /* Registering shutdown functions is now allowed. */
455 may_register_shutdown = 1;
Carl-Daniel Hailfingerd1be52d2010-07-03 12:14:25 +0000456 /* Default to allowing writes. Broken programmers set this to 0. */
457 programmer_may_write = 1;
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000458
459 programmer_param = param;
Carl-Daniel Hailfinger20a36ba2013-08-13 07:09:57 +0000460 msg_pdbg("Initializing %s programmer\n", programmer_table[programmer].name);
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000461 ret = programmer_table[programmer].init();
462 if (programmer_param && strlen(programmer_param)) {
Carl-Daniel Hailfinger20a36ba2013-08-13 07:09:57 +0000463 if (ret != 0) {
464 /* It is quite possible that any unhandled programmer parameter would have been valid,
465 * but an error in actual programmer init happened before the parameter was evaluated.
466 */
467 msg_pwarn("Unhandled programmer parameters (possibly due to another failure): %s\n",
468 programmer_param);
469 } else {
470 /* Actual programmer init was successful, but the user specified an invalid or unusable
471 * (for the current programmer configuration) parameter.
472 */
473 msg_perr("Unhandled programmer parameters: %s\n", programmer_param);
474 msg_perr("Aborting.\n");
475 ret = ERROR_FATAL;
476 }
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000477 }
478 return ret;
Uwe Hermann09e04f72009-05-16 22:36:00 +0000479}
480
Stefan Tauner20da4aa2014-05-07 22:07:23 +0000481/** Calls registered shutdown functions and resets internal programmer-related variables.
482 * Calling it is safe even without previous initialization, but further interactions with programmer support
483 * require a call to programmer_init() (afterwards).
484 *
485 * @return The OR-ed result values of all shutdown functions (i.e. 0 on success). */
Uwe Hermann09e04f72009-05-16 22:36:00 +0000486int programmer_shutdown(void)
487{
David Hendricks8bb20212011-06-14 01:35:36 +0000488 int ret = 0;
489
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000490 /* Registering shutdown functions is no longer allowed. */
491 may_register_shutdown = 0;
492 while (shutdown_fn_count > 0) {
493 int i = --shutdown_fn_count;
David Hendricks8bb20212011-06-14 01:35:36 +0000494 ret |= shutdown_fn[i].func(shutdown_fn[i].data);
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000495 }
Stefan Taunere34e3e82013-01-01 00:06:51 +0000496
Stefan Taunerb8911d62012-12-26 07:55:00 +0000497 programmer_param = NULL;
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000498 registered_master_count = 0;
Stefan Taunere34e3e82013-01-01 00:06:51 +0000499
David Hendricks8bb20212011-06-14 01:35:36 +0000500 return ret;
Uwe Hermann09e04f72009-05-16 22:36:00 +0000501}
502
Stefan Tauner305e0b92013-07-17 23:46:44 +0000503void *programmer_map_flash_region(const char *descr, uintptr_t phys_addr, size_t len)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000504{
Stefan Tauner26e7a152013-09-13 17:21:05 +0000505 void *ret = programmer_table[programmer].map_flash_region(descr, phys_addr, len);
506 msg_gspew("%s: mapping %s from 0x%0*" PRIxPTR " to 0x%0*" PRIxPTR "\n",
507 __func__, descr, PRIxPTR_WIDTH, phys_addr, PRIxPTR_WIDTH, (uintptr_t) ret);
508 return ret;
Uwe Hermann09e04f72009-05-16 22:36:00 +0000509}
510
511void programmer_unmap_flash_region(void *virt_addr, size_t len)
512{
513 programmer_table[programmer].unmap_flash_region(virt_addr, len);
Stefan Tauner4e32ec12014-08-30 23:39:51 +0000514 msg_gspew("%s: unmapped 0x%0*" PRIxPTR "\n", __func__, PRIxPTR_WIDTH, (uintptr_t)virt_addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000515}
516
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000517void chip_writeb(const struct flashctx *flash, uint8_t val, chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000518{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000519 flash->mst->par.chip_writeb(flash, val, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000520}
521
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000522void chip_writew(const struct flashctx *flash, uint16_t val, chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000523{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000524 flash->mst->par.chip_writew(flash, val, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000525}
526
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000527void chip_writel(const struct flashctx *flash, uint32_t val, chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000528{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000529 flash->mst->par.chip_writel(flash, val, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000530}
531
Mark Marshallf20b7be2014-05-09 21:16:21 +0000532void chip_writen(const struct flashctx *flash, const uint8_t *buf, chipaddr addr, size_t len)
Carl-Daniel Hailfinger0bd2a2b2009-06-05 18:32:07 +0000533{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000534 flash->mst->par.chip_writen(flash, buf, addr, len);
Carl-Daniel Hailfinger0bd2a2b2009-06-05 18:32:07 +0000535}
536
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000537uint8_t chip_readb(const struct flashctx *flash, const chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000538{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000539 return flash->mst->par.chip_readb(flash, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000540}
541
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000542uint16_t chip_readw(const struct flashctx *flash, const chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000543{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000544 return flash->mst->par.chip_readw(flash, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000545}
546
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000547uint32_t chip_readl(const struct flashctx *flash, const chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000548{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000549 return flash->mst->par.chip_readl(flash, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000550}
551
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000552void chip_readn(const struct flashctx *flash, uint8_t *buf, chipaddr addr,
553 size_t len)
Carl-Daniel Hailfinger0bd2a2b2009-06-05 18:32:07 +0000554{
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +0000555 flash->mst->par.chip_readn(flash, buf, addr, len);
Carl-Daniel Hailfinger0bd2a2b2009-06-05 18:32:07 +0000556}
557
Stefan Taunerf80419c2014-05-02 15:41:42 +0000558void programmer_delay(unsigned int usecs)
Carl-Daniel Hailfingerca8bfc62009-06-05 17:48:08 +0000559{
Urja Rannikko8d7ec2a2013-10-21 21:49:08 +0000560 if (usecs > 0)
561 programmer_table[programmer].delay(usecs);
Carl-Daniel Hailfingerca8bfc62009-06-05 17:48:08 +0000562}
563
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000564int read_memmapped(struct flashctx *flash, uint8_t *buf, unsigned int start,
565 int unsigned len)
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000566{
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000567 chip_readn(flash, buf, flash->virtual_memory + start, len);
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000568
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000569 return 0;
570}
571
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000572/* This is a somewhat hacked function similar in some ways to strtok().
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000573 * It will look for needle with a subsequent '=' in haystack, return a copy of
574 * needle and remove everything from the first occurrence of needle to the next
575 * delimiter from haystack.
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000576 */
Nico Huberbcb2e5a2012-12-30 01:23:17 +0000577char *extract_param(const char *const *haystack, const char *needle, const char *delim)
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000578{
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000579 char *param_pos, *opt_pos, *rest;
580 char *opt = NULL;
581 int optlen;
Carl-Daniel Hailfinger27023762010-04-28 15:22:14 +0000582 int needlelen;
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000583
Carl-Daniel Hailfinger27023762010-04-28 15:22:14 +0000584 needlelen = strlen(needle);
585 if (!needlelen) {
586 msg_gerr("%s: empty needle! Please report a bug at "
587 "flashrom@flashrom.org\n", __func__);
588 return NULL;
589 }
590 /* No programmer parameters given. */
591 if (*haystack == NULL)
592 return NULL;
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000593 param_pos = strstr(*haystack, needle);
594 do {
595 if (!param_pos)
596 return NULL;
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000597 /* Needle followed by '='? */
598 if (param_pos[needlelen] == '=') {
599
600 /* Beginning of the string? */
601 if (param_pos == *haystack)
602 break;
603 /* After a delimiter? */
604 if (strchr(delim, *(param_pos - 1)))
605 break;
606 }
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000607 /* Continue searching. */
608 param_pos++;
609 param_pos = strstr(param_pos, needle);
610 } while (1);
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000611
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000612 if (param_pos) {
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000613 /* Get the string after needle and '='. */
614 opt_pos = param_pos + needlelen + 1;
615 optlen = strcspn(opt_pos, delim);
616 /* Return an empty string if the parameter was empty. */
617 opt = malloc(optlen + 1);
618 if (!opt) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000619 msg_gerr("Out of memory!\n");
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000620 exit(1);
621 }
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000622 strncpy(opt, opt_pos, optlen);
623 opt[optlen] = '\0';
624 rest = opt_pos + optlen;
625 /* Skip all delimiters after the current parameter. */
626 rest += strspn(rest, delim);
627 memmove(param_pos, rest, strlen(rest) + 1);
628 /* We could shrink haystack, but the effort is not worth it. */
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000629 }
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000630
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000631 return opt;
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000632}
633
Stefan Tauner66652442011-06-26 17:38:17 +0000634char *extract_programmer_param(const char *param_name)
Carl-Daniel Hailfinger2b6dcb32010-07-08 10:13:37 +0000635{
636 return extract_param(&programmer_param, param_name, ",");
637}
638
Sylvain "ythier" Hitier9db45512011-07-04 07:27:17 +0000639/* Returns the number of well-defined erasers for a chip. */
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +0000640static unsigned int count_usable_erasers(const struct flashctx *flash)
Stefan Tauner5368dca2011-07-01 00:19:12 +0000641{
642 unsigned int usable_erasefunctions = 0;
643 int k;
644 for (k = 0; k < NUM_ERASEFUNCTIONS; k++) {
645 if (!check_block_eraser(flash, k, 0))
646 usable_erasefunctions++;
647 }
648 return usable_erasefunctions;
649}
650
Mark Marshallf20b7be2014-05-09 21:16:21 +0000651static int compare_range(const uint8_t *wantbuf, const uint8_t *havebuf, unsigned int start, unsigned int len)
Stefan Tauner78ffbea2012-10-27 15:36:56 +0000652{
653 int ret = 0, failcount = 0;
654 unsigned int i;
655 for (i = 0; i < len; i++) {
656 if (wantbuf[i] != havebuf[i]) {
657 /* Only print the first failure. */
658 if (!failcount++)
659 msg_cerr("FAILED at 0x%08x! Expected=0x%02x, Found=0x%02x,",
660 start + i, wantbuf[i], havebuf[i]);
661 }
662 }
663 if (failcount) {
664 msg_cerr(" failed byte count from 0x%08x-0x%08x: 0x%x\n",
665 start, start + len - 1, failcount);
666 ret = -1;
667 }
668 return ret;
669}
670
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000671/* start is an offset to the base address of the flash chip */
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000672int check_erased_range(struct flashctx *flash, unsigned int start,
673 unsigned int len)
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000674{
675 int ret;
676 uint8_t *cmpbuf = malloc(len);
677
678 if (!cmpbuf) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000679 msg_gerr("Could not allocate memory!\n");
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000680 exit(1);
681 }
682 memset(cmpbuf, 0xff, len);
Stefan Tauner78ffbea2012-10-27 15:36:56 +0000683 ret = verify_range(flash, cmpbuf, start, len);
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000684 free(cmpbuf);
685 return ret;
686}
687
Uwe Hermann48ec1b12010-08-08 17:01:18 +0000688/*
Carl-Daniel Hailfingerd0250a32009-11-25 17:05:52 +0000689 * @cmpbuf buffer to compare against, cmpbuf[0] is expected to match the
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000690 * flash content at location start
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000691 * @start offset to the base address of the flash chip
692 * @len length of the verified area
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000693 * @return 0 for success, -1 for failure
694 */
Mark Marshallf20b7be2014-05-09 21:16:21 +0000695int verify_range(struct flashctx *flash, const uint8_t *cmpbuf, unsigned int start, unsigned int len)
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000696{
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000697 if (!len)
Stefan Taunerdf64a422014-05-27 00:06:14 +0000698 return -1;
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000699
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +0000700 if (!flash->chip->read) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000701 msg_cerr("ERROR: flashrom has no read function for this flash chip.\n");
Stefan Taunerdf64a422014-05-27 00:06:14 +0000702 return -1;
Carl-Daniel Hailfinger23290662009-06-24 08:20:45 +0000703 }
Stefan Taunerdf64a422014-05-27 00:06:14 +0000704
705 uint8_t *readbuf = malloc(len);
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000706 if (!readbuf) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000707 msg_gerr("Could not allocate memory!\n");
Stefan Taunerdf64a422014-05-27 00:06:14 +0000708 return -1;
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000709 }
Stefan Taunerdf64a422014-05-27 00:06:14 +0000710 int ret = 0;
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000711
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +0000712 if (start + len > flash->chip->total_size * 1024) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000713 msg_gerr("Error: %s called with start 0x%x + len 0x%x >"
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000714 " total_size 0x%x\n", __func__, start, len,
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +0000715 flash->chip->total_size * 1024);
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000716 ret = -1;
717 goto out_free;
718 }
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000719
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +0000720 ret = flash->chip->read(flash, readbuf, start, len);
Carl-Daniel Hailfingerd8369412010-11-16 17:21:58 +0000721 if (ret) {
722 msg_gerr("Verification impossible because read failed "
723 "at 0x%x (len 0x%x)\n", start, len);
Stefan Taunerdf64a422014-05-27 00:06:14 +0000724 ret = -1;
725 goto out_free;
Carl-Daniel Hailfingerd8369412010-11-16 17:21:58 +0000726 }
727
Stefan Tauner78ffbea2012-10-27 15:36:56 +0000728 ret = compare_range(cmpbuf, readbuf, start, len);
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000729out_free:
730 free(readbuf);
731 return ret;
732}
733
Stefan Tauner02437452013-04-01 19:34:53 +0000734/* Helper function for need_erase() that focuses on granularities of gran bytes. */
Mark Marshallf20b7be2014-05-09 21:16:21 +0000735static 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 +0000736{
737 unsigned int i, j, limit;
738 for (j = 0; j < len / gran; j++) {
739 limit = min (gran, len - j * gran);
740 /* Are 'have' and 'want' identical? */
741 if (!memcmp(have + j * gran, want + j * gran, limit))
742 continue;
743 /* have needs to be in erased state. */
744 for (i = 0; i < limit; i++)
745 if (have[j * gran + i] != 0xff)
746 return 1;
747 }
748 return 0;
749}
750
Uwe Hermann48ec1b12010-08-08 17:01:18 +0000751/*
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000752 * Check if the buffer @have can be programmed to the content of @want without
753 * erasing. This is only possible if all chunks of size @gran are either kept
754 * as-is or changed from an all-ones state to any other state.
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000755 *
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000756 * Warning: This function assumes that @have and @want point to naturally
757 * aligned regions.
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000758 *
759 * @have buffer with current content
760 * @want buffer with desired content
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000761 * @len length of the checked area
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000762 * @gran write granularity (enum, not count)
763 * @return 0 if no erase is needed, 1 otherwise
764 */
Mark Marshallf20b7be2014-05-09 21:16:21 +0000765int 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 +0000766{
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +0000767 int result = 0;
Stefan Tauner02437452013-04-01 19:34:53 +0000768 unsigned int i;
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000769
770 switch (gran) {
771 case write_gran_1bit:
772 for (i = 0; i < len; i++)
773 if ((have[i] & want[i]) != want[i]) {
774 result = 1;
775 break;
776 }
777 break;
778 case write_gran_1byte:
779 for (i = 0; i < len; i++)
780 if ((have[i] != want[i]) && (have[i] != 0xff)) {
781 result = 1;
782 break;
783 }
784 break;
Paul Kocialkowskic8305e12015-10-16 02:16:20 +0000785 case write_gran_128bytes:
786 result = need_erase_gran_bytes(have, want, len, 128);
787 break;
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000788 case write_gran_256bytes:
Stefan Tauner02437452013-04-01 19:34:53 +0000789 result = need_erase_gran_bytes(have, want, len, 256);
790 break;
791 case write_gran_264bytes:
792 result = need_erase_gran_bytes(have, want, len, 264);
793 break;
794 case write_gran_512bytes:
795 result = need_erase_gran_bytes(have, want, len, 512);
796 break;
797 case write_gran_528bytes:
798 result = need_erase_gran_bytes(have, want, len, 528);
799 break;
800 case write_gran_1024bytes:
801 result = need_erase_gran_bytes(have, want, len, 1024);
802 break;
803 case write_gran_1056bytes:
804 result = need_erase_gran_bytes(have, want, len, 1056);
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000805 break;
Carl-Daniel Hailfinger1b0e9fc2014-06-16 22:36:17 +0000806 case write_gran_1byte_implicit_erase:
807 /* Do not erase, handle content changes from anything->0xff by writing 0xff. */
808 result = 0;
809 break;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000810 default:
811 msg_cerr("%s: Unsupported granularity! Please report a bug at "
812 "flashrom@flashrom.org\n", __func__);
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000813 }
814 return result;
815}
816
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000817/**
818 * Check if the buffer @have needs to be programmed to get the content of @want.
819 * If yes, return 1 and fill in first_start with the start address of the
820 * write operation and first_len with the length of the first to-be-written
821 * chunk. If not, return 0 and leave first_start and first_len undefined.
822 *
823 * Warning: This function assumes that @have and @want point to naturally
824 * aligned regions.
825 *
826 * @have buffer with current content
827 * @want buffer with desired content
828 * @len length of the checked area
829 * @gran write granularity (enum, not count)
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000830 * @first_start offset of the first byte which needs to be written (passed in
831 * value is increased by the offset of the first needed write
832 * relative to have/want or unchanged if no write is needed)
833 * @return length of the first contiguous area which needs to be written
834 * 0 if no write is needed
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000835 *
836 * FIXME: This function needs a parameter which tells it about coalescing
837 * in relation to the max write length of the programmer and the max write
838 * length of the chip.
839 */
Mark Marshallf20b7be2014-05-09 21:16:21 +0000840static unsigned int get_next_write(const uint8_t *have, const uint8_t *want, unsigned int len,
Stefan Taunerc69c9c82011-11-23 09:13:48 +0000841 unsigned int *first_start,
842 enum write_granularity gran)
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000843{
Stefan Taunerc69c9c82011-11-23 09:13:48 +0000844 int need_write = 0;
845 unsigned int rel_start = 0, first_len = 0;
846 unsigned int i, limit, stride;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000847
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000848 switch (gran) {
849 case write_gran_1bit:
850 case write_gran_1byte:
Carl-Daniel Hailfinger1b0e9fc2014-06-16 22:36:17 +0000851 case write_gran_1byte_implicit_erase:
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000852 stride = 1;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000853 break;
Paul Kocialkowskic8305e12015-10-16 02:16:20 +0000854 case write_gran_128bytes:
855 stride = 128;
856 break;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000857 case write_gran_256bytes:
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000858 stride = 256;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000859 break;
Stefan Tauner02437452013-04-01 19:34:53 +0000860 case write_gran_264bytes:
861 stride = 264;
862 break;
863 case write_gran_512bytes:
864 stride = 512;
865 break;
866 case write_gran_528bytes:
867 stride = 528;
868 break;
869 case write_gran_1024bytes:
870 stride = 1024;
871 break;
872 case write_gran_1056bytes:
873 stride = 1056;
874 break;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000875 default:
876 msg_cerr("%s: Unsupported granularity! Please report a bug at "
877 "flashrom@flashrom.org\n", __func__);
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000878 /* Claim that no write was needed. A write with unknown
879 * granularity is too dangerous to try.
880 */
881 return 0;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000882 }
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000883 for (i = 0; i < len / stride; i++) {
884 limit = min(stride, len - i * stride);
885 /* Are 'have' and 'want' identical? */
886 if (memcmp(have + i * stride, want + i * stride, limit)) {
887 if (!need_write) {
888 /* First location where have and want differ. */
889 need_write = 1;
890 rel_start = i * stride;
891 }
892 } else {
893 if (need_write) {
894 /* First location where have and want
895 * do not differ anymore.
896 */
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000897 break;
898 }
899 }
900 }
Carl-Daniel Hailfinger202bf532010-12-06 13:05:44 +0000901 if (need_write)
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000902 first_len = min(i * stride - rel_start, len);
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000903 *first_start += rel_start;
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000904 return first_len;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000905}
906
Carl-Daniel Hailfingereaac68b2009-11-23 12:55:31 +0000907/* This function generates various test patterns useful for testing controller
908 * and chip communication as well as chip behaviour.
909 *
910 * If a byte can be written multiple times, each time keeping 0-bits at 0
911 * and changing 1-bits to 0 if the new value for that bit is 0, the effect
912 * is essentially an AND operation. That's also the reason why this function
913 * provides the result of AND between various patterns.
914 *
915 * Below is a list of patterns (and their block length).
916 * Pattern 0 is 05 15 25 35 45 55 65 75 85 95 a5 b5 c5 d5 e5 f5 (16 Bytes)
917 * Pattern 1 is 0a 1a 2a 3a 4a 5a 6a 7a 8a 9a aa ba ca da ea fa (16 Bytes)
918 * Pattern 2 is 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f (16 Bytes)
919 * Pattern 3 is a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af (16 Bytes)
920 * Pattern 4 is 00 10 20 30 40 50 60 70 80 90 a0 b0 c0 d0 e0 f0 (16 Bytes)
921 * Pattern 5 is 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f (16 Bytes)
922 * Pattern 6 is 00 (1 Byte)
923 * Pattern 7 is ff (1 Byte)
924 * Patterns 0-7 have a big-endian block number in the last 2 bytes of each 256
925 * byte block.
926 *
927 * Pattern 8 is 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11... (256 B)
928 * Pattern 9 is ff fe fd fc fb fa f9 f8 f7 f6 f5 f4 f3 f2 f1 f0 ef ee... (256 B)
929 * Pattern 10 is 00 00 00 01 00 02 00 03 00 04... (128 kB big-endian counter)
930 * Pattern 11 is ff ff ff fe ff fd ff fc ff fb... (128 kB big-endian downwards)
931 * Pattern 12 is 00 (1 Byte)
932 * Pattern 13 is ff (1 Byte)
933 * Patterns 8-13 have no block number.
934 *
935 * Patterns 0-3 are created to detect and efficiently diagnose communication
936 * slips like missed bits or bytes and their repetitive nature gives good visual
937 * cues to the person inspecting the results. In addition, the following holds:
938 * AND Pattern 0/1 == Pattern 4
939 * AND Pattern 2/3 == Pattern 5
940 * AND Pattern 0/1/2/3 == AND Pattern 4/5 == Pattern 6
941 * A weakness of pattern 0-5 is the inability to detect swaps/copies between
942 * any two 16-byte blocks except for the last 16-byte block in a 256-byte bloc.
943 * They work perfectly for detecting any swaps/aliasing of blocks >= 256 bytes.
944 * 0x5 and 0xa were picked because they are 0101 and 1010 binary.
945 * Patterns 8-9 are best for detecting swaps/aliasing of blocks < 256 bytes.
946 * Besides that, they provide for bit testing of the last two bytes of every
947 * 256 byte block which contains the block number for patterns 0-6.
948 * Patterns 10-11 are special purpose for detecting subblock aliasing with
949 * block sizes >256 bytes (some Dataflash chips etc.)
950 * AND Pattern 8/9 == Pattern 12
951 * AND Pattern 10/11 == Pattern 12
952 * Pattern 13 is the completely erased state.
953 * None of the patterns can detect aliasing at boundaries which are a multiple
954 * of 16 MBytes (but such chips do not exist anyway for Parallel/LPC/FWH/SPI).
955 */
956int generate_testpattern(uint8_t *buf, uint32_t size, int variant)
957{
958 int i;
959
960 if (!buf) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000961 msg_gerr("Invalid buffer!\n");
Carl-Daniel Hailfingereaac68b2009-11-23 12:55:31 +0000962 return 1;
963 }
964
965 switch (variant) {
966 case 0:
967 for (i = 0; i < size; i++)
968 buf[i] = (i & 0xf) << 4 | 0x5;
969 break;
970 case 1:
971 for (i = 0; i < size; i++)
972 buf[i] = (i & 0xf) << 4 | 0xa;
973 break;
974 case 2:
975 for (i = 0; i < size; i++)
976 buf[i] = 0x50 | (i & 0xf);
977 break;
978 case 3:
979 for (i = 0; i < size; i++)
980 buf[i] = 0xa0 | (i & 0xf);
981 break;
982 case 4:
983 for (i = 0; i < size; i++)
984 buf[i] = (i & 0xf) << 4;
985 break;
986 case 5:
987 for (i = 0; i < size; i++)
988 buf[i] = i & 0xf;
989 break;
990 case 6:
991 memset(buf, 0x00, size);
992 break;
993 case 7:
994 memset(buf, 0xff, size);
995 break;
996 case 8:
997 for (i = 0; i < size; i++)
998 buf[i] = i & 0xff;
999 break;
1000 case 9:
1001 for (i = 0; i < size; i++)
1002 buf[i] = ~(i & 0xff);
1003 break;
1004 case 10:
1005 for (i = 0; i < size % 2; i++) {
1006 buf[i * 2] = (i >> 8) & 0xff;
1007 buf[i * 2 + 1] = i & 0xff;
1008 }
1009 if (size & 0x1)
1010 buf[i * 2] = (i >> 8) & 0xff;
1011 break;
1012 case 11:
1013 for (i = 0; i < size % 2; i++) {
1014 buf[i * 2] = ~((i >> 8) & 0xff);
1015 buf[i * 2 + 1] = ~(i & 0xff);
1016 }
1017 if (size & 0x1)
1018 buf[i * 2] = ~((i >> 8) & 0xff);
1019 break;
1020 case 12:
1021 memset(buf, 0x00, size);
1022 break;
1023 case 13:
1024 memset(buf, 0xff, size);
1025 break;
1026 }
1027
1028 if ((variant >= 0) && (variant <= 7)) {
1029 /* Write block number in the last two bytes of each 256-byte
1030 * block, big endian for easier reading of the hexdump.
1031 * Note that this wraps around for chips larger than 2^24 bytes
1032 * (16 MB).
1033 */
1034 for (i = 0; i < size / 256; i++) {
1035 buf[i * 256 + 254] = (i >> 8) & 0xff;
1036 buf[i * 256 + 255] = i & 0xff;
1037 }
1038 }
1039
1040 return 0;
1041}
1042
Stefan Tauner9e3a6982014-08-15 17:17:59 +00001043/* Returns the number of busses commonly supported by the current programmer and flash chip where the latter
1044 * can not be completely accessed due to size/address limits of the programmer. */
1045unsigned int count_max_decode_exceedings(const struct flashctx *flash)
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001046{
Stefan Tauner9e3a6982014-08-15 17:17:59 +00001047 unsigned int limitexceeded = 0;
1048 uint32_t size = flash->chip->total_size * 1024;
1049 enum chipbustype buses = flash->mst->buses_supported & flash->chip->bustype;
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001050
1051 if ((buses & BUS_PARALLEL) && (max_rom_decode.parallel < size)) {
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001052 limitexceeded++;
Sean Nelson316a29f2010-05-07 20:09:04 +00001053 msg_pdbg("Chip size %u kB is bigger than supported "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001054 "size %u kB of chipset/board/programmer "
1055 "for %s interface, "
1056 "probe/read/erase/write may fail. ", size / 1024,
1057 max_rom_decode.parallel / 1024, "Parallel");
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001058 }
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001059 if ((buses & BUS_LPC) && (max_rom_decode.lpc < size)) {
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001060 limitexceeded++;
Sean Nelson316a29f2010-05-07 20:09:04 +00001061 msg_pdbg("Chip size %u kB is bigger than supported "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001062 "size %u kB of chipset/board/programmer "
1063 "for %s interface, "
1064 "probe/read/erase/write may fail. ", size / 1024,
1065 max_rom_decode.lpc / 1024, "LPC");
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001066 }
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001067 if ((buses & BUS_FWH) && (max_rom_decode.fwh < size)) {
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001068 limitexceeded++;
Sean Nelson316a29f2010-05-07 20:09:04 +00001069 msg_pdbg("Chip size %u kB is bigger than supported "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001070 "size %u kB of chipset/board/programmer "
1071 "for %s interface, "
1072 "probe/read/erase/write may fail. ", size / 1024,
1073 max_rom_decode.fwh / 1024, "FWH");
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001074 }
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001075 if ((buses & BUS_SPI) && (max_rom_decode.spi < size)) {
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001076 limitexceeded++;
Sean Nelson316a29f2010-05-07 20:09:04 +00001077 msg_pdbg("Chip size %u kB is bigger than supported "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001078 "size %u kB of chipset/board/programmer "
1079 "for %s interface, "
1080 "probe/read/erase/write may fail. ", size / 1024,
1081 max_rom_decode.spi / 1024, "SPI");
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001082 }
Stefan Tauner9e3a6982014-08-15 17:17:59 +00001083 return limitexceeded;
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001084}
1085
Stefan Tauner4e32ec12014-08-30 23:39:51 +00001086void unmap_flash(struct flashctx *flash)
1087{
1088 if (flash->virtual_registers != (chipaddr)ERROR_PTR) {
1089 programmer_unmap_flash_region((void *)flash->virtual_registers, flash->chip->total_size * 1024);
1090 flash->physical_registers = 0;
1091 flash->virtual_registers = (chipaddr)ERROR_PTR;
1092 }
1093
1094 if (flash->virtual_memory != (chipaddr)ERROR_PTR) {
1095 programmer_unmap_flash_region((void *)flash->virtual_memory, flash->chip->total_size * 1024);
1096 flash->physical_memory = 0;
1097 flash->virtual_memory = (chipaddr)ERROR_PTR;
1098 }
1099}
1100
1101int map_flash(struct flashctx *flash)
1102{
1103 /* Init pointers to the fail-safe state to distinguish them later from legit values. */
1104 flash->virtual_memory = (chipaddr)ERROR_PTR;
1105 flash->virtual_registers = (chipaddr)ERROR_PTR;
1106
1107 /* FIXME: This avoids mapping (and unmapping) of flash chip definitions with size 0.
1108 * These are used for various probing-related hacks that would not map successfully anyway and should be
1109 * removed ASAP. */
1110 if (flash->chip->total_size == 0)
1111 return 0;
1112
1113 const chipsize_t size = flash->chip->total_size * 1024;
1114 uintptr_t base = flashbase ? flashbase : (0xffffffff - size + 1);
1115 void *addr = programmer_map_flash_region(flash->chip->name, base, size);
1116 if (addr == ERROR_PTR) {
1117 msg_perr("Could not map flash chip %s at 0x%0*" PRIxPTR ".\n",
1118 flash->chip->name, PRIxPTR_WIDTH, base);
1119 return 1;
1120 }
1121 flash->physical_memory = base;
1122 flash->virtual_memory = (chipaddr)addr;
1123
1124 /* FIXME: Special function registers normally live 4 MByte below flash space, but it might be somewhere
1125 * completely different on some chips and programmers, or not mappable at all.
1126 * Ignore these problems for now and always report success. */
1127 if (flash->chip->feature_bits & FEATURE_REGISTERMAP) {
1128 base = 0xffffffff - size - 0x400000 + 1;
1129 addr = programmer_map_flash_region("flash chip registers", base, size);
1130 if (addr == ERROR_PTR) {
1131 msg_pdbg2("Could not map flash chip registers %s at 0x%0*" PRIxPTR ".\n",
1132 flash->chip->name, PRIxPTR_WIDTH, base);
1133 return 0;
1134 }
1135 flash->physical_registers = base;
1136 flash->virtual_registers = (chipaddr)addr;
1137 }
1138 return 0;
1139}
1140
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +00001141int probe_flash(struct registered_master *mst, int startchip, struct flashctx *flash, int force)
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001142{
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001143 const struct flashchip *chip;
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001144 enum chipbustype buses_common;
Carl-Daniel Hailfingerb22918c2009-06-01 02:08:58 +00001145 char *tmp;
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001146
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001147 for (chip = flashchips + startchip; chip && chip->name; chip++) {
1148 if (chip_to_probe && strcmp(chip->name, chip_to_probe) != 0)
Ollie Lhocbbf1252004-03-17 22:22:08 +00001149 continue;
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +00001150 buses_common = mst->buses_supported & chip->bustype;
Carl-Daniel Hailfingerc40cff72011-12-20 00:19:29 +00001151 if (!buses_common)
Carl-Daniel Hailfinger6573b742011-06-17 22:38:53 +00001152 continue;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001153 msg_gdbg("Probing for %s %s, %d kB: ", chip->vendor, chip->name, chip->total_size);
1154 if (!chip->probe && !force) {
1155 msg_gdbg("failed! flashrom has no probe function for this flash chip.\n");
Carl-Daniel Hailfingerb22918c2009-06-01 02:08:58 +00001156 continue;
1157 }
Stefan Reinauer70385642007-04-06 11:58:03 +00001158
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001159 /* Start filling in the dynamic data. */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001160 flash->chip = calloc(1, sizeof(struct flashchip));
1161 if (!flash->chip) {
1162 msg_gerr("Out of memory!\n");
1163 exit(1);
1164 }
1165 memcpy(flash->chip, chip, sizeof(struct flashchip));
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +00001166 flash->mst = mst;
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001167
Stefan Tauner4e32ec12014-08-30 23:39:51 +00001168 if (map_flash(flash) != 0)
1169 return -1;
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001170
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001171 /* We handle a forced match like a real match, we just avoid probing. Note that probe_flash()
1172 * is only called with force=1 after normal probing failed.
1173 */
Peter Stuge27c3e2d2008-07-02 17:15:47 +00001174 if (force)
1175 break;
Stefan Reinauerfcb63682006-03-16 16:57:41 +00001176
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001177 if (flash->chip->probe(flash) != 1)
Peter Stuge483b8f02008-09-03 23:10:05 +00001178 goto notfound;
1179
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001180 /* If this is the first chip found, accept it.
1181 * If this is not the first chip found, accept it only if it is
Stefan Taunerac1b4c82012-02-17 14:51:04 +00001182 * a non-generic match. SFDP and CFI are generic matches.
1183 * startchip==0 means this call to probe_flash() is the first
Carl-Daniel Hailfingera5bcbce2014-07-19 22:03:29 +00001184 * one for this programmer interface (master) and thus no other chip has
Stefan Taunerac1b4c82012-02-17 14:51:04 +00001185 * been found on this interface.
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001186 */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001187 if (startchip == 0 && flash->chip->model_id == SFDP_DEVICE_ID) {
Stefan Taunerac1b4c82012-02-17 14:51:04 +00001188 msg_cinfo("===\n"
1189 "SFDP has autodetected a flash chip which is "
1190 "not natively supported by flashrom yet.\n");
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001191 if (count_usable_erasers(flash) == 0)
Stefan Taunerac1b4c82012-02-17 14:51:04 +00001192 msg_cinfo("The standard operations read and "
1193 "verify should work, but to support "
1194 "erase, write and all other "
1195 "possible features");
1196 else
1197 msg_cinfo("All standard operations (read, "
1198 "verify, erase and write) should "
1199 "work, but to support all possible "
1200 "features");
1201
Stefan Taunerb4e06bd2012-08-20 00:24:22 +00001202 msg_cinfo(" we need to add them manually.\n"
1203 "You can help us by mailing us the output of the following command to "
1204 "flashrom@flashrom.org:\n"
1205 "'flashrom -VV [plus the -p/--programmer parameter]'\n"
1206 "Thanks for your help!\n"
Stefan Taunerac1b4c82012-02-17 14:51:04 +00001207 "===\n");
1208 }
1209
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001210 /* First flash chip detected on this bus. */
1211 if (startchip == 0)
Peter Stuge27c3e2d2008-07-02 17:15:47 +00001212 break;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001213 /* Not the first flash chip detected on this bus, but not a generic match either. */
1214 if ((flash->chip->model_id != GENERIC_DEVICE_ID) && (flash->chip->model_id != SFDP_DEVICE_ID))
1215 break;
1216 /* 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 +00001217notfound:
Stefan Tauner4e32ec12014-08-30 23:39:51 +00001218 unmap_flash(flash);
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001219 free(flash->chip);
1220 flash->chip = NULL;
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001221 }
Uwe Hermannffec5f32007-08-23 16:08:21 +00001222
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001223 if (!flash->chip)
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001224 return -1;
Peter Stuge27c3e2d2008-07-02 17:15:47 +00001225
Stefan Reinauer051e2362011-01-19 06:21:54 +00001226
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001227 tmp = flashbuses_to_text(flash->chip->bustype);
Stefan Tauner4e32ec12014-08-30 23:39:51 +00001228 msg_cinfo("%s %s flash chip \"%s\" (%d kB, %s) ", force ? "Assuming" : "Found",
1229 flash->chip->vendor, flash->chip->name, flash->chip->total_size, tmp);
Stefan Tauner00155492011-06-26 20:45:35 +00001230 free(tmp);
Stefan Tauner4e32ec12014-08-30 23:39:51 +00001231#if CONFIG_INTERNAL == 1
1232 if (programmer_table[programmer].map_flash_region == physmap)
1233 msg_cinfo("mapped at physical address 0x%0*" PRIxPTR ".\n",
1234 PRIxPTR_WIDTH, flash->physical_memory);
1235 else
1236#endif
1237 msg_cinfo("on %s.\n", programmer_table[programmer].name);
Uwe Hermann9899cad2009-06-28 21:47:57 +00001238
Stefan Tauner4e32ec12014-08-30 23:39:51 +00001239 /* Flash registers may more likely not be mapped if the chip was forced.
1240 * Lock info may be stored in registers, so avoid lock info printing. */
Carl-Daniel Hailfinger859f3f02010-12-02 21:59:42 +00001241 if (!force)
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001242 if (flash->chip->printlock)
1243 flash->chip->printlock(flash);
Sean Nelson6e0b9122010-02-19 00:52:10 +00001244
Stefan Tauner4e32ec12014-08-30 23:39:51 +00001245 /* Get out of the way for later runs. */
1246 unmap_flash(flash);
1247
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001248 /* Return position of matching chip. */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001249 return chip - flashchips;
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001250}
1251
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001252int read_buf_from_file(unsigned char *buf, unsigned long size,
1253 const char *filename)
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001254{
Nico Huber7562f7d2013-08-30 21:29:45 +00001255#ifdef __LIBPAYLOAD__
1256 msg_gerr("Error: No file I/O support in libpayload\n");
1257 return 1;
1258#else
Stefan Tauner16687702015-12-25 21:59:45 +00001259 int ret = 0;
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001260
Stefan Tauner16687702015-12-25 21:59:45 +00001261 FILE *image;
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001262 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 }
Stefan Tauner16687702015-12-25 21:59:45 +00001266
1267 struct stat image_stat;
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001268 if (fstat(fileno(image), &image_stat) != 0) {
Stefan Tauner363fd7e2013-04-07 13:08:30 +00001269 msg_gerr("Error: getting metadata of file \"%s\" failed: %s\n", filename, strerror(errno));
Stefan Tauner16687702015-12-25 21:59:45 +00001270 ret = 1;
1271 goto out;
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001272 }
1273 if (image_stat.st_size != size) {
Carl-Daniel Hailfinger11990da2013-07-13 23:21:05 +00001274 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 +00001275 (intmax_t)image_stat.st_size, size);
Stefan Tauner16687702015-12-25 21:59:45 +00001276 ret = 1;
1277 goto out;
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001278 }
Stefan Tauner16687702015-12-25 21:59:45 +00001279
1280 unsigned long numbytes = fread(buf, 1, size, image);
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001281 if (numbytes != size) {
1282 msg_gerr("Error: Failed to read complete file. Got %ld bytes, "
1283 "wanted %ld!\n", numbytes, size);
Stefan Tauner16687702015-12-25 21:59:45 +00001284 ret = 1;
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001285 }
Stefan Tauner16687702015-12-25 21:59:45 +00001286out:
1287 (void)fclose(image);
1288 return ret;
Nico Huber7562f7d2013-08-30 21:29:45 +00001289#endif
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001290}
1291
Mark Marshallf20b7be2014-05-09 21:16:21 +00001292int write_buf_to_file(const unsigned char *buf, unsigned long size, const char *filename)
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001293{
Nico Huber7562f7d2013-08-30 21:29:45 +00001294#ifdef __LIBPAYLOAD__
1295 msg_gerr("Error: No file I/O support in libpayload\n");
1296 return 1;
1297#else
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001298 FILE *image;
Stefan Tauner16687702015-12-25 21:59:45 +00001299 int ret = 0;
Stephan Guilloux21dd55b2009-06-01 22:07:52 +00001300
1301 if (!filename) {
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001302 msg_gerr("No filename specified.\n");
Stephan Guilloux21dd55b2009-06-01 22:07:52 +00001303 return 1;
1304 }
Patrick Georgi0bf842d2010-01-25 22:55:33 +00001305 if ((image = fopen(filename, "wb")) == NULL) {
Stefan Tauner363fd7e2013-04-07 13:08:30 +00001306 msg_gerr("Error: opening file \"%s\" failed: %s\n", filename, strerror(errno));
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00001307 return 1;
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001308 }
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001309
Stefan Tauner16687702015-12-25 21:59:45 +00001310 unsigned long numbytes = fwrite(buf, 1, size, image);
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001311 if (numbytes != size) {
Stefan Tauner16687702015-12-25 21:59:45 +00001312 msg_gerr("Error: file %s could not be written completely.\n", filename);
1313 ret = 1;
1314 goto out;
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001315 }
Stefan Tauner16687702015-12-25 21:59:45 +00001316 if (fflush(image)) {
1317 msg_gerr("Error: flushing file \"%s\" failed: %s\n", filename, strerror(errno));
1318 ret = 1;
1319 }
1320 // Try to fsync() only regular files and if that function is available at all (e.g. not on MinGW).
1321#if defined(_POSIX_FSYNC) && (_POSIX_FSYNC != -1)
1322 struct stat image_stat;
1323 if (fstat(fileno(image), &image_stat) != 0) {
1324 msg_gerr("Error: getting metadata of file \"%s\" failed: %s\n", filename, strerror(errno));
1325 ret = 1;
1326 goto out;
1327 }
1328 if (S_ISREG(image_stat.st_mode)) {
1329 if (fsync(fileno(image))) {
1330 msg_gerr("Error: fsyncing file \"%s\" failed: %s\n", filename, strerror(errno));
1331 ret = 1;
1332 }
1333 }
1334#endif
1335out:
1336 if (fclose(image)) {
1337 msg_gerr("Error: closing file \"%s\" failed: %s\n", filename, strerror(errno));
1338 ret = 1;
1339 }
1340 return ret;
Nico Huber7562f7d2013-08-30 21:29:45 +00001341#endif
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001342}
1343
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001344int read_flash_to_file(struct flashctx *flash, const char *filename)
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001345{
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001346 unsigned long size = flash->chip->total_size * 1024;
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001347 unsigned char *buf = calloc(size, sizeof(char));
1348 int ret = 0;
1349
1350 msg_cinfo("Reading flash... ");
1351 if (!buf) {
1352 msg_gerr("Memory allocation failed!\n");
1353 msg_cinfo("FAILED.\n");
1354 return 1;
1355 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001356 if (!flash->chip->read) {
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001357 msg_cerr("No read function available for this flash chip.\n");
1358 ret = 1;
1359 goto out_free;
1360 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001361 if (flash->chip->read(flash, buf, 0, size)) {
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001362 msg_cerr("Read operation failed!\n");
1363 ret = 1;
1364 goto out_free;
1365 }
1366
Stefan Tauner355cbfd2011-05-28 02:37:14 +00001367 ret = write_buf_to_file(buf, size, filename);
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001368out_free:
1369 free(buf);
1370 msg_cinfo("%s.\n", ret ? "FAILED" : "done");
1371 return ret;
1372}
1373
Stefan Tauner96658be2014-05-26 22:05:31 +00001374/* Even if an error is found, the function will keep going and check the rest. */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001375static int selfcheck_eraseblocks(const struct flashchip *chip)
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001376{
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +00001377 int i, j, k;
1378 int ret = 0;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001379
1380 for (k = 0; k < NUM_ERASEFUNCTIONS; k++) {
1381 unsigned int done = 0;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001382 struct block_eraser eraser = chip->block_erasers[k];
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001383
1384 for (i = 0; i < NUM_ERASEREGIONS; i++) {
1385 /* Blocks with zero size are bugs in flashchips.c. */
1386 if (eraser.eraseblocks[i].count &&
1387 !eraser.eraseblocks[i].size) {
1388 msg_gerr("ERROR: Flash chip %s erase function "
1389 "%i region %i has size 0. Please report"
1390 " a bug at flashrom@flashrom.org\n",
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001391 chip->name, k, i);
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001392 ret = 1;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001393 }
1394 /* Blocks with zero count are bugs in flashchips.c. */
1395 if (!eraser.eraseblocks[i].count &&
1396 eraser.eraseblocks[i].size) {
1397 msg_gerr("ERROR: Flash chip %s erase function "
1398 "%i region %i has count 0. Please report"
1399 " a bug at flashrom@flashrom.org\n",
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001400 chip->name, k, i);
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001401 ret = 1;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001402 }
1403 done += eraser.eraseblocks[i].count *
1404 eraser.eraseblocks[i].size;
1405 }
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001406 /* Empty eraseblock definition with erase function. */
1407 if (!done && eraser.block_erase)
Sean Nelson316a29f2010-05-07 20:09:04 +00001408 msg_gspew("Strange: Empty eraseblock definition with "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001409 "non-empty erase function. Not an error.\n");
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001410 if (!done)
1411 continue;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001412 if (done != chip->total_size * 1024) {
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001413 msg_gerr("ERROR: Flash chip %s erase function %i "
1414 "region walking resulted in 0x%06x bytes total,"
1415 " expected 0x%06x bytes. Please report a bug at"
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001416 " flashrom@flashrom.org\n", chip->name, k,
1417 done, chip->total_size * 1024);
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001418 ret = 1;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001419 }
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001420 if (!eraser.block_erase)
1421 continue;
1422 /* Check if there are identical erase functions for different
1423 * layouts. That would imply "magic" erase functions. The
1424 * easiest way to check this is with function pointers.
1425 */
Uwe Hermann43959702010-03-13 17:28:29 +00001426 for (j = k + 1; j < NUM_ERASEFUNCTIONS; j++) {
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001427 if (eraser.block_erase ==
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001428 chip->block_erasers[j].block_erase) {
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001429 msg_gerr("ERROR: Flash chip %s erase function "
1430 "%i and %i are identical. Please report"
1431 " a bug at flashrom@flashrom.org\n",
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001432 chip->name, k, j);
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001433 ret = 1;
1434 }
Uwe Hermann43959702010-03-13 17:28:29 +00001435 }
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001436 }
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001437 return ret;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001438}
1439
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001440static int erase_and_write_block_helper(struct flashctx *flash,
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001441 unsigned int start, unsigned int len,
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001442 uint8_t *curcontents,
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001443 uint8_t *newcontents,
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001444 int (*erasefn) (struct flashctx *flash,
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001445 unsigned int addr,
1446 unsigned int len))
1447{
Stefan Taunerc69c9c82011-11-23 09:13:48 +00001448 unsigned int starthere = 0, lenhere = 0;
1449 int ret = 0, skip = 1, writecount = 0;
Stefan Tauner50d67aa2013-03-03 23:49:48 +00001450 enum write_granularity gran = flash->chip->gran;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001451
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001452 /* curcontents and newcontents are opaque to walk_eraseregions, and
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001453 * need to be adjusted here to keep the impression of proper abstraction
1454 */
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001455 curcontents += start;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001456 newcontents += start;
1457 msg_cdbg(":");
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001458 if (need_erase(curcontents, newcontents, len, gran)) {
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001459 msg_cdbg("E");
1460 ret = erasefn(flash, start, len);
1461 if (ret)
1462 return ret;
Carl-Daniel Hailfingerb4061f62011-06-26 17:04:16 +00001463 if (check_erased_range(flash, start, len)) {
1464 msg_cerr("ERASE FAILED!\n");
1465 return -1;
1466 }
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001467 /* Erase was successful. Adjust curcontents. */
1468 memset(curcontents, 0xff, len);
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001469 skip = 0;
1470 }
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001471 /* get_next_write() sets starthere to a new value after the call. */
1472 while ((lenhere = get_next_write(curcontents + starthere,
1473 newcontents + starthere,
1474 len - starthere, &starthere, gran))) {
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001475 if (!writecount++)
1476 msg_cdbg("W");
1477 /* Needs the partial write function signature. */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001478 ret = flash->chip->write(flash, newcontents + starthere,
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001479 start + starthere, lenhere);
1480 if (ret)
1481 return ret;
1482 starthere += lenhere;
1483 skip = 0;
1484 }
1485 if (skip)
1486 msg_cdbg("S");
Stefan Tauner682122b2013-06-23 22:15:39 +00001487 else
1488 all_skipped = false;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001489 return ret;
1490}
1491
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001492static int walk_eraseregions(struct flashctx *flash, int erasefunction,
1493 int (*do_something) (struct flashctx *flash,
Carl-Daniel Hailfinger4d3e9ca2010-07-13 00:42:00 +00001494 unsigned int addr,
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001495 unsigned int len,
1496 uint8_t *param1,
1497 uint8_t *param2,
1498 int (*erasefn) (
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001499 struct flashctx *flash,
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001500 unsigned int addr,
1501 unsigned int len)),
1502 void *param1, void *param2)
Carl-Daniel Hailfingera1223412010-07-13 00:37:19 +00001503{
1504 int i, j;
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +00001505 unsigned int start = 0;
1506 unsigned int len;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001507 struct block_eraser eraser = flash->chip->block_erasers[erasefunction];
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001508
Carl-Daniel Hailfingera1223412010-07-13 00:37:19 +00001509 for (i = 0; i < NUM_ERASEREGIONS; i++) {
1510 /* count==0 for all automatically initialized array
1511 * members so the loop below won't be executed for them.
1512 */
1513 len = eraser.eraseblocks[i].size;
1514 for (j = 0; j < eraser.eraseblocks[i].count; j++) {
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001515 /* Print this for every block except the first one. */
1516 if (i || j)
1517 msg_cdbg(", ");
1518 msg_cdbg("0x%06x-0x%06x", start,
Carl-Daniel Hailfingera1223412010-07-13 00:37:19 +00001519 start + len - 1);
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001520 if (do_something(flash, start, len, param1, param2,
1521 eraser.block_erase)) {
Carl-Daniel Hailfingera1223412010-07-13 00:37:19 +00001522 return 1;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001523 }
Carl-Daniel Hailfingera1223412010-07-13 00:37:19 +00001524 start += len;
1525 }
1526 }
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001527 msg_cdbg("\n");
Carl-Daniel Hailfingera1223412010-07-13 00:37:19 +00001528 return 0;
1529}
1530
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001531static int check_block_eraser(const struct flashctx *flash, int k, int log)
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001532{
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001533 struct block_eraser eraser = flash->chip->block_erasers[k];
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001534
1535 if (!eraser.block_erase && !eraser.eraseblocks[0].count) {
1536 if (log)
1537 msg_cdbg("not defined. ");
1538 return 1;
1539 }
1540 if (!eraser.block_erase && eraser.eraseblocks[0].count) {
1541 if (log)
1542 msg_cdbg("eraseblock layout is known, but matching "
Stefan Tauner355cbfd2011-05-28 02:37:14 +00001543 "block erase function is not implemented. ");
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001544 return 1;
1545 }
1546 if (eraser.block_erase && !eraser.eraseblocks[0].count) {
1547 if (log)
1548 msg_cdbg("block erase function found, but "
Stefan Tauner355cbfd2011-05-28 02:37:14 +00001549 "eraseblock layout is not defined. ");
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001550 return 1;
1551 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001552 // TODO: Once erase functions are annotated with allowed buses, check that as well.
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001553 return 0;
1554}
1555
Mark Marshallf20b7be2014-05-09 21:16:21 +00001556int erase_and_write_flash(struct flashctx *flash, uint8_t *oldcontents, uint8_t *newcontents)
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001557{
Carl-Daniel Hailfingerd8334db2011-07-21 21:21:04 +00001558 int k, ret = 1;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001559 uint8_t *curcontents;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001560 unsigned long size = flash->chip->total_size * 1024;
Sylvain "ythier" Hitier9db45512011-07-04 07:27:17 +00001561 unsigned int usable_erasefunctions = count_usable_erasers(flash);
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001562
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001563 msg_cinfo("Erasing and writing flash chip... ");
Stefan Tauner269de352011-07-12 22:35:21 +00001564 curcontents = malloc(size);
1565 if (!curcontents) {
1566 msg_gerr("Out of memory!\n");
1567 exit(1);
1568 }
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001569 /* Copy oldcontents to curcontents to avoid clobbering oldcontents. */
1570 memcpy(curcontents, oldcontents, size);
1571
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001572 for (k = 0; k < NUM_ERASEFUNCTIONS; k++) {
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001573 if (k != 0)
Stefan Tauner16878542014-07-13 23:53:40 +00001574 msg_cinfo("Looking for another erase function.\n");
Carl-Daniel Hailfingerd8334db2011-07-21 21:21:04 +00001575 if (!usable_erasefunctions) {
Stefan Tauner16878542014-07-13 23:53:40 +00001576 msg_cinfo("No usable erase functions left.\n");
Carl-Daniel Hailfingerd8334db2011-07-21 21:21:04 +00001577 break;
1578 }
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001579 msg_cdbg("Trying erase function %i... ", k);
1580 if (check_block_eraser(flash, k, 1))
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001581 continue;
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001582 usable_erasefunctions--;
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001583 ret = walk_eraseregions(flash, k, &erase_and_write_block_helper,
1584 curcontents, newcontents);
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001585 /* If everything is OK, don't try another erase function. */
1586 if (!ret)
1587 break;
Carl-Daniel Hailfingerb23b1eb2010-12-02 02:41:55 +00001588 /* Write/erase failed, so try to find out what the current chip
Carl-Daniel Hailfingerd8334db2011-07-21 21:21:04 +00001589 * contents are. If no usable erase functions remain, we can
1590 * skip this: the next iteration will break immediately anyway.
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001591 */
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001592 if (!usable_erasefunctions)
1593 continue;
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001594 /* Reading the whole chip may take a while, inform the user even
1595 * in non-verbose mode.
1596 */
1597 msg_cinfo("Reading current flash chip contents... ");
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001598 if (flash->chip->read(flash, curcontents, 0, size)) {
Carl-Daniel Hailfingerb23b1eb2010-12-02 02:41:55 +00001599 /* Now we are truly screwed. Read failed as well. */
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001600 msg_cerr("Can't read anymore! Aborting.\n");
Carl-Daniel Hailfingerb23b1eb2010-12-02 02:41:55 +00001601 /* We have no idea about the flash chip contents, so
1602 * retrying with another erase function is pointless.
1603 */
1604 break;
1605 }
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001606 msg_cinfo("done. ");
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001607 }
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001608 /* Free the scratchpad. */
1609 free(curcontents);
Carl-Daniel Hailfingerf160a122009-05-08 17:15:15 +00001610
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001611 if (ret) {
Sean Nelson316a29f2010-05-07 20:09:04 +00001612 msg_cerr("FAILED!\n");
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001613 } else {
Stefan Tauner682122b2013-06-23 22:15:39 +00001614 if (all_skipped)
1615 msg_cinfo("\nWarning: Chip content is identical to the requested image.\n");
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001616 msg_cinfo("Erase/write done.\n");
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001617 }
1618 return ret;
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001619}
1620
Stefan Tauner136388f2013-07-15 10:47:53 +00001621static void nonfatal_help_message(void)
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001622{
Stefan Taunera58f6e92014-05-10 09:25:44 +00001623 msg_gerr("Good, writing to the flash chip apparently didn't do anything.\n");
Stefan Tauner136388f2013-07-15 10:47:53 +00001624#if CONFIG_INTERNAL == 1
1625 if (programmer == PROGRAMMER_INTERNAL)
1626 msg_gerr("This means we have to add special support for your board, programmer or flash\n"
1627 "chip. Please report this on IRC at chat.freenode.net (channel #flashrom) or\n"
1628 "mail flashrom@flashrom.org, thanks!\n"
1629 "-------------------------------------------------------------------------------\n"
1630 "You may now reboot or simply leave the machine running.\n");
1631 else
1632#endif
1633 msg_gerr("Please check the connections (especially those to write protection pins) between\n"
1634 "the programmer and the flash chip. If you think the error is caused by flashrom\n"
1635 "please report this on IRC at chat.freenode.net (channel #flashrom) or\n"
1636 "mail flashrom@flashrom.org, thanks!\n");
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001637}
1638
Stefan Tauner136388f2013-07-15 10:47:53 +00001639static void emergency_help_message(void)
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00001640{
Stefan Tauner136388f2013-07-15 10:47:53 +00001641 msg_gerr("Your flash chip is in an unknown state.\n");
1642#if CONFIG_INTERNAL == 1
1643 if (programmer == PROGRAMMER_INTERNAL)
1644 msg_gerr("Get help on IRC at chat.freenode.net (channel #flashrom) or\n"
1645 "mail flashrom@flashrom.org with the subject \"FAILED: <your board name>\"!\n"
1646 "-------------------------------------------------------------------------------\n"
1647 "DO NOT REBOOT OR POWEROFF!\n");
1648 else
1649#endif
1650 msg_gerr("Please report this on IRC at chat.freenode.net (channel #flashrom) or\n"
1651 "mail flashrom@flashrom.org, thanks!\n");
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00001652}
1653
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001654/* The way to go if you want a delimited list of programmers */
Stefan Tauner66652442011-06-26 17:38:17 +00001655void list_programmers(const char *delim)
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001656{
1657 enum programmer p;
1658 for (p = 0; p < PROGRAMMER_INVALID; p++) {
Sean Nelson316a29f2010-05-07 20:09:04 +00001659 msg_ginfo("%s", programmer_table[p].name);
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001660 if (p < PROGRAMMER_INVALID - 1)
Sean Nelson316a29f2010-05-07 20:09:04 +00001661 msg_ginfo("%s", delim);
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001662 }
Sean Nelson316a29f2010-05-07 20:09:04 +00001663 msg_ginfo("\n");
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001664}
1665
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001666void list_programmers_linebreak(int startcol, int cols, int paren)
1667{
1668 const char *pname;
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +00001669 int pnamelen;
1670 int remaining = 0, firstline = 1;
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001671 enum programmer p;
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +00001672 int i;
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001673
1674 for (p = 0; p < PROGRAMMER_INVALID; p++) {
1675 pname = programmer_table[p].name;
1676 pnamelen = strlen(pname);
1677 if (remaining - pnamelen - 2 < 0) {
1678 if (firstline)
1679 firstline = 0;
1680 else
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001681 msg_ginfo("\n");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001682 for (i = 0; i < startcol; i++)
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001683 msg_ginfo(" ");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001684 remaining = cols - startcol;
1685 } else {
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001686 msg_ginfo(" ");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001687 remaining--;
1688 }
1689 if (paren && (p == 0)) {
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001690 msg_ginfo("(");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001691 remaining--;
1692 }
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001693 msg_ginfo("%s", pname);
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001694 remaining -= pnamelen;
1695 if (p < PROGRAMMER_INVALID - 1) {
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001696 msg_ginfo(",");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001697 remaining--;
1698 } else {
1699 if (paren)
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001700 msg_ginfo(")");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001701 }
1702 }
1703}
1704
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001705void print_sysinfo(void)
1706{
Stefan Taunerb0eee9b2015-01-10 09:32:50 +00001707#if IS_WINDOWS
Carl-Daniel Hailfinger60d9bd22012-08-09 23:34:41 +00001708 SYSTEM_INFO si;
1709 OSVERSIONINFOEX osvi;
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001710
Carl-Daniel Hailfinger60d9bd22012-08-09 23:34:41 +00001711 memset(&si, 0, sizeof(SYSTEM_INFO));
1712 memset(&osvi, 0, sizeof(OSVERSIONINFOEX));
1713 msg_ginfo(" on Windows");
1714 /* Tell Windows which version of the structure we want. */
1715 osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
1716 if (GetVersionEx((OSVERSIONINFO*) &osvi))
1717 msg_ginfo(" %lu.%lu", osvi.dwMajorVersion, osvi.dwMinorVersion);
1718 else
1719 msg_ginfo(" unknown version");
1720 GetSystemInfo(&si);
1721 switch (si.wProcessorArchitecture) {
1722 case PROCESSOR_ARCHITECTURE_AMD64:
1723 msg_ginfo(" (x86_64)");
1724 break;
1725 case PROCESSOR_ARCHITECTURE_INTEL:
1726 msg_ginfo(" (x86)");
1727 break;
1728 default:
1729 msg_ginfo(" (unknown arch)");
1730 break;
1731 }
1732#elif HAVE_UTSNAME == 1
1733 struct utsname osinfo;
1734
1735 uname(&osinfo);
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001736 msg_ginfo(" on %s %s (%s)", osinfo.sysname, osinfo.release,
1737 osinfo.machine);
1738#else
1739 msg_ginfo(" on unknown machine");
1740#endif
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001741}
1742
1743void print_buildinfo(void)
1744{
1745 msg_gdbg("flashrom was built with");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001746#if NEED_PCI == 1
1747#ifdef PCILIB_VERSION
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001748 msg_gdbg(" libpci %s,", PCILIB_VERSION);
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001749#else
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001750 msg_gdbg(" unknown PCI library,");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001751#endif
1752#endif
1753#ifdef __clang__
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001754 msg_gdbg(" LLVM Clang");
Carl-Daniel Hailfingerb51e58e2010-07-17 14:49:30 +00001755#ifdef __clang_version__
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001756 msg_gdbg(" %s,", __clang_version__);
Carl-Daniel Hailfingerb51e58e2010-07-17 14:49:30 +00001757#else
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001758 msg_gdbg(" unknown version (before r102686),");
Carl-Daniel Hailfingerb51e58e2010-07-17 14:49:30 +00001759#endif
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001760#elif defined(__GNUC__)
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001761 msg_gdbg(" GCC");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001762#ifdef __VERSION__
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001763 msg_gdbg(" %s,", __VERSION__);
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001764#else
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001765 msg_gdbg(" unknown version,");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001766#endif
1767#else
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001768 msg_gdbg(" unknown compiler,");
Carl-Daniel Hailfingercceafa22010-05-26 01:45:41 +00001769#endif
1770#if defined (__FLASHROM_LITTLE_ENDIAN__)
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001771 msg_gdbg(" little endian");
Carl-Daniel Hailfinger06b9efa2012-08-07 11:59:59 +00001772#elif defined (__FLASHROM_BIG_ENDIAN__)
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001773 msg_gdbg(" big endian");
Carl-Daniel Hailfinger06b9efa2012-08-07 11:59:59 +00001774#else
1775#error Endianness could not be determined
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001776#endif
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001777 msg_gdbg("\n");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001778}
1779
Bernhard Walle201bde32008-01-21 15:24:22 +00001780void print_version(void)
1781{
Carl-Daniel Hailfinger8841d3e2010-05-15 15:04:37 +00001782 msg_ginfo("flashrom v%s", flashrom_version);
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001783 print_sysinfo();
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001784 msg_ginfo("\n");
Bernhard Walle201bde32008-01-21 15:24:22 +00001785}
1786
Carl-Daniel Hailfinger8841d3e2010-05-15 15:04:37 +00001787void print_banner(void)
1788{
1789 msg_ginfo("flashrom is free software, get the source code at "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001790 "http://www.flashrom.org\n");
Carl-Daniel Hailfinger8841d3e2010-05-15 15:04:37 +00001791 msg_ginfo("\n");
1792}
1793
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001794int selfcheck(void)
1795{
Stefan Tauner96658be2014-05-26 22:05:31 +00001796 unsigned int i;
Stefan Taunera6d96482012-12-26 19:51:23 +00001797 int ret = 0;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001798
1799 /* Safety check. Instead of aborting after the first error, check
1800 * if more errors exist.
1801 */
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001802 if (ARRAY_SIZE(programmer_table) - 1 != PROGRAMMER_INVALID) {
Sean Nelson316a29f2010-05-07 20:09:04 +00001803 msg_gerr("Programmer table miscompilation!\n");
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001804 ret = 1;
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001805 }
Stefan Taunera6d96482012-12-26 19:51:23 +00001806 for (i = 0; i < PROGRAMMER_INVALID; i++) {
1807 const struct programmer_entry p = programmer_table[i];
1808 if (p.name == NULL) {
1809 msg_gerr("All programmers need a valid name, but the one with index %d does not!\n", i);
1810 ret = 1;
1811 /* This might hide other problems with this programmer, but allows for better error
1812 * messages below without jumping through hoops. */
1813 continue;
1814 }
Stefan Tauneraf358d62012-12-27 18:40:26 +00001815 switch (p.type) {
1816 case USB:
1817 case PCI:
1818 case OTHER:
1819 if (p.devs.note == NULL) {
1820 if (strcmp("internal", p.name) == 0)
1821 break; /* This one has its device list stored separately. */
1822 msg_gerr("Programmer %s has neither a device list nor a textual description!\n",
1823 p.name);
1824 ret = 1;
1825 }
1826 break;
1827 default:
1828 msg_gerr("Programmer %s does not have a valid type set!\n", p.name);
1829 ret = 1;
1830 break;
1831 }
Stefan Taunera6d96482012-12-26 19:51:23 +00001832 if (p.init == NULL) {
1833 msg_gerr("Programmer %s does not have a valid init function!\n", p.name);
1834 ret = 1;
1835 }
1836 if (p.delay == NULL) {
1837 msg_gerr("Programmer %s does not have a valid delay function!\n", p.name);
1838 ret = 1;
1839 }
1840 if (p.map_flash_region == NULL) {
1841 msg_gerr("Programmer %s does not have a valid map_flash_region function!\n", p.name);
1842 ret = 1;
1843 }
1844 if (p.unmap_flash_region == NULL) {
1845 msg_gerr("Programmer %s does not have a valid unmap_flash_region function!\n", p.name);
1846 ret = 1;
1847 }
1848 }
Stefan Tauner96658be2014-05-26 22:05:31 +00001849
1850 /* It would be favorable if we could check for the correct layout (especially termination) of various
1851 * constant arrays: flashchips, chipset_enables, board_matches, boards_known, laptops_known.
1852 * They are all defined as externs in this compilation unit so we don't know their sizes which vary
1853 * depending on compiler flags, e.g. the target architecture, and can sometimes be 0.
1854 * For 'flashchips' we export the size explicitly to work around this and to be able to implement the
1855 * checks below. */
Stefan Tauner6697f712014-08-06 15:09:15 +00001856 if (flashchips_size <= 1 || flashchips[flashchips_size - 1].name != NULL) {
Stefan Tauner7bcacb12011-05-26 01:35:19 +00001857 msg_gerr("Flashchips table miscompilation!\n");
1858 ret = 1;
Stefan Tauner96658be2014-05-26 22:05:31 +00001859 } else {
1860 for (i = 0; i < flashchips_size - 1; i++) {
1861 const struct flashchip *chip = &flashchips[i];
1862 if (chip->vendor == NULL || chip->name == NULL || chip->bustype == BUS_NONE) {
1863 ret = 1;
1864 msg_gerr("ERROR: Some field of flash chip #%d (%s) is misconfigured.\n"
1865 "Please report a bug at flashrom@flashrom.org\n", i,
1866 chip->name == NULL ? "unnamed" : chip->name);
1867 }
1868 if (selfcheck_eraseblocks(chip)) {
1869 ret = 1;
1870 }
1871 }
Stefan Tauner7bcacb12011-05-26 01:35:19 +00001872 }
Stefan Tauner7bcacb12011-05-26 01:35:19 +00001873
Stefan Tauner600576b2014-06-12 22:57:36 +00001874#if CONFIG_INTERNAL == 1
1875 ret |= selfcheck_board_enables();
1876#endif
1877
Stefan Tauner96658be2014-05-26 22:05:31 +00001878 /* TODO: implement similar sanity checks for other arrays where deemed necessary. */
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001879 return ret;
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001880}
1881
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001882/* FIXME: This function signature needs to be improved once doit() has a better
1883 * function signature.
1884 */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001885int chip_safety_check(const struct flashctx *flash, int force, int read_it, int write_it, int erase_it,
1886 int verify_it)
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001887{
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001888 const struct flashchip *chip = flash->chip;
1889
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001890 if (!programmer_may_write && (write_it || erase_it)) {
1891 msg_perr("Write/erase is not working yet on your programmer in "
1892 "its current configuration.\n");
1893 /* --force is the wrong approach, but it's the best we can do
1894 * until the generic programmer parameter parser is merged.
1895 */
1896 if (!force)
1897 return 1;
1898 msg_cerr("Continuing anyway.\n");
1899 }
1900
1901 if (read_it || erase_it || write_it || verify_it) {
1902 /* Everything needs read. */
Stefan Tauner6455dff2014-05-26 00:36:24 +00001903 if (chip->tested.read == BAD) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001904 msg_cerr("Read is not working on this chip. ");
1905 if (!force)
1906 return 1;
1907 msg_cerr("Continuing anyway.\n");
1908 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001909 if (!chip->read) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001910 msg_cerr("flashrom has no read function for this "
1911 "flash chip.\n");
1912 return 1;
1913 }
1914 }
1915 if (erase_it || write_it) {
1916 /* Write needs erase. */
Stefan Tauner6455dff2014-05-26 00:36:24 +00001917 if (chip->tested.erase == NA) {
1918 msg_cerr("Erase is not possible on this chip.\n");
1919 return 1;
1920 }
1921 if (chip->tested.erase == BAD) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001922 msg_cerr("Erase is not working on this chip. ");
1923 if (!force)
1924 return 1;
1925 msg_cerr("Continuing anyway.\n");
1926 }
Sylvain "ythier" Hitier9db45512011-07-04 07:27:17 +00001927 if(count_usable_erasers(flash) == 0) {
Stefan Tauner5368dca2011-07-01 00:19:12 +00001928 msg_cerr("flashrom has no erase function for this "
1929 "flash chip.\n");
1930 return 1;
1931 }
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001932 }
1933 if (write_it) {
Stefan Tauner6455dff2014-05-26 00:36:24 +00001934 if (chip->tested.write == NA) {
1935 msg_cerr("Write is not possible on this chip.\n");
1936 return 1;
1937 }
1938 if (chip->tested.write == BAD) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001939 msg_cerr("Write is not working on this chip. ");
1940 if (!force)
1941 return 1;
1942 msg_cerr("Continuing anyway.\n");
1943 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001944 if (!chip->write) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001945 msg_cerr("flashrom has no write function for this "
1946 "flash chip.\n");
1947 return 1;
1948 }
1949 }
1950 return 0;
1951}
1952
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001953/* This function signature is horrible. We need to design a better interface,
1954 * but right now it allows us to split off the CLI code.
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00001955 * Besides that, the function itself is a textbook example of abysmal code flow.
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001956 */
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +00001957int doit(struct flashctx *flash, int force, const char *filename, int read_it,
1958 int write_it, int erase_it, int verify_it)
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001959{
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001960 uint8_t *oldcontents;
1961 uint8_t *newcontents;
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001962 int ret = 0;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001963 unsigned long size = flash->chip->total_size * 1024;
Stefan Tauner73f5bda2014-10-19 07:53:45 +00001964 int read_all_first = 1; /* FIXME: Make this configurable. */
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001965
David Hendricks77f931a2011-05-18 01:30:56 +00001966 if (chip_safety_check(flash, force, read_it, write_it, erase_it, verify_it)) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001967 msg_cerr("Aborting.\n");
Stefan Tauner20da4aa2014-05-07 22:07:23 +00001968 return 1;
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001969 }
1970
Stefan Tauner8268fdb2013-09-23 14:21:06 +00001971 if (normalize_romentries(flash)) {
1972 msg_cerr("Requested regions can not be handled. Aborting.\n");
Stefan Tauner20da4aa2014-05-07 22:07:23 +00001973 return 1;
Stefan Tauner8268fdb2013-09-23 14:21:06 +00001974 }
1975
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001976 /* Given the existence of read locks, we want to unlock for read,
1977 * erase and write.
1978 */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001979 if (flash->chip->unlock)
1980 flash->chip->unlock(flash);
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001981
1982 if (read_it) {
Stefan Tauner20da4aa2014-05-07 22:07:23 +00001983 return read_flash_to_file(flash, filename);
Carl-Daniel Hailfingerd1be52d2010-07-03 12:14:25 +00001984 }
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001985
Stefan Tauner269de352011-07-12 22:35:21 +00001986 oldcontents = malloc(size);
1987 if (!oldcontents) {
1988 msg_gerr("Out of memory!\n");
1989 exit(1);
1990 }
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001991 /* Assume worst case: All bits are 0. */
1992 memset(oldcontents, 0x00, size);
Stefan Tauner269de352011-07-12 22:35:21 +00001993 newcontents = malloc(size);
1994 if (!newcontents) {
1995 msg_gerr("Out of memory!\n");
1996 exit(1);
1997 }
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001998 /* Assume best case: All bits should be 1. */
1999 memset(newcontents, 0xff, size);
2000 /* Side effect of the assumptions above: Default write action is erase
2001 * because newcontents looks like a completely erased chip, and
2002 * oldcontents being completely 0x00 means we have to erase everything
2003 * before we can write.
2004 */
2005
Ollie Lhoefa28582004-12-08 20:10:01 +00002006 if (erase_it) {
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00002007 /* FIXME: Do we really want the scary warning if erase failed?
2008 * After all, after erase the chip is either blank or partially
2009 * blank or it has the old contents. A blank chip won't boot,
2010 * so if the user wanted erase and reboots afterwards, the user
2011 * knows very well that booting won't work.
2012 */
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00002013 if (erase_and_write_flash(flash, oldcontents, newcontents)) {
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00002014 emergency_help_message();
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00002015 ret = 1;
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00002016 }
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00002017 goto out;
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00002018 }
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00002019
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00002020 if (write_it || verify_it) {
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00002021 if (read_buf_from_file(newcontents, size, filename)) {
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00002022 ret = 1;
2023 goto out;
Stefan Reinauer018aca82006-11-21 23:48:51 +00002024 }
2025
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +00002026#if CONFIG_INTERNAL == 1
Stefan Taunerb4e06bd2012-08-20 00:24:22 +00002027 if (programmer == PROGRAMMER_INTERNAL && cb_check_image(newcontents, size) < 0) {
2028 if (force_boardmismatch) {
2029 msg_pinfo("Proceeding anyway because user forced us to.\n");
2030 } else {
2031 msg_perr("Aborting. You can override this with "
2032 "-p internal:boardmismatch=force.\n");
Niklas Söderlund9e423762012-06-16 00:11:16 +00002033 ret = 1;
2034 goto out;
2035 }
Stefan Taunerb4e06bd2012-08-20 00:24:22 +00002036 }
Carl-Daniel Hailfinger66ef4e52009-12-13 22:28:00 +00002037#endif
Ollie Lhocbbf1252004-03-17 22:22:08 +00002038 }
2039
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00002040 /* Read the whole chip to be able to check whether regions need to be
2041 * erased and to give better diagnostics in case write fails.
Stefan Tauner73f5bda2014-10-19 07:53:45 +00002042 * The alternative is to read only the regions which are to be
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00002043 * preserved, but in that case we might perform unneeded erase which
2044 * takes time as well.
2045 */
Stefan Tauner73f5bda2014-10-19 07:53:45 +00002046 if (read_all_first) {
2047 msg_cinfo("Reading old flash chip contents... ");
2048 if (flash->chip->read(flash, oldcontents, 0, size)) {
2049 ret = 1;
2050 msg_cinfo("FAILED.\n");
2051 goto out;
2052 }
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00002053 }
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00002054 msg_cinfo("done.\n");
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00002055
Stefan Tauner8268fdb2013-09-23 14:21:06 +00002056 /* Build a new image taking the given layout into account. */
Stefan Tauner73f5bda2014-10-19 07:53:45 +00002057 if (build_new_image(flash, read_all_first, oldcontents, newcontents)) {
2058 msg_gerr("Could not prepare the data to be written, aborting.\n");
2059 ret = 1;
2060 goto out;
2061 }
Uwe Hermanna7e05482007-05-09 10:17:44 +00002062
Ollie Lho184a4042005-11-26 21:55:36 +00002063 // ////////////////////////////////////////////////////////////
Uwe Hermanna7e05482007-05-09 10:17:44 +00002064
Stefan Tauner73f5bda2014-10-19 07:53:45 +00002065 if (write_it && erase_and_write_flash(flash, oldcontents, newcontents)) {
Stefan Tauner5c316f92015-02-08 21:57:52 +00002066 msg_cerr("Uh oh. Erase/write failed. ");
Stefan Tauner73f5bda2014-10-19 07:53:45 +00002067 if (read_all_first) {
2068 msg_cerr("Checking if anything has changed.\n");
Stefan Taunera58f6e92014-05-10 09:25:44 +00002069 msg_cinfo("Reading current flash chip contents... ");
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00002070 if (!flash->chip->read(flash, newcontents, 0, size)) {
Stefan Taunera58f6e92014-05-10 09:25:44 +00002071 msg_cinfo("done.\n");
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00002072 if (!memcmp(oldcontents, newcontents, size)) {
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00002073 nonfatal_help_message();
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00002074 ret = 1;
2075 goto out;
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00002076 }
Stefan Taunera58f6e92014-05-10 09:25:44 +00002077 msg_cerr("Apparently at least some data has changed.\n");
2078 } else
2079 msg_cerr("Can't even read anymore!\n");
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00002080 emergency_help_message();
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00002081 ret = 1;
2082 goto out;
Stefan Tauner73f5bda2014-10-19 07:53:45 +00002083 } else
2084 msg_cerr("\n");
2085 emergency_help_message();
2086 ret = 1;
2087 goto out;
Peter Stugef31104c2008-04-28 14:47:30 +00002088 }
Ollie Lho184a4042005-11-26 21:55:36 +00002089
Stefan Taunerc4f44df2013-08-12 22:58:43 +00002090 /* Verify only if we either did not try to write (verify operation) or actually changed something. */
2091 if (verify_it && (!write_it || !all_skipped)) {
Stefan Tauner78ffbea2012-10-27 15:36:56 +00002092 msg_cinfo("Verifying flash... ");
2093
2094 if (write_it) {
2095 /* Work around chips which need some time to calm down. */
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00002096 programmer_delay(1000*1000);
Stefan Tauner78ffbea2012-10-27 15:36:56 +00002097 ret = verify_range(flash, newcontents, 0, size);
2098 /* If we tried to write, and verification now fails, we
2099 * might have an emergency situation.
2100 */
2101 if (ret)
2102 emergency_help_message();
2103 } else {
2104 ret = compare_range(newcontents, oldcontents, 0, size);
2105 }
2106 if (!ret)
2107 msg_cinfo("VERIFIED.\n");
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00002108 }
Ollie Lho184a4042005-11-26 21:55:36 +00002109
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00002110out:
2111 free(oldcontents);
2112 free(newcontents);
Stefan Reinauer143da0b2006-01-04 16:42:57 +00002113 return ret;
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00002114}