Hi,
in src/flash/nor/cfi.c the mathematics around computing "bufferwsize"
variable is quite obscure.
Current code is the result of one year old patch to introduce
multi-chip flash support.

In the attached patch I try to simplify the code and comment what the
variable is and how it is computed.
Please review it.

Best Regards,
Antonio Borneo
From a0a8eccae54591524a7577fae6ecaef92df8ed13 Mon Sep 17 00:00:00 2001
From: Antonio Borneo <borneo.anto...@gmail.com>
Date: Thu, 25 Mar 2010 00:29:10 +0800
Subject: [PATCH] CFI: simplify bufferwsize computation

Review and simplify computation of bufferwsize.
Added comments about variables.

Signed-off-by: Antonio Borneo <borneo.anto...@gmail.com>
---
 src/flash/nor/cfi.c |   49 ++++++++++---------------------------------------
 1 files changed, 10 insertions(+), 39 deletions(-)

diff --git a/src/flash/nor/cfi.c b/src/flash/nor/cfi.c
index 5f7ed1e..e53be0c 100644
--- a/src/flash/nor/cfi.c
+++ b/src/flash/nor/cfi.c
@@ -1562,9 +1562,11 @@ static int cfi_intel_write_words(struct flash_bank *bank, uint8_t *word, uint32_
 	struct target *target = bank->target;
 
 	/* Calculate buffer size and boundary mask */
+	/* buffersize is (buffer size per chip) * (number of chips) */
+	/* bufferwsize is buffersize in words */
 	uint32_t buffersize = (1UL << cfi_info->max_buf_write_size) * (bank->bus_width / bank->chip_width);
 	uint32_t buffermask = buffersize-1;
-	uint32_t bufferwsize;
+	uint32_t bufferwsize = buffersize / bank->bus_width;
 
 	/* Check for valid range */
 	if (address & buffermask)
@@ -1573,18 +1575,6 @@ static int cfi_intel_write_words(struct flash_bank *bank, uint8_t *word, uint32_
 			  bank->base, address, cfi_info->max_buf_write_size);
 		return ERROR_FLASH_OPERATION_FAILED;
 	}
-	switch (bank->chip_width)
-	{
-	case 4 : bufferwsize = buffersize / 4; break;
-	case 2 : bufferwsize = buffersize / 2; break;
-	case 1 : bufferwsize = buffersize; break;
-	default:
-		LOG_ERROR("Unsupported chip width %d", bank->chip_width);
-		return ERROR_FLASH_OPERATION_FAILED;
-	}
-
-	bufferwsize/=(bank->bus_width / bank->chip_width);
-
 
 	/* Check for valid size */
 	if (wordcount > bufferwsize)
@@ -1691,9 +1681,11 @@ static int cfi_spansion_write_words(struct flash_bank *bank, uint8_t *word, uint
 	struct cfi_spansion_pri_ext *pri_ext = cfi_info->pri_ext;
 
 	/* Calculate buffer size and boundary mask */
+	/* buffersize is (buffer size per chip) * (number of chips) */
+	/* bufferwsize is buffersize in words */
 	uint32_t buffersize = (1UL << cfi_info->max_buf_write_size) * (bank->bus_width / bank->chip_width);
 	uint32_t buffermask = buffersize-1;
-	uint32_t bufferwsize;
+	uint32_t bufferwsize = buffersize / bank->bus_width;
 
 	/* Check for valid range */
 	if (address & buffermask)
@@ -1701,17 +1693,6 @@ static int cfi_spansion_write_words(struct flash_bank *bank, uint8_t *word, uint
 		LOG_ERROR("Write address at base 0x%" PRIx32 ", address %" PRIx32 " not aligned to 2^%d boundary", bank->base, address, cfi_info->max_buf_write_size);
 		return ERROR_FLASH_OPERATION_FAILED;
 	}
-	switch (bank->chip_width)
-	{
-	case 4 : bufferwsize = buffersize / 4; break;
-	case 2 : bufferwsize = buffersize / 2; break;
-	case 1 : bufferwsize = buffersize; break;
-	default:
-		LOG_ERROR("Unsupported chip width %d", bank->chip_width);
-		return ERROR_FLASH_OPERATION_FAILED;
-	}
-
-	bufferwsize/=(bank->bus_width / bank->chip_width);
 
 	/* Check for valid size */
 	if (wordcount > bufferwsize)
@@ -1908,22 +1889,12 @@ int cfi_write(struct flash_bank *bank, uint8_t *buffer, uint32_t offset, uint32_
 	{
 		if (retval == ERROR_TARGET_RESOURCE_NOT_AVAILABLE)
 		{
-			//adjust buffersize for chip width
+			/* Calculate buffer size and boundary mask */
+			/* buffersize is (buffer size per chip) * (number of chips) */
+			/* bufferwsize is buffersize in words */
 			uint32_t buffersize = (1UL << cfi_info->max_buf_write_size) * (bank->bus_width / bank->chip_width);
 			uint32_t buffermask = buffersize-1;
-			uint32_t bufferwsize;
-
-			switch (bank->chip_width)
-			{
-			case 4 : bufferwsize = buffersize / 4; break;
-			case 2 : bufferwsize = buffersize / 2; break;
-			case 1 : bufferwsize = buffersize; break;
-			default:
-				LOG_ERROR("Unsupported chip width %d", bank->chip_width);
-				return ERROR_FLASH_OPERATION_FAILED;
-			}
-
-			bufferwsize/=(bank->bus_width / bank->chip_width);
+			uint32_t bufferwsize = buffersize / bank->bus_width;
 
 			/* fall back to memory writes */
 			while (count >= (uint32_t)bank->bus_width)
-- 
1.5.2.2

_______________________________________________
Openocd-development mailing list
Openocd-development@lists.berlios.de
https://lists.berlios.de/mailman/listinfo/openocd-development

Reply via email to