1
0
mirror of https://review.coreboot.org/flashrom.git synced 2025-07-01 22:21:16 +02:00

One of the problems is that --force had multiple meanings

- Force chip read by faking probe success.
- Force chip access even if the chip is bigger than max decode size for
  the flash bus.
- Force erase even if erase is known bad.
- Force write even if write is known bad.
- Force writing even if cbtable tells us that this is the wrong image
  for this board.

This patch cleans up --force usage:
- Remove any suggestions to use --force for probe/read from flashrom
  output.
- Don't talk about "success" or "Found chip" if the chip is forced.
- Add a new internal programmer parameter boardmismatch=force. This
  overrides any mismatch detection from cbtable/image comparisons.
- Add a new internal programmer parameter laptop=force_I_want_a_brick.
- Adjust the documentation for --force.
- Clean up the man page a bit whereever it talks about --force or
  laptops.

Additional changes in this patch:
- Add warnings about laptops to the documentation.
- Abort if a laptop is detected. Can be overridden with the programmer
parameter mentioned above.
- Add "Portable" to the list of DMI strings indicating laptops.
- Check if a chip specified with -c is known to flashrom.
- Programmer parameter reliability and consistency fixes.
- More paranoid self-checks.
- Improve documentation.

Corresponding to flashrom svn r996.

Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net>
Acked-by: Michael Karcher <flashrom@mkarcher.dialup.fu-berlin.de>
This commit is contained in:
Carl-Daniel Hailfinger
2010-04-28 15:22:14 +00:00
parent 837d810796
commit 270237687a
8 changed files with 152 additions and 48 deletions

View File

@ -101,6 +101,7 @@ struct pci_dev *pci_card_find(uint16_t vendor, uint16_t device,
#if INTERNAL_SUPPORT == 1
struct superio superio = {};
int force_boardenable = 0;
int force_boardmismatch = 0;
void probe_superio(void)
{
@ -117,26 +118,42 @@ int is_laptop;
int internal_init(void)
{
int ret = 0;
int force_laptop = 0;
char *arg;
if (programmer_param && !strlen(programmer_param)) {
free(programmer_param);
programmer_param = NULL;
arg = extract_param(&programmer_param, "boardenable=", ",:");
if (arg && !strcmp(arg,"force")) {
force_boardenable = 1;
} else if (arg && !strlen(arg)) {
msg_perr("Missing argument for boardenable.\n");
} else if (arg) {
msg_perr("Unknown argument for boardenable: %s\n", arg);
exit(1);
}
if (programmer_param) {
char *arg;
arg = extract_param(&programmer_param, "boardenable=", ",:");
if (arg && !strcmp(arg,"force"))
force_boardenable = 1;
else if (arg)
msg_perr("Unknown argument for boardenable: %s\n", arg);
free(arg);
free(arg);
if (strlen(programmer_param))
msg_perr("Unhandled programmer parameters: %s\n",
programmer_param);
free(programmer_param);
programmer_param = NULL;
arg = extract_param(&programmer_param, "boardmismatch=", ",:");
if (arg && !strcmp(arg,"force")) {
force_boardmismatch = 1;
} else if (arg && !strlen(arg)) {
msg_perr("Missing argument for boardmismatch.\n");
} else if (arg) {
msg_perr("Unknown argument for boardmismatch: %s\n", arg);
exit(1);
}
free(arg);
arg = extract_param(&programmer_param, "laptop=", ",:");
if (arg && !strcmp(arg,"force_I_want_a_brick")) {
force_laptop = 1;
} else if (arg && !strlen(arg)) {
msg_perr("Missing argument for laptop.\n");
} else if (arg) {
msg_perr("Unknown argument for laptop: %s\n", arg);
exit(1);
}
free(arg);
get_io_perms();
/* Initialize PCI access for flash enables */
@ -155,22 +172,35 @@ int internal_init(void)
probe_superio();
/* Warn if a laptop is detected. */
if (is_laptop)
printf("========================================================================\n"
"WARNING! You seem to be running flashrom on a laptop.\n"
"Laptops, notebooks and netbooks are difficult to support and we recommend\n"
"to use the vendor flashing utility. The embedded controller (EC) in these\n"
"machines often interacts badly with flashing.\n"
"See http://www.flashrom.org/Laptops for details.\n"
"========================================================================\n");
if (is_laptop) {
msg_perr("========================================================================\n"
"WARNING! You seem to be running flashrom on a laptop.\n"
"Laptops, notebooks and netbooks are difficult to support and we recommend\n"
"to use the vendor flashing utility. The embedded controller (EC) in these\n"
"machines often interacts badly with flashing.\n"
"See http://www.flashrom.org/Laptops for details.\n\n"
"If flash is shared with the EC, erase is guaranteed to brick your laptop\n"
"and write may brick your laptop.\n"
"Read and probe may irritate your EC and cause fan failure, backlight\n"
"failure and sudden poweroff.\n"
"You have been warned.\n"
"========================================================================\n");
if (force_laptop) {
msg_perr("Proceeding anyway because user specified "
"laptop=force_I_want_a_brick\n");
} else {
msg_perr("Aborting.\n");
exit(1);
}
}
/* try to enable it. Failure IS an option, since not all motherboards
* really need this to be done, etc., etc.
*/
ret = chipset_flash_enable();
if (ret == -2) {
printf("WARNING: No chipset found. Flash detection "
"will most likely fail.\n");
msg_perr("WARNING: No chipset found. Flash detection "
"will most likely fail.\n");
}
/* Probe for IT87* LPC->SPI translation unconditionally. */
@ -182,7 +212,7 @@ int internal_init(void)
* The error code might have been a warning only.
* Besides that, we don't check the board enable return code either.
*/
return 0;
return 0;
}
int internal_shutdown(void)