spi.c 26 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 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
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,
	},

	{ /* SPI_CONTROLLER_FT2232 */
		.command = ft2232_spi_send_command,
		.multicommand = default_spi_send_multicommand,
		.read = ft2232_spi_read,
		.write_256 = ft2232_spi_write_256,
	},

	{ /* SPI_CONTROLLER_DUMMY */
		.command = dummy_spi_send_command,
		.multicommand = default_spi_send_multicommand,
		.read = NULL,
		.write_256 = NULL,
	},
};


101
int spi_send_command(unsigned int writecnt, unsigned int readcnt,
102
		const unsigned char *writearr, unsigned char *readarr)
103
{
104 105 106 107
	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;
108
	}
109 110 111

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

114 115
int spi_send_multicommand(struct spi_command *spicommands)
{
116 117 118 119
	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;
120
	}
121 122 123 124 125 126 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

	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);
	}
	return result;
152 153
}

154
static int spi_rdid(unsigned char *readarr, int bytes)
155
{
156
	const unsigned char cmd[JEDEC_RDID_OUTSIZE] = { JEDEC_RDID };
157
	int ret;
158
	int i;
159

160
	ret = spi_send_command(sizeof(cmd), bytes, cmd, readarr);
161 162
	if (ret)
		return ret;
163 164 165
	printf_debug("RDID returned");
	for (i = 0; i < bytes; i++)
		printf_debug(" 0x%02x", readarr[i]);
166
	printf_debug(". ");
167 168 169
	return 0;
}

170 171
static int spi_rems(unsigned char *readarr)
{
172 173 174 175
	unsigned char cmd[JEDEC_REMS_OUTSIZE] = { JEDEC_REMS, 0, 0, 0 };
	uint32_t readaddr;
	int ret;

176
	ret = spi_send_command(sizeof(cmd), JEDEC_REMS_INSIZE, cmd, readarr);
177 178 179 180 181 182
	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,
183
		ret = spi_send_command(sizeof(cmd), JEDEC_REMS_INSIZE, cmd, readarr);
184 185 186
	}
	if (ret)
		return ret;
187
	printf_debug("REMS returned %02x %02x. ", readarr[0], readarr[1]);
188 189 190
	return 0;
}

191 192
static int spi_res(unsigned char *readarr)
{
193 194 195 196
	unsigned char cmd[JEDEC_RES_OUTSIZE] = { JEDEC_RES, 0, 0, 0 };
	uint32_t readaddr;
	int ret;

197
	ret = spi_send_command(sizeof(cmd), JEDEC_RES_INSIZE, cmd, readarr);
198 199 200 201 202 203
	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,
204
		ret = spi_send_command(sizeof(cmd), JEDEC_RES_INSIZE, cmd, readarr);
205 206 207
	}
	if (ret)
		return ret;
208
	printf_debug("RES returned %02x. ", readarr[0]);
209 210 211
	return 0;
}

212
int spi_write_enable(void)
213
{
214
	const unsigned char cmd[JEDEC_WREN_OUTSIZE] = { JEDEC_WREN };
215
	int result;
216 217

	/* Send WREN (Write Enable) */
218
	result = spi_send_command(sizeof(cmd), 0, cmd, NULL);
219 220

	if (result)
221
		fprintf(stderr, "%s failed\n", __func__);
222

223
	return result;
224 225
}

226
int spi_write_disable(void)
227
{
228
	const unsigned char cmd[JEDEC_WRDI_OUTSIZE] = { JEDEC_WRDI };
229 230

	/* Send WRDI (Write Disable) */
231
	return spi_send_command(sizeof(cmd), 0, cmd, NULL);
232 233
}

234
static int probe_spi_rdid_generic(struct flashchip *flash, int bytes)
235
{
236
	unsigned char readarr[4];
237 238
	uint32_t id1;
	uint32_t id2;
239

240
	if (spi_rdid(readarr, bytes))
241 242 243
		return 0;

	if (!oddparity(readarr[0]))
244
		printf_debug("RDID byte 0 parity violation. ");
245 246 247 248

	/* Check if this is a continuation vendor ID */
	if (readarr[0] == 0x7f) {
		if (!oddparity(readarr[1]))
249
			printf_debug("RDID byte 1 parity violation. ");
250 251
		id1 = (readarr[0] << 8) | readarr[1];
		id2 = readarr[2];
252
		if (bytes > 3) {
253 254
			id2 <<= 8;
			id2 |= readarr[3];
255
		}
256
	} else {
257 258
		id1 = readarr[0];
		id2 = (readarr[1] << 8) | readarr[2];
259 260
	}

261
	printf_debug("%s: id1 0x%02x, id2 0x%02x\n", __FUNCTION__, id1, id2);
262

263
	if (id1 == flash->manufacture_id && id2 == flash->model_id) {
264 265 266 267 268 269
		/* Print the status register to tell the
		 * user about possible write protection.
		 */
		spi_prettyprint_status_register(flash);

		return 1;
270 271
	}

272
	/* Test if this is a pure vendor match. */
273
	if (id1 == flash->manufacture_id &&
274 275 276
	    GENERIC_DEVICE_ID == flash->model_id)
		return 1;

277 278 279
	return 0;
}

280 281
int probe_spi_rdid(struct flashchip *flash)
{
282 283 284 285
	return probe_spi_rdid_generic(flash, 3);
}

/* support 4 bytes flash ID */
286 287
int probe_spi_rdid4(struct flashchip *flash)
{
288
	/* only some SPI chipsets support 4 bytes commands */
289 290 291 292 293 294
	switch (spi_controller) {
	case SPI_CONTROLLER_ICH7:
	case SPI_CONTROLLER_ICH9:
	case SPI_CONTROLLER_VIA:
	case SPI_CONTROLLER_SB600:
	case SPI_CONTROLLER_WBSIO:
295
	case SPI_CONTROLLER_FT2232:
296
	case SPI_CONTROLLER_DUMMY:
297 298 299 300 301 302
		return probe_spi_rdid_generic(flash, 4);
	default:
		printf_debug("4b ID not supported on this SPI controller\n");
	}

	return 0;
303 304
}

305 306 307
int probe_spi_rems(struct flashchip *flash)
{
	unsigned char readarr[JEDEC_REMS_INSIZE];
308
	uint32_t id1, id2;
309 310 311 312

	if (spi_rems(readarr))
		return 0;

313 314
	id1 = readarr[0];
	id2 = readarr[1];
315

316
	printf_debug("%s: id1 0x%x, id2 0x%x\n", __FUNCTION__, id1, id2);
317

318
	if (id1 == flash->manufacture_id && id2 == flash->model_id) {
319 320 321 322 323 324 325 326 327
		/* 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. */
328
	if (id1 == flash->manufacture_id &&
329 330 331 332 333 334
	    GENERIC_DEVICE_ID == flash->model_id)
		return 1;

	return 0;
}

335 336 337
int probe_spi_res(struct flashchip *flash)
{
	unsigned char readarr[3];
338
	uint32_t id2;
339

340 341 342 343 344
	/* 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)))
345 346 347 348 349
		return 0;

	if (spi_res(readarr))
		return 0;

350 351 352
	id2 = readarr[0];
	printf_debug("%s: id 0x%x\n", __FUNCTION__, id2);
	if (id2 != flash->model_id)
353 354 355 356 357 358 359
		return 0;

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

362
uint8_t spi_read_status_register(void)
363
{
364
	const unsigned char cmd[JEDEC_RDSR_OUTSIZE] = { JEDEC_RDSR };
365
	/* FIXME: No workarounds for driver/hardware bugs in generic code. */
Peter Stuge's avatar
Peter Stuge committed
366
	unsigned char readarr[2]; /* JEDEC_RDSR_INSIZE=1 but wbsio needs 2 */
367
	int ret;
368 369

	/* Read Status Register */
370 371
	ret = spi_send_command(sizeof(cmd), sizeof(readarr), cmd, readarr);
	if (ret)
372
		fprintf(stderr, "RDSR failed!\n");
373

374 375 376
	return readarr[0];
}

377
/* Prettyprint the status register. Common definitions. */
378
void spi_prettyprint_status_register_common(uint8_t status)
379
{
380
	printf_debug("Chip status register: Bit 5 / Block Protect 3 (BP3) is "
381
		     "%sset\n", (status & (1 << 5)) ? "" : "not ");
382
	printf_debug("Chip status register: Bit 4 / Block Protect 2 (BP2) is "
383
		     "%sset\n", (status & (1 << 4)) ? "" : "not ");
384
	printf_debug("Chip status register: Bit 3 / Block Protect 1 (BP1) is "
385
		     "%sset\n", (status & (1 << 3)) ? "" : "not ");
386
	printf_debug("Chip status register: Bit 2 / Block Protect 0 (BP0) is "
387
		     "%sset\n", (status & (1 << 2)) ? "" : "not ");
388
	printf_debug("Chip status register: Write Enable Latch (WEL) is "
389
		     "%sset\n", (status & (1 << 1)) ? "" : "not ");
390
	printf_debug("Chip status register: Write In Progress (WIP/BUSY) is "
391
		     "%sset\n", (status & (1 << 0)) ? "" : "not ");
392 393
}

394 395 396 397 398 399 400
/* 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 "
401
		     "(SRWD) is %sset\n", (status & (1 << 7)) ? "" : "not ");
402
	printf_debug("Chip status register: Bit 6 is "
403
		     "%sset\n", (status & (1 << 6)) ? "" : "not ");
404 405 406
	spi_prettyprint_status_register_common(status);
}

407 408 409 410 411 412 413 414 415
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);
}

416 417 418 419 420
/* Prettyprint the status register. Works for
 * SST 25VF016
 */
void spi_prettyprint_status_register_sst25vf016(uint8_t status)
{
421
	const char *bpt[] = {
422 423 424 425 426 427
		"none",
		"1F0000H-1FFFFFH",
		"1E0000H-1FFFFFH",
		"1C0000H-1FFFFFH",
		"180000H-1FFFFFH",
		"100000H-1FFFFFH",
428
		"all", "all"
429
	};
430
	spi_prettyprint_status_register_sst25(status);
431
	printf_debug("Resulting block protection : %s\n",
432
		     bpt[(status & 0x1c) >> 2]);
433 434
}

435 436 437 438 439 440 441 442 443
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"
	};
444
	spi_prettyprint_status_register_sst25(status);
445
	printf_debug("Resulting block protection : %s\n",
446
		bpt[(status & 0x1c) >> 2]);
447 448
}

449
void spi_prettyprint_status_register(struct flashchip *flash)
450 451 452
{
	uint8_t status;

453
	status = spi_read_status_register();
454 455 456
	printf_debug("Chip status register is %02x\n", status);
	switch (flash->manufacture_id) {
	case ST_ID:
457 458 459 460
		if (((flash->model_id & 0xff00) == 0x2000) ||
		    ((flash->model_id & 0xff00) == 0x2500))
			spi_prettyprint_status_register_st_m25p(status);
		break;
461 462
	case MX_ID:
		if ((flash->model_id & 0xff00) == 0x2000)
463 464 465
			spi_prettyprint_status_register_st_m25p(status);
		break;
	case SST_ID:
466 467
		switch (flash->model_id) {
		case 0x2541:
468
			spi_prettyprint_status_register_sst25vf016(status);
469 470 471 472 473
			break;
		case 0x8d:
		case 0x258d:
			spi_prettyprint_status_register_sst25vf040b(status);
			break;
474
		default:
475 476
			spi_prettyprint_status_register_sst25(status);
			break;
477
		}
478 479 480
		break;
	}
}
481

482 483
int spi_chip_erase_60(struct flashchip *flash)
{
484
	int result;
485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501
	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,
	}};
502
	
503 504
	result = spi_disable_blockprotect();
	if (result) {
505
		fprintf(stderr, "spi_disable_blockprotect failed\n");
506 507
		return result;
	}
508 509
	
	result = spi_send_multicommand(spicommands);
510
	if (result) {
511 512
		fprintf(stderr, "%s failed during command execution\n",
			__func__);
513 514
		return result;
	}
515 516 517
	/* Wait until the Write-In-Progress bit is cleared.
	 * This usually takes 1-85 s, so wait in 1 s steps.
	 */
518
	/* FIXME: We assume spi_read_status_register will never fail. */
519
	while (spi_read_status_register() & JEDEC_RDSR_BIT_WIP)
520
		programmer_delay(1000 * 1000);
521 522 523 524
	if (check_erased_range(flash, 0, flash->total_size * 1024)) {
		fprintf(stderr, "ERASE FAILED!\n");
		return -1;
	}
525 526 527
	return 0;
}

528
int spi_chip_erase_c7(struct flashchip *flash)
529
{
530
	int result;
531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547
	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,
	}};
548

549 550
	result = spi_disable_blockprotect();
	if (result) {
551
		fprintf(stderr, "spi_disable_blockprotect failed\n");
552 553
		return result;
	}
554 555

	result = spi_send_multicommand(spicommands);
556
	if (result) {
557
		fprintf(stderr, "%s failed during command execution\n", __func__);
558 559
		return result;
	}
560 561 562
	/* Wait until the Write-In-Progress bit is cleared.
	 * This usually takes 1-85 s, so wait in 1 s steps.
	 */
563
	/* FIXME: We assume spi_read_status_register will never fail. */
564
	while (spi_read_status_register() & JEDEC_RDSR_BIT_WIP)
565
		programmer_delay(1000 * 1000);
566 567 568 569
	if (check_erased_range(flash, 0, flash->total_size * 1024)) {
		fprintf(stderr, "ERASE FAILED!\n");
		return -1;
	}
570 571 572
	return 0;
}

573 574 575 576 577 578 579 580 581 582 583
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;
}

584
int spi_block_erase_52(struct flashchip *flash, unsigned int addr, unsigned int blocklen)
585
{
586
	int result;
587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603
	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,
	}};
604

605 606
	result = spi_send_multicommand(spicommands);
	if (result) {
607 608
		fprintf(stderr, "%s failed during command execution\n",
			__func__);
609
		return result;
610
	}
611 612 613 614
	/* 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)
615
		programmer_delay(100 * 1000);
616 617 618 619
	if (check_erased_range(flash, addr, blocklen)) {
		fprintf(stderr, "ERASE FAILED!\n");
		return -1;
	}
620 621 622
	return 0;
}

623 624 625 626 627
/* Block size is usually
 * 64k for Macronix
 * 32k for SST
 * 4-32k non-uniform for EON
 */
628
int spi_block_erase_d8(struct flashchip *flash, unsigned int addr, unsigned int blocklen)
629
{
630
	int result;
631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647
	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,
	}};
648

649 650
	result = spi_send_multicommand(spicommands);
	if (result) {
651
		fprintf(stderr, "%s failed during command execution\n", __func__);
652
		return result;
653
	}
654 655 656
	/* Wait until the Write-In-Progress bit is cleared.
	 * This usually takes 100-4000 ms, so wait in 100 ms steps.
	 */
657
	while (spi_read_status_register() & JEDEC_RDSR_BIT_WIP)
658
		programmer_delay(100 * 1000);
659 660 661 662
	if (check_erased_range(flash, addr, blocklen)) {
		fprintf(stderr, "ERASE FAILED!\n");
		return -1;
	}
663 664 665
	return 0;
}

666 667 668 669 670 671 672 673 674 675 676
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++) {
677
		rc = spi_block_erase_d8(flash, i * erase_size, erase_size);
678
		if (rc) {
679
			fprintf(stderr, "Error erasing block at 0x%x\n", i);
680 681 682 683 684 685 686 687 688
			break;
		}
	}

	printf("\n");

	return rc;
}

689
/* Sector size is usually 4k, though Macronix eliteflash has 64k */
690
int spi_block_erase_20(struct flashchip *flash, unsigned int addr, unsigned int blocklen)
691
{
692
	int result;
693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709
	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,
	}};
710

711 712
	result = spi_send_multicommand(spicommands);
	if (result) {
713 714
		fprintf(stderr, "%s failed during command execution\n",
			__func__);
715
		return result;
716
	}
717 718 719
	/* Wait until the Write-In-Progress bit is cleared.
	 * This usually takes 15-800 ms, so wait in 10 ms steps.
	 */
720
	while (spi_read_status_register() & JEDEC_RDSR_BIT_WIP)
721
		programmer_delay(10 * 1000);
722 723 724 725
	if (check_erased_range(flash, addr, blocklen)) {
		fprintf(stderr, "ERASE FAILED!\n");
		return -1;
	}
726 727 728
	return 0;
}

729 730 731
int spi_block_erase_60(struct flashchip *flash, unsigned int addr, unsigned int blocklen)
{
	if ((addr != 0) || (blocklen != flash->total_size * 1024)) {
732 733
		fprintf(stderr, "%s called with incorrect arguments\n",
			__func__);
734 735 736 737 738 739 740 741
		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)) {
742 743
		fprintf(stderr, "%s called with incorrect arguments\n",
			__func__);
744 745 746 747 748
		return -1;
	}
	return spi_chip_erase_c7(flash);
}

749
int spi_write_status_enable(void)
750 751
{
	const unsigned char cmd[JEDEC_EWSR_OUTSIZE] = { JEDEC_EWSR };
752
	int result;
753 754

	/* Send EWSR (Enable Write Status Register). */
755
	result = spi_send_command(sizeof(cmd), JEDEC_EWSR_INSIZE, cmd, NULL);
756 757

	if (result)
758
		fprintf(stderr, "%s failed\n", __func__);
759 760

	return result;
761 762
}

763 764 765 766
/*
 * This is according the SST25VF016 datasheet, who knows it is more
 * generic that this...
 */
767
int spi_write_status_register(int status)
768
{
769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786
	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,
	}};
787

788 789
	result = spi_send_multicommand(spicommands);
	if (result) {
790 791
		fprintf(stderr, "%s failed during command execution\n",
			__func__);
792 793
	}
	return result;
794 795
}

796
int spi_byte_program(int addr, uint8_t byte)
797
{
798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815
	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,
	}};
816

817 818
	result = spi_send_multicommand(spicommands);
	if (result) {
819 820
		fprintf(stderr, "%s failed during command execution\n",
			__func__);
821 822
	}
	return result;
823 824
}

825 826
int spi_nbyte_program(int address, uint8_t *bytes, int len)
{
827 828
	int result;
	/* FIXME: Switch to malloc based on len unless that kills speed. */
829 830 831 832 833 834
	unsigned char cmd[JEDEC_BYTE_PROGRAM_OUTSIZE - 1 + 256] = {
		JEDEC_BYTE_PROGRAM,
		(address >> 16) & 0xff,
		(address >> 8) & 0xff,
		(address >> 0) & 0xff,
	};
835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851
	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,
	}};
852

853
	if (!len) {
854
		fprintf(stderr, "%s called for zero-length write\n", __func__);
855 856
		return 1;
	}
857
	if (len > 256) {
858
		fprintf(stderr, "%s called for too long a write\n", __func__);
859 860 861 862 863
		return 1;
	}

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

864 865
	result = spi_send_multicommand(spicommands);
	if (result) {
866 867
		fprintf(stderr, "%s failed during command execution\n",
			__func__);
868 869
	}
	return result;
870 871
}

872
int spi_disable_blockprotect(void)
873 874
{
	uint8_t status;
875
	int result;
876

877
	status = spi_read_status_register();
878 879 880
	/* If there is block protection in effect, unprotect it first. */
	if ((status & 0x3c) != 0) {
		printf_debug("Some block protection in effect, disabling\n");
881 882
		result = spi_write_status_register(status & ~0x3c);
		if (result) {
883
			fprintf(stderr, "spi_write_status_register failed\n");
884 885
			return result;
		}
886
	}
887
	return 0;
888 889
}

890
int spi_nbyte_read(int address, uint8_t *bytes, int len)
891
{
892 893
	const unsigned char cmd[JEDEC_READ_OUTSIZE] = {
		JEDEC_READ,
894 895 896
		(address >> 16) & 0xff,
		(address >> 8) & 0xff,
		(address >> 0) & 0xff,
897 898 899
	};

	/* Send Read */
900
	return spi_send_command(sizeof(cmd), len, cmd, bytes);
901 902
}

903 904 905 906
/*
 * Read a complete flash chip.
 * Each page is read separately in chunks with a maximum size of chunksize.
 */
907
int spi_read_chunked(struct flashchip *flash, uint8_t *buf, int start, int len, int chunksize)
908 909
{
	int rc = 0;
910
	int i, j, starthere, lenhere;
911 912 913
	int page_size = flash->page_size;
	int toread;

914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931
	/* 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);
932 933 934 935 936 937 938 939 940 941
			if (rc)
				break;
		}
		if (rc)
			break;
	}

	return rc;
}

942
int spi_chip_read(struct flashchip *flash, uint8_t *buf, int start, int len)
943
{
944 945 946 947
	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;
948 949
	}

950
	return spi_programmer[spi_controller].read(flash, buf, start, len);
951 952
}

953 954 955 956 957 958 959 960 961 962 963 964 965 966 967
/*
 * 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();
	for (i = 0; i < total_size; i++) {
		spi_byte_program(i, buf[i]);
		while (spi_read_status_register() & JEDEC_RDSR_BIT_WIP)
968
			programmer_delay(10);
969 970 971 972 973 974 975 976 977
	}

	return 0;
}

/*
 * Program chip using page (256 bytes) programming.
 * Some SPI masters can't do this, they use single byte programming instead.
 */
978
int spi_chip_write_256(struct flashchip *flash, uint8_t *buf)
979
{
980 981 982 983
	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;
984 985
	}

986
	return spi_programmer[spi_controller].write_256(flash, buf);
987
}
988

989 990 991 992 993 994
uint32_t spi_get_valid_read_addr(void)
{
	/* Need to return BBAR for ICH chipsets. */
	return 0;
}

995 996
int spi_aai_write(struct flashchip *flash, uint8_t *buf)
{
997 998
	uint32_t pos = 2, size = flash->total_size * 1024;
	unsigned char w[6] = {0xad, 0, 0, 0, buf[0], buf[1]};
999 1000
	int result;

1001 1002
	switch (spi_controller) {
	case SPI_CONTROLLER_WBSIO:
1003 1004
		fprintf(stderr, "%s: impossible with Winbond SPI masters,"
				" degrading to byte program\n", __func__);
1005
		return spi_chip_write_1(flash, buf);
1006 1007
	default:
		break;
1008
	}
1009 1010 1011 1012
	if (flash->erase(flash)) {
		fprintf(stderr, "ERASE FAILED!\n");
		return -1;
	}
1013 1014 1015
	result = spi_write_enable();
	if (result)
		return result;
1016
	spi_send_command(6, 0, w, NULL);
1017
	while (spi_read_status_register() & JEDEC_RDSR_BIT_WIP)
1018
		programmer_delay(5); /* SST25VF040B Tbp is max 10us */
1019 1020 1021
	while (pos < size) {
		w[1] = buf[pos++];
		w[2] = buf[pos++];
1022
		spi_send_command(3, 0, w, NULL);
1023
		while (spi_read_status_register() & JEDEC_RDSR_BIT_WIP)
1024
			programmer_delay(5); /* SST25VF040B Tbp is max 10us */
1025 1026 1027 1028
	}
	spi_write_disable();
	return 0;
}