spi.c 26.4 KB
Newer Older
1 2 3
/*
 * This file is part of the flashrom project.
 *
4
 * Copyright (C) 2007, 2008, 2009 Carl-Daniel Hailfinger
Stefan Reinauer's avatar
Stefan Reinauer committed
5
 * Copyright (C) 2008 coresystems GmbH
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; version 2 of the License.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
 */

/*
 * Contains the generic SPI framework
 */

#include <string.h>
#include "flash.h"
27
#include "flashchips.h"
28
#include "spi.h"
29

30 31 32
enum spi_controller spi_controller = SPI_CONTROLLER_NONE;
void *spibar = NULL;

33
void spi_prettyprint_status_register(struct flashchip *flash);
34

35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
const struct spi_programmer spi_programmer[] = {
	{ /* SPI_CONTROLLER_NONE */
		.command = NULL,
		.multicommand = NULL,
		.read = NULL,
		.write_256 = NULL,
	},

	{ /* SPI_CONTROLLER_ICH7 */
		.command = ich_spi_send_command,
		.multicommand = ich_spi_send_multicommand,
		.read = ich_spi_read,
		.write_256 = ich_spi_write_256,
	},

	{ /* SPI_CONTROLLER_ICH9 */
		.command = ich_spi_send_command,
		.multicommand = ich_spi_send_multicommand,
		.read = ich_spi_read,
		.write_256 = ich_spi_write_256,
	},

	{ /* SPI_CONTROLLER_IT87XX */
		.command = it8716f_spi_send_command,
		.multicommand = default_spi_send_multicommand,
		.read = it8716f_spi_chip_read,
		.write_256 = it8716f_spi_chip_write_256,
	},

	{ /* SPI_CONTROLLER_SB600 */
		.command = sb600_spi_send_command,
		.multicommand = default_spi_send_multicommand,
		.read = sb600_spi_read,
		.write_256 = sb600_spi_write_1,
	},

	{ /* SPI_CONTROLLER_VIA */
		.command = ich_spi_send_command,
		.multicommand = ich_spi_send_multicommand,
		.read = ich_spi_read,
		.write_256 = ich_spi_write_256,
	},

	{ /* SPI_CONTROLLER_WBSIO */
		.command = wbsio_spi_send_command,
		.multicommand = default_spi_send_multicommand,
		.read = wbsio_spi_read,
		.write_256 = wbsio_spi_write_1,
	},

85
#if FT2232_SPI_SUPPORT == 1
86 87 88 89 90 91
	{ /* SPI_CONTROLLER_FT2232 */
		.command = ft2232_spi_send_command,
		.multicommand = default_spi_send_multicommand,
		.read = ft2232_spi_read,
		.write_256 = ft2232_spi_write_256,
	},
92
#endif
93

94
#if DUMMY_SUPPORT == 1
95 96 97 98 99 100
	{ /* SPI_CONTROLLER_DUMMY */
		.command = dummy_spi_send_command,
		.multicommand = default_spi_send_multicommand,
		.read = NULL,
		.write_256 = NULL,
	},
101
#endif
102 103

	{}, /* This entry corresponds to SPI_CONTROLLER_INVALID. */
104 105
};

106
const int spi_programmer_count = ARRAY_SIZE(spi_programmer);
107

108
int spi_send_command(unsigned int writecnt, unsigned int readcnt,
109
		const unsigned char *writearr, unsigned char *readarr)
110
{
111 112 113 114
	if (!spi_programmer[spi_controller].command) {
		fprintf(stderr, "%s called, but SPI is unsupported on this "
			"hardware. Please report a bug.\n", __func__);
		return 1;
115
	}
116 117 118

	return spi_programmer[spi_controller].command(writecnt, readcnt,
						      writearr, readarr);
119 120
}

121 122
int spi_send_multicommand(struct spi_command *spicommands)
{
123 124 125 126
	if (!spi_programmer[spi_controller].multicommand) {
		fprintf(stderr, "%s called, but SPI is unsupported on this "
			"hardware. Please report a bug.\n", __func__);
		return 1;
127
	}
128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156

	return spi_programmer[spi_controller].multicommand(spicommands);
}

int default_spi_send_command(unsigned int writecnt, unsigned int readcnt,
			     const unsigned char *writearr, unsigned char *readarr)
{
	struct spi_command cmd[] = {
	{
		.writecnt = writecnt,
		.readcnt = readcnt,
		.writearr = writearr,
		.readarr = readarr,
	}, {
		.writecnt = 0,
		.writearr = NULL,
		.readcnt = 0,
		.readarr = NULL,
	}};

	return spi_send_multicommand(cmd);
}

int default_spi_send_multicommand(struct spi_command *spicommands)
{
	int result = 0;
	while ((spicommands->writecnt || spicommands->readcnt) && !result) {
		result = spi_send_command(spicommands->writecnt, spicommands->readcnt,
					  spicommands->writearr, spicommands->readarr);
157
		spicommands++;
158 159
	}
	return result;
160 161
}

162
static int spi_rdid(unsigned char *readarr, int bytes)
163
{
164
	const unsigned char cmd[JEDEC_RDID_OUTSIZE] = { JEDEC_RDID };
165
	int ret;
166
	int i;
167

168
	ret = spi_send_command(sizeof(cmd), bytes, cmd, readarr);
169 170
	if (ret)
		return ret;
171 172 173
	printf_debug("RDID returned");
	for (i = 0; i < bytes; i++)
		printf_debug(" 0x%02x", readarr[i]);
174
	printf_debug(". ");
175 176 177
	return 0;
}

178 179
static int spi_rems(unsigned char *readarr)
{
180 181 182 183
	unsigned char cmd[JEDEC_REMS_OUTSIZE] = { JEDEC_REMS, 0, 0, 0 };
	uint32_t readaddr;
	int ret;

184
	ret = spi_send_command(sizeof(cmd), JEDEC_REMS_INSIZE, cmd, readarr);
185 186 187 188 189 190
	if (ret == SPI_INVALID_ADDRESS) {
		/* Find the lowest even address allowed for reads. */
		readaddr = (spi_get_valid_read_addr() + 1) & ~1;
		cmd[1] = (readaddr >> 16) & 0xff,
		cmd[2] = (readaddr >> 8) & 0xff,
		cmd[3] = (readaddr >> 0) & 0xff,
191
		ret = spi_send_command(sizeof(cmd), JEDEC_REMS_INSIZE, cmd, readarr);
192 193 194
	}
	if (ret)
		return ret;
195
	printf_debug("REMS returned %02x %02x. ", readarr[0], readarr[1]);
196 197 198
	return 0;
}

199 200
static int spi_res(unsigned char *readarr)
{
201 202 203 204
	unsigned char cmd[JEDEC_RES_OUTSIZE] = { JEDEC_RES, 0, 0, 0 };
	uint32_t readaddr;
	int ret;

205
	ret = spi_send_command(sizeof(cmd), JEDEC_RES_INSIZE, cmd, readarr);
206 207 208 209 210 211
	if (ret == SPI_INVALID_ADDRESS) {
		/* Find the lowest even address allowed for reads. */
		readaddr = (spi_get_valid_read_addr() + 1) & ~1;
		cmd[1] = (readaddr >> 16) & 0xff,
		cmd[2] = (readaddr >> 8) & 0xff,
		cmd[3] = (readaddr >> 0) & 0xff,
212
		ret = spi_send_command(sizeof(cmd), JEDEC_RES_INSIZE, cmd, readarr);
213 214 215
	}
	if (ret)
		return ret;
216
	printf_debug("RES returned %02x. ", readarr[0]);
217 218 219
	return 0;
}

220
int spi_write_enable(void)
221
{
222
	const unsigned char cmd[JEDEC_WREN_OUTSIZE] = { JEDEC_WREN };
223
	int result;
224 225

	/* Send WREN (Write Enable) */
226
	result = spi_send_command(sizeof(cmd), 0, cmd, NULL);
227 228

	if (result)
229
		fprintf(stderr, "%s failed\n", __func__);
230

231
	return result;
232 233
}

234
int spi_write_disable(void)
235
{
236
	const unsigned char cmd[JEDEC_WRDI_OUTSIZE] = { JEDEC_WRDI };
237 238

	/* Send WRDI (Write Disable) */
239
	return spi_send_command(sizeof(cmd), 0, cmd, NULL);
240 241
}

242
static int probe_spi_rdid_generic(struct flashchip *flash, int bytes)
243
{
244
	unsigned char readarr[4];
245 246
	uint32_t id1;
	uint32_t id2;
247

248
	if (spi_rdid(readarr, bytes))
249 250 251
		return 0;

	if (!oddparity(readarr[0]))
252
		printf_debug("RDID byte 0 parity violation. ");
253 254 255 256

	/* Check if this is a continuation vendor ID */
	if (readarr[0] == 0x7f) {
		if (!oddparity(readarr[1]))
257
			printf_debug("RDID byte 1 parity violation. ");
258 259
		id1 = (readarr[0] << 8) | readarr[1];
		id2 = readarr[2];
260
		if (bytes > 3) {
261 262
			id2 <<= 8;
			id2 |= readarr[3];
263
		}
264
	} else {
265 266
		id1 = readarr[0];
		id2 = (readarr[1] << 8) | readarr[2];
267 268
	}

269
	printf_debug("%s: id1 0x%02x, id2 0x%02x\n", __func__, id1, id2);
270

271
	if (id1 == flash->manufacture_id && id2 == flash->model_id) {
272 273 274 275 276 277
		/* Print the status register to tell the
		 * user about possible write protection.
		 */
		spi_prettyprint_status_register(flash);

		return 1;
278 279
	}

280
	/* Test if this is a pure vendor match. */
281
	if (id1 == flash->manufacture_id &&
282 283 284
	    GENERIC_DEVICE_ID == flash->model_id)
		return 1;

285 286 287
	return 0;
}

288 289
int probe_spi_rdid(struct flashchip *flash)
{
290 291 292 293
	return probe_spi_rdid_generic(flash, 3);
}

/* support 4 bytes flash ID */
294 295
int probe_spi_rdid4(struct flashchip *flash)
{
296
	/* only some SPI chipsets support 4 bytes commands */
297 298 299 300 301 302
	switch (spi_controller) {
	case SPI_CONTROLLER_ICH7:
	case SPI_CONTROLLER_ICH9:
	case SPI_CONTROLLER_VIA:
	case SPI_CONTROLLER_SB600:
	case SPI_CONTROLLER_WBSIO:
303
#if FT2232_SPI_SUPPORT == 1
304
	case SPI_CONTROLLER_FT2232:
305
#endif
306
#if DUMMY_SUPPORT == 1
307
	case SPI_CONTROLLER_DUMMY:
308
#endif
309 310 311 312 313 314
		return probe_spi_rdid_generic(flash, 4);
	default:
		printf_debug("4b ID not supported on this SPI controller\n");
	}

	return 0;
315 316
}

317 318 319
int probe_spi_rems(struct flashchip *flash)
{
	unsigned char readarr[JEDEC_REMS_INSIZE];
320
	uint32_t id1, id2;
321 322 323 324

	if (spi_rems(readarr))
		return 0;

325 326
	id1 = readarr[0];
	id2 = readarr[1];
327

328
	printf_debug("%s: id1 0x%x, id2 0x%x\n", __func__, id1, id2);
329

330
	if (id1 == flash->manufacture_id && id2 == flash->model_id) {
331 332 333 334 335 336 337 338 339
		/* Print the status register to tell the
		 * user about possible write protection.
		 */
		spi_prettyprint_status_register(flash);

		return 1;
	}

	/* Test if this is a pure vendor match. */
340
	if (id1 == flash->manufacture_id &&
341 342 343 344 345 346
	    GENERIC_DEVICE_ID == flash->model_id)
		return 1;

	return 0;
}

347 348 349
int probe_spi_res(struct flashchip *flash)
{
	unsigned char readarr[3];
350
	uint32_t id2;
351

352 353 354 355 356
	/* Check if RDID was successful and did not return 0xff 0xff 0xff.
	 * In that case, RES is pointless.
	 */
	if (!spi_rdid(readarr, 3) && ((readarr[0] != 0xff) ||
	    (readarr[1] != 0xff) || (readarr[2] != 0xff)))
357 358 359 360 361
		return 0;

	if (spi_res(readarr))
		return 0;

362
	id2 = readarr[0];
363
	printf_debug("%s: id 0x%x\n", __func__, id2);
364
	if (id2 != flash->model_id)
365 366 367 368 369 370 371
		return 0;

	/* Print the status register to tell the
	 * user about possible write protection.
	 */
	spi_prettyprint_status_register(flash);
	return 1;
372 373
}

374
uint8_t spi_read_status_register(void)
375
{
376
	const unsigned char cmd[JEDEC_RDSR_OUTSIZE] = { JEDEC_RDSR };
377
	/* FIXME: No workarounds for driver/hardware bugs in generic code. */
Peter Stuge's avatar
Peter Stuge committed
378
	unsigned char readarr[2]; /* JEDEC_RDSR_INSIZE=1 but wbsio needs 2 */
379
	int ret;
380 381

	/* Read Status Register */
382 383
	ret = spi_send_command(sizeof(cmd), sizeof(readarr), cmd, readarr);
	if (ret)
384
		fprintf(stderr, "RDSR failed!\n");
385

386 387 388
	return readarr[0];
}

389
/* Prettyprint the status register. Common definitions. */
390
void spi_prettyprint_status_register_common(uint8_t status)
391
{
392
	printf_debug("Chip status register: Bit 5 / Block Protect 3 (BP3) is "
393
		     "%sset\n", (status & (1 << 5)) ? "" : "not ");
394
	printf_debug("Chip status register: Bit 4 / Block Protect 2 (BP2) is "
395
		     "%sset\n", (status & (1 << 4)) ? "" : "not ");
396
	printf_debug("Chip status register: Bit 3 / Block Protect 1 (BP1) is "
397
		     "%sset\n", (status & (1 << 3)) ? "" : "not ");
398
	printf_debug("Chip status register: Bit 2 / Block Protect 0 (BP0) is "
399
		     "%sset\n", (status & (1 << 2)) ? "" : "not ");
400
	printf_debug("Chip status register: Write Enable Latch (WEL) is "
401
		     "%sset\n", (status & (1 << 1)) ? "" : "not ");
402
	printf_debug("Chip status register: Write In Progress (WIP/BUSY) is "
403
		     "%sset\n", (status & (1 << 0)) ? "" : "not ");
404 405
}

406 407 408 409 410 411 412
/* Prettyprint the status register. Works for
 * ST M25P series
 * MX MX25L series
 */
void spi_prettyprint_status_register_st_m25p(uint8_t status)
{
	printf_debug("Chip status register: Status Register Write Disable "
413
		     "(SRWD) is %sset\n", (status & (1 << 7)) ? "" : "not ");
414
	printf_debug("Chip status register: Bit 6 is "
415
		     "%sset\n", (status & (1 << 6)) ? "" : "not ");
416 417 418
	spi_prettyprint_status_register_common(status);
}

419 420 421 422 423 424 425 426 427
void spi_prettyprint_status_register_sst25(uint8_t status)
{
	printf_debug("Chip status register: Block Protect Write Disable "
		     "(BPL) is %sset\n", (status & (1 << 7)) ? "" : "not ");
	printf_debug("Chip status register: Auto Address Increment Programming "
		     "(AAI) is %sset\n", (status & (1 << 6)) ? "" : "not ");
	spi_prettyprint_status_register_common(status);
}

428 429 430 431 432
/* Prettyprint the status register. Works for
 * SST 25VF016
 */
void spi_prettyprint_status_register_sst25vf016(uint8_t status)
{
433
	const char *bpt[] = {
434 435 436 437 438 439
		"none",
		"1F0000H-1FFFFFH",
		"1E0000H-1FFFFFH",
		"1C0000H-1FFFFFH",
		"180000H-1FFFFFH",
		"100000H-1FFFFFH",
440
		"all", "all"
441
	};
442
	spi_prettyprint_status_register_sst25(status);
443
	printf_debug("Resulting block protection : %s\n",
444
		     bpt[(status & 0x1c) >> 2]);
445 446
}

447 448 449 450 451 452 453 454 455
void spi_prettyprint_status_register_sst25vf040b(uint8_t status)
{
	const char *bpt[] = {
		"none",
		"0x70000-0x7ffff",
		"0x60000-0x7ffff",
		"0x40000-0x7ffff",
		"all blocks", "all blocks", "all blocks", "all blocks"
	};
456
	spi_prettyprint_status_register_sst25(status);
457
	printf_debug("Resulting block protection : %s\n",
458
		bpt[(status & 0x1c) >> 2]);
459 460
}

461
void spi_prettyprint_status_register(struct flashchip *flash)
462 463 464
{
	uint8_t status;

465
	status = spi_read_status_register();
466 467 468
	printf_debug("Chip status register is %02x\n", status);
	switch (flash->manufacture_id) {
	case ST_ID:
469 470 471 472
		if (((flash->model_id & 0xff00) == 0x2000) ||
		    ((flash->model_id & 0xff00) == 0x2500))
			spi_prettyprint_status_register_st_m25p(status);
		break;
473 474
	case MX_ID:
		if ((flash->model_id & 0xff00) == 0x2000)
475 476 477
			spi_prettyprint_status_register_st_m25p(status);
		break;
	case SST_ID:
478 479
		switch (flash->model_id) {
		case 0x2541:
480
			spi_prettyprint_status_register_sst25vf016(status);
481 482 483 484 485
			break;
		case 0x8d:
		case 0x258d:
			spi_prettyprint_status_register_sst25vf040b(status);
			break;
486
		default:
487 488
			spi_prettyprint_status_register_sst25(status);
			break;
489
		}
490 491 492
		break;
	}
}
493

494 495
int spi_chip_erase_60(struct flashchip *flash)
{
496
	int result;
497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513
	struct spi_command spicommands[] = {
	{
		.writecnt	= JEDEC_WREN_OUTSIZE,
		.writearr	= (const unsigned char[]){ JEDEC_WREN },
		.readcnt	= 0,
		.readarr	= NULL,
	}, {
		.writecnt	= JEDEC_CE_60_OUTSIZE,
		.writearr	= (const unsigned char[]){ JEDEC_CE_60 },
		.readcnt	= 0,
		.readarr	= NULL,
	}, {
		.writecnt	= 0,
		.writearr	= NULL,
		.readcnt	= 0,
		.readarr	= NULL,
	}};
514
	
515 516
	result = spi_disable_blockprotect();
	if (result) {
517
		fprintf(stderr, "spi_disable_blockprotect failed\n");
518 519
		return result;
	}
520 521
	
	result = spi_send_multicommand(spicommands);
522
	if (result) {
523 524
		fprintf(stderr, "%s failed during command execution\n",
			__func__);
525 526
		return result;
	}
527 528 529
	/* Wait until the Write-In-Progress bit is cleared.
	 * This usually takes 1-85 s, so wait in 1 s steps.
	 */
530
	/* FIXME: We assume spi_read_status_register will never fail. */
531
	while (spi_read_status_register() & JEDEC_RDSR_BIT_WIP)
532
		programmer_delay(1000 * 1000);
533 534 535 536
	if (check_erased_range(flash, 0, flash->total_size * 1024)) {
		fprintf(stderr, "ERASE FAILED!\n");
		return -1;
	}
537 538 539
	return 0;
}

540
int spi_chip_erase_c7(struct flashchip *flash)
541
{
542
	int result;
543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559
	struct spi_command spicommands[] = {
	{
		.writecnt	= JEDEC_WREN_OUTSIZE,
		.writearr	= (const unsigned char[]){ JEDEC_WREN },
		.readcnt	= 0,
		.readarr	= NULL,
	}, {
		.writecnt	= JEDEC_CE_C7_OUTSIZE,
		.writearr	= (const unsigned char[]){ JEDEC_CE_C7 },
		.readcnt	= 0,
		.readarr	= NULL,
	}, {
		.writecnt	= 0,
		.writearr	= NULL,
		.readcnt	= 0,
		.readarr	= NULL,
	}};
560

561 562
	result = spi_disable_blockprotect();
	if (result) {
563
		fprintf(stderr, "spi_disable_blockprotect failed\n");
564 565
		return result;
	}
566 567

	result = spi_send_multicommand(spicommands);
568
	if (result) {
569
		fprintf(stderr, "%s failed during command execution\n", __func__);
570 571
		return result;
	}
572 573 574
	/* Wait until the Write-In-Progress bit is cleared.
	 * This usually takes 1-85 s, so wait in 1 s steps.
	 */
575
	/* FIXME: We assume spi_read_status_register will never fail. */
576
	while (spi_read_status_register() & JEDEC_RDSR_BIT_WIP)
577
		programmer_delay(1000 * 1000);
578 579 580 581
	if (check_erased_range(flash, 0, flash->total_size * 1024)) {
		fprintf(stderr, "ERASE FAILED!\n");
		return -1;
	}
582 583 584
	return 0;
}

585 586 587 588 589 590 591 592 593 594 595
int spi_chip_erase_60_c7(struct flashchip *flash)
{
	int result;
	result = spi_chip_erase_60(flash);
	if (result) {
		printf_debug("spi_chip_erase_60 failed, trying c7\n");
		result = spi_chip_erase_c7(flash);
	}
	return result;
}

596
int spi_block_erase_52(struct flashchip *flash, unsigned int addr, unsigned int blocklen)
597
{
598
	int result;
599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615
	struct spi_command spicommands[] = {
	{
		.writecnt	= JEDEC_WREN_OUTSIZE,
		.writearr	= (const unsigned char[]){ JEDEC_WREN },
		.readcnt	= 0,
		.readarr	= NULL,
	}, {
		.writecnt	= JEDEC_BE_52_OUTSIZE,
		.writearr	= (const unsigned char[]){ JEDEC_BE_52, (addr >> 16) & 0xff, (addr >> 8) & 0xff, (addr & 0xff) },
		.readcnt	= 0,
		.readarr	= NULL,
	}, {
		.writecnt	= 0,
		.writearr	= NULL,
		.readcnt	= 0,
		.readarr	= NULL,
	}};
616

617 618
	result = spi_send_multicommand(spicommands);
	if (result) {
619 620
		fprintf(stderr, "%s failed during command execution\n",
			__func__);
621
		return result;
622
	}
623 624 625 626
	/* Wait until the Write-In-Progress bit is cleared.
	 * This usually takes 100-4000 ms, so wait in 100 ms steps.
	 */
	while (spi_read_status_register() & JEDEC_RDSR_BIT_WIP)
627
		programmer_delay(100 * 1000);
628 629 630 631
	if (check_erased_range(flash, addr, blocklen)) {
		fprintf(stderr, "ERASE FAILED!\n");
		return -1;
	}
632 633 634
	return 0;
}

635 636 637 638 639
/* Block size is usually
 * 64k for Macronix
 * 32k for SST
 * 4-32k non-uniform for EON
 */
640
int spi_block_erase_d8(struct flashchip *flash, unsigned int addr, unsigned int blocklen)
641
{
642
	int result;
643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659
	struct spi_command spicommands[] = {
	{
		.writecnt	= JEDEC_WREN_OUTSIZE,
		.writearr	= (const unsigned char[]){ JEDEC_WREN },
		.readcnt	= 0,
		.readarr	= NULL,
	}, {
		.writecnt	= JEDEC_BE_D8_OUTSIZE,
		.writearr	= (const unsigned char[]){ JEDEC_BE_D8, (addr >> 16) & 0xff, (addr >> 8) & 0xff, (addr & 0xff) },
		.readcnt	= 0,
		.readarr	= NULL,
	}, {
		.writecnt	= 0,
		.writearr	= NULL,
		.readcnt	= 0,
		.readarr	= NULL,
	}};
660

661 662
	result = spi_send_multicommand(spicommands);
	if (result) {
663
		fprintf(stderr, "%s failed during command execution\n", __func__);
664
		return result;
665
	}
666 667 668
	/* Wait until the Write-In-Progress bit is cleared.
	 * This usually takes 100-4000 ms, so wait in 100 ms steps.
	 */
669
	while (spi_read_status_register() & JEDEC_RDSR_BIT_WIP)
670
		programmer_delay(100 * 1000);
671 672 673 674
	if (check_erased_range(flash, addr, blocklen)) {
		fprintf(stderr, "ERASE FAILED!\n");
		return -1;
	}
675 676 677
	return 0;
}

678 679 680 681 682 683 684 685 686 687 688
int spi_chip_erase_d8(struct flashchip *flash)
{
	int i, rc = 0;
	int total_size = flash->total_size * 1024;
	int erase_size = 64 * 1024;

	spi_disable_blockprotect();

	printf("Erasing chip: \n");

	for (i = 0; i < total_size / erase_size; i++) {
689
		rc = spi_block_erase_d8(flash, i * erase_size, erase_size);
690
		if (rc) {
691
			fprintf(stderr, "Error erasing block at 0x%x\n", i);
692 693 694 695 696 697 698 699 700
			break;
		}
	}

	printf("\n");

	return rc;
}

701
/* Sector size is usually 4k, though Macronix eliteflash has 64k */
702
int spi_block_erase_20(struct flashchip *flash, unsigned int addr, unsigned int blocklen)
703
{
704
	int result;
705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721
	struct spi_command spicommands[] = {
	{
		.writecnt	= JEDEC_WREN_OUTSIZE,
		.writearr	= (const unsigned char[]){ JEDEC_WREN },
		.readcnt	= 0,
		.readarr	= NULL,
	}, {
		.writecnt	= JEDEC_SE_OUTSIZE,
		.writearr	= (const unsigned char[]){ JEDEC_SE, (addr >> 16) & 0xff, (addr >> 8) & 0xff, (addr & 0xff) },
		.readcnt	= 0,
		.readarr	= NULL,
	}, {
		.writecnt	= 0,
		.writearr	= NULL,
		.readcnt	= 0,
		.readarr	= NULL,
	}};
722

723 724
	result = spi_send_multicommand(spicommands);
	if (result) {
725 726
		fprintf(stderr, "%s failed during command execution\n",
			__func__);
727
		return result;
728
	}
729 730 731
	/* Wait until the Write-In-Progress bit is cleared.
	 * This usually takes 15-800 ms, so wait in 10 ms steps.
	 */
732
	while (spi_read_status_register() & JEDEC_RDSR_BIT_WIP)
733
		programmer_delay(10 * 1000);
734 735 736 737
	if (check_erased_range(flash, addr, blocklen)) {
		fprintf(stderr, "ERASE FAILED!\n");
		return -1;
	}
738 739 740
	return 0;
}

741 742 743
int spi_block_erase_60(struct flashchip *flash, unsigned int addr, unsigned int blocklen)
{
	if ((addr != 0) || (blocklen != flash->total_size * 1024)) {
744 745
		fprintf(stderr, "%s called with incorrect arguments\n",
			__func__);
746 747 748 749 750 751 752 753
		return -1;
	}
	return spi_chip_erase_60(flash);
}

int spi_block_erase_c7(struct flashchip *flash, unsigned int addr, unsigned int blocklen)
{
	if ((addr != 0) || (blocklen != flash->total_size * 1024)) {
754 755
		fprintf(stderr, "%s called with incorrect arguments\n",
			__func__);
756 757 758 759 760
		return -1;
	}
	return spi_chip_erase_c7(flash);
}

761
int spi_write_status_enable(void)
762 763
{
	const unsigned char cmd[JEDEC_EWSR_OUTSIZE] = { JEDEC_EWSR };
764
	int result;
765 766

	/* Send EWSR (Enable Write Status Register). */
767
	result = spi_send_command(sizeof(cmd), JEDEC_EWSR_INSIZE, cmd, NULL);
768 769

	if (result)
770
		fprintf(stderr, "%s failed\n", __func__);
771 772

	return result;
773 774
}

775 776 777 778
/*
 * This is according the SST25VF016 datasheet, who knows it is more
 * generic that this...
 */
779
int spi_write_status_register(int status)
780
{
781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798
	int result;
	struct spi_command spicommands[] = {
	{
		.writecnt	= JEDEC_EWSR_OUTSIZE,
		.writearr	= (const unsigned char[]){ JEDEC_EWSR },
		.readcnt	= 0,
		.readarr	= NULL,
	}, {
		.writecnt	= JEDEC_WRSR_OUTSIZE,
		.writearr	= (const unsigned char[]){ JEDEC_WRSR, (unsigned char) status },
		.readcnt	= 0,
		.readarr	= NULL,
	}, {
		.writecnt	= 0,
		.writearr	= NULL,
		.readcnt	= 0,
		.readarr	= NULL,
	}};
799

800 801
	result = spi_send_multicommand(spicommands);
	if (result) {
802 803
		fprintf(stderr, "%s failed during command execution\n",
			__func__);
804 805
	}
	return result;
806 807
}

808
int spi_byte_program(int addr, uint8_t byte)
809
{
810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827
	int result;
	struct spi_command spicommands[] = {
	{
		.writecnt	= JEDEC_WREN_OUTSIZE,
		.writearr	= (const unsigned char[]){ JEDEC_WREN },
		.readcnt	= 0,
		.readarr	= NULL,
	}, {
		.writecnt	= JEDEC_BYTE_PROGRAM_OUTSIZE,
		.writearr	= (const unsigned char[]){ JEDEC_BYTE_PROGRAM, (addr >> 16) & 0xff, (addr >> 8) & 0xff, (addr & 0xff), byte },
		.readcnt	= 0,
		.readarr	= NULL,
	}, {
		.writecnt	= 0,
		.writearr	= NULL,
		.readcnt	= 0,
		.readarr	= NULL,
	}};
828

829 830
	result = spi_send_multicommand(spicommands);
	if (result) {
831 832
		fprintf(stderr, "%s failed during command execution\n",
			__func__);
833 834
	}
	return result;
835 836
}

837 838
int spi_nbyte_program(int address, uint8_t *bytes, int len)
{
839 840
	int result;
	/* FIXME: Switch to malloc based on len unless that kills speed. */
841 842 843 844 845 846
	unsigned char cmd[JEDEC_BYTE_PROGRAM_OUTSIZE - 1 + 256] = {
		JEDEC_BYTE_PROGRAM,
		(address >> 16) & 0xff,
		(address >> 8) & 0xff,
		(address >> 0) & 0xff,
	};
847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863
	struct spi_command spicommands[] = {
	{
		.writecnt	= JEDEC_WREN_OUTSIZE,
		.writearr	= (const unsigned char[]){ JEDEC_WREN },
		.readcnt	= 0,
		.readarr	= NULL,
	}, {
		.writecnt	= JEDEC_BYTE_PROGRAM_OUTSIZE - 1 + len,
		.writearr	= cmd,
		.readcnt	= 0,
		.readarr	= NULL,
	}, {
		.writecnt	= 0,
		.writearr	= NULL,
		.readcnt	= 0,
		.readarr	= NULL,
	}};
864

865
	if (!len) {
866
		fprintf(stderr, "%s called for zero-length write\n", __func__);
867 868
		return 1;
	}
869
	if (len > 256) {
870
		fprintf(stderr, "%s called for too long a write\n", __func__);
871 872 873 874 875
		return 1;
	}

	memcpy(&cmd[4], bytes, len);

876 877
	result = spi_send_multicommand(spicommands);
	if (result) {
878 879
		fprintf(stderr, "%s failed during command execution\n",
			__func__);
880 881
	}
	return result;
882 883
}

884
int spi_disable_blockprotect(void)
885 886
{
	uint8_t status;
887
	int result;
888

889
	status = spi_read_status_register();
890 891 892
	/* If there is block protection in effect, unprotect it first. */
	if ((status & 0x3c) != 0) {
		printf_debug("Some block protection in effect, disabling\n");
893 894
		result = spi_write_status_register(status & ~0x3c);
		if (result) {
895
			fprintf(stderr, "spi_write_status_register failed\n");
896 897
			return result;
		}
898
	}
899
	return 0;
900 901
}

902
int spi_nbyte_read(int address, uint8_t *bytes, int len)
903
{
904 905
	const unsigned char cmd[JEDEC_READ_OUTSIZE] = {
		JEDEC_READ,
906 907 908
		(address >> 16) & 0xff,
		(address >> 8) & 0xff,
		(address >> 0) & 0xff,
909 910 911
	};

	/* Send Read */
912
	return spi_send_command(sizeof(cmd), len, cmd, bytes);
913 914
}

915 916 917 918
/*
 * Read a complete flash chip.
 * Each page is read separately in chunks with a maximum size of chunksize.
 */
919
int spi_read_chunked(struct flashchip *flash, uint8_t *buf, int start, int len, int chunksize)
920 921
{
	int rc = 0;
922
	int i, j, starthere, lenhere;
923 924 925
	int page_size = flash->page_size;
	int toread;

926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943
	/* Warning: This loop has a very unusual condition and body.
	 * The loop needs to go through each page with at least one affected
	 * byte. The lowest page number is (start / page_size) since that
	 * division rounds down. The highest page number we want is the page
	 * where the last byte of the range lives. That last byte has the
	 * address (start + len - 1), thus the highest page number is
	 * (start + len - 1) / page_size. Since we want to include that last
	 * page as well, the loop condition uses <=.
	 */
	for (i = start / page_size; i <= (start + len - 1) / page_size; i++) {
		/* Byte position of the first byte in the range in this page. */
		/* starthere is an offset to the base address of the chip. */
		starthere = max(start, i * page_size);
		/* Length of bytes in the range in this page. */
		lenhere = min(start + len, (i + 1) * page_size) - starthere;
		for (j = 0; j < lenhere; j += chunksize) {
			toread = min(chunksize, lenhere - j);
			rc = spi_nbyte_read(starthere + j, buf + starthere - start + j, toread);
944 945 946 947 948 949 950 951 952 953
			if (rc)
				break;
		}
		if (rc)
			break;
	}

	return rc;
}

954
int spi_chip_read(struct flashchip *flash, uint8_t *buf, int start, int len)
955
{
956 957 958 959
	if (!spi_programmer[spi_controller].read) {
		fprintf(stderr, "%s called, but SPI read is unsupported on this"
			" hardware. Please report a bug.\n", __func__);
		return 1;
960 961
	}

962
	return spi_programmer[spi_controller].read(flash, buf, start, len);
963 964
}

965 966 967 968 969 970 971 972 973 974 975 976
/*
 * Program chip using byte programming. (SLOW!)
 * This is for chips which can only handle one byte writes
 * and for chips where memory mapped programming is impossible
 * (e.g. due to size constraints in IT87* for over 512 kB)
 */
int spi_chip_write_1(struct flashchip *flash, uint8_t *buf)
{
	int total_size = 1024 * flash->total_size;
	int i;

	spi_disable_blockprotect();
977 978
	/* Erase first */
	printf("Erasing flash before programming... ");
979
	if (erase_flash(flash)) {
980 981 982 983
		fprintf(stderr, "ERASE FAILED!\n");
		return -1;
	}
	printf("done.\n");
984 985 986
	for (i = 0; i < total_size; i++) {
		spi_byte_program(i, buf[i]);
		while (spi_read_status_register() & JEDEC_RDSR_BIT_WIP)
987
			programmer_delay(10);
988 989 990 991 992 993 994 995 996
	}

	return 0;
}

/*
 * Program chip using page (256 bytes) programming.
 * Some SPI masters can't do this, they use single byte programming instead.
 */
997
int spi_chip_write_256(struct flashchip *flash, uint8_t *buf)
998
{
999 1000 1001 1002
	if (!spi_programmer[spi_controller].write_256) {
		fprintf(stderr, "%s called, but SPI page write is unsupported "
			" on this hardware. Please report a bug.\n", __func__);
		return 1;
1003 1004
	}

1005
	return spi_programmer[spi_controller].write_256(flash, buf);
1006
}
1007

1008 1009 1010 1011 1012 1013
uint32_t spi_get_valid_read_addr(void)
{
	/* Need to return BBAR for ICH chipsets. */
	return 0;
}

1014 1015
int spi_aai_write(struct flashchip *flash, uint8_t *buf)
{
1016 1017
	uint32_t pos = 2, size = flash->total_size * 1024;
	unsigned char w[6] = {0xad, 0, 0, 0, buf[0], buf[1]};
1018 1019
	int result;

1020 1021
	switch (spi_controller) {
	case SPI_CONTROLLER_WBSIO:
1022 1023
		fprintf(stderr, "%s: impossible with Winbond SPI masters,"
				" degrading to byte program\n", __func__);
1024
		return spi_chip_write_1(flash, buf);
1025 1026
	default:
		break;
1027
	}
1028
	if (erase_flash(flash)) {
1029 1030 1031
		fprintf(stderr, "ERASE FAILED!\n");
		return -1;
	}
1032 1033 1034
	result = spi_write_enable();
	if (result)
		return result;
1035
	spi_send_command(6, 0, w, NULL);
1036
	while (spi_read_status_register() & JEDEC_RDSR_BIT_WIP)
1037
		programmer_delay(5); /* SST25VF040B Tbp is max 10us */
1038 1039 1040
	while (pos < size) {
		w[1] = buf[pos++];
		w[2] = buf[pos++];
1041
		spi_send_command(3, 0, w, NULL);
1042
		while (spi_read_status_register() & JEDEC_RDSR_BIT_WIP)
1043
			programmer_delay(5); /* SST25VF040B Tbp is max 10us */
1044 1045 1046 1047
	}
	spi_write_disable();
	return 0;
}