On 12.05.2009 22:06, Uwe Hermann wrote: > On Tue, May 12, 2009 at 10:03:56PM +0200, Uwe Hermann wrote: > >> On Tue, May 12, 2009 at 06:31:15PM +0200, Carl-Daniel Hailfinger wrote: >> >>> Please make sure the "... unknown SPI chip" variants are not listed. >>> Status: "Broken" ends up as "?". >>> >> True, but I'd like to fix these issues in a different patch, this one's >> quite huge and invasive already. >>
Since that code seems to be new, I figured you could fix it in the first commit, but I'm not picky as long as you promise to send a followup patch. >>> IMHO the wiki output code uglifies quite a lot of files. Please stick it >>> into one common file called wikifier.c or something like that. >>> >> Yeah, good idea. Attached is the second iteration of the patch which has >> the wiki printing code in wikify.c. >> That requires to put some structs into flash.h though and make some >> stuff non-'static'. >> > > Add a --list-supported-wiki / -z option which outputs the currently > supported flash chips (and their status), chipsets (plus status), > and mainboards (plus status) to stdout. > > This allows for very easy pasting into the http://coreboot.org/Flashrom > page, so we can keep that page up-to-date without much hassle. > > The list of boards is mostly new (known good ones which don't need > write-enable code, and known-bad ones) and also lists URLs to the > vendor's mainboard pages. > These URLs are NOT printed in -L output per default, but they are > if you use verbose mode, e.g. via -LV. > They're also used in the --list-supported-wiki output for the wiki, > of course. > > Signed-off-by: Uwe Hermann <[email protected]> > > Index: flashrom.8 > =================================================================== > --- flashrom.8 (Revision 498) > +++ flashrom.8 (Arbeitskopie) > @@ -2,7 +2,7 @@ > .SH NAME > flashrom \- read, write, verify and erase BIOS/ROM/flash chips > .SH SYNOPSIS > -.B flashrom \fR[\fB\-rwvEVfLhR\fR] [\fB\-c\fR chipname] [\fB\-s\fR > exclude_start] [\fB\-e\fR exclude_end] > +.B flashrom \fR[\fB\-rwvEVfLzhR\fR] [\fB\-c\fR chipname] [\fB\-s\fR > exclude_start] [\fB\-e\fR exclude_end] > [\fB-m\fR [vendor:]part] [\fB-l\fR file.layout] [\fB-i\fR > image_name] [file] > .SH DESCRIPTION > .B flashrom > @@ -123,6 +123,12 @@ > Please let us know if you can verify other boards to work or not work out > of the box. > .TP > +.B "\-z, \-\-list\-supported-wiki" > +Same as > +.BR \-\-list\-supported , > +but outputs the supported hardware in MediaWiki syntax, so that it can be > +easily pasted into the wiki page at http://coreboot.org/Flashrom. > +.TP > .B "\-p, \-\-programmer <name>" > Specify the programmer device. Currently supported are: > .sp > Index: flash.h > =================================================================== > --- flash.h (Revision 498) > +++ flash.h (Arbeitskopie) > @@ -29,6 +29,7 @@ > #include <unistd.h> > #include <stdint.h> > #include <stdio.h> > +#include <pci/pci.h> > > /* for iopl and outb under Solaris */ > #if defined (__sun) && (defined(__i386) || defined(__amd64)) > @@ -201,6 +202,75 @@ > > extern struct flashchip flashchips[]; > > +typedef struct penable { > + uint16_t vendor_id; > + uint16_t device_id; > + int status; > + const char *vendor_name; > + const char *device_name; > + int (*doit) (struct pci_dev *dev, const char *name); > +} FLASH_ENABLE; > Please kill that ugly typedef while you're at it. > + > +#define OK 0 > +#define NT 1 /* Not tested */ > Prefix please. CHIPSET_OK etc. > + > +extern const FLASH_ENABLE enables[]; > And rename enables to chipset_enables if at all possible. I never saw a more ambiguous variable name in flashrom. Sure, it's not your fault, but since you're touching that code anyway... no good deed goes unpunished. > + > +/** > + * We use 2 sets of IDs here, you're free to choose which is which. This > + * is to provide a very high degree of certainty when matching a board on > + * the basis of subsystem/card IDs. As not every vendor handles > + * subsystem/card IDs in a sane manner. > + * > + * Keep the second set NULLed if it should be ignored. Keep the subsystem IDs > + * NULLed if they don't identify the board fully. But please take care to > + * provide an as complete set of pci ids as possible; autodetection is the > + * preferred behaviour and we would like to make sure that matches are > unique. > + * > + * The coreboot ids are used two fold. When running with a coreboot firmware, > + * the ids uniquely matches the coreboot board identification string. When a > + * legacy bios is installed and when autodetection is not possible, these ids > + * can be used to identify the board through the -m command line argument. > + * > + * When a board is identified through its coreboot ids (in both cases), the > + * main pci ids are still required to match, as a safeguard. > + */ > +struct board_pciid_enable { > + /* Any device, but make it sensible, like the ISA bridge. */ > + uint16_t first_vendor; > + uint16_t first_device; > + uint16_t first_card_vendor; > + uint16_t first_card_device; > + > + /* Any device, but make it sensible, like > + * the host bridge. May be NULL. > + */ > + uint16_t second_vendor; > + uint16_t second_device; > + uint16_t second_card_vendor; > + uint16_t second_card_device; > + > + /* The vendor / part name from the coreboot table. */ > + const char *lb_vendor; > + const char *lb_part; > + > + const char *vendor_name; > + const char *board_name; > + > + int (*enable) (const char *name); > +}; > + > +extern struct board_pciid_enable board_pciid_enables[]; > + > +struct board_info { > + const char *vendor; > + const char *name; > + const char *url; > +}; > + > +extern const struct board_info boards_ok[]; > +extern const struct board_info boards_no[]; > boards_bad maybe? > + > /* > * Please keep this list sorted alphabetically by manufacturer. The first > * entry of each section should be the manufacturer ID, followed by the > @@ -537,6 +607,11 @@ > #define W_49V002A 0xB0 > #define W_49V002FA 0x32 > > +/* wikify.c */ > +void print_supported_chips_wiki(void); > +void print_supported_boards_wiki(void); > +void print_supported_chipsets_wiki(void); > + > /* udelay.c */ > void myusec_delay(int time); > void myusec_calibrate_delay(void); > Index: Makefile > =================================================================== > --- Makefile (Revision 498) > +++ Makefile (Arbeitskopie) > @@ -35,7 +35,7 @@ > sst49lfxxxc.o sst_fwhub.o layout.o cbtable.o flashchips.o physmap.o \ > flashrom.o w39v080fa.o sharplhf00l04.o w29ee011.o spi.o it87spi.o \ > ichspi.o w39v040c.o sb600spi.o wbsio_spi.o m29f002.o internal.o \ > - dummyflasher.o > + dummyflasher.o wikify.o > > all: pciutils dep $(PROGRAM) > > Index: wikify.c > =================================================================== > --- wikify.c (Revision 0) > +++ wikify.c (Revision 0) > @@ -0,0 +1,196 @@ > +/* > + * This file is part of the flashrom project. > + * > + * Copyright (C) 2009 Uwe Hermann <[email protected]> > + * > + * This program is free software; you can redistribute it and/or modify > + * it under the terms of the GNU General Public License as published by > + * the Free Software Foundation; either version 2 of the License, or > + * (at your option) any later version. > + * > + * This program is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU General Public License for more details. > + * > + * You should have received a copy of the GNU General Public License > + * along with this program; if not, write to the Free Software > + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > + */ > + > +#include <string.h> > +#include "flash.h" > + > +#define CHIPSET_TH "{| border=\"0\" style=\"font-size: smaller\"\n\ > +|- bgcolor=\"#6699dd\"\n! align=\"left\" | Vendor\n\ > +! align=\"left\" | Southbridge\n! align=\"left\" | Status\n\n" > + > +void print_supported_chipsets_wiki(void) > +{ > + int i, j, enablescount = 0, color = 1; > + const FLASH_ENABLE *e = enables; > + > + printf("\n== Supported chipsets ==\n\n{| border=\"0\" " > + "valign=\"top\"\n| valign=\"top\"|\n\n" CHIPSET_TH); > + > + for (e = enables; e->vendor_name != NULL; e++) > + enablescount++; > + > + for (i = 0, j = 0; enables[i].vendor_name != NULL; i++, j++) { > + /* Alternate colors if the vendor changes. */ > + if (i > 0 && strcmp(enables[i].vendor_name, > + enables[i - 1].vendor_name)) > + color = !color; > + > + printf("|- bgcolor=\"#%s\" valign=\"top\"\n| %s\n| %s" > + "\n| %s\n", (color) ? "eeeeee" : "dddddd", > + enables[i].vendor_name, enables[i].device_name, > + (enables[i].status == OK) ? "{{OK}}" : "?"); > + > + /* Split table in three columns. */ > + if (j >= (enablescount / 3 + 1)) { > + printf("\n|}\n\n| valign=\"top\"|\n\n" CHIPSET_TH); > + j = 0; > + } > + } > + > + printf("\n|}\n\n|}\n"); > +} > + > +#define BOARD_TH "{| border=\"0\" style=\"font-size: smaller\" > valign=\"top\"\ > +\n|- bgcolor=\"#6699dd\"\n! align=\"left\" | Vendor\n\ > +! align=\"left\" | Mainboard\n! align=\"left\" | Status\n\n" > + > +#define BOARD_TH2 "{| border=\"0\" style=\"font-size: smaller\" > valign=\"top\"\ > +\n|- bgcolor=\"#6699dd\"\n! align=\"left\" | Vendor\n\ > +! align=\"left\" | Mainboard\n! align=\"left\" | Required option\n\ > +! align=\"left\" | Status\n\n" > + > +static void wiki_helper(const char *heading, const char *status, > + int cols, const struct board_info boards[]) > +{ > + int i, j, boardcount = 0, color = 1; > + const struct board_info *b; > + > + printf("\n'''%s'''\n\n{| border=\"0\" " > + "valign=\"top\"\n| valign=\"top\"|\n\n%s", heading, BOARD_TH); > + > + for (b = boards; b->vendor != NULL; b++) > + boardcount++; > + > + for (i = 0, j = 0, b = boards; b[i].vendor != NULL; i++, j++) { > + /* Alternate colors if the vendor changes. */ > + if (i > 0 && strcmp(b[i].vendor, b[i - 1].vendor)) > + color = !color; > + > + printf("|- bgcolor=\"#%s\" valign=\"top\"\n| %s\n|%s%s %s%s\n|" > + " {{%s}}\n", (color) ? "eeeeee" : "dddddd", b[i].vendor, > + (b[i].url) ? " [" : "", (b[i].url) ? b[i].url : "", > + b[i].name, (b[i].url) ? "]" : "", status); > + > + /* Split table in three columns. */ > + if (j >= (boardcount / cols + 1)) { > + printf("\n|}\n\n| valign=\"top\"|\n\n" BOARD_TH); > + j = 0; > + } > + } > + > + printf("\n|}\n\n|}\n"); > +} > + > +static void wiki_helper2(const char *heading) > +{ > + int i, j, boardcount = 0, color = 1; > + struct board_pciid_enable *b; > + > + printf("\n'''%s'''\n\n{| border=\"0\" " > + "valign=\"top\"\n| valign=\"top\"|\n\n%s", heading, BOARD_TH2); > + > + for (b = board_pciid_enables; b->vendor_name != NULL; b++) > + boardcount++; > + > + b = board_pciid_enables; > + for (i = 0, j = 0; b[i].vendor_name != NULL; i++, j++) { > + /* Alternate colors if the vendor changes. */ > + if (i > 0 && strcmp(b[i].vendor_name, b[i - 1].vendor_name)) > + color = !color; > + > + printf("|- bgcolor=\"#%s\" valign=\"top\"\n| %s\n| %s\n| " > + "%s%s%s%s\n| {{OK}}\n", (color) ? "eeeeee" : "dddddd", > + b[i].vendor_name, b[i].board_name, > + (b[i].lb_vendor) ? "-m " : "—", > + (b[i].lb_vendor) ? b[i].lb_vendor : "", > + (b[i].lb_vendor) ? ":" : "", > + (b[i].lb_vendor) ? b[i].lb_part : ""); > + > + /* Split table in two columns. */ > + if (j >= (boardcount / 2 + 1)) { > + printf("\n|}\n\n| valign=\"top\"|\n\n" BOARD_TH2); > To be honest, I don't understand the criteria of how the string above was split into a string and a #defined string. > + j = 0; > + } > + } > + > + printf("\n|}\n\n|}\n"); > +} > + > +#define BOARD_INTRO "\ > +\n== Supported mainboards ==\n\n\ > +In general, it is very likely that flashrom works out of the box even if > your \ > +mainboard is not listed below.\n\nThis is a list of mainboards where we have > \ > +verified that they either do or do not need any special initialization to \ > +make flashrom work (given flashrom supports the respective chipset and flash > \ > +chip), or that they do not yet work at all. If they do not work, support may > \ > +or may not be added later.\n\n\ > +Mainboards which don't appear in the list may or may not work (we don't \ > +know, someone has to give it a try). Please report any further verified \ > +mainboards on the [[Mailinglist|mailing list]].\n" > Maybe insert that statement into the printf instead? Same for all other multiline statements. > + > +void print_supported_boards_wiki(void) > +{ > + printf("%s", BOARD_INTRO); > + wiki_helper("Known good (worked out of the box)", "OK", 3, boards_ok); > + wiki_helper2("Known good (with write-enable code in flashrom)"); > + wiki_helper("Not supported (yet)", "No", 1, boards_no); > +} > + > +#define CHIP_TH "{| border=\"0\" style=\"font-size: smaller\" > valign=\"top\"\n\ > +|- bgcolor=\"#6699dd\"\n! align=\"left\" | Vendor\n\ > +! align=\"left\" | Flash part\n! align=\"left\" colspan=\"4\" | Status\n\n\ > +|- bgcolor=\"#6699ff\"\n| colspan=\"2\" | \n\ > +| Probe\n| Read\n| Write\n| Erase\n\n" > + > +void print_supported_chips_wiki(void) > +{ > + int i = 0, c = 1, chipcount = 0; > + struct flashchip *f, *old = NULL; > + > + printf("\n== Supported chips ==\n\n{| border=\"0\" valign=\"top\"\n" > + "| valign=\"top\"|\n\n" CHIP_TH); > + > + for (f = flashchips; f->name != NULL; f++) > + chipcount++; > + > + for (f = flashchips; f->name != NULL; f++, i++) { > + /* Alternate colors if the vendor changes. */ > + if (old != NULL && strcmp(old->vendor, f->vendor)) > + c = !c; > + > + printf("|- bgcolor=\"#%s\" valign=\"top\"\n| %s" > + "\n| %s\n| {{%s}}\n| {{%s}}\n| {{%s}}\n| {{%s}}\n", > + (c == 1) ? "eeeeee" : "dddddd", f->vendor, f->name, > + ((f->tested & TEST_OK_PROBE) ? "OK" : (c) ? "?2" : "?"), > + ((f->tested & TEST_OK_READ) ? "OK" : (c) ? "?2" : "?"), > + ((f->tested & TEST_OK_ERASE) ? "OK" : (c) ? "?2" : "?"), > + ((f->tested & TEST_OK_WRITE) ? "OK" : (c) ? "?2" : "?")); > + > + /* Split table into three columns. */ > + if (i >= (chipcount / 3 + 1)) { > + printf("\n|}\n\n| valign=\"top\"|\n\n" CHIP_TH); > + i = 0; > + } > + > + old = f; > + } > + > + printf("\n|}\n\n|}\n"); > +} > Index: chipset_enable.c > =================================================================== > --- chipset_enable.c (Revision 498) > +++ chipset_enable.c (Arbeitskopie) > @@ -33,6 +33,7 @@ > #include <sys/mman.h> > #include <fcntl.h> > #include <unistd.h> > +#include <string.h> > #include "flash.h" > > unsigned long flashbase = 0; > @@ -903,20 +904,8 @@ > return 0; > } > > -typedef struct penable { > - uint16_t vendor_id; > - uint16_t device_id; > - int status; > - const char *vendor_name; > - const char *device_name; > - int (*doit) (struct pci_dev *dev, const char *name); > -} FLASH_ENABLE; > - > -#define OK 0 > -#define NT 1 /* Not tested */ > - > /* Please keep this list alphabetically sorted by vendor/device. */ > -static const FLASH_ENABLE enables[] = { > +const FLASH_ENABLE enables[] = { > {0x10B9, 0x1533, OK, "ALi", "M1533", enable_flash_ali_m1533}, > {0x1022, 0x7440, OK, "AMD", "AMD-768", enable_flash_amd8111}, > {0x1022, 0x7468, OK, "AMD", "AMD8111", enable_flash_amd8111}, > @@ -993,6 +982,8 @@ > {0x1106, 0x3372, OK, "VIA", "VT8237S", > enable_flash_vt8237s_spi}, > {0x1106, 0x0586, OK, "VIA", "VT82C586A/B", enable_flash_amd8111}, > {0x1106, 0x0686, NT, "VIA", "VT82C686A/B", enable_flash_amd8111}, > + > + {0x0000, 0x0000, 0, NULL, NULL, NULL}, > }; > > void print_supported_chipsets(void) > @@ -1001,11 +992,12 @@ > > printf("\nSupported chipsets:\n\n"); > > - for (i = 0; i < ARRAY_SIZE(enables); i++) > + for (i = 0; enables[i].vendor_name != NULL; i++) { > Good find! > printf("%s %s [%04x:%04x]%s\n", enables[i].vendor_name, > enables[i].device_name, enables[i].vendor_id, > enables[i].device_id, > (enables[i].status == OK) ? "" : " (untested)"); > + } > } > > int chipset_flash_enable(void) > @@ -1015,7 +1007,7 @@ > int i; > > /* Now let's try to find the chipset we have... */ > - for (i = 0; i < ARRAY_SIZE(enables); i++) { > + for (i = 0; enables[i].vendor_name != NULL; i++) { > dev = pci_dev_find(enables[i].vendor_id, enables[i].device_id); > if (dev) > break; > Index: flashrom.c > =================================================================== > --- flashrom.c (Revision 498) > +++ flashrom.c (Arbeitskopie) > @@ -292,7 +292,7 @@ > > void usage(const char *name) > { > - printf("usage: %s [-rwvEVfLhR] [-c chipname] [-s exclude_start]\n", > + printf("usage: %s [-rwvEVfLzhR] [-c chipname] [-s exclude_start]\n", > name); > printf(" [-e exclude_end] [-m [vendor:]part] [-l file.layout] [-i > imagename] [file]\n"); > printf("Please note that the command line interface for flashrom will " > @@ -313,6 +313,7 @@ > " -l | --layout <file.layout>: read rom layout from file\n" > " -i | --image <name>: only flash image name from > flash layout\n" > " -L | --list-supported: print supported devices\n" > + " -z | --list-supported-wiki: print supported devices in > wiki syntax\n" > " -p | --programmer <name>: specify the programmer > device\n" > " -h | --help: print this help text\n" > " -R | --version: print the version > (release)\n" > @@ -337,6 +338,7 @@ > int option_index = 0; > int force = 0; > int read_it = 0, write_it = 0, erase_it = 0, verify_it = 0; > + int list_supported = 0, list_supported_wiki = 0; > int ret = 0, i; > > static struct option long_options[] = { > @@ -353,6 +355,7 @@ > {"layout", 1, 0, 'l'}, > {"image", 1, 0, 'i'}, > {"list-supported", 0, 0, 'L'}, > + {"list-supported-wiki", 0, 0, 'z'}, > {"programmer", 1, 0, 'p'}, > {"help", 0, 0, 'h'}, > {"version", 0, 0, 'R'}, > @@ -375,7 +378,7 @@ > } > > setbuf(stdout, NULL); > - while ((opt = getopt_long(argc, argv, "rRwvVEfc:s:e:m:l:i:p:Lh", > + while ((opt = getopt_long(argc, argv, "rRwvVEfc:s:e:m:l:i:p:Lzh", > long_options, &option_index)) != EOF) { > switch (opt) { > case 'r': > @@ -429,11 +432,11 @@ > find_romentry(tempstr); > break; > case 'L': > - print_supported_chips(); > - print_supported_chipsets(); > - print_supported_boards(); > - exit(0); > + list_supported = 1; > break; > + case 'z': > + list_supported_wiki = 1; > + break; > case 'p': > if (strncmp(optarg, "internal", 8) == 0) { > programmer = PROGRAMMER_INTERNAL; > @@ -455,6 +458,21 @@ > } > } > > + if (list_supported) { > + print_supported_chips(); > + print_supported_chipsets(); > + print_supported_boards(); > + exit(0); > + } > + > + if (list_supported_wiki) { > + printf("= Supported devices =\n"); > + print_supported_chips_wiki(); > + print_supported_chipsets_wiki(); > + print_supported_boards_wiki(); > + exit(0); > + } > + > if (read_it && write_it) { > printf("Error: -r and -w are mutually exclusive.\n"); > usage(argv[0]); > Index: board_enable.c > =================================================================== > --- board_enable.c (Revision 498) > +++ board_enable.c (Arbeitskopie) > @@ -645,50 +645,6 @@ > return 0; > } > > -/** > - * We use 2 sets of IDs here, you're free to choose which is which. This > - * is to provide a very high degree of certainty when matching a board on > - * the basis of subsystem/card IDs. As not every vendor handles > - * subsystem/card IDs in a sane manner. > - * > - * Keep the second set NULLed if it should be ignored. Keep the subsystem IDs > - * NULLed if they don't identify the board fully. But please take care to > - * provide an as complete set of pci ids as possible; autodetection is the > - * preferred behaviour and we would like to make sure that matches are > unique. > - * > - * The coreboot ids are used two fold. When running with a coreboot firmware, > - * the ids uniquely matches the coreboot board identification string. When a > - * legacy bios is installed and when autodetection is not possible, these ids > - * can be used to identify the board through the -m command line argument. > - * > - * When a board is identified through its coreboot ids (in both cases), the > - * main pci ids are still required to match, as a safeguard. > - */ > -struct board_pciid_enable { > - /* Any device, but make it sensible, like the ISA bridge. */ > - uint16_t first_vendor; > - uint16_t first_device; > - uint16_t first_card_vendor; > - uint16_t first_card_device; > - > - /* Any device, but make it sensible, like > - * the host bridge. May be NULL. > - */ > - uint16_t second_vendor; > - uint16_t second_device; > - uint16_t second_card_vendor; > - uint16_t second_card_device; > - > - /* The vendor / part name from the coreboot table. */ > - const char *lb_vendor; > - const char *lb_part; > - > - const char *vendor_name; > - const char *board_name; > - > - int (*enable) (const char *name); > -}; > - > /* Please keep this list alphabetically ordered by vendor/board name. */ > struct board_pciid_enable board_pciid_enables[] = { > /* first pci-id set [4], second pci-id set [4], > coreboot id [2], vendor name board name flash enable */ > @@ -728,26 +684,131 @@ > { 0, 0, 0, 0, 0, 0, 0, 0, NULL, > NULL, NULL, NULL, NULL}, /* end marker > */ > }; > > +/* Please keep this list alphabetically ordered by vendor/board. */ > +const struct board_info boards_ok[] = { > + /* Verified working boards that don't need write-enables. */ > + { "Abit", "AX8", > "http://www.abit.com.tw/page/en/motherboard/motherboard_detail.php?DEFTITLE=Y&fMTYPE=Socket%20939&pMODEL_NAME=AX8" > }, > + { "Advantech", "PCM-5820", > "http://taiwan.advantech.com.tw/products/Model_Detail.asp?model_id=1-1TGZL8&BU=ACG&PD=" > }, > + { "ASI", "MB-5BLMP", > "http://www.hojerteknik.com/winnet.htm" }, > + { "ASUS", "A8N-E", > "http://www.asus.com.tw/products.aspx?l1=3&l2=15&l3=171&l4=0&model=455&modelmenu=2" > }, > + { "ASUS", "A8NE-FM/S", > "http://www.hardwareschotte.de/hardware/preise/proid_1266090/preis_ASUS+A8NE-FM" > }, > + { "ASUS", "A8N-SLI Premium", > "http://www.asus.com.tw/products.aspx?l1=3&l2=15&l3=148&l4=0&model=539&modelmenu=1" > }, > + { "ASUS", "A8V-E Deluxe", > "http://www.asus.com.tw/products.aspx?l1=3&l2=15&l3=143&l4=0&model=376&modelmenu=1" > }, > + { "ASUS", "M2A-VM", > "http://www.asus.com.tw/products.aspx?l1=3&l2=101&l3=496&l4=0&model=1568&modelmenu=1" > }, > + { "ASUS", "M2N-E", > "http://www.asus.com/products.aspx?l1=3&l2=101&l3=308&l4=0&model=1181&modelmenu=1" > }, > + { "ASUS", "P2B", > "http://www.motherboard.cz/mb/asus/P2B.htm" }, > + { "ASUS", "P2B-F", > "http://www.motherboard.cz/mb/asus/P2B-F.htm" }, > + { "ASUS", "P2B-D", > "ftp://ftp.asus.com.tw/pub/ASUS/mb/slot1/440bx/p2b-d/" }, > + { "ASUS", "P2B-DS", > "ftp://ftp.asus.com.tw/pub/ASUS/mb/slot1/440bx/p2b-ds/" }, > + { "ASUS", "A7V400-MX", > "http://www.asus.com.tw/products.aspx?l1=3&l2=13&l3=63&l4=0&model=228&modelmenu=1" > }, > + { "ASUS", "A7V8X-MX", > "http://www.asus.com.tw/products.aspx?l1=3&l2=13&l3=64&l4=0&model=229&modelmenu=1" > }, > + { "ASUS", "P4B266", > "http://www.ciao.co.uk/ASUS_Intel_845D_Chipset_P4B266__5409807#productdetail" > }, > + { "ASUS", "A8V-E SE", > "http://www.asus.com.tw/products.aspx?l1=3&l2=15&l3=143&l4=0&model=576&modelmenu=1" > }, > + { "ASUS", "P2L97-S", > "http://www.motherboard.cz/mb/asus/P2L97-S.htm" }, > + { "ASUS", "M2A-MX", > "http://www.asus.com/products.aspx?l1=3&l2=101&l3=583&l4=0&model=1909&modelmenu=1" > }, > + { "A-Trend", "ATC-6220", > "http://www.motherboard.cz/mb/atrend/atc6220.htm" }, > + { "BCOM", "WinNET100", > "http://www.coreboot.org/BCOM_WINNET100_Build_Tutorial" }, > + { "GIGABYTE", "GA-6BXC", > "http://www.gigabyte.com.tw/Products/Motherboard/Products_Spec.aspx?ClassValue=Motherboard&ProductID=1445&ProductName=GA-6BXC" > }, > + { "GIGABYTE", "GA-6BXDU", > "http://www.gigabyte.com.tw/Products/Motherboard/Products_Spec.aspx?ProductID=1429" > }, > + { "MSI", "KT4V", NULL }, > + { "MSI", "MS-7046", NULL }, > + { "MSI", "MS-7065", NULL }, > + { "MSI", "MS-7236 (945PL Neo3)", > "http://global.msi.com.tw/index.php?func=prodmbspec&maincat_no=1&cat2_no=&cat3_no=&prod_no=1173#menu" > }, > + { "NEC", "PowerMate 2000", > "http://support.necam.com/mobilesolutions/hardware/Desktops/pm2000/celeron/" > }, > + { "PC Engines", "Alix.1c", > "http://pcengines.ch/alix1c.htm" }, > + { "PC Engines", "Alix.2c2", > "http://pcengines.ch/alix2c2.htm" }, > + { "PC Engines", "Alix.2c3", > "http://pcengines.ch/alix2c3.htm" }, > + { "PC Engines", "Alix.3c3", > "http://pcengines.ch/alix3c3.htm" }, > + { "RCA", "RM4100", > "http://www.settoplinux.org" }, > + { "Sun", "Blade x6250", > "http://www.sun.com/servers/blades/x6250/" }, > + { "Thomson", "IP1000", > "http://www.settoplinux.org" }, > + { "T-Online", "S-100", > "http://wiki.freifunk-hannover.de/T-Online_S_100" }, > + { "Tyan", "S1846", > "http://www.tyan.com/archive/products/html/tsunamiatx.html" }, > + { "Tyan", "S2498 (Tomcat K7M)", > "http://www.tyan.com/archive/products/html/tomcatk7m.html" }, > + { "Tyan", "S2881", > "http://www.tyan.com/product_board_detail.aspx?pid=115" }, > + { "Tyan", "S2882", > "http://www.tyan.com/product_board_detail.aspx?pid=121" }, > + { "Tyan", "S2882-D", > "http://www.tyan.com/product_board_detail.aspx?pid=127" }, > + { "Tyan", "S3095", > "http://www.tyan.com/product_board_detail.aspx?pid=181" }, > + { "Tyan", "S5180", > "http://www.tyan.com/product_board_detail.aspx?pid=456" }, > + { "Tyan", "S5191", > "http://www.tyan.com/product_board_detail.aspx?pid=343" }, > + { "Tyan", "S5197", > "http://www.tyan.com/product_board_detail.aspx?pid=349" }, > + { "Tyan", "S5211", > "http://www.tyan.com/product_board_detail.aspx?pid=591" }, > + { "Tyan", "S5211-1U", > "http://www.tyan.com/product_board_detail.aspx?pid=593" }, > + { "Tyan", "S5220", > "http://www.tyan.com/product_board_detail.aspx?pid=597" }, > + { "Tyan", "S5375", > "http://www.tyan.com/product_board_detail.aspx?pid=566" }, > + { "Tyan", "iS5375-1U", > "http://www.tyan.com/product_board_detail.aspx?pid=610" }, > + { "Tyan", > "S5376G2NR/S5376WAG2NR","http://www.tyan.com/product_board_detail.aspx?pid=605" > }, > + { "Tyan", "S5377", > "http://www.tyan.com/product_board_detail.aspx?pid=601" }, > + { "Tyan", "S5397", > "http://www.tyan.com/product_board_detail.aspx?pid=560" }, > + { "VIA", "EPIA-M", > "http://www.via.com.tw/en/products/mainboards/motherboards.jsp?motherboard_id=81" > }, > + { "VIA", "EPIA-MII", > "http://www.via.com.tw/en/products/mainboards/motherboards.jsp?motherboard_id=202" > }, > + { "VIA", "EPIA-CN", > "http://www.via.com.tw/en/products/mainboards/motherboards.jsp?motherboard_id=400" > }, > + { "VIA", "EPIA-LN", > "http://www.via.com.tw/en/products/mainboards/motherboards.jsp?motherboard_id=473" > }, > + { "VIA", "VB700X", > "http://www.via.com.tw/en/products/mainboards/motherboards.jsp?motherboard_id=490" > }, > + { "VIA", "NAB74X0", > "http://www.via.com.tw/en/products/mainboards/motherboards.jsp?motherboard_id=590" > }, > + { "VIA", "pc2500e", > "http://www.via.com.tw/en/initiatives/empowered/pc2500_mainboard/index.jsp" }, > + { NULL, NULL, 0 }, > +}; > + > +/* Please keep this list alphabetically ordered by vendor/board. */ > +const struct board_info boards_no[] = { > + /* Verified non-working boards (for now). */ > + { "ASUS", "A7N8X-E Deluxe", > "http://www.asus.com/products.aspx?l1=3&l2=13&l3=56&l4=0&model=217&modelmenu=1" > }, > + { "ASUS", "MEW-AM", > "ftp://ftp.asus.com.tw/pub/ASUS/mb/sock370/810/mew-am/" }, > + { "ASUS", "MEW-VM", > "http://www.elhvb.com/mboards/OEM/HP/manual/ASUS%20MEW-VM.htm" }, > + { "ASUS", "P3B-F", > "ftp://ftp.asus.com.tw/pub/ASUS/mb/slot1/440bx/p3b-f/" }, > + { "Biostar", "M6TBA", > "ftp://ftp.biostar-usa.com/manuals/M6TBA/" }, > + { "FIC", "VA-502", > "ftp://ftp.fic.com.tw/motherboard/manual/socket7/va-502/" }, > + { "MSI", "MS-7260 (K9N Neo)", > "http://global.msi.com.tw/index.php?func=proddesc&prod_no=255&maincat_no=1" }, > + { "PCCHIPS", "M537DMA33", > "http://motherboards.mbarron.net/models/pcchips/m537dma.htm" }, > + { "Soyo", "SY-5VD", > "http://www.soyo.com/content/Downloads/163/&c=80&p=464&l=English" }, > + { "Sun", "Fire x4540", > "http://www.sun.com/servers/x64/x4540/" }, > + { "Sun", "Fire x4150", > "http://www.sun.com/servers/x64/x4150/" }, > + { "Sun", "Fire x4200", > "http://www.sun.com/servers/entry/x4200/" }, > + { "Sun", "Fire x4600", > "http://www.sun.com/servers/x64/x4600/" }, > + { NULL, NULL, 0 }, > +}; > I still don't like the fact that files outside wikify.c are polluted with URLs. > + > +void print_supported_boards_helper(const struct board_info *b) > +{ > + int i, j; > + > + for (i = 0; b[i].vendor != NULL; i++) { > + printf("%s", b[i].vendor); > + for (j = 0; j < 25 - strlen(b[i].vendor); j++) > + printf(" "); > + printf("%s", b[i].name); > + for (j = 0; j < 23 - strlen(b[i].name); j++) > + printf(" "); > + printf("%s\n", (verbose) ? (b[i].url) ? b[i].url : "" : ""); > + } > +} > + > void print_supported_boards(void) > { > - int i; > + int i, j; > + struct board_pciid_enable *b = board_pciid_enables; > > - printf("\nSupported mainboards (this list is not exhaustive!):\n\n"); > - > - for (i = 0; board_pciid_enables[i].vendor_name != NULL; i++) { > - if (board_pciid_enables[i].lb_vendor != NULL) { > - printf("%s %s (-m %s:%s)\n", > - board_pciid_enables[i].vendor_name, > - board_pciid_enables[i].board_name, > - board_pciid_enables[i].lb_vendor, > - board_pciid_enables[i].lb_part); > - } else { > - printf("%s %s (autodetected)\n", > - board_pciid_enables[i].vendor_name, > - board_pciid_enables[i].board_name); > - } > + printf("\nSupported boards which need write-enable code:\n\n"); > + for (i = 0; b[i].vendor_name != NULL; i++) { > + printf("%s", b[i].vendor_name); > + for (j = 0; j < 25 - strlen(b[i].vendor_name); j++) > + printf(" "); > + printf("%s", b[i].board_name); > + for (j = 0; j < 25 - strlen(b[i].board_name); j++) > + printf(" "); > + if (b[i].lb_vendor != NULL) > + printf("(-m %s:%s)\n", b[i].lb_vendor, b[i].lb_part); > + else > + printf("(autodetected)\n"); > } > > + printf("\nSupported boards which don't need write-enable code:\n\n"); > + print_supported_boards_helper(boards_ok); > + > + printf("\nBoards which have been verified to NOT work (yet):\n\n"); > + print_supported_boards_helper(boards_no); > + > printf("\nSee also: http://coreboot.org/Flashrom\n"); > } > > > In general, it seems you used #defines for strings quite heavily and sometimes the criteria for splitting a string into multiple strings (some of them as #define) is not clear to me. I'd feel better if these strigns were either placed inside the printfs as literal strings or at least declared const strings, removing the #defines. Moving the code to wikify.c helped me a lot when reviewing the patch. It also allows other coders to ignore the wiki stuff without it ruining readability of the code in files outside wikify.c (yes, I consider wiki table code to be horrible). Thank you for keeping the other files clean! I think the code is committable after one more iteration, but I still don't know whether to cry when I look at the URLs in arrays and would appreciate it a lot if you could kill the URLs from arrays outside wikify.c. Regards, Carl-Daniel -- http://www.hailfinger.org/ -- coreboot mailing list: [email protected] http://www.coreboot.org/mailman/listinfo/coreboot

