mirror of
https://review.coreboot.org/flashrom.git
synced 2025-04-26 22:52:34 +02:00
Fixes ...
Corresponding to coreboot v1 svn r760.
This commit is contained in:
parent
d4228fdc47
commit
e555957f04
132
flash_rom.c
132
flash_rom.c
@ -136,6 +136,9 @@ enable_flash_e7500(struct pci_dev *dev, char *name) {
|
||||
|
||||
new = old | 1;
|
||||
|
||||
if (new == old)
|
||||
return 0;
|
||||
|
||||
ok = pci_write_byte(dev, 0x4e, new);
|
||||
|
||||
if (ok != new) {
|
||||
@ -146,6 +149,28 @@ enable_flash_e7500(struct pci_dev *dev, char *name) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
enable_flash_vt8231(struct pci_dev *dev, char *name) {
|
||||
unsigned char old, new;
|
||||
int ok;
|
||||
|
||||
old = pci_read_byte(dev, 0x40);
|
||||
|
||||
new = old | 0x10;
|
||||
|
||||
if (new == old)
|
||||
return 0;
|
||||
|
||||
ok = pci_write_byte(dev, 0x40, new);
|
||||
|
||||
if (ok != 0) {
|
||||
printf("tried to set 0x%x to 0x%x on %s failed (WARNING ONLY)\n",
|
||||
old, new, name);
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct flashchip * probe_flash(struct flashchip * flash)
|
||||
{
|
||||
int fd_mem;
|
||||
@ -206,29 +231,29 @@ int verify_flash (struct flashchip * flash, char * buf, int verbose)
|
||||
|
||||
// count to a billion. Time it. If it's < 1 sec, count to 10B, etc.
|
||||
|
||||
unsigned long micro = 0;
|
||||
unsigned long micro = 1;
|
||||
|
||||
void
|
||||
myusec_calibrate_delay()
|
||||
{
|
||||
unsigned long count = 10 * 1024 * 1024;
|
||||
int count = 1000;
|
||||
volatile unsigned long i;
|
||||
unsigned long timeusec;
|
||||
struct timeval start, end;
|
||||
int ok = 0;
|
||||
void myusec_delay(int time);
|
||||
|
||||
printf("Setting up microsecond timing loop\n");
|
||||
while (! ok) {
|
||||
//fprintf(stderr, "Try %d\n", count);
|
||||
gettimeofday(&start, 0);
|
||||
for( i = count; i; i--)
|
||||
;
|
||||
myusec_delay(count);
|
||||
gettimeofday(&end, 0);
|
||||
timeusec = 1000000 * (end.tv_sec - start.tv_sec ) +
|
||||
(end.tv_usec - start.tv_usec);
|
||||
fprintf(stderr, "timeusec is %d\n", timeusec);
|
||||
count *= 100;
|
||||
if (timeusec < 1000000)
|
||||
//fprintf(stderr, "timeusec is %d\n", timeusec);
|
||||
count *= 2;
|
||||
if (timeusec < 1000000/4)
|
||||
continue;
|
||||
ok = 1;
|
||||
}
|
||||
@ -236,18 +261,17 @@ myusec_calibrate_delay()
|
||||
// compute one microsecond. That will be count / time
|
||||
micro = count / timeusec;
|
||||
|
||||
//fprintf(stderr, "one us is %d count\n", micro);
|
||||
fprintf(stderr, "%dM loops per second\n", micro);
|
||||
|
||||
|
||||
}
|
||||
|
||||
void
|
||||
myusec_delay(time)
|
||||
myusec_delay(int time)
|
||||
{
|
||||
volatile unsigned long i;
|
||||
for(i = 0; i < time * micro; i++)
|
||||
;
|
||||
|
||||
}
|
||||
|
||||
typedef struct penable {
|
||||
@ -260,6 +284,7 @@ FLASH_ENABLE enables[] = {
|
||||
|
||||
{0x1, 0x1, "sis630 -- what's the ID?", enable_flash_sis630},
|
||||
{0x8086, 0x2480, "E7500", enable_flash_e7500},
|
||||
{0x1106, 0x8231, "VT8231", enable_flash_vt8231},
|
||||
};
|
||||
|
||||
int
|
||||
@ -291,10 +316,25 @@ enable_flash_write() {
|
||||
}
|
||||
|
||||
/* now do the deed. */
|
||||
enable->doit(dev, enable->name);
|
||||
if (enable) {
|
||||
printf("Enabling flash write on %s...", enable->name);
|
||||
if (enable->doit(dev, enable->name) == 0)
|
||||
printf("OK\n");
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void usage(const char *name)
|
||||
{
|
||||
printf("usage: %s [-rwv] [file]\n", name);
|
||||
printf("-r: read flash and save into file\n"
|
||||
"-w: write file into flash (default when file is specified)\n"
|
||||
"-v: verify flash against file\n"
|
||||
" If no file is specified, then all that happens\n"
|
||||
" is that flash info is dumped\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
int
|
||||
main (int argc, char * argv[])
|
||||
{
|
||||
@ -302,12 +342,36 @@ main (int argc, char * argv[])
|
||||
unsigned long size;
|
||||
FILE * image;
|
||||
struct flashchip * flash;
|
||||
|
||||
if (argc > 2){
|
||||
printf("usage: %s [romimage]\n", argv[0]);
|
||||
printf(" If no romimage is specified, then all that happens\n");
|
||||
printf(" is that flash info is dumped\n");
|
||||
int opt;
|
||||
int read_it = 0, write_it = 0, verify_it = 0;
|
||||
char *filename = NULL;
|
||||
while ((opt = getopt(argc, argv, "rwv")) != EOF) {
|
||||
switch (opt) {
|
||||
case 'r':
|
||||
read_it = 1;
|
||||
break;
|
||||
case 'w':
|
||||
write_it = 1;
|
||||
break;
|
||||
case 'v':
|
||||
verify_it = 1;
|
||||
break;
|
||||
default:
|
||||
usage(argv[0]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (read_it && write_it) {
|
||||
printf("-r and -w are mutually exclusive\n");
|
||||
usage(argv[0]);
|
||||
}
|
||||
|
||||
if (optind < argc)
|
||||
filename = argv[optind++];
|
||||
|
||||
printf("Calibrating timer since microsleep sucks ... takes a second\n");
|
||||
myusec_calibrate_delay();
|
||||
printf("OK, calibrated, now do the deed\n");
|
||||
|
||||
/* try to enable it. Failure IS an option, since not all motherboards
|
||||
* really need this to be done, etc., etc. It sucks.
|
||||
@ -320,25 +384,35 @@ main (int argc, char * argv[])
|
||||
}
|
||||
|
||||
printf("Part is %s\n", flash->name);
|
||||
if (argc < 2){
|
||||
if (!filename){
|
||||
printf("OK, only ENABLING flash write, but NOT FLASHING\n");
|
||||
return 0;
|
||||
}
|
||||
size = flash->total_size * 1024;
|
||||
buf = (char *) calloc (size, sizeof(char));
|
||||
|
||||
if ((image = fopen (argv[1], "r")) == NULL) {
|
||||
perror("Error opening image file");
|
||||
exit(1);
|
||||
if (read_it) {
|
||||
if ((image = fopen (filename, "w")) == NULL) {
|
||||
perror("Error opening image file");
|
||||
exit(1);
|
||||
}
|
||||
printf("Reading Flash...");
|
||||
memcpy(buf, (const char *) flash->virt_addr, size);
|
||||
fwrite(buf, sizeof(char), size, image);
|
||||
fclose(image);
|
||||
printf("done\n");
|
||||
} else {
|
||||
if ((image = fopen (filename, "r")) == NULL) {
|
||||
perror("Error opening image file");
|
||||
exit(1);
|
||||
}
|
||||
fread (buf, sizeof(char), size, image);
|
||||
fclose(image);
|
||||
}
|
||||
|
||||
buf = (char *) calloc (size, sizeof(char));
|
||||
fread (buf, sizeof(char), size, image);
|
||||
|
||||
printf("Calibrating timer since microsleep sucks ... takes a second\n");
|
||||
myusec_calibrate_delay();
|
||||
printf("OK, calibrated, now do the deed\n");
|
||||
|
||||
flash->write (flash, buf);
|
||||
verify_flash (flash, buf, /* verbose = */ 0);
|
||||
if (write_it)
|
||||
flash->write (flash, buf);
|
||||
if (verify_it)
|
||||
verify_flash (flash, buf, /* verbose = */ 0);
|
||||
return 0;
|
||||
}
|
||||
|
@ -27,6 +27,7 @@
|
||||
|
||||
#include "flash.h"
|
||||
#include "jedec.h"
|
||||
#include <stdio.h>
|
||||
|
||||
#define AUTO_PG_ERASE1 0x20
|
||||
#define AUTO_PG_ERASE2 0xD0
|
||||
@ -160,7 +161,7 @@ int erase_39sf020 (struct flashchip * flash)
|
||||
Temp = bios + 0x5555; /* set up address to be C000:5555h */
|
||||
*Temp = 0x10; /* write data 0x55 to the address */
|
||||
|
||||
myusec_delay(20000);
|
||||
myusec_delay(50000);
|
||||
}
|
||||
|
||||
int write_39sf020 (struct flashchip * flash, char * buf)
|
||||
@ -181,6 +182,7 @@ int write_39sf020 (struct flashchip * flash, char * buf)
|
||||
write_sector_39sf020(bios, buf + i * page_size, bios + i * page_size,
|
||||
page_size);
|
||||
printf ("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");
|
||||
fflush(stdout);
|
||||
}
|
||||
printf("\n");
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user