summaryrefslogtreecommitdiffstats
path: root/internal.c
diff options
context:
space:
mode:
authorCarl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net>2010-04-28 15:22:14 +0000
committerCarl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net>2010-04-28 15:22:14 +0000
commit270237687a7f550e86c01548550f25b1d0a31d65 (patch)
tree88f216baf356f0e22fb8c8f7733ca9f175bd1545 /internal.c
parent837d81079689927b78baa5c606c6d8484ea21a95 (diff)
downloadast2050-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.c88
1 files changed, 59 insertions, 29 deletions
diff --git a/internal.c b/internal.c
index 39edd10..174370c 100644
--- a/internal.c
+++ b/internal.c
@@ -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)
OpenPOWER on IntegriCloud