blob: 8c0e06d176c91220106f509fd9306032b3a884cf [file] [log] [blame]
Carl-Daniel Hailfinger9c8476b2009-09-16 12:19:03 +00001/*
2 * This file is part of the flashrom project.
3 *
4 * Copyright (C) 2009 Uwe Hermann <uwe@hermann-uwe.de>
5 * Copyright (C) 2009 Carl-Daniel Hailfinger
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
Peter Lemenkov4adf8a62010-06-01 10:13:17 +000022#include <stdio.h>
Carl-Daniel Hailfinger9c8476b2009-09-16 12:19:03 +000023#include <string.h>
24#include <stdlib.h>
25#include <time.h>
26#include "flash.h"
27#include "flashchips.h"
28
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +000029static const char * const wiki_header = "= Supported devices =\n\n\
Carl-Daniel Hailfinger9c8476b2009-09-16 12:19:03 +000030<div style=\"margin-top:0.5em; padding:0.5em 0.5em 0.5em 0.5em; \
31background-color:#eeeeee; align:right; border:1px solid #aabbcc;\"><small>\n\
32Please do '''not''' edit these tables in the wiki directly, they are \
33generated by pasting '''flashrom -z''' output.<br />\
34'''Last update:''' %s(generated by flashrom %s)\n</small></div>\n";
35
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +000036#if CONFIG_INTERNAL == 1
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +000037static const char * const chipset_th = "{| border=\"0\" style=\"font-size: smaller\"\n\
Carl-Daniel Hailfinger9c8476b2009-09-16 12:19:03 +000038|- bgcolor=\"#6699dd\"\n! align=\"left\" | Vendor\n\
39! align=\"left\" | Southbridge\n! align=\"left\" | PCI IDs\n\
40! align=\"left\" | Status\n\n";
41
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +000042static const char * const board_th = "{| border=\"0\" style=\"font-size: smaller\" \
Carl-Daniel Hailfinger9c8476b2009-09-16 12:19:03 +000043valign=\"top\"\n|- bgcolor=\"#6699dd\"\n! align=\"left\" | Vendor\n\
Peter Lemenkov4adf8a62010-06-01 10:13:17 +000044! align=\"left\" | Mainboard\n! align=\"left\" | Required option\n! align=\"left\" | Status\n\n";
Carl-Daniel Hailfinger9c8476b2009-09-16 12:19:03 +000045
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +000046static const char * const board_intro = "\
Carl-Daniel Hailfinger9c8476b2009-09-16 12:19:03 +000047\n== Supported mainboards ==\n\n\
48In general, it is very likely that flashrom works out of the box even if your \
49mainboard is not listed below.\n\nThis is a list of mainboards where we have \
50verified that they either do or do not need any special initialization to \
51make flashrom work (given flashrom supports the respective chipset and flash \
52chip), or that they do not yet work at all. If they do not work, support may \
53or may not be added later.\n\n\
54Mainboards which don't appear in the list may or may not work (we don't \
55know, someone has to give it a try). Please report any further verified \
56mainboards on the [[Mailinglist|mailing list]].\n";
Carl-Daniel Hailfinger8841d3e2010-05-15 15:04:37 +000057#endif
Carl-Daniel Hailfinger9c8476b2009-09-16 12:19:03 +000058
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +000059static const char * const chip_th = "{| border=\"0\" style=\"font-size: smaller\" \
Carl-Daniel Hailfinger9c8476b2009-09-16 12:19:03 +000060valign=\"top\"\n|- bgcolor=\"#6699dd\"\n! align=\"left\" | Vendor\n\
61! align=\"left\" | Device\n! align=\"left\" | Size / KB\n\
62! align=\"left\" | Type\n! align=\"left\" colspan=\"4\" | Status\n\n\
63|- bgcolor=\"#6699ff\"\n| colspan=\"4\" | &nbsp;\n\
Carl-Daniel Hailfinger26f72a12010-01-18 07:02:19 +000064| Probe\n| Read\n| Erase\n| Write\n\n";
Carl-Daniel Hailfinger9c8476b2009-09-16 12:19:03 +000065
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +000066static const char * const programmer_section = "\
Carl-Daniel Hailfinger9c8476b2009-09-16 12:19:03 +000067\n== Supported programmers ==\n\nThis is a list \
68of supported PCI devices flashrom can use as programmer:\n\n{| border=\"0\" \
69valign=\"top\"\n| valign=\"top\"|\n\n{| border=\"0\" style=\"font-size: \
70smaller\" valign=\"top\"\n|- bgcolor=\"#6699dd\"\n! align=\"left\" | Vendor\n\
71! align=\"left\" | Device\n! align=\"left\" | PCI IDs\n\
72! align=\"left\" | Status\n\n";
73
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +000074#if CONFIG_INTERNAL == 1
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +000075static const char * const laptop_intro = "\n== Supported laptops/notebooks ==\n\n\
Carl-Daniel Hailfinger9c8476b2009-09-16 12:19:03 +000076In general, flashing laptops is more difficult because laptops\n\n\
77* often use the flash chip for stuff besides the BIOS,\n\
78* often have special protection stuff which has to be handled by flashrom,\n\
79* often use flash translation circuits which need drivers in flashrom.\n\n\
80<div style=\"margin-top:0.5em; padding:0.5em 0.5em 0.5em 0.5em; \
81background-color:#ff6666; align:right; border:1px solid #000000;\">\n\
82'''IMPORTANT:''' At this point we recommend to '''not''' use flashrom on \
83untested laptops unless you have a means to recover from a flashing that goes \
84wrong (a working backup flash chip and/or good soldering skills).\n</div>\n";
85
Uwe Hermanna6d9c4b2010-05-24 15:28:12 +000086static void print_supported_chipsets_wiki(int cols)
Carl-Daniel Hailfinger9c8476b2009-09-16 12:19:03 +000087{
88 int i, j, enablescount = 0, color = 1;
89 const struct penable *e;
90
91 for (e = chipset_enables; e->vendor_name != NULL; e++)
92 enablescount++;
93
94 printf("\n== Supported chipsets ==\n\nTotal amount of supported "
95 "chipsets: '''%d'''\n\n{| border=\"0\" valign=\"top\"\n| "
96 "valign=\"top\"|\n\n%s", enablescount, chipset_th);
97
98 e = chipset_enables;
99 for (i = 0, j = 0; e[i].vendor_name != NULL; i++, j++) {
100 /* Alternate colors if the vendor changes. */
101 if (i > 0 && strcmp(e[i].vendor_name, e[i - 1].vendor_name))
102 color = !color;
103
Uwe Hermanna6d9c4b2010-05-24 15:28:12 +0000104 printf("|- bgcolor=\"#%s\"\n| %s || %s "
Carl-Daniel Hailfinger9c8476b2009-09-16 12:19:03 +0000105 "|| %04x:%04x || %s\n", (color) ? "eeeeee" : "dddddd",
106 e[i].vendor_name, e[i].device_name,
107 e[i].vendor_id, e[i].device_id,
Uwe Hermanna6d9c4b2010-05-24 15:28:12 +0000108 (e[i].status == OK) ? "{{OK}}" : "{{?3}}");
Carl-Daniel Hailfinger9c8476b2009-09-16 12:19:03 +0000109
Uwe Hermanna6d9c4b2010-05-24 15:28:12 +0000110 /* Split table in 'cols' columns. */
111 if (j >= (enablescount / cols + 1)) {
Carl-Daniel Hailfinger9c8476b2009-09-16 12:19:03 +0000112 printf("\n|}\n\n| valign=\"top\"|\n\n%s", chipset_th);
113 j = 0;
114 }
115 }
116
117 printf("\n|}\n\n|}\n");
118}
119
Peter Lemenkov4adf8a62010-06-01 10:13:17 +0000120static void wiki_helper(const char *devicetype, int cols,
121 const struct board_info boards[])
Carl-Daniel Hailfinger9c8476b2009-09-16 12:19:03 +0000122{
Peter Lemenkov4adf8a62010-06-01 10:13:17 +0000123 int i, j, k = 0, boardcount_good = 0, boardcount_bad = 0, color = 1;
124 int num_notes = 0;
Carl-Daniel Hailfinger9c8476b2009-09-16 12:19:03 +0000125 char *notes = calloc(1, 1);
126 char tmp[900 + 1];
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000127 const struct board_pciid_enable *b = board_pciid_enables;
Carl-Daniel Hailfinger9c8476b2009-09-16 12:19:03 +0000128
Peter Lemenkov4adf8a62010-06-01 10:13:17 +0000129 for (i = 0; boards[i].vendor != NULL; i++) {
130 if (boards[i].working)
131 boardcount_good++;
132 else
133 boardcount_bad++;
134 }
Carl-Daniel Hailfinger9c8476b2009-09-16 12:19:03 +0000135
Peter Lemenkov4adf8a62010-06-01 10:13:17 +0000136 printf("\n\nTotal amount of supported %s: '''%d'''. "
137 "Not yet supported (i.e., known-bad): '''%d'''.\n\n"
Carl-Daniel Hailfinger9c8476b2009-09-16 12:19:03 +0000138 "{| border=\"0\" valign=\"top\"\n| valign=\"top\"|\n\n%s",
Peter Lemenkov4adf8a62010-06-01 10:13:17 +0000139 devicetype, boardcount_good, boardcount_bad, board_th);
Carl-Daniel Hailfinger9c8476b2009-09-16 12:19:03 +0000140
Peter Lemenkov4adf8a62010-06-01 10:13:17 +0000141 for (i = 0, j = 0; boards[i].vendor != NULL; i++, j++) {
142
Carl-Daniel Hailfinger9c8476b2009-09-16 12:19:03 +0000143 /* Alternate colors if the vendor changes. */
Peter Lemenkov4adf8a62010-06-01 10:13:17 +0000144 if (i > 0 && strcmp(boards[i].vendor, boards[i - 1].vendor))
Carl-Daniel Hailfinger9c8476b2009-09-16 12:19:03 +0000145 color = !color;
146
Peter Lemenkov4adf8a62010-06-01 10:13:17 +0000147 k = 0;
Carl-Daniel Hailfinger4146ced2010-06-07 11:10:43 +0000148 while ((b[k].vendor_name != NULL) &&
149 (strcmp(b[k].vendor_name, boards[i].vendor) ||
150 strcmp(b[k].board_name, boards[i].name))) {
Peter Lemenkov4adf8a62010-06-01 10:13:17 +0000151 k++;
152 }
Carl-Daniel Hailfinger9c8476b2009-09-16 12:19:03 +0000153
Peter Lemenkov4adf8a62010-06-01 10:13:17 +0000154 printf("|- bgcolor=\"#%s\"\n| %s || %s%s %s%s || %s%s%s%s "
155 "|| {{%s}}", (color) ? "eeeeee" : "dddddd",
156 boards[i].vendor,
157 boards[i].url ? "[" : "",
158 boards[i].url ? boards[i].url : "",
159 boards[i].name,
160 boards[i].url ? "]" : "",
161 b[k].lb_vendor ? "-m " : "&mdash;",
162 b[k].lb_vendor ? b[k].lb_vendor : "",
163 b[k].lb_vendor ? ":" : "",
164 b[k].lb_vendor ? b[k].lb_part : "",
165 (boards[i].working) ? "OK" : "No");
Carl-Daniel Hailfinger9c8476b2009-09-16 12:19:03 +0000166
Peter Lemenkov4adf8a62010-06-01 10:13:17 +0000167 if (boards[i].note) {
Carl-Daniel Hailfinger9c8476b2009-09-16 12:19:03 +0000168 printf("<sup>%d</sup>\n", num_notes + 1);
169 snprintf((char *)&tmp, 900, "<sup>%d</sup> %s<br />\n",
Peter Lemenkov4adf8a62010-06-01 10:13:17 +0000170 1 + num_notes++, boards[i].note);
Carl-Daniel Hailfinger9c8476b2009-09-16 12:19:03 +0000171 notes = strcat_realloc(notes, (char *)&tmp);
172 } else {
173 printf("\n");
174 }
175
176 /* Split table in 'cols' columns. */
Peter Lemenkov4adf8a62010-06-01 10:13:17 +0000177 if (j >= ((boardcount_good + boardcount_bad) / cols + 1)) {
Carl-Daniel Hailfinger9c8476b2009-09-16 12:19:03 +0000178 printf("\n|}\n\n| valign=\"top\"|\n\n%s", board_th);
179 j = 0;
180 }
181 }
182
183 printf("\n|}\n\n|}\n");
184
185 if (num_notes > 0)
186 printf("\n<small>\n%s</small>\n", notes);
187 free(notes);
188}
189
Uwe Hermanna6d9c4b2010-05-24 15:28:12 +0000190static void print_supported_boards_wiki(void)
Carl-Daniel Hailfinger9c8476b2009-09-16 12:19:03 +0000191{
192 printf("%s", board_intro);
Peter Lemenkov4adf8a62010-06-01 10:13:17 +0000193 wiki_helper("boards", 2, boards_known);
Carl-Daniel Hailfinger9c8476b2009-09-16 12:19:03 +0000194
195 printf("%s", laptop_intro);
Peter Lemenkov4adf8a62010-06-01 10:13:17 +0000196 wiki_helper("laptops", 1, laptops_known);
Carl-Daniel Hailfinger9c8476b2009-09-16 12:19:03 +0000197}
Carl-Daniel Hailfinger8841d3e2010-05-15 15:04:37 +0000198#endif
Carl-Daniel Hailfinger9c8476b2009-09-16 12:19:03 +0000199
Uwe Hermanna6d9c4b2010-05-24 15:28:12 +0000200static void print_supported_chips_wiki(int cols)
Carl-Daniel Hailfinger9c8476b2009-09-16 12:19:03 +0000201{
202 int i = 0, c = 1, chipcount = 0;
203 struct flashchip *f, *old = NULL;
204 uint32_t t;
205
206 for (f = flashchips; f->name != NULL; f++)
207 chipcount++;
208
209 printf("\n== Supported chips ==\n\nTotal amount of supported "
210 "chips: '''%d'''\n\n{| border=\"0\" valign=\"top\"\n"
211 "| valign=\"top\"|\n\n%s", chipcount, chip_th);
212
213 for (f = flashchips; f->name != NULL; f++, i++) {
214 /* Don't print "unknown XXXX SPI chip" entries. */
215 if (!strncmp(f->name, "unknown", 7))
216 continue;
217
218 /* Alternate colors if the vendor changes. */
219 if (old != NULL && strcmp(old->vendor, f->vendor))
220 c = !c;
221
222 t = f->tested;
Uwe Hermanna6d9c4b2010-05-24 15:28:12 +0000223 printf("|- bgcolor=\"#%s\"\n| %s || %s || %d "
Carl-Daniel Hailfinger9c8476b2009-09-16 12:19:03 +0000224 "|| %s || {{%s}} || {{%s}} || {{%s}} || {{%s}}\n",
225 (c == 1) ? "eeeeee" : "dddddd", f->vendor, f->name,
226 f->total_size, flashbuses_to_text(f->bustype),
227 (t & TEST_OK_PROBE) ? "OK" :
Uwe Hermanna6d9c4b2010-05-24 15:28:12 +0000228 (t & TEST_BAD_PROBE) ? "No" : "?3",
Carl-Daniel Hailfinger9c8476b2009-09-16 12:19:03 +0000229 (t & TEST_OK_READ) ? "OK" :
Uwe Hermanna6d9c4b2010-05-24 15:28:12 +0000230 (t & TEST_BAD_READ) ? "No" : "?3",
Carl-Daniel Hailfinger9c8476b2009-09-16 12:19:03 +0000231 (t & TEST_OK_ERASE) ? "OK" :
Uwe Hermanna6d9c4b2010-05-24 15:28:12 +0000232 (t & TEST_BAD_ERASE) ? "No" : "?3",
Carl-Daniel Hailfinger9c8476b2009-09-16 12:19:03 +0000233 (t & TEST_OK_WRITE) ? "OK" :
Uwe Hermanna6d9c4b2010-05-24 15:28:12 +0000234 (t & TEST_BAD_WRITE) ? "No" : "?3");
Carl-Daniel Hailfinger9c8476b2009-09-16 12:19:03 +0000235
Uwe Hermanna6d9c4b2010-05-24 15:28:12 +0000236 /* Split table into 'cols' columns. */
237 if (i >= (chipcount / cols + 1)) {
Carl-Daniel Hailfinger9c8476b2009-09-16 12:19:03 +0000238 printf("\n|}\n\n| valign=\"top\"|\n\n%s", chip_th);
239 i = 0;
240 }
241
242 old = f;
243 }
244
245 printf("\n|}\n\n|}\n");
246}
247
Carl-Daniel Hailfingerad3cc552010-07-03 11:02:10 +0000248static void print_supported_pcidevs_wiki(const struct pcidev_status *devs)
Carl-Daniel Hailfinger9c8476b2009-09-16 12:19:03 +0000249{
250 int i = 0;
251 static int c = 0;
252
253 /* Alternate colors if the vendor changes. */
254 c = !c;
255
256 for (i = 0; devs[i].vendor_name != NULL; i++) {
Uwe Hermanna6d9c4b2010-05-24 15:28:12 +0000257 printf("|- bgcolor=\"#%s\"\n| %s || %s || "
Carl-Daniel Hailfinger9c8476b2009-09-16 12:19:03 +0000258 "%04x:%04x || {{%s}}\n", (c) ? "eeeeee" : "dddddd",
259 devs[i].vendor_name, devs[i].device_name,
260 devs[i].vendor_id, devs[i].device_id,
Uwe Hermanna6d9c4b2010-05-24 15:28:12 +0000261 (devs[i].status == NT) ? "?3" : "OK");
Carl-Daniel Hailfinger9c8476b2009-09-16 12:19:03 +0000262 }
263}
264
Carl-Daniel Hailfingerf5292052009-11-17 09:57:34 +0000265void print_supported_wiki(void)
Carl-Daniel Hailfinger9c8476b2009-09-16 12:19:03 +0000266{
267 time_t t = time(NULL);
268
269 printf(wiki_header, ctime(&t), flashrom_version);
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000270#if CONFIG_INTERNAL == 1
Uwe Hermanna6d9c4b2010-05-24 15:28:12 +0000271 print_supported_chips_wiki(2);
272 print_supported_chipsets_wiki(3);
Carl-Daniel Hailfinger9c8476b2009-09-16 12:19:03 +0000273 print_supported_boards_wiki();
Carl-Daniel Hailfinger8841d3e2010-05-15 15:04:37 +0000274#endif
Carl-Daniel Hailfinger9c8476b2009-09-16 12:19:03 +0000275 printf("%s", programmer_section);
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000276#if CONFIG_NIC3COM == 1
Carl-Daniel Hailfinger9c8476b2009-09-16 12:19:03 +0000277 print_supported_pcidevs_wiki(nics_3com);
278#endif
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000279#if CONFIG_NICREALTEK == 1
Uwe Hermann829ed842010-05-24 17:39:14 +0000280 print_supported_pcidevs_wiki(nics_realtek);
281 print_supported_pcidevs_wiki(nics_realteksmc1211);
282#endif
Andrew Morgan74a828a2010-07-21 15:12:07 +0000283#if CONFIG_NICNATSEMI == 1
284 print_supported_pcidevs_wiki(nics_natsemi);
285#endif
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000286#if CONFIG_GFXNVIDIA == 1
Uwe Hermann2b5cb512009-10-06 20:25:48 +0000287 print_supported_pcidevs_wiki(gfx_nvidia);
288#endif
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000289#if CONFIG_DRKAISER == 1
Uwe Hermann07c54c82009-09-25 01:31:51 +0000290 print_supported_pcidevs_wiki(drkaiser_pcidev);
Carl-Daniel Hailfinger9c8476b2009-09-16 12:19:03 +0000291#endif
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000292#if CONFIG_SATASII == 1
Carl-Daniel Hailfinger9c8476b2009-09-16 12:19:03 +0000293 print_supported_pcidevs_wiki(satas_sii);
294#endif
Carl-Daniel Hailfinger71127722010-05-31 15:27:27 +0000295#if CONFIG_ATAHPT == 1
Uwe Hermannddd5c9e2010-02-21 21:17:00 +0000296 print_supported_pcidevs_wiki(ata_hpt);
297#endif
Carl-Daniel Hailfinger9c8476b2009-09-16 12:19:03 +0000298 printf("\n|}\n");
299}
300