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>
diff --git a/internal.c b/internal.c
index 39edd10..174370c 100644
--- a/internal.c
+++ b/internal.c
@@ -101,6 +101,7 @@
#if INTERNAL_SUPPORT == 1
struct superio superio = {};
int force_boardenable = 0;
+int force_boardmismatch = 0;
void probe_superio(void)
{
@@ -117,26 +118,42 @@
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 @@
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 @@
* 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)