Patchwork Remove sharplhf00l04.c

login
register
about
Submitter Michael Karcher
Date 2011-06-19 23:13:12
Message ID <1308525192-8877-1-git-send-email-flashrom@mkarcher.dialup.fu-berlin.de>
Download mbox | patch
Permalink /patch/3177/
State Accepted
Commit r1538
Headers show

Comments

Michael Karcher - 2011-06-19 23:13:12
The currently unreferenced function in sharplhf00l04.c does a standard
FWH block protection reset (writes 0 to the protection register) and a
standard FWH block erase.

The locking blocks of the FWH block lock cover 128KB areas, and thats
the only thing page_size is used for in the functions referenced in the
LHF00L04 entry.

Finally, this adds a comment that there are non-volatile (flash memory)
lock bits for 8 sectors in the last 64KB. They are write-only and clearable
at once. Readback seems unsupported.

Signed-off-by: Michael Karcher <flashrom@mkarcher.dialup.fu-berlin.de>
---
 Makefile        |    2 +-
 flashchips.c    |    5 ++-
 sharplhf00l04.c |   58 -------------------------------------------------------
 3 files changed, 4 insertions(+), 61 deletions(-)
 delete mode 100644 sharplhf00l04.c
Carl-Daniel Hailfinger - 2011-06-19 23:59:30
Am 20.06.2011 01:13 schrieb Michael Karcher:
> The currently unreferenced function in sharplhf00l04.c does a standard
> FWH block protection reset (writes 0 to the protection register) and a
> standard FWH block erase.
>
> The locking blocks of the FWH block lock cover 128KB areas, and thats
> the only thing page_size is used for in the functions referenced in the
> LHF00L04 entry.
>   

My datasheet talks about 8 kB sectors and 64 kB blocks in "Figure 3.
Memory Map", but "Table 8. FWH Flash Registers Configuration Map" only
mentions registers for the 8 kB sectors in the top 64 kB block
explicitly. "Table 8" also mentions "XX002H Whole Block Lock Register"
as generic placeholder, and AFAICS those two X mean you have one block
lock register for each of the 15 bottom 64 kB blocks and one for each of
the 8 top 8 kB sectors. That also means the 82802ab unlocking as is
can't be used.

I was unable to find any 128 kB reference in my datasheet, so I'm going
to Nack that part.


> Finally, this adds a comment that there are non-volatile (flash memory)
> lock bits for 8 sectors in the last 64KB. They are write-only and clearable
> at once. Readback seems unsupported.
>   

I have a slightly different interpretation of the datasheet (see above),
so I'm not sure how to proceed.


> Signed-off-by: Michael Karcher <flashrom@mkarcher.dialup.fu-berlin.de>
>   

Killing sharplhf00l04.c is a good thing, though, so that part is
Acked-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net>

Regards,
Carl-Daniel
Michael Karcher - 2011-06-20 05:42:42
Am Montag, den 20.06.2011, 01:59 +0200 schrieb Carl-Daniel Hailfinger:
> > The locking blocks of the FWH block lock cover 128KB areas, and thats
> > the only thing page_size is used for in the functions referenced in the
> > LHF00L04 entry.
> My datasheet talks about 8 kB sectors and 64 kB blocks in "Figure 3.
> Memory Map", but "Table 8. FWH Flash Registers Configuration Map" only
> mentions registers for the 8 kB sectors in the top 64 kB block
> explicitly. "Table 8" also mentions "XX002H Whole Block Lock Register"
> as generic placeholder, and AFAICS those two X mean you have one block
> lock register for each of the 15 bottom 64 kB blocks and one for each of
> the 8 top 8 kB sectors. That also means the 82802ab unlocking as is
> can't be used.

I'm looking at Sharp Spec No. FM037006, Issue Date: June 18, 2003

You are right that the erase block size is 64kB as shown e.g. in figure
3. This is not touched by my patch, though. Taking a close look at table
8, I read it as: The whole block locking bit (affecting the whole flash
chip area 0-1M) is possibly accessible each 4KB, but no matter what
address you use, you get to the same single "master write protect" bit.
This bit is located at data bit 1. On the other hand, the bits locking
only parts of the flash chip are mentioned in the lines below that, with
a "Protected address range of 128KB each and addresses of F0002h,
F2002h, F4002h, F6002h, F8002h, FA002h, FC002h and FE002h. These 8
"sector-specific" lock bits are located at bit 0. Nowhere this table
mentions anything about bits affecting only 8KB sized areas.

On the other hand, text of the data sheet nowhere mentions the
sectorwise locking - it is just in the table. I have no idea how to read
that.

Regards,
  Michael Karcher
Carl-Daniel Hailfinger - 2011-06-21 21:46:14
Am 20.06.2011 07:42 schrieb Michael Karcher:
> Am Montag, den 20.06.2011, 01:59 +0200 schrieb Carl-Daniel Hailfinger:
>   
>>> The locking blocks of the FWH block lock cover 128KB areas, and thats
>>> the only thing page_size is used for in the functions referenced in the
>>> LHF00L04 entry.
>>>       
>> My datasheet talks about 8 kB sectors and 64 kB blocks in "Figure 3.
>> Memory Map", but "Table 8. FWH Flash Registers Configuration Map" only
>> mentions registers for the 8 kB sectors in the top 64 kB block
>> explicitly. "Table 8" also mentions "XX002H Whole Block Lock Register"
>> as generic placeholder, and AFAICS those two X mean you have one block
>> lock register for each of the 15 bottom 64 kB blocks and one for each of
>> the 8 top 8 kB sectors. That also means the 82802ab unlocking as is
>> can't be used.
>>     
> I'm looking at Sharp Spec No. FM037006, Issue Date: June 18, 2003
>   

Same here.


> You are right that the erase block size is 64kB as shown e.g. in figure
> 3. This is not touched by my patch, though. Taking a close look at table
> 8, I read it as: The whole block locking bit (affecting the whole flash
> chip area 0-1M) is possibly accessible each 4KB, but no matter what
> address you use, you get to the same single "master write protect" bit.
> This bit is located at data bit 1. On the other hand, the bits locking
> only parts of the flash chip are mentioned in the lines below that, with
> a "Protected address range of 128KB

My datasheet (same date, same number) does not mention 128 kB ranges at all.

>  each and addresses of F0002h,
> F2002h, F4002h, F6002h, F8002h, FA002h, FC002h and FE002h.

Those addresses are, respectively:

hex   decimal        offset
f0002 15*64k+0*4k+2  0k
f2002 15*64k+2*4k+2  8k
f4002 15*64k+4*4k+2  16k
f6002 15*64k+6*4k+2  24k
f8002 15*64k+8*4k+2  32k
fa002 15*64k+10*4k+2 40k
fc002 15*64k+12*4k+2 48k
fe002 15*64k+14*4k+2 56k


At a first glance, it is easy to assume an additional hex digit in the
middle because we're so used to it. That may the reason you were seeing
128 kB blocks which I can't find here.


>  These 8
> "sector-specific" lock bits are located at bit 0. Nowhere this table
> mentions anything about bits affecting only 8KB sized areas.
>
> On the other hand, text of the data sheet nowhere mentions the
> sectorwise locking - it is just in the table. I have no idea how to read
> that.
>   

Regards,
Carl-Daniel
Stefan Tauner - 2012-05-16 00:17:50
On Mon, 20 Jun 2011 01:59:30 +0200
Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net> wrote:

> > Signed-off-by: Michael Karcher <flashrom@mkarcher.dialup.fu-berlin.de>
> >     
> 
> Killing sharplhf00l04.c is a good thing, though, so that part is
> Acked-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net>

almost a year old... i took care of that in r1538.

Patch

diff --git a/Makefile b/Makefile
index 6e6e2de..470d944 100644
--- a/Makefile
+++ b/Makefile
@@ -119,7 +119,7 @@  endif
 
 CHIP_OBJS = jedec.o stm50flw0x0x.o w39.o w29ee011.o \
 	sst28sf040.o m29f400bt.o 82802ab.o pm49fl00x.o \
-	sst49lfxxxc.o sst_fwhub.o flashchips.o spi.o spi25.o sharplhf00l04.o \
+	sst49lfxxxc.o sst_fwhub.o flashchips.o spi.o spi25.o \
 	a25.o at25.o
 
 LIB_OBJS = layout.o
diff --git a/flashchips.c b/flashchips.c
index 865ba2f..4514985 100644
--- a/flashchips.c
+++ b/flashchips.c
@@ -5151,7 +5151,7 @@  const struct flashchip flashchips[] = {
 		.manufacture_id	= SHARP_ID,
 		.model_id	= SHARP_LHF00L04,
 		.total_size	= 1024,
-		.page_size	= 64 * 1024,
+		.page_size	= 128 * 1024,
 		.feature_bits	= FEATURE_EITHER_RESET | FEATURE_REGISTERMAP,
 		.tested		= TEST_UNTESTED,
 		.probe		= probe_82802ab,
@@ -5171,7 +5171,8 @@  const struct flashchip flashchips[] = {
 				.block_erase = NULL, /* 30 D0, only in A/A mux mode */
 			},
 		},
-		.unlock		= unlock_82802ab,
+		.unlock		= unlock_82802ab, /* additionally, there are write-only non-volatile
+		                                     boot block protection bits per 8K sector*/
 		.write		= write_82802ab,
 		.read		= read_memmapped,
 		.voltage	= {3000, 3600},
diff --git a/sharplhf00l04.c b/sharplhf00l04.c
deleted file mode 100644
index f21950a..0000000
--- a/sharplhf00l04.c
+++ /dev/null
@@ -1,58 +0,0 @@ 
-/*
- * This file is part of the flashrom project.
- *
- * Copyright (C) 2000 Silicon Integrated System Corporation
- *
- * 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"
-#include "chipdrivers.h"
-
-/* FIXME: The datasheet is unclear whether we should use toggle_ready_jedec
- * or wait_82802ab.
- * FIXME: This file is unused.
- */
-
-int erase_lhf00l04_block(struct flashchip *flash, unsigned int blockaddr, unsigned int blocklen)
-{
-	chipaddr bios = flash->virtual_memory + blockaddr;
-	chipaddr wrprotect = flash->virtual_registers + blockaddr + 2;
-	uint8_t status;
-
-	// clear status register
-	chip_writeb(0x50, bios);
-	status = wait_82802ab(flash);
-	print_status_82802ab(status);
-	// clear write protect
-	msg_cspew("write protect is at 0x%lx\n", (wrprotect));
-	msg_cspew("write protect is 0x%x\n", chip_readb(wrprotect));
-	chip_writeb(0, wrprotect);
-	msg_cspew("write protect is 0x%x\n", chip_readb(wrprotect));
-
-	// now start it
-	chip_writeb(0x20, bios);
-	chip_writeb(0xd0, bios);
-	programmer_delay(10);
-	// now let's see what the register is
-	status = wait_82802ab(flash);
-	print_status_82802ab(status);
-
-	if (check_erased_range(flash, blockaddr, blocklen)) {
-		msg_cerr("ERASE FAILED!\n");
-		return -1;
-	}
-	return 0;
-}