Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit abf3c0f2 authored by Kyungmin Park's avatar Kyungmin Park
Browse files

[MTD] OneNAND: Reduce internal BufferRAM operations



It use blockpage instead of a pair (block, page). It can also cover a small chunk access. 0x00, 0x20, 0x40 and so on.

And in JFFS2 behavior, sometimes it reads two pages alternatively.
e.g., It first reads A page, B page and A page.
So we check another bufferram to find requested page.

Signed-off-by: default avatarKyungmin Park <kyungmin.park@samsung.com>
parent 4f4fad27
Loading
Loading
Loading
Loading
+23 −24
Original line number Diff line number Diff line
@@ -577,19 +577,22 @@ static int onenand_write_bufferram(struct mtd_info *mtd, int area,
static int onenand_check_bufferram(struct mtd_info *mtd, loff_t addr)
{
	struct onenand_chip *this = mtd->priv;
	int block, page;
	int i;
	int blockpage;
	unsigned int i;

	block = (int) (addr >> this->erase_shift);
	page = (int) (addr >> this->page_shift) & this->page_mask;
	blockpage = (int) (addr >> this->page_shift);

	/* Is there valid data? */
	i = ONENAND_CURRENT_BUFFERRAM(this);
	if (this->bufferram[i].blockpage == blockpage)
		return 1;

	/* Is there valid data? */
	if (this->bufferram[i].block == block &&
	    this->bufferram[i].page == page &&
	    this->bufferram[i].valid)
	/* Check another BufferRAM */
	i = ONENAND_NEXT_BUFFERRAM(this);
	if (this->bufferram[i].blockpage == blockpage) {
		ONENAND_SET_NEXT_BUFFERRAM(this);
		return 1;
	}

	return 0;
}
@@ -602,30 +605,26 @@ static int onenand_check_bufferram(struct mtd_info *mtd, loff_t addr)
 *
 * Update BufferRAM information
 */
static int onenand_update_bufferram(struct mtd_info *mtd, loff_t addr,
static void onenand_update_bufferram(struct mtd_info *mtd, loff_t addr,
		int valid)
{
	struct onenand_chip *this = mtd->priv;
	int block, page;
	int i;
	int blockpage;
	unsigned int i;

	block = (int) (addr >> this->erase_shift);
	page = (int) (addr >> this->page_shift) & this->page_mask;
	blockpage = (int) (addr >> this->page_shift);

	/* Invalidate BufferRAM */
	for (i = 0; i < MAX_BUFFERRAM; i++) {
		if (this->bufferram[i].block == block &&
		    this->bufferram[i].page == page)
			this->bufferram[i].valid = 0;
	}
	/* Invalidate another BufferRAM */
	i = ONENAND_NEXT_BUFFERRAM(this);
	if (this->bufferram[i].blockpage == blockpage) {
		this->bufferram[i].blockpage = -1;

	/* Update BufferRAM */
	i = ONENAND_CURRENT_BUFFERRAM(this);
	this->bufferram[i].block = block;
	this->bufferram[i].page = page;
	this->bufferram[i].valid = valid;

	return 0;
	if (valid)
		this->bufferram[i].blockpage = blockpage;
	else
		this->bufferram[i].blockpage = -1;
}

/**
+2 −6
Original line number Diff line number Diff line
@@ -42,14 +42,10 @@ typedef enum {

/**
 * struct onenand_bufferram - OneNAND BufferRAM Data
 * @block:		block address in BufferRAM
 * @page:		page address in BufferRAM
 * @valid:		valid flag
 * @blockpage:		block & page address in BufferRAM
 */
struct onenand_bufferram {
	int block;
	int page;
	int valid;
	int	blockpage;
};

/**