This is an update of a really old patch.
User-visible changes: You have to specify vendor+mainboard for the internal:mainboard= parameter. The vendor name is no longer optional.
Signed-off-by: Carl-Daniel Hailfinger c-d.hailfinger.devel.2006@gmx.net
Index: flashrom-cbtable_matching_cleanup/board_enable.c =================================================================== --- flashrom-cbtable_matching_cleanup/board_enable.c (Revision 1567) +++ flashrom-cbtable_matching_cleanup/board_enable.c (Arbeitskopie) @@ -2447,37 +2447,50 @@ * Match boards on coreboot table gathered vendor and part name. * Require main PCI IDs to match too as extra safety. */ -static const struct board_match *board_match_cbname(const char *vendor, - const char *part) +static const struct board_match *board_match_cbname(const char *vendor, const char *part) { const struct board_match *board = board_matches; const struct board_match *partmatch = NULL;
+ /* If a board uses coreboot, we have full vendor+part name. + * If a board doesn't use coreboot, we have DMI. + * If a board has no useful DMI and no coreboot table and no subsystem IDs, the user should specify + * full board vendor+part name. + */ + if ((!vendor && part) || (vendor && !part)) { + msg_pinfo("Please supply board vendor and part name.\n"); + return NULL; + } + if (!vendor && !part) + return NULL; + for (; board->vendor_name; board++) { - if (vendor && (!board->lb_vendor - || strcasecmp(board->lb_vendor, vendor))) + if (!board->lb_vendor || strcasecmp(board->lb_vendor, vendor)) continue;
if (!board->lb_part || strcasecmp(board->lb_part, part)) continue;
- if (!pci_dev_find(board->first_vendor, board->first_device)) + if (!pci_dev_find(board->first_vendor, board->first_device)) { + msg_pdbg("Odd. coreboot name "%s":"%s" matches, but first PCI device %04x:%04x " + "doesn't.\n", vendor, part, board->first_vendor, board->first_device); continue; + }
+ /* FIXME: Once the entries for agami Aruma and IWILL DK8-HTX are fixed to have a second PCI + * device, we can run pci_dev_find unconditionally. + */ if (board->second_vendor && - !pci_dev_find(board->second_vendor, board->second_device)) + !pci_dev_find(board->second_vendor, board->second_device)) { + msg_pdbg("Odd. coreboot name "%s":"%s" matches, but second PCI device %04x:%04x " + "doesn't.\n", vendor, part, board->second_vendor, board->second_device); continue; + }
- if (vendor) - return board; - if (partmatch) { - /* a second entry has a matching part name */ - msg_pinfo("AMBIGUOUS BOARD NAME: %s\n", part); - msg_pinfo("At least vendors '%s' and '%s' match.\n", - partmatch->lb_vendor, board->lb_vendor); - msg_perr("Please use the full -p internal:mainboard=" - "vendor:part syntax.\n"); + /* More than one entry has a matching name. */ + msg_perr("Board name "%s":"%s" and PCI IDs matched more than one board enable " + "entry. Please report a bug at flashrom@flashrom.org\n", part, vendor); return NULL; } partmatch = board; @@ -2487,12 +2500,10 @@ return partmatch;
if (!partvendor_from_cbtable) { - /* Only warn if the mainboard type was not gathered from the - * coreboot table. If it was, the coreboot implementor is - * expected to fix flashrom, too. + /* Only warn if the mainboard type was not gathered from the coreboot table. If it was, the + * coreboot implementor is expected to fix flashrom, too. */ - msg_perr("\nUnknown vendor:board from -p internal:mainboard=" - " programmer parameter:\n%s:%s\n\n", + msg_perr("\nUnknown vendor:board from -p internal:mainboard= programmer parameter:\n%s:%s\n\n", vendor, part); } return NULL;