/*
 * This file is part of the flashrom project.
 *
 * Copyright (C) 2009 Peter Stuge <peter@stuge.se>
 *
 * 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; either version 2 of the License, or
 * (at your option) any later version.
 *
 * 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
 */

#include "flash.h"

int erase_m29f002(struct flashchip *flash)
{
	volatile uint8_t *bios = flash->virtual_memory;
	chip_writeb(0xaa, bios + 0x555);
	chip_writeb(0x55, bios + 0xaaa);
	chip_writeb(0x80, bios + 0x555);
	chip_writeb(0xaa, bios + 0x555);
	chip_writeb(0x55, bios + 0xaaa);
	chip_writeb(0x10, bios + 0x555);
	myusec_delay(10);
	toggle_ready_jedec(bios);
	return 0;
}

static void rewrite_block(volatile uint8_t *bios, uint8_t *src,
			  volatile uint8_t *dst, int size)
{
	/* erase */
	chip_writeb(0xaa, bios + 0x555);
	chip_writeb(0x55, bios + 0xaaa);
	chip_writeb(0x80, bios + 0x555);
	chip_writeb(0xaa, bios + 0x555);
	chip_writeb(0x55, bios + 0xaaa);
	chip_writeb(0x30, dst);
	myusec_delay(10);
	toggle_ready_jedec(bios);

	/* program */
	while (size--) {
		chip_writeb(0xaa, bios + 0x555);
		chip_writeb(0x55, bios + 0xaaa);
		chip_writeb(0xa0, bios + 0x555);
		chip_writeb(*src, dst);
		toggle_ready_jedec(dst);
		dst++;
		src++;
	}
}

static void do_block(volatile uint8_t *bios, uint8_t *src, int i,
		     unsigned long start, int size)
{
	printf("%d at address: 0x%08lx", i, start);
	rewrite_block(bios, src + start, bios + start, size);
	printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");
}

int write_m29f002t(struct flashchip *flash, uint8_t *buf)
{
	int i, page_size = flash->page_size;
	volatile uint8_t *bios = flash->virtual_memory;

	/* M29F002(N)T has 7 blocks. From bottom to top their sizes are:
	 * 64k 64k 64k 32k 8k 8k 16k
	 * flash->page_size is set to 64k in flashchips.c
	 */

	printf("Programming block: ");
	for (i = 0; i < 3; i++)
		do_block(bios, buf, i, i * page_size, page_size);
	do_block(bios, buf, i++, 0x30000, 32 * 1024);
	do_block(bios, buf, i++, 0x38000, 8 * 1024);
	do_block(bios, buf, i++, 0x3a000, 8 * 1024);
	do_block(bios, buf, i, 0x3c000, 16 * 1024);

	printf("\n");
	return 0;
}

int write_m29f002b(struct flashchip *flash, uint8_t *buf)
{
	int i = 0, page_size = flash->page_size;
	volatile uint8_t *bios = flash->virtual_memory;

	/* M29F002B has 7 blocks. From bottom to top their sizes are:
	 * 16k 8k 8k 32k 64k 64k 64k
	 * flash->page_size is set to 64k in flashchips.c
	 */

	printf("Programming block: ");
	do_block(bios, buf, i++, 0x00000, 16 * 1024);
	do_block(bios, buf, i++, 0x04000, 8 * 1024);
	do_block(bios, buf, i++, 0x06000, 8 * 1024);
	do_block(bios, buf, i++, 0x08000, 32 * 1024);
	for (; i < 7; i++)
		do_block(bios, buf, i, (i - 3) * page_size, page_size);

	printf("\n");
	return 0;
}
