123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344 |
- /*
- * This file is part of the flashrom project.
- *
- * Copyright (C) 2009 Uwe Hermann <uwe@hermann-uwe.de>
- * Copyright (C) 2009 Carl-Daniel Hailfinger
- *
- * 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 <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #include <time.h>
- #include "flash.h"
- #include "flashchips.h"
- #include "programmer.h"
- static const char wiki_header[] = "= Supported devices =\n\n\
- <div style=\"margin-top:0.5em; padding:0.5em 0.5em 0.5em 0.5em; \
- background-color:#eeeeee; text-align:right; border:1px solid #aabbcc;\">\
- <small>\n\
- Please do '''not''' edit these tables in the wiki directly, they are \
- generated by pasting '''flashrom -z''' output.<br />\
- '''Last update:''' %s(generated by flashrom %s)\n</small></div>\n";
- #if CONFIG_INTERNAL == 1
- static const char chipset_th[] = "{| border=\"0\" style=\"font-size: smaller\"\n\
- |- bgcolor=\"#6699dd\"\n! align=\"left\" | Vendor\n\
- ! align=\"left\" | Southbridge\n! align=\"center\" | PCI IDs\n\
- ! align=\"center\" | Status\n\n";
- static const char board_th[] = "{| 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=\"center\" | Status\n\n";
- static const char 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 (or individual revisions) 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";
- #endif
- static const char chip_th[] = "{\
- | border=\"0\" style=\"font-size: smaller\" valign=\"top\"\n\
- |- bgcolor=\"#6699dd\"\n\
- ! align=\"left\" | Vendor\n\
- ! align=\"left\" | Device\n\
- ! align=\"center\" | Size [kB]\n\
- ! align=\"center\" | Type\n\
- ! align=\"center\" colspan=\"4\" | Status\n\
- ! align=\"center\" colspan=\"2\" | Voltage [V]\n\n\
- |- bgcolor=\"#6699ff\"\n| colspan=\"4\" | \n\
- | Probe\n| Read\n| Erase\n| Write\n\
- | align=\"center\" | Min \n| align=\"center\" | Max\n\n";
- static const char programmer_section[] = "\
- \n== Supported programmers ==\n\nThis is a list \
- of supported PCI devices flashrom can use as programmer:\n\n{| border=\"0\" \
- valign=\"top\"\n| valign=\"top\"|\n\n{| border=\"0\" style=\"font-size: \
- smaller\" valign=\"top\"\n|- bgcolor=\"#6699dd\"\n! align=\"left\" | Vendor\n\
- ! align=\"left\" | Device\n! align=\"center\" | PCI IDs\n\
- ! align=\"center\" | Status\n\n";
- #if CONFIG_INTERNAL == 1
- static const char laptop_intro[] = "\n== Supported laptops/notebooks ==\n\n\
- In general, flashing laptops is more difficult because laptops\n\n\
- * often use the flash chip for stuff besides the BIOS,\n\
- * often have special protection stuff which has to be handled by flashrom,\n\
- * often use flash translation circuits which need drivers in flashrom.\n\n\
- <div style=\"margin-top:0.5em; padding:0.5em 0.5em 0.5em 0.5em; \
- background-color:#ff6666; align:right; border:1px solid #000000;\">\n\
- '''IMPORTANT:''' At this point we recommend to '''not''' use flashrom on \
- untested laptops unless you have a means to recover from a flashing that goes \
- wrong (a working backup flash chip and/or good soldering skills).\n</div>\n";
- static void print_supported_chipsets_wiki(int cols)
- {
- int i, j, enablescount = 0, color = 1;
- const struct penable *e;
- for (e = chipset_enables; e->vendor_name != NULL; e++)
- enablescount++;
- printf("\n== Supported chipsets ==\n\nTotal amount of supported "
- "chipsets: '''%d'''\n\n{| border=\"0\" valign=\"top\"\n| "
- "valign=\"top\"|\n\n%s", enablescount, chipset_th);
- e = chipset_enables;
- for (i = 0, j = 0; e[i].vendor_name != NULL; i++, j++) {
- /* Alternate colors if the vendor changes. */
- if (i > 0 && strcmp(e[i].vendor_name, e[i - 1].vendor_name))
- color = !color;
- printf("|- bgcolor=\"#%s\"\n| %s || %s "
- "|| %04x:%04x || %s\n", (color) ? "eeeeee" : "dddddd",
- e[i].vendor_name, e[i].device_name,
- e[i].vendor_id, e[i].device_id,
- (e[i].status == OK) ? "{{OK}}" : "{{?3}}");
- /* Split table in 'cols' columns. */
- if (j >= (enablescount / cols + 1)) {
- printf("\n|}\n\n| valign=\"top\"|\n\n%s", chipset_th);
- j = 0;
- }
- }
- printf("\n|}\n\n|}\n");
- }
- static void wiki_helper(const char *devicetype, int cols,
- const struct board_info boards[])
- {
- int i, j, k = 0, boardcount_good = 0, boardcount_bad = 0, color = 1;
- int num_notes = 0;
- char *notes = calloc(1, 1);
- char tmp[900 + 1];
- const struct board_match *b = board_matches;
- for (i = 0; boards[i].vendor != NULL; i++) {
- if (boards[i].working)
- boardcount_good++;
- else
- boardcount_bad++;
- }
- printf("\n\nTotal amount of supported %s: '''%d'''. "
- "Not yet supported (i.e., known-bad): '''%d'''.\n\n"
- "{| border=\"0\" valign=\"top\"\n| valign=\"top\"|\n\n%s",
- devicetype, boardcount_good, boardcount_bad, board_th);
- for (i = 0, j = 0; boards[i].vendor != NULL; i++, j++) {
- /* Alternate colors if the vendor changes. */
- if (i > 0 && strcmp(boards[i].vendor, boards[i - 1].vendor))
- color = !color;
- k = 0;
- while ((b[k].vendor_name != NULL) &&
- (strcmp(b[k].vendor_name, boards[i].vendor) ||
- strcmp(b[k].board_name, boards[i].name))) {
- k++;
- }
- printf("|- bgcolor=\"#%s\"\n| %s || %s%s %s%s || %s%s%s%s "
- "|| {{%s}}", (color) ? "eeeeee" : "dddddd",
- boards[i].vendor,
- boards[i].url ? "[" : "",
- boards[i].url ? boards[i].url : "",
- boards[i].name,
- boards[i].url ? "]" : "",
- b[k].lb_vendor ? "-p internal:mainboards=" : "—",
- b[k].lb_vendor ? b[k].lb_vendor : "",
- b[k].lb_vendor ? ":" : "",
- b[k].lb_vendor ? b[k].lb_part : "",
- (boards[i].working) ? "OK" : "No");
- if (boards[i].note) {
- printf("<sup>%d</sup>\n", num_notes + 1);
- snprintf(tmp, sizeof(tmp), "<sup>%d</sup> %s<br />\n",
- 1 + num_notes++, boards[i].note);
- notes = strcat_realloc(notes, tmp);
- } else {
- printf("\n");
- }
- /* Split table in 'cols' columns. */
- if (j >= ((boardcount_good + boardcount_bad) / cols + 1)) {
- printf("\n|}\n\n| valign=\"top\"|\n\n%s", board_th);
- j = 0;
- }
- }
- printf("\n|}\n\n|}\n");
- if (num_notes > 0)
- printf("\n<small>\n%s</small>\n", notes);
- free(notes);
- }
- static void print_supported_boards_wiki(void)
- {
- printf("%s", board_intro);
- wiki_helper("boards", 2, boards_known);
- printf("%s", laptop_intro);
- wiki_helper("laptops", 1, laptops_known);
- }
- #endif
- static void print_supported_chips_wiki(int cols)
- {
- int i = 0, c = 1, chipcount = 0;
- const struct flashchip *f, *old = NULL;
- uint32_t t;
- char *s;
- char vmax[6];
- char vmin[6];
- for (f = flashchips; f->name != NULL; f++) {
- /* Don't count generic entries. */
- if (!strncmp(f->vendor, "Unknown", 7) ||
- !strncmp(f->vendor, "Programmer", 10) ||
- !strncmp(f->name, "unknown", 7))
- continue;
- chipcount++;
- }
- printf("\n== Supported chips ==\n\nTotal amount of supported "
- "chips: '''%d'''\n\n{| border=\"0\" valign=\"top\"\n"
- "| valign=\"top\"|\n\n%s", chipcount, chip_th);
- for (f = flashchips; f->name != NULL; f++, i++) {
- /* Don't print generic entries. */
- if (!strncmp(f->vendor, "Unknown", 7) ||
- !strncmp(f->vendor, "Programmer", 10) ||
- !strncmp(f->name, "unknown", 7))
- continue;
- /* Alternate colors if the vendor changes. */
- if (old != NULL && strcmp(old->vendor, f->vendor))
- c = !c;
- t = f->tested;
- s = flashbuses_to_text(f->bustype);
- sprintf(vmin, "%0.03f", f->voltage.min / (double)1000);
- sprintf(vmax, "%0.03f", f->voltage.max / (double)1000);
- /* '{{%s}}' is used in combination with 'OK', 'No' and '?3' to
- * select special formatting templates for the bg color. */
- printf("|- bgcolor=\"#%s\"\n| %s || %s || align=\"right\" | %d "
- "|| %s || {{%s}} || {{%s}} || {{%s}} || {{%s}}"
- "|| %s || %s \n",
- (c == 1) ? "eeeeee" : "dddddd", f->vendor, f->name,
- f->total_size, s,
- (t & TEST_OK_PROBE) ? "OK" :
- (t & TEST_BAD_PROBE) ? "No" : "?3",
- (t & TEST_OK_READ) ? "OK" :
- (t & TEST_BAD_READ) ? "No" : "?3",
- (t & TEST_OK_ERASE) ? "OK" :
- (t & TEST_BAD_ERASE) ? "No" : "?3",
- (t & TEST_OK_WRITE) ? "OK" :
- (t & TEST_BAD_WRITE) ? "No" : "?3",
- f->voltage.min ? vmin : "N/A",
- f->voltage.min ? vmax : "N/A");
- free(s);
- /* Split table into 'cols' columns. */
- if (i >= (chipcount / cols + 1)) {
- printf("\n|}\n\n| valign=\"top\"|\n\n%s", chip_th);
- i = 0;
- }
- old = f;
- }
- printf("\n|}\n\n|}\n");
- }
- /* Not needed for CONFIG_INTERNAL, but for all other PCI-based programmers. */
- #if CONFIG_NIC3COM+CONFIG_NICREALTEK+CONFIG_NICNATSEMI+CONFIG_GFXNVIDIA+CONFIG_DRKAISER+CONFIG_SATASII+CONFIG_ATAHPT+CONFIG_NICINTEL+CONFIG_NICINTEL_SPI+CONFIG_OGP_SPI+CONFIG_SATAMV >= 1
- static void print_supported_pcidevs_wiki(const struct pcidev_status *devs)
- {
- int i = 0;
- static int c = 0;
- /* Alternate colors if the vendor changes. */
- c = !c;
- for (i = 0; devs[i].vendor_name != NULL; i++) {
- printf("|- bgcolor=\"#%s\"\n| %s || %s || "
- "%04x:%04x || {{%s}}\n", (c) ? "eeeeee" : "dddddd",
- devs[i].vendor_name, devs[i].device_name,
- devs[i].vendor_id, devs[i].device_id,
- (devs[i].status == NT) ? "?3" : "OK");
- }
- }
- #endif
- void print_supported_wiki(void)
- {
- time_t t = time(NULL);
- printf(wiki_header, ctime(&t), flashrom_version);
- print_supported_chips_wiki(2);
- #if CONFIG_INTERNAL == 1
- print_supported_chipsets_wiki(3);
- print_supported_boards_wiki();
- #endif
- printf("%s", programmer_section);
- #if CONFIG_NIC3COM == 1
- print_supported_pcidevs_wiki(nics_3com);
- #endif
- #if CONFIG_NICREALTEK == 1
- print_supported_pcidevs_wiki(nics_realtek);
- #endif
- #if CONFIG_NICNATSEMI == 1
- print_supported_pcidevs_wiki(nics_natsemi);
- #endif
- #if CONFIG_GFXNVIDIA == 1
- print_supported_pcidevs_wiki(gfx_nvidia);
- #endif
- #if CONFIG_DRKAISER == 1
- print_supported_pcidevs_wiki(drkaiser_pcidev);
- #endif
- #if CONFIG_SATASII == 1
- print_supported_pcidevs_wiki(satas_sii);
- #endif
- #if CONFIG_ATAHPT == 1
- print_supported_pcidevs_wiki(ata_hpt);
- #endif
- #if CONFIG_NICINTEL == 1
- print_supported_pcidevs_wiki(nics_intel);
- #endif
- #if CONFIG_NICINTEL_SPI == 1
- print_supported_pcidevs_wiki(nics_intel_spi);
- #endif
- #if CONFIG_OGP_SPI == 1
- print_supported_pcidevs_wiki(ogp_spi);
- #endif
- #if CONFIG_SATAMV == 1
- print_supported_pcidevs_wiki(satas_mv);
- #endif
- printf("\n|}\n");
- }
|