Skip to contentSkip to conversation

OneNAND: Invalidate bufferRAM after erase

PATCH In review Adrian Hunter 3 participants 4 messages Feb 8, 2007 – Feb 9, 2007 Memory technology devices (MTD)

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 OneNAND: Invalidate bufferRAM after erase

Quoted 1 line

From df9f430fa8198c7d60acdcf0c237a34916b5ac5b Mon Sep 17 00:00:00 2001

From: Adrian Hunter <[email protected]>
Date: Wed, 7 Feb 2007 13:55:19 +0200
Subject: [MTD] OneNAND: Invalidate bufferRAM after erase

OneNAND has internal bufferRAMs. The driver keeps track of what is in the bufferRAM to save having to load from the NAND core. After an erase operation, the driver must mark bufferRAM invalid if it refers to the erased block.

---
drivers/mtd/onenand/onenand_base.c | 25 +++++++++++++++++++++++++

1 files changed, 25 insertions(+), 0 deletions(-)
drivers/mtd/onenand/onenand_base.c +0 -0
index f690c19..cf66c93 100644
@@ -628,6 +628,29 @@ static void onenand_update_bufferram(str

}

/**
+ * onenand_invalidate_bufferram_range - [GENERIC] Invalidate BufferRAM information
+ * @param mtd MTD data structure
+ * @param addr start address to invalidate
+ * @param len length to invalidate
+ *
+ * Invalidate BufferRAM information
+ */
+static void onenand_invalidate_bufferram_range(struct mtd_info *mtd, loff_t addr,
+ unsigned int len)
+{
+ struct onenand_chip *this = mtd->priv;
+ int i;
+ loff_t end_addr = addr + len;
+
+ /* Invalidate BufferRAM */
+ for (i = 0; i < MAX_BUFFERRAM; i++) {
+ loff_t buf_addr = this->bufferram[i].blockpage << this->page_shift;
+ if (buf_addr >= addr && buf_addr < end_addr)
+ this->bufferram[i].blockpage = -1;
+ }
+}
+
+/**
* onenand_get_device - [GENERIC] Get chip for selected access
* @param mtd MTD device structure
* @param new_state the state which is requested
@@ -1466,6 +1489,8 @@ static int onenand_erase(struct mtd_info

			goto erase_exit;
		}

+ onenand_invalidate_bufferram_range(mtd, addr, block_size);
+

		this->command(mtd, ONENAND_CMD_ERASE, addr, block_size);

		ret = this->wait(mtd, FL_ERASING);
Signature · 1 line
1.4.3
#1 lore raw

Hi Adrian,

I checked it with pagetest module. Without the patch it failed. I have two minor comments.

Thank you,
Kyungmin Park

Review

Quoted 12 lines

/**
+ * onenand_invalidate_bufferram_range - [GENERIC] Invalidate BufferRAM information
+ * @param mtd MTD data structure
+ * @param addr start address to invalidate
+ * @param len length to invalidate
+ *
+ * Invalidate BufferRAM information
+ */
+static void onenand_invalidate_bufferram_range(struct mtd_info *mtd, loff_t addr,

(quoted diff) +1 -0
+		unsigned int len)

It's name too long even though it invalidate with some range. How about just call "onenand_invalidate_bufferram"?

Review static int onenand_erase(struct mtd_info · line 1495

Quoted 12 lines
(quoted diff) +3 -0
+/**
  * onenand_get_device - [GENERIC] Get chip for selected access
  * @param mtd		MTD device structure
  * @param new_state	the state which is requested
@@ -1466,6 +1489,8 @@ static int onenand_erase(struct mtd_info
 			goto erase_exit;
 		}
 
+		onenand_invalidate_bufferram_range(mtd, addr, 
 block_size);
+
 		this->command(mtd, ONENAND_CMD_ERASE, addr, block_size);

Place onenand_invalidate_bufferram_range here
Since erase command takes a long time, 2msec so we overlap the some cpu works and onenand physicall works between command and wait.

Quoted 2 lines
(quoted diff) +0 -0
 		ret = this->wait(mtd, FL_ERASING);
#2 lore raw
Quoted 1 line

From df9f430fa8198c7d60acdcf0c237a34916b5ac5b Mon Sep 17 00:00:00 2001

From: Adrian Hunter <[email protected]>
Date: Wed, 7 Feb 2007 13:55:19 +0200
Subject: [MTD] OneNAND: Invalidate bufferRAM after erase

OneNAND has internal bufferRAMs. The driver keeps track of what is in the bufferRAM to save having to load from the NAND core. After an erase operation, the driver must mark bufferRAM invalid if it refers to the erased block.

---
 drivers/mtd/onenand/onenand_base.c |   25 +++++++++++++++++++++++++
 1 files changed, 25 insertions(+), 0 deletions(-)
drivers/mtd/onenand/onenand_base.c +25 -0
index f690c19..cf66c93 100644
@@ -628,6 +628,29 @@ static void onenand_update_bufferram(str
 }
 
 /**
+ * onenand_invalidate_bufferram - [GENERIC] Invalidate BufferRAM information
+ * @param mtd		MTD data structure
+ * @param addr		start address to invalidate
+ * @param len		length to invalidate
+ *
+ * Invalidate BufferRAM information
+ */
+static void onenand_invalidate_bufferram(struct mtd_info *mtd, loff_t addr,
+		unsigned int len)
+{
+	struct onenand_chip *this = mtd->priv;
+	int i;
+	loff_t end_addr = addr + len;
+
+	/* Invalidate BufferRAM */
+	for (i = 0; i < MAX_BUFFERRAM; i++) {
+		loff_t buf_addr = this->bufferram[i].blockpage << this->page_shift;
+		if (buf_addr >= addr && buf_addr < end_addr)
+			this->bufferram[i].blockpage = -1;
+	}
+}
+
+/**
  * onenand_get_device - [GENERIC] Get chip for selected access
  * @param mtd		MTD device structure
  * @param new_state	the state which is requested
@@ -1466,6 +1489,8 @@ static int onenand_erase(struct mtd_info
 
 		this->command(mtd, ONENAND_CMD_ERASE, addr, block_size);
 
+		onenand_invalidate_bufferram(mtd, addr, block_size);
+
 		ret = this->wait(mtd, FL_ERASING);
 		/* Check, if it is write protected */
 		if (ret) {
Signature · 1 line
1.4.3
#3 lore raw
Quoted 6 lines · Adrian Hunter

OneNAND has internal bufferRAMs. The driver keeps track of what is in the bufferRAM to save having to load from the NAND core. After an erase operation, the driver must mark bufferRAM invalid if it refers to the erased block.

I've pulled from the onenand git tree and applied this extra patch.

Signature · 1 line
dwmw2