blob: b05faf34857b486a81d5eb6308ed3422713a7ab7 [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
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +0000338static int check_block_eraser(const struct flashctx *flash, int k, int log);
Stefan Tauner5368dca2011-07-01 00:19:12 +0000339
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000340/* Register a function to be executed on programmer shutdown.
341 * The advantage over atexit() is that you can supply a void pointer which will
342 * be used as parameter to the registered function upon programmer shutdown.
343 * This pointer can point to arbitrary data used by said function, e.g. undo
344 * information for GPIO settings etc. If unneeded, set data=NULL.
345 * Please note that the first (void *data) belongs to the function signature of
346 * the function passed as first parameter.
347 */
David Hendricks8bb20212011-06-14 01:35:36 +0000348int register_shutdown(int (*function) (void *data), void *data)
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000349{
350 if (shutdown_fn_count >= SHUTDOWN_MAXFN) {
Carl-Daniel Hailfinger9f5f2152010-06-04 23:20:21 +0000351 msg_perr("Tried to register more than %i shutdown functions.\n",
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000352 SHUTDOWN_MAXFN);
353 return 1;
354 }
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000355 if (!may_register_shutdown) {
356 msg_perr("Tried to register a shutdown function before "
357 "programmer init.\n");
358 return 1;
359 }
Carl-Daniel Hailfingercc389fc2010-02-14 01:20:28 +0000360 shutdown_fn[shutdown_fn_count].func = function;
361 shutdown_fn[shutdown_fn_count].data = data;
362 shutdown_fn_count++;
363
364 return 0;
365}
366
Nico Huberbcb2e5a2012-12-30 01:23:17 +0000367int programmer_init(enum programmer prog, const char *param)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000368{
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000369 int ret;
Carl-Daniel Hailfinger2e681602011-09-08 00:00:29 +0000370
371 if (prog >= PROGRAMMER_INVALID) {
372 msg_perr("Invalid programmer specified!\n");
373 return -1;
374 }
375 programmer = prog;
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000376 /* Initialize all programmer specific data. */
377 /* Default to unlimited decode sizes. */
378 max_rom_decode = (const struct decode_sizes) {
379 .parallel = 0xffffffff,
380 .lpc = 0xffffffff,
381 .fwh = 0xffffffff,
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000382 .spi = 0xffffffff,
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000383 };
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000384 /* Default to top aligned flash at 4 GB. */
385 flashbase = 0;
386 /* Registering shutdown functions is now allowed. */
387 may_register_shutdown = 1;
Carl-Daniel Hailfingerd1be52d2010-07-03 12:14:25 +0000388 /* Default to allowing writes. Broken programmers set this to 0. */
389 programmer_may_write = 1;
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000390
391 programmer_param = param;
392 msg_pdbg("Initializing %s programmer\n",
393 programmer_table[programmer].name);
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000394 ret = programmer_table[programmer].init();
395 if (programmer_param && strlen(programmer_param)) {
396 msg_perr("Unhandled programmer parameters: %s\n",
397 programmer_param);
398 /* Do not error out here, the init itself was successful. */
399 }
400 return ret;
Uwe Hermann09e04f72009-05-16 22:36:00 +0000401}
402
403int programmer_shutdown(void)
404{
David Hendricks8bb20212011-06-14 01:35:36 +0000405 int ret = 0;
406
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000407 /* Registering shutdown functions is no longer allowed. */
408 may_register_shutdown = 0;
409 while (shutdown_fn_count > 0) {
410 int i = --shutdown_fn_count;
David Hendricks8bb20212011-06-14 01:35:36 +0000411 ret |= shutdown_fn[i].func(shutdown_fn[i].data);
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000412 }
Stefan Taunere34e3e82013-01-01 00:06:51 +0000413
Stefan Taunerb8911d62012-12-26 07:55:00 +0000414 programmer_param = NULL;
Stefan Taunere34e3e82013-01-01 00:06:51 +0000415 registered_programmer_count = 0;
416
David Hendricks8bb20212011-06-14 01:35:36 +0000417 return ret;
Uwe Hermann09e04f72009-05-16 22:36:00 +0000418}
419
Stefan Tauner305e0b92013-07-17 23:46:44 +0000420void *programmer_map_flash_region(const char *descr, uintptr_t phys_addr, size_t len)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000421{
422 return programmer_table[programmer].map_flash_region(descr,
423 phys_addr, len);
424}
425
426void programmer_unmap_flash_region(void *virt_addr, size_t len)
427{
428 programmer_table[programmer].unmap_flash_region(virt_addr, len);
429}
430
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000431void chip_writeb(const struct flashctx *flash, uint8_t val, chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000432{
Carl-Daniel Hailfingerc40cff72011-12-20 00:19:29 +0000433 flash->pgm->par.chip_writeb(flash, val, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000434}
435
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000436void chip_writew(const struct flashctx *flash, uint16_t val, chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000437{
Carl-Daniel Hailfingerc40cff72011-12-20 00:19:29 +0000438 flash->pgm->par.chip_writew(flash, val, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000439}
440
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000441void chip_writel(const struct flashctx *flash, uint32_t val, chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000442{
Carl-Daniel Hailfingerc40cff72011-12-20 00:19:29 +0000443 flash->pgm->par.chip_writel(flash, val, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000444}
445
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000446void chip_writen(const struct flashctx *flash, uint8_t *buf, chipaddr addr,
447 size_t len)
Carl-Daniel Hailfinger0bd2a2b2009-06-05 18:32:07 +0000448{
Carl-Daniel Hailfingerc40cff72011-12-20 00:19:29 +0000449 flash->pgm->par.chip_writen(flash, buf, addr, len);
Carl-Daniel Hailfinger0bd2a2b2009-06-05 18:32:07 +0000450}
451
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000452uint8_t chip_readb(const struct flashctx *flash, const chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000453{
Carl-Daniel Hailfingerc40cff72011-12-20 00:19:29 +0000454 return flash->pgm->par.chip_readb(flash, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000455}
456
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000457uint16_t chip_readw(const struct flashctx *flash, const chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000458{
Carl-Daniel Hailfingerc40cff72011-12-20 00:19:29 +0000459 return flash->pgm->par.chip_readw(flash, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000460}
461
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000462uint32_t chip_readl(const struct flashctx *flash, const chipaddr addr)
Uwe Hermann09e04f72009-05-16 22:36:00 +0000463{
Carl-Daniel Hailfingerc40cff72011-12-20 00:19:29 +0000464 return flash->pgm->par.chip_readl(flash, addr);
Uwe Hermann09e04f72009-05-16 22:36:00 +0000465}
466
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000467void chip_readn(const struct flashctx *flash, uint8_t *buf, chipaddr addr,
468 size_t len)
Carl-Daniel Hailfinger0bd2a2b2009-06-05 18:32:07 +0000469{
Carl-Daniel Hailfingerc40cff72011-12-20 00:19:29 +0000470 flash->pgm->par.chip_readn(flash, buf, addr, len);
Carl-Daniel Hailfinger0bd2a2b2009-06-05 18:32:07 +0000471}
472
Carl-Daniel Hailfingerca8bfc62009-06-05 17:48:08 +0000473void programmer_delay(int usecs)
474{
475 programmer_table[programmer].delay(usecs);
476}
477
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +0000478void map_flash_registers(struct flashctx *flash)
Stefan Reinauerff4f1972007-05-24 08:48:10 +0000479{
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +0000480 size_t size = flash->chip->total_size * 1024;
Carl-Daniel Hailfingerd0fc9462009-05-11 14:01:17 +0000481 /* Flash registers live 4 MByte below the flash. */
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +0000482 /* FIXME: This is incorrect for nonstandard flashbase. */
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +0000483 flash->virtual_registers = (chipaddr)programmer_map_flash_region("flash chip registers", (0xFFFFFFFF - 0x400000 - size + 1), size);
Stefan Reinauerff4f1972007-05-24 08:48:10 +0000484}
485
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000486int read_memmapped(struct flashctx *flash, uint8_t *buf, unsigned int start,
487 int unsigned len)
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000488{
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000489 chip_readn(flash, buf, flash->virtual_memory + start, len);
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000490
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000491 return 0;
492}
493
Carl-Daniel Hailfinger38a059d2009-06-13 12:04:03 +0000494int min(int a, int b)
495{
496 return (a < b) ? a : b;
497}
498
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000499int max(int a, int b)
500{
501 return (a > b) ? a : b;
502}
503
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +0000504int bitcount(unsigned long a)
505{
506 int i = 0;
507 for (; a != 0; a >>= 1)
508 if (a & 1)
509 i++;
510 return i;
511}
512
Carl-Daniel Hailfingerc2441382010-11-09 22:00:31 +0000513void tolower_string(char *str)
514{
515 for (; *str != '\0'; str++)
516 *str = (char)tolower((unsigned char)*str);
517}
518
Carl-Daniel Hailfingerb22918c2009-06-01 02:08:58 +0000519char *strcat_realloc(char *dest, const char *src)
520{
521 dest = realloc(dest, strlen(dest) + strlen(src) + 1);
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000522 if (!dest) {
523 msg_gerr("Out of memory!\n");
Carl-Daniel Hailfingerb22918c2009-06-01 02:08:58 +0000524 return NULL;
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000525 }
Carl-Daniel Hailfingerb22918c2009-06-01 02:08:58 +0000526 strcat(dest, src);
527 return dest;
528}
529
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000530/* This is a somewhat hacked function similar in some ways to strtok().
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000531 * It will look for needle with a subsequent '=' in haystack, return a copy of
532 * needle and remove everything from the first occurrence of needle to the next
533 * delimiter from haystack.
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000534 */
Nico Huberbcb2e5a2012-12-30 01:23:17 +0000535char *extract_param(const char *const *haystack, const char *needle, const char *delim)
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000536{
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000537 char *param_pos, *opt_pos, *rest;
538 char *opt = NULL;
539 int optlen;
Carl-Daniel Hailfinger27023762010-04-28 15:22:14 +0000540 int needlelen;
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000541
Carl-Daniel Hailfinger27023762010-04-28 15:22:14 +0000542 needlelen = strlen(needle);
543 if (!needlelen) {
544 msg_gerr("%s: empty needle! Please report a bug at "
545 "flashrom@flashrom.org\n", __func__);
546 return NULL;
547 }
548 /* No programmer parameters given. */
549 if (*haystack == NULL)
550 return NULL;
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000551 param_pos = strstr(*haystack, needle);
552 do {
553 if (!param_pos)
554 return NULL;
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000555 /* Needle followed by '='? */
556 if (param_pos[needlelen] == '=') {
557
558 /* Beginning of the string? */
559 if (param_pos == *haystack)
560 break;
561 /* After a delimiter? */
562 if (strchr(delim, *(param_pos - 1)))
563 break;
564 }
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000565 /* Continue searching. */
566 param_pos++;
567 param_pos = strstr(param_pos, needle);
568 } while (1);
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000569
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000570 if (param_pos) {
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000571 /* Get the string after needle and '='. */
572 opt_pos = param_pos + needlelen + 1;
573 optlen = strcspn(opt_pos, delim);
574 /* Return an empty string if the parameter was empty. */
575 opt = malloc(optlen + 1);
576 if (!opt) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000577 msg_gerr("Out of memory!\n");
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000578 exit(1);
579 }
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000580 strncpy(opt, opt_pos, optlen);
581 opt[optlen] = '\0';
582 rest = opt_pos + optlen;
583 /* Skip all delimiters after the current parameter. */
584 rest += strspn(rest, delim);
585 memmove(param_pos, rest, strlen(rest) + 1);
586 /* We could shrink haystack, but the effort is not worth it. */
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000587 }
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000588
Carl-Daniel Hailfinger744132a2010-07-06 09:55:48 +0000589 return opt;
Carl-Daniel Hailfingerd5b28fa2009-11-24 18:27:10 +0000590}
591
Stefan Tauner66652442011-06-26 17:38:17 +0000592char *extract_programmer_param(const char *param_name)
Carl-Daniel Hailfinger2b6dcb32010-07-08 10:13:37 +0000593{
594 return extract_param(&programmer_param, param_name, ",");
595}
596
Sylvain "ythier" Hitier9db45512011-07-04 07:27:17 +0000597/* Returns the number of well-defined erasers for a chip. */
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +0000598static unsigned int count_usable_erasers(const struct flashctx *flash)
Stefan Tauner5368dca2011-07-01 00:19:12 +0000599{
600 unsigned int usable_erasefunctions = 0;
601 int k;
602 for (k = 0; k < NUM_ERASEFUNCTIONS; k++) {
603 if (!check_block_eraser(flash, k, 0))
604 usable_erasefunctions++;
605 }
606 return usable_erasefunctions;
607}
608
Stefan Tauner78ffbea2012-10-27 15:36:56 +0000609int compare_range(uint8_t *wantbuf, uint8_t *havebuf, unsigned int start, unsigned int len)
610{
611 int ret = 0, failcount = 0;
612 unsigned int i;
613 for (i = 0; i < len; i++) {
614 if (wantbuf[i] != havebuf[i]) {
615 /* Only print the first failure. */
616 if (!failcount++)
617 msg_cerr("FAILED at 0x%08x! Expected=0x%02x, Found=0x%02x,",
618 start + i, wantbuf[i], havebuf[i]);
619 }
620 }
621 if (failcount) {
622 msg_cerr(" failed byte count from 0x%08x-0x%08x: 0x%x\n",
623 start, start + len - 1, failcount);
624 ret = -1;
625 }
626 return ret;
627}
628
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000629/* start is an offset to the base address of the flash chip */
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +0000630int check_erased_range(struct flashctx *flash, unsigned int start,
631 unsigned int len)
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000632{
633 int ret;
634 uint8_t *cmpbuf = malloc(len);
635
636 if (!cmpbuf) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000637 msg_gerr("Could not allocate memory!\n");
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000638 exit(1);
639 }
640 memset(cmpbuf, 0xff, len);
Stefan Tauner78ffbea2012-10-27 15:36:56 +0000641 ret = verify_range(flash, cmpbuf, start, len);
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000642 free(cmpbuf);
643 return ret;
644}
645
Uwe Hermann48ec1b12010-08-08 17:01:18 +0000646/*
Carl-Daniel Hailfingerd0250a32009-11-25 17:05:52 +0000647 * @cmpbuf buffer to compare against, cmpbuf[0] is expected to match the
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000648 * flash content at location start
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000649 * @start offset to the base address of the flash chip
650 * @len length of the verified area
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000651 * @return 0 for success, -1 for failure
652 */
Stefan Tauner78ffbea2012-10-27 15:36:56 +0000653int verify_range(struct flashctx *flash, uint8_t *cmpbuf, unsigned int start, unsigned int len)
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000654{
Carl-Daniel Hailfingerd8369412010-11-16 17:21:58 +0000655 uint8_t *readbuf = malloc(len);
Stefan Tauner78ffbea2012-10-27 15:36:56 +0000656 int ret = 0;
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000657
658 if (!len)
659 goto out_free;
660
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +0000661 if (!flash->chip->read) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000662 msg_cerr("ERROR: flashrom has no read function for this flash chip.\n");
Carl-Daniel Hailfinger23290662009-06-24 08:20:45 +0000663 return 1;
664 }
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000665 if (!readbuf) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000666 msg_gerr("Could not allocate memory!\n");
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000667 exit(1);
668 }
669
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +0000670 if (start + len > flash->chip->total_size * 1024) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000671 msg_gerr("Error: %s called with start 0x%x + len 0x%x >"
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000672 " total_size 0x%x\n", __func__, start, len,
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +0000673 flash->chip->total_size * 1024);
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000674 ret = -1;
675 goto out_free;
676 }
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000677
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +0000678 ret = flash->chip->read(flash, readbuf, start, len);
Carl-Daniel Hailfingerd8369412010-11-16 17:21:58 +0000679 if (ret) {
680 msg_gerr("Verification impossible because read failed "
681 "at 0x%x (len 0x%x)\n", start, len);
682 return ret;
683 }
684
Stefan Tauner78ffbea2012-10-27 15:36:56 +0000685 ret = compare_range(cmpbuf, readbuf, start, len);
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000686out_free:
687 free(readbuf);
688 return ret;
689}
690
Stefan Tauner02437452013-04-01 19:34:53 +0000691/* Helper function for need_erase() that focuses on granularities of gran bytes. */
692static int need_erase_gran_bytes(uint8_t *have, uint8_t *want, unsigned int len, unsigned int gran)
693{
694 unsigned int i, j, limit;
695 for (j = 0; j < len / gran; j++) {
696 limit = min (gran, len - j * gran);
697 /* Are 'have' and 'want' identical? */
698 if (!memcmp(have + j * gran, want + j * gran, limit))
699 continue;
700 /* have needs to be in erased state. */
701 for (i = 0; i < limit; i++)
702 if (have[j * gran + i] != 0xff)
703 return 1;
704 }
705 return 0;
706}
707
Uwe Hermann48ec1b12010-08-08 17:01:18 +0000708/*
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000709 * Check if the buffer @have can be programmed to the content of @want without
710 * erasing. This is only possible if all chunks of size @gran are either kept
711 * as-is or changed from an all-ones state to any other state.
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000712 *
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000713 * Warning: This function assumes that @have and @want point to naturally
714 * aligned regions.
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000715 *
716 * @have buffer with current content
717 * @want buffer with desired content
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000718 * @len length of the checked area
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000719 * @gran write granularity (enum, not count)
720 * @return 0 if no erase is needed, 1 otherwise
721 */
Stefan Taunerc69c9c82011-11-23 09:13:48 +0000722int need_erase(uint8_t *have, uint8_t *want, unsigned int len, enum write_granularity gran)
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000723{
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +0000724 int result = 0;
Stefan Tauner02437452013-04-01 19:34:53 +0000725 unsigned int i;
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000726
727 switch (gran) {
728 case write_gran_1bit:
729 for (i = 0; i < len; i++)
730 if ((have[i] & want[i]) != want[i]) {
731 result = 1;
732 break;
733 }
734 break;
735 case write_gran_1byte:
736 for (i = 0; i < len; i++)
737 if ((have[i] != want[i]) && (have[i] != 0xff)) {
738 result = 1;
739 break;
740 }
741 break;
742 case write_gran_256bytes:
Stefan Tauner02437452013-04-01 19:34:53 +0000743 result = need_erase_gran_bytes(have, want, len, 256);
744 break;
745 case write_gran_264bytes:
746 result = need_erase_gran_bytes(have, want, len, 264);
747 break;
748 case write_gran_512bytes:
749 result = need_erase_gran_bytes(have, want, len, 512);
750 break;
751 case write_gran_528bytes:
752 result = need_erase_gran_bytes(have, want, len, 528);
753 break;
754 case write_gran_1024bytes:
755 result = need_erase_gran_bytes(have, want, len, 1024);
756 break;
757 case write_gran_1056bytes:
758 result = need_erase_gran_bytes(have, want, len, 1056);
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000759 break;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000760 default:
761 msg_cerr("%s: Unsupported granularity! Please report a bug at "
762 "flashrom@flashrom.org\n", __func__);
Carl-Daniel Hailfingere8e369f2010-03-08 00:42:32 +0000763 }
764 return result;
765}
766
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000767/**
768 * Check if the buffer @have needs to be programmed to get the content of @want.
769 * If yes, return 1 and fill in first_start with the start address of the
770 * write operation and first_len with the length of the first to-be-written
771 * chunk. If not, return 0 and leave first_start and first_len undefined.
772 *
773 * Warning: This function assumes that @have and @want point to naturally
774 * aligned regions.
775 *
776 * @have buffer with current content
777 * @want buffer with desired content
778 * @len length of the checked area
779 * @gran write granularity (enum, not count)
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000780 * @first_start offset of the first byte which needs to be written (passed in
781 * value is increased by the offset of the first needed write
782 * relative to have/want or unchanged if no write is needed)
783 * @return length of the first contiguous area which needs to be written
784 * 0 if no write is needed
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000785 *
786 * FIXME: This function needs a parameter which tells it about coalescing
787 * in relation to the max write length of the programmer and the max write
788 * length of the chip.
789 */
Stefan Taunerc69c9c82011-11-23 09:13:48 +0000790static unsigned int get_next_write(uint8_t *have, uint8_t *want, unsigned int len,
791 unsigned int *first_start,
792 enum write_granularity gran)
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000793{
Stefan Taunerc69c9c82011-11-23 09:13:48 +0000794 int need_write = 0;
795 unsigned int rel_start = 0, first_len = 0;
796 unsigned int i, limit, stride;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000797
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000798 switch (gran) {
799 case write_gran_1bit:
800 case write_gran_1byte:
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000801 stride = 1;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000802 break;
803 case write_gran_256bytes:
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000804 stride = 256;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000805 break;
Stefan Tauner02437452013-04-01 19:34:53 +0000806 case write_gran_264bytes:
807 stride = 264;
808 break;
809 case write_gran_512bytes:
810 stride = 512;
811 break;
812 case write_gran_528bytes:
813 stride = 528;
814 break;
815 case write_gran_1024bytes:
816 stride = 1024;
817 break;
818 case write_gran_1056bytes:
819 stride = 1056;
820 break;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000821 default:
822 msg_cerr("%s: Unsupported granularity! Please report a bug at "
823 "flashrom@flashrom.org\n", __func__);
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000824 /* Claim that no write was needed. A write with unknown
825 * granularity is too dangerous to try.
826 */
827 return 0;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000828 }
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000829 for (i = 0; i < len / stride; i++) {
830 limit = min(stride, len - i * stride);
831 /* Are 'have' and 'want' identical? */
832 if (memcmp(have + i * stride, want + i * stride, limit)) {
833 if (!need_write) {
834 /* First location where have and want differ. */
835 need_write = 1;
836 rel_start = i * stride;
837 }
838 } else {
839 if (need_write) {
840 /* First location where have and want
841 * do not differ anymore.
842 */
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000843 break;
844 }
845 }
846 }
Carl-Daniel Hailfinger202bf532010-12-06 13:05:44 +0000847 if (need_write)
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000848 first_len = min(i * stride - rel_start, len);
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000849 *first_start += rel_start;
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +0000850 return first_len;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +0000851}
852
Carl-Daniel Hailfingereaac68b2009-11-23 12:55:31 +0000853/* This function generates various test patterns useful for testing controller
854 * and chip communication as well as chip behaviour.
855 *
856 * If a byte can be written multiple times, each time keeping 0-bits at 0
857 * and changing 1-bits to 0 if the new value for that bit is 0, the effect
858 * is essentially an AND operation. That's also the reason why this function
859 * provides the result of AND between various patterns.
860 *
861 * Below is a list of patterns (and their block length).
862 * Pattern 0 is 05 15 25 35 45 55 65 75 85 95 a5 b5 c5 d5 e5 f5 (16 Bytes)
863 * Pattern 1 is 0a 1a 2a 3a 4a 5a 6a 7a 8a 9a aa ba ca da ea fa (16 Bytes)
864 * Pattern 2 is 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f (16 Bytes)
865 * Pattern 3 is a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af (16 Bytes)
866 * Pattern 4 is 00 10 20 30 40 50 60 70 80 90 a0 b0 c0 d0 e0 f0 (16 Bytes)
867 * Pattern 5 is 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f (16 Bytes)
868 * Pattern 6 is 00 (1 Byte)
869 * Pattern 7 is ff (1 Byte)
870 * Patterns 0-7 have a big-endian block number in the last 2 bytes of each 256
871 * byte block.
872 *
873 * Pattern 8 is 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11... (256 B)
874 * Pattern 9 is ff fe fd fc fb fa f9 f8 f7 f6 f5 f4 f3 f2 f1 f0 ef ee... (256 B)
875 * Pattern 10 is 00 00 00 01 00 02 00 03 00 04... (128 kB big-endian counter)
876 * Pattern 11 is ff ff ff fe ff fd ff fc ff fb... (128 kB big-endian downwards)
877 * Pattern 12 is 00 (1 Byte)
878 * Pattern 13 is ff (1 Byte)
879 * Patterns 8-13 have no block number.
880 *
881 * Patterns 0-3 are created to detect and efficiently diagnose communication
882 * slips like missed bits or bytes and their repetitive nature gives good visual
883 * cues to the person inspecting the results. In addition, the following holds:
884 * AND Pattern 0/1 == Pattern 4
885 * AND Pattern 2/3 == Pattern 5
886 * AND Pattern 0/1/2/3 == AND Pattern 4/5 == Pattern 6
887 * A weakness of pattern 0-5 is the inability to detect swaps/copies between
888 * any two 16-byte blocks except for the last 16-byte block in a 256-byte bloc.
889 * They work perfectly for detecting any swaps/aliasing of blocks >= 256 bytes.
890 * 0x5 and 0xa were picked because they are 0101 and 1010 binary.
891 * Patterns 8-9 are best for detecting swaps/aliasing of blocks < 256 bytes.
892 * Besides that, they provide for bit testing of the last two bytes of every
893 * 256 byte block which contains the block number for patterns 0-6.
894 * Patterns 10-11 are special purpose for detecting subblock aliasing with
895 * block sizes >256 bytes (some Dataflash chips etc.)
896 * AND Pattern 8/9 == Pattern 12
897 * AND Pattern 10/11 == Pattern 12
898 * Pattern 13 is the completely erased state.
899 * None of the patterns can detect aliasing at boundaries which are a multiple
900 * of 16 MBytes (but such chips do not exist anyway for Parallel/LPC/FWH/SPI).
901 */
902int generate_testpattern(uint8_t *buf, uint32_t size, int variant)
903{
904 int i;
905
906 if (!buf) {
Sean Nelson316a29f2010-05-07 20:09:04 +0000907 msg_gerr("Invalid buffer!\n");
Carl-Daniel Hailfingereaac68b2009-11-23 12:55:31 +0000908 return 1;
909 }
910
911 switch (variant) {
912 case 0:
913 for (i = 0; i < size; i++)
914 buf[i] = (i & 0xf) << 4 | 0x5;
915 break;
916 case 1:
917 for (i = 0; i < size; i++)
918 buf[i] = (i & 0xf) << 4 | 0xa;
919 break;
920 case 2:
921 for (i = 0; i < size; i++)
922 buf[i] = 0x50 | (i & 0xf);
923 break;
924 case 3:
925 for (i = 0; i < size; i++)
926 buf[i] = 0xa0 | (i & 0xf);
927 break;
928 case 4:
929 for (i = 0; i < size; i++)
930 buf[i] = (i & 0xf) << 4;
931 break;
932 case 5:
933 for (i = 0; i < size; i++)
934 buf[i] = i & 0xf;
935 break;
936 case 6:
937 memset(buf, 0x00, size);
938 break;
939 case 7:
940 memset(buf, 0xff, size);
941 break;
942 case 8:
943 for (i = 0; i < size; i++)
944 buf[i] = i & 0xff;
945 break;
946 case 9:
947 for (i = 0; i < size; i++)
948 buf[i] = ~(i & 0xff);
949 break;
950 case 10:
951 for (i = 0; i < size % 2; i++) {
952 buf[i * 2] = (i >> 8) & 0xff;
953 buf[i * 2 + 1] = i & 0xff;
954 }
955 if (size & 0x1)
956 buf[i * 2] = (i >> 8) & 0xff;
957 break;
958 case 11:
959 for (i = 0; i < size % 2; i++) {
960 buf[i * 2] = ~((i >> 8) & 0xff);
961 buf[i * 2 + 1] = ~(i & 0xff);
962 }
963 if (size & 0x1)
964 buf[i * 2] = ~((i >> 8) & 0xff);
965 break;
966 case 12:
967 memset(buf, 0x00, size);
968 break;
969 case 13:
970 memset(buf, 0xff, size);
971 break;
972 }
973
974 if ((variant >= 0) && (variant <= 7)) {
975 /* Write block number in the last two bytes of each 256-byte
976 * block, big endian for easier reading of the hexdump.
977 * Note that this wraps around for chips larger than 2^24 bytes
978 * (16 MB).
979 */
980 for (i = 0; i < size / 256; i++) {
981 buf[i * 256 + 254] = (i >> 8) & 0xff;
982 buf[i * 256 + 255] = i & 0xff;
983 }
984 }
985
986 return 0;
987}
988
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +0000989int check_max_decode(enum chipbustype buses, uint32_t size)
990{
991 int limitexceeded = 0;
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000992
993 if ((buses & BUS_PARALLEL) && (max_rom_decode.parallel < size)) {
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +0000994 limitexceeded++;
Sean Nelson316a29f2010-05-07 20:09:04 +0000995 msg_pdbg("Chip size %u kB is bigger than supported "
Uwe Hermann91f4afa2011-07-28 08:13:25 +0000996 "size %u kB of chipset/board/programmer "
997 "for %s interface, "
998 "probe/read/erase/write may fail. ", size / 1024,
999 max_rom_decode.parallel / 1024, "Parallel");
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001000 }
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001001 if ((buses & BUS_LPC) && (max_rom_decode.lpc < size)) {
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001002 limitexceeded++;
Sean Nelson316a29f2010-05-07 20:09:04 +00001003 msg_pdbg("Chip size %u kB is bigger than supported "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001004 "size %u kB of chipset/board/programmer "
1005 "for %s interface, "
1006 "probe/read/erase/write may fail. ", size / 1024,
1007 max_rom_decode.lpc / 1024, "LPC");
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001008 }
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001009 if ((buses & BUS_FWH) && (max_rom_decode.fwh < size)) {
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001010 limitexceeded++;
Sean Nelson316a29f2010-05-07 20:09:04 +00001011 msg_pdbg("Chip size %u kB is bigger than supported "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001012 "size %u kB of chipset/board/programmer "
1013 "for %s interface, "
1014 "probe/read/erase/write may fail. ", size / 1024,
1015 max_rom_decode.fwh / 1024, "FWH");
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001016 }
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001017 if ((buses & BUS_SPI) && (max_rom_decode.spi < size)) {
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001018 limitexceeded++;
Sean Nelson316a29f2010-05-07 20:09:04 +00001019 msg_pdbg("Chip size %u kB is bigger than supported "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001020 "size %u kB of chipset/board/programmer "
1021 "for %s interface, "
1022 "probe/read/erase/write may fail. ", size / 1024,
1023 max_rom_decode.spi / 1024, "SPI");
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001024 }
1025 if (!limitexceeded)
1026 return 0;
1027 /* Sometimes chip and programmer have more than one bus in common,
1028 * and the limit is not exceeded on all buses. Tell the user.
1029 */
1030 if (bitcount(buses) > limitexceeded)
Carl-Daniel Hailfingera84835a2010-01-07 03:24:05 +00001031 /* FIXME: This message is designed towards CLI users. */
Sean Nelson316a29f2010-05-07 20:09:04 +00001032 msg_pdbg("There is at least one common chip/programmer "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001033 "interface which can support a chip of this size. "
1034 "You can try --force at your own risk.\n");
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001035 return 1;
1036}
1037
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001038int probe_flash(struct registered_programmer *pgm, int startchip, struct flashctx *flash, int force)
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001039{
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001040 const struct flashchip *chip;
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001041 unsigned long base = 0;
Stefan Reinauer051e2362011-01-19 06:21:54 +00001042 char location[64];
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001043 uint32_t size;
1044 enum chipbustype buses_common;
Carl-Daniel Hailfingerb22918c2009-06-01 02:08:58 +00001045 char *tmp;
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001046
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001047 for (chip = flashchips + startchip; chip && chip->name; chip++) {
1048 if (chip_to_probe && strcmp(chip->name, chip_to_probe) != 0)
Ollie Lhocbbf1252004-03-17 22:22:08 +00001049 continue;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001050 buses_common = pgm->buses_supported & chip->bustype;
Carl-Daniel Hailfingerc40cff72011-12-20 00:19:29 +00001051 if (!buses_common)
Carl-Daniel Hailfinger6573b742011-06-17 22:38:53 +00001052 continue;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001053 msg_gdbg("Probing for %s %s, %d kB: ", chip->vendor, chip->name, chip->total_size);
1054 if (!chip->probe && !force) {
1055 msg_gdbg("failed! flashrom has no probe function for this flash chip.\n");
Carl-Daniel Hailfingerb22918c2009-06-01 02:08:58 +00001056 continue;
1057 }
Stefan Reinauer70385642007-04-06 11:58:03 +00001058
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001059 size = chip->total_size * 1024;
Carl-Daniel Hailfinger115d3902009-10-31 01:53:09 +00001060 check_max_decode(buses_common, size);
Stefan Reinauer70385642007-04-06 11:58:03 +00001061
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001062 /* Start filling in the dynamic data. */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001063 flash->chip = calloc(1, sizeof(struct flashchip));
1064 if (!flash->chip) {
1065 msg_gerr("Out of memory!\n");
1066 exit(1);
1067 }
1068 memcpy(flash->chip, chip, sizeof(struct flashchip));
1069 flash->pgm = pgm;
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001070
Carl-Daniel Hailfinger97d6b092009-05-09 07:27:23 +00001071 base = flashbase ? flashbase : (0xffffffff - size + 1);
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001072 flash->virtual_memory = (chipaddr)programmer_map_flash_region("flash chip", base, size);
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001073
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001074 /* We handle a forced match like a real match, we just avoid probing. Note that probe_flash()
1075 * is only called with force=1 after normal probing failed.
1076 */
Peter Stuge27c3e2d2008-07-02 17:15:47 +00001077 if (force)
1078 break;
Stefan Reinauerfcb63682006-03-16 16:57:41 +00001079
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001080 if (flash->chip->probe(flash) != 1)
Peter Stuge483b8f02008-09-03 23:10:05 +00001081 goto notfound;
1082
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001083 /* If this is the first chip found, accept it.
1084 * If this is not the first chip found, accept it only if it is
Stefan Taunerac1b4c82012-02-17 14:51:04 +00001085 * a non-generic match. SFDP and CFI are generic matches.
1086 * startchip==0 means this call to probe_flash() is the first
1087 * one for this programmer interface and thus no other chip has
1088 * been found on this interface.
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001089 */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001090 if (startchip == 0 && flash->chip->model_id == SFDP_DEVICE_ID) {
Stefan Taunerac1b4c82012-02-17 14:51:04 +00001091 msg_cinfo("===\n"
1092 "SFDP has autodetected a flash chip which is "
1093 "not natively supported by flashrom yet.\n");
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001094 if (count_usable_erasers(flash) == 0)
Stefan Taunerac1b4c82012-02-17 14:51:04 +00001095 msg_cinfo("The standard operations read and "
1096 "verify should work, but to support "
1097 "erase, write and all other "
1098 "possible features");
1099 else
1100 msg_cinfo("All standard operations (read, "
1101 "verify, erase and write) should "
1102 "work, but to support all possible "
1103 "features");
1104
Stefan Taunerb4e06bd2012-08-20 00:24:22 +00001105 msg_cinfo(" we need to add them manually.\n"
1106 "You can help us by mailing us the output of the following command to "
1107 "flashrom@flashrom.org:\n"
1108 "'flashrom -VV [plus the -p/--programmer parameter]'\n"
1109 "Thanks for your help!\n"
Stefan Taunerac1b4c82012-02-17 14:51:04 +00001110 "===\n");
1111 }
1112
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001113 /* First flash chip detected on this bus. */
1114 if (startchip == 0)
Peter Stuge27c3e2d2008-07-02 17:15:47 +00001115 break;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001116 /* Not the first flash chip detected on this bus, but not a generic match either. */
1117 if ((flash->chip->model_id != GENERIC_DEVICE_ID) && (flash->chip->model_id != SFDP_DEVICE_ID))
1118 break;
1119 /* 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 +00001120notfound:
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001121 programmer_unmap_flash_region((void *)flash->virtual_memory, size);
1122 flash->virtual_memory = (chipaddr)NULL;
1123 free(flash->chip);
1124 flash->chip = NULL;
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001125 }
Uwe Hermannffec5f32007-08-23 16:08:21 +00001126
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001127 if (!flash->chip)
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001128 return -1;
Peter Stuge27c3e2d2008-07-02 17:15:47 +00001129
Carl-Daniel Hailfingerd9535582011-03-08 00:09:11 +00001130#if CONFIG_INTERNAL == 1
1131 if (programmer_table[programmer].map_flash_region == physmap)
Stefan Reinauer051e2362011-01-19 06:21:54 +00001132 snprintf(location, sizeof(location), "at physical address 0x%lx", base);
Carl-Daniel Hailfingerd9535582011-03-08 00:09:11 +00001133 else
1134#endif
Stefan Reinauer051e2362011-01-19 06:21:54 +00001135 snprintf(location, sizeof(location), "on %s", programmer_table[programmer].name);
Stefan Reinauer051e2362011-01-19 06:21:54 +00001136
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001137 tmp = flashbuses_to_text(flash->chip->bustype);
1138 msg_cinfo("%s %s flash chip \"%s\" (%d kB, %s) %s.\n", force ? "Assuming" : "Found",
1139 flash->chip->vendor, flash->chip->name, flash->chip->total_size, tmp, location);
Stefan Tauner00155492011-06-26 20:45:35 +00001140 free(tmp);
Uwe Hermann9899cad2009-06-28 21:47:57 +00001141
Carl-Daniel Hailfinger859f3f02010-12-02 21:59:42 +00001142 /* Flash registers will not be mapped if the chip was forced. Lock info
1143 * may be stored in registers, so avoid lock info printing.
1144 */
1145 if (!force)
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001146 if (flash->chip->printlock)
1147 flash->chip->printlock(flash);
Sean Nelson6e0b9122010-02-19 00:52:10 +00001148
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +00001149 /* Return position of matching chip. */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001150 return chip - flashchips;
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00001151}
1152
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001153int read_buf_from_file(unsigned char *buf, unsigned long size,
1154 const char *filename)
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001155{
1156 unsigned long numbytes;
1157 FILE *image;
1158 struct stat image_stat;
1159
1160 if ((image = fopen(filename, "rb")) == NULL) {
Stefan Tauner363fd7e2013-04-07 13:08:30 +00001161 msg_gerr("Error: opening file \"%s\" failed: %s\n", filename, strerror(errno));
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001162 return 1;
1163 }
1164 if (fstat(fileno(image), &image_stat) != 0) {
Stefan Tauner363fd7e2013-04-07 13:08:30 +00001165 msg_gerr("Error: getting metadata of file \"%s\" failed: %s\n", filename, strerror(errno));
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001166 fclose(image);
1167 return 1;
1168 }
1169 if (image_stat.st_size != size) {
Carl-Daniel Hailfinger11990da2013-07-13 23:21:05 +00001170 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 +00001171 (intmax_t)image_stat.st_size, size);
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001172 fclose(image);
1173 return 1;
1174 }
1175 numbytes = fread(buf, 1, size, image);
1176 if (fclose(image)) {
Stefan Tauner363fd7e2013-04-07 13:08:30 +00001177 msg_gerr("Error: closing file \"%s\" failed: %s\n", filename, strerror(errno));
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001178 return 1;
1179 }
1180 if (numbytes != size) {
1181 msg_gerr("Error: Failed to read complete file. Got %ld bytes, "
1182 "wanted %ld!\n", numbytes, size);
1183 return 1;
1184 }
1185 return 0;
1186}
1187
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001188int write_buf_to_file(unsigned char *buf, unsigned long size,
1189 const char *filename)
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001190{
1191 unsigned long numbytes;
1192 FILE *image;
Stephan Guilloux21dd55b2009-06-01 22:07:52 +00001193
1194 if (!filename) {
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001195 msg_gerr("No filename specified.\n");
Stephan Guilloux21dd55b2009-06-01 22:07:52 +00001196 return 1;
1197 }
Patrick Georgi0bf842d2010-01-25 22:55:33 +00001198 if ((image = fopen(filename, "wb")) == NULL) {
Stefan Tauner363fd7e2013-04-07 13:08:30 +00001199 msg_gerr("Error: opening file \"%s\" failed: %s\n", filename, strerror(errno));
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00001200 return 1;
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001201 }
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001202
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001203 numbytes = fwrite(buf, 1, size, image);
1204 fclose(image);
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001205 if (numbytes != size) {
1206 msg_gerr("File %s could not be written completely.\n",
1207 filename);
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001208 return 1;
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001209 }
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001210 return 0;
1211}
1212
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001213int read_flash_to_file(struct flashctx *flash, const char *filename)
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001214{
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001215 unsigned long size = flash->chip->total_size * 1024;
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001216 unsigned char *buf = calloc(size, sizeof(char));
1217 int ret = 0;
1218
1219 msg_cinfo("Reading flash... ");
1220 if (!buf) {
1221 msg_gerr("Memory allocation failed!\n");
1222 msg_cinfo("FAILED.\n");
1223 return 1;
1224 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001225 if (!flash->chip->read) {
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001226 msg_cerr("No read function available for this flash chip.\n");
1227 ret = 1;
1228 goto out_free;
1229 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001230 if (flash->chip->read(flash, buf, 0, size)) {
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001231 msg_cerr("Read operation failed!\n");
1232 ret = 1;
1233 goto out_free;
1234 }
1235
Stefan Tauner355cbfd2011-05-28 02:37:14 +00001236 ret = write_buf_to_file(buf, size, filename);
Carl-Daniel Hailfinger1748c572010-07-13 23:56:13 +00001237out_free:
1238 free(buf);
1239 msg_cinfo("%s.\n", ret ? "FAILED" : "done");
1240 return ret;
1241}
1242
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001243/* This function shares a lot of its structure with erase_and_write_flash() and
1244 * walk_eraseregions().
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001245 * Even if an error is found, the function will keep going and check the rest.
1246 */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001247static int selfcheck_eraseblocks(const struct flashchip *chip)
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001248{
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +00001249 int i, j, k;
1250 int ret = 0;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001251
1252 for (k = 0; k < NUM_ERASEFUNCTIONS; k++) {
1253 unsigned int done = 0;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001254 struct block_eraser eraser = chip->block_erasers[k];
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001255
1256 for (i = 0; i < NUM_ERASEREGIONS; i++) {
1257 /* Blocks with zero size are bugs in flashchips.c. */
1258 if (eraser.eraseblocks[i].count &&
1259 !eraser.eraseblocks[i].size) {
1260 msg_gerr("ERROR: Flash chip %s erase function "
1261 "%i region %i has size 0. Please report"
1262 " a bug at flashrom@flashrom.org\n",
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001263 chip->name, k, i);
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001264 ret = 1;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001265 }
1266 /* Blocks with zero count are bugs in flashchips.c. */
1267 if (!eraser.eraseblocks[i].count &&
1268 eraser.eraseblocks[i].size) {
1269 msg_gerr("ERROR: Flash chip %s erase function "
1270 "%i region %i has count 0. Please report"
1271 " a bug at flashrom@flashrom.org\n",
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001272 chip->name, k, i);
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001273 ret = 1;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001274 }
1275 done += eraser.eraseblocks[i].count *
1276 eraser.eraseblocks[i].size;
1277 }
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001278 /* Empty eraseblock definition with erase function. */
1279 if (!done && eraser.block_erase)
Sean Nelson316a29f2010-05-07 20:09:04 +00001280 msg_gspew("Strange: Empty eraseblock definition with "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001281 "non-empty erase function. Not an error.\n");
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001282 if (!done)
1283 continue;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001284 if (done != chip->total_size * 1024) {
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001285 msg_gerr("ERROR: Flash chip %s erase function %i "
1286 "region walking resulted in 0x%06x bytes total,"
1287 " expected 0x%06x bytes. Please report a bug at"
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001288 " flashrom@flashrom.org\n", chip->name, k,
1289 done, chip->total_size * 1024);
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001290 ret = 1;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001291 }
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001292 if (!eraser.block_erase)
1293 continue;
1294 /* Check if there are identical erase functions for different
1295 * layouts. That would imply "magic" erase functions. The
1296 * easiest way to check this is with function pointers.
1297 */
Uwe Hermann43959702010-03-13 17:28:29 +00001298 for (j = k + 1; j < NUM_ERASEFUNCTIONS; j++) {
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001299 if (eraser.block_erase ==
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001300 chip->block_erasers[j].block_erase) {
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001301 msg_gerr("ERROR: Flash chip %s erase function "
1302 "%i and %i are identical. Please report"
1303 " a bug at flashrom@flashrom.org\n",
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001304 chip->name, k, j);
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001305 ret = 1;
1306 }
Uwe Hermann43959702010-03-13 17:28:29 +00001307 }
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001308 }
Carl-Daniel Hailfinger415afcf2010-01-19 06:42:46 +00001309 return ret;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001310}
1311
Stefan Tauner682122b2013-06-23 22:15:39 +00001312static bool all_skipped = true;
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001313static int erase_and_write_block_helper(struct flashctx *flash,
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001314 unsigned int start, unsigned int len,
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001315 uint8_t *curcontents,
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001316 uint8_t *newcontents,
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001317 int (*erasefn) (struct flashctx *flash,
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001318 unsigned int addr,
1319 unsigned int len))
1320{
Stefan Taunerc69c9c82011-11-23 09:13:48 +00001321 unsigned int starthere = 0, lenhere = 0;
1322 int ret = 0, skip = 1, writecount = 0;
Stefan Tauner50d67aa2013-03-03 23:49:48 +00001323 enum write_granularity gran = flash->chip->gran;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001324
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001325 /* curcontents and newcontents are opaque to walk_eraseregions, and
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001326 * need to be adjusted here to keep the impression of proper abstraction
1327 */
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001328 curcontents += start;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001329 newcontents += start;
1330 msg_cdbg(":");
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001331 if (need_erase(curcontents, newcontents, len, gran)) {
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001332 msg_cdbg("E");
1333 ret = erasefn(flash, start, len);
1334 if (ret)
1335 return ret;
Carl-Daniel Hailfingerb4061f62011-06-26 17:04:16 +00001336 if (check_erased_range(flash, start, len)) {
1337 msg_cerr("ERASE FAILED!\n");
1338 return -1;
1339 }
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001340 /* Erase was successful. Adjust curcontents. */
1341 memset(curcontents, 0xff, len);
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001342 skip = 0;
1343 }
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001344 /* get_next_write() sets starthere to a new value after the call. */
1345 while ((lenhere = get_next_write(curcontents + starthere,
1346 newcontents + starthere,
1347 len - starthere, &starthere, gran))) {
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001348 if (!writecount++)
1349 msg_cdbg("W");
1350 /* Needs the partial write function signature. */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001351 ret = flash->chip->write(flash, newcontents + starthere,
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001352 start + starthere, lenhere);
1353 if (ret)
1354 return ret;
1355 starthere += lenhere;
1356 skip = 0;
1357 }
1358 if (skip)
1359 msg_cdbg("S");
Stefan Tauner682122b2013-06-23 22:15:39 +00001360 else
1361 all_skipped = false;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001362 return ret;
1363}
1364
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001365static int walk_eraseregions(struct flashctx *flash, int erasefunction,
1366 int (*do_something) (struct flashctx *flash,
Carl-Daniel Hailfinger4d3e9ca2010-07-13 00:42:00 +00001367 unsigned int addr,
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001368 unsigned int len,
1369 uint8_t *param1,
1370 uint8_t *param2,
1371 int (*erasefn) (
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001372 struct flashctx *flash,
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001373 unsigned int addr,
1374 unsigned int len)),
1375 void *param1, void *param2)
Carl-Daniel Hailfingera1223412010-07-13 00:37:19 +00001376{
1377 int i, j;
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +00001378 unsigned int start = 0;
1379 unsigned int len;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001380 struct block_eraser eraser = flash->chip->block_erasers[erasefunction];
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001381
Carl-Daniel Hailfingera1223412010-07-13 00:37:19 +00001382 for (i = 0; i < NUM_ERASEREGIONS; i++) {
1383 /* count==0 for all automatically initialized array
1384 * members so the loop below won't be executed for them.
1385 */
1386 len = eraser.eraseblocks[i].size;
1387 for (j = 0; j < eraser.eraseblocks[i].count; j++) {
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001388 /* Print this for every block except the first one. */
1389 if (i || j)
1390 msg_cdbg(", ");
1391 msg_cdbg("0x%06x-0x%06x", start,
Carl-Daniel Hailfingera1223412010-07-13 00:37:19 +00001392 start + len - 1);
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001393 if (do_something(flash, start, len, param1, param2,
1394 eraser.block_erase)) {
Carl-Daniel Hailfingera1223412010-07-13 00:37:19 +00001395 return 1;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001396 }
Carl-Daniel Hailfingera1223412010-07-13 00:37:19 +00001397 start += len;
1398 }
1399 }
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001400 msg_cdbg("\n");
Carl-Daniel Hailfingera1223412010-07-13 00:37:19 +00001401 return 0;
1402}
1403
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001404static int check_block_eraser(const struct flashctx *flash, int k, int log)
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001405{
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001406 struct block_eraser eraser = flash->chip->block_erasers[k];
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001407
1408 if (!eraser.block_erase && !eraser.eraseblocks[0].count) {
1409 if (log)
1410 msg_cdbg("not defined. ");
1411 return 1;
1412 }
1413 if (!eraser.block_erase && eraser.eraseblocks[0].count) {
1414 if (log)
1415 msg_cdbg("eraseblock layout is known, but matching "
Stefan Tauner355cbfd2011-05-28 02:37:14 +00001416 "block erase function is not implemented. ");
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001417 return 1;
1418 }
1419 if (eraser.block_erase && !eraser.eraseblocks[0].count) {
1420 if (log)
1421 msg_cdbg("block erase function found, but "
Stefan Tauner355cbfd2011-05-28 02:37:14 +00001422 "eraseblock layout is not defined. ");
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001423 return 1;
1424 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001425 // TODO: Once erase functions are annotated with allowed buses, check that as well.
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001426 return 0;
1427}
1428
Carl-Daniel Hailfinger63fd9022011-12-14 22:25:15 +00001429int erase_and_write_flash(struct flashctx *flash, uint8_t *oldcontents,
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001430 uint8_t *newcontents)
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001431{
Carl-Daniel Hailfingerd8334db2011-07-21 21:21:04 +00001432 int k, ret = 1;
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001433 uint8_t *curcontents;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001434 unsigned long size = flash->chip->total_size * 1024;
Sylvain "ythier" Hitier9db45512011-07-04 07:27:17 +00001435 unsigned int usable_erasefunctions = count_usable_erasers(flash);
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001436
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001437 msg_cinfo("Erasing and writing flash chip... ");
Stefan Tauner269de352011-07-12 22:35:21 +00001438 curcontents = malloc(size);
1439 if (!curcontents) {
1440 msg_gerr("Out of memory!\n");
1441 exit(1);
1442 }
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001443 /* Copy oldcontents to curcontents to avoid clobbering oldcontents. */
1444 memcpy(curcontents, oldcontents, size);
1445
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001446 for (k = 0; k < NUM_ERASEFUNCTIONS; k++) {
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001447 if (k != 0)
1448 msg_cdbg("Looking for another erase function.\n");
Carl-Daniel Hailfingerd8334db2011-07-21 21:21:04 +00001449 if (!usable_erasefunctions) {
1450 msg_cdbg("No usable erase functions left.\n");
1451 break;
1452 }
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001453 msg_cdbg("Trying erase function %i... ", k);
1454 if (check_block_eraser(flash, k, 1))
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001455 continue;
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001456 usable_erasefunctions--;
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001457 ret = walk_eraseregions(flash, k, &erase_and_write_block_helper,
1458 curcontents, newcontents);
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001459 /* If everything is OK, don't try another erase function. */
1460 if (!ret)
1461 break;
Carl-Daniel Hailfingerb23b1eb2010-12-02 02:41:55 +00001462 /* Write/erase failed, so try to find out what the current chip
Carl-Daniel Hailfingerd8334db2011-07-21 21:21:04 +00001463 * contents are. If no usable erase functions remain, we can
1464 * skip this: the next iteration will break immediately anyway.
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001465 */
Carl-Daniel Hailfingerdce73ae2010-12-05 15:14:44 +00001466 if (!usable_erasefunctions)
1467 continue;
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001468 /* Reading the whole chip may take a while, inform the user even
1469 * in non-verbose mode.
1470 */
1471 msg_cinfo("Reading current flash chip contents... ");
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001472 if (flash->chip->read(flash, curcontents, 0, size)) {
Carl-Daniel Hailfingerb23b1eb2010-12-02 02:41:55 +00001473 /* Now we are truly screwed. Read failed as well. */
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001474 msg_cerr("Can't read anymore! Aborting.\n");
Carl-Daniel Hailfingerb23b1eb2010-12-02 02:41:55 +00001475 /* We have no idea about the flash chip contents, so
1476 * retrying with another erase function is pointless.
1477 */
1478 break;
1479 }
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001480 msg_cinfo("done. ");
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001481 }
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001482 /* Free the scratchpad. */
1483 free(curcontents);
Carl-Daniel Hailfingerf160a122009-05-08 17:15:15 +00001484
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001485 if (ret) {
Sean Nelson316a29f2010-05-07 20:09:04 +00001486 msg_cerr("FAILED!\n");
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001487 } else {
Stefan Tauner682122b2013-06-23 22:15:39 +00001488 if (all_skipped)
1489 msg_cinfo("\nWarning: Chip content is identical to the requested image.\n");
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001490 msg_cinfo("Erase/write done.\n");
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00001491 }
1492 return ret;
Carl-Daniel Hailfinger7314cc32009-01-28 00:27:54 +00001493}
1494
Stefan Tauner136388f2013-07-15 10:47:53 +00001495static void nonfatal_help_message(void)
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001496{
Stefan Tauner136388f2013-07-15 10:47:53 +00001497 msg_gerr("Writing to the flash chip apparently didn't do anything.\n");
1498#if CONFIG_INTERNAL == 1
1499 if (programmer == PROGRAMMER_INTERNAL)
1500 msg_gerr("This means we have to add special support for your board, programmer or flash\n"
1501 "chip. Please report this on IRC at chat.freenode.net (channel #flashrom) or\n"
1502 "mail flashrom@flashrom.org, thanks!\n"
1503 "-------------------------------------------------------------------------------\n"
1504 "You may now reboot or simply leave the machine running.\n");
1505 else
1506#endif
1507 msg_gerr("Please check the connections (especially those to write protection pins) between\n"
1508 "the programmer and the flash chip. If you think the error is caused by flashrom\n"
1509 "please report this on IRC at chat.freenode.net (channel #flashrom) or\n"
1510 "mail flashrom@flashrom.org, thanks!\n");
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001511}
1512
Stefan Tauner136388f2013-07-15 10:47:53 +00001513static void emergency_help_message(void)
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00001514{
Stefan Tauner136388f2013-07-15 10:47:53 +00001515 msg_gerr("Your flash chip is in an unknown state.\n");
1516#if CONFIG_INTERNAL == 1
1517 if (programmer == PROGRAMMER_INTERNAL)
1518 msg_gerr("Get help on IRC at chat.freenode.net (channel #flashrom) or\n"
1519 "mail flashrom@flashrom.org with the subject \"FAILED: <your board name>\"!\n"
1520 "-------------------------------------------------------------------------------\n"
1521 "DO NOT REBOOT OR POWEROFF!\n");
1522 else
1523#endif
1524 msg_gerr("Please report this on IRC at chat.freenode.net (channel #flashrom) or\n"
1525 "mail flashrom@flashrom.org, thanks!\n");
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00001526}
1527
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001528/* The way to go if you want a delimited list of programmers */
Stefan Tauner66652442011-06-26 17:38:17 +00001529void list_programmers(const char *delim)
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001530{
1531 enum programmer p;
1532 for (p = 0; p < PROGRAMMER_INVALID; p++) {
Sean Nelson316a29f2010-05-07 20:09:04 +00001533 msg_ginfo("%s", programmer_table[p].name);
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001534 if (p < PROGRAMMER_INVALID - 1)
Sean Nelson316a29f2010-05-07 20:09:04 +00001535 msg_ginfo("%s", delim);
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001536 }
Sean Nelson316a29f2010-05-07 20:09:04 +00001537 msg_ginfo("\n");
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001538}
1539
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001540void list_programmers_linebreak(int startcol, int cols, int paren)
1541{
1542 const char *pname;
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +00001543 int pnamelen;
1544 int remaining = 0, firstline = 1;
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001545 enum programmer p;
Carl-Daniel Hailfinger082c8b52011-08-15 19:54:20 +00001546 int i;
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001547
1548 for (p = 0; p < PROGRAMMER_INVALID; p++) {
1549 pname = programmer_table[p].name;
1550 pnamelen = strlen(pname);
1551 if (remaining - pnamelen - 2 < 0) {
1552 if (firstline)
1553 firstline = 0;
1554 else
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001555 msg_ginfo("\n");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001556 for (i = 0; i < startcol; i++)
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001557 msg_ginfo(" ");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001558 remaining = cols - startcol;
1559 } else {
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001560 msg_ginfo(" ");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001561 remaining--;
1562 }
1563 if (paren && (p == 0)) {
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001564 msg_ginfo("(");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001565 remaining--;
1566 }
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001567 msg_ginfo("%s", pname);
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001568 remaining -= pnamelen;
1569 if (p < PROGRAMMER_INVALID - 1) {
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001570 msg_ginfo(",");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001571 remaining--;
1572 } else {
1573 if (paren)
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +00001574 msg_ginfo(")");
Carl-Daniel Hailfingera73fb492010-10-06 23:48:34 +00001575 }
1576 }
1577}
1578
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001579void print_sysinfo(void)
1580{
Carl-Daniel Hailfinger60d9bd22012-08-09 23:34:41 +00001581#ifdef _WIN32
1582 SYSTEM_INFO si;
1583 OSVERSIONINFOEX osvi;
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001584
Carl-Daniel Hailfinger60d9bd22012-08-09 23:34:41 +00001585 memset(&si, 0, sizeof(SYSTEM_INFO));
1586 memset(&osvi, 0, sizeof(OSVERSIONINFOEX));
1587 msg_ginfo(" on Windows");
1588 /* Tell Windows which version of the structure we want. */
1589 osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
1590 if (GetVersionEx((OSVERSIONINFO*) &osvi))
1591 msg_ginfo(" %lu.%lu", osvi.dwMajorVersion, osvi.dwMinorVersion);
1592 else
1593 msg_ginfo(" unknown version");
1594 GetSystemInfo(&si);
1595 switch (si.wProcessorArchitecture) {
1596 case PROCESSOR_ARCHITECTURE_AMD64:
1597 msg_ginfo(" (x86_64)");
1598 break;
1599 case PROCESSOR_ARCHITECTURE_INTEL:
1600 msg_ginfo(" (x86)");
1601 break;
1602 default:
1603 msg_ginfo(" (unknown arch)");
1604 break;
1605 }
1606#elif HAVE_UTSNAME == 1
1607 struct utsname osinfo;
1608
1609 uname(&osinfo);
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001610 msg_ginfo(" on %s %s (%s)", osinfo.sysname, osinfo.release,
1611 osinfo.machine);
1612#else
1613 msg_ginfo(" on unknown machine");
1614#endif
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001615}
1616
1617void print_buildinfo(void)
1618{
1619 msg_gdbg("flashrom was built with");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001620#if NEED_PCI == 1
1621#ifdef PCILIB_VERSION
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001622 msg_gdbg(" libpci %s,", PCILIB_VERSION);
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001623#else
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001624 msg_gdbg(" unknown PCI library,");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001625#endif
1626#endif
1627#ifdef __clang__
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001628 msg_gdbg(" LLVM Clang");
Carl-Daniel Hailfingerb51e58e2010-07-17 14:49:30 +00001629#ifdef __clang_version__
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001630 msg_gdbg(" %s,", __clang_version__);
Carl-Daniel Hailfingerb51e58e2010-07-17 14:49:30 +00001631#else
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001632 msg_gdbg(" unknown version (before r102686),");
Carl-Daniel Hailfingerb51e58e2010-07-17 14:49:30 +00001633#endif
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001634#elif defined(__GNUC__)
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001635 msg_gdbg(" GCC");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001636#ifdef __VERSION__
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001637 msg_gdbg(" %s,", __VERSION__);
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001638#else
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001639 msg_gdbg(" unknown version,");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001640#endif
1641#else
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001642 msg_gdbg(" unknown compiler,");
Carl-Daniel Hailfingercceafa22010-05-26 01:45:41 +00001643#endif
1644#if defined (__FLASHROM_LITTLE_ENDIAN__)
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001645 msg_gdbg(" little endian");
Carl-Daniel Hailfinger06b9efa2012-08-07 11:59:59 +00001646#elif defined (__FLASHROM_BIG_ENDIAN__)
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001647 msg_gdbg(" big endian");
Carl-Daniel Hailfinger06b9efa2012-08-07 11:59:59 +00001648#else
1649#error Endianness could not be determined
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001650#endif
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001651 msg_gdbg("\n");
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001652}
1653
Bernhard Walle201bde32008-01-21 15:24:22 +00001654void print_version(void)
1655{
Carl-Daniel Hailfinger8841d3e2010-05-15 15:04:37 +00001656 msg_ginfo("flashrom v%s", flashrom_version);
Carl-Daniel Hailfinger132e2ec2010-03-27 16:36:40 +00001657 print_sysinfo();
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00001658 msg_ginfo("\n");
Bernhard Walle201bde32008-01-21 15:24:22 +00001659}
1660
Carl-Daniel Hailfinger8841d3e2010-05-15 15:04:37 +00001661void print_banner(void)
1662{
1663 msg_ginfo("flashrom is free software, get the source code at "
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001664 "http://www.flashrom.org\n");
Carl-Daniel Hailfinger8841d3e2010-05-15 15:04:37 +00001665 msg_ginfo("\n");
1666}
1667
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001668int selfcheck(void)
1669{
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001670 const struct flashchip *chip;
Stefan Taunera6d96482012-12-26 19:51:23 +00001671 int i;
1672 int ret = 0;
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001673
1674 /* Safety check. Instead of aborting after the first error, check
1675 * if more errors exist.
1676 */
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001677 if (ARRAY_SIZE(programmer_table) - 1 != PROGRAMMER_INVALID) {
Sean Nelson316a29f2010-05-07 20:09:04 +00001678 msg_gerr("Programmer table miscompilation!\n");
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001679 ret = 1;
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001680 }
Stefan Taunera6d96482012-12-26 19:51:23 +00001681 for (i = 0; i < PROGRAMMER_INVALID; i++) {
1682 const struct programmer_entry p = programmer_table[i];
1683 if (p.name == NULL) {
1684 msg_gerr("All programmers need a valid name, but the one with index %d does not!\n", i);
1685 ret = 1;
1686 /* This might hide other problems with this programmer, but allows for better error
1687 * messages below without jumping through hoops. */
1688 continue;
1689 }
Stefan Tauneraf358d62012-12-27 18:40:26 +00001690 switch (p.type) {
1691 case USB:
1692 case PCI:
1693 case OTHER:
1694 if (p.devs.note == NULL) {
1695 if (strcmp("internal", p.name) == 0)
1696 break; /* This one has its device list stored separately. */
1697 msg_gerr("Programmer %s has neither a device list nor a textual description!\n",
1698 p.name);
1699 ret = 1;
1700 }
1701 break;
1702 default:
1703 msg_gerr("Programmer %s does not have a valid type set!\n", p.name);
1704 ret = 1;
1705 break;
1706 }
Stefan Taunera6d96482012-12-26 19:51:23 +00001707 if (p.init == NULL) {
1708 msg_gerr("Programmer %s does not have a valid init function!\n", p.name);
1709 ret = 1;
1710 }
1711 if (p.delay == NULL) {
1712 msg_gerr("Programmer %s does not have a valid delay function!\n", p.name);
1713 ret = 1;
1714 }
1715 if (p.map_flash_region == NULL) {
1716 msg_gerr("Programmer %s does not have a valid map_flash_region function!\n", p.name);
1717 ret = 1;
1718 }
1719 if (p.unmap_flash_region == NULL) {
1720 msg_gerr("Programmer %s does not have a valid unmap_flash_region function!\n", p.name);
1721 ret = 1;
1722 }
1723 }
Stefan Tauner93f70232011-07-26 14:33:46 +00001724 /* It would be favorable if we could also check for correct termination
Stefan Tauner716e0982011-07-25 20:38:52 +00001725 * of the following arrays, but we don't know their sizes in here...
Stefan Tauner7bcacb12011-05-26 01:35:19 +00001726 * For 'flashchips' we check the first element to be non-null. In the
1727 * other cases there exist use cases where the first element can be
1728 * null. */
1729 if (flashchips == NULL || flashchips[0].vendor == NULL) {
1730 msg_gerr("Flashchips table miscompilation!\n");
1731 ret = 1;
1732 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001733 for (chip = flashchips; chip && chip->name; chip++)
1734 if (selfcheck_eraseblocks(chip))
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001735 ret = 1;
Stefan Tauner7bcacb12011-05-26 01:35:19 +00001736
1737#if CONFIG_INTERNAL == 1
1738 if (chipset_enables == NULL) {
1739 msg_gerr("Chipset enables table does not exist!\n");
1740 ret = 1;
1741 }
Carl-Daniel Hailfinger97d5b122011-08-31 16:19:50 +00001742 if (board_matches == NULL) {
Stefan Tauner7bcacb12011-05-26 01:35:19 +00001743 msg_gerr("Board enables table does not exist!\n");
1744 ret = 1;
1745 }
1746 if (boards_known == NULL) {
1747 msg_gerr("Known boards table does not exist!\n");
1748 ret = 1;
1749 }
1750 if (laptops_known == NULL) {
1751 msg_gerr("Known laptops table does not exist!\n");
1752 ret = 1;
1753 }
Uwe Hermann91f4afa2011-07-28 08:13:25 +00001754#endif
Carl-Daniel Hailfinger293adf02010-01-18 08:14:43 +00001755 return ret;
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001756}
1757
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001758void check_chip_supported(const struct flashchip *chip)
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001759{
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001760 if (chip->feature_bits & FEATURE_OTP) {
Daniel Lenski65922a32012-02-15 23:40:23 +00001761 msg_cdbg("This chip may contain one-time programmable memory. "
1762 "flashrom cannot read\nand may never be able to write "
1763 "it, hence it may not be able to completely\n"
1764 "clone the contents of this chip (see man page for "
1765 "details).\n");
1766 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001767 if (TEST_OK_MASK != (chip->tested & TEST_OK_MASK)) {
Sean Nelson316a29f2010-05-07 20:09:04 +00001768 msg_cinfo("===\n");
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001769 if (chip->tested & TEST_BAD_MASK) {
Sean Nelson316a29f2010-05-07 20:09:04 +00001770 msg_cinfo("This flash part has status NOT WORKING for operations:");
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001771 if (chip->tested & TEST_BAD_PROBE)
Sean Nelson316a29f2010-05-07 20:09:04 +00001772 msg_cinfo(" PROBE");
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001773 if (chip->tested & TEST_BAD_READ)
Sean Nelson316a29f2010-05-07 20:09:04 +00001774 msg_cinfo(" READ");
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001775 if (chip->tested & TEST_BAD_ERASE)
Sean Nelson316a29f2010-05-07 20:09:04 +00001776 msg_cinfo(" ERASE");
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001777 if (chip->tested & TEST_BAD_WRITE)
Sean Nelson316a29f2010-05-07 20:09:04 +00001778 msg_cinfo(" WRITE");
1779 msg_cinfo("\n");
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001780 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001781 if ((!(chip->tested & TEST_BAD_PROBE) && !(chip->tested & TEST_OK_PROBE)) ||
1782 (!(chip->tested & TEST_BAD_READ) && !(chip->tested & TEST_OK_READ)) ||
1783 (!(chip->tested & TEST_BAD_ERASE) && !(chip->tested & TEST_OK_ERASE)) ||
1784 (!(chip->tested & TEST_BAD_WRITE) && !(chip->tested & TEST_OK_WRITE))) {
Sean Nelson316a29f2010-05-07 20:09:04 +00001785 msg_cinfo("This flash part has status UNTESTED for operations:");
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001786 if (!(chip->tested & TEST_BAD_PROBE) && !(chip->tested & TEST_OK_PROBE))
Sean Nelson316a29f2010-05-07 20:09:04 +00001787 msg_cinfo(" PROBE");
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001788 if (!(chip->tested & TEST_BAD_READ) && !(chip->tested & TEST_OK_READ))
Sean Nelson316a29f2010-05-07 20:09:04 +00001789 msg_cinfo(" READ");
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001790 if (!(chip->tested & TEST_BAD_ERASE) && !(chip->tested & TEST_OK_ERASE))
Sean Nelson316a29f2010-05-07 20:09:04 +00001791 msg_cinfo(" ERASE");
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001792 if (!(chip->tested & TEST_BAD_WRITE) && !(chip->tested & TEST_OK_WRITE))
Sean Nelson316a29f2010-05-07 20:09:04 +00001793 msg_cinfo(" WRITE");
1794 msg_cinfo("\n");
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001795 }
Carl-Daniel Hailfingera84835a2010-01-07 03:24:05 +00001796 /* FIXME: This message is designed towards CLI users. */
Carl-Daniel Hailfinger8841d3e2010-05-15 15:04:37 +00001797 msg_cinfo("The test status of this chip may have been updated "
1798 "in the latest development\n"
1799 "version of flashrom. If you are running the latest "
1800 "development version,\n"
1801 "please email a report to flashrom@flashrom.org if "
1802 "any of the above operations\n"
1803 "work correctly for you with this flash part. Please "
1804 "include the flashrom\n"
1805 "output with the additional -V option for all "
1806 "operations you tested (-V, -Vr,\n"
Paul Menzele3800132012-01-12 13:58:43 +00001807 "-VE, -Vw), and mention which mainboard or "
Carl-Daniel Hailfinger8841d3e2010-05-15 15:04:37 +00001808 "programmer you tested.\n"
Paul Menzelab6328f2010-10-08 11:03:02 +00001809 "Please mention your board in the subject line. "
1810 "Thanks for your help!\n");
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001811 }
1812}
1813
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001814/* FIXME: This function signature needs to be improved once doit() has a better
1815 * function signature.
1816 */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001817int chip_safety_check(const struct flashctx *flash, int force, int read_it, int write_it, int erase_it,
1818 int verify_it)
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001819{
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001820 const struct flashchip *chip = flash->chip;
1821
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001822 if (!programmer_may_write && (write_it || erase_it)) {
1823 msg_perr("Write/erase is not working yet on your programmer in "
1824 "its current configuration.\n");
1825 /* --force is the wrong approach, but it's the best we can do
1826 * until the generic programmer parameter parser is merged.
1827 */
1828 if (!force)
1829 return 1;
1830 msg_cerr("Continuing anyway.\n");
1831 }
1832
1833 if (read_it || erase_it || write_it || verify_it) {
1834 /* Everything needs read. */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001835 if (chip->tested & TEST_BAD_READ) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001836 msg_cerr("Read is not working on this chip. ");
1837 if (!force)
1838 return 1;
1839 msg_cerr("Continuing anyway.\n");
1840 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001841 if (!chip->read) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001842 msg_cerr("flashrom has no read function for this "
1843 "flash chip.\n");
1844 return 1;
1845 }
1846 }
1847 if (erase_it || write_it) {
1848 /* Write needs erase. */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001849 if (chip->tested & TEST_BAD_ERASE) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001850 msg_cerr("Erase is not working on this chip. ");
1851 if (!force)
1852 return 1;
1853 msg_cerr("Continuing anyway.\n");
1854 }
Sylvain "ythier" Hitier9db45512011-07-04 07:27:17 +00001855 if(count_usable_erasers(flash) == 0) {
Stefan Tauner5368dca2011-07-01 00:19:12 +00001856 msg_cerr("flashrom has no erase function for this "
1857 "flash chip.\n");
1858 return 1;
1859 }
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001860 }
1861 if (write_it) {
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001862 if (chip->tested & TEST_BAD_WRITE) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001863 msg_cerr("Write is not working on this chip. ");
1864 if (!force)
1865 return 1;
1866 msg_cerr("Continuing anyway.\n");
1867 }
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001868 if (!chip->write) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001869 msg_cerr("flashrom has no write function for this "
1870 "flash chip.\n");
1871 return 1;
1872 }
1873 }
1874 return 0;
1875}
1876
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001877/* This function signature is horrible. We need to design a better interface,
1878 * but right now it allows us to split off the CLI code.
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00001879 * Besides that, the function itself is a textbook example of abysmal code flow.
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001880 */
Carl-Daniel Hailfinger8a3c60c2011-12-18 15:01:24 +00001881int doit(struct flashctx *flash, int force, const char *filename, int read_it,
1882 int write_it, int erase_it, int verify_it)
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001883{
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001884 uint8_t *oldcontents;
1885 uint8_t *newcontents;
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001886 int ret = 0;
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001887 unsigned long size = flash->chip->total_size * 1024;
Carl-Daniel Hailfinger552420b2009-12-24 02:15:55 +00001888
David Hendricks77f931a2011-05-18 01:30:56 +00001889 if (chip_safety_check(flash, force, read_it, write_it, erase_it, verify_it)) {
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001890 msg_cerr("Aborting.\n");
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001891 ret = 1;
1892 goto out_nofree;
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001893 }
1894
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001895 /* Given the existence of read locks, we want to unlock for read,
1896 * erase and write.
1897 */
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001898 if (flash->chip->unlock)
1899 flash->chip->unlock(flash);
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001900
1901 if (read_it) {
1902 ret = read_flash_to_file(flash, filename);
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001903 goto out_nofree;
Carl-Daniel Hailfingerd1be52d2010-07-03 12:14:25 +00001904 }
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001905
Stefan Tauner269de352011-07-12 22:35:21 +00001906 oldcontents = malloc(size);
1907 if (!oldcontents) {
1908 msg_gerr("Out of memory!\n");
1909 exit(1);
1910 }
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001911 /* Assume worst case: All bits are 0. */
1912 memset(oldcontents, 0x00, size);
Stefan Tauner269de352011-07-12 22:35:21 +00001913 newcontents = malloc(size);
1914 if (!newcontents) {
1915 msg_gerr("Out of memory!\n");
1916 exit(1);
1917 }
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001918 /* Assume best case: All bits should be 1. */
1919 memset(newcontents, 0xff, size);
1920 /* Side effect of the assumptions above: Default write action is erase
1921 * because newcontents looks like a completely erased chip, and
1922 * oldcontents being completely 0x00 means we have to erase everything
1923 * before we can write.
1924 */
1925
Ollie Lhoefa28582004-12-08 20:10:01 +00001926 if (erase_it) {
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001927 /* FIXME: Do we really want the scary warning if erase failed?
1928 * After all, after erase the chip is either blank or partially
1929 * blank or it has the old contents. A blank chip won't boot,
1930 * so if the user wanted erase and reboots afterwards, the user
1931 * knows very well that booting won't work.
1932 */
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001933 if (erase_and_write_flash(flash, oldcontents, newcontents)) {
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00001934 emergency_help_message();
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001935 ret = 1;
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00001936 }
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001937 goto out;
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00001938 }
Carl-Daniel Hailfinger43069442010-10-15 00:01:14 +00001939
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00001940 if (write_it || verify_it) {
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001941 if (read_buf_from_file(newcontents, size, filename)) {
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001942 ret = 1;
1943 goto out;
Stefan Reinauer018aca82006-11-21 23:48:51 +00001944 }
1945
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +00001946#if CONFIG_INTERNAL == 1
Stefan Taunerb4e06bd2012-08-20 00:24:22 +00001947 if (programmer == PROGRAMMER_INTERNAL && cb_check_image(newcontents, size) < 0) {
1948 if (force_boardmismatch) {
1949 msg_pinfo("Proceeding anyway because user forced us to.\n");
1950 } else {
1951 msg_perr("Aborting. You can override this with "
1952 "-p internal:boardmismatch=force.\n");
Niklas Söderlund9e423762012-06-16 00:11:16 +00001953 ret = 1;
1954 goto out;
1955 }
Stefan Taunerb4e06bd2012-08-20 00:24:22 +00001956 }
Carl-Daniel Hailfinger66ef4e52009-12-13 22:28:00 +00001957#endif
Ollie Lhocbbf1252004-03-17 22:22:08 +00001958 }
1959
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001960 /* Read the whole chip to be able to check whether regions need to be
1961 * erased and to give better diagnostics in case write fails.
1962 * The alternative would be to read only the regions which are to be
1963 * preserved, but in that case we might perform unneeded erase which
1964 * takes time as well.
1965 */
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001966 msg_cinfo("Reading old flash chip contents... ");
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001967 if (flash->chip->read(flash, oldcontents, 0, size)) {
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001968 ret = 1;
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001969 msg_cinfo("FAILED.\n");
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001970 goto out;
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001971 }
Carl-Daniel Hailfinger84d19682011-07-26 14:28:35 +00001972 msg_cinfo("done.\n");
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001973
Ollie Lho184a4042005-11-26 21:55:36 +00001974 // This should be moved into each flash part's code to do it
1975 // cleanly. This does the job.
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001976 handle_romentries(flash, oldcontents, newcontents);
Uwe Hermanna7e05482007-05-09 10:17:44 +00001977
Ollie Lho184a4042005-11-26 21:55:36 +00001978 // ////////////////////////////////////////////////////////////
Uwe Hermanna7e05482007-05-09 10:17:44 +00001979
Peter Stugef31104c2008-04-28 14:47:30 +00001980 if (write_it) {
Carl-Daniel Hailfinger6e2ea322010-11-04 01:04:27 +00001981 if (erase_and_write_flash(flash, oldcontents, newcontents)) {
1982 msg_cerr("Uh oh. Erase/write failed. Checking if "
1983 "anything changed.\n");
Carl-Daniel Hailfinger5a7cb842012-08-25 01:17:58 +00001984 if (!flash->chip->read(flash, newcontents, 0, size)) {
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001985 if (!memcmp(oldcontents, newcontents, size)) {
Stefan Tauner136388f2013-07-15 10:47:53 +00001986 msg_cinfo("Good. It seems nothing was changed.\n");
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001987 nonfatal_help_message();
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001988 ret = 1;
1989 goto out;
Carl-Daniel Hailfinger42d38a92010-10-19 22:06:20 +00001990 }
1991 }
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00001992 emergency_help_message();
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00001993 ret = 1;
1994 goto out;
Peter Stugef31104c2008-04-28 14:47:30 +00001995 }
Peter Stugef31104c2008-04-28 14:47:30 +00001996 }
Ollie Lho184a4042005-11-26 21:55:36 +00001997
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00001998 if (verify_it) {
Stefan Tauner78ffbea2012-10-27 15:36:56 +00001999 msg_cinfo("Verifying flash... ");
2000
2001 if (write_it) {
2002 /* Work around chips which need some time to calm down. */
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00002003 programmer_delay(1000*1000);
Stefan Tauner78ffbea2012-10-27 15:36:56 +00002004 ret = verify_range(flash, newcontents, 0, size);
2005 /* If we tried to write, and verification now fails, we
2006 * might have an emergency situation.
2007 */
2008 if (ret)
2009 emergency_help_message();
2010 } else {
2011 ret = compare_range(newcontents, oldcontents, 0, size);
2012 }
2013 if (!ret)
2014 msg_cinfo("VERIFIED.\n");
Carl-Daniel Hailfinger8ab49e72009-08-19 13:55:34 +00002015 }
Ollie Lho184a4042005-11-26 21:55:36 +00002016
Carl-Daniel Hailfinger12d6d822010-11-05 14:51:59 +00002017out:
2018 free(oldcontents);
2019 free(newcontents);
2020out_nofree:
Carl-Daniel Hailfinger702218d2009-05-08 17:43:22 +00002021 programmer_shutdown();
Stefan Reinauer143da0b2006-01-04 16:42:57 +00002022 return ret;
Ronald G. Minnichf4cf2ba2002-01-29 18:26:26 +00002023}