[coreboot] [patch]:SB600 flashrom using virtual memory

Bao, Zheng Zheng.Bao at amd.com
Mon Dec 29 09:34:23 CET 2008


The accessing is changed to reading and writing byte to virtual memory.
Reading chip can be improved. Writing doesn't seem to get noticeable
improvement.

The patch contains my previous patch which fixes hang and is not
acked-by yet.

Zheng


diff -Nuar -x .svn -x flashrom -x '*.o' -x .dependencies
flashrom-org/chipset_enable.c
coreboot-v2-svn/util/flashrom/chipset_enable.c
--- flashrom-org/chipset_enable.c	2008-12-22 14:12:08.000000000
+0800
+++ coreboot-v2-svn/util/flashrom/chipset_enable.c	2008-12-23
09:46:53.000000000 +0800
@@ -681,8 +681,16 @@
 	flashbus = BUS_TYPE_SB600_SPI;
 
 	/* Enable SPI ROM in SB600 PM register. */
+	/* If we enable SPI ROM here, we have to disable it after we
leave. 
+	 * But how can we know which ROM we are going to handle? So we
have
+	 * to trade off. We only access LPC ROM if we boot via LPC ROM.
And
+	 * only SPI ROM if we boot via SPI ROM. If you want to do it
crossly,
+	 * you have to use the code below.
+	 */
+	/*
 	OUTB(0x8f, 0xcd6);
 	OUTB(0x0e, 0xcd7);
+	*/
 
 	return 0;
 }
diff -Nuar -x .svn -x flashrom -x '*.o' -x .dependencies
flashrom-org/sb600spi.c coreboot-v2-svn/util/flashrom/sb600spi.c
--- flashrom-org/sb600spi.c	2008-11-29 15:07:14.000000000 +0800
+++ coreboot-v2-svn/util/flashrom/sb600spi.c	2008-12-29
16:17:09.000000000 +0800
@@ -44,13 +44,11 @@
 
 int sb600_spi_read(struct flashchip *flash, uint8_t *buf)
 {
-	int rc = 0, i;
+	int rc = 0;
 	int total_size = flash->total_size * 1024;
-	int page_size = 8;
 
-	for (i = 0; i < total_size / page_size; i++)
-		spi_nbyte_read(i * page_size, (void *)(buf + i *
page_size),
-			       page_size);
+	memcpy(buf, (const char *)flash->virtual_memory, total_size);
+
 	return rc;
 }
 
@@ -68,17 +66,20 @@
 {
 	int rc = 0, i;
 	int total_size = flash->total_size * 1024;
+	uint8_t *bios;
 
 	/* Erase first */
 	printf("Erasing flash before programming... ");
 	flash->erase(flash);
 	printf("done.\n");
 
+	spi_disable_blockprotect();
 	printf("Programming flash");
-	for (i = 0; i < total_size; i++, buf++) {
-		spi_disable_blockprotect();
+	for (i = 0, bios = (uint8_t *)flash->virtual_memory;
+		i < total_size;
+		i++, buf++, bios++) {
 		spi_write_enable();
-		spi_byte_program(i, *buf);
+		*bios =  *buf;
 		/* wait program complete. */
 		if (i % 0x8000 == 0)
 			printf(".");
@@ -97,12 +98,18 @@
 		printf("reset\n");
 }
 
-void execute_command(void)
+int execute_command(void)
 {
+	int timeout = 1000;
+
 	sb600_spibar[2] |= 1;
 
-	while (sb600_spibar[2] & 1)
-		;
+	while ((sb600_spibar[2] & 1) && timeout)
+	{
+		myusec_delay(1);
+		timeout --;
+	}
+	return timeout ? 1 : 0;
 }
 
 int sb600_spi_command(unsigned int writecnt, unsigned int readcnt,
@@ -150,7 +157,8 @@
 	 */
 	reset_internal_fifo_pointer();
 
-	execute_command();
+	if (!execute_command())
+		return 1;
 
 	/*
 	 * After the command executed, we should find out the index of
the
-------------- next part --------------
A non-text attachment was scrubbed...
Name: flashrom_sb600_fix_hang_use_vm.patch
Type: application/octet-stream
Size: 2626 bytes
Desc: flashrom_sb600_fix_hang_use_vm.patch
URL: <http://www.coreboot.org/pipermail/coreboot/attachments/20081229/e6cebe07/attachment.obj>


More information about the coreboot mailing list