mirror of
				https://review.coreboot.org/flashrom.git
				synced 2025-10-31 05:10:41 +01:00 
			
		
		
		
	 75dc0655b9
			
		
	
	75dc0655b9
	
	
	
		
			
			Original progress reporting implemented in CB:49643 and it has some
issues, for example:
    size_t start_address = start;
    size_t end_address = len - start;
End address is anything but length minus start address.
    update_progress(flash,
                    FLASHROM_PROGRESS_READ,
                    /*current*/ start - start_address + to_read,
                    /*total*/ end_address);
Total should just be length if that's how current value is computed.
---
libflashrom needs to know total size ahead of time.
That's init_progress() and changed update_progress().
It also needs to store the last current value to be able to update it.
That's stage_progress in flashrom_flashctx.
Measuring accurately amount of data which will be read/erased/written
isn't easy because things can be skipped as optimizations. The next
patch in the chain aims to address this, there are TODO/FIXME
comments there.
---
CLI shares terminal with the rest of the code and has to maintain more
state to handle that reasonably well.
Similar to CB:64668, an effort is made to keep the progress on a
single line. Non-progress output is kept track of to know when
moving to a new line cannot be avoided.
---
A script to test the CLI:
\#!/bin/bash
t=${1:-rewW}
shift
if [[ $t =~ r ]]; then
    echo ">>> READ"
    ./flashrom -p dummy:emulate=W25Q128FV,freq=64mhz -r dump.rom --progress "$@"
    echo
fi
if [[ $t =~ e ]]; then
    echo ">>> ERASE"
    ./flashrom -p dummy:emulate=W25Q128FV,freq=64mhz -E --progress "$@"
    echo
fi
if [[ $t =~ w ]]; then
    echo ">>> WRITE (without erase)"
    dd if=/dev/zero of=zero.rom bs=1M count=16 2> /dev/null
    ./flashrom -p dummy:emulate=W25Q128FV,freq=64mhz -w zero.rom --progress "$@"
    echo
fi
if [[ $t =~ W ]]; then
    echo ">>> WRITE (with erase)"
    dd if=/dev/zero of=zero.rom bs=1M count=16 2> /dev/null
    dd if=/dev/random of=random.rom bs=1M count=16 2> /dev/null
    ./flashrom -p dummy:emulate=W25Q128FV,freq=64mhz,image=random.rom -w zero.rom --progress "$@"
    echo
fi
Co-developed-by: Anastasia Klimchuk <aklm@flashrom.org>
Co-developed-by: Sergii Dmytruk <sergii.dmytruk@3mdeb.com>
Change-Id: If1e40fc97f443c4f0c0501cef11cff1f3f84c051
Signed-off-by: Sergii Dmytruk <sergii.dmytruk@3mdeb.com>
Signed-off-by: Anastasia Klimchuk <aklm@flashrom.org>
Reviewed-on: https://review.coreboot.org/c/flashrom/+/84102
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Anastasia Klimchuk <aklm@chromium.org>
		
	
		
			
				
	
	
		
			125 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			125 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * This file is part of the flashrom project.
 | |
|  *
 | |
|  * Copyright (C) 2000 Silicon Integrated System Corporation
 | |
|  * Copyright (C) 2005 coresystems GmbH <stepan@openbios.org>
 | |
|  * Copyright (C) 2009 Sean Nelson <audiohacked@gmail.com>
 | |
|  *
 | |
|  * 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.
 | |
|  */
 | |
| 
 | |
| #include "flash.h"
 | |
| #include "chipdrivers.h"
 | |
| 
 | |
| #define AUTO_PG_ERASE1		0x20
 | |
| #define AUTO_PG_ERASE2		0xD0
 | |
| #define AUTO_PGRM		0x10
 | |
| #define CHIP_ERASE		0x30
 | |
| #define RESET			0xFF
 | |
| #define READ_ID			0x90
 | |
| 
 | |
| int protect_28sf040(struct flashctx *flash)
 | |
| {
 | |
| 	chipaddr bios = flash->virtual_memory;
 | |
| 
 | |
| 	chip_readb(flash, bios + 0x1823);
 | |
| 	chip_readb(flash, bios + 0x1820);
 | |
| 	chip_readb(flash, bios + 0x1822);
 | |
| 	chip_readb(flash, bios + 0x0418);
 | |
| 	chip_readb(flash, bios + 0x041B);
 | |
| 	chip_readb(flash, bios + 0x0419);
 | |
| 	chip_readb(flash, bios + 0x040A);
 | |
| 
 | |
| 	return 0;
 | |
| }
 | |
| 
 | |
| int unprotect_28sf040(struct flashctx *flash)
 | |
| {
 | |
| 	chipaddr bios = flash->virtual_memory;
 | |
| 
 | |
| 	chip_readb(flash, bios + 0x1823);
 | |
| 	chip_readb(flash, bios + 0x1820);
 | |
| 	chip_readb(flash, bios + 0x1822);
 | |
| 	chip_readb(flash, bios + 0x0418);
 | |
| 	chip_readb(flash, bios + 0x041B);
 | |
| 	chip_readb(flash, bios + 0x0419);
 | |
| 	chip_readb(flash, bios + 0x041A);
 | |
| 
 | |
| 	return 0;
 | |
| }
 | |
| 
 | |
| int erase_sector_28sf040(struct flashctx *flash, unsigned int address,
 | |
| 			 unsigned int sector_size)
 | |
| {
 | |
| 	chipaddr bios = flash->virtual_memory;
 | |
| 
 | |
| 	/* This command sequence is very similar to erase_block_82802ab. */
 | |
| 	chip_writeb(flash, AUTO_PG_ERASE1, bios);
 | |
| 	chip_writeb(flash, AUTO_PG_ERASE2, bios + address);
 | |
| 
 | |
| 	/* wait for Toggle bit ready */
 | |
| 	toggle_ready_jedec(flash, bios);
 | |
| 
 | |
| 	/* FIXME: Check the status register for errors. */
 | |
| 	return 0;
 | |
| }
 | |
| 
 | |
| /* chunksize is 1 */
 | |
| int write_28sf040(struct flashctx *flash, const uint8_t *src, unsigned int start, unsigned int len)
 | |
| {
 | |
| 	unsigned int i;
 | |
| 	chipaddr bios = flash->virtual_memory;
 | |
| 	chipaddr dst = flash->virtual_memory + start;
 | |
| 
 | |
| 	for (i = 0; i < len; i++) {
 | |
| 		/* transfer data from source to destination */
 | |
| 		if (*src == 0xFF) {
 | |
| 			dst++, src++;
 | |
| 			/* If the data is 0xFF, don't program it */
 | |
| 			continue;
 | |
| 		}
 | |
| 		/*issue AUTO PROGRAM command */
 | |
| 		chip_writeb(flash, AUTO_PGRM, dst);
 | |
| 		chip_writeb(flash, *src++, dst++);
 | |
| 
 | |
| 		/* wait for Toggle bit ready */
 | |
| 		toggle_ready_jedec(flash, bios);
 | |
| 		update_progress(flash, FLASHROM_PROGRESS_WRITE, 1);
 | |
| 	}
 | |
| 
 | |
| 	return 0;
 | |
| }
 | |
| 
 | |
| static int erase_28sf040(struct flashctx *flash)
 | |
| {
 | |
| 	chipaddr bios = flash->virtual_memory;
 | |
| 
 | |
| 	chip_writeb(flash, CHIP_ERASE, bios);
 | |
| 	chip_writeb(flash, CHIP_ERASE, bios);
 | |
| 
 | |
| 	programmer_delay(flash, 10);
 | |
| 	toggle_ready_jedec(flash, bios);
 | |
| 
 | |
| 	/* FIXME: Check the status register for errors. */
 | |
| 	return 0;
 | |
| }
 | |
| 
 | |
| int erase_chip_28sf040(struct flashctx *flash, unsigned int addr,
 | |
| 		       unsigned int blocklen)
 | |
| {
 | |
| 	if ((addr != 0) || (blocklen != flash->chip->total_size * 1024)) {
 | |
| 		msg_cerr("%s called with incorrect arguments\n",
 | |
| 			__func__);
 | |
| 		return -1;
 | |
| 	}
 | |
| 	return erase_28sf040(flash);
 | |
| }
 |