source: trunk/chipset_enable.c @ 1463

Revision 1463, 42.2 KB checked in by hailfinger, 3 months ago (diff)

Register Parallel/LPC/FWH programmers the same way SPI programmers are registered.

All programmers are now calling programmer registration functions and
direct manipulations of buses_supported are not needed/possible anymore.

Note: Programmers without parallel/LPC/FWH chip support should not call
register_par_programmer().

Additional fixes:
Set max_rom_decode.parallel for drkaiser.
Remove abuse of programmer_map_flash_region in it85spi.
Annotate several FIXMEs in it85spi.

Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@…>
Acked-By: Michael Karcher <flashrom@…>

Line 
1/*
2 * This file is part of the flashrom project.
3 *
4 * Copyright (C) 2000 Silicon Integrated System Corporation
5 * Copyright (C) 2005-2009 coresystems GmbH
6 * Copyright (C) 2006 Uwe Hermann <uwe@hermann-uwe.de>
7 * Copyright (C) 2007,2008,2009 Carl-Daniel Hailfinger
8 * Copyright (C) 2009 Kontron Modular Computers GmbH
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; version 2 of the License.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
22 */
23
24/*
25 * Contains the chipset specific flash enables.
26 */
27
28#define _LARGEFILE64_SOURCE
29
30#include <stdlib.h>
31#include <string.h>
32#include <unistd.h>
33#include <inttypes.h>
34#include <errno.h>
35#include "flash.h"
36#include "programmer.h"
37
38#define NOT_DONE_YET 1
39
40#if defined(__i386__) || defined(__x86_64__)
41
42static int enable_flash_ali_m1533(struct pci_dev *dev, const char *name)
43{
44        uint8_t tmp;
45
46        /*
47         * ROM Write enable, 0xFFFC0000-0xFFFDFFFF and
48         * 0xFFFE0000-0xFFFFFFFF ROM select enable.
49         */
50        tmp = pci_read_byte(dev, 0x47);
51        tmp |= 0x46;
52        rpci_write_byte(dev, 0x47, tmp);
53
54        return 0;
55}
56
57static int enable_flash_sis85c496(struct pci_dev *dev, const char *name)
58{
59        uint8_t tmp;
60
61        tmp = pci_read_byte(dev, 0xd0);
62        tmp |= 0xf8;
63        rpci_write_byte(dev, 0xd0, tmp);
64
65        return 0;
66}
67
68static int enable_flash_sis_mapping(struct pci_dev *dev, const char *name)
69{
70        uint8_t new, newer;
71
72        /* Extended BIOS enable = 1, Lower BIOS Enable = 1 */
73        /* This is 0xFFF8000~0xFFFF0000 decoding on SiS 540/630. */
74        new = pci_read_byte(dev, 0x40);
75        new &= (~0x04); /* No idea why we clear bit 2. */
76        new |= 0xb; /* 0x3 for some chipsets, bit 7 seems to be don't care. */
77        rpci_write_byte(dev, 0x40, new);
78        newer = pci_read_byte(dev, 0x40);
79        if (newer != new) {
80                msg_pinfo("Setting register 0x%x to 0x%x on %s failed "
81                          "(WARNING ONLY).\n", 0x40, new, name);
82                msg_pinfo("Stuck at 0x%x\n", newer);
83                return -1;
84        }
85        return 0;
86}
87
88static struct pci_dev *find_southbridge(uint16_t vendor, const char *name)
89{
90        struct pci_dev *sbdev;
91
92        sbdev = pci_dev_find_vendorclass(vendor, 0x0601);
93        if (!sbdev)
94                sbdev = pci_dev_find_vendorclass(vendor, 0x0680);
95        if (!sbdev)
96                sbdev = pci_dev_find_vendorclass(vendor, 0x0000);
97        if (!sbdev)
98                msg_perr("No southbridge found for %s!\n", name);
99        if (sbdev)
100                msg_pdbg("Found southbridge %04x:%04x at %02x:%02x:%01x\n",
101                         sbdev->vendor_id, sbdev->device_id,
102                         sbdev->bus, sbdev->dev, sbdev->func);
103        return sbdev;
104}
105
106static int enable_flash_sis501(struct pci_dev *dev, const char *name)
107{
108        uint8_t tmp;
109        int ret = 0;
110        struct pci_dev *sbdev;
111
112        sbdev = find_southbridge(dev->vendor_id, name);
113        if (!sbdev)
114                return -1;
115
116        ret = enable_flash_sis_mapping(sbdev, name);
117
118        tmp = sio_read(0x22, 0x80);
119        tmp &= (~0x20);
120        tmp |= 0x4;
121        sio_write(0x22, 0x80, tmp);
122
123        tmp = sio_read(0x22, 0x70);
124        tmp &= (~0x20);
125        tmp |= 0x4;
126        sio_write(0x22, 0x70, tmp);
127       
128        return ret;
129}
130
131static int enable_flash_sis5511(struct pci_dev *dev, const char *name)
132{
133        uint8_t tmp;
134        int ret = 0;
135        struct pci_dev *sbdev;
136
137        sbdev = find_southbridge(dev->vendor_id, name);
138        if (!sbdev)
139                return -1;
140
141        ret = enable_flash_sis_mapping(sbdev, name);
142
143        tmp = sio_read(0x22, 0x50);
144        tmp &= (~0x20);
145        tmp |= 0x4;
146        sio_write(0x22, 0x50, tmp);
147
148        return ret;
149}
150
151static int enable_flash_sis530(struct pci_dev *dev, const char *name)
152{
153        uint8_t new, newer;
154        int ret = 0;
155        struct pci_dev *sbdev;
156
157        sbdev = find_southbridge(dev->vendor_id, name);
158        if (!sbdev)
159                return -1;
160
161        ret = enable_flash_sis_mapping(sbdev, name);
162
163        new = pci_read_byte(sbdev, 0x45);
164        new &= (~0x20);
165        new |= 0x4;
166        rpci_write_byte(sbdev, 0x45, new);
167        newer = pci_read_byte(sbdev, 0x45);
168        if (newer != new) {
169                msg_pinfo("Setting register 0x%x to 0x%x on %s failed "
170                          "(WARNING ONLY).\n", 0x45, new, name);
171                msg_pinfo("Stuck at 0x%x\n", newer);
172                ret = -1;
173        }
174
175        return ret;
176}
177
178static int enable_flash_sis540(struct pci_dev *dev, const char *name)
179{
180        uint8_t new, newer;
181        int ret = 0;
182        struct pci_dev *sbdev;
183
184        sbdev = find_southbridge(dev->vendor_id, name);
185        if (!sbdev)
186                return -1;
187
188        ret = enable_flash_sis_mapping(sbdev, name);
189
190        new = pci_read_byte(sbdev, 0x45);
191        new &= (~0x80);
192        new |= 0x40;
193        rpci_write_byte(sbdev, 0x45, new);
194        newer = pci_read_byte(sbdev, 0x45);
195        if (newer != new) {
196                msg_pinfo("Setting register 0x%x to 0x%x on %s failed "
197                          "(WARNING ONLY).\n", 0x45, new, name);
198                msg_pinfo("Stuck at 0x%x\n", newer);
199                ret = -1;
200        }
201
202        return ret;
203}
204
205/* Datasheet:
206 *   - Name: 82371AB PCI-TO-ISA / IDE XCELERATOR (PIIX4)
207 *   - URL: http://www.intel.com/design/intarch/datashts/290562.htm
208 *   - PDF: http://www.intel.com/design/intarch/datashts/29056201.pdf
209 *   - Order Number: 290562-001
210 */
211static int enable_flash_piix4(struct pci_dev *dev, const char *name)
212{
213        uint16_t old, new;
214        uint16_t xbcs = 0x4e;   /* X-Bus Chip Select register. */
215
216        internal_buses_supported = BUS_PARALLEL;
217
218        old = pci_read_word(dev, xbcs);
219
220        /* Set bit 9: 1-Meg Extended BIOS Enable (PCI master accesses to
221         *            FFF00000-FFF7FFFF are forwarded to ISA).
222         *            Note: This bit is reserved on PIIX/PIIX3/MPIIX.
223         * Set bit 7: Extended BIOS Enable (PCI master accesses to
224         *            FFF80000-FFFDFFFF are forwarded to ISA).
225         * Set bit 6: Lower BIOS Enable (PCI master, or ISA master accesses to
226         *            the lower 64-Kbyte BIOS block (E0000-EFFFF) at the top
227         *            of 1 Mbyte, or the aliases at the top of 4 Gbyte
228         *            (FFFE0000-FFFEFFFF) result in the generation of BIOSCS#.
229         * Note: Accesses to FFFF0000-FFFFFFFF are always forwarded to ISA.
230         * Set bit 2: BIOSCS# Write Enable (1=enable, 0=disable).
231         */
232        if (dev->device_id == 0x122e || dev->device_id == 0x7000
233            || dev->device_id == 0x1234)
234                new = old | 0x00c4; /* PIIX/PIIX3/MPIIX: Bit 9 is reserved. */
235        else
236                new = old | 0x02c4;
237
238        if (new == old)
239                return 0;
240
241        rpci_write_word(dev, xbcs, new);
242
243        if (pci_read_word(dev, xbcs) != new) {
244                msg_pinfo("Setting register 0x%x to 0x%x on %s failed "
245                          "(WARNING ONLY).\n", xbcs, new, name);
246                return -1;
247        }
248
249        return 0;
250}
251
252/*
253 * See ie. page 375 of "Intel I/O Controller Hub 7 (ICH7) Family Datasheet"
254 * http://download.intel.com/design/chipsets/datashts/30701303.pdf
255 */
256static int enable_flash_ich(struct pci_dev *dev, const char *name,
257                            int bios_cntl)
258{
259        uint8_t old, new, wanted;
260
261        /*
262         * Note: the ICH0-ICH5 BIOS_CNTL register is actually 16 bit wide, but
263         * just treating it as 8 bit wide seems to work fine in practice.
264         */
265        old = pci_read_byte(dev, bios_cntl);
266
267        msg_pdbg("\nBIOS Lock Enable: %sabled, ",
268                 (old & (1 << 1)) ? "en" : "dis");
269        msg_pdbg("BIOS Write Enable: %sabled, ",
270                 (old & (1 << 0)) ? "en" : "dis");
271        msg_pdbg("BIOS_CNTL is 0x%x\n", old);
272
273        /*
274         * Quote from the 6 Series datasheet (Document Number: 324645-004):
275         * "Bit 5: SMM BIOS Write Protect Disable (SMM_BWP)
276         * 1 = BIOS region SMM protection is enabled.
277         * The BIOS Region is not writable unless all processors are in SMM."
278         * In earlier chipsets this bit is reserved.
279         */
280        if (old & (1 << 5))
281                msg_pinfo("WARNING: BIOS region SMM protection is enabled!\n");
282
283        wanted = old | 1;
284        if (wanted == old)
285                return 0;
286
287        rpci_write_byte(dev, bios_cntl, wanted);
288
289        if ((new = pci_read_byte(dev, bios_cntl)) != wanted) {
290                msg_pinfo("WARNING: Setting 0x%x from 0x%x to 0x%x on %s "
291                          "failed. New value is 0x%x.\n",
292                          bios_cntl, old, wanted, name, new);
293                return -1;
294        }
295
296        return 0;
297}
298
299static int enable_flash_ich_4e(struct pci_dev *dev, const char *name)
300{
301        /*
302         * Note: ICH5 has registers similar to FWH_SEL1, FWH_SEL2 and
303         * FWH_DEC_EN1, but they are called FB_SEL1, FB_SEL2, FB_DEC_EN1 and
304         * FB_DEC_EN2.
305         */
306        internal_buses_supported = BUS_FWH;
307        return enable_flash_ich(dev, name, 0x4e);
308}
309
310static int enable_flash_ich_dc(struct pci_dev *dev, const char *name)
311{
312        uint32_t fwh_conf;
313        int i, tmp;
314        char *idsel = NULL;
315        int max_decode_fwh_idsel = 0, max_decode_fwh_decode = 0;
316        int contiguous = 1;
317
318        idsel = extract_programmer_param("fwh_idsel");
319        if (idsel && strlen(idsel)) {
320                uint64_t fwh_idsel_old, fwh_idsel;
321                errno = 0;
322                /* Base 16, nothing else makes sense. */
323                fwh_idsel = (uint64_t)strtoull(idsel, NULL, 16);
324                if (errno) {
325                        msg_perr("Error: fwh_idsel= specified, but value could "
326                                 "not be converted.\n");
327                        goto idsel_garbage_out;
328                }
329                if (fwh_idsel & 0xffff000000000000ULL) {
330                        msg_perr("Error: fwh_idsel= specified, but value had "
331                                 "unused bits set.\n");
332                        goto idsel_garbage_out;
333                }
334                fwh_idsel_old = pci_read_long(dev, 0xd0);
335                fwh_idsel_old <<= 16;
336                fwh_idsel_old |= pci_read_word(dev, 0xd4);
337                msg_pdbg("\nSetting IDSEL from 0x%012" PRIx64 " to "
338                         "0x%012" PRIx64 " for top 16 MB.", fwh_idsel_old,
339                         fwh_idsel);
340                rpci_write_long(dev, 0xd0, (fwh_idsel >> 16) & 0xffffffff);
341                rpci_write_word(dev, 0xd4, fwh_idsel & 0xffff);
342                /* FIXME: Decode settings are not changed. */
343        } else if (idsel) {
344                msg_perr("Error: fwh_idsel= specified, but no value given.\n");
345idsel_garbage_out:
346                free(idsel);
347                return ERROR_FATAL;
348        }
349        free(idsel);
350
351        /* Ignore all legacy ranges below 1 MB.
352         * We currently only support flashing the chip which responds to
353         * IDSEL=0. To support IDSEL!=0, flashbase and decode size calculations
354         * have to be adjusted.
355         */
356        /* FWH_SEL1 */
357        fwh_conf = pci_read_long(dev, 0xd0);
358        for (i = 7; i >= 0; i--) {
359                tmp = (fwh_conf >> (i * 4)) & 0xf;
360                msg_pdbg("\n0x%08x/0x%08x FWH IDSEL: 0x%x",
361                         (0x1ff8 + i) * 0x80000,
362                         (0x1ff0 + i) * 0x80000,
363                         tmp);
364                if ((tmp == 0) && contiguous) {
365                        max_decode_fwh_idsel = (8 - i) * 0x80000;
366                } else {
367                        contiguous = 0;
368                }
369        }
370        /* FWH_SEL2 */
371        fwh_conf = pci_read_word(dev, 0xd4);
372        for (i = 3; i >= 0; i--) {
373                tmp = (fwh_conf >> (i * 4)) & 0xf;
374                msg_pdbg("\n0x%08x/0x%08x FWH IDSEL: 0x%x",
375                         (0xff4 + i) * 0x100000,
376                         (0xff0 + i) * 0x100000,
377                         tmp);
378                if ((tmp == 0) && contiguous) {
379                        max_decode_fwh_idsel = (8 - i) * 0x100000;
380                } else {
381                        contiguous = 0;
382                }
383        }
384        contiguous = 1;
385        /* FWH_DEC_EN1 */
386        fwh_conf = pci_read_word(dev, 0xd8);
387        for (i = 7; i >= 0; i--) {
388                tmp = (fwh_conf >> (i + 0x8)) & 0x1;
389                msg_pdbg("\n0x%08x/0x%08x FWH decode %sabled",
390                         (0x1ff8 + i) * 0x80000,
391                         (0x1ff0 + i) * 0x80000,
392                         tmp ? "en" : "dis");
393                if ((tmp == 1) && contiguous) {
394                        max_decode_fwh_decode = (8 - i) * 0x80000;
395                } else {
396                        contiguous = 0;
397                }
398        }
399        for (i = 3; i >= 0; i--) {
400                tmp = (fwh_conf >> i) & 0x1;
401                msg_pdbg("\n0x%08x/0x%08x FWH decode %sabled",
402                         (0xff4 + i) * 0x100000,
403                         (0xff0 + i) * 0x100000,
404                         tmp ? "en" : "dis");
405                if ((tmp == 1) && contiguous) {
406                        max_decode_fwh_decode = (8 - i) * 0x100000;
407                } else {
408                        contiguous = 0;
409                }
410        }
411        max_rom_decode.fwh = min(max_decode_fwh_idsel, max_decode_fwh_decode);
412        msg_pdbg("\nMaximum FWH chip size: 0x%x bytes", max_rom_decode.fwh);
413
414        /* If we're called by enable_flash_ich_dc_spi, it will override
415         * internal_buses_supported anyway.
416         */
417        internal_buses_supported = BUS_FWH;
418        return enable_flash_ich(dev, name, 0xdc);
419}
420
421static int enable_flash_poulsbo(struct pci_dev *dev, const char *name)
422{
423        uint16_t old, new;
424        int err;
425
426        if ((err = enable_flash_ich(dev, name, 0xd8)) != 0)
427                return err;
428
429        old = pci_read_byte(dev, 0xd9);
430        msg_pdbg("BIOS Prefetch Enable: %sabled, ",
431                 (old & 1) ? "en" : "dis");
432        new = old & ~1;
433
434        if (new != old)
435                rpci_write_byte(dev, 0xd9, new);
436
437        internal_buses_supported = BUS_FWH;
438        return 0;
439}
440
441static int enable_flash_tunnelcreek(struct pci_dev *dev, const char *name)
442{
443        uint16_t old, new;
444        uint32_t tmp, bnt;
445        void *rcrb;
446        int ret;
447
448        /* Enable Flash Writes */
449        ret = enable_flash_ich(dev, name, 0xd8);
450        if (ret == ERROR_FATAL)
451                return ret;
452
453        /* Make sure BIOS prefetch mechanism is disabled */
454        old = pci_read_byte(dev, 0xd9);
455        msg_pdbg("BIOS Prefetch Enable: %sabled, ", (old & 1) ? "en" : "dis");
456        new = old & ~1;
457        if (new != old)
458                rpci_write_byte(dev, 0xd9, new);
459
460        /* Get physical address of Root Complex Register Block */
461        tmp = pci_read_long(dev, 0xf0) & 0xffffc000;
462        msg_pdbg("\nRoot Complex Register Block address = 0x%x\n", tmp);
463
464        /* Map RCBA to virtual memory */
465        rcrb = physmap("ICH RCRB", tmp, 0x4000);
466
467        /* Test Boot BIOS Strap Status */
468        bnt = mmio_readl(rcrb + 0x3410);
469        if (bnt & 0x02) {
470                /* If strapped to LPC, no SPI initialization is required */
471                internal_buses_supported = BUS_FWH;
472                return 0;
473        }
474
475        /* This adds BUS_SPI */
476        if (ich_init_spi(dev, tmp, rcrb, 7) != 0) {
477                if (!ret)
478                        ret = ERROR_NONFATAL;
479        }
480
481        return ret;
482}
483
484static int enable_flash_vt8237s_spi(struct pci_dev *dev, const char *name)
485{
486        /* Do we really need no write enable? */
487        return via_init_spi(dev);
488}
489
490static int enable_flash_ich_dc_spi(struct pci_dev *dev, const char *name,
491                                   enum ich_chipset ich_generation)
492{
493        int ret, ret_spi;
494        uint8_t bbs, buc;
495        uint32_t tmp, gcs;
496        void *rcrb;
497        const char *const *straps_names;
498
499        static const char *const straps_names_EP80579[] = { "SPI", "reserved", "reserved", "LPC" };
500        static const char *const straps_names_ich7_nm10[] = { "reserved", "SPI", "PCI", "LPC" };
501        static const char *const straps_names_ich8910[] = { "SPI", "SPI", "PCI", "LPC" };
502        static const char *const straps_names_pch56[] = { "LPC", "reserved", "PCI", "SPI" };
503        static const char *const straps_names_unknown[] = { "unknown", "unknown", "unknown", "unknown" };
504
505        switch (ich_generation) {
506        case CHIPSET_ICH7:
507                /* EP80579 may need further changes, but this is the least
508                 * intrusive way to get correct BOOT Strap printing without
509                 * changing the rest of its code path). */
510                if (strcmp(name, "EP80579") == 0)
511                        straps_names = straps_names_EP80579;
512                else
513                        straps_names = straps_names_ich7_nm10;
514                break;
515        case CHIPSET_ICH8:
516        case CHIPSET_ICH9:
517        case CHIPSET_ICH10:
518                straps_names = straps_names_ich8910;
519                break;
520        case CHIPSET_5_SERIES_IBEX_PEAK:
521        case CHIPSET_6_SERIES_COUGAR_POINT:
522                straps_names = straps_names_pch56;
523                break;
524        default:
525                msg_gerr("%s: unknown ICH generation. Please report!\n",
526                         __func__);
527                straps_names = straps_names_unknown;
528                break;
529        }
530
531        /* Enable Flash Writes */
532        ret = enable_flash_ich_dc(dev, name);
533        if (ret == ERROR_FATAL)
534                return ret;
535
536        /* Get physical address of Root Complex Register Block */
537        tmp = pci_read_long(dev, 0xf0) & 0xffffc000;
538        msg_pdbg("Root Complex Register Block address = 0x%x\n", tmp);
539
540        /* Map RCBA to virtual memory */
541        rcrb = physmap("ICH RCRB", tmp, 0x4000);
542
543        gcs = mmio_readl(rcrb + 0x3410);
544        msg_pdbg("GCS = 0x%x: ", gcs);
545        msg_pdbg("BIOS Interface Lock-Down: %sabled, ",
546                 (gcs & 0x1) ? "en" : "dis");
547        bbs = (gcs >> 10) & 0x3;
548        msg_pdbg("Boot BIOS Straps: 0x%x (%s)\n", bbs, straps_names[bbs]);
549
550        buc = mmio_readb(rcrb + 0x3414);
551        msg_pdbg("Top Swap : %s\n",
552                 (buc & 1) ? "enabled (A16 inverted)" : "not enabled");
553
554        /* It seems the ICH7 does not support SPI and LPC chips at the same
555         * time. At least not with our current code. So we prevent searching
556         * on ICH7 when the southbridge is strapped to LPC
557         */
558        internal_buses_supported = BUS_FWH;
559        if (ich_generation == CHIPSET_ICH7) {
560                if (bbs == 0x03) {
561                        /* If strapped to LPC, no further SPI initialization is
562                         * required. */
563                        return ret;
564                } else {
565                        /* Disable LPC/FWH if strapped to PCI or SPI */
566                        internal_buses_supported = BUS_NONE;
567                }
568        }
569
570        /* This adds BUS_SPI */
571        ret_spi = ich_init_spi(dev, tmp, rcrb, ich_generation);
572        if (ret_spi == ERROR_FATAL)
573                return ret_spi;
574       
575        if (ret || ret_spi)
576                ret = ERROR_NONFATAL;
577
578        return ret;
579}
580
581static int enable_flash_ich7(struct pci_dev *dev, const char *name)
582{
583        return enable_flash_ich_dc_spi(dev, name, CHIPSET_ICH7);
584}
585
586static int enable_flash_ich8(struct pci_dev *dev, const char *name)
587{
588        return enable_flash_ich_dc_spi(dev, name, CHIPSET_ICH8);
589}
590
591static int enable_flash_ich9(struct pci_dev *dev, const char *name)
592{
593        return enable_flash_ich_dc_spi(dev, name, CHIPSET_ICH9);
594}
595
596static int enable_flash_ich10(struct pci_dev *dev, const char *name)
597{
598        return enable_flash_ich_dc_spi(dev, name, CHIPSET_ICH10);
599}
600
601/* Ibex Peak aka. 5 series & 3400 series */
602static int enable_flash_pch5(struct pci_dev *dev, const char *name)
603{
604        return enable_flash_ich_dc_spi(dev, name, CHIPSET_5_SERIES_IBEX_PEAK);
605}
606
607/* Cougar Point aka. 6 series & c200 series */
608static int enable_flash_pch6(struct pci_dev *dev, const char *name)
609{
610        return enable_flash_ich_dc_spi(dev, name, CHIPSET_6_SERIES_COUGAR_POINT);
611}
612
613static int via_no_byte_merge(struct pci_dev *dev, const char *name)
614{
615        uint8_t val;
616
617        val = pci_read_byte(dev, 0x71);
618        if (val & 0x40) {
619                msg_pdbg("Disabling byte merging\n");
620                val &= ~0x40;
621                rpci_write_byte(dev, 0x71, val);
622        }
623        return NOT_DONE_YET;    /* need to find south bridge, too */
624}
625
626static int enable_flash_vt823x(struct pci_dev *dev, const char *name)
627{
628        uint8_t val;
629
630        /* Enable ROM decode range (1MB) FFC00000 - FFFFFFFF. */
631        rpci_write_byte(dev, 0x41, 0x7f);
632
633        /* ROM write enable */
634        val = pci_read_byte(dev, 0x40);
635        val |= 0x10;
636        rpci_write_byte(dev, 0x40, val);
637
638        if (pci_read_byte(dev, 0x40) != val) {
639                msg_pinfo("\nWARNING: Failed to enable flash write on \"%s\"\n",
640                          name);
641                return -1;
642        }
643
644        if (dev->device_id == 0x3227) { /* VT8237R */
645                /* All memory cycles, not just ROM ones, go to LPC. */
646                val = pci_read_byte(dev, 0x59);
647                val &= ~0x80;
648                rpci_write_byte(dev, 0x59, val);
649        }
650
651        return 0;
652}
653
654static int enable_flash_cs5530(struct pci_dev *dev, const char *name)
655{
656        uint8_t reg8;
657
658#define DECODE_CONTROL_REG2             0x5b    /* F0 index 0x5b */
659#define ROM_AT_LOGIC_CONTROL_REG        0x52    /* F0 index 0x52 */
660#define CS5530_RESET_CONTROL_REG        0x44    /* F0 index 0x44 */
661#define CS5530_USB_SHADOW_REG           0x43    /* F0 index 0x43 */
662
663#define LOWER_ROM_ADDRESS_RANGE         (1 << 0)
664#define ROM_WRITE_ENABLE                (1 << 1)
665#define UPPER_ROM_ADDRESS_RANGE         (1 << 2)
666#define BIOS_ROM_POSITIVE_DECODE        (1 << 5)
667#define CS5530_ISA_MASTER               (1 << 7)
668#define CS5530_ENABLE_SA2320            (1 << 2)
669#define CS5530_ENABLE_SA20              (1 << 6)
670
671        internal_buses_supported = BUS_PARALLEL;
672        /* Decode 0x000E0000-0x000FFFFF (128 kB), not just 64 kB, and
673         * decode 0xFF000000-0xFFFFFFFF (16 MB), not just 256 kB.
674         * FIXME: Should we really touch the low mapping below 1 MB? Flashrom
675         * ignores that region completely.
676         * Make the configured ROM areas writable.
677         */
678        reg8 = pci_read_byte(dev, ROM_AT_LOGIC_CONTROL_REG);
679        reg8 |= LOWER_ROM_ADDRESS_RANGE;
680        reg8 |= UPPER_ROM_ADDRESS_RANGE;
681        reg8 |= ROM_WRITE_ENABLE;
682        rpci_write_byte(dev, ROM_AT_LOGIC_CONTROL_REG, reg8);
683
684        /* Set positive decode on ROM. */
685        reg8 = pci_read_byte(dev, DECODE_CONTROL_REG2);
686        reg8 |= BIOS_ROM_POSITIVE_DECODE;
687        rpci_write_byte(dev, DECODE_CONTROL_REG2, reg8);
688
689        reg8 = pci_read_byte(dev, CS5530_RESET_CONTROL_REG);
690        if (reg8 & CS5530_ISA_MASTER) {
691                /* We have A0-A23 available. */
692                max_rom_decode.parallel = 16 * 1024 * 1024;
693        } else {
694                reg8 = pci_read_byte(dev, CS5530_USB_SHADOW_REG);
695                if (reg8 & CS5530_ENABLE_SA2320) {
696                        /* We have A0-19, A20-A23 available. */
697                        max_rom_decode.parallel = 16 * 1024 * 1024;
698                } else if (reg8 & CS5530_ENABLE_SA20) {
699                        /* We have A0-19, A20 available. */
700                        max_rom_decode.parallel = 2 * 1024 * 1024;
701                } else {
702                        /* A20 and above are not active. */
703                        max_rom_decode.parallel = 1024 * 1024;
704                }
705        }
706
707        return 0;
708}
709
710/*
711 * Geode systems write protect the BIOS via RCONFs (cache settings similar
712 * to MTRRs). To unlock, change MSR 0x1808 top byte to 0x22.
713 *
714 * Geode systems also write protect the NOR flash chip itself via MSR_NORF_CTL.
715 * To enable write to NOR Boot flash for the benefit of systems that have such
716 * a setup, raise MSR 0x51400018 WE_CS3 (write enable Boot Flash Chip Select).
717 */
718static int enable_flash_cs5536(struct pci_dev *dev, const char *name)
719{
720#define MSR_RCONF_DEFAULT       0x1808
721#define MSR_NORF_CTL            0x51400018
722
723        msr_t msr;
724
725        /* Geode only has a single core */
726        if (setup_cpu_msr(0))
727                return -1;
728
729        msr = rdmsr(MSR_RCONF_DEFAULT);
730        if ((msr.hi >> 24) != 0x22) {
731                msr.hi &= 0xfbffffff;
732                wrmsr(MSR_RCONF_DEFAULT, msr);
733        }
734
735        msr = rdmsr(MSR_NORF_CTL);
736        /* Raise WE_CS3 bit. */
737        msr.lo |= 0x08;
738        wrmsr(MSR_NORF_CTL, msr);
739
740        cleanup_cpu_msr();
741
742#undef MSR_RCONF_DEFAULT
743#undef MSR_NORF_CTL
744        return 0;
745}
746
747static int enable_flash_sc1100(struct pci_dev *dev, const char *name)
748{
749        uint8_t new;
750
751        rpci_write_byte(dev, 0x52, 0xee);
752
753        new = pci_read_byte(dev, 0x52);
754
755        if (new != 0xee) {
756                msg_pinfo("Setting register 0x%x to 0x%x on %s failed "
757                          "(WARNING ONLY).\n", 0x52, new, name);
758                return -1;
759        }
760
761        return 0;
762}
763
764/* Works for AMD-8111, VIA VT82C586A/B, VIA VT82C686A/B. */
765static int enable_flash_amd8111(struct pci_dev *dev, const char *name)
766{
767        uint8_t old, new;
768
769        /* Enable decoding at 0xffb00000 to 0xffffffff. */
770        old = pci_read_byte(dev, 0x43);
771        new = old | 0xC0;
772        if (new != old) {
773                rpci_write_byte(dev, 0x43, new);
774                if (pci_read_byte(dev, 0x43) != new) {
775                        msg_pinfo("Setting register 0x%x to 0x%x on %s failed "
776                                  "(WARNING ONLY).\n", 0x43, new, name);
777                }
778        }
779
780        /* Enable 'ROM write' bit. */
781        old = pci_read_byte(dev, 0x40);
782        new = old | 0x01;
783        if (new == old)
784                return 0;
785        rpci_write_byte(dev, 0x40, new);
786
787        if (pci_read_byte(dev, 0x40) != new) {
788                msg_pinfo("Setting register 0x%x to 0x%x on %s failed "
789                          "(WARNING ONLY).\n", 0x40, new, name);
790                return -1;
791        }
792
793        return 0;
794}
795
796static int enable_flash_sb600(struct pci_dev *dev, const char *name)
797{
798        uint32_t prot;
799        uint8_t reg;
800        int ret;
801
802        /* Clear ROM protect 0-3. */
803        for (reg = 0x50; reg < 0x60; reg += 4) {
804                prot = pci_read_long(dev, reg);
805                /* No protection flags for this region?*/
806                if ((prot & 0x3) == 0)
807                        continue;
808                msg_pinfo("SB600 %s%sprotected from 0x%08x to 0x%08x\n",
809                          (prot & 0x1) ? "write " : "",
810                          (prot & 0x2) ? "read " : "",
811                          (prot & 0xfffff800),
812                          (prot & 0xfffff800) + (((prot & 0x7fc) << 8) | 0x3ff));
813                prot &= 0xfffffffc;
814                rpci_write_byte(dev, reg, prot);
815                prot = pci_read_long(dev, reg);
816                if (prot & 0x3)
817                        msg_perr("SB600 %s%sunprotect failed from 0x%08x to 0x%08x\n",
818                                 (prot & 0x1) ? "write " : "",
819                                 (prot & 0x2) ? "read " : "",
820                                 (prot & 0xfffff800),
821                                 (prot & 0xfffff800) + (((prot & 0x7fc) << 8) | 0x3ff));
822        }
823
824        internal_buses_supported = BUS_LPC | BUS_FWH;
825
826        ret = sb600_probe_spi(dev);
827
828        /* Read ROM strap override register. */
829        OUTB(0x8f, 0xcd6);
830        reg = INB(0xcd7);
831        reg &= 0x0e;
832        msg_pdbg("ROM strap override is %sactive", (reg & 0x02) ? "" : "not ");
833        if (reg & 0x02) {
834                switch ((reg & 0x0c) >> 2) {
835                case 0x00:
836                        msg_pdbg(": LPC");
837                        break;
838                case 0x01:
839                        msg_pdbg(": PCI");
840                        break;
841                case 0x02:
842                        msg_pdbg(": FWH");
843                        break;
844                case 0x03:
845                        msg_pdbg(": SPI");
846                        break;
847                }
848        }
849        msg_pdbg("\n");
850
851        /* Force enable SPI ROM in SB600 PM register.
852         * If we enable SPI ROM here, we have to disable it after we leave.
853         * But how can we know which ROM we are going to handle? So we have
854         * to trade off. We only access LPC ROM if we boot via LPC ROM. And
855         * only SPI ROM if we boot via SPI ROM. If you want to access SPI on
856         * boards with LPC straps, you have to use the code below.
857         */
858        /*
859        OUTB(0x8f, 0xcd6);
860        OUTB(0x0e, 0xcd7);
861        */
862
863        return ret;
864}
865
866static int enable_flash_nvidia_nforce2(struct pci_dev *dev, const char *name)
867{
868        uint8_t tmp;
869
870        rpci_write_byte(dev, 0x92, 0);
871
872        tmp = pci_read_byte(dev, 0x6d);
873        tmp |= 0x01;
874        rpci_write_byte(dev, 0x6d, tmp);
875
876        return 0;
877}
878
879static int enable_flash_ck804(struct pci_dev *dev, const char *name)
880{
881        uint8_t old, new;
882
883        pci_write_byte(dev, 0x92, 0x00);
884        if (pci_read_byte(dev, 0x92) != 0x00) {
885                msg_pinfo("Setting register 0x%x to 0x%x on %s failed "
886                          "(WARNING ONLY).\n", 0x92, 0x00, name);
887        }
888
889        old = pci_read_byte(dev, 0x88);
890        new = old | 0xc0;
891        if (new != old) {
892                rpci_write_byte(dev, 0x88, new);
893                if (pci_read_byte(dev, 0x88) != new) {
894                        msg_pinfo("Setting register 0x%x to 0x%x on %s failed "
895                                  "(WARNING ONLY).\n", 0x88, new, name);
896                }
897        }
898
899        old = pci_read_byte(dev, 0x6d);
900        new = old | 0x01;
901        if (new == old)
902                return 0;
903        rpci_write_byte(dev, 0x6d, new);
904
905        if (pci_read_byte(dev, 0x6d) != new) {
906                msg_pinfo("Setting register 0x%x to 0x%x on %s failed "
907                          "(WARNING ONLY).\n", 0x6d, new, name);
908                return -1;
909        }
910
911        return 0;
912}
913
914static int enable_flash_osb4(struct pci_dev *dev, const char *name)
915{
916        uint8_t tmp;
917
918        internal_buses_supported = BUS_PARALLEL;
919
920        tmp = INB(0xc06);
921        tmp |= 0x1;
922        OUTB(tmp, 0xc06);
923
924        tmp = INB(0xc6f);
925        tmp |= 0x40;
926        OUTB(tmp, 0xc6f);
927
928        return 0;
929}
930
931/* ATI Technologies Inc IXP SB400 PCI-ISA Bridge (rev 80) */
932static int enable_flash_sb400(struct pci_dev *dev, const char *name)
933{
934        uint8_t tmp;
935        struct pci_dev *smbusdev;
936
937        /* Look for the SMBus device. */
938        smbusdev = pci_dev_find(0x1002, 0x4372);
939
940        if (!smbusdev) {
941                msg_perr("ERROR: SMBus device not found. Aborting.\n");
942                return ERROR_FATAL;
943        }
944
945        /* Enable some SMBus stuff. */
946        tmp = pci_read_byte(smbusdev, 0x79);
947        tmp |= 0x01;
948        rpci_write_byte(smbusdev, 0x79, tmp);
949
950        /* Change southbridge. */
951        tmp = pci_read_byte(dev, 0x48);
952        tmp |= 0x21;
953        rpci_write_byte(dev, 0x48, tmp);
954
955        /* Now become a bit silly. */
956        tmp = INB(0xc6f);
957        OUTB(tmp, 0xeb);
958        OUTB(tmp, 0xeb);
959        tmp |= 0x40;
960        OUTB(tmp, 0xc6f);
961        OUTB(tmp, 0xeb);
962        OUTB(tmp, 0xeb);
963
964        return 0;
965}
966
967static int enable_flash_mcp55(struct pci_dev *dev, const char *name)
968{
969        uint8_t old, new, val;
970        uint16_t wordval;
971
972        /* Set the 0-16 MB enable bits. */
973        val = pci_read_byte(dev, 0x88);
974        val |= 0xff;            /* 256K */
975        rpci_write_byte(dev, 0x88, val);
976        val = pci_read_byte(dev, 0x8c);
977        val |= 0xff;            /* 1M */
978        rpci_write_byte(dev, 0x8c, val);
979        wordval = pci_read_word(dev, 0x90);
980        wordval |= 0x7fff;      /* 16M */
981        rpci_write_word(dev, 0x90, wordval);
982
983        old = pci_read_byte(dev, 0x6d);
984        new = old | 0x01;
985        if (new == old)
986                return 0;
987        rpci_write_byte(dev, 0x6d, new);
988
989        if (pci_read_byte(dev, 0x6d) != new) {
990                msg_pinfo("Setting register 0x%x to 0x%x on %s failed "
991                          "(WARNING ONLY).\n", 0x6d, new, name);
992                return -1;
993        }
994
995        return 0;
996}
997
998/*
999 * The MCP6x/MCP7x code is based on cleanroom reverse engineering.
1000 * It is assumed that LPC chips need the MCP55 code and SPI chips need the
1001 * code provided in enable_flash_mcp6x_7x_common.
1002 */
1003static int enable_flash_mcp6x_7x(struct pci_dev *dev, const char *name)
1004{
1005        int ret = 0, want_spi = 0;
1006        uint8_t val;
1007
1008        msg_pinfo("This chipset is not really supported yet. Guesswork...\n");
1009
1010        /* dev is the ISA bridge. No idea what the stuff below does. */
1011        val = pci_read_byte(dev, 0x8a);
1012        msg_pdbg("ISA/LPC bridge reg 0x8a contents: 0x%02x, bit 6 is %i, bit 5 "
1013                 "is %i\n", val, (val >> 6) & 0x1, (val >> 5) & 0x1);
1014
1015        switch ((val >> 5) & 0x3) {
1016        case 0x0:
1017                ret = enable_flash_mcp55(dev, name);
1018                internal_buses_supported = BUS_LPC;
1019                msg_pdbg("Flash bus type is LPC\n");
1020                break;
1021        case 0x2:
1022                want_spi = 1;
1023                /* SPI is added in mcp6x_spi_init if it works.
1024                 * Do we really want to disable LPC in this case?
1025                 */
1026                internal_buses_supported = BUS_NONE;
1027                msg_pdbg("Flash bus type is SPI\n");
1028                msg_pinfo("SPI on this chipset is WIP. Please report any "
1029                          "success or failure by mailing us the verbose "
1030                          "output to flashrom@flashrom.org, thanks!\n");
1031                break;
1032        default:
1033                /* Should not happen. */
1034                internal_buses_supported = BUS_NONE;
1035                msg_pdbg("Flash bus type is unknown (none)\n");
1036                msg_pinfo("Something went wrong with bus type detection.\n");
1037                goto out_msg;
1038                break;
1039        }
1040
1041        /* Force enable SPI and disable LPC? Not a good idea. */
1042#if 0
1043        val |= (1 << 6);
1044        val &= ~(1 << 5);
1045        rpci_write_byte(dev, 0x8a, val);
1046#endif
1047
1048        if (mcp6x_spi_init(want_spi))
1049                ret = 1;
1050
1051out_msg:
1052        msg_pinfo("Please send the output of \"flashrom -V\" to "
1053                  "flashrom@flashrom.org with\n"
1054                  "your board name: flashrom -V as the subject to help us "
1055                  "finish support for your\n"
1056                  "chipset. Thanks.\n");
1057
1058        return ret;
1059}
1060
1061static int enable_flash_ht1000(struct pci_dev *dev, const char *name)
1062{
1063        uint8_t val;
1064
1065        /* Set the 4MB enable bit. */
1066        val = pci_read_byte(dev, 0x41);
1067        val |= 0x0e;
1068        rpci_write_byte(dev, 0x41, val);
1069
1070        val = pci_read_byte(dev, 0x43);
1071        val |= (1 << 4);
1072        rpci_write_byte(dev, 0x43, val);
1073
1074        return 0;
1075}
1076
1077/*
1078 * Usually on the x86 architectures (and on other PC-like platforms like some
1079 * Alphas or Itanium) the system flash is mapped right below 4G. On the AMD
1080 * Elan SC520 only a small piece of the system flash is mapped there, but the
1081 * complete flash is mapped somewhere below 1G. The position can be determined
1082 * by the BOOTCS PAR register.
1083 */
1084static int get_flashbase_sc520(struct pci_dev *dev, const char *name)
1085{
1086        int i, bootcs_found = 0;
1087        uint32_t parx = 0;
1088        void *mmcr;
1089
1090        /* 1. Map MMCR */
1091        mmcr = physmap("Elan SC520 MMCR", 0xfffef000, getpagesize());
1092
1093        /* 2. Scan PAR0 (0x88) - PAR15 (0xc4) for
1094         *    BOOTCS region (PARx[31:29] = 100b)e
1095         */
1096        for (i = 0x88; i <= 0xc4; i += 4) {
1097                parx = mmio_readl(mmcr + i);
1098                if ((parx >> 29) == 4) {
1099                        bootcs_found = 1;
1100                        break; /* BOOTCS found */
1101                }
1102        }
1103
1104        /* 3. PARx[25] = 1b --> flashbase[29:16] = PARx[13:0]
1105         *    PARx[25] = 0b --> flashbase[29:12] = PARx[17:0]
1106         */
1107        if (bootcs_found) {
1108                if (parx & (1 << 25)) {
1109                        parx &= (1 << 14) - 1; /* Mask [13:0] */
1110                        flashbase = parx << 16;
1111                } else {
1112                        parx &= (1 << 18) - 1; /* Mask [17:0] */
1113                        flashbase = parx << 12;
1114                }
1115        } else {
1116                msg_pinfo("AMD Elan SC520 detected, but no BOOTCS. "
1117                          "Assuming flash at 4G.\n");
1118        }
1119
1120        /* 4. Clean up */
1121        physunmap(mmcr, getpagesize());
1122        return 0;
1123}
1124
1125#endif
1126
1127/* Please keep this list numerically sorted by vendor/device ID. */
1128const struct penable chipset_enables[] = {
1129#if defined(__i386__) || defined(__x86_64__)
1130        {0x1002, 0x4377, OK, "ATI", "SB400",            enable_flash_sb400},
1131        {0x1002, 0x438d, OK, "AMD", "SB600",            enable_flash_sb600},
1132        {0x1002, 0x439d, OK, "AMD", "SB700/SB710/SB750/SB850", enable_flash_sb600},
1133        {0x100b, 0x0510, NT, "AMD", "SC1100",           enable_flash_sc1100},
1134        {0x1022, 0x2080, OK, "AMD", "CS5536",           enable_flash_cs5536},
1135        {0x1022, 0x2090, OK, "AMD", "CS5536",           enable_flash_cs5536},
1136        {0x1022, 0x3000, OK, "AMD", "Elan SC520",       get_flashbase_sc520},
1137        {0x1022, 0x7440, OK, "AMD", "AMD-768",          enable_flash_amd8111},
1138        {0x1022, 0x7468, OK, "AMD", "AMD8111",          enable_flash_amd8111},
1139        {0x1022, 0x780e, OK, "AMD", "Hudson",           enable_flash_sb600},
1140        {0x1039, 0x0406, NT, "SiS", "501/5101/5501",    enable_flash_sis501},
1141        {0x1039, 0x0496, NT, "SiS", "85C496+497",       enable_flash_sis85c496},
1142        {0x1039, 0x0530, OK, "SiS", "530",              enable_flash_sis530},
1143        {0x1039, 0x0540, NT, "SiS", "540",              enable_flash_sis540},
1144        {0x1039, 0x0620, NT, "SiS", "620",              enable_flash_sis530},
1145        {0x1039, 0x0630, NT, "SiS", "630",              enable_flash_sis540},
1146        {0x1039, 0x0635, NT, "SiS", "635",              enable_flash_sis540},
1147        {0x1039, 0x0640, NT, "SiS", "640",              enable_flash_sis540},
1148        {0x1039, 0x0645, NT, "SiS", "645",              enable_flash_sis540},
1149        {0x1039, 0x0646, OK, "SiS", "645DX",            enable_flash_sis540},
1150        {0x1039, 0x0648, NT, "SiS", "648",              enable_flash_sis540},
1151        {0x1039, 0x0650, NT, "SiS", "650",              enable_flash_sis540},
1152        {0x1039, 0x0651, OK, "SiS", "651",              enable_flash_sis540},
1153        {0x1039, 0x0655, NT, "SiS", "655",              enable_flash_sis540},
1154        {0x1039, 0x0661, OK, "SiS", "661",              enable_flash_sis540},
1155        {0x1039, 0x0730, NT, "SiS", "730",              enable_flash_sis540},
1156        {0x1039, 0x0733, NT, "SiS", "733",              enable_flash_sis540},
1157        {0x1039, 0x0735, OK, "SiS", "735",              enable_flash_sis540},
1158        {0x1039, 0x0740, NT, "SiS", "740",              enable_flash_sis540},
1159        {0x1039, 0x0741, OK, "SiS", "741",              enable_flash_sis540},
1160        {0x1039, 0x0745, OK, "SiS", "745",              enable_flash_sis540},
1161        {0x1039, 0x0746, NT, "SiS", "746",              enable_flash_sis540},
1162        {0x1039, 0x0748, NT, "SiS", "748",              enable_flash_sis540},
1163        {0x1039, 0x0755, NT, "SiS", "755",              enable_flash_sis540},
1164        {0x1039, 0x5511, NT, "SiS", "5511",             enable_flash_sis5511},
1165        {0x1039, 0x5571, NT, "SiS", "5571",             enable_flash_sis530},
1166        {0x1039, 0x5591, NT, "SiS", "5591/5592",        enable_flash_sis530},
1167        {0x1039, 0x5596, NT, "SiS", "5596",             enable_flash_sis5511},
1168        {0x1039, 0x5597, NT, "SiS", "5597/5598/5581/5120", enable_flash_sis530},
1169        {0x1039, 0x5600, NT, "SiS", "600",              enable_flash_sis530},
1170        {0x1078, 0x0100, OK, "AMD", "CS5530(A)",        enable_flash_cs5530},
1171        {0x10b9, 0x1533, OK, "ALi", "M1533",            enable_flash_ali_m1533},
1172        {0x10de, 0x0030, OK, "NVIDIA", "nForce4/MCP4",  enable_flash_nvidia_nforce2},
1173        {0x10de, 0x0050, OK, "NVIDIA", "CK804",         enable_flash_ck804}, /* LPC */
1174        {0x10de, 0x0051, OK, "NVIDIA", "CK804",         enable_flash_ck804}, /* Pro */
1175        {0x10de, 0x0060, OK, "NVIDIA", "NForce2",       enable_flash_nvidia_nforce2},
1176        {0x10de, 0x00e0, OK, "NVIDIA", "NForce3",       enable_flash_nvidia_nforce2},
1177        /* Slave, should not be here, to fix known bug for A01. */
1178        {0x10de, 0x00d3, OK, "NVIDIA", "CK804",         enable_flash_ck804},
1179        {0x10de, 0x0260, OK, "NVIDIA", "MCP51",         enable_flash_ck804},
1180        {0x10de, 0x0261, NT, "NVIDIA", "MCP51",         enable_flash_ck804},
1181        {0x10de, 0x0262, NT, "NVIDIA", "MCP51",         enable_flash_ck804},
1182        {0x10de, 0x0263, NT, "NVIDIA", "MCP51",         enable_flash_ck804},
1183        {0x10de, 0x0360, OK, "NVIDIA", "MCP55",         enable_flash_mcp55}, /* M57SLI*/
1184        /* 10de:0361 is present in Tyan S2915 OEM systems, but not connected to
1185         * the flash chip. Instead, 10de:0364 is connected to the flash chip.
1186         * Until we have PCI device class matching or some fallback mechanism,
1187         * this is needed to get flashrom working on Tyan S2915 and maybe other
1188         * dual-MCP55 boards.
1189         */
1190#if 0
1191        {0x10de, 0x0361, NT, "NVIDIA", "MCP55",         enable_flash_mcp55}, /* LPC */
1192#endif
1193        {0x10de, 0x0362, OK, "NVIDIA", "MCP55",         enable_flash_mcp55}, /* LPC */
1194        {0x10de, 0x0363, OK, "NVIDIA", "MCP55",         enable_flash_mcp55}, /* LPC */
1195        {0x10de, 0x0364, OK, "NVIDIA", "MCP55",         enable_flash_mcp55}, /* LPC */
1196        {0x10de, 0x0365, OK, "NVIDIA", "MCP55",         enable_flash_mcp55}, /* LPC */
1197        {0x10de, 0x0366, OK, "NVIDIA", "MCP55",         enable_flash_mcp55}, /* LPC */
1198        {0x10de, 0x0367, OK, "NVIDIA", "MCP55",         enable_flash_mcp55}, /* Pro */
1199        {0x10de, 0x03e0, NT, "NVIDIA", "MCP61",         enable_flash_mcp6x_7x},
1200        {0x10de, 0x03e1, OK, "NVIDIA", "MCP61",         enable_flash_mcp6x_7x},
1201        {0x10de, 0x03e2, NT, "NVIDIA", "MCP61",         enable_flash_mcp6x_7x},
1202        {0x10de, 0x03e3, NT, "NVIDIA", "MCP61",         enable_flash_mcp6x_7x},
1203        {0x10de, 0x0440, NT, "NVIDIA", "MCP65",         enable_flash_mcp6x_7x},
1204        {0x10de, 0x0441, NT, "NVIDIA", "MCP65",         enable_flash_mcp6x_7x},
1205        {0x10de, 0x0442, NT, "NVIDIA", "MCP65",         enable_flash_mcp6x_7x},
1206        {0x10de, 0x0443, NT, "NVIDIA", "MCP65",         enable_flash_mcp6x_7x},
1207        {0x10de, 0x0548, OK, "NVIDIA", "MCP67",         enable_flash_mcp6x_7x},
1208        {0x10de, 0x075c, NT, "NVIDIA", "MCP78S",        enable_flash_mcp6x_7x},
1209        {0x10de, 0x075d, OK, "NVIDIA", "MCP78S",        enable_flash_mcp6x_7x},
1210        {0x10de, 0x07d7, NT, "NVIDIA", "MCP73",         enable_flash_mcp6x_7x},
1211        {0x10de, 0x0aac, NT, "NVIDIA", "MCP79",         enable_flash_mcp6x_7x},
1212        {0x10de, 0x0aad, NT, "NVIDIA", "MCP79",         enable_flash_mcp6x_7x},
1213        {0x10de, 0x0aae, NT, "NVIDIA", "MCP79",         enable_flash_mcp6x_7x},
1214        {0x10de, 0x0aaf, NT, "NVIDIA", "MCP79",         enable_flash_mcp6x_7x},
1215        /* VIA northbridges */
1216        {0x1106, 0x0585, NT, "VIA", "VT82C585VPX",      via_no_byte_merge},
1217        {0x1106, 0x0595, NT, "VIA", "VT82C595",         via_no_byte_merge},
1218        {0x1106, 0x0597, NT, "VIA", "VT82C597",         via_no_byte_merge},
1219        {0x1106, 0x0601, NT, "VIA", "VT8601/VT8601A",   via_no_byte_merge},
1220        {0x1106, 0x0691, NT, "VIA", "VT82C69x",         via_no_byte_merge}, /* 691, 693a, 694t, 694x checked */
1221        {0x1106, 0x8601, NT, "VIA", "VT8601T",          via_no_byte_merge},
1222        /* VIA southbridges */
1223        {0x1106, 0x0586, OK, "VIA", "VT82C586A/B",      enable_flash_amd8111},
1224        {0x1106, 0x0596, OK, "VIA", "VT82C596",         enable_flash_amd8111},
1225        {0x1106, 0x0686, NT, "VIA", "VT82C686A/B",      enable_flash_amd8111},
1226        {0x1106, 0x3074, OK, "VIA", "VT8233",           enable_flash_vt823x},
1227        {0x1106, 0x3147, OK, "VIA", "VT8233A",          enable_flash_vt823x},
1228        {0x1106, 0x3177, OK, "VIA", "VT8235",           enable_flash_vt823x},
1229        {0x1106, 0x3227, OK, "VIA", "VT8237",           enable_flash_vt823x},
1230        {0x1106, 0x3337, OK, "VIA", "VT8237A",          enable_flash_vt823x},
1231        {0x1106, 0x3372, OK, "VIA", "VT8237S",          enable_flash_vt8237s_spi},
1232        {0x1106, 0x8231, NT, "VIA", "VT8231",           enable_flash_vt823x},
1233        {0x1106, 0x8324, OK, "VIA", "CX700",            enable_flash_vt823x},
1234        {0x1106, 0x8353, OK, "VIA", "VX800/VX820",      enable_flash_vt8237s_spi},
1235        {0x1106, 0x8409, OK, "VIA", "VX855/VX875",      enable_flash_vt823x},
1236        {0x1166, 0x0200, OK, "Broadcom", "OSB4",        enable_flash_osb4},
1237        {0x1166, 0x0205, OK, "Broadcom", "HT-1000",     enable_flash_ht1000},
1238        {0x8086, 0x122e, OK, "Intel", "PIIX",           enable_flash_piix4},
1239        {0x8086, 0x1234, NT, "Intel", "MPIIX",          enable_flash_piix4},
1240        {0x8086, 0x1c44, OK, "Intel", "Z68",            enable_flash_pch6},
1241        {0x8086, 0x1c46, OK, "Intel", "P67",            enable_flash_pch6},
1242        {0x8086, 0x1c47, NT, "Intel", "UM67",           enable_flash_pch6},
1243        {0x8086, 0x1c49, NT, "Intel", "HM65",           enable_flash_pch6},
1244        {0x8086, 0x1c4a, OK, "Intel", "H67",            enable_flash_pch6},
1245        {0x8086, 0x1c4b, NT, "Intel", "HM67",           enable_flash_pch6},
1246        {0x8086, 0x1c4c, NT, "Intel", "Q65",            enable_flash_pch6},
1247        {0x8086, 0x1c4d, NT, "Intel", "QS67",           enable_flash_pch6},
1248        {0x8086, 0x1c4e, NT, "Intel", "Q67",            enable_flash_pch6},
1249        {0x8086, 0x1c4f, NT, "Intel", "QM67",           enable_flash_pch6},
1250        {0x8086, 0x1c50, NT, "Intel", "B65",            enable_flash_pch6},
1251        {0x8086, 0x1c52, NT, "Intel", "C202",           enable_flash_pch6},
1252        {0x8086, 0x1c54, NT, "Intel", "C204",           enable_flash_pch6},
1253        {0x8086, 0x1c56, NT, "Intel", "C206",           enable_flash_pch6},
1254        {0x8086, 0x1c5c, NT, "Intel", "H61",            enable_flash_pch6},
1255        {0x8086, 0x1d40, OK, "Intel", "X79",            enable_flash_ich10}, /* FIXME: when datasheet is available */
1256        {0x8086, 0x1d41, NT, "Intel", "X79",            enable_flash_ich10}, /* FIXME: when datasheet is available */
1257        {0x8086, 0x2410, OK, "Intel", "ICH",            enable_flash_ich_4e},
1258        {0x8086, 0x2420, OK, "Intel", "ICH0",           enable_flash_ich_4e},
1259        {0x8086, 0x2440, OK, "Intel", "ICH2",           enable_flash_ich_4e},
1260        {0x8086, 0x244c, OK, "Intel", "ICH2-M",         enable_flash_ich_4e},
1261        {0x8086, 0x2450, NT, "Intel", "C-ICH",          enable_flash_ich_4e},
1262        {0x8086, 0x2480, OK, "Intel", "ICH3-S",         enable_flash_ich_4e},
1263        {0x8086, 0x248c, OK, "Intel", "ICH3-M",         enable_flash_ich_4e},
1264        {0x8086, 0x24c0, OK, "Intel", "ICH4/ICH4-L",    enable_flash_ich_4e},
1265        {0x8086, 0x24cc, OK, "Intel", "ICH4-M",         enable_flash_ich_4e},
1266        {0x8086, 0x24d0, OK, "Intel", "ICH5/ICH5R",     enable_flash_ich_4e},
1267        {0x8086, 0x25a1, OK, "Intel", "6300ESB",        enable_flash_ich_4e},
1268        {0x8086, 0x2640, OK, "Intel", "ICH6/ICH6R",     enable_flash_ich_dc},
1269        {0x8086, 0x2641, OK, "Intel", "ICH6-M",         enable_flash_ich_dc},
1270        {0x8086, 0x2642, NT, "Intel", "ICH6W/ICH6RW",   enable_flash_ich_dc},
1271        {0x8086, 0x2670, OK, "Intel", "631xESB/632xESB/3100", enable_flash_ich_dc},
1272        {0x8086, 0x27b0, OK, "Intel", "ICH7DH",         enable_flash_ich7},
1273        {0x8086, 0x27b8, OK, "Intel", "ICH7/ICH7R",     enable_flash_ich7},
1274        {0x8086, 0x27b9, OK, "Intel", "ICH7M",          enable_flash_ich7},
1275        {0x8086, 0x27bc, OK, "Intel", "NM10",           enable_flash_ich7},
1276        {0x8086, 0x27bd, OK, "Intel", "ICH7MDH",        enable_flash_ich7},
1277        {0x8086, 0x2810, OK, "Intel", "ICH8/ICH8R",     enable_flash_ich8},
1278        {0x8086, 0x2811, OK, "Intel", "ICH8M-E",        enable_flash_ich8},
1279        {0x8086, 0x2812, OK, "Intel", "ICH8DH",         enable_flash_ich8},
1280        {0x8086, 0x2814, OK, "Intel", "ICH8DO",         enable_flash_ich8},
1281        {0x8086, 0x2815, OK, "Intel", "ICH8M",          enable_flash_ich8},
1282        {0x8086, 0x2910, OK, "Intel", "ICH9 Engineering Sample", enable_flash_ich9},
1283        {0x8086, 0x2912, OK, "Intel", "ICH9DH",         enable_flash_ich9},
1284        {0x8086, 0x2914, OK, "Intel", "ICH9DO",         enable_flash_ich9},
1285        {0x8086, 0x2916, OK, "Intel", "ICH9R",          enable_flash_ich9},
1286        {0x8086, 0x2917, OK, "Intel", "ICH9M-E",        enable_flash_ich9},
1287        {0x8086, 0x2918, OK, "Intel", "ICH9",           enable_flash_ich9},
1288        {0x8086, 0x2919, OK, "Intel", "ICH9M",          enable_flash_ich9},
1289        {0x8086, 0x3a10, NT, "Intel", "ICH10R Engineering Sample", enable_flash_ich10},
1290        {0x8086, 0x3a14, OK, "Intel", "ICH10DO",        enable_flash_ich10},
1291        {0x8086, 0x3a16, OK, "Intel", "ICH10R",         enable_flash_ich10},
1292        {0x8086, 0x3a18, OK, "Intel", "ICH10",          enable_flash_ich10},
1293        {0x8086, 0x3a1a, OK, "Intel", "ICH10D",         enable_flash_ich10},
1294        {0x8086, 0x3a1e, NT, "Intel", "ICH10 Engineering Sample", enable_flash_ich10},
1295        {0x8086, 0x3b00, NT, "Intel", "3400 Desktop",   enable_flash_pch5},
1296        {0x8086, 0x3b01, NT, "Intel", "3400 Mobile",    enable_flash_pch5},
1297        {0x8086, 0x3b02, NT, "Intel", "P55",            enable_flash_pch5},
1298        {0x8086, 0x3b03, NT, "Intel", "PM55",           enable_flash_pch5},
1299        {0x8086, 0x3b06, OK, "Intel", "H55",            enable_flash_pch5},
1300        {0x8086, 0x3b07, OK, "Intel", "QM57",           enable_flash_pch5},
1301        {0x8086, 0x3b08, NT, "Intel", "H57",            enable_flash_pch5},
1302        {0x8086, 0x3b09, NT, "Intel", "HM55",           enable_flash_pch5},
1303        {0x8086, 0x3b0a, NT, "Intel", "Q57",            enable_flash_pch5},
1304        {0x8086, 0x3b0b, NT, "Intel", "HM57",           enable_flash_pch5},
1305        {0x8086, 0x3b0d, NT, "Intel", "3400 Mobile SFF", enable_flash_pch5},
1306        {0x8086, 0x3b0e, NT, "Intel", "B55",            enable_flash_pch5},
1307        {0x8086, 0x3b0f, OK, "Intel", "QS57",           enable_flash_pch5},
1308        {0x8086, 0x3b12, NT, "Intel", "3400",           enable_flash_pch5},
1309        {0x8086, 0x3b14, NT, "Intel", "3420",           enable_flash_pch5},
1310        {0x8086, 0x3b16, NT, "Intel", "3450",           enable_flash_pch5},
1311        {0x8086, 0x3b1e, NT, "Intel", "B55",            enable_flash_pch5},
1312        {0x8086, 0x5031, OK, "Intel", "EP80579",        enable_flash_ich7},
1313        {0x8086, 0x7000, OK, "Intel", "PIIX3",          enable_flash_piix4},
1314        {0x8086, 0x7110, OK, "Intel", "PIIX4/4E/4M",    enable_flash_piix4},
1315        {0x8086, 0x7198, OK, "Intel", "440MX",          enable_flash_piix4},
1316        {0x8086, 0x8119, OK, "Intel", "SCH Poulsbo",    enable_flash_poulsbo},
1317        {0x8086, 0x8186, OK, "Intel", "Atom E6xx(T)/Tunnel Creek", enable_flash_tunnelcreek},
1318#endif
1319        {},
1320};
1321
1322int chipset_flash_enable(void)
1323{
1324        struct pci_dev *dev = NULL;
1325        int ret = -2;           /* Nothing! */
1326        int i;
1327
1328        /* Now let's try to find the chipset we have... */
1329        for (i = 0; chipset_enables[i].vendor_name != NULL; i++) {
1330                dev = pci_dev_find(chipset_enables[i].vendor_id,
1331                                   chipset_enables[i].device_id);
1332                if (!dev)
1333                        continue;
1334                if (ret != -2) {
1335                        msg_pinfo("WARNING: unexpected second chipset match: "
1336                                    "\"%s %s\"\n"
1337                                  "ignoring, please report lspci and board URL "
1338                                    "to flashrom@flashrom.org\n"
1339                                  "with \'CHIPSET: your board name\' in the "
1340                                    "subject line.\n",
1341                                chipset_enables[i].vendor_name,
1342                                        chipset_enables[i].device_name);
1343                        continue;
1344                }
1345                msg_pinfo("Found chipset \"%s %s\"",
1346                          chipset_enables[i].vendor_name,
1347                          chipset_enables[i].device_name);
1348                msg_pdbg(" with PCI ID %04x:%04x",
1349                         chipset_enables[i].vendor_id,
1350                         chipset_enables[i].device_id);
1351                msg_pinfo(". ");
1352
1353                if (chipset_enables[i].status == NT) {
1354                        msg_pinfo("\nThis chipset is marked as untested. If "
1355                                  "you are using an up-to-date version\nof "
1356                                  "flashrom please email a report to "
1357                                  "flashrom@flashrom.org including a\nverbose "
1358                                  "(-V) log. Thank you!\n");
1359                }
1360                msg_pinfo("Enabling flash write... ");
1361                ret = chipset_enables[i].doit(dev,
1362                                              chipset_enables[i].device_name);
1363                if (ret == NOT_DONE_YET) {
1364                        ret = -2;
1365                        msg_pinfo("OK - searching further chips.\n");
1366                } else if (ret < 0)
1367                        msg_pinfo("FAILED!\n");
1368                else if (ret == 0)
1369                        msg_pinfo("OK.\n");
1370                else if (ret == ERROR_NONFATAL)
1371                        msg_pinfo("PROBLEMS, continuing anyway\n");
1372                if (ret == ERROR_FATAL) {
1373                        msg_perr("FATAL ERROR!\n");
1374                        return ret;
1375                }
1376        }
1377
1378        return ret;
1379}
Note: See TracBrowser for help on using the repository browser.