diff options
author | Stefan Tauner <stefan.tauner@alumni.tuwien.ac.at> | 2012-07-28 03:17:15 +0000 |
---|---|---|
committer | Stefan Tauner <stefan.tauner@alumni.tuwien.ac.at> | 2012-07-28 03:17:15 +0000 |
commit | d94d25d75be771eec26578355dc5c70cfb3e9c73 (patch) | |
tree | d2cb1083a5fa9dd1274213c17bc4ede903913d3d | |
parent | a0fce5f459871840166348de1451fd8cd8bb9cb8 (diff) | |
download | ast2050-flashrom-d94d25d75be771eec26578355dc5c70cfb3e9c73.zip ast2050-flashrom-d94d25d75be771eec26578355dc5c70cfb3e9c73.tar.gz |
Add a bunch of new/tested stuff and various small changes 13
Tested Mainboards:
OK:
- ASRock A780FullHD
http://www.flashrom.org/pipermail/flashrom/2012-July/009599.html
- ASRock 880G Pro3
http://www.flashrom.org/pipermail/flashrom/2012-July/009492.html
- ASRock N61P-S
http://www.flashrom.org/pipermail/flashrom/2012-May/009316.html
- ASUS M2N68-VM
http://www.flashrom.org/pipermail/flashrom/2012-May/009334.html
- ASUS M3N78 PRO
http://www.flashrom.org/pipermail/flashrom/2012-July/009519.html
- ASUS M4N68T V2
http://www.flashrom.org/pipermail/flashrom/2012-May/009277.html
- ASUS M5A78L-M LX
reported by clavile on IRC
- ASUS P8P67 PRO (rev. 3.0)
http://www.flashrom.org/pipermail/flashrom/2012-April/009188.html
- ASUS P8Z68-V
reported by Kano on IRC
http://paste.flashrom.org/view.php?id=1232
- ASUS SABERTOOTH 990FX
http://paste.flashrom.org/view.php?id=1214
- Dell Inspiron 1420
http://www.flashrom.org/pipermail/flashrom/2012-May/009196.html
- ECS GF8200A
http://www.flashrom.org/pipermail/flashrom/2012-May/009256.html
- GIGABYTE GA-H61M-D2H-USB3
http://www.flashrom.org/pipermail/flashrom/2012-May/009333.html
- MSI MS-7250 (K9N SLI (rev 2.1))
http://www.flashrom.org/pipermail/flashrom/2012-June/009436.html
- MSI MS-7676 (Z68MA-G45 (B3))
http://www.flashrom.org/pipermail/flashrom/2012-June/009424.html
- Palit N61S
http://www.flashrom.org/pipermail/flashrom/2012-May/009212.html
NOT OK:
- ASRock H61M-ITX
http://www.flashrom.org/pipermail/flashrom/2012-May/009224.html
- Dell Latitude E6520
http://www.flashrom.org/pipermail/flashrom/2012-May/009197.html
- Dell Vostro 3700
http://www.flashrom.org/pipermail/flashrom/2012-May/009197.html
- Intel DH61AG
http://www.flashrom.org/pipermail/flashrom/2012-June/009417.html
- Intel DQ965GF
http://www.flashrom.org/pipermail/flashrom/2012-May/009295.html
- HP/Compaq 8100 Elite CMT PC (304Bh)
http://paste.flashrom.org/view.php?id=1182
- HP Z400 Workstation (0AE4h)
http://www.flashrom.org/pipermail/flashrom/2012-June/009350.html
- Supermicro X9DR3-F
http://www.flashrom.org/pipermail/flashrom/2012-June/009422.html
Tested flash chips:
- mark AMIC A25L032 as TEST_OK_PREW (+PREW)
http://www.flashrom.org/pipermail/flashrom/2012-June/009363.html
- mark Atmel AT25DF321A as TEST_OK_PREW (+REW)
http://www.flashrom.org/pipermail/flashrom/2012-July/009492.html
- mark Atmel AT26DF161 as TEST_OK_PR (+PR)
http://www.flashrom.org/pipermail/flashrom/2012-June/009350.html
- mark Eon EN25QH16 as TEST_OK_PR (+PR)
http://www.flashrom.org/pipermail/flashrom/2012-July/009566.html
- mark SST SST39VF010 as TEST_OK_PREW (+W)
http://www.flashrom.org/pipermail/flashrom/2012-June/009425.html
- mark ST M25P64 as TEST_OK_PREW (+PREW)
http://www.flashrom.org/pipermail/flashrom/2012-May/009332.html
Tested chipset enables:
- Intel 3420
http://www.flashrom.org/pipermail/flashrom/2012-May/009332.html
- Add board enable for ASUS P5GD2-X
lspci: http://paste.flashrom.org/view.php?id=1234
write: http://paste.flashrom.org/view.php?id=1240
Miscellaneous
- Reorder some boards in print.c.
- Remove broken abit URLs.
- Whitespace changes.
- Fix the maximum number of southbridge straps in the ICH descriptor structs.
- Refine documentation regarding ICH region lock bits.
- Demote verbosity of ICH Opcode reprogramming to -VV.
- Exclude Pony-SPI for DOS targets (missing serial support).
Corresponding to flashrom svn r1554.
Signed-off-by: Stefan Tauner <stefan.tauner@alumni.tuwien.ac.at>
Acked-by: Stefan Tauner <stefan.tauner@alumni.tuwien.ac.at>
-rw-r--r-- | Documentation/mysteries_intel.txt | 19 | ||||
-rw-r--r-- | Makefile | 9 | ||||
-rw-r--r-- | board_enable.c | 1 | ||||
-rw-r--r-- | chipset_enable.c | 2 | ||||
-rw-r--r-- | flashchips.c | 12 | ||||
-rw-r--r-- | ich_descriptors.h | 2 | ||||
-rw-r--r-- | ichspi.c | 4 | ||||
-rw-r--r-- | print.c | 63 |
8 files changed, 78 insertions, 34 deletions
diff --git a/Documentation/mysteries_intel.txt b/Documentation/mysteries_intel.txt index 55921cf..10cb37d 100644 --- a/Documentation/mysteries_intel.txt +++ b/Documentation/mysteries_intel.txt @@ -14,10 +14,18 @@ when trying to touch an address outside of any region. See also http://www.flashrom.org/pipermail/flashrom/2011-August/007606.html -= Unlocking the ME region = += (Un)locking the ME region = If the ME region is locked by the FRAP register in descriptor mode, the host - software is not allowed to read or write any address inside that region. There - are different ways to unlock access: + software is not allowed to read or write any address inside that region. + Although the chipset datasheets specify that "[t]he contents of this register + are that of the Flash Descriptor" [PANTHER], this is not entirely true. + The firmware has to fill at least some of the registers involved. It is not + known when they become read-only or any other details, but there is at least + one HM67-based board, that provides an user-changeable setting in the firmware + user interface to enable ME region updates that lead to a FRAP content that is + not equal to the descriptor region bits [NC9B]. + + There are different ways to unlock access: - A pin strap: Flash Descriptor Security Override Strap (as indicated by the Flash Descriptor Override Pin Strap Status (FDOPSS) in HSFS. That pin is @@ -81,6 +89,11 @@ vendor tools use it for updates. This needs to be investigated further before drawing any conclusion. +[PANTHER] Intel 7 Series Chipset Family Platform Controller Hub (PCH) Datasheet + Document Number: 326776, April 2012, page 857 +[NC9B] Jetway NC9B flashrom v0.9.5.2-r1517 log with ME region unlocked. + NB: "FRAP 0e0f" vs. "FLMSTR1 0a0b". + http://paste.flashrom.org/view.php?id=1215 [MODE_CTRL] Client Platform Enabling Tour: Platform Software Document Number: 439167, Revision 1.2, page 52 [MEBX] Intel Management Engine BIOS Extension (MEBX) User's Guide @@ -73,7 +73,7 @@ CPPFLAGS += -I../libgetopt -I../libpci/include CPPFLAGS += -Wno-format # FIXME Check if we can achieve the same effect with -L../libgetopt -lgetopt LIBS += ../libgetopt/libgetopt.a -# Bus Pirate and Serprog are not supported under DOS (missing serial support). +# Bus Pirate, Serprog and Pony-SPI are not supported under DOS (missing serial support). ifeq ($(CONFIG_BUSPIRATE_SPI), yes) UNSUPPORTED_FEATURES += CONFIG_BUSPIRATE_SPI=yes else @@ -84,6 +84,11 @@ UNSUPPORTED_FEATURES += CONFIG_SERPROG=yes else override CONFIG_SERPROG = no endif +ifeq ($(CONFIG_PONY_SPI), yes) +UNSUPPORTED_FEATURES += CONFIG_PONY_SPI=yes +else +override CONFIG_PONY_SPI = no +endif # Dediprog and FT2232 are not supported under DOS (missing USB support). ifeq ($(CONFIG_DEDIPROG), yes) UNSUPPORTED_FEATURES += CONFIG_DEDIPROG=yes @@ -547,7 +552,7 @@ FEATURE_CFLAGS += $(shell LC_ALL=C grep -q "UTSNAME := yes" .features && printf FEATURE_LIBS += $(shell LC_ALL=C grep -q "NEEDLIBZ := yes" .libdeps && printf "%s" "-lz") LIBFLASHROM_OBJS = $(CHIP_OBJS) $(PROGRAMMER_OBJS) $(LIB_OBJS) -OBJS = $(CLI_OBJS) $(LIBFLASHROM_OBJS) +OBJS = $(CLI_OBJS) $(LIBFLASHROM_OBJS) $(PROGRAM)$(EXEC_SUFFIX): $(OBJS) $(CC) $(LDFLAGS) -o $(PROGRAM)$(EXEC_SUFFIX) $(OBJS) $(FEATURE_LIBS) $(LIBS) diff --git a/board_enable.c b/board_enable.c index 04cb557..3c791b1 100644 --- a/board_enable.c +++ b/board_enable.c @@ -2348,6 +2348,7 @@ const struct board_match board_matches[] = { {0x8086, 0x266a, 0x1043, 0x80a6, 0x8086, 0x2668, 0x1043, 0x814e, "^P5GD1-VM$", NULL, NULL, P3, "ASUS", "P5GD1-VM/S", 0, OK, intel_ich_gpio21_raise}, {0x8086, 0x266a, 0x1043, 0x80a6, 0x8086, 0x2668, 0x1043, 0x814e, NULL, NULL, NULL, P3, "ASUS", "P5GD1(-VM)", 0, NT, intel_ich_gpio21_raise}, {0x8086, 0x266a, 0x1043, 0x80a6, 0x8086, 0x2668, 0x1043, 0x813d, "^P5GD2-Premium$", NULL, NULL, P3, "ASUS", "P5GD2 Premium", 0, OK, intel_ich_gpio21_raise}, + {0x8086, 0x266a, 0x1043, 0x80a6, 0x8086, 0x2668, 0x1043, 0x81a6, "^P5GD2-X$", NULL, NULL, P3, "ASUS", "P5GD2-X", 0, OK, intel_ich_gpio21_raise}, {0x8086, 0x266a, 0x1043, 0x80a6, 0x8086, 0x2668, 0x1043, 0x813d, "^P5GDC-V$", NULL, NULL, P3, "ASUS", "P5GDC-V Deluxe", 0, OK, intel_ich_gpio21_raise}, {0x8086, 0x266a, 0x1043, 0x80a6, 0x8086, 0x2668, 0x1043, 0x813d, "^P5GDC$", NULL, NULL, P3, "ASUS", "P5GDC Deluxe", 0, OK, intel_ich_gpio21_raise}, {0x8086, 0x266a, 0x1043, 0x80a6, 0x8086, 0x2668, 0x1043, 0x813d, NULL, NULL, NULL, P3, "ASUS", "P5GD2/C variants", 0, NT, intel_ich_gpio21_raise}, diff --git a/chipset_enable.c b/chipset_enable.c index 65b2ea9..936d7b8 100644 --- a/chipset_enable.c +++ b/chipset_enable.c @@ -1358,7 +1358,7 @@ const struct penable chipset_enables[] = { {0x8086, 0x3b0e, NT, "Intel", "B55", enable_flash_pch5}, {0x8086, 0x3b0f, OK, "Intel", "QS57", enable_flash_pch5}, {0x8086, 0x3b12, NT, "Intel", "3400", enable_flash_pch5}, - {0x8086, 0x3b14, NT, "Intel", "3420", enable_flash_pch5}, + {0x8086, 0x3b14, OK, "Intel", "3420", enable_flash_pch5}, {0x8086, 0x3b16, NT, "Intel", "3450", enable_flash_pch5}, {0x8086, 0x3b1e, NT, "Intel", "B55", enable_flash_pch5}, {0x8086, 0x5031, OK, "Intel", "EP80579", enable_flash_ich7}, diff --git a/flashchips.c b/flashchips.c index 0c9f6c4..b09727c 100644 --- a/flashchips.c +++ b/flashchips.c @@ -1133,7 +1133,7 @@ const struct flashchip flashchips[] = { .page_size = 256, /* OTP: 64B total; read 0x4B, 0x48; write 0x42 */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, - .tested = TEST_UNTESTED, + .tested = TEST_OK_PREW, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, .block_erasers = @@ -1559,7 +1559,7 @@ const struct flashchip flashchips[] = { .page_size = 256, /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, - .tested = TEST_OK_PROBE, + .tested = TEST_OK_PREW, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, .block_erasers = @@ -1854,7 +1854,7 @@ const struct flashchip flashchips[] = { .total_size = 2048, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, - .tested = TEST_UNTESTED, + .tested = TEST_OK_PR, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, .block_erasers = @@ -3543,7 +3543,7 @@ const struct flashchip flashchips[] = { /* supports SFDP */ /* OTP: 512B total; enter 0x3A */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, - .tested = TEST_UNTESTED, + .tested = TEST_OK_PR, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, .block_erasers = @@ -6739,7 +6739,7 @@ const struct flashchip flashchips[] = { .total_size = 128, .page_size = 4096, .feature_bits = FEATURE_EITHER_RESET, - .tested = TEST_OK_PRE, + .tested = TEST_OK_PREW, .probe = probe_jedec, .probe_timing = 1, /* 150 ns */ .block_erasers = @@ -7549,7 +7549,7 @@ const struct flashchip flashchips[] = { .total_size = 8192, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, - .tested = TEST_UNTESTED, + .tested = TEST_OK_PREW, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, .block_erasers = diff --git a/ich_descriptors.h b/ich_descriptors.h index 34bcc6a..3a44740 100644 --- a/ich_descriptors.h +++ b/ich_descriptors.h @@ -242,7 +242,7 @@ struct ich_desc_north_strap { struct ich_desc_south_strap { union { - uint32_t STRPs[16]; /* current maximum: ibex peak */ + uint32_t STRPs[18]; /* current maximum: cougar point */ struct { /* ich8 */ struct { /* STRP1 */ uint32_t ME_DISABLE :1, @@ -414,7 +414,7 @@ static int reprogram_opcode_on_the_fly(uint8_t opcode, unsigned int writecnt, un curopcodes->opcode[oppos].spi_type = spi_type; program_opcodes(curopcodes, 0); oppos = find_opcode(curopcodes, opcode); - msg_pdbg ("on-the-fly OPCODE (0x%02X) re-programmed, op-pos=%d\n", opcode, oppos); + msg_pdbg2("on-the-fly OPCODE (0x%02X) re-programmed, op-pos=%d\n", opcode, oppos); return oppos; } @@ -535,7 +535,7 @@ static int program_opcodes(OPCODES *op, int enable_undo) opmenu[1] |= ((uint32_t) op->opcode[a].opcode) << ((a - 4) * 8); } - msg_pdbg("\n%s: preop=%04x optype=%04x opmenu=%08x%08x\n", __func__, preop, optype, opmenu[0], opmenu[1]); + msg_pdbg2("\n%s: preop=%04x optype=%04x opmenu=%08x%08x\n", __func__, preop, optype, opmenu[0], opmenu[1]); switch (ich_generation) { case CHIPSET_ICH7: /* Register undo only for enable_undo=1, i.e. first call. */ @@ -552,22 +552,22 @@ void print_supported(void) const struct board_info boards_known[] = { #if defined(__i386__) || defined(__x86_64__) B("A-Trend", "ATC-6220", 1, "http://www.motherboard.cz/mb/atrend/atc6220.htm", NULL), - B("abit", "A-S78H", 1, "http://www.abit.com.tw/page/en/motherboard/motherboard_detail.php?pMODEL_NAME=A-S78H&fMTYPE=Socket+AM2", NULL), - B("abit", "AN-M2", 1, "http://www.abit.com.tw/page/en/motherboard/motherboard_detail.php?DEFTITLE=Y&fMTYPE=Socket%20AM2&pMODEL_NAME=AN-M2", NULL), - B("abit", "AV8", 1, "http://www.abit.com.tw/page/en/motherboard/motherboard_detail.php?DEFTITLE=Y&fMTYPE=Socket%20939&pMODEL_NAME=AV8", NULL), - B("abit", "AX8", 1, "http://www.abit.com.tw/page/en/motherboard/motherboard_detail.php?DEFTITLE=Y&fMTYPE=Socket%20939&pMODEL_NAME=AX8", NULL), - B("abit", "BM6", 1, "http://www.abit.com.tw/page/en/motherboard/motherboard_detail.php?pMODEL_NAME=BM6&fMTYPE=Socket%20370", NULL), - B("abit", "Fatal1ty F-I90HD", 1, "http://www.abit.com.tw/page/en/motherboard/motherboard_detail.php?pMODEL_NAME=Fatal1ty+F-I90HD&fMTYPE=LGA775", NULL), - B("abit", "IC7", 1, "http://www.abit.com.tw/page/en/motherboard/motherboard_detail.php?pMODEL_NAME=IC7&fMTYPE=Socket%20478", NULL), - B("abit", "IP35", 1, "http://www.abit.com.tw/page/en/motherboard/motherboard_detail.php?fMTYPE=LGA775&pMODEL_NAME=IP35", NULL), - B("abit", "IP35 Pro", 1, "http://www.abit.com.tw/page/en/motherboard/motherboard_detail.php?fMTYPE=LGA775&pMODEL_NAME=IP35%20Pro", NULL), - B("abit", "IS-10", 0, "http://www.abit.com.tw/page/en/motherboard/motherboard_detail.php?pMODEL_NAME=IS-10&fMTYPE=Socket+478", "Reported by deejkuba@aol.com to flashrom@coreboot.org, no public archive. Missing board enable and/or M50FW040 unlocking. May work now."), - B("abit", "KN8 Ultra", 1, "http://www.abit.com.tw/page/en/motherboard/motherboard_detail.php?DEFTITLE=Y&fMTYPE=Socket%20939&pMODEL_NAME=KN8%20Ultra", NULL), - B("abit", "NF-M2 nView", 1, "http://www.abit.com.tw/page/en/motherboard/motherboard_detail.php?fMTYPE=Socket%20AM2&pMODEL_NAME=NF-M2%20nView", NULL), - B("abit", "NF-M2S", 1, "http://www.abit.com.tw/page/en/motherboard/motherboard_detail.php?pMODEL_NAME=NF-M2S&fMTYPE=Socket%20AM2", NULL), - B("abit", "NF7-S", 1, "http://www.abit.com.tw/page/en/motherboard/motherboard_detail.php?fMTYPE=Socket%20A&pMODEL_NAME=NF7-S", NULL), - B("abit", "VA6", 1, "http://www.abit.com.tw/page/en/motherboard/motherboard_detail.php?fMTYPE=Slot%201&pMODEL_NAME=VA6", NULL), - B("abit", "VT6X4", 1, "http://www.abit.com.tw/page/en/motherboard/motherboard_detail.php?fMTYPE=Slot%201&pMODEL_NAME=VT6X4", NULL), + B("abit", "A-S78H", 1, NULL, NULL), + B("abit", "AN-M2", 1, NULL, NULL), + B("abit", "AV8", 1, NULL, NULL), + B("abit", "AX8", 1, NULL, NULL), + B("abit", "BM6", 1, NULL, NULL), + B("abit", "Fatal1ty F-I90HD", 1, NULL, NULL), + B("abit", "IC7", 1, NULL, NULL), + B("abit", "IP35", 1, NULL, NULL), + B("abit", "IP35 Pro", 1, NULL, NULL), + B("abit", "IS-10", 0, NULL, "Reported by deejkuba@aol.com to flashrom@coreboot.org, no public archive. Missing board enable and/or M50FW040 unlocking. May work now."), + B("abit", "KN8 Ultra", 1, NULL, NULL), + B("abit", "NF-M2 nView", 1, NULL, NULL), + B("abit", "NF-M2S", 1, NULL, NULL), + B("abit", "NF7-S", 1, NULL, NULL), + B("abit", "VA6", 1, NULL, NULL), + B("abit", "VT6X4", 1, NULL, NULL), B("Acorp", "6A815EPD", 1, "http://web.archive.org/web/20021206163652/www.acorp.com.tw/English/default.asp", NULL), B("Advantech", "PCM-5820", 1, "http://www.emacinc.com/sbc_pc_compatible/pcm_5820.htm", NULL), B("agami", "Aruma", 1, "http://web.archive.org/web/20080212111524/http://www.agami.com/site/ais-6000-series", NULL), @@ -578,19 +578,23 @@ const struct board_info boards_known[] = { B("Artec Group","DBE62", 1, "http://wiki.thincan.org/DBE62", NULL), B("ASI", "MB-5BLMP", 1, "http://www.hojerteknik.com/winnet.htm", "Used in the IGEL WinNET III thin client."), B("ASRock", "775i65G", 1, "http://www.asrock.com/mb/overview.asp?Model=775i65G", NULL), + B("ASRock", "880G Pro3", 1, "http://www.asrock.com/mb/overview.asp?Model=880G%20Pro3", NULL), B("ASRock", "890GX Extreme3", 1, "http://www.asrock.com/mb/overview.asp?Model=890GX%20Extreme3", NULL), B("ASRock", "939A785GMH/128M", 1, "http://www.asrock.com/mb/overview.asp?Model=939A785GMH/128M", NULL), B("ASRock", "A330GC", 1, "http://www.asrock.com/mb/overview.asp?Model=A330GC", NULL), B("ASRock", "A770CrossFire", 1, "http://www.asrock.com/mb/overview.asp?Model=A770CrossFire", NULL), + B("ASRock", "A780FullHD", 1, "http://www.asrock.com/mb/overview.asp?Model=A780FullHD", "While flashrom is working correctly, there might be problems with the firmware images themselves. Please see http://www.flashrom.org/pipermail/flashrom/2012-July/009600.html for details."), B("ASRock", "ALiveNF6G-DVI", 1, "http://www.asrock.com/mb/overview.asp?Model=ALiveNF6G-DVI", NULL), B("ASRock", "AM2NF6G-VSTA", 1, "http://www.asrock.com/mb/overview.asp?Model=AM2NF6G-VSTA", NULL), B("ASRock", "ConRoeXFire-eSATA2", 1, "http://www.asrock.com/mb/overview.asp?model=conroexfire-esata2", NULL), + B("ASRock", "H61M-ITX", 0, "http://www.asrock.com/mb/overview.asp?Model=H61M-ITX", "Probing works (Macronix MX25L3205, 4096 kB, SPI), but parts of the flash are problematic: descriptor is r/o (conforming to ICH reqs), ME region is locked."), B("ASRock", "H67M", 0, "http://www.asrock.com/mb/overview.asp?Model=H67M", "Probing works (Winbond W25Q64, 8192 kB, SPI), but parts of the flash are problematic: descriptor is r/o (conforming to ICH reqs), ME region is locked."), B("ASRock", "K7S41", 1, "http://www.asrock.com/mb/overview.asp?Model=K7S41", NULL), B("ASRock", "K7S41GX", 1, "http://www.asrock.com/mb/overview.asp?Model=K7S41GX", NULL), B("ASRock", "K7VT4A+", 0, "http://www.asrock.com/mb/overview.asp?Model=K7VT4A%2b", "No chip found, probably due to flash translation. http://www.flashrom.org/pipermail/flashrom/2009-August/000393.html"), B("ASRock", "K8S8X", 1, "http://www.asrock.com/mb/overview.asp?Model=K8S8X", NULL), B("ASRock", "M3A790GXH/128M", 1, "http://www.asrock.com/mb/overview.asp?Model=M3A790GXH/128M", NULL), + B("ASRock", "N61P-S", 1, "http://www.asrock.com/mb/overview.asp?Model=N61P-S", NULL), B("ASRock", "P4i65GV", 1, "http://www.asrock.com/mb/overview.asp?Model=P4i65GV", NULL), B("ASUS", "A7N8X Deluxe", 1, "http://www.asus.com/Motherboards/AMD_Socket_A/A7N8X_Deluxe/", NULL), B("ASUS", "A7N8X-E Deluxe", 1, "http://www.asus.com/Motherboards/AMD_Socket_A/A7N8XE_Deluxe/", NULL), @@ -627,6 +631,7 @@ const struct board_info boards_known[] = { B("ASUS", "M2A-MX", 1, "http://www.asus.com/Motherboards/AMD_AM2/M2AMX/", NULL), B("ASUS", "M2A-VM (HDMI)", 1, "http://www.asus.com/Motherboards/AMD_AM2/M2AVM/", NULL), B("ASUS", "M2N32-SLI Deluxe", 1, "http://www.asus.com/Motherboards/AMD_AM2/M2N32SLI_DeluxeWireless_Edition/", NULL), + B("ASUS", "M2N68-VM", 1, "http://www.asus.com/Motherboards/AMD_AM2Plus/M2N68VM/", NULL), B("ASUS", "M2N-E", 1, "http://www.asus.com/Motherboards/AMD_AM2/M2NE/", "If the machine doesn't come up again after flashing, try resetting the NVRAM(CMOS). The MAC address of the onboard network card will change to the value stored in the new image, so backup the old address first. See http://www.flashrom.org/pipermail/flashrom/2009-November/000879.html"), B("ASUS", "M2N-E SLI", 1, "http://www.asus.com/Motherboards/AMD_AM2/M2NE_SLI/", NULL), B("ASUS", "M2N-SLI Deluxe", 1, "http://www.asus.com/Motherboards/AMD_AM2/M2NSLI_Deluxe/", NULL), @@ -637,6 +642,7 @@ const struct board_info boards_known[] = { B("ASUS", "M3A", 1, "http://www.asus.com/Motherboards/AMD_AM2Plus/M3A/", NULL), B("ASUS", "M3A76-CM", 1, "http://www.asus.com/Motherboards/AMD_AM2Plus/M3A76CM/", NULL), B("ASUS", "M3A78-EM", 1, "http://www.asus.com/Motherboards/AMD_AM2Plus/M3A78EM/", NULL), + B("ASUS", "M3N78 PRO", 1, "http://www.asus.com/Motherboards/AMD_AM2Plus/M3N78_PRO/", NULL), B("ASUS", "M3N78-VM", 1, "http://www.asus.com/Motherboards/AMD_AM2Plus/M3N78VM/", NULL), B("ASUS", "M4A78-EM", 1, "http://www.asus.com/Motherboards/AMD_AM2Plus/M4A78EM/", NULL), B("ASUS", "M4A785T-M", 1, "http://www.asus.com/Motherboards/AMD_AM3/M4A785TM/", NULL), @@ -646,7 +652,9 @@ const struct board_info boards_known[] = { B("ASUS", "M4A79T Deluxe", 1, "http://www.asus.com/Motherboards/AMD_AM3/M4A79T_Deluxe/", NULL), B("ASUS", "M4A87TD/USB3", 1, "http://www.asus.com/Motherboards/AMD_AM3/M4A87TDUSB3/", NULL), B("ASUS", "M4A89GTD PRO", 1, "http://www.asus.com/Motherboards/AMD_AM3/M4A89GTD_PRO/", NULL), + B("ASUS", "M4N68T V2", 1, "http://www.asus.com/Motherboards/AMD_AM3/M4N68T_V2/", NULL), B("ASUS", "M4N78 PRO", 1, "http://www.asus.com/Motherboards/AMD_AM2Plus/M4N78_PRO/", NULL), + B("ASUS", "M5A78L-M LX", 1, "http://www.asus.com/Motherboards/AMD_AM3Plus/M5A78LM_LX/", "The MAC address of the onboard LAN NIC is stored in flash, hence overwritten by flashrom; see http://www.flashrom.org/pipermail/flashrom/2012-May/009200.html"), B("ASUS", "M5A99X EVO", 1, "http://www.asus.com/Motherboards/AMD_AM3Plus/M5A99X_EVO/", NULL), B("ASUS", "Maximus IV Extreme", 0, "http://www.asus.com/Motherboards/Intel_Socket_1155/Maximus_IV_Extreme/", "Probing works (Macronix MX25L3205, 4096 kB, SPI), but parts of the flash are problematic: descriptor is r/o (conforming to ICH reqs), ME region is locked."), B("ASUS", "MEW-AM", 0, "ftp://ftp.asus.com.tw/pub/ASUS/mb/sock370/810/mew-am/", "No public report found. Owned by Uwe Hermann <uwe@hermann-uwe.de>. May work now."), @@ -668,10 +676,10 @@ const struct board_info boards_known[] = { B("ASUS", "P4P800", 1, "http://www.asus.com/Motherboards/Intel_Socket_478/P4P800/", NULL), B("ASUS", "P4P800-E Deluxe", 1, "http://www.asus.com/Motherboards/Intel_Socket_478/P4P800E_Deluxe/", NULL), B("ASUS", "P4P800-VM", 1, "http://www.asus.com/Motherboards/Intel_Socket_478/P4P800VM/", NULL), - B("ASUS", "P4SC-E", 1, "ftp://ftp.asus.com.tw/pub/ASUS/mb/sock478/p4sc-e/", "Part of ASUS Terminator P4 533 barebone system"), - B("ASUS", "P4SD-LA", 1, "http://h10025.www1.hp.com/ewfrf/wc/document?docname=c00022505", NULL), B("ASUS", "P4S533-X", 1, "ftp://ftp.asus.com.tw/pub/ASUS/mb/sock478/p4s533-x/", NULL), B("ASUS", "P4S800-MX", 1, "http://www.asus.com/Motherboards/Intel_Socket_478/P4S800MX/", NULL), + B("ASUS", "P4SC-E", 1, "ftp://ftp.asus.com.tw/pub/ASUS/mb/sock478/p4sc-e/", "Part of ASUS Terminator P4 533 barebone system"), + B("ASUS", "P4SD-LA", 1, "http://h10025.www1.hp.com/ewfrf/wc/document?docname=c00022505", NULL), B("ASUS", "P5A", 1, "ftp://ftp.asus.com.tw/pub/ASUS/mb/sock7/ali/p5a/", NULL), B("ASUS", "P5B", 1, "ftp://ftp.asus.com.tw/pub/ASUS/mb/socket775/P5B/", NULL), B("ASUS", "P5B-Deluxe", 1, "http://www.asus.com/Motherboards/Intel_Socket_775/P5B_Deluxe/", NULL), @@ -682,6 +690,7 @@ const struct board_info boards_known[] = { B("ASUS", "P5GD1-VM/S", 1, NULL, "This is an OEM board from FSC. Although flashrom supports it and can probably not distinguish it from the P5GD1-VM, please note that the P5GD1-VM BIOS does not support the FSC variants completely."), B("ASUS", "P5GD1(-VM)", 0, NULL, "Untested board enable."), B("ASUS", "P5GD2 Premium", 1, "http://www.asus.com/Motherboards/Intel_Socket_775/P5GD2_Premium/", NULL), + B("ASUS", "P5GD2-X", 1, "http://www.asus.com/Motherboards/Intel_Socket_775/P5GD2X/", NULL), B("ASUS", "P5GDC Deluxe", 1, "http://www.asus.com/Motherboards/Intel_Socket_775/P5GDC_Deluxe/", NULL), B("ASUS", "P5GDC-V Deluxe", 1, "http://www.asus.com/Motherboards/Intel_Socket_775/P5GDCV_Deluxe/", NULL), B("ASUS", "P5GD2/C variants", 0, NULL, "Untested board enable."), @@ -717,8 +726,11 @@ const struct board_info boards_known[] = { B("ASUS", "P8H67-M PRO", 0, NULL, "Probing works (Macronix MX25L3205, 4096 kB, SPI), but parts of the flash are problematic: descriptor is r/o (conforming to ICH reqs), ME region is locked."), B("ASUS", "P8P67 (rev. 3.1)", 0, NULL, "Probing works (Macronix MX25L3205, 4096 kB, SPI), but parts of the flash are problematic: descriptor is r/o (conforming to ICH reqs), ME region is locked."), B("ASUS", "P8P67 LE", 0, NULL, "Probing works (Winbond W25Q32, 4096 kB, SPI), but parts of the flash are problematic: descriptor is r/o (conforming to ICH reqs), ME region is locked."), + B("ASUS", "P8P67 PRO (rev. 3.0)", 1, "http://www.asus.com/Motherboards/Intel_Socket_1155/P8P67_PRO/", NULL), + B("ASUS", "P8Z68-V", 1, "http://www.asus.com/Motherboards/Intel_Socket_1155/P8Z68V/", "Warning: MAC address of LOM is stored at 0x1000 - 0x1005 of the image."), B("ASUS", "P8Z68-V PRO", 0, NULL, "Probing works (Winbond W25Q64, 8192 kB, SPI), but parts of the flash are problematic: descriptor is r/o (conforming to ICH reqs), ME region is locked."), B("ASUS", "P8Z68-V PRO/GEN3", 1, "http://www.asus.com/Motherboards/Intel_Socket_1155/P8Z68V_PROGEN3/", "Warning: MAC address of LOM is stored at 0x1000 - 0x1005 of the image."), + B("ASUS", "SABERTOOTH 990FX", 1, "http://www.asus.com/Motherboards/AMD_AM3Plus/SABERTOOTH_990FX/", NULL), B("ASUS", "TUSL2-C", 0, "http://support.asus.com/download.aspx?SLanguage=en&p=1&s=4&m=TUSL2-C&os=&hashedid=n/a", "Untested board enable."), B("ASUS", "Z8NA-D6C", 1, "http://www.asus.com/Server_Workstation/Server_Motherboards/Z8NAD6C/", NULL), B("ASUS", "Z8PE-D12", 1, "http://www.asus.com/Server_Workstation/Server_Motherboards/Z8PED12/", NULL), @@ -743,6 +755,7 @@ const struct board_info boards_known[] = { B("DFI", "Blood-Iron P35 T2RL", 1, "http://lp.lanparty.com.tw/portal/CM/cmproduct/XX_cmproddetail/XX_WbProdsWindow?itemId=516&downloadFlag=false&action=1", NULL), B("Elitegroup", "GeForce6100SM-M ", 1, "http://www.ecs.com.tw/ECSWebSite/Product/Product_Detail.aspx?DetailID=685&MenuID=24", NULL), B("Elitegroup", "GF7100PVT-M3 (V1.0)", 1, "http://www.ecs.com.tw/ECSWebSite/Product/Product_Detail.aspx?DetailID=853&CategoryID=1&DetailName=Specification&MenuID=24&LanID=0", NULL), + B("Elitegroup", "GF8200A", 1, "http://www.ecs.com.tw/ECSWebSite/Product/Product_Detail.aspx?DetailID=873&CategoryID=1&MenuID=20&LanID=0", NULL), B("Elitegroup", "K7S5A", 1, "http://www.ecs.com.tw/ECSWebSite/Products/ProductsDetail.aspx?detailid=279&CategoryID=1&DetailName=Specification&MenuID=1&LanID=0", NULL), B("Elitegroup", "K7S6A", 1, "http://www.ecs.com.tw/ECSWebSite/Products/ProductsDetail.aspx?detailid=77&CategoryID=1&DetailName=Specification&MenuID=52&LanID=0", NULL), B("Elitegroup", "K7SEM (V1.0A)", 1, "http://www.ecs.com.tw/ECSWebSite/Product/Product_Detail.aspx?DetailID=229&CategoryID=1&DetailName=Specification&MenuID=24&LanID=0", NULL), @@ -791,6 +804,7 @@ const struct board_info boards_known[] = { B("GIGABYTE", "GA-EP31-DS3L (rev. 2.1)", 1, "http://www.gigabyte.com/products/product-page.aspx?pid=2964", NULL), B("GIGABYTE", "GA-EP35-DS3L", 1, "http://www.gigabyte.com/products/product-page.aspx?pid=2778", NULL), B("GIGABYTE", "GA-H61M-D2-B3", 1, "http://www.gigabyte.com/products/product-page.aspx?pid=3773", NULL), + B("GIGABYTE", "GA-H61M-D2H-USB3", 1, "http://www.gigabyte.com/products/product-page.aspx?pid=4004", NULL), B("GIGABYTE", "GA-EX58-UD4P", 1, "http://www.gigabyte.com/products/product-page.aspx?pid=2986", NULL), B("GIGABYTE", "GA-K8N-SLI", 1, "http://www.gigabyte.com/products/product-page.aspx?pid=1928", NULL), B("GIGABYTE", "GA-K8N51GMF", 1, "http://www.gigabyte.com/products/product-page.aspx?pid=1950", NULL), @@ -816,6 +830,7 @@ const struct board_info boards_known[] = { B("GIGABYTE", "GA-X58A-UDR3 (rev. 2.0)", 1, NULL, NULL), B("GIGABYTE", "GA-Z68MX-UD2H-B (rev. 1.3)", 1, "http://www.gigabyte.com/products/product-page.aspx?pid=3854", NULL), B("GIGABYTE", "GA-Z68XP-UD3 (rev. 1.0)", 1, "http://www.gigabyte.com/products/product-page.aspx?pid=3892", NULL), + B("HP", "8100 Elite CMT PC (304Bh)", 0, NULL, "SPI lock down, PR, read-only descriptor, locked ME region."), B("HP", "e-Vectra P2706T", 1, "http://h20000.www2.hp.com/bizsupport/TechSupport/Home.jsp?lang=en&cc=us&prodSeriesId=77515&prodTypeId=12454", NULL), B("HP", "ProLiant DL145 G3", 1, "http://h20000.www2.hp.com/bizsupport/TechSupport/Document.jsp?objectID=c00816835&lang=en&cc=us&taskId=101&prodSeriesId=3219755&prodTypeId=15351", NULL), B("HP", "ProLiant DL165 G6", 1, "http://h10010.www1.hp.com/wwpc/us/en/sm/WF05a/15351-15351-3328412-241644-3328421-3955644.html", NULL), @@ -828,6 +843,7 @@ const struct board_info boards_known[] = { B("HP", "xw6400", 0, NULL, "No chip found, see http://www.flashrom.org/pipermail/flashrom/2012-March/009006.html"), B("HP", "xw9300", 0, "http://h20000.www2.hp.com/bizsupport/TechSupport/Home.jsp?lang=en&cc=us&prodTypeId=12454&prodSeriesId=459226", "Missing board enable, see http://www.flashrom.org/pipermail/flashrom/2012-February/008862.html"), B("HP", "xw9400", 1, "http://h20000.www2.hp.com/bizsupport/TechSupport/Home.jsp?lang=en&cc=us&prodSeriesId=3211286&prodTypeId=12454", "Boot block is write protected unless the solder points next to F2 are shorted."), + B("HP", "Z400 Workstation (0AE4h)", 0, NULL, "ICH10R with BIOS lock enable and a protected range PR0, see http://www.flashrom.org/pipermail/flashrom/2012-June/009350.html"), B("IBASE", "MB899", 1, "http://www.ibase-i.com.tw/2009/mb899.html", NULL), B("IBM", "x3455", 1, "http://www-03.ibm.com/systems/x/hardware/rack/x3455/index.html", NULL), B("IEI", "PICOe-9452", 1, "http://www.ieiworld.com/product_groups/industrial/content.aspx?keyword=WSB&gid=00001000010000000001&cid=08125380291060861658&id=08142308605814597144", NULL), @@ -835,7 +851,9 @@ const struct board_info boards_known[] = { B("Intel", "D425KT", 0, "http://www.intel.com/content/www/us/en/motherboards/desktop-motherboards/desktop-board-d425kt.html", "NM10 with SPI lock down, BIOS lock, see http://www.flashrom.org/pipermail/flashrom/2012-January/008600.html"), B("Intel", "D865GLC", 0, NULL, "ICH5 with BIOS lock enable, see http://paste.flashrom.org/view.php?id=775"), B("Intel", "DG45ID", 0, "http://www.intel.com/products/desktop/motherboards/dg45id/dg45id-overview.htm", "Probing works (Winbond W25x32, 4096 kB, SPI), but parts of the flash are problematic: descriptor is r/o (conforming to ICH reqs), ME is locked."), - B("Intel", "DG965OT", 0, NULL, "Probing enables Hardware Sequencing (behind that hides a SST SST25VF080B, 1024 kB, SPI). Parts of the flash are problematic: descriptor is r/o (conforming to ICH reqs), ME is locked (and the platform data region seems to be bogus)."), + B("Intel", "DQ965GF", 0, NULL, "Probing enables Hardware Sequencing (behind that hides a SST SST25VF016B, 2048 kB). Parts of the flash are problematic: descriptor is r/o (conforming to ICH reqs), ME is locked (and the platform data region seems to be bogus)."), + B("Intel", "DG965OT", 0, NULL, "Probing enables Hardware Sequencing (behind that hides a SST SST25VF080B, 1024 kB). Parts of the flash are problematic: descriptor is r/o (conforming to ICH reqs), ME is locked (and the platform data region seems to be bogus)."), + B("Intel", "DH61AG ", 0, NULL, "H61 with BIOS lock enable and locked ME region, see http://www.flashrom.org/pipermail/flashrom/2012-June/009417.html"), B("Intel", "DH67CF", 0, NULL, "H67 with BIOS lock enable and locked ME region, see http://www.flashrom.org/pipermail/flashrom/2011-September/007789.html"), B("Intel", "DN2800MT (Marshalltown)", 0, NULL, "BIOS locked via BIOS_CNTL."), B("Intel", "EP80759", 1, NULL, NULL), @@ -875,6 +893,7 @@ const struct board_info boards_known[] = { B("MSI", "MS-7207 (K8NGM2-L)", 1, "http://www.msi.com/product/mb/K8NGM2-FID--IL--L.html", NULL), B("MSI", "MS-7211 (PM8M3-V)", 1, "http://www.msi.com/product/mb/PM8M3-V.html", NULL), B("MSI", "MS-7236 (945PL Neo3)", 1, "http://www.msi.com/product/mb/945PL-Neo3.html", NULL), + B("MSI", "MS-7250 (K9N SLI (rev 2.1))", 1, "http://www.msi.com/product/mb/K9N--SLI.html", NULL), B("MSI", "MS-7253 (K9VGM-V)", 1, "http://www.msi.com/product/mb/K9VGM-V.html", NULL), B("MSI", "MS-7255 (P4M890M)", 1, "http://www.msi.com/product/mb/P4M890M-L-IL.html", NULL), B("MSI", "MS-7260 (K9N Neo PCB 1.0)", 0, "http://www.msi.com/product/mb/K9N-Neo--PCB-1-0-.html", "Interestingly flashrom does not work when the vendor BIOS is booted, but it ''does'' work flawlessly when the machine is booted with coreboot. Owned by Uwe Hermann <uwe@hermann-uwe.de>."), @@ -895,11 +914,13 @@ const struct board_info boards_known[] = { B("MSI", "MS-7640 (890FXA-GD70)",1, "http://www.msi.com/product/mb/890FXA-GD70.html", NULL), B("MSI", "MS-7642 (890GXM-G65)", 1, "http://www.msi.com/product/mb/890GXM-G65.html", NULL), B("MSI", "MS-7676 (H67MA-ED55(B3))", 1, "http://www.msi.com/product/mb/H67MA-ED55--B3-.html", "Seems to work fine basically, but user reported (hopefully unrelated) buggy behavior of the board after a firmware upgrade. See http://www.flashrom.org/pipermail/flashrom/2012-January/008547.html"), + B("MSI", "MS-7676 (Z68MA-G45 (B3))", 1, "http://www.msi.com/product/mb/Z68MA-G45--B3-.html", NULL), B("MSI", "MS-7696 (A75MA-G55)", 1, "http://www.msi.com/product/mb/A75MA-G55.html", NULL), B("MSI", "MS-7698 (E350IA-E45)", 1, "http://www.msi.com/product/mb/E350IA-E45.html", NULL), B("MSI", "MS-7740 (H61MA-E35(B3))", 1, "http://www.msi.com/product/mb/H61MA-E35--B3-.html", NULL), B("NEC", "PowerMate 2000", 1, "http://support.necam.com/mobilesolutions/hardware/Desktops/pm2000/celeron/", NULL), B("Nokia", "IP530", 1, NULL, NULL), + B("Palit", "N61S", 1, NULL, NULL), B("PCCHIPS ", "M598LMR (V9.0)", 1, NULL, NULL), B("PCCHIPS ", "M863G (V5.1A)", 1, "http://www.pcchips.com.tw/PCCWebSite/Products/ProductsDetail.aspx?CategoryID=1&DetailID=343&DetailName=Feature&MenuID=1&LanID=0", NULL), B("PC Engines", "Alix.1c", 1, "http://pcengines.ch/alix1c.htm", NULL), @@ -943,6 +964,7 @@ const struct board_info boards_known[] = { B("Supermicro", "X8DTU-F", 1, "http://www.supermicro.com/products/motherboard/QPI/5500/X8DTU-F.cfm", NULL), B("Supermicro", "X8SIE(-F)", 0, "http://www.supermicro.com/products/motherboard/Xeon3000/3400/X8SIE.cfm?IPMI=N&TYP=LN2", "Requires unlocking the ME although the registers are set up correctly by the descriptor/BIOS already (tested with swseq and hwseq)."), B("Supermicro", "X8STi", 1, "http://www.supermicro.com/products/motherboard/Xeon3000/X58/X8STi.cfm", NULL), + B("Supermicro", "X9DR3-F", 0, "http://www.supermicro.com/products/motherboard/xeon/c600/x9dr3-f.cfm", "Probing works (Numonyx N25Q128 (supported by SFDP only atm), 16384 kB, SPI), but parts of the flash are problematic: descriptor is r/o (conforming to ICH reqs), ME region is locked."), B("Supermicro", "X9SCA-F", 0, "http://www.supermicro.com/products/motherboard/Xeon/C202_C204/X9SCA-F.cfm", "Probing works (Winbond W25Q64, 8192 kB, SPI), but parts of the flash are problematic: descriptor is r/o (conforming to ICH reqs), ME region is locked."), B("Supermicro", "X9SCL", 0, "http://www.supermicro.com/products/motherboard/Xeon/C202_C204/X9SCL.cfm", "Probing works (Winbond W25Q64, 8192 kB, SPI), but parts of the flash are problematic: descriptor is r/o (conforming to ICH reqs), ME region is locked."), B("T-Online", "S-100", 1, "http://wiki.freifunk-hannover.de/T-Online_S_100", NULL), @@ -1013,7 +1035,10 @@ const struct board_info laptops_known[] = { B("ASUS", "Eee PC 701 4G", 0, "http://www.asus.com/Eee/Eee_PC/Eee_PC_4G/", "It seems the chip (25X40VSIG) is behind some SPI flash translation layer (likely in the EC, the ENE KB3310)."), B("ASUS", "M6Ne", 0, "http://www.asus.com/Notebooks/Versatile_Performance/M6NNe/", "Untested board enable."), B("Clevo", "P150HM", 0, "http://www.clevo.com.tw/en/products/prodinfo_2.asp?productid=307", "Probing works (Macronix MX25L3205, 4096 kB, SPI), but parts of the flash are problematic: descriptor is r/o (conforming to ICH reqs), ME region is locked."), + B("Dell", "Inspiron 1420", 1, NULL, NULL), B("Dell", "Latitude CPi A366XT", 0, "http://www.coreboot.org/Dell_Latitude_CPi_A366XT", "The laptop immediately powers off if you try to hot-swap the chip. It's not yet tested if write/erase would work on this laptop."), + B("Dell", "Vostro 3700", 0, NULL, "Locked ME, see http://www.flashrom.org/pipermail/flashrom/2012-May/009197.html."), + B("Dell", "Latitude E6520", 0, NULL, "Locked ME, see http://www.flashrom.org/pipermail/flashrom/2012-June/009420.html."), B("HP/Compaq", "nx9005", 0, "http://h18000.www1.hp.com/products/quickspecs/11602_na/11602_na.HTML", "Shuts down when probing for a chip. http://www.flashrom.org/pipermail/flashrom/2010-May/003321.html"), B("HP/Compaq", "nx9010", 0, "http://h20000.www2.hp.com/bizsupport/TechSupport/Document.jsp?lang=en&cc=us&objectID=c00348514", "Hangs upon '''flashrom -V''' (needs hard power-cycle then)."), B("IBM/Lenovo", "Thinkpad T40p", 0, "http://www.thinkwiki.org/wiki/Category:T40p", NULL), |