diff options
author | Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net> | 2010-04-28 15:22:14 +0000 |
---|---|---|
committer | Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net> | 2010-04-28 15:22:14 +0000 |
commit | 270237687a7f550e86c01548550f25b1d0a31d65 (patch) | |
tree | 88f216baf356f0e22fb8c8f7733ca9f175bd1545 /internal.c | |
parent | 837d81079689927b78baa5c606c6d8484ea21a95 (diff) | |
download | ast2050-flashrom-270237687a7f550e86c01548550f25b1d0a31d65.zip ast2050-flashrom-270237687a7f550e86c01548550f25b1d0a31d65.tar.gz |
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>
Diffstat (limited to 'internal.c')
-rw-r--r-- | internal.c | 88 |
1 files changed, 59 insertions, 29 deletions
@@ -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; - - if (programmer_param && !strlen(programmer_param)) { - free(programmer_param); - programmer_param = NULL; + int force_laptop = 0; + char *arg; + + 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); + } + free(arg); + + 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); } - 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); - - if (strlen(programmer_param)) - msg_perr("Unhandled programmer parameters: %s\n", - programmer_param); - free(programmer_param); - programmer_param = NULL; + 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) |