summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStefan Tauner <stefan.tauner@alumni.tuwien.ac.at>2014-06-12 22:57:36 +0000
committerStefan Tauner <stefan.tauner@alumni.tuwien.ac.at>2014-06-12 22:57:36 +0000
commit600576b43d7f76adc49913a7a7dd21e318b063cf (patch)
tree58dda54c79c37a339ce3cfbdf6d03fdbf413b81c
parent7ba3d6ce160ed46913a63283e0b8822b80985044 (diff)
downloadflashrom-600576b43d7f76adc49913a7a7dd21e318b063cf.tar.gz
flashrom-600576b43d7f76adc49913a7a7dd21e318b063cf.tar.bz2
flashrom-600576b43d7f76adc49913a7a7dd21e318b063cf.zip
Add selfcheck_board_enables()
Check for NULL termination of the array, that each board has the two main PCI ID sets defined, that coreboot vendor and model fields are either both set or unset, and that at least either an enable function or a max decode size is available. Corresponding to flashrom svn r1821. Signed-off-by: Stefan Tauner <stefan.tauner@alumni.tuwien.ac.at> Acked-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net>
-rw-r--r--board_enable.c30
-rw-r--r--flashrom.c4
-rw-r--r--programmer.h1
3 files changed, 35 insertions, 0 deletions
diff --git a/board_enable.c b/board_enable.c
index 2cf677625..2efc710f0 100644
--- a/board_enable.c
+++ b/board_enable.c
@@ -2463,6 +2463,36 @@ const struct board_match board_matches[] = {
{ 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL, P3, NULL, NULL, 0, NT, NULL}, /* end marker */
};
+int selfcheck_board_enables(void)
+{
+ if (board_matches[ARRAY_SIZE(board_matches) - 1].vendor_name != NULL) {
+ msg_gerr("Board enables table miscompilation!\n");
+ return 1;
+ }
+
+ int ret = 0;
+ unsigned int i;
+ for (i = 0; i < ARRAY_SIZE(board_matches) - 1; i++) {
+ const struct board_match *b = &board_matches[i];
+ if (b->vendor_name == NULL || b->board_name == NULL) {
+ msg_gerr("ERROR: Board enable #%d does not define a vendor and board name.\n"
+ "Please report a bug at flashrom@flashrom.org\n", i);
+ ret = 1;
+ continue;
+ }
+ if ((b->first_vendor == 0 || b->first_device == 0 ||
+ b->second_vendor == 0 || b->second_device == 0) ||
+ ((b->lb_vendor == NULL) ^ (b->lb_part == NULL)) ||
+ (b->max_rom_decode_parallel == 0 && b->enable == NULL)) {
+ msg_gerr("ERROR: Board enable for %s %s is misdefined.\n"
+ "Please report a bug at flashrom@flashrom.org\n",
+ b->vendor_name, b->board_name);
+ ret = 1;
+ }
+ }
+ return ret;
+}
+
/* Parse the <vendor>:<board> string specified by the user as part of -p internal:mainboard=<vendor>:<board>.
* Parameters vendor and model will be overwritten. Returns 0 on success.
* Note: strtok modifies the original string, so we work on a copy and allocate memory for the results.
diff --git a/flashrom.c b/flashrom.c
index c9e0d016f..8e5d36393 100644
--- a/flashrom.c
+++ b/flashrom.c
@@ -1758,6 +1758,10 @@ int selfcheck(void)
}
}
+#if CONFIG_INTERNAL == 1
+ ret |= selfcheck_board_enables();
+#endif
+
/* TODO: implement similar sanity checks for other arrays where deemed necessary. */
return ret;
}
diff --git a/programmer.h b/programmer.h
index d29965629..b0df2ba7f 100644
--- a/programmer.h
+++ b/programmer.h
@@ -260,6 +260,7 @@ void internal_delay(unsigned int usecs);
#if CONFIG_INTERNAL == 1
/* board_enable.c */
+int selfcheck_board_enables(void);
int board_parse_parameter(const char *boardstring, const char **vendor, const char **model);
void w836xx_ext_enter(uint16_t port);
void w836xx_ext_leave(uint16_t port);