blob: 41e7bd82688fa9cb584f7a6e24a0f28adc607455 [file] [log] [blame]
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001/*
Uwe Hermannd1107642007-08-29 17:52:32 +00002 * This file is part of the flashrom project.
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00003 *
Uwe Hermannd22a1d42007-09-09 20:21:05 +00004 * Copyright (C) 2000 Silicon Integrated System Corporation
5 * Copyright (C) 2004 Tyan Corp <yhlu@tyan.com>
Uwe Hermannc7e8a0c2009-05-19 14:14:21 +00006 * Copyright (C) 2005-2008 coresystems GmbH
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007 * Copyright (C) 2008,2009 Carl-Daniel Hailfinger
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00008 *
Uwe Hermannd1107642007-08-29 17:52:32 +00009 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +000013 *
Uwe Hermannd1107642007-08-29 17:52:32 +000014 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +000018 *
Uwe Hermannd1107642007-08-29 17:52:32 +000019 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +000022 */
23
Carl-Daniel Hailfinger831e8f42010-05-30 22:24:40 +000024#include <stdio.h>
Stefan Reinauer018aca82006-11-21 23:48:51 +000025#include <sys/types.h>
Patrick Georgia9095a92010-09-30 17:03:32 +000026#ifndef __LIBPAYLOAD__
27#include <fcntl.h>
Stefan Reinauer018aca82006-11-21 23:48:51 +000028#include <sys/stat.h>
Patrick Georgia9095a92010-09-30 17:03:32 +000029#endif
Ronald G. Minnichceec4202003-07-25 04:37:41 +000030#include <string.h>
Ronald G. Minnicheaab50b2003-09-12 22:41:53 +000031#include <stdlib.h>
Stefan Tauner363fd7e2013-04-07 13:08:30 +000032#include <errno.h>
Carl-Daniel Hailfingerc2441382010-11-09 22:00:31 +000033#include <ctype.h>
Ollie Lho184a4042005-11-26 21:55:36 +000034#include <getopt.h>
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +000035#if HAVE_UTSNAME == 1
36#include <sys/utsname.h>
37#endif
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +000038#include "flash.h"
Carl-Daniel Hailfinger08454642009-06-15 14:14:48 +000039#include "flashchips.h"
Carl-Daniel Hailfinger5b997c32010-07-27 22:41:39 +000040#include "programmer.h"
Carl-Daniel Hailfinger06b9efa2012-08-07 11:59:59 +000041#include "hwaccess.h"
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +000042
Mathias Krausea60faab2011-01-17 07:50:42 +000043const char flashrom_version[] = FLASHROM_VERSION;
Nico Huberbcb2e5a2012-12-30 01:23:17 +000044const char *chip_to_probe = NULL;
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +000045int verbose_screen = MSG_INFO;
46int verbose_logfile = MSG_DEBUG2;
Carl-Daniel Hailfinger66ef4e52009-12-13 22:28:00 +000047
Carl-Daniel Hailfinger2e681602011-09-08 00:00:29 +000048static enum programmer programmer = PROGRAMMER_INVALID;
Carl-Daniel Hailfinger66ef4e52009-12-13 22:28:00 +000049
Nico Huberbcb2e5a2012-12-30 01:23:17 +000050static const char *programmer_param = NULL;
Stefan Reinauer70385642007-04-06 11:58:03 +000051
Uwe Hermann48ec1b12010-08-08 17:01:18 +000052/*
Carl-Daniel Hailfinger66ef4e52009-12-13 22:28:00 +000053 * Programmers supporting multiple buses can have differing size limits on
54 * each bus. Store the limits for each bus in a common struct.
55 */
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +000056struct decode_sizes max_rom_decode;
57
58/* If nonzero, used as the start address of bottom-aligned flash. */
59unsigned long flashbase;
Carl-Daniel Hailfinger66ef4e52009-12-13 22:28:00 +000060
Carl-Daniel Hailfingerd1be52d2010-07-03 12:14:25 +000061/* Is writing allowed with this programmer? */
62int programmer_may_write;
63
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +000064const struct programmer_entry programmer_table[] = {
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +000065#if CONFIG_INTERNAL == 1
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +000066 {
Carl-Daniel Hailfinger37fc4692009-08-12 14:34:35 +000067 .name = "internal",
Stefan Tauneraf358d62012-12-27 18:40:26 +000068 .type = OTHER,
69 .devs.note = NULL,
Carl-Daniel Hailfinger1e334e62009-05-11 15:46:43 +000070 .init = internal_init,
Carl-Daniel Hailfinger1455b2b2009-05-11 14:13:25 +000071 .map_flash_region = physmap,
72 .unmap_flash_region = physunmap,
Carl-Daniel Hailfingerca8bfc62009-06-05 17:48:08 +000073 .delay = internal_delay,
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +000074 },
Carl-Daniel Hailfinger66ef4e52009-12-13 22:28:00 +000075#endif
Luc Verhaegen8e3a6002007-04-04 22:45:58 +000076
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +000077#if CONFIG_DUMMY == 1
Carl-Daniel Hailfingerc3129202009-05-09 00:54:55 +000078 {
Carl-Daniel Hailfinger37fc4692009-08-12 14:34:35 +000079 .name = "dummy",
Stefan Tauneraf358d62012-12-27 18:40:26 +000080 .type = OTHER,
81 /* FIXME */
82 .devs.note = "Dummy device, does nothing and logs all accesses\n",
Carl-Daniel Hailfinger1e334e62009-05-11 15:46:43 +000083 .init = dummy_init,
Carl-Daniel Hailfinger1455b2b2009-05-11 14:13:25 +000084 .map_flash_region = dummy_map,
85 .unmap_flash_region = dummy_unmap,
Carl-Daniel Hailfingerca8bfc62009-06-05 17:48:08 +000086 .delay = internal_delay,
Carl-Daniel Hailfingerc3129202009-05-09 00:54:55 +000087 },
Carl-Daniel Hailfinger4740c6f2009-09-16 10:09:21 +000088#endif
Carl-Daniel Hailfingerc3129202009-05-09 00:54:55 +000089
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +000090#if CONFIG_NIC3COM == 1
Uwe Hermannb4dcb712009-05-13 11:36:06 +000091 {
Carl-Daniel Hailfinger37fc4692009-08-12 14:34:35 +000092 .name = "nic3com",
Stefan Tauneraf358d62012-12-27 18:40:26 +000093 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +000094 .devs.dev = nics_3com,
Uwe Hermannb4dcb712009-05-13 11:36:06 +000095 .init = nic3com_init,
Uwe Hermannc6915932009-05-17 23:12:17 +000096 .map_flash_region = fallback_map,
97 .unmap_flash_region = fallback_unmap,
Carl-Daniel Hailfingerca8bfc62009-06-05 17:48:08 +000098 .delay = internal_delay,
Uwe Hermannb4dcb712009-05-13 11:36:06 +000099 },
Carl-Daniel Hailfinger4740c6f2009-09-16 10:09:21 +0000100#endif
Uwe Hermannb4dcb712009-05-13 11:36:06 +0000101
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000102#if CONFIG_NICREALTEK == 1
Joerg Fischer5665ef32010-05-21 21:54:07 +0000103 {
Carl-Daniel Hailfinger40446ee2011-03-07 01:08:09 +0000104 /* This programmer works for Realtek RTL8139 and SMC 1211. */
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000105 .name = "nicrealtek",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000106 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000107 .devs.dev = nics_realtek,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000108 .init = nicrealtek_init,
109 .map_flash_region = fallback_map,
110 .unmap_flash_region = fallback_unmap,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000111 .delay = internal_delay,
Joerg Fischer5665ef32010-05-21 21:54:07 +0000112 },
Joerg Fischer5665ef32010-05-21 21:54:07 +0000113#endif
114
Andrew Morganc29c2e72010-06-07 22:37:54 +0000115#if CONFIG_NICNATSEMI == 1
116 {
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000117 .name = "nicnatsemi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000118 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000119 .devs.dev = nics_natsemi,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000120 .init = nicnatsemi_init,
121 .map_flash_region = fallback_map,
122 .unmap_flash_region = fallback_unmap,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000123 .delay = internal_delay,
Andrew Morganc29c2e72010-06-07 22:37:54 +0000124 },
125#endif
Joerg Fischer5665ef32010-05-21 21:54:07 +0000126
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000127#if CONFIG_GFXNVIDIA == 1
Uwe Hermann2bc98f62009-09-30 18:29:55 +0000128 {
129 .name = "gfxnvidia",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000130 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000131 .devs.dev = gfx_nvidia,
Uwe Hermann2bc98f62009-09-30 18:29:55 +0000132 .init = gfxnvidia_init,
Uwe Hermann2bc98f62009-09-30 18:29:55 +0000133 .map_flash_region = fallback_map,
134 .unmap_flash_region = fallback_unmap,
Uwe Hermann2bc98f62009-09-30 18:29:55 +0000135 .delay = internal_delay,
136 },
137#endif
138
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000139#if CONFIG_DRKAISER == 1
Rudolf Marek68720c72009-05-17 19:39:27 +0000140 {
TURBO Jb0912c02009-09-02 23:00:46 +0000141 .name = "drkaiser",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000142 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000143 .devs.dev = drkaiser_pcidev,
TURBO Jb0912c02009-09-02 23:00:46 +0000144 .init = drkaiser_init,
TURBO Jb0912c02009-09-02 23:00:46 +0000145 .map_flash_region = fallback_map,
146 .unmap_flash_region = fallback_unmap,
TURBO Jb0912c02009-09-02 23:00:46 +0000147 .delay = internal_delay,
148 },
Carl-Daniel Hailfinger4740c6f2009-09-16 10:09:21 +0000149#endif
TURBO Jb0912c02009-09-02 23:00:46 +0000150
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000151#if CONFIG_SATASII == 1
TURBO Jb0912c02009-09-02 23:00:46 +0000152 {
Carl-Daniel Hailfinger37fc4692009-08-12 14:34:35 +0000153 .name = "satasii",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000154 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000155 .devs.dev = satas_sii,
Rudolf Marek68720c72009-05-17 19:39:27 +0000156 .init = satasii_init,
Uwe Hermannc6915932009-05-17 23:12:17 +0000157 .map_flash_region = fallback_map,
158 .unmap_flash_region = fallback_unmap,
Carl-Daniel Hailfingerca8bfc62009-06-05 17:48:08 +0000159 .delay = internal_delay,
Rudolf Marek68720c72009-05-17 19:39:27 +0000160 },
Carl-Daniel Hailfinger4740c6f2009-09-16 10:09:21 +0000161#endif
Rudolf Marek68720c72009-05-17 19:39:27 +0000162
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000163#if CONFIG_ATAHPT == 1
Uwe Hermannddd5c9e2010-02-21 21:17:00 +0000164 {
165 .name = "atahpt",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000166 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000167 .devs.dev = ata_hpt,
Uwe Hermannddd5c9e2010-02-21 21:17:00 +0000168 .init = atahpt_init,
Uwe Hermannddd5c9e2010-02-21 21:17:00 +0000169 .map_flash_region = fallback_map,
170 .unmap_flash_region = fallback_unmap,
Uwe Hermannddd5c9e2010-02-21 21:17:00 +0000171 .delay = internal_delay,
172 },
173#endif
174
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000175#if CONFIG_FT2232_SPI == 1
Paul Fox05dfbe62009-06-16 21:08:06 +0000176 {
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000177 .name = "ft2232_spi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000178 .type = USB,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000179 .devs.dev = devs_ft2232spi,
Paul Fox05dfbe62009-06-16 21:08:06 +0000180 .init = ft2232_spi_init,
Carl-Daniel Hailfinger415e5132009-08-12 11:39:29 +0000181 .map_flash_region = fallback_map,
182 .unmap_flash_region = fallback_unmap,
Paul Fox05dfbe62009-06-16 21:08:06 +0000183 .delay = internal_delay,
184 },
Carl-Daniel Hailfinger3426ef62009-08-19 13:27:58 +0000185#endif
Carl-Daniel Hailfinger415e5132009-08-12 11:39:29 +0000186
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000187#if CONFIG_SERPROG == 1
Urja Rannikko22915352009-06-23 11:33:43 +0000188 {
Carl-Daniel Hailfinger37fc4692009-08-12 14:34:35 +0000189 .name = "serprog",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000190 .type = OTHER,
191 /* FIXME */
192 .devs.note = "All programmer devices speaking the serprog protocol\n",
Urja Rannikko22915352009-06-23 11:33:43 +0000193 .init = serprog_init,
Urja Rannikko22915352009-06-23 11:33:43 +0000194 .map_flash_region = fallback_map,
195 .unmap_flash_region = fallback_unmap,
Urja Rannikko22915352009-06-23 11:33:43 +0000196 .delay = serprog_delay,
197 },
Carl-Daniel Hailfinger6be74112009-08-12 16:17:41 +0000198#endif
Paul Fox05dfbe62009-06-16 21:08:06 +0000199
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000200#if CONFIG_BUSPIRATE_SPI == 1
Carl-Daniel Hailfinger5cca01f2009-11-24 00:20:03 +0000201 {
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000202 .name = "buspirate_spi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000203 .type = OTHER,
204 /* FIXME */
205 .devs.note = "Dangerous Prototypes Bus Pirate\n",
Carl-Daniel Hailfinger5cca01f2009-11-24 00:20:03 +0000206 .init = buspirate_spi_init,
Carl-Daniel Hailfinger5cca01f2009-11-24 00:20:03 +0000207 .map_flash_region = fallback_map,
208 .unmap_flash_region = fallback_unmap,
Carl-Daniel Hailfinger5cca01f2009-11-24 00:20:03 +0000209 .delay = internal_delay,
210 },
211#endif
212
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000213#if CONFIG_DEDIPROG == 1
Carl-Daniel Hailfingerd38fac82010-01-19 11:15:48 +0000214 {
215 .name = "dediprog",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000216 .type = OTHER,
217 /* FIXME */
218 .devs.note = "Dediprog SF100\n",
Carl-Daniel Hailfingerd38fac82010-01-19 11:15:48 +0000219 .init = dediprog_init,
Carl-Daniel Hailfingerd38fac82010-01-19 11:15:48 +0000220 .map_flash_region = fallback_map,
221 .unmap_flash_region = fallback_unmap,
Carl-Daniel Hailfingerd38fac82010-01-19 11:15:48 +0000222 .delay = internal_delay,
223 },
224#endif
225
Carl-Daniel Hailfingere7fdd6e2010-07-21 10:26:01 +0000226#if CONFIG_RAYER_SPI == 1
227 {
228 .name = "rayer_spi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000229 .type = OTHER,
230 /* FIXME */
231 .devs.note = "RayeR parallel port programmer\n",
Carl-Daniel Hailfingere7fdd6e2010-07-21 10:26:01 +0000232 .init = rayer_spi_init,
Carl-Daniel Hailfingere7fdd6e2010-07-21 10:26:01 +0000233 .map_flash_region = fallback_map,
234 .unmap_flash_region = fallback_unmap,
Carl-Daniel Hailfingere7fdd6e2010-07-21 10:26:01 +0000235 .delay = internal_delay,
236 },
237#endif
238
Virgil-Adrian Teacada7c5452012-04-30 23:11:06 +0000239#if CONFIG_PONY_SPI == 1
240 {
241 .name = "pony_spi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000242 .type = OTHER,
243 /* FIXME */
244 .devs.note = "Programmers compatible with SI-Prog, serbang or AJAWe\n",
Virgil-Adrian Teacada7c5452012-04-30 23:11:06 +0000245 .init = pony_spi_init,
246 .map_flash_region = fallback_map,
247 .unmap_flash_region = fallback_unmap,
248 .delay = internal_delay,
Stefan Tauneraf358d62012-12-27 18:40:26 +0000249 },
Virgil-Adrian Teacada7c5452012-04-30 23:11:06 +0000250#endif
251
Carl-Daniel Hailfingerb713d2e2011-05-08 00:24:18 +0000252#if CONFIG_NICINTEL == 1
253 {
254 .name = "nicintel",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000255 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000256 .devs.dev = nics_intel,
Carl-Daniel Hailfingerb713d2e2011-05-08 00:24:18 +0000257 .init = nicintel_init,
Carl-Daniel Hailfingerb713d2e2011-05-08 00:24:18 +0000258 .map_flash_region = fallback_map,
259 .unmap_flash_region = fallback_unmap,
Carl-Daniel Hailfingerb713d2e2011-05-08 00:24:18 +0000260 .delay = internal_delay,
261 },
262#endif
263
Idwer Vollering004f4b72010-09-03 18:21:21 +0000264#if CONFIG_NICINTEL_SPI == 1
265 {
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000266 .name = "nicintel_spi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000267 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000268 .devs.dev = nics_intel_spi,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000269 .init = nicintel_spi_init,
270 .map_flash_region = fallback_map,
271 .unmap_flash_region = fallback_unmap,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000272 .delay = internal_delay,
Idwer Vollering004f4b72010-09-03 18:21:21 +0000273 },
274#endif
275
Mark Marshall90021f22010-12-03 14:48:11 +0000276#if CONFIG_OGP_SPI == 1
277 {
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000278 .name = "ogp_spi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000279 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000280 .devs.dev = ogp_spi,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000281 .init = ogp_spi_init,
282 .map_flash_region = fallback_map,
283 .unmap_flash_region = fallback_unmap,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000284 .delay = internal_delay,
Mark Marshall90021f22010-12-03 14:48:11 +0000285 },
286#endif
287
Carl-Daniel Hailfinger9a1105c2011-02-04 21:37:59 +0000288#if CONFIG_SATAMV == 1
289 {
290 .name = "satamv",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000291 .type = PCI,
Stefan Tauner4b24a2d2012-12-27 18:40:36 +0000292 .devs.dev = satas_mv,
Carl-Daniel Hailfinger9a1105c2011-02-04 21:37:59 +0000293 .init = satamv_init,
Carl-Daniel Hailfinger9a1105c2011-02-04 21:37:59 +0000294 .map_flash_region = fallback_map,
295 .unmap_flash_region = fallback_unmap,
Carl-Daniel Hailfinger9a1105c2011-02-04 21:37:59 +0000296 .delay = internal_delay,
297 },
298#endif
299
Sven Schnelle5ce5f702011-09-03 18:37:52 +0000300#if CONFIG_LINUX_SPI == 1
301 {
302 .name = "linux_spi",
Stefan Tauneraf358d62012-12-27 18:40:26 +0000303 .type = OTHER,
304 .devs.note = "Device files /dev/spidev*.*\n",
Sven Schnelle5ce5f702011-09-03 18:37:52 +0000305 .init = linux_spi_init,
306 .map_flash_region = fallback_map,
307 .unmap_flash_region = fallback_unmap,
Sven Schnelle5ce5f702011-09-03 18:37:52 +0000308 .delay = internal_delay,
309 },
310#endif
311
James Lairdc60de0e2013-03-27 13:00:23 +0000312#if CONFIG_USBBLASTER_SPI == 1
313 {
314 .name = "usbblaster_spi",
315 .type = USB,
316 .devs.dev = devs_usbblasterspi,
317 .init = usbblaster_spi_init,
318 .map_flash_region = fallback_map,
319 .unmap_flash_region = fallback_unmap,
320 .delay = internal_delay,
321 },
322#endif
323
Carl-Daniel Hailfinger1c6d2ff2012-08-27 00:44:42 +0000324 {0}, /* This entry corresponds to PROGRAMMER_INVALID. */
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +0000325};
Luc Verhaegen8e3a6002007-04-04 22:45:58 +0000326
Carl-Daniel Hailfinger2bee8cf2010-11-10 15:25:18 +0000327#define SHUTDOWN_MAXFN 32
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000328static int shutdown_fn_count = 0;
329struct shutdown_func_data {
David Hendricks8bb20212011-06-14 01:35:36 +0000330 int (*func) (void *data);
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000331 void *data;
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000332} static shutdown_fn[SHUTDOWN_MAXFN];
333/* Initialize to 0 to make sure nobody registers a shutdown function before
334 * programmer init.
335 */
336static int may_register_shutdown = 0;
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000337
Stefan Taunerc4f44df2013-08-12 22:58:43 +0000338/* Did we change something or was every erase/write skipped (if any)? */
339static bool all_skipped = true;
340
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +0000341static int check_block_eraser(const struct flashctx *flash, int k, int log);
Stefan Tauner5368dca2011-07-01 00:19:12 +0000342
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000343/* Register a function to be executed on programmer shutdown.
344 * The advantage over atexit() is that you can supply a void pointer which will
345 * be used as parameter to the registered function upon programmer shutdown.
346 * This pointer can point to arbitrary data used by said function, e.g. undo
347 * information for GPIO settings etc. If unneeded, set data=NULL.
348 * Please note that the first (void *data) belongs to the function signature of
349 * the function passed as first parameter.
350 */
David Hendricks8bb20212011-06-14 01:35:36 +0000351int register_shutdown(int (*function) (void *data), void *data)
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000352{
353 if (shutdown_fn_count >= SHUTDOWN_MAXFN) {
Carl-Daniel Hailfinger9f5f2152010-06-04 23:20:21 +0000354 msg_perr("Tried to register more than %i shutdown functions.\n",
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000355 SHUTDOWN_MAXFN);
356 return 1;
357 }
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000358 if (!may_register_shutdown) {
359 msg_perr("Tried to register a shutdown function before "
360 "programmer init.\n");
361 return 1;
362 }
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000363 shutdown_fn[shutdown_fn_count].func = function;
364 shutdown_fn[shutdown_fn_count].data = data;
365 shutdown_fn_count++;
366
367 return 0;
368}
369
Nico Huberbcb2e5a2012-12-30 01:23:17 +0000370int programmer_init(enum programmer prog, const char *param)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000371{
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000372 int ret;
Carl-Daniel Hailfinger2e681602011-09-08 00:00:29 +0000373
374 if (prog >= PROGRAMMER_INVALID) {
375 msg_perr("Invalid programmer specified!\n");
376 return -1;
377 }
378 programmer = prog;
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000379 /* Initialize all programmer specific data. */
380 /* Default to unlimited decode sizes. */
381 max_rom_decode = (const struct decode_sizes) {
382 .parallel = 0xffffffff,
383 .lpc = 0xffffffff,
384 .fwh = 0xffffffff,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000385 .spi = 0xffffffff,
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000386 };
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000387 /* Default to top aligned flash at 4 GB. */
388 flashbase = 0;
389 /* Registering shutdown functions is now allowed. */
390 may_register_shutdown = 1;
Carl-Daniel Hailfingerd1be52d2010-07-03 12:14:25 +0000391 /* Default to allowing writes. Broken programmers set this to 0. */
392 programmer_may_write = 1;
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000393
394 programmer_param = param;
395 msg_pdbg("Initializing %s programmer\n",
396 programmer_table[programmer].name);
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000397 ret = programmer_table[programmer].init();
398 if (programmer_param && strlen(programmer_param)) {
399 msg_perr("Unhandled programmer parameters: %s\n",
400 programmer_param);
401 /* Do not error out here, the init itself was successful. */
402 }
403 return ret;
Uwe Hermann09e04f72009-05-16 22:36:00 +0000404}
405
406int programmer_shutdown(void)
407{
David Hendricks8bb20212011-06-14 01:35:36 +0000408 int ret = 0;
409
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000410 /* Registering shutdown functions is no longer allowed. */
411 may_register_shutdown = 0;
412 while (shutdown_fn_count > 0) {
413 int i = --shutdown_fn_count;
David Hendricks8bb20212011-06-14 01:35:36 +0000414 ret |= shutdown_fn[i].func(shutdown_fn[i].data);
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000415 }
Stefan Taunere34e3e82013-01-01 00:06:51 +0000416
Stefan Taunerb8911d62012-12-26 07:55:00 +0000417 programmer_param = NULL;
Stefan Taunere34e3e82013-01-01 00:06:51 +0000418 registered_programmer_count = 0;
419
David Hendricks8bb20212011-06-14 01:35:36 +0000420 return ret;
Uwe Hermann09e04f72009-05-16 22:36:00 +0000421}
422
Stefan Tauner305e0b92013-07-17 23:46:44 +0000423void *programmer_map_flash_region(const char *descr, uintptr_t phys_addr, size_t len)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000424{
425 return programmer_table[programmer].map_flash_region(descr,
426 phys_addr, len);
427}
428
429void programmer_unmap_flash_region(void *virt_addr, size_t len)
430{
431 programmer_table[programmer].unmap_flash_region(virt_addr, len);
432}
433
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000434void chip_writeb(const struct flashctx *flash, uint8_t val, chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000435{
Carl-Daniel Hailfingerc40cff72011-12-20 00:19:29 +0000436 flash->pgm->par.chip_writeb(flash, val, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000437}
438
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000439void chip_writew(const struct flashctx *flash, uint16_t val, chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000440{
Carl-Daniel Hailfingerc40cff72011-12-20 00:19:29 +0000441 flash->pgm->par.chip_writew(flash, val, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000442}
443
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000444void chip_writel(const struct flashctx *flash, uint32_t val, chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000445{
Carl-Daniel Hailfingerc40cff72011-12-20 00:19:29 +0000446 flash->pgm->par.chip_writel(flash, val, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000447}
448
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000449void chip_writen(const struct flashctx *flash, uint8_t *buf, chipaddr addr,
450 size_t len)
Carl-Daniel Hailfinger0bd2a2b2009-06-05 18:32:07 +0000451{
Carl-Daniel Hailfingerc40cff72011-12-20 00:19:29 +0000452 flash->pgm->par.chip_writen(flash, buf, addr, len);
Carl-Daniel Hailfinger0bd2a2b2009-06-05 18:32:07 +0000453}
454
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000455uint8_t chip_readb(const struct flashctx *flash, const chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000456{
Carl-Daniel Hailfingerc40cff72011-12-20 00:19:29 +0000457 return flash->pgm->par.chip_readb(flash, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000458}
459
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000460uint16_t chip_readw(const struct flashctx *flash, const chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000461{
Carl-Daniel Hailfingerc40cff72011-12-20 00:19:29 +0000462 return flash->pgm->par.chip_readw(flash, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000463}
464
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000465uint32_t chip_readl(const struct flashctx *flash, const chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000466{
Carl-Daniel Hailfingerc40cff72011-12-20 00:19:29 +0000467 return flash->pgm->par.chip_readl(flash, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000468}
469
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000470void chip_readn(const struct flashctx *flash, uint8_t *buf, chipaddr addr,
471 size_t len)
Carl-Daniel Hailfinger0bd2a2b2009-06-05 18:32:07 +0000472{
Carl-Daniel Hailfingerc40cff72011-12-20 00:19:29 +0000473 flash->pgm->par.chip_readn(flash, buf, addr, len);
Carl-Daniel Hailfinger0bd2a2b2009-06-05 18:32:07 +0000474}
475
Carl-Daniel Hailfingerca8bfc62009-06-05 17:48:08 +0000476void programmer_delay(int usecs)
477{
478 programmer_table[programmer].delay(usecs);
479}
480
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +0000481void map_flash_registers(struct flashctx *flash)
Stefan Reinauerff4f1972007-05-24 08:48:10 +0000482{
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +0000483 size_t size = flash->chip->total_size * 1024;
Carl-Daniel Hailfingerd0fc9462009-05-11 14:01:17 +0000484 /* Flash registers live 4 MByte below the flash. */
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +0000485 /* FIXME: This is incorrect for nonstandard flashbase. */
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +0000486 flash->virtual_registers = (chipaddr)programmer_map_flash_region("flash chip registers", (0xFFFFFFFF - 0x400000 - size + 1), size);
Stefan Reinauerff4f1972007-05-24 08:48:10 +0000487}
488
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000489int read_memmapped(struct flashctx *flash, uint8_t *buf, unsigned int start,
490 int unsigned len)
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000491{
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000492 chip_readn(flash, buf, flash->virtual_memory + start, len);
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000493
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000494 return 0;
495}
496
Carl-Daniel Hailfinger38a059d2009-06-13 12:04:03 +0000497int min(int a, int b)
498{
499 return (a < b) ? a : b;
500}
501
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000502int max(int a, int b)
503{
504 return (a > b) ? a : b;
505}
506
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +0000507int bitcount(unsigned long a)
508{
509 int i = 0;
510 for (; a != 0; a >>= 1)
511 if (a & 1)
512 i++;
513 return i;
514}
515
Carl-Daniel Hailfingerc2441382010-11-09 22:00:31 +0000516void tolower_string(char *str)
517{
518 for (; *str != '\0'; str++)
519 *str = (char)tolower((unsigned char)*str);
520}
521
Carl-Daniel Hailfingerb22918c2009-06-01 02:08:58 +0000522char *strcat_realloc(char *dest, const char *src)
523{
524 dest = realloc(dest, strlen(dest) + strlen(src) + 1);
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000525 if (!dest) {
526 msg_gerr("Out of memory!\n");
Carl-Daniel Hailfingerb22918c2009-06-01 02:08:58 +0000527 return NULL;
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000528 }
Carl-Daniel Hailfingerb22918c2009-06-01 02:08:58 +0000529 strcat(dest, src);
530 return dest;
531}
532
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000533/* This is a somewhat hacked function similar in some ways to strtok().
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000534 * It will look for needle with a subsequent '=' in haystack, return a copy of
535 * needle and remove everything from the first occurrence of needle to the next
536 * delimiter from haystack.
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000537 */
Nico Huberbcb2e5a2012-12-30 01:23:17 +0000538char *extract_param(const char *const *haystack, const char *needle, const char *delim)
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000539{
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000540 char *param_pos, *opt_pos, *rest;
541 char *opt = NULL;
542 int optlen;
Carl-Daniel Hailfinger27023762010-04-28 15:22:14 +0000543 int needlelen;
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000544
Carl-Daniel Hailfinger27023762010-04-28 15:22:14 +0000545 needlelen = strlen(needle);
546 if (!needlelen) {
547 msg_gerr("%s: empty needle! Please report a bug at "
548 "flashrom@flashrom.org\n", __func__);
549 return NULL;
550 }
551 /* No programmer parameters given. */
552 if (*haystack == NULL)
553 return NULL;
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000554 param_pos = strstr(*haystack, needle);
555 do {
556 if (!param_pos)
557 return NULL;
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000558 /* Needle followed by '='? */
559 if (param_pos[needlelen] == '=') {
560
561 /* Beginning of the string? */
562 if (param_pos == *haystack)
563 break;
564 /* After a delimiter? */
565 if (strchr(delim, *(param_pos - 1)))
566 break;
567 }
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000568 /* Continue searching. */
569 param_pos++;
570 param_pos = strstr(param_pos, needle);
571 } while (1);
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000572
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000573 if (param_pos) {
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000574 /* Get the string after needle and '='. */
575 opt_pos = param_pos + needlelen + 1;
576 optlen = strcspn(opt_pos, delim);
577 /* Return an empty string if the parameter was empty. */
578 opt = malloc(optlen + 1);
579 if (!opt) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000580 msg_gerr("Out of memory!\n");
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000581 exit(1);
582 }
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000583 strncpy(opt, opt_pos, optlen);
584 opt[optlen] = '\0';
585 rest = opt_pos + optlen;
586 /* Skip all delimiters after the current parameter. */
587 rest += strspn(rest, delim);
588 memmove(param_pos, rest, strlen(rest) + 1);
589 /* We could shrink haystack, but the effort is not worth it. */
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000590 }
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000591
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000592 return opt;
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000593}
594
Stefan Tauner66652442011-06-26 17:38:17 +0000595char *extract_programmer_param(const char *param_name)
Carl-Daniel Hailfinger2b6dcb32010-07-08 10:13:37 +0000596{
597 return extract_param(&programmer_param, param_name, ",");
598}
599
Sylvain "ythier" Hitier9db45512011-07-04 07:27:17 +0000600/* Returns the number of well-defined erasers for a chip. */
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +0000601static unsigned int count_usable_erasers(const struct flashctx *flash)
Stefan Tauner5368dca2011-07-01 00:19:12 +0000602{
603 unsigned int usable_erasefunctions = 0;
604 int k;
605 for (k = 0; k < NUM_ERASEFUNCTIONS; k++) {
606 if (!check_block_eraser(flash, k, 0))
607 usable_erasefunctions++;
608 }
609 return usable_erasefunctions;
610}
611
Stefan Tauner78ffbea2012-10-27 15:36:56 +0000612int compare_range(uint8_t *wantbuf, uint8_t *havebuf, unsigned int start, unsigned int len)
613{
614 int ret = 0, failcount = 0;
615 unsigned int i;
616 for (i = 0; i < len; i++) {
617 if (wantbuf[i] != havebuf[i]) {
618 /* Only print the first failure. */
619 if (!failcount++)
620 msg_cerr("FAILED at 0x%08x! Expected=0x%02x, Found=0x%02x,",
621 start + i, wantbuf[i], havebuf[i]);
622 }
623 }
624 if (failcount) {
625 msg_cerr(" failed byte count from 0x%08x-0x%08x: 0x%x\n",
626 start, start + len - 1, failcount);
627 ret = -1;
628 }
629 return ret;
630}
631
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000632/* start is an offset to the base address of the flash chip */
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000633int check_erased_range(struct flashctx *flash, unsigned int start,
634 unsigned int len)
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000635{
636 int ret;
637 uint8_t *cmpbuf = malloc(len);
638
639 if (!cmpbuf) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000640 msg_gerr("Could not allocate memory!\n");
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000641 exit(1);
642 }
643 memset(cmpbuf, 0xff, len);
Stefan Tauner78ffbea2012-10-27 15:36:56 +0000644 ret = verify_range(flash, cmpbuf, start, len);
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000645 free(cmpbuf);
646 return ret;
647}
648
Uwe Hermann48ec1b12010-08-08 17:01:18 +0000649/*
Carl-Daniel Hailfingerd0250a32009-11-25 17:05:52 +0000650 * @cmpbuf buffer to compare against, cmpbuf[0] is expected to match the
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000651 * flash content at location start
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000652 * @start offset to the base address of the flash chip
653 * @len length of the verified area
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000654 * @return 0 for success, -1 for failure
655 */
Stefan Tauner78ffbea2012-10-27 15:36:56 +0000656int verify_range(struct flashctx *flash, uint8_t *cmpbuf, unsigned int start, unsigned int len)
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000657{
Carl-Daniel Hailfingerd8369412010-11-16 17:21:58 +0000658 uint8_t *readbuf = malloc(len);
Stefan Tauner78ffbea2012-10-27 15:36:56 +0000659 int ret = 0;
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000660
661 if (!len)
662 goto out_free;
663
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +0000664 if (!flash->chip->read) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000665 msg_cerr("ERROR: flashrom has no read function for this flash chip.\n");
Carl-Daniel Hailfinger23290662009-06-24 08:20:45 +0000666 return 1;
667 }
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000668 if (!readbuf) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000669 msg_gerr("Could not allocate memory!\n");
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000670 exit(1);
671 }
672
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +0000673 if (start + len > flash->chip->total_size * 1024) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000674 msg_gerr("Error: %s called with start 0x%x + len 0x%x >"
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000675 " total_size 0x%x\n", __func__, start, len,
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +0000676 flash->chip->total_size * 1024);
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000677 ret = -1;
678 goto out_free;
679 }
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000680
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +0000681 ret = flash->chip->read(flash, readbuf, start, len);
Carl-Daniel Hailfingerd8369412010-11-16 17:21:58 +0000682 if (ret) {
683 msg_gerr("Verification impossible because read failed "
684 "at 0x%x (len 0x%x)\n", start, len);
685 return ret;
686 }
687
Stefan Tauner78ffbea2012-10-27 15:36:56 +0000688 ret = compare_range(cmpbuf, readbuf, start, len);
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000689out_free:
690 free(readbuf);
691 return ret;
692}
693
Stefan Tauner02437452013-04-01 19:34:53 +0000694/* Helper function for need_erase() that focuses on granularities of gran bytes. */
695static int need_erase_gran_bytes(uint8_t *have, uint8_t *want, unsigned int len, unsigned int gran)
696{
697 unsigned int i, j, limit;
698 for (j = 0; j < len / gran; j++) {
699 limit = min (gran, len - j * gran);
700 /* Are 'have' and 'want' identical? */
701 if (!memcmp(have + j * gran, want + j * gran, limit))
702 continue;
703 /* have needs to be in erased state. */
704 for (i = 0; i < limit; i++)
705 if (have[j * gran + i] != 0xff)
706 return 1;
707 }
708 return 0;
709}
710
Uwe Hermann48ec1b12010-08-08 17:01:18 +0000711/*
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000712 * Check if the buffer @have can be programmed to the content of @want without
713 * erasing. This is only possible if all chunks of size @gran are either kept
714 * as-is or changed from an all-ones state to any other state.
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000715 *
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000716 * Warning: This function assumes that @have and @want point to naturally
717 * aligned regions.
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000718 *
719 * @have buffer with current content
720 * @want buffer with desired content
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000721 * @len length of the checked area
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000722 * @gran write granularity (enum, not count)
723 * @return 0 if no erase is needed, 1 otherwise
724 */
Stefan Taunerc69c9c82011-11-23 09:13:48 +0000725int need_erase(uint8_t *have, uint8_t *want, unsigned int len, enum write_granularity gran)
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000726{
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +0000727 int result = 0;
Stefan Tauner02437452013-04-01 19:34:53 +0000728 unsigned int i;
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000729
730 switch (gran) {
731 case write_gran_1bit:
732 for (i = 0; i < len; i++)
733 if ((have[i] & want[i]) != want[i]) {
734 result = 1;
735 break;
736 }
737 break;
738 case write_gran_1byte:
739 for (i = 0; i < len; i++)
740 if ((have[i] != want[i]) && (have[i] != 0xff)) {
741 result = 1;
742 break;
743 }
744 break;
745 case write_gran_256bytes:
Stefan Tauner02437452013-04-01 19:34:53 +0000746 result = need_erase_gran_bytes(have, want, len, 256);
747 break;
748 case write_gran_264bytes:
749 result = need_erase_gran_bytes(have, want, len, 264);
750 break;
751 case write_gran_512bytes:
752 result = need_erase_gran_bytes(have, want, len, 512);
753 break;
754 case write_gran_528bytes:
755 result = need_erase_gran_bytes(have, want, len, 528);
756 break;
757 case write_gran_1024bytes:
758 result = need_erase_gran_bytes(have, want, len, 1024);
759 break;
760 case write_gran_1056bytes:
761 result = need_erase_gran_bytes(have, want, len, 1056);
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000762 break;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000763 default:
764 msg_cerr("%s: Unsupported granularity! Please report a bug at "
765 "flashrom@flashrom.org\n", __func__);
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000766 }
767 return result;
768}
769
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000770/**
771 * Check if the buffer @have needs to be programmed to get the content of @want.
772 * If yes, return 1 and fill in first_start with the start address of the
773 * write operation and first_len with the length of the first to-be-written
774 * chunk. If not, return 0 and leave first_start and first_len undefined.
775 *
776 * Warning: This function assumes that @have and @want point to naturally
777 * aligned regions.
778 *
779 * @have buffer with current content
780 * @want buffer with desired content
781 * @len length of the checked area
782 * @gran write granularity (enum, not count)
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000783 * @first_start offset of the first byte which needs to be written (passed in
784 * value is increased by the offset of the first needed write
785 * relative to have/want or unchanged if no write is needed)
786 * @return length of the first contiguous area which needs to be written
787 * 0 if no write is needed
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000788 *
789 * FIXME: This function needs a parameter which tells it about coalescing
790 * in relation to the max write length of the programmer and the max write
791 * length of the chip.
792 */
Stefan Taunerc69c9c82011-11-23 09:13:48 +0000793static unsigned int get_next_write(uint8_t *have, uint8_t *want, unsigned int len,
794 unsigned int *first_start,
795 enum write_granularity gran)
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000796{
Stefan Taunerc69c9c82011-11-23 09:13:48 +0000797 int need_write = 0;
798 unsigned int rel_start = 0, first_len = 0;
799 unsigned int i, limit, stride;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000800
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000801 switch (gran) {
802 case write_gran_1bit:
803 case write_gran_1byte:
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000804 stride = 1;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000805 break;
806 case write_gran_256bytes:
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000807 stride = 256;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000808 break;
Stefan Tauner02437452013-04-01 19:34:53 +0000809 case write_gran_264bytes:
810 stride = 264;
811 break;
812 case write_gran_512bytes:
813 stride = 512;
814 break;
815 case write_gran_528bytes:
816 stride = 528;
817 break;
818 case write_gran_1024bytes:
819 stride = 1024;
820 break;
821 case write_gran_1056bytes:
822 stride = 1056;
823 break;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000824 default:
825 msg_cerr("%s: Unsupported granularity! Please report a bug at "
826 "flashrom@flashrom.org\n", __func__);
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000827 /* Claim that no write was needed. A write with unknown
828 * granularity is too dangerous to try.
829 */
830 return 0;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000831 }
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000832 for (i = 0; i < len / stride; i++) {
833 limit = min(stride, len - i * stride);
834 /* Are 'have' and 'want' identical? */
835 if (memcmp(have + i * stride, want + i * stride, limit)) {
836 if (!need_write) {
837 /* First location where have and want differ. */
838 need_write = 1;
839 rel_start = i * stride;
840 }
841 } else {
842 if (need_write) {
843 /* First location where have and want
844 * do not differ anymore.
845 */
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000846 break;
847 }
848 }
849 }
Carl-Daniel Hailfinger202bf532010-12-06 13:05:44 +0000850 if (need_write)
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000851 first_len = min(i * stride - rel_start, len);
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000852 *first_start += rel_start;
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000853 return first_len;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000854}
855
Carl-Daniel Hailfingereaac68b2009-11-23 12:55:31 +0000856/* This function generates various test patterns useful for testing controller
857 * and chip communication as well as chip behaviour.
858 *
859 * If a byte can be written multiple times, each time keeping 0-bits at 0
860 * and changing 1-bits to 0 if the new value for that bit is 0, the effect
861 * is essentially an AND operation. That's also the reason why this function
862 * provides the result of AND between various patterns.
863 *
864 * Below is a list of patterns (and their block length).
865 * Pattern 0 is 05 15 25 35 45 55 65 75 85 95 a5 b5 c5 d5 e5 f5 (16 Bytes)
866 * Pattern 1 is 0a 1a 2a 3a 4a 5a 6a 7a 8a 9a aa ba ca da ea fa (16 Bytes)
867 * Pattern 2 is 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f (16 Bytes)
868 * Pattern 3 is a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af (16 Bytes)
869 * Pattern 4 is 00 10 20 30 40 50 60 70 80 90 a0 b0 c0 d0 e0 f0 (16 Bytes)
870 * Pattern 5 is 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f (16 Bytes)
871 * Pattern 6 is 00 (1 Byte)
872 * Pattern 7 is ff (1 Byte)
873 * Patterns 0-7 have a big-endian block number in the last 2 bytes of each 256
874 * byte block.
875 *
876 * Pattern 8 is 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11... (256 B)
877 * Pattern 9 is ff fe fd fc fb fa f9 f8 f7 f6 f5 f4 f3 f2 f1 f0 ef ee... (256 B)
878 * Pattern 10 is 00 00 00 01 00 02 00 03 00 04... (128 kB big-endian counter)
879 * Pattern 11 is ff ff ff fe ff fd ff fc ff fb... (128 kB big-endian downwards)
880 * Pattern 12 is 00 (1 Byte)
881 * Pattern 13 is ff (1 Byte)
882 * Patterns 8-13 have no block number.
883 *
884 * Patterns 0-3 are created to detect and efficiently diagnose communication
885 * slips like missed bits or bytes and their repetitive nature gives good visual
886 * cues to the person inspecting the results. In addition, the following holds:
887 * AND Pattern 0/1 == Pattern 4
888 * AND Pattern 2/3 == Pattern 5
889 * AND Pattern 0/1/2/3 == AND Pattern 4/5 == Pattern 6
890 * A weakness of pattern 0-5 is the inability to detect swaps/copies between
891 * any two 16-byte blocks except for the last 16-byte block in a 256-byte bloc.
892 * They work perfectly for detecting any swaps/aliasing of blocks >= 256 bytes.
893 * 0x5 and 0xa were picked because they are 0101 and 1010 binary.
894 * Patterns 8-9 are best for detecting swaps/aliasing of blocks < 256 bytes.
895 * Besides that, they provide for bit testing of the last two bytes of every
896 * 256 byte block which contains the block number for patterns 0-6.
897 * Patterns 10-11 are special purpose for detecting subblock aliasing with
898 * block sizes >256 bytes (some Dataflash chips etc.)
899 * AND Pattern 8/9 == Pattern 12
900 * AND Pattern 10/11 == Pattern 12
901 * Pattern 13 is the completely erased state.
902 * None of the patterns can detect aliasing at boundaries which are a multiple
903 * of 16 MBytes (but such chips do not exist anyway for Parallel/LPC/FWH/SPI).
904 */
905int generate_testpattern(uint8_t *buf, uint32_t size, int variant)
906{
907 int i;
908
909 if (!buf) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000910 msg_gerr("Invalid buffer!\n");
Carl-Daniel Hailfingereaac68b2009-11-23 12:55:31 +0000911 return 1;
912 }
913
914 switch (variant) {
915 case 0:
916 for (i = 0; i < size; i++)
917 buf[i] = (i & 0xf) << 4 | 0x5;
918 break;
919 case 1:
920 for (i = 0; i < size; i++)
921 buf[i] = (i & 0xf) << 4 | 0xa;
922 break;
923 case 2:
924 for (i = 0; i < size; i++)
925 buf[i] = 0x50 | (i & 0xf);
926 break;
927 case 3:
928 for (i = 0; i < size; i++)
929 buf[i] = 0xa0 | (i & 0xf);
930 break;
931 case 4:
932 for (i = 0; i < size; i++)
933 buf[i] = (i & 0xf) << 4;
934 break;
935 case 5:
936 for (i = 0; i < size; i++)
937 buf[i] = i & 0xf;
938 break;
939 case 6:
940 memset(buf, 0x00, size);
941 break;
942 case 7:
943 memset(buf, 0xff, size);
944 break;
945 case 8:
946 for (i = 0; i < size; i++)
947 buf[i] = i & 0xff;
948 break;
949 case 9:
950 for (i = 0; i < size; i++)
951 buf[i] = ~(i & 0xff);
952 break;
953 case 10:
954 for (i = 0; i < size % 2; i++) {
955 buf[i * 2] = (i >> 8) & 0xff;
956 buf[i * 2 + 1] = i & 0xff;
957 }
958 if (size & 0x1)
959 buf[i * 2] = (i >> 8) & 0xff;
960 break;
961 case 11:
962 for (i = 0; i < size % 2; i++) {
963 buf[i * 2] = ~((i >> 8) & 0xff);
964 buf[i * 2 + 1] = ~(i & 0xff);
965 }
966 if (size & 0x1)
967 buf[i * 2] = ~((i >> 8) & 0xff);
968 break;
969 case 12:
970 memset(buf, 0x00, size);
971 break;
972 case 13:
973 memset(buf, 0xff, size);
974 break;
975 }
976
977 if ((variant >= 0) && (variant <= 7)) {
978 /* Write block number in the last two bytes of each 256-byte
979 * block, big endian for easier reading of the hexdump.
980 * Note that this wraps around for chips larger than 2^24 bytes
981 * (16 MB).
982 */
983 for (i = 0; i < size / 256; i++) {
984 buf[i * 256 + 254] = (i >> 8) & 0xff;
985 buf[i * 256 + 255] = i & 0xff;
986 }
987 }
988
989 return 0;
990}
991
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +0000992int check_max_decode(enum chipbustype buses, uint32_t size)
993{
994 int limitexceeded = 0;
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000995
996 if ((buses & BUS_PARALLEL) && (max_rom_decode.parallel < size)) {
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +0000997 limitexceeded++;
Sean Nelson316a29f2010-05-07 20:09:04 +0000998 msg_pdbg("Chip size %u kB is bigger than supported "
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000999 "size %u kB of chipset/board/programmer "
1000 "for %s interface, "
1001 "probe/read/erase/write may fail. ", size / 1024,
1002 max_rom_decode.parallel / 1024, "Parallel");
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001003 }
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001004 if ((buses & BUS_LPC) && (max_rom_decode.lpc < size)) {
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001005 limitexceeded++;
Sean Nelson316a29f2010-05-07 20:09:04 +00001006 msg_pdbg("Chip size %u kB is bigger than supported "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001007 "size %u kB of chipset/board/programmer "
1008 "for %s interface, "
1009 "probe/read/erase/write may fail. ", size / 1024,
1010 max_rom_decode.lpc / 1024, "LPC");
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001011 }
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001012 if ((buses & BUS_FWH) && (max_rom_decode.fwh < size)) {
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001013 limitexceeded++;
Sean Nelson316a29f2010-05-07 20:09:04 +00001014 msg_pdbg("Chip size %u kB is bigger than supported "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001015 "size %u kB of chipset/board/programmer "
1016 "for %s interface, "
1017 "probe/read/erase/write may fail. ", size / 1024,
1018 max_rom_decode.fwh / 1024, "FWH");
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001019 }
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001020 if ((buses & BUS_SPI) && (max_rom_decode.spi < size)) {
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001021 limitexceeded++;
Sean Nelson316a29f2010-05-07 20:09:04 +00001022 msg_pdbg("Chip size %u kB is bigger than supported "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001023 "size %u kB of chipset/board/programmer "
1024 "for %s interface, "
1025 "probe/read/erase/write may fail. ", size / 1024,
1026 max_rom_decode.spi / 1024, "SPI");
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001027 }
1028 if (!limitexceeded)
1029 return 0;
1030 /* Sometimes chip and programmer have more than one bus in common,
1031 * and the limit is not exceeded on all buses. Tell the user.
1032 */
1033 if (bitcount(buses) > limitexceeded)
Carl-Daniel Hailfingera84835a2010-01-07 03:24:05 +00001034 /* FIXME: This message is designed towards CLI users. */
Sean Nelson316a29f2010-05-07 20:09:04 +00001035 msg_pdbg("There is at least one common chip/programmer "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001036 "interface which can support a chip of this size. "
1037 "You can try --force at your own risk.\n");
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001038 return 1;
1039}
1040
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001041int probe_flash(struct registered_programmer *pgm, int startchip, struct flashctx *flash, int force)
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001042{
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001043 const struct flashchip *chip;
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001044 unsigned long base = 0;
Stefan Reinauer051e2362011-01-19 06:21:54 +00001045 char location[64];
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001046 uint32_t size;
1047 enum chipbustype buses_common;
Carl-Daniel Hailfingerb22918c2009-06-01 02:08:58 +00001048 char *tmp;
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001049
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001050 for (chip = flashchips + startchip; chip && chip->name; chip++) {
1051 if (chip_to_probe && strcmp(chip->name, chip_to_probe) != 0)
Ollie Lhocbbf1252004-03-17 22:22:08 +00001052 continue;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001053 buses_common = pgm->buses_supported & chip->bustype;
Carl-Daniel Hailfingerc40cff72011-12-20 00:19:29 +00001054 if (!buses_common)
Carl-Daniel Hailfinger6573b742011-06-17 22:38:53 +00001055 continue;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001056 msg_gdbg("Probing for %s %s, %d kB: ", chip->vendor, chip->name, chip->total_size);
1057 if (!chip->probe && !force) {
1058 msg_gdbg("failed! flashrom has no probe function for this flash chip.\n");
Carl-Daniel Hailfingerb22918c2009-06-01 02:08:58 +00001059 continue;
1060 }
Stefan Reinauer70385642007-04-06 11:58:03 +00001061
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001062 size = chip->total_size * 1024;
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001063 check_max_decode(buses_common, size);
Stefan Reinauer70385642007-04-06 11:58:03 +00001064
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001065 /* Start filling in the dynamic data. */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001066 flash->chip = calloc(1, sizeof(struct flashchip));
1067 if (!flash->chip) {
1068 msg_gerr("Out of memory!\n");
1069 exit(1);
1070 }
1071 memcpy(flash->chip, chip, sizeof(struct flashchip));
1072 flash->pgm = pgm;
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001073
Carl-Daniel Hailfinger97d6b092009-05-09 07:27:23 +00001074 base = flashbase ? flashbase : (0xffffffff - size + 1);
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001075 flash->virtual_memory = (chipaddr)programmer_map_flash_region("flash chip", base, size);
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001076
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001077 /* We handle a forced match like a real match, we just avoid probing. Note that probe_flash()
1078 * is only called with force=1 after normal probing failed.
1079 */
Peter Stuge27c3e2d2008-07-02 17:15:47 +00001080 if (force)
1081 break;
Stefan Reinauerfcb63682006-03-16 16:57:41 +00001082
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001083 if (flash->chip->probe(flash) != 1)
Peter Stuge483b8f02008-09-03 23:10:05 +00001084 goto notfound;
1085
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001086 /* If this is the first chip found, accept it.
1087 * If this is not the first chip found, accept it only if it is
Stefan Taunerac1b4c82012-02-17 14:51:04 +00001088 * a non-generic match. SFDP and CFI are generic matches.
1089 * startchip==0 means this call to probe_flash() is the first
1090 * one for this programmer interface and thus no other chip has
1091 * been found on this interface.
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001092 */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001093 if (startchip == 0 && flash->chip->model_id == SFDP_DEVICE_ID) {
Stefan Taunerac1b4c82012-02-17 14:51:04 +00001094 msg_cinfo("===\n"
1095 "SFDP has autodetected a flash chip which is "
1096 "not natively supported by flashrom yet.\n");
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001097 if (count_usable_erasers(flash) == 0)
Stefan Taunerac1b4c82012-02-17 14:51:04 +00001098 msg_cinfo("The standard operations read and "
1099 "verify should work, but to support "
1100 "erase, write and all other "
1101 "possible features");
1102 else
1103 msg_cinfo("All standard operations (read, "
1104 "verify, erase and write) should "
1105 "work, but to support all possible "
1106 "features");
1107
Stefan Taunerb4e06bd2012-08-20 00:24:22 +00001108 msg_cinfo(" we need to add them manually.\n"
1109 "You can help us by mailing us the output of the following command to "
1110 "flashrom@flashrom.org:\n"
1111 "'flashrom -VV [plus the -p/--programmer parameter]'\n"
1112 "Thanks for your help!\n"
Stefan Taunerac1b4c82012-02-17 14:51:04 +00001113 "===\n");
1114 }
1115
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001116 /* First flash chip detected on this bus. */
1117 if (startchip == 0)
Peter Stuge27c3e2d2008-07-02 17:15:47 +00001118 break;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001119 /* Not the first flash chip detected on this bus, but not a generic match either. */
1120 if ((flash->chip->model_id != GENERIC_DEVICE_ID) && (flash->chip->model_id != SFDP_DEVICE_ID))
1121 break;
1122 /* 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 +00001123notfound:
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001124 programmer_unmap_flash_region((void *)flash->virtual_memory, size);
1125 flash->virtual_memory = (chipaddr)NULL;
1126 free(flash->chip);
1127 flash->chip = NULL;
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001128 }
Uwe Hermannffec5f32007-08-23 16:08:21 +00001129
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001130 if (!flash->chip)
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001131 return -1;
Peter Stuge27c3e2d2008-07-02 17:15:47 +00001132
Carl-Daniel Hailfingerd9535582011-03-08 00:09:11 +00001133#if CONFIG_INTERNAL == 1
1134 if (programmer_table[programmer].map_flash_region == physmap)
Stefan Reinauer051e2362011-01-19 06:21:54 +00001135 snprintf(location, sizeof(location), "at physical address 0x%lx", base);
Carl-Daniel Hailfingerd9535582011-03-08 00:09:11 +00001136 else
1137#endif
Stefan Reinauer051e2362011-01-19 06:21:54 +00001138 snprintf(location, sizeof(location), "on %s", programmer_table[programmer].name);
Stefan Reinauer051e2362011-01-19 06:21:54 +00001139
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001140 tmp = flashbuses_to_text(flash->chip->bustype);
1141 msg_cinfo("%s %s flash chip \"%s\" (%d kB, %s) %s.\n", force ? "Assuming" : "Found",
1142 flash->chip->vendor, flash->chip->name, flash->chip->total_size, tmp, location);
Stefan Tauner00155492011-06-26 20:45:35 +00001143 free(tmp);
Uwe Hermann9899cad2009-06-28 21:47:57 +00001144
Carl-Daniel Hailfinger859f3f02010-12-02 21:59:42 +00001145 /* Flash registers will not be mapped if the chip was forced. Lock info
1146 * may be stored in registers, so avoid lock info printing.
1147 */
1148 if (!force)
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001149 if (flash->chip->printlock)
1150 flash->chip->printlock(flash);
Sean Nelson6e0b9122010-02-19 00:52:10 +00001151
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001152 /* Return position of matching chip. */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001153 return chip - flashchips;
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001154}
1155
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001156int read_buf_from_file(unsigned char *buf, unsigned long size,
1157 const char *filename)
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001158{
1159 unsigned long numbytes;
1160 FILE *image;
1161 struct stat image_stat;
1162
1163 if ((image = fopen(filename, "rb")) == NULL) {
Stefan Tauner363fd7e2013-04-07 13:08:30 +00001164 msg_gerr("Error: opening file \"%s\" failed: %s\n", filename, strerror(errno));
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001165 return 1;
1166 }
1167 if (fstat(fileno(image), &image_stat) != 0) {
Stefan Tauner363fd7e2013-04-07 13:08:30 +00001168 msg_gerr("Error: getting metadata of file \"%s\" failed: %s\n", filename, strerror(errno));
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001169 fclose(image);
1170 return 1;
1171 }
1172 if (image_stat.st_size != size) {
Carl-Daniel Hailfinger11990da2013-07-13 23:21:05 +00001173 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 +00001174 (intmax_t)image_stat.st_size, size);
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001175 fclose(image);
1176 return 1;
1177 }
1178 numbytes = fread(buf, 1, size, image);
1179 if (fclose(image)) {
Stefan Tauner363fd7e2013-04-07 13:08:30 +00001180 msg_gerr("Error: closing file \"%s\" failed: %s\n", filename, strerror(errno));
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001181 return 1;
1182 }
1183 if (numbytes != size) {
1184 msg_gerr("Error: Failed to read complete file. Got %ld bytes, "
1185 "wanted %ld!\n", numbytes, size);
1186 return 1;
1187 }
1188 return 0;
1189}
1190
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001191int write_buf_to_file(unsigned char *buf, unsigned long size,
1192 const char *filename)
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001193{
1194 unsigned long numbytes;
1195 FILE *image;
Stephan Guilloux21dd55b2009-06-01 22:07:52 +00001196
1197 if (!filename) {
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001198 msg_gerr("No filename specified.\n");
Stephan Guilloux21dd55b2009-06-01 22:07:52 +00001199 return 1;
1200 }
Patrick Georgi0bf842d2010-01-25 22:55:33 +00001201 if ((image = fopen(filename, "wb")) == NULL) {
Stefan Tauner363fd7e2013-04-07 13:08:30 +00001202 msg_gerr("Error: opening file \"%s\" failed: %s\n", filename, strerror(errno));
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00001203 return 1;
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001204 }
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001205
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001206 numbytes = fwrite(buf, 1, size, image);
1207 fclose(image);
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001208 if (numbytes != size) {
1209 msg_gerr("File %s could not be written completely.\n",
1210 filename);
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001211 return 1;
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001212 }
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001213 return 0;
1214}
1215
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001216int read_flash_to_file(struct flashctx *flash, const char *filename)
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001217{
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001218 unsigned long size = flash->chip->total_size * 1024;
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001219 unsigned char *buf = calloc(size, sizeof(char));
1220 int ret = 0;
1221
1222 msg_cinfo("Reading flash... ");
1223 if (!buf) {
1224 msg_gerr("Memory allocation failed!\n");
1225 msg_cinfo("FAILED.\n");
1226 return 1;
1227 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001228 if (!flash->chip->read) {
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001229 msg_cerr("No read function available for this flash chip.\n");
1230 ret = 1;
1231 goto out_free;
1232 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001233 if (flash->chip->read(flash, buf, 0, size)) {
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001234 msg_cerr("Read operation failed!\n");
1235 ret = 1;
1236 goto out_free;
1237 }
1238
Stefan Tauner355cbfd2011-05-28 02:37:14 +00001239 ret = write_buf_to_file(buf, size, filename);
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001240out_free:
1241 free(buf);
1242 msg_cinfo("%s.\n", ret ? "FAILED" : "done");
1243 return ret;
1244}
1245
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001246/* This function shares a lot of its structure with erase_and_write_flash() and
1247 * walk_eraseregions().
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001248 * Even if an error is found, the function will keep going and check the rest.
1249 */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001250static int selfcheck_eraseblocks(const struct flashchip *chip)
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001251{
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +00001252 int i, j, k;
1253 int ret = 0;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001254
1255 for (k = 0; k < NUM_ERASEFUNCTIONS; k++) {
1256 unsigned int done = 0;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001257 struct block_eraser eraser = chip->block_erasers[k];
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001258
1259 for (i = 0; i < NUM_ERASEREGIONS; i++) {
1260 /* Blocks with zero size are bugs in flashchips.c. */
1261 if (eraser.eraseblocks[i].count &&
1262 !eraser.eraseblocks[i].size) {
1263 msg_gerr("ERROR: Flash chip %s erase function "
1264 "%i region %i has size 0. Please report"
1265 " a bug at flashrom@flashrom.org\n",
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001266 chip->name, k, i);
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001267 ret = 1;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001268 }
1269 /* Blocks with zero count are bugs in flashchips.c. */
1270 if (!eraser.eraseblocks[i].count &&
1271 eraser.eraseblocks[i].size) {
1272 msg_gerr("ERROR: Flash chip %s erase function "
1273 "%i region %i has count 0. Please report"
1274 " a bug at flashrom@flashrom.org\n",
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001275 chip->name, k, i);
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001276 ret = 1;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001277 }
1278 done += eraser.eraseblocks[i].count *
1279 eraser.eraseblocks[i].size;
1280 }
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001281 /* Empty eraseblock definition with erase function. */
1282 if (!done && eraser.block_erase)
Sean Nelson316a29f2010-05-07 20:09:04 +00001283 msg_gspew("Strange: Empty eraseblock definition with "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001284 "non-empty erase function. Not an error.\n");
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001285 if (!done)
1286 continue;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001287 if (done != chip->total_size * 1024) {
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001288 msg_gerr("ERROR: Flash chip %s erase function %i "
1289 "region walking resulted in 0x%06x bytes total,"
1290 " expected 0x%06x bytes. Please report a bug at"
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001291 " flashrom@flashrom.org\n", chip->name, k,
1292 done, chip->total_size * 1024);
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001293 ret = 1;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001294 }
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001295 if (!eraser.block_erase)
1296 continue;
1297 /* Check if there are identical erase functions for different
1298 * layouts. That would imply "magic" erase functions. The
1299 * easiest way to check this is with function pointers.
1300 */
Uwe Hermann43959702010-03-13 17:28:29 +00001301 for (j = k + 1; j < NUM_ERASEFUNCTIONS; j++) {
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001302 if (eraser.block_erase ==
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001303 chip->block_erasers[j].block_erase) {
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001304 msg_gerr("ERROR: Flash chip %s erase function "
1305 "%i and %i are identical. Please report"
1306 " a bug at flashrom@flashrom.org\n",
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001307 chip->name, k, j);
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001308 ret = 1;
1309 }
Uwe Hermann43959702010-03-13 17:28:29 +00001310 }
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001311 }
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001312 return ret;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001313}
1314
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001315static int erase_and_write_block_helper(struct flashctx *flash,
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001316 unsigned int start, unsigned int len,
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001317 uint8_t *curcontents,
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001318 uint8_t *newcontents,
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001319 int (*erasefn) (struct flashctx *flash,
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001320 unsigned int addr,
1321 unsigned int len))
1322{
Stefan Taunerc69c9c82011-11-23 09:13:48 +00001323 unsigned int starthere = 0, lenhere = 0;
1324 int ret = 0, skip = 1, writecount = 0;
Stefan Tauner50d67aa2013-03-03 23:49:48 +00001325 enum write_granularity gran = flash->chip->gran;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001326
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001327 /* curcontents and newcontents are opaque to walk_eraseregions, and
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001328 * need to be adjusted here to keep the impression of proper abstraction
1329 */
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001330 curcontents += start;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001331 newcontents += start;
1332 msg_cdbg(":");
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001333 if (need_erase(curcontents, newcontents, len, gran)) {
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001334 msg_cdbg("E");
1335 ret = erasefn(flash, start, len);
1336 if (ret)
1337 return ret;
Carl-Daniel Hailfingerb4061f62011-06-26 17:04:16 +00001338 if (check_erased_range(flash, start, len)) {
1339 msg_cerr("ERASE FAILED!\n");
1340 return -1;
1341 }
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001342 /* Erase was successful. Adjust curcontents. */
1343 memset(curcontents, 0xff, len);
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001344 skip = 0;
1345 }
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001346 /* get_next_write() sets starthere to a new value after the call. */
1347 while ((lenhere = get_next_write(curcontents + starthere,
1348 newcontents + starthere,
1349 len - starthere, &starthere, gran))) {
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001350 if (!writecount++)
1351 msg_cdbg("W");
1352 /* Needs the partial write function signature. */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001353 ret = flash->chip->write(flash, newcontents + starthere,
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001354 start + starthere, lenhere);
1355 if (ret)
1356 return ret;
1357 starthere += lenhere;
1358 skip = 0;
1359 }
1360 if (skip)
1361 msg_cdbg("S");
Stefan Tauner682122b2013-06-23 22:15:39 +00001362 else
1363 all_skipped = false;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001364 return ret;
1365}
1366
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001367static int walk_eraseregions(struct flashctx *flash, int erasefunction,
1368 int (*do_something) (struct flashctx *flash,
Carl-Daniel Hailfinger4d3e9ca2010-07-13 00:42:00 +00001369 unsigned int addr,
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001370 unsigned int len,
1371 uint8_t *param1,
1372 uint8_t *param2,
1373 int (*erasefn) (
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001374 struct flashctx *flash,
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001375 unsigned int addr,
1376 unsigned int len)),
1377 void *param1, void *param2)
Carl-Daniel Hailfingera1223412010-07-13 00:37:19 +00001378{
1379 int i, j;
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +00001380 unsigned int start = 0;
1381 unsigned int len;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001382 struct block_eraser eraser = flash->chip->block_erasers[erasefunction];
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001383
Carl-Daniel Hailfingera1223412010-07-13 00:37:19 +00001384 for (i = 0; i < NUM_ERASEREGIONS; i++) {
1385 /* count==0 for all automatically initialized array
1386 * members so the loop below won't be executed for them.
1387 */
1388 len = eraser.eraseblocks[i].size;
1389 for (j = 0; j < eraser.eraseblocks[i].count; j++) {
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001390 /* Print this for every block except the first one. */
1391 if (i || j)
1392 msg_cdbg(", ");
1393 msg_cdbg("0x%06x-0x%06x", start,
Carl-Daniel Hailfingera1223412010-07-13 00:37:19 +00001394 start + len - 1);
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001395 if (do_something(flash, start, len, param1, param2,
1396 eraser.block_erase)) {
Carl-Daniel Hailfingera1223412010-07-13 00:37:19 +00001397 return 1;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001398 }
Carl-Daniel Hailfingera1223412010-07-13 00:37:19 +00001399 start += len;
1400 }
1401 }
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001402 msg_cdbg("\n");
Carl-Daniel Hailfingera1223412010-07-13 00:37:19 +00001403 return 0;
1404}
1405
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001406static int check_block_eraser(const struct flashctx *flash, int k, int log)
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001407{
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001408 struct block_eraser eraser = flash->chip->block_erasers[k];
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001409
1410 if (!eraser.block_erase && !eraser.eraseblocks[0].count) {
1411 if (log)
1412 msg_cdbg("not defined. ");
1413 return 1;
1414 }
1415 if (!eraser.block_erase && eraser.eraseblocks[0].count) {
1416 if (log)
1417 msg_cdbg("eraseblock layout is known, but matching "
Stefan Tauner355cbfd2011-05-28 02:37:14 +00001418 "block erase function is not implemented. ");
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001419 return 1;
1420 }
1421 if (eraser.block_erase && !eraser.eraseblocks[0].count) {
1422 if (log)
1423 msg_cdbg("block erase function found, but "
Stefan Tauner355cbfd2011-05-28 02:37:14 +00001424 "eraseblock layout is not defined. ");
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001425 return 1;
1426 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001427 // TODO: Once erase functions are annotated with allowed buses, check that as well.
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001428 return 0;
1429}
1430
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001431int erase_and_write_flash(struct flashctx *flash, uint8_t *oldcontents,
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001432 uint8_t *newcontents)
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001433{
Carl-Daniel Hailfingerd8334db2011-07-21 21:21:04 +00001434 int k, ret = 1;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001435 uint8_t *curcontents;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001436 unsigned long size = flash->chip->total_size * 1024;
Sylvain "ythier" Hitier9db45512011-07-04 07:27:17 +00001437 unsigned int usable_erasefunctions = count_usable_erasers(flash);
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001438
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001439 msg_cinfo("Erasing and writing flash chip... ");
Stefan Tauner269de352011-07-12 22:35:21 +00001440 curcontents = malloc(size);
1441 if (!curcontents) {
1442 msg_gerr("Out of memory!\n");
1443 exit(1);
1444 }
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001445 /* Copy oldcontents to curcontents to avoid clobbering oldcontents. */
1446 memcpy(curcontents, oldcontents, size);
1447
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001448 for (k = 0; k < NUM_ERASEFUNCTIONS; k++) {
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001449 if (k != 0)
1450 msg_cdbg("Looking for another erase function.\n");
Carl-Daniel Hailfingerd8334db2011-07-21 21:21:04 +00001451 if (!usable_erasefunctions) {
1452 msg_cdbg("No usable erase functions left.\n");
1453 break;
1454 }
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001455 msg_cdbg("Trying erase function %i... ", k);
1456 if (check_block_eraser(flash, k, 1))
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001457 continue;
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001458 usable_erasefunctions--;
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001459 ret = walk_eraseregions(flash, k, &erase_and_write_block_helper,
1460 curcontents, newcontents);
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001461 /* If everything is OK, don't try another erase function. */
1462 if (!ret)
1463 break;
Carl-Daniel Hailfingerb23b1eb2010-12-02 02:41:55 +00001464 /* Write/erase failed, so try to find out what the current chip
Carl-Daniel Hailfingerd8334db2011-07-21 21:21:04 +00001465 * contents are. If no usable erase functions remain, we can
1466 * skip this: the next iteration will break immediately anyway.
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001467 */
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001468 if (!usable_erasefunctions)
1469 continue;
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001470 /* Reading the whole chip may take a while, inform the user even
1471 * in non-verbose mode.
1472 */
1473 msg_cinfo("Reading current flash chip contents... ");
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001474 if (flash->chip->read(flash, curcontents, 0, size)) {
Carl-Daniel Hailfingerb23b1eb2010-12-02 02:41:55 +00001475 /* Now we are truly screwed. Read failed as well. */
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001476 msg_cerr("Can't read anymore! Aborting.\n");
Carl-Daniel Hailfingerb23b1eb2010-12-02 02:41:55 +00001477 /* We have no idea about the flash chip contents, so
1478 * retrying with another erase function is pointless.
1479 */
1480 break;
1481 }
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001482 msg_cinfo("done. ");
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001483 }
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001484 /* Free the scratchpad. */
1485 free(curcontents);
Carl-Daniel Hailfingerf160a122009-05-08 17:15:15 +00001486
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001487 if (ret) {
Sean Nelson316a29f2010-05-07 20:09:04 +00001488 msg_cerr("FAILED!\n");
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001489 } else {
Stefan Tauner682122b2013-06-23 22:15:39 +00001490 if (all_skipped)
1491 msg_cinfo("\nWarning: Chip content is identical to the requested image.\n");
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001492 msg_cinfo("Erase/write done.\n");
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001493 }
1494 return ret;
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001495}
1496
Stefan Tauner136388f2013-07-15 10:47:53 +00001497static void nonfatal_help_message(void)
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001498{
Stefan Tauner136388f2013-07-15 10:47:53 +00001499 msg_gerr("Writing to the flash chip apparently didn't do anything.\n");
1500#if CONFIG_INTERNAL == 1
1501 if (programmer == PROGRAMMER_INTERNAL)
1502 msg_gerr("This means we have to add special support for your board, programmer or flash\n"
1503 "chip. Please report this on IRC at chat.freenode.net (channel #flashrom) or\n"
1504 "mail flashrom@flashrom.org, thanks!\n"
1505 "-------------------------------------------------------------------------------\n"
1506 "You may now reboot or simply leave the machine running.\n");
1507 else
1508#endif
1509 msg_gerr("Please check the connections (especially those to write protection pins) between\n"
1510 "the programmer and the flash chip. If you think the error is caused by flashrom\n"
1511 "please report this on IRC at chat.freenode.net (channel #flashrom) or\n"
1512 "mail flashrom@flashrom.org, thanks!\n");
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001513}
1514
Stefan Tauner136388f2013-07-15 10:47:53 +00001515static void emergency_help_message(void)
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00001516{
Stefan Tauner136388f2013-07-15 10:47:53 +00001517 msg_gerr("Your flash chip is in an unknown state.\n");
1518#if CONFIG_INTERNAL == 1
1519 if (programmer == PROGRAMMER_INTERNAL)
1520 msg_gerr("Get help on IRC at chat.freenode.net (channel #flashrom) or\n"
1521 "mail flashrom@flashrom.org with the subject \"FAILED: <your board name>\"!\n"
1522 "-------------------------------------------------------------------------------\n"
1523 "DO NOT REBOOT OR POWEROFF!\n");
1524 else
1525#endif
1526 msg_gerr("Please report this on IRC at chat.freenode.net (channel #flashrom) or\n"
1527 "mail flashrom@flashrom.org, thanks!\n");
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00001528}
1529
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001530/* The way to go if you want a delimited list of programmers */
Stefan Tauner66652442011-06-26 17:38:17 +00001531void list_programmers(const char *delim)
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001532{
1533 enum programmer p;
1534 for (p = 0; p < PROGRAMMER_INVALID; p++) {
Sean Nelson316a29f2010-05-07 20:09:04 +00001535 msg_ginfo("%s", programmer_table[p].name);
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001536 if (p < PROGRAMMER_INVALID - 1)
Sean Nelson316a29f2010-05-07 20:09:04 +00001537 msg_ginfo("%s", delim);
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001538 }
Sean Nelson316a29f2010-05-07 20:09:04 +00001539 msg_ginfo("\n");
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001540}
1541
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001542void list_programmers_linebreak(int startcol, int cols, int paren)
1543{
1544 const char *pname;
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +00001545 int pnamelen;
1546 int remaining = 0, firstline = 1;
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001547 enum programmer p;
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +00001548 int i;
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001549
1550 for (p = 0; p < PROGRAMMER_INVALID; p++) {
1551 pname = programmer_table[p].name;
1552 pnamelen = strlen(pname);
1553 if (remaining - pnamelen - 2 < 0) {
1554 if (firstline)
1555 firstline = 0;
1556 else
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001557 msg_ginfo("\n");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001558 for (i = 0; i < startcol; i++)
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001559 msg_ginfo(" ");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001560 remaining = cols - startcol;
1561 } else {
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001562 msg_ginfo(" ");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001563 remaining--;
1564 }
1565 if (paren && (p == 0)) {
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001566 msg_ginfo("(");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001567 remaining--;
1568 }
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001569 msg_ginfo("%s", pname);
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001570 remaining -= pnamelen;
1571 if (p < PROGRAMMER_INVALID - 1) {
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001572 msg_ginfo(",");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001573 remaining--;
1574 } else {
1575 if (paren)
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001576 msg_ginfo(")");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001577 }
1578 }
1579}
1580
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001581void print_sysinfo(void)
1582{
Carl-Daniel Hailfinger60d9bd22012-08-09 23:34:41 +00001583#ifdef _WIN32
1584 SYSTEM_INFO si;
1585 OSVERSIONINFOEX osvi;
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001586
Carl-Daniel Hailfinger60d9bd22012-08-09 23:34:41 +00001587 memset(&si, 0, sizeof(SYSTEM_INFO));
1588 memset(&osvi, 0, sizeof(OSVERSIONINFOEX));
1589 msg_ginfo(" on Windows");
1590 /* Tell Windows which version of the structure we want. */
1591 osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
1592 if (GetVersionEx((OSVERSIONINFO*) &osvi))
1593 msg_ginfo(" %lu.%lu", osvi.dwMajorVersion, osvi.dwMinorVersion);
1594 else
1595 msg_ginfo(" unknown version");
1596 GetSystemInfo(&si);
1597 switch (si.wProcessorArchitecture) {
1598 case PROCESSOR_ARCHITECTURE_AMD64:
1599 msg_ginfo(" (x86_64)");
1600 break;
1601 case PROCESSOR_ARCHITECTURE_INTEL:
1602 msg_ginfo(" (x86)");
1603 break;
1604 default:
1605 msg_ginfo(" (unknown arch)");
1606 break;
1607 }
1608#elif HAVE_UTSNAME == 1
1609 struct utsname osinfo;
1610
1611 uname(&osinfo);
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001612 msg_ginfo(" on %s %s (%s)", osinfo.sysname, osinfo.release,
1613 osinfo.machine);
1614#else
1615 msg_ginfo(" on unknown machine");
1616#endif
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001617}
1618
1619void print_buildinfo(void)
1620{
1621 msg_gdbg("flashrom was built with");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001622#if NEED_PCI == 1
1623#ifdef PCILIB_VERSION
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001624 msg_gdbg(" libpci %s,", PCILIB_VERSION);
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001625#else
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001626 msg_gdbg(" unknown PCI library,");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001627#endif
1628#endif
1629#ifdef __clang__
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001630 msg_gdbg(" LLVM Clang");
Carl-Daniel Hailfingerb51e58e2010-07-17 14:49:30 +00001631#ifdef __clang_version__
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001632 msg_gdbg(" %s,", __clang_version__);
Carl-Daniel Hailfingerb51e58e2010-07-17 14:49:30 +00001633#else
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001634 msg_gdbg(" unknown version (before r102686),");
Carl-Daniel Hailfingerb51e58e2010-07-17 14:49:30 +00001635#endif
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001636#elif defined(__GNUC__)
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001637 msg_gdbg(" GCC");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001638#ifdef __VERSION__
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001639 msg_gdbg(" %s,", __VERSION__);
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001640#else
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001641 msg_gdbg(" unknown version,");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001642#endif
1643#else
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001644 msg_gdbg(" unknown compiler,");
Carl-Daniel Hailfingercceafa22010-05-26 01:45:41 +00001645#endif
1646#if defined (__FLASHROM_LITTLE_ENDIAN__)
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001647 msg_gdbg(" little endian");
Carl-Daniel Hailfinger06b9efa2012-08-07 11:59:59 +00001648#elif defined (__FLASHROM_BIG_ENDIAN__)
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001649 msg_gdbg(" big endian");
Carl-Daniel Hailfinger06b9efa2012-08-07 11:59:59 +00001650#else
1651#error Endianness could not be determined
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001652#endif
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001653 msg_gdbg("\n");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001654}
1655
Bernhard Walle201bde32008-01-21 15:24:22 +00001656void print_version(void)
1657{
Carl-Daniel Hailfinger8841d3e2010-05-15 15:04:37 +00001658 msg_ginfo("flashrom v%s", flashrom_version);
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001659 print_sysinfo();
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001660 msg_ginfo("\n");
Bernhard Walle201bde32008-01-21 15:24:22 +00001661}
1662
Carl-Daniel Hailfinger8841d3e2010-05-15 15:04:37 +00001663void print_banner(void)
1664{
1665 msg_ginfo("flashrom is free software, get the source code at "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001666 "http://www.flashrom.org\n");
Carl-Daniel Hailfinger8841d3e2010-05-15 15:04:37 +00001667 msg_ginfo("\n");
1668}
1669
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001670int selfcheck(void)
1671{
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001672 const struct flashchip *chip;
Stefan Taunera6d96482012-12-26 19:51:23 +00001673 int i;
1674 int ret = 0;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001675
1676 /* Safety check. Instead of aborting after the first error, check
1677 * if more errors exist.
1678 */
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001679 if (ARRAY_SIZE(programmer_table) - 1 != PROGRAMMER_INVALID) {
Sean Nelson316a29f2010-05-07 20:09:04 +00001680 msg_gerr("Programmer table miscompilation!\n");
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001681 ret = 1;
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001682 }
Stefan Taunera6d96482012-12-26 19:51:23 +00001683 for (i = 0; i < PROGRAMMER_INVALID; i++) {
1684 const struct programmer_entry p = programmer_table[i];
1685 if (p.name == NULL) {
1686 msg_gerr("All programmers need a valid name, but the one with index %d does not!\n", i);
1687 ret = 1;
1688 /* This might hide other problems with this programmer, but allows for better error
1689 * messages below without jumping through hoops. */
1690 continue;
1691 }
Stefan Tauneraf358d62012-12-27 18:40:26 +00001692 switch (p.type) {
1693 case USB:
1694 case PCI:
1695 case OTHER:
1696 if (p.devs.note == NULL) {
1697 if (strcmp("internal", p.name) == 0)
1698 break; /* This one has its device list stored separately. */
1699 msg_gerr("Programmer %s has neither a device list nor a textual description!\n",
1700 p.name);
1701 ret = 1;
1702 }
1703 break;
1704 default:
1705 msg_gerr("Programmer %s does not have a valid type set!\n", p.name);
1706 ret = 1;
1707 break;
1708 }
Stefan Taunera6d96482012-12-26 19:51:23 +00001709 if (p.init == NULL) {
1710 msg_gerr("Programmer %s does not have a valid init function!\n", p.name);
1711 ret = 1;
1712 }
1713 if (p.delay == NULL) {
1714 msg_gerr("Programmer %s does not have a valid delay function!\n", p.name);
1715 ret = 1;
1716 }
1717 if (p.map_flash_region == NULL) {
1718 msg_gerr("Programmer %s does not have a valid map_flash_region function!\n", p.name);
1719 ret = 1;
1720 }
1721 if (p.unmap_flash_region == NULL) {
1722 msg_gerr("Programmer %s does not have a valid unmap_flash_region function!\n", p.name);
1723 ret = 1;
1724 }
1725 }
Stefan Tauner93f70232011-07-26 14:33:46 +00001726 /* It would be favorable if we could also check for correct termination
Stefan Tauner716e0982011-07-25 20:38:52 +00001727 * of the following arrays, but we don't know their sizes in here...
Stefan Tauner7bcacb12011-05-26 01:35:19 +00001728 * For 'flashchips' we check the first element to be non-null. In the
1729 * other cases there exist use cases where the first element can be
1730 * null. */
1731 if (flashchips == NULL || flashchips[0].vendor == NULL) {
1732 msg_gerr("Flashchips table miscompilation!\n");
1733 ret = 1;
1734 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001735 for (chip = flashchips; chip && chip->name; chip++)
1736 if (selfcheck_eraseblocks(chip))
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001737 ret = 1;
Stefan Tauner7bcacb12011-05-26 01:35:19 +00001738
1739#if CONFIG_INTERNAL == 1
1740 if (chipset_enables == NULL) {
1741 msg_gerr("Chipset enables table does not exist!\n");
1742 ret = 1;
1743 }
Carl-Daniel Hailfinger97d5b122011-08-31 16:19:50 +00001744 if (board_matches == NULL) {
Stefan Tauner7bcacb12011-05-26 01:35:19 +00001745 msg_gerr("Board enables table does not exist!\n");
1746 ret = 1;
1747 }
1748 if (boards_known == NULL) {
1749 msg_gerr("Known boards table does not exist!\n");
1750 ret = 1;
1751 }
1752 if (laptops_known == NULL) {
1753 msg_gerr("Known laptops table does not exist!\n");
1754 ret = 1;
1755 }
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001756#endif
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001757 return ret;
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001758}
1759
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001760void check_chip_supported(const struct flashchip *chip)
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001761{
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001762 if (chip->feature_bits & FEATURE_OTP) {
Daniel Lenski65922a32012-02-15 23:40:23 +00001763 msg_cdbg("This chip may contain one-time programmable memory. "
1764 "flashrom cannot read\nand may never be able to write "
1765 "it, hence it may not be able to completely\n"
1766 "clone the contents of this chip (see man page for "
1767 "details).\n");
1768 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001769 if (TEST_OK_MASK != (chip->tested & TEST_OK_MASK)) {
Sean Nelson316a29f2010-05-07 20:09:04 +00001770 msg_cinfo("===\n");
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001771 if (chip->tested & TEST_BAD_MASK) {
Sean Nelson316a29f2010-05-07 20:09:04 +00001772 msg_cinfo("This flash part has status NOT WORKING for operations:");
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001773 if (chip->tested & TEST_BAD_PROBE)
Sean Nelson316a29f2010-05-07 20:09:04 +00001774 msg_cinfo(" PROBE");
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001775 if (chip->tested & TEST_BAD_READ)
Sean Nelson316a29f2010-05-07 20:09:04 +00001776 msg_cinfo(" READ");
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001777 if (chip->tested & TEST_BAD_ERASE)
Sean Nelson316a29f2010-05-07 20:09:04 +00001778 msg_cinfo(" ERASE");
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001779 if (chip->tested & TEST_BAD_WRITE)
Sean Nelson316a29f2010-05-07 20:09:04 +00001780 msg_cinfo(" WRITE");
1781 msg_cinfo("\n");
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001782 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001783 if ((!(chip->tested & TEST_BAD_PROBE) && !(chip->tested & TEST_OK_PROBE)) ||
1784 (!(chip->tested & TEST_BAD_READ) && !(chip->tested & TEST_OK_READ)) ||
1785 (!(chip->tested & TEST_BAD_ERASE) && !(chip->tested & TEST_OK_ERASE)) ||
1786 (!(chip->tested & TEST_BAD_WRITE) && !(chip->tested & TEST_OK_WRITE))) {
Sean Nelson316a29f2010-05-07 20:09:04 +00001787 msg_cinfo("This flash part has status UNTESTED for operations:");
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001788 if (!(chip->tested & TEST_BAD_PROBE) && !(chip->tested & TEST_OK_PROBE))
Sean Nelson316a29f2010-05-07 20:09:04 +00001789 msg_cinfo(" PROBE");
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001790 if (!(chip->tested & TEST_BAD_READ) && !(chip->tested & TEST_OK_READ))
Sean Nelson316a29f2010-05-07 20:09:04 +00001791 msg_cinfo(" READ");
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001792 if (!(chip->tested & TEST_BAD_ERASE) && !(chip->tested & TEST_OK_ERASE))
Sean Nelson316a29f2010-05-07 20:09:04 +00001793 msg_cinfo(" ERASE");
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001794 if (!(chip->tested & TEST_BAD_WRITE) && !(chip->tested & TEST_OK_WRITE))
Sean Nelson316a29f2010-05-07 20:09:04 +00001795 msg_cinfo(" WRITE");
1796 msg_cinfo("\n");
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001797 }
Carl-Daniel Hailfingera84835a2010-01-07 03:24:05 +00001798 /* FIXME: This message is designed towards CLI users. */
Carl-Daniel Hailfinger8841d3e2010-05-15 15:04:37 +00001799 msg_cinfo("The test status of this chip may have been updated "
1800 "in the latest development\n"
1801 "version of flashrom. If you are running the latest "
1802 "development version,\n"
1803 "please email a report to flashrom@flashrom.org if "
1804 "any of the above operations\n"
1805 "work correctly for you with this flash part. Please "
1806 "include the flashrom\n"
1807 "output with the additional -V option for all "
1808 "operations you tested (-V, -Vr,\n"
Paul Menzele3800132012-01-12 13:58:43 +00001809 "-VE, -Vw), and mention which mainboard or "
Carl-Daniel Hailfinger8841d3e2010-05-15 15:04:37 +00001810 "programmer you tested.\n"
Paul Menzelab6328f2010-10-08 11:03:02 +00001811 "Please mention your board in the subject line. "
1812 "Thanks for your help!\n");
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001813 }
1814}
1815
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001816/* FIXME: This function signature needs to be improved once doit() has a better
1817 * function signature.
1818 */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001819int chip_safety_check(const struct flashctx *flash, int force, int read_it, int write_it, int erase_it,
1820 int verify_it)
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001821{
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001822 const struct flashchip *chip = flash->chip;
1823
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001824 if (!programmer_may_write && (write_it || erase_it)) {
1825 msg_perr("Write/erase is not working yet on your programmer in "
1826 "its current configuration.\n");
1827 /* --force is the wrong approach, but it's the best we can do
1828 * until the generic programmer parameter parser is merged.
1829 */
1830 if (!force)
1831 return 1;
1832 msg_cerr("Continuing anyway.\n");
1833 }
1834
1835 if (read_it || erase_it || write_it || verify_it) {
1836 /* Everything needs read. */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001837 if (chip->tested & TEST_BAD_READ) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001838 msg_cerr("Read is not working on this chip. ");
1839 if (!force)
1840 return 1;
1841 msg_cerr("Continuing anyway.\n");
1842 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001843 if (!chip->read) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001844 msg_cerr("flashrom has no read function for this "
1845 "flash chip.\n");
1846 return 1;
1847 }
1848 }
1849 if (erase_it || write_it) {
1850 /* Write needs erase. */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001851 if (chip->tested & TEST_BAD_ERASE) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001852 msg_cerr("Erase is not working on this chip. ");
1853 if (!force)
1854 return 1;
1855 msg_cerr("Continuing anyway.\n");
1856 }
Sylvain "ythier" Hitier9db45512011-07-04 07:27:17 +00001857 if(count_usable_erasers(flash) == 0) {
Stefan Tauner5368dca2011-07-01 00:19:12 +00001858 msg_cerr("flashrom has no erase function for this "
1859 "flash chip.\n");
1860 return 1;
1861 }
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001862 }
1863 if (write_it) {
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001864 if (chip->tested & TEST_BAD_WRITE) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001865 msg_cerr("Write is not working on this chip. ");
1866 if (!force)
1867 return 1;
1868 msg_cerr("Continuing anyway.\n");
1869 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001870 if (!chip->write) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001871 msg_cerr("flashrom has no write function for this "
1872 "flash chip.\n");
1873 return 1;
1874 }
1875 }
1876 return 0;
1877}
1878
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001879/* This function signature is horrible. We need to design a better interface,
1880 * but right now it allows us to split off the CLI code.
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00001881 * Besides that, the function itself is a textbook example of abysmal code flow.
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001882 */
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +00001883int doit(struct flashctx *flash, int force, const char *filename, int read_it,
1884 int write_it, int erase_it, int verify_it)
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001885{
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001886 uint8_t *oldcontents;
1887 uint8_t *newcontents;
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001888 int ret = 0;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001889 unsigned long size = flash->chip->total_size * 1024;
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001890
David Hendricks77f931a2011-05-18 01:30:56 +00001891 if (chip_safety_check(flash, force, read_it, write_it, erase_it, verify_it)) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001892 msg_cerr("Aborting.\n");
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001893 ret = 1;
1894 goto out_nofree;
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001895 }
1896
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001897 /* Given the existence of read locks, we want to unlock for read,
1898 * erase and write.
1899 */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001900 if (flash->chip->unlock)
1901 flash->chip->unlock(flash);
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001902
1903 if (read_it) {
1904 ret = read_flash_to_file(flash, filename);
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001905 goto out_nofree;
Carl-Daniel Hailfingerd1be52d2010-07-03 12:14:25 +00001906 }
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001907
Stefan Tauner269de352011-07-12 22:35:21 +00001908 oldcontents = malloc(size);
1909 if (!oldcontents) {
1910 msg_gerr("Out of memory!\n");
1911 exit(1);
1912 }
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001913 /* Assume worst case: All bits are 0. */
1914 memset(oldcontents, 0x00, size);
Stefan Tauner269de352011-07-12 22:35:21 +00001915 newcontents = malloc(size);
1916 if (!newcontents) {
1917 msg_gerr("Out of memory!\n");
1918 exit(1);
1919 }
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001920 /* Assume best case: All bits should be 1. */
1921 memset(newcontents, 0xff, size);
1922 /* Side effect of the assumptions above: Default write action is erase
1923 * because newcontents looks like a completely erased chip, and
1924 * oldcontents being completely 0x00 means we have to erase everything
1925 * before we can write.
1926 */
1927
Ollie Lhoefa28582004-12-08 20:10:01 +00001928 if (erase_it) {
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001929 /* FIXME: Do we really want the scary warning if erase failed?
1930 * After all, after erase the chip is either blank or partially
1931 * blank or it has the old contents. A blank chip won't boot,
1932 * so if the user wanted erase and reboots afterwards, the user
1933 * knows very well that booting won't work.
1934 */
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001935 if (erase_and_write_flash(flash, oldcontents, newcontents)) {
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00001936 emergency_help_message();
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001937 ret = 1;
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00001938 }
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001939 goto out;
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00001940 }
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001941
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00001942 if (write_it || verify_it) {
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001943 if (read_buf_from_file(newcontents, size, filename)) {
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001944 ret = 1;
1945 goto out;
Stefan Reinauer018aca82006-11-21 23:48:51 +00001946 }
1947
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +00001948#if CONFIG_INTERNAL == 1
Stefan Taunerb4e06bd2012-08-20 00:24:22 +00001949 if (programmer == PROGRAMMER_INTERNAL && cb_check_image(newcontents, size) < 0) {
1950 if (force_boardmismatch) {
1951 msg_pinfo("Proceeding anyway because user forced us to.\n");
1952 } else {
1953 msg_perr("Aborting. You can override this with "
1954 "-p internal:boardmismatch=force.\n");
Niklas Söderlund9e423762012-06-16 00:11:16 +00001955 ret = 1;
1956 goto out;
1957 }
Stefan Taunerb4e06bd2012-08-20 00:24:22 +00001958 }
Carl-Daniel Hailfinger66ef4e52009-12-13 22:28:00 +00001959#endif
Ollie Lhocbbf1252004-03-17 22:22:08 +00001960 }
1961
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001962 /* Read the whole chip to be able to check whether regions need to be
1963 * erased and to give better diagnostics in case write fails.
1964 * The alternative would be to read only the regions which are to be
1965 * preserved, but in that case we might perform unneeded erase which
1966 * takes time as well.
1967 */
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001968 msg_cinfo("Reading old flash chip contents... ");
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001969 if (flash->chip->read(flash, oldcontents, 0, size)) {
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001970 ret = 1;
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001971 msg_cinfo("FAILED.\n");
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001972 goto out;
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001973 }
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001974 msg_cinfo("done.\n");
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001975
Ollie Lho184a4042005-11-26 21:55:36 +00001976 // This should be moved into each flash part's code to do it
1977 // cleanly. This does the job.
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001978 handle_romentries(flash, oldcontents, newcontents);
Uwe Hermanna7e05482007-05-09 10:17:44 +00001979
Ollie Lho184a4042005-11-26 21:55:36 +00001980 // ////////////////////////////////////////////////////////////
Uwe Hermanna7e05482007-05-09 10:17:44 +00001981
Peter Stugef31104c2008-04-28 14:47:30 +00001982 if (write_it) {
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001983 if (erase_and_write_flash(flash, oldcontents, newcontents)) {
1984 msg_cerr("Uh oh. Erase/write failed. Checking if "
1985 "anything changed.\n");
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001986 if (!flash->chip->read(flash, newcontents, 0, size)) {
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001987 if (!memcmp(oldcontents, newcontents, size)) {
Stefan Tauner136388f2013-07-15 10:47:53 +00001988 msg_cinfo("Good. It seems nothing was changed.\n");
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001989 nonfatal_help_message();
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001990 ret = 1;
1991 goto out;
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001992 }
1993 }
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00001994 emergency_help_message();
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001995 ret = 1;
1996 goto out;
Peter Stugef31104c2008-04-28 14:47:30 +00001997 }
Peter Stugef31104c2008-04-28 14:47:30 +00001998 }
Ollie Lho184a4042005-11-26 21:55:36 +00001999
Stefan Taunerc4f44df2013-08-12 22:58:43 +00002000 /* Verify only if we either did not try to write (verify operation) or actually changed something. */
2001 if (verify_it && (!write_it || !all_skipped)) {
Stefan Tauner78ffbea2012-10-27 15:36:56 +00002002 msg_cinfo("Verifying flash... ");
2003
2004 if (write_it) {
2005 /* Work around chips which need some time to calm down. */
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00002006 programmer_delay(1000*1000);
Stefan Tauner78ffbea2012-10-27 15:36:56 +00002007 ret = verify_range(flash, newcontents, 0, size);
2008 /* If we tried to write, and verification now fails, we
2009 * might have an emergency situation.
2010 */
2011 if (ret)
2012 emergency_help_message();
2013 } else {
2014 ret = compare_range(newcontents, oldcontents, 0, size);
2015 }
2016 if (!ret)
2017 msg_cinfo("VERIFIED.\n");
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00002018 }
Ollie Lho184a4042005-11-26 21:55:36 +00002019
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00002020out:
2021 free(oldcontents);
2022 free(newcontents);
2023out_nofree:
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +00002024 programmer_shutdown();
Stefan Reinauer143da0b2006-01-04 16:42:57 +00002025 return ret;
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00002026}