/*
 * This file is part of the flashrom project.
 *
 * Copyright (C) 2000 Silicon Integrated System Corporation
 * Copyright (C) 2005-2009 coresystems GmbH
 * Copyright (C) 2006 Uwe Hermann <uwe@hermann-uwe.de>
 * Copyright (C) 2007,2008,2009 Carl-Daniel Hailfinger
 * Copyright (C) 2009 Kontron Modular Computers GmbH
 * Copyright (C) 2011, 2012 Stefan Tauner
 * Copyright (C) 2017 secunet Security Networks AG
 * (Written by Nico Huber <nico.huber@secunet.com> for secunet)
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; version 2 of the License.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 */

/*
 * Contains the chipset specific flash enables.
 */

#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <inttypes.h>
#include <errno.h>
#include "flash.h"
#include "programmer.h"
#include "hwaccess_physmap.h"
#include "platform/pci.h"

#define NOT_DONE_YET 1

#if defined(__i386__) || defined(__x86_64__)

#include "hwaccess_x86_io.h"
#include "hwaccess_x86_msr.h"

static int enable_flash_ali_m1533(struct flashprog_programmer *prog, struct pci_dev *dev, const char *name)
{
	uint8_t tmp;

	/*
	 * ROM Write enable, 0xFFFC0000-0xFFFDFFFF and
	 * 0xFFFE0000-0xFFFFFFFF ROM select enable.
	 */
	tmp = pci_read_byte(dev, 0x47);
	tmp |= 0x46;
	rpci_write_byte(dev, 0x47, tmp);

	return 0;
}

static int enable_flash_rdc_r8610(struct flashprog_programmer *prog, struct pci_dev *dev, const char *name)
{
	uint8_t tmp;

	/* enable ROMCS for writes */
	tmp = pci_read_byte(dev, 0x43);
	tmp |= 0x80;
	pci_write_byte(dev, 0x43, tmp);

	/* read the bootstrapping register */
	tmp = pci_read_byte(dev, 0x40) & 0x3;
	switch (tmp) {
	case 3:
		internal_buses_supported &= BUS_FWH;
		break;
	case 2:
		internal_buses_supported &= BUS_LPC;
		break;
	default:
		internal_buses_supported &= BUS_PARALLEL;
		break;
	}

	return 0;
}

static int enable_flash_sis85c496(struct flashprog_programmer *prog, struct pci_dev *dev, const char *name)
{
	uint8_t tmp;

	tmp = pci_read_byte(dev, 0xd0);
	tmp |= 0xf8;
	rpci_write_byte(dev, 0xd0, tmp);

	return 0;
}

static int enable_flash_sis_mapping(struct pci_dev *dev, const char *name)
{
	#define SIS_MAPREG 0x40
	uint8_t new, newer;

	/* Extended BIOS enable = 1, Lower BIOS Enable = 1 */
	/* This is 0xFFF8000~0xFFFF0000 decoding on SiS 540/630. */
	new = pci_read_byte(dev, SIS_MAPREG);
	new &= (~0x04); /* No idea why we clear bit 2. */
	new |= 0xb; /* 0x3 for some chipsets, bit 7 seems to be don't care. */
	rpci_write_byte(dev, SIS_MAPREG, new);
	newer = pci_read_byte(dev, SIS_MAPREG);
	if (newer != new) { /* FIXME: share this with other code? */
		msg_pinfo("Setting register 0x%x to 0x%02x on %s failed (WARNING ONLY).\n",
			  SIS_MAPREG, new, name);
		msg_pinfo("Stuck at 0x%02x.\n", newer);
		return -1;
	}
	return 0;
}

static struct pci_dev *find_southbridge(uint16_t vendor, const char *name)
{
	struct pci_dev *sbdev;

	sbdev = pcidev_find_vendorclass(vendor, 0x0601);
	if (!sbdev)
		sbdev = pcidev_find_vendorclass(vendor, 0x0680);
	if (!sbdev)
		sbdev = pcidev_find_vendorclass(vendor, 0x0000);
	if (!sbdev)
		msg_perr("No southbridge found for %s!\n", name);
	if (sbdev)
		msg_pdbg("Found southbridge %04x:%04x at %02x:%02x:%01x\n",
			 sbdev->vendor_id, sbdev->device_id,
			 sbdev->bus, sbdev->dev, sbdev->func);
	return sbdev;
}

static int enable_flash_sis501(struct flashprog_programmer *prog, struct pci_dev *dev, const char *name)
{
	uint8_t tmp;
	int ret = 0;
	struct pci_dev *sbdev;

	sbdev = find_southbridge(dev->vendor_id, name);
	if (!sbdev)
		return -1;

	ret = enable_flash_sis_mapping(sbdev, name);

	tmp = sio_read(0x22, 0x80);
	tmp &= (~0x20);
	tmp |= 0x4;
	sio_write(0x22, 0x80, tmp);

	tmp = sio_read(0x22, 0x70);
	tmp &= (~0x20);
	tmp |= 0x4;
	sio_write(0x22, 0x70, tmp);

	return ret;
}

static int enable_flash_sis5511(struct flashprog_programmer *prog, struct pci_dev *dev, const char *name)
{
	uint8_t tmp;
	int ret = 0;
	struct pci_dev *sbdev;

	sbdev = find_southbridge(dev->vendor_id, name);
	if (!sbdev)
		return -1;

	ret = enable_flash_sis_mapping(sbdev, name);

	tmp = sio_read(0x22, 0x50);
	tmp &= (~0x20);
	tmp |= 0x4;
	sio_write(0x22, 0x50, tmp);

	return ret;
}

static int enable_flash_sis5x0(struct pci_dev *dev, const char *name, uint8_t dis_mask, uint8_t en_mask)
{
	#define SIS_REG 0x45
	uint8_t new, newer;
	int ret = 0;
	struct pci_dev *sbdev;

	sbdev = find_southbridge(dev->vendor_id, name);
	if (!sbdev)
		return -1;

	ret = enable_flash_sis_mapping(sbdev, name);

	new = pci_read_byte(sbdev, SIS_REG);
	new &= (~dis_mask);
	new |= en_mask;
	rpci_write_byte(sbdev, SIS_REG, new);
	newer = pci_read_byte(sbdev, SIS_REG);
	if (newer != new) { /* FIXME: share this with other code? */
		msg_pinfo("Setting register 0x%x to 0x%02x on %s failed (WARNING ONLY).\n", SIS_REG, new, name);
		msg_pinfo("Stuck at 0x%02x\n", newer);
		ret = -1;
	}

	return ret;
}

static int enable_flash_sis530(struct flashprog_programmer *prog, struct pci_dev *dev, const char *name)
{
	return enable_flash_sis5x0(dev, name, 0x20, 0x04);
}

static int enable_flash_sis540(struct flashprog_programmer *prog, struct pci_dev *dev, const char *name)
{
	return enable_flash_sis5x0(dev, name, 0x80, 0x40);
}

/* Datasheet:
 *   - Name: 82371AB PCI-TO-ISA / IDE XCELERATOR (PIIX4)
 *   - URL: http://www.intel.com/design/intarch/datashts/290562.htm
 *   - PDF: http://www.intel.com/design/intarch/datashts/29056201.pdf
 *   - Order Number: 290562-001
 */
static int enable_flash_piix4(struct flashprog_programmer *prog, struct pci_dev *dev, const char *name)
{
	uint16_t old, new;
	uint16_t xbcs = 0x4e;	/* X-Bus Chip Select register. */

	internal_buses_supported &= BUS_PARALLEL;

	old = pci_read_word(dev, xbcs);

	/* Set bit 9: 1-Meg Extended BIOS Enable (PCI master accesses to
	 *            FFF00000-FFF7FFFF are forwarded to ISA).
	 *            Note: This bit is reserved on PIIX/PIIX3/MPIIX.
	 * Set bit 7: Extended BIOS Enable (PCI master accesses to
	 *            FFF80000-FFFDFFFF are forwarded to ISA).
	 * Set bit 6: Lower BIOS Enable (PCI master, or ISA master accesses to
	 *            the lower 64-Kbyte BIOS block (E0000-EFFFF) at the top
	 *            of 1 Mbyte, or the aliases at the top of 4 Gbyte
	 *            (FFFE0000-FFFEFFFF) result in the generation of BIOSCS#.
	 * Note: Accesses to FFFF0000-FFFFFFFF are always forwarded to ISA.
	 * Set bit 2: BIOSCS# Write Enable (1=enable, 0=disable).
	 */
	if (dev->device_id == 0x122e || dev->device_id == 0x7000
	    || dev->device_id == 0x1234)
		new = old | 0x00c4; /* PIIX/PIIX3/MPIIX: Bit 9 is reserved. */
	else
		new = old | 0x02c4;

	if (new == old)
		return 0;

	rpci_write_word(dev, xbcs, new);

	if (pci_read_word(dev, xbcs) != new) { /* FIXME: share this with other code? */
		msg_pinfo("Setting register 0x%04x to 0x%04x on %s failed (WARNING ONLY).\n", xbcs, new, name);
		return -1;
	}

	return 0;
}

/* Handle BIOS_CNTL (aka. BCR). Disable locks and enable writes. The register can either be in PCI config space
 * at the offset given by 'bios_cntl' or at the memory-mapped address 'addr'.
 *
 * Note: the ICH0-ICH5 BIOS_CNTL register is actually 16 bit wide, in Poulsbo, Tunnel Creek and other Atom
 * chipsets/SoCs it is even 32b, but just treating it as 8 bit wide seems to work fine in practice. */
static int enable_flash_ich_bios_cntl_common(enum ich_chipset ich_generation, void *addr,
					     struct pci_dev *dev, uint8_t bios_cntl)
{
	uint8_t old, new, wanted;

	switch (ich_generation) {
	case CHIPSET_ICH_UNKNOWN:
		return ERROR_FATAL;
	/* Non-SPI-capable */
	case CHIPSET_ICH:
	case CHIPSET_ICH2345:
		break;
	/* Some Atom chipsets are special: The second byte of BIOS_CNTL (D9h) contains a prefetch bit similar to
	 * what other SPI-capable chipsets have at DCh. Others like Bay Trail use a memmapped register.
	 * The Tunnel Creek datasheet contains a lot of details about the SPI controller, among other things it
	 * mentions that the prefetching and caching does only happen for direct memory reads.
	 * Therefore - at least for Tunnel Creek - it should not matter to flashprog because we use the
	 * programmed access only and not memory mapping. */
	case CHIPSET_TUNNEL_CREEK:
	case CHIPSET_POULSBO:
	case CHIPSET_CENTERTON:
		old = pci_read_byte(dev, bios_cntl + 1);
		msg_pdbg("BIOS Prefetch Enable: %sabled, ", (old & 1) ? "en" : "dis");
		break;
	case CHIPSET_BAYTRAIL:
	case CHIPSET_ICH7:
	default: /* Future version might behave the same */
		if (ich_generation == CHIPSET_BAYTRAIL)
			old = (mmio_readl(addr) >> 2) & 0x3;
		else
			old = (pci_read_byte(dev, bios_cntl) >> 2) & 0x3;
		msg_pdbg("SPI Read Configuration: ");
		if (old == 3)
			msg_pdbg("invalid prefetching/caching settings, ");
		else
			msg_pdbg("prefetching %sabled, caching %sabled, ",
				     (old & 0x2) ? "en" : "dis",
				     (old & 0x1) ? "dis" : "en");
	}

	if (ich_generation == CHIPSET_BAYTRAIL)
		wanted = old = mmio_readl(addr);
	else
		wanted = old = pci_read_byte(dev, bios_cntl);

	/*
	 * Quote from the 6 Series datasheet (Document Number: 324645-004):
	 * "Bit 5: SMM BIOS Write Protect Disable (SMM_BWP)
	 * 1 = BIOS region SMM protection is enabled.
	 * The BIOS Region is not writable unless all processors are in SMM."
	 * In earlier chipsets this bit is reserved.
	 *
	 * Try to unset it in any case.
	 * It won't hurt and makes sense in some cases according to Stefan Reinauer.
	 *
	 * At least in Centerton aforementioned bit is located at bit 7. It is unspecified in all other Atom
	 * and Desktop chipsets before Ibex Peak/5 Series, but we reset bit 5 anyway.
	 */
	int smm_bwp_bit;
	if (ich_generation == CHIPSET_CENTERTON)
		smm_bwp_bit = 7;
	else
		smm_bwp_bit = 5;
	wanted &= ~(1 << smm_bwp_bit);

	/* Tunnel Creek has a cache disable at bit 2 of the lowest BIOS_CNTL byte. */
	if (ich_generation == CHIPSET_TUNNEL_CREEK)
		wanted |= (1 << 2);

	wanted |= (1 << 0); /* Set BIOS Write Enable */
	wanted &= ~(1 << 1); /* Disable lock (futile) */

	/* Only write the register if it's necessary */
	if (wanted != old) {
		if (ich_generation == CHIPSET_BAYTRAIL) {
			rmmio_writel(wanted, addr);
			new = mmio_readl(addr);
		} else {
			rpci_write_byte(dev, bios_cntl, wanted);
			new = pci_read_byte(dev, bios_cntl);
		}
	} else
		new = old;

	msg_pdbg("\nBIOS_CNTL = 0x%02x: ", new);
	msg_pdbg("BIOS Lock Enable: %sabled, ", (new & (1 << 1)) ? "en" : "dis");
	msg_pdbg("BIOS Write Enable: %sabled\n", (new & (1 << 0)) ? "en" : "dis");
	if (new & (1 << smm_bwp_bit))
		msg_pwarn("Warning: BIOS region SMM protection is enabled!\n");

	if (new != wanted)
		msg_pwarn("Warning: Setting BIOS Control at 0x%x from 0x%02x to 0x%02x failed.\n"
			  "New value is 0x%02x.\n", bios_cntl, old, wanted, new);

	/* Return an error if we could not set the write enable only. */
	if (!(new & (1 << 0)))
		return -1;

	return 0;
}

static int enable_flash_ich_bios_cntl_config_space(struct pci_dev *dev, enum ich_chipset ich_generation,
						   uint8_t bios_cntl)
{
	return enable_flash_ich_bios_cntl_common(ich_generation, NULL, dev, bios_cntl);
}

static int enable_flash_ich_bios_cntl_memmapped(enum ich_chipset ich_generation, void *addr)
{
	return enable_flash_ich_bios_cntl_common(ich_generation, addr, NULL, 0);
}

static int enable_flash_ich_fwh_decode(struct flashprog_programmer *prog,
				       struct pci_dev *dev, enum ich_chipset ich_generation)
{
	struct internal_data *const internal = prog->data;
	uint8_t fwh_sel1 = 0, fwh_sel2 = 0, fwh_dec_en_lo = 0, fwh_dec_en_hi = 0; /* silence compilers */
	bool implemented = 0;
	void *ilb = NULL; /* Only for Baytrail */
	switch (ich_generation) {
	case CHIPSET_ICH:
		/* FIXME: Unlike later chipsets, ICH and ICH-0 do only support mapping of the top-most 4MB
		 * and therefore do only feature FWH_DEC_EN (E3h, different default too) and FWH_SEL (E8h). */
		break;
	case CHIPSET_ICH2345:
		fwh_sel1 = 0xe8;
		fwh_sel2 = 0xee;
		fwh_dec_en_lo = 0xf0;
		fwh_dec_en_hi = 0xe3;
		implemented = 1;
		break;
	case CHIPSET_POULSBO:
	case CHIPSET_TUNNEL_CREEK:
		/* FIXME: Similar to ICH and ICH-0, Tunnel Creek and Poulsbo do only feature one register each,
		 * FWH_DEC_EN (D7h) and FWH_SEL (D0h). */
		break;
	case CHIPSET_CENTERTON:
		/* FIXME: Similar to above FWH_DEC_EN (D4h) and FWH_SEL (D0h). */
		break;
	case CHIPSET_BAYTRAIL: {
		uint32_t ilb_base = pci_read_long(dev, 0x50) & 0xfffffe00; /* bits 31:9 */
		if (ilb_base == 0) {
			msg_perr("Error: Invalid ILB_BASE_ADDRESS\n");
			return ERROR_FATAL;
		}
		ilb = rphysmap("BYT IBASE", ilb_base, 512);
		fwh_sel1 = 0x18;
		fwh_dec_en_lo = 0xd8;
		fwh_dec_en_hi = 0xd9;
		implemented = 1;
		break;
	}
	case CHIPSET_ICH6:
	case CHIPSET_ICH7:
	default: /* Future version might behave the same */
		fwh_sel1 = 0xd0;
		fwh_sel2 = 0xd4;
		fwh_dec_en_lo = 0xd8;
		fwh_dec_en_hi = 0xd9;
		implemented = 1;
		break;
	}

	char *idsel = extract_programmer_param("fwh_idsel");
	if (idsel && strlen(idsel)) {
		if (!implemented) {
			msg_perr("Error: fwh_idsel= specified, but (yet) unsupported on this chipset.\n");
			goto idsel_garbage_out;
		}
		errno = 0;
		/* Base 16, nothing else makes sense. */
		uint64_t fwh_idsel = (uint64_t)strtoull(idsel, NULL, 16);
		if (errno) {
			msg_perr("Error: fwh_idsel= specified, but value could not be converted.\n");
			goto idsel_garbage_out;
		}
		uint64_t fwh_mask = 0xffffffff;
		if (fwh_sel2 > 0)
			fwh_mask |= (0xffffULL << 32);
		if (fwh_idsel & ~fwh_mask) {
			msg_perr("Error: fwh_idsel= specified, but value had unused bits set.\n");
			goto idsel_garbage_out;
		}
		uint64_t fwh_idsel_old;
		if (ich_generation == CHIPSET_BAYTRAIL) {
			fwh_idsel_old = mmio_readl(ilb + fwh_sel1);
			rmmio_writel(fwh_idsel, ilb + fwh_sel1);
		} else {
			fwh_idsel_old = (uint64_t)pci_read_long(dev, fwh_sel1) << 16;
			rpci_write_long(dev, fwh_sel1, (fwh_idsel >> 16) & 0xffffffff);
			if (fwh_sel2 > 0) {
				fwh_idsel_old |= pci_read_word(dev, fwh_sel2);
				rpci_write_word(dev, fwh_sel2, fwh_idsel & 0xffff);
			}
		}
		msg_pdbg("Setting IDSEL from 0x%012" PRIx64 " to 0x%012" PRIx64 " for top 16 MB.\n",
			 fwh_idsel_old, fwh_idsel);
		/* FIXME: Decode settings are not changed. */
	} else if (idsel) {
		msg_perr("Error: fwh_idsel= specified, but no value given.\n");
idsel_garbage_out:
		free(idsel);
		return ERROR_FATAL;
	}
	free(idsel);

	if (!implemented) {
		msg_pdbg2("FWH IDSEL handling is not implemented on this chipset.\n");
		return 0;
	}

	/* Ignore all legacy ranges below 1 MB.
	 * We currently only support flashing the chip which responds to
	 * IDSEL=0. To support IDSEL!=0, rom_base and decode size calculations
	 * have to be adjusted.
	 */
	int max_decode_fwh_idsel = 0, max_decode_fwh_decode = 0;
	bool contiguous = 1;
	uint32_t fwh_conf;
	if (ich_generation == CHIPSET_BAYTRAIL)
		fwh_conf = mmio_readl(ilb + fwh_sel1);
	else
		fwh_conf = pci_read_long(dev, fwh_sel1);

	int i;
	/* FWH_SEL1 */
	for (i = 7; i >= 0; i--) {
		int tmp = (fwh_conf >> (i * 4)) & 0xf;
		msg_pdbg("0x%08x/0x%08x FWH IDSEL: 0x%x\n",
			 (0x1ff8 + i) * 0x80000,
			 (0x1ff0 + i) * 0x80000,
			 tmp);
		if ((tmp == 0) && contiguous) {
			max_decode_fwh_idsel = (8 - i) * 0x80000;
		} else {
			contiguous = 0;
		}
	}
	if (fwh_sel2 > 0) {
		/* FWH_SEL2 */
		fwh_conf = pci_read_word(dev, fwh_sel2);
		for (i = 3; i >= 0; i--) {
			int tmp = (fwh_conf >> (i * 4)) & 0xf;
			msg_pdbg("0x%08x/0x%08x FWH IDSEL: 0x%x\n",
				 (0xff4 + i) * 0x100000,
				 (0xff0 + i) * 0x100000,
				 tmp);
			if ((tmp == 0) && contiguous) {
				max_decode_fwh_idsel = (8 - i) * 0x100000;
			} else {
				contiguous = 0;
			}
		}
	}
	contiguous = 1;
	/* FWH_DEC_EN1 */
	fwh_conf = pci_read_byte(dev, fwh_dec_en_hi);
	fwh_conf <<= 8;
	fwh_conf |= pci_read_byte(dev, fwh_dec_en_lo);
	for (i = 7; i >= 0; i--) {
		int tmp = (fwh_conf >> (i + 0x8)) & 0x1;
		msg_pdbg("0x%08x/0x%08x FWH decode %sabled\n",
			 (0x1ff8 + i) * 0x80000,
			 (0x1ff0 + i) * 0x80000,
			 tmp ? "en" : "dis");
		if ((tmp == 1) && contiguous) {
			max_decode_fwh_decode = (8 - i) * 0x80000;
		} else {
			contiguous = 0;
		}
	}
	for (i = 3; i >= 0; i--) {
		int tmp = (fwh_conf >> i) & 0x1;
		msg_pdbg("0x%08x/0x%08x FWH decode %sabled\n",
			 (0xff4 + i) * 0x100000,
			 (0xff0 + i) * 0x100000,
			 tmp ? "en" : "dis");
		if ((tmp == 1) && contiguous) {
			max_decode_fwh_decode = (8 - i) * 0x100000;
		} else {
			contiguous = 0;
		}
	}
	internal->max_rom_decode = min(max_decode_fwh_idsel, max_decode_fwh_decode);
	msg_pdbg("Maximum FWH chip size: 0x%zx bytes\n", internal->max_rom_decode);

	return 0;
}

static int enable_flash_ich_fwh(struct flashprog_programmer *prog,
				struct pci_dev *dev, enum ich_chipset ich_generation, uint8_t bios_cntl)
{
	int err;

	/* Configure FWH IDSEL decoder maps. */
	if ((err = enable_flash_ich_fwh_decode(prog, dev, ich_generation)) != 0)
		return err;

	internal_buses_supported &= BUS_FWH;
	return enable_flash_ich_bios_cntl_config_space(dev, ich_generation, bios_cntl);
}

static int enable_flash_ich0(struct flashprog_programmer *prog, struct pci_dev *dev, const char *name)
{
	return enable_flash_ich_fwh(prog, dev, CHIPSET_ICH, 0x4e);
}

static int enable_flash_ich2345(struct flashprog_programmer *prog, struct pci_dev *dev, const char *name)
{
	return enable_flash_ich_fwh(prog, dev, CHIPSET_ICH2345, 0x4e);
}

static int enable_flash_ich6(struct flashprog_programmer *prog, struct pci_dev *dev, const char *name)
{
	return enable_flash_ich_fwh(prog, dev, CHIPSET_ICH6, 0xdc);
}

static int enable_flash_poulsbo(struct flashprog_programmer *prog, struct pci_dev *dev, const char *name)
{
	return enable_flash_ich_fwh(prog, dev, CHIPSET_POULSBO, 0xd8);
}

static enum chipbustype enable_flash_ich_report_gcs(
		struct pci_dev *const dev, const enum ich_chipset ich_generation, const uint8_t *const rcrb)
{
	uint32_t gcs;
	const char *reg_name;
	bool bild, top_swap;

	if (ich_generation >= SPI_ENGINE_PCH100) {
		reg_name = "BIOS_SPI_BC";
		gcs = pci_read_long(dev, 0xdc);
		bild = (gcs >> 7) & 1;
		top_swap = (gcs >> 4) & 1;
	} else if (ich_generation == CHIPSET_BAYTRAIL) {
		reg_name = "GCS";
		gcs = mmio_readl(rcrb + 0);
		bild = gcs & 1;
		top_swap = (gcs & 2) >> 1;
	} else {
		reg_name = "GCS";
		gcs = mmio_readl(rcrb + 0x3410);
		bild = gcs & 1;
		top_swap = mmio_readb(rcrb + 0x3414) & 1;
	}

	msg_pdbg("%s = 0x%x: ", reg_name, gcs);
	msg_pdbg("BIOS Interface Lock-Down: %sabled, ", bild ? "en" : "dis");

	struct boot_straps {
		const char *name;
		enum chipbustype bus;
	};
	static const struct boot_straps boot_straps_EP80579[] =
		{ { "SPI", BUS_SPI },
		  { "reserved", BUS_NONE },
		  { "reserved", BUS_NONE },
		  { "LPC", BUS_LPC | BUS_FWH } };
	static const struct boot_straps boot_straps_ich7_nm10[] =
		{ { "reserved", BUS_NONE },
		  { "SPI", BUS_SPI },
		  { "PCI", BUS_NONE },
		  { "LPC", BUS_LPC | BUS_FWH } };
	static const struct boot_straps boot_straps_tunnel_creek[] =
		{ { "SPI", BUS_SPI },
		  { "LPC", BUS_LPC | BUS_FWH } };
	static const struct boot_straps boot_straps_ich8910[] =
		{ { "SPI", BUS_SPI },
		  { "SPI", BUS_SPI },
		  { "PCI", BUS_NONE },
		  { "LPC", BUS_LPC | BUS_FWH } };
	static const struct boot_straps boot_straps_pch567[] =
		{ { "LPC", BUS_LPC | BUS_FWH },
		  { "reserved", BUS_NONE },
		  { "PCI", BUS_NONE },
		  { "SPI", BUS_SPI } };
	static const struct boot_straps boot_straps_pch89_baytrail[] =
		{ { "LPC", BUS_LPC | BUS_FWH },
		  { "reserved", BUS_NONE },
		  { "reserved", BUS_NONE },
		  { "SPI", BUS_SPI } };
	static const struct boot_straps boot_straps_pch8_lp[] =
		{ { "SPI", BUS_SPI },
		  { "LPC", BUS_LPC | BUS_FWH } };
	static const struct boot_straps boot_straps_pch500[] =
		{ { "SPI", BUS_SPI },
		  { "eSPI", BUS_NONE } };
	static const struct boot_straps boot_straps_apl[] =
		{ { "SPI", BUS_SPI },
		  { "reserved", BUS_NONE } };
	static const struct boot_straps boot_straps_unknown[] =
		{ { "unknown", BUS_NONE },
		  { "unknown", BUS_NONE },
		  { "unknown", BUS_NONE },
		  { "unknown", BUS_NONE } };

	const struct boot_straps *boot_straps;
	switch (ich_generation) {
	case CHIPSET_ICH7:
		/* EP80579 may need further changes, but this is the least
		 * intrusive way to get correct BOOT Strap printing without
		 * changing the rest of its code path). */
		if (dev->device_id == 0x5031)
			boot_straps = boot_straps_EP80579;
		else
			boot_straps = boot_straps_ich7_nm10;
		break;
	case CHIPSET_ICH8:
	case CHIPSET_ICH9:
	case CHIPSET_ICH10:
		boot_straps = boot_straps_ich8910;
		break;
	case CHIPSET_TUNNEL_CREEK:
		boot_straps = boot_straps_tunnel_creek;
		break;
	case CHIPSET_5_SERIES_IBEX_PEAK:
	case CHIPSET_6_SERIES_COUGAR_POINT:
	case CHIPSET_7_SERIES_PANTHER_POINT:
		boot_straps = boot_straps_pch567;
		break;
	case CHIPSET_8_SERIES_LYNX_POINT:
	case CHIPSET_9_SERIES_WILDCAT_POINT:
	case CHIPSET_BAYTRAIL:
		boot_straps = boot_straps_pch89_baytrail;
		break;
	case CHIPSET_8_SERIES_LYNX_POINT_LP:
	case CHIPSET_9_SERIES_WILDCAT_POINT_LP:
	case CHIPSET_100_SERIES_SUNRISE_POINT:
	case CHIPSET_C620_SERIES_LEWISBURG:
	case CHIPSET_300_SERIES_CANNON_POINT:
		boot_straps = boot_straps_pch8_lp;
		break;
	case CHIPSET_500_SERIES_TIGER_POINT:
	case CHIPSET_C740_SERIES_EMMITSBURG:
		boot_straps = boot_straps_pch500;
		break;
	case CHIPSET_APOLLO_LAKE:
	case CHIPSET_GEMINI_LAKE:
	case CHIPSET_ELKHART_LAKE:
	case CHIPSET_SNOW_RIDGE: /* hard coded to 0 (SPI) */
	case CHIPSET_METEOR_LAKE:
	case CHIPSET_LUNAR_LAKE:
	case CHIPSET_ARROW_LAKE:
	case CHIPSET_PANTHER_LAKE:
		boot_straps = boot_straps_apl;
		break;
	case CHIPSET_8_SERIES_WELLSBURG: // FIXME: check datasheet
	case CHIPSET_CENTERTON: // FIXME: Datasheet does not mention GCS at all
		boot_straps = boot_straps_unknown;
		break;
	default:
		msg_gerr("%s: unknown ICH generation. Please report!\n", __func__);
		boot_straps = boot_straps_unknown;
		break;
	}

	uint8_t bbs;
	switch (ich_generation) {
	case CHIPSET_TUNNEL_CREEK:
		bbs = (gcs >> 1) & 0x1;
		break;
	case CHIPSET_8_SERIES_LYNX_POINT_LP:
	case CHIPSET_9_SERIES_WILDCAT_POINT_LP:
		/* LP PCHs use a single bit for BBS */
		bbs = (gcs >> 10) & 0x1;
		break;
	default:
		if (ich_generation >= SPI_ENGINE_PCH100)
			bbs = (gcs >> 6) & 0x1;
		else
			/* Other chipsets use two bits for BBS */
			bbs = (gcs >> 10) & 0x3;
		break;
	}
	msg_pdbg("Boot BIOS Straps: 0x%x (%s)\n", bbs, boot_straps[bbs].name);

	/* Centerton has its TS bit in [GPE0BLK] + 0x30 while the exact location for Tunnel Creek is unknown. */
	if (ich_generation != CHIPSET_TUNNEL_CREEK && ich_generation != CHIPSET_CENTERTON)
		msg_pdbg("Top Swap: %s\n", (top_swap) ? "enabled (A16(+) inverted)" : "not enabled");

	return boot_straps[bbs].bus;
}

static int enable_flash_ich_spi(struct flashprog_programmer *prog, struct pci_dev *dev,
				enum ich_chipset ich_generation, uint8_t bios_cntl)
{
	/* Get physical address of Root Complex Register Block */
	uint32_t rcra = pci_read_long(dev, 0xf0) & 0xffffc000;
	msg_pdbg("Root Complex Register Block address = 0x%x\n", rcra);

	/* Map RCBA to virtual memory */
	void *rcrb = rphysmap("ICH RCRB", rcra, 0x4000);
	if (rcrb == ERROR_PTR)
		return ERROR_FATAL;

	const enum chipbustype boot_buses = enable_flash_ich_report_gcs(dev, ich_generation, rcrb);

	/* Handle FWH-related parameters and initialization */
	int ret_fwh = enable_flash_ich_fwh(prog, dev, ich_generation, bios_cntl);
	if (ret_fwh == ERROR_FATAL)
		return ret_fwh;

	/*
	 * It seems that the ICH7 does not support SPI and LPC chips at the same time. When booted
	 * from LPC, the SCIP bit will never clear, which causes long delays and many error messages.
	 * To avoid this, we will not enable SPI on ICH7 when the southbridge is strapped to LPC.
	 */
	if (ich_generation == CHIPSET_ICH7 && (boot_buses & BUS_LPC))
		return 0;

	/* SPIBAR is at RCRB+0x3020 for ICH[78], Tunnel Creek and Centerton, and RCRB+0x3800 for ICH9. */
	uint16_t spibar_offset;
	switch (ich_generation) {
	case CHIPSET_BAYTRAIL:
	case CHIPSET_ICH_UNKNOWN:
		return ERROR_FATAL;
	case CHIPSET_ICH7:
	case CHIPSET_ICH8:
	case CHIPSET_TUNNEL_CREEK:
	case CHIPSET_CENTERTON:
		spibar_offset = 0x3020;
		break;
	case CHIPSET_ICH9:
	default:		/* Future version might behave the same */
		spibar_offset = 0x3800;
		break;
	}
	msg_pdbg("SPIBAR = 0x%0*" PRIxPTR " + 0x%04x\n", PRIxPTR_WIDTH, (uintptr_t)rcrb, spibar_offset);
	void *spibar = rcrb + spibar_offset;

	/* This adds BUS_SPI */
	int ret_spi;
	if (ich_generation < SPI_ENGINE_ICH9)
		ret_spi = ich7_init_spi(spibar, ich_generation);
	else
		ret_spi = ich9_init_spi(spibar, ich_generation);
	if (ret_spi == ERROR_FATAL)
		return ret_spi;

	if (((boot_buses & BUS_FWH) && ret_fwh) || ((boot_buses & BUS_SPI) && ret_spi))
		return ERROR_NONFATAL;

	/* Suppress unknown laptop warning if we booted from SPI. */
	if (boot_buses & BUS_SPI)
		laptop_ok = true;

	return 0;
}

static int enable_flash_tunnelcreek(struct flashprog_programmer *prog, struct pci_dev *dev, const char *name)
{
	return enable_flash_ich_spi(prog, dev, CHIPSET_TUNNEL_CREEK, 0xd8);
}

static int enable_flash_s12x0(struct flashprog_programmer *prog, struct pci_dev *dev, const char *name)
{
	return enable_flash_ich_spi(prog, dev, CHIPSET_CENTERTON, 0xd8);
}

static int enable_flash_ich7(struct flashprog_programmer *prog, struct pci_dev *dev, const char *name)
{
	return enable_flash_ich_spi(prog, dev, CHIPSET_ICH7, 0xdc);
}

static int enable_flash_ich8(struct flashprog_programmer *prog, struct pci_dev *dev, const char *name)
{
	return enable_flash_ich_spi(prog, dev, CHIPSET_ICH8, 0xdc);
}

static int enable_flash_ich9(struct flashprog_programmer *prog, struct pci_dev *dev, const char *name)
{
	return enable_flash_ich_spi(prog, dev, CHIPSET_ICH9, 0xdc);
}

static int enable_flash_ich10(struct flashprog_programmer *prog, struct pci_dev *dev, const char *name)
{
	return enable_flash_ich_spi(prog, dev, CHIPSET_ICH10, 0xdc);
}

/* Ibex Peak aka. 5 series & 3400 series */
static int enable_flash_pch5(struct flashprog_programmer *prog, struct pci_dev *dev, const char *name)
{
	return enable_flash_ich_spi(prog, dev, CHIPSET_5_SERIES_IBEX_PEAK, 0xdc);
}

/* Cougar Point aka. 6 series & c200 series */
static int enable_flash_pch6(struct flashprog_programmer *prog, struct pci_dev *dev, const char *name)
{
	return enable_flash_ich_spi(prog, dev, CHIPSET_6_SERIES_COUGAR_POINT, 0xdc);
}

/* Panther Point aka. 7 series */
static int enable_flash_pch7(struct flashprog_programmer *prog, struct pci_dev *dev, const char *name)
{
	return enable_flash_ich_spi(prog, dev, CHIPSET_7_SERIES_PANTHER_POINT, 0xdc);
}

/* Lynx Point aka. 8 series */
static int enable_flash_pch8(struct flashprog_programmer *prog, struct pci_dev *dev, const char *name)
{
	return enable_flash_ich_spi(prog, dev, CHIPSET_8_SERIES_LYNX_POINT, 0xdc);
}

/* Lynx Point LP aka. 8 series low-power */
static int enable_flash_pch8_lp(struct flashprog_programmer *prog, struct pci_dev *dev, const char *name)
{
	return enable_flash_ich_spi(prog, dev, CHIPSET_8_SERIES_LYNX_POINT_LP, 0xdc);
}

/* Wellsburg (for Haswell-EP Xeons) */
static int enable_flash_pch8_wb(struct flashprog_programmer *prog, struct pci_dev *dev, const char *name)
{
	return enable_flash_ich_spi(prog, dev, CHIPSET_8_SERIES_WELLSBURG, 0xdc);
}

/* Wildcat Point */
static int enable_flash_pch9(struct flashprog_programmer *prog, struct pci_dev *dev, const char *name)
{
	return enable_flash_ich_spi(prog, dev, CHIPSET_9_SERIES_WILDCAT_POINT, 0xdc);
}

/* Wildcat Point LP */
static int enable_flash_pch9_lp(struct flashprog_programmer *prog, struct pci_dev *dev, const char *name)
{
	return enable_flash_ich_spi(prog, dev, CHIPSET_9_SERIES_WILDCAT_POINT_LP, 0xdc);
}

/* Sunrise Point */
static int enable_flash_pch100_shutdown(void *const pci_acc)
{
	pci_cleanup(pci_acc);
	return 0;
}

static int enable_flash_pch_spidev(
		struct pci_dev *const spi_dev, const char *const name,
		const enum ich_chipset pch_generation)
{
	const enum chipbustype boot_buses = enable_flash_ich_report_gcs(spi_dev, pch_generation, NULL);

	const int ret_bc = enable_flash_ich_bios_cntl_config_space(spi_dev, pch_generation, 0xdc);
	if (ret_bc == ERROR_FATAL)
		return ERROR_FATAL;

	const uint32_t phys_spibar = pci_read_long(spi_dev, PCI_BASE_ADDRESS_0) & 0xfffff000;
	void *const spibar = rphysmap("SPIBAR", phys_spibar, 0x1000);
	if (spibar == ERROR_PTR)
		return ERROR_FATAL;
	msg_pdbg("SPIBAR = 0x%0*" PRIxPTR " (phys = 0x%08x)\n", PRIxPTR_WIDTH, (uintptr_t)spibar, phys_spibar);

	/* This adds BUS_SPI */
	const int ret_spi = ich9_init_spi(spibar, pch_generation);
	if (ret_spi == ERROR_FATAL)
		return ERROR_FATAL;

	if (ret_bc || ret_spi)
		return ERROR_NONFATAL;

	/* Suppress unknown laptop warning if we booted from SPI. */
	if (boot_buses & BUS_SPI)
		laptop_ok = true;

	return 0;
}

static int enable_flash_pch100_or_c620(
		struct pci_dev *const lpc_dev, const char *const name,
		const int slot, const int func, const enum ich_chipset pch_generation)
{
	/*
	 * On older gens, the SPI dev is hidden (by hiding PCI vendor
	 * and device IDs). So we need a PCI access method that works
	 * even when the OS doesn't know the PCI device. We can't use
	 * this method globally since it would bring along other con-
	 * straints (e.g. on PCI domains, extended PCIe config space).
	 */
	struct pci_access *const pci_acc = pci_alloc();
	struct pci_access *const saved_pacc = pacc;
	if (!pci_acc) {
		msg_perr("Can't allocate PCI accessor.\n");
		return ERROR_FATAL;
	}
	pci_acc->method = PCI_ACCESS_I386_TYPE1;
	pci_init(pci_acc);
	register_shutdown(enable_flash_pch100_shutdown, pci_acc);

	struct pci_dev *const spi_dev = pci_get_dev(pci_acc, lpc_dev->domain, lpc_dev->bus, slot, func);
	if (!spi_dev) {
		msg_perr("Can't allocate PCI device.\n");
		return ERROR_FATAL;
	}

	/* Modify pacc so the rpci_write can register the undo
	   callback with a device using the correct pci_access. */
	pacc = pci_acc;

	const int ret = enable_flash_pch_spidev(spi_dev, name, pch_generation);

	pci_free_dev(spi_dev);
	pacc = saved_pacc;
	return ret;
}

static int enable_flash_pch100(struct flashprog_programmer *const prog,
			       struct pci_dev *const dev, const char *const name)
{
	return enable_flash_pch100_or_c620(dev, name, 0x1f, 5, CHIPSET_100_SERIES_SUNRISE_POINT);
}

static int enable_flash_c620(struct flashprog_programmer *const prog,
			     struct pci_dev *const dev, const char *const name)
{
	return enable_flash_pch100_or_c620(dev, name, 0x1f, 5, CHIPSET_C620_SERIES_LEWISBURG);
}

static int enable_flash_pch300_22nm(struct flashprog_programmer *const prog,
				    struct pci_dev *const dev, const char *const name)
{
	return enable_flash_pch100_or_c620(dev, name, 0x1f, 5, CHIPSET_300_SERIES_CANNON_POINT);
}

static int enable_flash_apl(struct flashprog_programmer *const prog,
			    struct pci_dev *const dev, const char *const name)
{
	return enable_flash_pch100_or_c620(dev, name, 0x0d, 2, CHIPSET_APOLLO_LAKE);
}

static int enable_flash_glk(struct flashprog_programmer *prog,
			    struct pci_dev *const dev, const char *const name)
{
	return enable_flash_pch100_or_c620(dev, name, 0x0d, 2, CHIPSET_GEMINI_LAKE);
}

static int enable_flash_mcc(struct flashprog_programmer *const prog,
			    struct pci_dev *const spi_dev, const char *const name)
{
	return enable_flash_pch_spidev(spi_dev, name, CHIPSET_ELKHART_LAKE);
}

static int enable_flash_pch300(struct flashprog_programmer *const prog,
			       struct pci_dev *const spi_dev, const char *const name)
{
	return enable_flash_pch_spidev(spi_dev, name, CHIPSET_300_SERIES_CANNON_POINT);
}

static int enable_flash_pch500(struct flashprog_programmer *const prog,
			       struct pci_dev *const spi_dev, const char *const name)
{
	return enable_flash_pch_spidev(spi_dev, name, CHIPSET_500_SERIES_TIGER_POINT);
}

static int enable_flash_c740(struct flashprog_programmer *const prog,
			     struct pci_dev *const spi_dev, const char *const name)
{
	return enable_flash_pch_spidev(spi_dev, name, CHIPSET_C740_SERIES_EMMITSBURG);
}

static int enable_flash_snowridge(struct flashprog_programmer *const prog,
				  struct pci_dev *const spi_dev, const char *const name)
{
	return enable_flash_pch_spidev(spi_dev, name, CHIPSET_SNOW_RIDGE);
}

static int enable_flash_mtl(struct flashprog_programmer *const prog,
			    struct pci_dev *const spi_dev, const char *const name)
{
	return enable_flash_pch_spidev(spi_dev, name, CHIPSET_METEOR_LAKE);
}

static int enable_flash_lnl(struct flashprog_programmer *const prog,
			    struct pci_dev *const spi_dev, const char *const name)
{
	return enable_flash_pch_spidev(spi_dev, name, CHIPSET_LUNAR_LAKE);
}

static int enable_flash_arl(struct flashprog_programmer *const prog,
			    struct pci_dev *const spi_dev, const char *const name)
{
	return enable_flash_pch_spidev(spi_dev, name, CHIPSET_ARROW_LAKE);
}

static int enable_flash_ptl(struct flashprog_programmer *const prog,
			    struct pci_dev *const spi_dev, const char *const name)
{
	return enable_flash_pch_spidev(spi_dev, name, CHIPSET_PANTHER_LAKE);
}

/* Silvermont architecture: Bay Trail(-T/-I), Avoton/Rangeley.
 * These have a distinctly different behavior compared to other Intel chipsets and hence are handled separately.
 *
 * Differences include:
 *	- RCBA at LPC config 0xF0 too but mapped range is only 4 B long instead of 16 kB.
 *	- GCS at [RCRB] + 0 (instead of [RCRB] + 0x3410).
 *	- TS (Top Swap) in GCS (instead of [RCRB] + 0x3414).
 *	- SPIBAR (coined SBASE) at LPC config 0x54 (instead of [RCRB] + 0x3800).
 *	- BIOS_CNTL (coined BCR) at [SPIBAR] + 0xFC (instead of LPC config 0xDC).
 */
static int enable_flash_silvermont(struct flashprog_programmer *prog, struct pci_dev *dev, const char *name)
{
	enum ich_chipset ich_generation = CHIPSET_BAYTRAIL;

	/* Get physical address of Root Complex Register Block */
	uint32_t rcba = pci_read_long(dev, 0xf0) & 0xfffffc00;
	msg_pdbg("Root Complex Register Block address = 0x%x\n", rcba);

	/* Handle GCS (in RCRB) */
	void *rcrb = physmap("BYT RCRB", rcba, 4);
	if (rcrb == ERROR_PTR)
		return ERROR_FATAL;
	const enum chipbustype boot_buses = enable_flash_ich_report_gcs(dev, ich_generation, rcrb);
	physunmap(rcrb, 4);

	/* Handle fwh_idsel parameter */
	int ret_fwh = enable_flash_ich_fwh_decode(prog, dev, ich_generation);
	if (ret_fwh == ERROR_FATAL)
		return ret_fwh;

	internal_buses_supported &= BUS_FWH;

	/* Get physical address of SPI Base Address and map it */
	uint32_t sbase = pci_read_long(dev, 0x54) & 0xfffffe00;
	msg_pdbg("SPI_BASE_ADDRESS = 0x%x\n", sbase);
	void *spibar = rphysmap("BYT SBASE", sbase, 512); /* Last defined address on Bay Trail is 0x100 */
	if (spibar == ERROR_PTR)
		return ERROR_FATAL;

	/* Enable Flash Writes.
	 * Silvermont-based: BCR at SBASE + 0xFC (some bits of BCR are also accessible via BC at IBASE + 0x1C).
	 */
	enable_flash_ich_bios_cntl_memmapped(ich_generation, spibar + 0xFC);

	int ret_spi = ich9_init_spi(spibar, ich_generation);
	if (ret_spi == ERROR_FATAL)
		return ret_spi;

	if (((boot_buses & BUS_FWH) && ret_fwh) || ((boot_buses & BUS_SPI) && ret_spi))
		return ERROR_NONFATAL;

	/* Suppress unknown laptop warning if we booted from SPI. */
	if (boot_buses & BUS_SPI)
		laptop_ok = true;

	return 0;
}

static int via_no_byte_merge(struct flashprog_programmer *prog, struct pci_dev *dev, const char *name)
{
	uint8_t val;

	val = pci_read_byte(dev, 0x71);
	if (val & 0x40) {
		msg_pdbg("Disabling byte merging\n");
		val &= ~0x40;
		rpci_write_byte(dev, 0x71, val);
	}
	return NOT_DONE_YET;	/* need to find south bridge, too */
}

static int enable_flash_vt823x(struct flashprog_programmer *prog, struct pci_dev *dev, const char *name)
{
	uint8_t val;

	/* Enable ROM decode range (1MB) FFC00000 - FFFFFFFF. */
	rpci_write_byte(dev, 0x41, 0x7f);

	/* ROM write enable */
	val = pci_read_byte(dev, 0x40);
	val |= 0x10;
	rpci_write_byte(dev, 0x40, val);

	if (pci_read_byte(dev, 0x40) != val) {
		msg_pwarn("\nWarning: Failed to enable flash write on \"%s\"\n", name);
		return -1;
	}

	if (dev->device_id == 0x3227) { /* VT8237/VT8237R */
		/* All memory cycles, not just ROM ones, go to LPC. */
		val = pci_read_byte(dev, 0x59);
		val &= ~0x80;
		rpci_write_byte(dev, 0x59, val);
	}

	return 0;
}

static int enable_flash_vt_vx(struct flashprog_programmer *prog, struct pci_dev *dev, const char *name)
{
	struct pci_dev *south_north = pcidev_find(0x1106, 0xa353);
	if (south_north == NULL) {
		msg_perr("Could not find South-North Module Interface Control device!\n");
		return ERROR_FATAL;
	}

	msg_pdbg("Strapped to ");
	if ((pci_read_byte(south_north, 0x56) & 0x01) == 0) {
		msg_pdbg("LPC.\n");
		return enable_flash_vt823x(prog, dev, name);
	}
	msg_pdbg("SPI.\n");

	uint32_t mmio_base;
	void *mmio_base_physmapped;
	uint32_t spi_cntl;
	#define SPI_CNTL_LEN 0x08
	uint32_t spi0_mm_base = 0;
	switch(dev->device_id) {
		case 0x8353: /* VX800/VX820 */
			spi0_mm_base = pci_read_long(dev, 0xbc) << 8;
			if (spi0_mm_base == 0x0) {
				msg_pdbg ("MMIO not enabled!\n");
				return ERROR_FATAL;
			}
			break;
		case 0x8409: /* VX855/VX875 */
		case 0x8410: /* VX900 */
			mmio_base = pci_read_long(dev, 0xbc) << 8;
			if (mmio_base == 0x0) {
				msg_pdbg ("MMIO not enabled!\n");
				return ERROR_FATAL;
			}
			mmio_base_physmapped = physmap("VIA VX MMIO register", mmio_base, SPI_CNTL_LEN);
			if (mmio_base_physmapped == ERROR_PTR)
				return ERROR_FATAL;

			/* Offset 0 - Bit 0 holds SPI Bus0 Enable Bit. */
			spi_cntl = mmio_readl(mmio_base_physmapped) + 0x00;
			if ((spi_cntl & 0x01) == 0) {
				msg_pdbg ("SPI Bus0 disabled!\n");
				physunmap(mmio_base_physmapped, SPI_CNTL_LEN);
				return ERROR_FATAL;
			}
			/* Offset 1-3 has  SPI Bus Memory Map Base Address: */
			spi0_mm_base = spi_cntl & 0xFFFFFF00;

			/* Offset 4 - Bit 0 holds SPI Bus1 Enable Bit. */
			spi_cntl = mmio_readl(mmio_base_physmapped) + 0x04;
			if ((spi_cntl & 0x01) == 1)
				msg_pdbg2("SPI Bus1 is enabled too.\n");

			physunmap(mmio_base_physmapped, SPI_CNTL_LEN);
			break;
		default:
			msg_perr("%s: Unsupported chipset %x:%x!\n", __func__, dev->vendor_id, dev->device_id);
			return ERROR_FATAL;
	}

	return via_init_spi(spi0_mm_base);
}

static int enable_flash_vt8237s_spi(struct flashprog_programmer *prog, struct pci_dev *dev, const char *name)
{
	return via_init_spi(pci_read_long(dev, 0xbc) << 8);
}

static int enable_flash_cs5530(struct flashprog_programmer *prog, struct pci_dev *dev, const char *name)
{
	struct internal_data *const internal = prog->data;
	uint8_t reg8;

#define DECODE_CONTROL_REG2		0x5b	/* F0 index 0x5b */
#define ROM_AT_LOGIC_CONTROL_REG	0x52	/* F0 index 0x52 */
#define CS5530_RESET_CONTROL_REG	0x44	/* F0 index 0x44 */
#define CS5530_USB_SHADOW_REG		0x43	/* F0 index 0x43 */

#define LOWER_ROM_ADDRESS_RANGE		(1 << 0)
#define ROM_WRITE_ENABLE		(1 << 1)
#define UPPER_ROM_ADDRESS_RANGE		(1 << 2)
#define BIOS_ROM_POSITIVE_DECODE	(1 << 5)
#define CS5530_ISA_MASTER		(1 << 7)
#define CS5530_ENABLE_SA2320		(1 << 2)
#define CS5530_ENABLE_SA20		(1 << 6)

	internal_buses_supported &= BUS_PARALLEL;
	/* Decode 0x000E0000-0x000FFFFF (128 kB), not just 64 kB, and
	 * decode 0xFF000000-0xFFFFFFFF (16 MB), not just 256 kB.
	 * FIXME: Should we really touch the low mapping below 1 MB? Flashprog
	 * ignores that region completely.
	 * Make the configured ROM areas writable.
	 */
	reg8 = pci_read_byte(dev, ROM_AT_LOGIC_CONTROL_REG);
	reg8 |= LOWER_ROM_ADDRESS_RANGE;
	reg8 |= UPPER_ROM_ADDRESS_RANGE;
	reg8 |= ROM_WRITE_ENABLE;
	rpci_write_byte(dev, ROM_AT_LOGIC_CONTROL_REG, reg8);

	/* Set positive decode on ROM. */
	reg8 = pci_read_byte(dev, DECODE_CONTROL_REG2);
	reg8 |= BIOS_ROM_POSITIVE_DECODE;
	rpci_write_byte(dev, DECODE_CONTROL_REG2, reg8);

	reg8 = pci_read_byte(dev, CS5530_RESET_CONTROL_REG);
	if (reg8 & CS5530_ISA_MASTER) {
		/* We have A0-A23 available. */
		internal->max_rom_decode = 16*MiB;
	} else {
		reg8 = pci_read_byte(dev, CS5530_USB_SHADOW_REG);
		if (reg8 & CS5530_ENABLE_SA2320) {
			/* We have A0-19, A20-A23 available. */
			internal->max_rom_decode = 16*MiB;
		} else if (reg8 & CS5530_ENABLE_SA20) {
			/* We have A0-19, A20 available. */
			internal->max_rom_decode = 2*MiB;
		} else {
			/* A20 and above are not active. */
			internal->max_rom_decode = 1*MiB;
		}
	}

	return 0;
}

/*
 * Geode systems write protect the BIOS via RCONFs (cache settings similar
 * to MTRRs). To unlock, change MSR 0x1808 top byte to 0x22.
 *
 * Geode systems also write protect the NOR flash chip itself via MSR_NORF_CTL.
 * To enable write to NOR Boot flash for the benefit of systems that have such
 * a setup, raise MSR 0x51400018 WE_CS3 (write enable Boot Flash Chip Select).
 */
static int enable_flash_cs5536(struct flashprog_programmer *prog, struct pci_dev *dev, const char *name)
{
#define MSR_RCONF_DEFAULT	0x1808
#define MSR_NORF_CTL		0x51400018

	msr_t msr;

	/* Geode only has a single core */
	if (msr_setup(0))
		return -1;

	msr = msr_read(MSR_RCONF_DEFAULT);
	if ((msr.hi >> 24) != 0x22) {
		msr.hi &= 0xfbffffff;
		msr_write(MSR_RCONF_DEFAULT, msr);
	}

	msr = msr_read(MSR_NORF_CTL);
	/* Raise WE_CS3 bit. */
	msr.lo |= 0x08;
	msr_write(MSR_NORF_CTL, msr);

	msr_cleanup();

#undef MSR_RCONF_DEFAULT
#undef MSR_NORF_CTL
	return 0;
}

static int enable_flash_sc1100(struct flashprog_programmer *prog, struct pci_dev *dev, const char *name)
{
	#define SC_REG 0x52
	uint8_t new;

	rpci_write_byte(dev, SC_REG, 0xee);

	new = pci_read_byte(dev, SC_REG);

	if (new != 0xee) { /* FIXME: share this with other code? */
		msg_pinfo("Setting register 0x%x to 0x%02x on %s failed (WARNING ONLY).\n", SC_REG, new, name);
		return -1;
	}

	return 0;
}

/* Works for AMD-768, AMD-8111, VIA VT82C586A/B, VIA VT82C596, VIA VT82C686A/B.
 *
 * ROM decode control register matrix
 *	AMD-768			AMD-8111	VT82C586A/B		VT82C596		VT82C686A/B
 * 7	FFC0_0000h–FFFF_FFFFh	<-		FFFE0000h-FFFEFFFFh	<-			<-
 * 6	FFB0_0000h–FFBF_FFFFh	<-		FFF80000h-FFFDFFFFh	<-			<-
 * 5	00E8...			<-		<-			FFF00000h-FFF7FFFFh	<-
 */
static int enable_flash_amd_via(struct pci_dev *dev, const char *name, uint8_t decode_val)
{
	#define AMD_MAPREG 0x43
	#define AMD_ENREG 0x40
	uint8_t old, new;

	old = pci_read_byte(dev, AMD_MAPREG);
	new = old | decode_val;
	if (new != old) {
		rpci_write_byte(dev, AMD_MAPREG, new);
		if (pci_read_byte(dev, AMD_MAPREG) != new) {
			msg_pwarn("Setting register 0x%x to 0x%02x on %s failed (WARNING ONLY).\n",
				  AMD_MAPREG, new, name);
		} else
			msg_pdbg("Changed ROM decode range to 0x%02x successfully.\n", new);
	}

	/* Enable 'ROM write' bit. */
	old = pci_read_byte(dev, AMD_ENREG);
	new = old | 0x01;
	if (new == old)
		return 0;
	rpci_write_byte(dev, AMD_ENREG, new);

	if (pci_read_byte(dev, AMD_ENREG) != new) {
		msg_pwarn("Setting register 0x%x to 0x%02x on %s failed (WARNING ONLY).\n",
			  AMD_ENREG, new, name);
		return ERROR_NONFATAL;
	}
	msg_pdbg2("Set ROM enable bit successfully.\n");

	return 0;
}

static int enable_flash_amd_768_8111(struct flashprog_programmer *prog, struct pci_dev *dev, const char *name)
{
	struct internal_data *const internal = prog->data;
	/* Enable decoding of 0xFFB00000 to 0xFFFFFFFF (5 MB). */
	internal->max_rom_decode = 5 * 1024 * 1024;
	return enable_flash_amd_via(dev, name, 0xC0);
}

static int enable_flash_vt82c586(struct flashprog_programmer *prog, struct pci_dev *dev, const char *name)
{
	struct internal_data *const internal = prog->data;
	/* Enable decoding of 0xFFF80000 to 0xFFFFFFFF. (512 kB) */
	internal->max_rom_decode = 512 * 1024;
	return enable_flash_amd_via(dev, name, 0xC0);
}

/* Works for VT82C686A/B too. */
static int enable_flash_vt82c596(struct flashprog_programmer *prog, struct pci_dev *dev, const char *name)
{
	struct internal_data *const internal = prog->data;
	/* Enable decoding of 0xFFF00000 to 0xFFFFFFFF. (1 MB) */
	internal->max_rom_decode = 1024 * 1024;
	return enable_flash_amd_via(dev, name, 0xE0);
}

static int enable_flash_sb600(struct flashprog_programmer *prog, struct pci_dev *dev, const char *name)
{
	uint32_t prot;
	uint8_t reg;
	int ret;

	/* Clear ROM protect 0-3. */
	for (reg = 0x50; reg < 0x60; reg += 4) {
		prot = pci_read_long(dev, reg);
		/* No protection flags for this region?*/
		if ((prot & 0x3) == 0)
			continue;
		msg_pdbg("Chipset %s%sprotected flash from 0x%08x to 0x%08x, unlocking...",
			  (prot & 0x2) ? "read " : "",
			  (prot & 0x1) ? "write " : "",
			  (prot & 0xfffff800),
			  (prot & 0xfffff800) + (((prot & 0x7fc) << 8) | 0x3ff));
		prot &= 0xfffffffc;
		rpci_write_byte(dev, reg, prot);
		prot = pci_read_long(dev, reg);
		if ((prot & 0x3) != 0) {
			msg_perr("Disabling %s%sprotection of flash addresses from 0x%08x to 0x%08x failed.\n",
				 (prot & 0x2) ? "read " : "",
				 (prot & 0x1) ? "write " : "",
				 (prot & 0xfffff800),
				 (prot & 0xfffff800) + (((prot & 0x7fc) << 8) | 0x3ff));
			continue;
		}
		msg_pdbg("done.\n");
	}

	internal_buses_supported &= BUS_LPC | BUS_FWH;

	ret = sb600_probe_spi(dev);

	/* Read ROM strap override register. */
	OUTB(0x8f, 0xcd6);
	reg = INB(0xcd7);
	reg &= 0x0e;
	msg_pdbg("ROM strap override is %sactive", (reg & 0x02) ? "" : "not ");
	if (reg & 0x02) {
		switch ((reg & 0x0c) >> 2) {
		case 0x00:
			msg_pdbg(": LPC");
			break;
		case 0x01:
			msg_pdbg(": PCI");
			break;
		case 0x02:
			msg_pdbg(": FWH");
			break;
		case 0x03:
			msg_pdbg(": SPI");
			break;
		}
	}
	msg_pdbg("\n");

	/* Force enable SPI ROM in SB600 PM register.
	 * If we enable SPI ROM here, we have to disable it after we leave.
	 * But how can we know which ROM we are going to handle? So we have
	 * to trade off. We only access LPC ROM if we boot via LPC ROM. And
	 * only SPI ROM if we boot via SPI ROM. If you want to access SPI on
	 * boards with LPC straps, you have to use the code below.
	 */
	/*
	OUTB(0x8f, 0xcd6);
	OUTB(0x0e, 0xcd7);
	*/

	return ret;
}

static int enable_flash_sb600_smbus(struct flashprog_programmer *prog, struct pci_dev *smbus, const char *name)
{
	struct pci_dev *const lpc = pci_get_dev(pacc, smbus->domain, smbus->bus, smbus->dev, 3);
	if (!lpc) {
		msg_perr("Error: Cannot access LPC device for %s.\n", name);
		return ERROR_FATAL;
	}

	const int ret = enable_flash_sb600(prog, lpc, name);

	pci_free_dev(lpc);
	return ret;
}

static int enable_read_amd_spi100_rom3(struct flashprog_programmer *const prog, const size_t rom_range3_len)
{
	/*
	 * NOTE: We are flying blind due to ROM Armor, so we can only use
	 * hardcoded, commonly used addresses. We will only ever attempt
	 * to read, and try our best to confirm that we run in an expec-
	 * ted environment.
	 */

	const uint64_t rom3_phys = 0xfd00000000;
	if ((uintptr_t)rom3_phys != rom3_phys) {
		msg_pinfo("amd_rom3read driver currently requires a 64-bit build of flashprog.\n");
		return ERROR_FATAL;
	}

	msg_pinfo("Trying memory mapped, read-only access.\n");

	/* There is an undocumented interface, suspiciously
	   similar to and one page above the usual SPIBAR. */
	const void *const odd_spibar =
		rphysmap("Odd SPI registers", 0xfec10000 + 0x1000, 256);

	/* RomRange2 is supposed to be used for the mapping directly below 4G. */
	const void *const rom2 = rphysmap("SPI100 rom2 range", 0xff000000, 16*MiB);

	/* RomRange3 default: */
	const void *const rom3 = rphysmap("SPI100 rom3 range", (uintptr_t)rom3_phys, rom_range3_len);

	if (odd_spibar == ERROR_PTR || rom2 == ERROR_PTR || rom3 == ERROR_PTR)
		return ERROR_FATAL;

	/* Our best guess */
	internal_buses_supported &= ~BUS_NONSPI;
	/* Suppress unknown laptop warning with non-SPI buses disabled. */
	laptop_ok = true;

	return amd_rom3read_probe(odd_spibar, rom2, rom3, rom_range3_len);
}

static int enable_flash_amd_spi100_generic(
		struct flashprog_programmer *const prog,
		struct pci_dev *const smbus, const char *const name,
		size_t rom_range3_len)
{
	struct pci_dev *const lpc = pci_get_dev(pacc, smbus->domain, smbus->bus, smbus->dev, 3);
	if (!lpc) {
		msg_perr("Error: Cannot access LPC device for %s.\n", name);
		return ERROR_FATAL;
	}

	const uint32_t spibar = pci_read_long(lpc, 0xa0);
	const uint32_t rom_range2 = pci_read_long(lpc, 0x6c);
	pci_free_dev(lpc);

	if (spibar == 0xffffffff) {
		msg_pwarn("\nWarning: SPI100 BAR reads all `ff'. Assuming ROM Armor is enabled.\n");
		if (rom_range3_len)
			return enable_read_amd_spi100_rom3(prog, rom_range3_len);
		else
			return ERROR_FATAL;
	}

	msg_pdbg("AltSpiCSEnable=%u, SpiRomEnable=%u", spibar >> 0 & 1, spibar >> 1 & 1);
	msg_pdbg(", AbortEnable=%u, RouteTpm2Spi=%u", spibar >> 2 & 1, spibar >> 3 & 1);
	msg_pdbg(", PspSpiMmioSel=%u\n", spibar >> 4 & 1);

	const bool spirom_enable = spibar & BIT(1);
	if (spirom_enable) {
		/* If SPI ROM is memory mapped, nothing else can be */
		internal_buses_supported &= ~BUS_NONSPI;
		/* Suppress unknown laptop warning with non-SPI buses disabled. */
		laptop_ok = true;
	}

	const uint32_t phys_spibar = spibar & ~0xff;	/* 8 bits config/reserved */
	if (!phys_spibar) {
		if (spirom_enable)
			msg_perr("SPI ROM is enabled but SPI BAR is unconfigured.");
		else
			msg_pdbg("SPI100 not used.\n");
		return 0;
	}
	msg_pdbg("SPI100 BAR at 0x%08x\n", phys_spibar);

	void *const virt_spibar = rphysmap("SPI100 SPI registers", phys_spibar, 256);
	if (virt_spibar == ERROR_PTR)
		return ERROR_FATAL;

	/* RomRange2 is supposed to be used for the mapping directly below 4G. */
	const uint32_t rom_range_end = rom_range2 | 0xffff;
	const uint32_t rom_range_start = (rom_range2 & 0xffff) << 16;
	const size_t mapped_len = rom_range_end > rom_range_start ? rom_range_end - rom_range_start + 1 : 0;
	msg_pdbg("ROM Range 2: 0x%08x..0x%08x (%zu kB)\n", rom_range_start, rom_range_end, mapped_len / KiB);

	void *memory_mapping = NULL;
	if (spirom_enable && mapped_len) {
		memory_mapping = rphysmap("SPI100 memory mapping", rom_range_start, mapped_len);
		if (memory_mapping == ERROR_PTR)
			memory_mapping = NULL;
	}

	return amd_spi100_probe(virt_spibar, memory_mapping, memory_mapping ? mapped_len : 0);
}

static int enable_flash_amd_spi100(struct flashprog_programmer *prog,
				   struct pci_dev *const smbus, const char *const name)
{
	return enable_flash_amd_spi100_generic(prog, smbus, name, 0);
}

static int enable_flash_amd_spi100_rom3(struct flashprog_programmer *prog,
					struct pci_dev *const smbus, const char *const name)
{
	return enable_flash_amd_spi100_generic(prog, smbus, name, 64*MiB);
}

/* sets bit 0 in 0x6d */
static int enable_flash_nvidia_common(struct pci_dev *dev, const char *name)
{
	uint8_t old, new;

	old = pci_read_byte(dev, 0x6d);
	new = old | 0x01;
	if (new == old)
		return 0;

	rpci_write_byte(dev, 0x6d, new);
	if (pci_read_byte(dev, 0x6d) != new) {
		msg_pinfo("Setting register 0x6d to 0x%02x on %s failed.\n", new, name);
		return 1;
	}
	return 0;
}

static int enable_flash_nvidia_nforce2(struct flashprog_programmer *prog, struct pci_dev *dev, const char *name)
{
	rpci_write_byte(dev, 0x92, 0);
	if (enable_flash_nvidia_common(dev, name))
		return ERROR_NONFATAL;
	else
		return 0;
}

static int enable_flash_ck804(struct flashprog_programmer *prog, struct pci_dev *dev, const char *name)
{
	uint32_t segctrl;
	uint8_t reg, old, new;
	unsigned int err = 0;

	/* 0x8A is special: it is a single byte and only one nibble is touched. */
	reg = 0x8A;
	segctrl = pci_read_byte(dev, reg);
	if ((segctrl & 0x3) != 0x0) {
		if ((segctrl & 0xC) != 0x0) {
			msg_pinfo("Can not unlock existing protection in register 0x%02x.\n", reg);
			err++;
		} else {
			msg_pdbg("Unlocking protection in register 0x%02x... ", reg);
			rpci_write_byte(dev, reg, segctrl & 0xF0);

			segctrl = pci_read_byte(dev, reg);
			if ((segctrl & 0x3) != 0x0) {
				msg_pinfo("Could not unlock protection in register 0x%02x (new value: 0x%x).\n",
					  reg, segctrl);
				err++;
			} else
				msg_pdbg("OK\n");
		}
	}

	for (reg = 0x8C; reg <= 0x94; reg += 4) {
		segctrl = pci_read_long(dev, reg);
		if ((segctrl & 0x33333333) == 0x00000000) {
			/* reads and writes are unlocked */
			continue;
		}
		if ((segctrl & 0xCCCCCCCC) != 0x00000000) {
			msg_pinfo("Can not unlock existing protection in register 0x%02x.\n", reg);
			err++;
			continue;
		}
		msg_pdbg("Unlocking protection in register 0x%02x... ", reg);
		rpci_write_long(dev, reg, 0x00000000);

		segctrl = pci_read_long(dev, reg);
		if ((segctrl & 0x33333333) != 0x00000000) {
			msg_pinfo("Could not unlock protection in register 0x%02x (new value: 0x%08x).\n",
				  reg, segctrl);
			err++;
		} else
			msg_pdbg("OK\n");
	}

	if (err > 0) {
		msg_pinfo("%d locks could not be disabled, disabling writes (reads may also fail).\n", err);
		programmer_may_write = false;
	}

	reg = 0x88;
	old = pci_read_byte(dev, reg);
	new = old | 0xC0;
	if (new != old) {
		rpci_write_byte(dev, reg, new);
		if (pci_read_byte(dev, reg) != new) { /* FIXME: share this with other code? */
			msg_pinfo("Setting register 0x%02x to 0x%02x on %s failed.\n", reg, new, name);
			err++;
		}
	}

	if (enable_flash_nvidia_common(dev, name))
		err++;

	if (err > 0)
		return ERROR_NONFATAL;
	else
		return 0;
}

static int enable_flash_osb4(struct flashprog_programmer *prog, struct pci_dev *dev, const char *name)
{
	uint8_t tmp;

	internal_buses_supported &= BUS_PARALLEL;

	tmp = INB(0xc06);
	tmp |= 0x1;
	OUTB(tmp, 0xc06);

	tmp = INB(0xc6f);
	tmp |= 0x40;
	OUTB(tmp, 0xc6f);

	return 0;
}

/* ATI Technologies Inc IXP SB400 PCI-ISA Bridge (rev 80) */
static int enable_flash_sb400(struct flashprog_programmer *prog, struct pci_dev *dev, const char *name)
{
	uint8_t tmp;
	struct pci_dev *smbusdev;

	/* Look for the SMBus device. */
	smbusdev = pcidev_find(0x1002, 0x4372);

	if (!smbusdev) {
		msg_perr("ERROR: SMBus device not found. Aborting.\n");
		return ERROR_FATAL;
	}

	/* Enable some SMBus stuff. */
	tmp = pci_read_byte(smbusdev, 0x79);
	tmp |= 0x01;
	rpci_write_byte(smbusdev, 0x79, tmp);

	/* Change southbridge. */
	tmp = pci_read_byte(dev, 0x48);
	tmp |= 0x21;
	rpci_write_byte(dev, 0x48, tmp);

	/* Now become a bit silly. */
	tmp = INB(0xc6f);
	OUTB(tmp, 0xeb);
	OUTB(tmp, 0xeb);
	tmp |= 0x40;
	OUTB(tmp, 0xc6f);
	OUTB(tmp, 0xeb);
	OUTB(tmp, 0xeb);

	return 0;
}

static int enable_flash_mcp55(struct flashprog_programmer *prog, struct pci_dev *dev, const char *name)
{
	uint8_t val;
	uint16_t wordval;

	/* Set the 0-16 MB enable bits. */
	val = pci_read_byte(dev, 0x88);
	val |= 0xff;		/* 256K */
	rpci_write_byte(dev, 0x88, val);
	val = pci_read_byte(dev, 0x8c);
	val |= 0xff;		/* 1M */
	rpci_write_byte(dev, 0x8c, val);
	wordval = pci_read_word(dev, 0x90);
	wordval |= 0x7fff;	/* 16M */
	rpci_write_word(dev, 0x90, wordval);

	if (enable_flash_nvidia_common(dev, name))
		return ERROR_NONFATAL;
	else
		return 0;
}

/*
 * The MCP6x/MCP7x code is based on cleanroom reverse engineering.
 * It is assumed that LPC chips need the MCP55 code and SPI chips need the
 * code provided in enable_flash_mcp6x_7x_common.
 */
static int enable_flash_mcp6x_7x(struct flashprog_programmer *prog, struct pci_dev *dev, const char *name)
{
	int ret = 0, want_spi = 0;
	uint8_t val;

	/* dev is the ISA bridge. No idea what the stuff below does. */
	val = pci_read_byte(dev, 0x8a);
	msg_pdbg("ISA/LPC bridge reg 0x8a contents: 0x%02x, bit 6 is %i, bit 5 "
		 "is %i\n", val, (val >> 6) & 0x1, (val >> 5) & 0x1);

	switch ((val >> 5) & 0x3) {
	case 0x0:
		ret = enable_flash_mcp55(prog, dev, name);
		internal_buses_supported &= BUS_LPC;
		msg_pdbg("Flash bus type is LPC\n");
		break;
	case 0x2:
		want_spi = 1;
		/* SPI is added in mcp6x_spi_init if it works.
		 * Do we really want to disable LPC in this case?
		 */
		internal_buses_supported = BUS_NONE;
		msg_pdbg("Flash bus type is SPI\n");
		break;
	default:
		/* Should not happen. */
		internal_buses_supported = BUS_NONE;
		msg_pwarn("Flash bus type is unknown (none)\n");
		msg_pinfo("Please send the log files created by \"flashprog -p internal -o logfile\" to\n"
			  "flashprog@flashprog.org with \"your board name: flashprog -V\" as the subject\n"
			  "to help us finish support for your chipset. Thanks.\n");
		return ERROR_NONFATAL;
	}

	/* Force enable SPI and disable LPC? Not a good idea. */
#if 0
	val |= (1 << 6);
	val &= ~(1 << 5);
	rpci_write_byte(dev, 0x8a, val);
#endif

	if (mcp6x_spi_init(want_spi))
		ret = 1;

	/* Suppress unknown laptop warning if we booted from SPI. */
	if (!ret && want_spi)
		laptop_ok = true;

	return ret;
}

static int enable_flash_ht1000(struct flashprog_programmer *prog, struct pci_dev *dev, const char *name)
{
	uint8_t val;

	/* Set the 4MB enable bit. */
	val = pci_read_byte(dev, 0x41);
	val |= 0x0e;
	rpci_write_byte(dev, 0x41, val);

	val = pci_read_byte(dev, 0x43);
	val |= (1 << 4);
	rpci_write_byte(dev, 0x43, val);

	return 0;
}

/*
 * Usually on the x86 architectures (and on other PC-like platforms like some
 * Alphas or Itanium) the system flash is mapped right below 4G. On the AMD
 * Elan SC520 only a small piece of the system flash is mapped there, but the
 * complete flash is mapped somewhere below 1G. The position can be determined
 * by the BOOTCS PAR register.
 */
static int get_flashbase_sc520(struct flashprog_programmer *prog, struct pci_dev *dev, const char *name)
{
	struct internal_data *const internal = prog->data;
	int i, bootcs_found = 0;
	uint32_t parx = 0;
	void *mmcr;

	/* 1. Map MMCR */
	mmcr = physmap("Elan SC520 MMCR", 0xfffef000, getpagesize());
	if (mmcr == ERROR_PTR)
		return ERROR_FATAL;

	/* 2. Scan PAR0 (0x88) - PAR15 (0xc4) for
	 *    BOOTCS region (PARx[31:29] = 100b)e
	 */
	for (i = 0x88; i <= 0xc4; i += 4) {
		parx = mmio_readl(mmcr + i);
		if ((parx >> 29) == 4) {
			bootcs_found = 1;
			break; /* BOOTCS found */
		}
	}

	/* 3. PARx[25] = 1b --> rom_base[29:16] = PARx[13:0]
	 *    PARx[25] = 0b --> rom_base[29:12] = PARx[17:0]
	 */
	if (bootcs_found) {
		if (parx & (1 << 25)) {
			parx &= (1 << 14) - 1; /* Mask [13:0] */
			internal->rom_base = parx << 16;
		} else {
			parx &= (1 << 18) - 1; /* Mask [17:0] */
			internal->rom_base = parx << 12;
		}
	} else {
		msg_pinfo("AMD Elan SC520 detected, but no BOOTCS. "
			  "Assuming flash at 4G.\n");
	}

	/* 4. Clean up */
	physunmap(mmcr, getpagesize());
	return 0;
}

#endif

#define REV(r)	true, r
#define ANY_REV	false, 0x00

#define B_P	(BUS_PARALLEL)
#define B_PFL	(BUS_NONSPI)
#define B_PFLS	(BUS_NONSPI | BUS_SPI)
#define B_FL	(BUS_FWH | BUS_LPC)
#define B_FLS	(BUS_FWH | BUS_LPC | BUS_SPI)
#define B_FS	(BUS_FWH | BUS_SPI)
#define B_L	(BUS_LPC)
#define B_LS	(BUS_LPC | BUS_SPI)
#define B_S	(BUS_SPI)

/* Please keep this list numerically sorted by vendor/device ID. */
const struct penable chipset_enables[] = {
#if defined(__i386__) || defined(__x86_64__)
	{0x1002, 0x4377,   ANY_REV, B_PFL,  OK,  "ATI", "SB400",			enable_flash_sb400},
	{0x1002, 0x438d,   ANY_REV, B_FLS,  OK,  "AMD", "SB600",			enable_flash_sb600},
	{0x1002, 0x439d,   ANY_REV, B_FLS,  OK,  "AMD", "SB7x0/SB8x0/SB9x0",		enable_flash_sb600},
	{0x100b, 0x0510,   ANY_REV, B_PFL,  NT,  "AMD", "SC1100",			enable_flash_sc1100},
	{0x1022, 0x2080,   ANY_REV, B_PFL,  OK,  "AMD", "CS5536",			enable_flash_cs5536},
	{0x1022, 0x2090,   ANY_REV, B_PFL,  OK,  "AMD", "CS5536",			enable_flash_cs5536},
	{0x1022, 0x3000,   ANY_REV, B_PFL,  OK,  "AMD", "Elan SC520",			get_flashbase_sc520},
	{0x1022, 0x7440,   ANY_REV, B_PFL,  OK,  "AMD", "AMD-768",			enable_flash_amd_768_8111},
	{0x1022, 0x7468,   ANY_REV, B_PFL,  OK,  "AMD", "AMD-8111",			enable_flash_amd_768_8111},
	{0x1022, 0x780e,   ANY_REV, B_FLS,  OK,  "AMD", "FCH",				enable_flash_sb600},
	{0x1022, 0x790b, REV(0x4a), B_FLS,  OK,  "AMD", "Merlin Falcon",		enable_flash_sb600_smbus},
	{0x1022, 0x790b, REV(0x4b), B_FLS,  OK,  "AMD", "Stoney Ridge",			enable_flash_sb600_smbus},
	{0x1022, 0x790b, REV(0x51), B_FLS,  NT,  "AMD", "Renoir/Cezanne",		enable_flash_amd_spi100},
	{0x1022, 0x790b, REV(0x59), B_FLS, DEP,  "AMD", "Pinnacle Ridge",		enable_flash_amd_spi100},
	{0x1022, 0x790b, REV(0x61), B_FLS, DEP,  "AMD", "Raven Ridge/Matisse/Starship",	enable_flash_amd_spi100_rom3},
	{0x1022, 0x790b, REV(0x71), B_FLS, DEP,  "AMD", "Mendocino/Van Gogh/Rembrandt/Raphael/Genoa",
											enable_flash_amd_spi100_rom3},
	{0x1039, 0x0406,   ANY_REV, B_PFL,  NT,  "SiS", "501/5101/5501",		enable_flash_sis501},
	{0x1039, 0x0496,   ANY_REV, B_PFL,  NT,  "SiS", "85C496+497",			enable_flash_sis85c496},
	{0x1039, 0x0530,   ANY_REV, B_PFL,  OK,  "SiS", "530",				enable_flash_sis530},
	{0x1039, 0x0540,   ANY_REV, B_PFL,  NT,  "SiS", "540",				enable_flash_sis540},
	{0x1039, 0x0620,   ANY_REV, B_PFL,  NT,  "SiS", "620",				enable_flash_sis530},
	{0x1039, 0x0630,   ANY_REV, B_PFL,  OK,  "SiS", "630",				enable_flash_sis540},
	{0x1039, 0x0635,   ANY_REV, B_PFL,  NT,  "SiS", "635",				enable_flash_sis540},
	{0x1039, 0x0640,   ANY_REV, B_PFL,  NT,  "SiS", "640",				enable_flash_sis540},
	{0x1039, 0x0645,   ANY_REV, B_PFL,  NT,  "SiS", "645",				enable_flash_sis540},
	{0x1039, 0x0646,   ANY_REV, B_PFL,  OK,  "SiS", "645DX",			enable_flash_sis540},
	{0x1039, 0x0648,   ANY_REV, B_PFL,  OK,  "SiS", "648",				enable_flash_sis540},
	{0x1039, 0x0650,   ANY_REV, B_PFL,  OK,  "SiS", "650",				enable_flash_sis540},
	{0x1039, 0x0651,   ANY_REV, B_PFL,  OK,  "SiS", "651",				enable_flash_sis540},
	{0x1039, 0x0655,   ANY_REV, B_PFL,  NT,  "SiS", "655",				enable_flash_sis540},
	{0x1039, 0x0661,   ANY_REV, B_PFL,  OK,  "SiS", "661",				enable_flash_sis540},
	{0x1039, 0x0730,   ANY_REV, B_PFL,  OK,  "SiS", "730",				enable_flash_sis540},
	{0x1039, 0x0733,   ANY_REV, B_PFL,  NT,  "SiS", "733",				enable_flash_sis540},
	{0x1039, 0x0735,   ANY_REV, B_PFL,  OK,  "SiS", "735",				enable_flash_sis540},
	{0x1039, 0x0740,   ANY_REV, B_PFL,  NT,  "SiS", "740",				enable_flash_sis540},
	{0x1039, 0x0741,   ANY_REV, B_PFL,  OK,  "SiS", "741",				enable_flash_sis540},
	{0x1039, 0x0745,   ANY_REV, B_PFL,  OK,  "SiS", "745",				enable_flash_sis540},
	{0x1039, 0x0746,   ANY_REV, B_PFL,  NT,  "SiS", "746",				enable_flash_sis540},
	{0x1039, 0x0748,   ANY_REV, B_PFL,  NT,  "SiS", "748",				enable_flash_sis540},
	{0x1039, 0x0755,   ANY_REV, B_PFL,  OK,  "SiS", "755",				enable_flash_sis540},
	{0x1039, 0x5511,   ANY_REV, B_PFL,  NT,  "SiS", "5511",				enable_flash_sis5511},
	{0x1039, 0x5571,   ANY_REV, B_PFL,  NT,  "SiS", "5571",				enable_flash_sis530},
	{0x1039, 0x5591,   ANY_REV, B_PFL,  NT,  "SiS", "5591/5592",			enable_flash_sis530},
	{0x1039, 0x5596,   ANY_REV, B_PFL,  NT,  "SiS", "5596",				enable_flash_sis5511},
	{0x1039, 0x5597,   ANY_REV, B_PFL,  NT,  "SiS", "5597/5598/5581/5120",		enable_flash_sis530},
	{0x1039, 0x5600,   ANY_REV, B_PFL,  NT,  "SiS", "600",				enable_flash_sis530},
	{0x1078, 0x0100,   ANY_REV, B_P,    OK,  "AMD", "CS5530(A)",			enable_flash_cs5530},
	{0x10b9, 0x1533,   ANY_REV, B_PFL,  OK,  "ALi", "M1533",			enable_flash_ali_m1533},
	{0x10de, 0x0030,   ANY_REV, B_PFL,  OK,  "NVIDIA", "nForce4/MCP4",		enable_flash_nvidia_nforce2},
	{0x10de, 0x0050,   ANY_REV, B_PFL,  OK,  "NVIDIA", "CK804",			enable_flash_ck804}, /* LPC */
	{0x10de, 0x0051,   ANY_REV, B_PFL,  OK,  "NVIDIA", "CK804",			enable_flash_ck804}, /* Pro */
	{0x10de, 0x0060,   ANY_REV, B_PFL,  OK,  "NVIDIA", "NForce2",			enable_flash_nvidia_nforce2},
	{0x10de, 0x00e0,   ANY_REV, B_PFL,  OK,  "NVIDIA", "NForce3",			enable_flash_nvidia_nforce2},
	/* Slave, should not be here, to fix known bug for A01. */
	{0x10de, 0x00d3,   ANY_REV, B_PFL,  OK,  "NVIDIA", "CK804",			enable_flash_ck804},
	{0x10de, 0x0260,   ANY_REV, B_PFL,  OK,  "NVIDIA", "MCP51",			enable_flash_ck804},
	{0x10de, 0x0261,   ANY_REV, B_PFL,  OK,  "NVIDIA", "MCP51",			enable_flash_ck804},
	{0x10de, 0x0262,   ANY_REV, B_PFL,  NT,  "NVIDIA", "MCP51",			enable_flash_ck804},
	{0x10de, 0x0263,   ANY_REV, B_PFL,  NT,  "NVIDIA", "MCP51",			enable_flash_ck804},
	{0x10de, 0x0360,   ANY_REV, B_L,    OK,  "NVIDIA", "MCP55",			enable_flash_mcp55}, /* M57SLI*/
	/* 10de:0361 is present in Tyan S2915 OEM systems, but not connected to
	 * the flash chip. Instead, 10de:0364 is connected to the flash chip.
	 * Until we have PCI device class matching or some fallback mechanism,
	 * this is needed to get flashprog working on Tyan S2915 and maybe other
	 * dual-MCP55 boards.
	 */
#if 0
	{0x10de, 0x0361,   ANY_REV, B_L,    NT,  "NVIDIA", "MCP55",			enable_flash_mcp55}, /* LPC */
#endif
	{0x10de, 0x0362,   ANY_REV, B_L,    OK,  "NVIDIA", "MCP55",			enable_flash_mcp55}, /* LPC */
	{0x10de, 0x0363,   ANY_REV, B_L,    OK,  "NVIDIA", "MCP55",			enable_flash_mcp55}, /* LPC */
	{0x10de, 0x0364,   ANY_REV, B_L,    OK,  "NVIDIA", "MCP55",			enable_flash_mcp55}, /* LPC */
	{0x10de, 0x0365,   ANY_REV, B_L,    OK,  "NVIDIA", "MCP55",			enable_flash_mcp55}, /* LPC */
	{0x10de, 0x0366,   ANY_REV, B_L,    OK,  "NVIDIA", "MCP55",			enable_flash_mcp55}, /* LPC */
	{0x10de, 0x0367,   ANY_REV, B_L,    OK,  "NVIDIA", "MCP55",			enable_flash_mcp55}, /* Pro */
	{0x10de, 0x03e0,   ANY_REV, B_LS,   OK,  "NVIDIA", "MCP61",			enable_flash_mcp6x_7x},
	{0x10de, 0x03e1,   ANY_REV, B_LS,   OK,  "NVIDIA", "MCP61",			enable_flash_mcp6x_7x},
	{0x10de, 0x03e3,   ANY_REV, B_LS,   NT,  "NVIDIA", "MCP61",			enable_flash_mcp6x_7x},
	{0x10de, 0x0440,   ANY_REV, B_LS,   NT,  "NVIDIA", "MCP65",			enable_flash_mcp6x_7x},
	{0x10de, 0x0441,   ANY_REV, B_LS,   NT,  "NVIDIA", "MCP65",			enable_flash_mcp6x_7x},
	{0x10de, 0x0442,   ANY_REV, B_LS,   NT,  "NVIDIA", "MCP65",			enable_flash_mcp6x_7x},
	{0x10de, 0x0443,   ANY_REV, B_LS,   NT,  "NVIDIA", "MCP65",			enable_flash_mcp6x_7x},
	{0x10de, 0x0548,   ANY_REV, B_LS,   OK,  "NVIDIA", "MCP67",			enable_flash_mcp6x_7x},
	{0x10de, 0x075c,   ANY_REV, B_LS,   OK,  "NVIDIA", "MCP78S",			enable_flash_mcp6x_7x},
	{0x10de, 0x075d,   ANY_REV, B_LS,   OK,  "NVIDIA", "MCP78S",			enable_flash_mcp6x_7x},
	{0x10de, 0x07d7,   ANY_REV, B_LS,   OK,  "NVIDIA", "MCP73",			enable_flash_mcp6x_7x},
	{0x10de, 0x0aac,   ANY_REV, B_LS,   OK,  "NVIDIA", "MCP79",			enable_flash_mcp6x_7x},
	{0x10de, 0x0aad,   ANY_REV, B_LS,   NT,  "NVIDIA", "MCP79",			enable_flash_mcp6x_7x},
	{0x10de, 0x0aae,   ANY_REV, B_LS,   NT,  "NVIDIA", "MCP79",			enable_flash_mcp6x_7x},
	{0x10de, 0x0aaf,   ANY_REV, B_LS,   NT,  "NVIDIA", "MCP79",			enable_flash_mcp6x_7x},
	{0x10de, 0x0d80,   ANY_REV, B_LS,   NT,  "NVIDIA", "MCP89",			enable_flash_mcp6x_7x},
	/* VIA northbridges */
	{0x1106, 0x0585,   ANY_REV, B_PFLS, NT,  "VIA", "VT82C585VPX",			via_no_byte_merge},
	{0x1106, 0x0595,   ANY_REV, B_PFLS, NT,  "VIA", "VT82C595",			via_no_byte_merge},
	{0x1106, 0x0597,   ANY_REV, B_PFLS, NT,  "VIA", "VT82C597",			via_no_byte_merge},
	{0x1106, 0x0601,   ANY_REV, B_PFLS, NT,  "VIA", "VT8601/VT8601A",		via_no_byte_merge},
	{0x1106, 0x0691,   ANY_REV, B_PFLS, OK,  "VIA", "VT82C69x",			via_no_byte_merge},
	{0x1106, 0x8601,   ANY_REV, B_PFLS, NT,  "VIA", "VT8601T",			via_no_byte_merge},
	/* VIA southbridges */
	{0x1106, 0x0586,   ANY_REV, B_PFL,  OK,  "VIA", "VT82C586A/B",			enable_flash_vt82c586},
	{0x1106, 0x0596,   ANY_REV, B_PFL,  OK,  "VIA", "VT82C596",			enable_flash_vt82c596},
	{0x1106, 0x0686,   ANY_REV, B_PFL,  OK,  "VIA", "VT82C686A/B",			enable_flash_vt82c596},
	{0x1106, 0x3074,   ANY_REV, B_FL,   OK,  "VIA", "VT8233",			enable_flash_vt823x},
	{0x1106, 0x3147,   ANY_REV, B_FL,   OK,  "VIA", "VT8233A",			enable_flash_vt823x},
	{0x1106, 0x3177,   ANY_REV, B_FL,   OK,  "VIA", "VT8235",			enable_flash_vt823x},
	{0x1106, 0x3227,   ANY_REV, B_FL,   OK,  "VIA", "VT8237(R)",			enable_flash_vt823x},
	{0x1106, 0x3287,   ANY_REV, B_FL,   OK,  "VIA", "VT8251",			enable_flash_vt823x},
	{0x1106, 0x3337,   ANY_REV, B_FL,   OK,  "VIA", "VT8237A",			enable_flash_vt823x},
	{0x1106, 0x3372,   ANY_REV, B_LS,   OK,  "VIA", "VT8237S",			enable_flash_vt8237s_spi},
	{0x1106, 0x8231,   ANY_REV, B_FL,   NT,  "VIA", "VT8231",			enable_flash_vt823x},
	{0x1106, 0x8324,   ANY_REV, B_FL,   OK,  "VIA", "CX700",			enable_flash_vt823x},
	{0x1106, 0x8353,   ANY_REV, B_FLS,  NT,  "VIA", "VX800/VX820",			enable_flash_vt_vx},
	{0x1106, 0x8409,   ANY_REV, B_FLS,  OK,  "VIA", "VX855/VX875",			enable_flash_vt_vx},
	{0x1106, 0x8410,   ANY_REV, B_FLS,  OK,  "VIA", "VX900",			enable_flash_vt_vx},
	{0x1166, 0x0200,   ANY_REV, B_P,    OK,  "Broadcom", "OSB4",			enable_flash_osb4},
	{0x1166, 0x0205,   ANY_REV, B_PFL,  OK,  "Broadcom", "HT-1000",			enable_flash_ht1000},
	{0x17f3, 0x6030,   ANY_REV, B_PFL,  OK,  "RDC", "R8610/R3210",			enable_flash_rdc_r8610},
	{0x8086, 0x0c60,   ANY_REV, B_FS,   NT,  "Intel", "S12x0",			enable_flash_s12x0},
	{0x8086, 0x0f1c,   ANY_REV, B_FS,   OK,  "Intel", "Bay Trail",			enable_flash_silvermont},
	{0x8086, 0x0f1d,   ANY_REV, B_FS,   NT,  "Intel", "Bay Trail",			enable_flash_silvermont},
	{0x8086, 0x0f1e,   ANY_REV, B_FS,   NT,  "Intel", "Bay Trail",			enable_flash_silvermont},
	{0x8086, 0x0f1f,   ANY_REV, B_FS,   NT,  "Intel", "Bay Trail",			enable_flash_silvermont},
	{0x8086, 0x122e,   ANY_REV, B_P,    OK,  "Intel", "PIIX",			enable_flash_piix4},
	{0x8086, 0x1234,   ANY_REV, B_P,    NT,  "Intel", "MPIIX",			enable_flash_piix4},
	{0x8086, 0x1c44,   ANY_REV, B_FS,   DEP, "Intel", "Z68",			enable_flash_pch6},
	{0x8086, 0x1c46,   ANY_REV, B_FS,   DEP, "Intel", "P67",			enable_flash_pch6},
	{0x8086, 0x1c47,   ANY_REV, B_FS,   NT,  "Intel", "UM67",			enable_flash_pch6},
	{0x8086, 0x1c49,   ANY_REV, B_FS,   DEP, "Intel", "HM65",			enable_flash_pch6},
	{0x8086, 0x1c4a,   ANY_REV, B_FS,   DEP, "Intel", "H67",			enable_flash_pch6},
	{0x8086, 0x1c4b,   ANY_REV, B_FS,   NT,  "Intel", "HM67",			enable_flash_pch6},
	{0x8086, 0x1c4c,   ANY_REV, B_FS,   NT,  "Intel", "Q65",			enable_flash_pch6},
	{0x8086, 0x1c4d,   ANY_REV, B_FS,   DEP, "Intel", "QS67",			enable_flash_pch6},
	{0x8086, 0x1c4e,   ANY_REV, B_FS,   DEP, "Intel", "Q67",			enable_flash_pch6},
	{0x8086, 0x1c4f,   ANY_REV, B_FS,   DEP, "Intel", "QM67",			enable_flash_pch6},
	{0x8086, 0x1c50,   ANY_REV, B_FS,   NT,  "Intel", "B65",			enable_flash_pch6},
	{0x8086, 0x1c52,   ANY_REV, B_FS,   NT,  "Intel", "C202",			enable_flash_pch6},
	{0x8086, 0x1c54,   ANY_REV, B_FS,   DEP, "Intel", "C204",			enable_flash_pch6},
	{0x8086, 0x1c56,   ANY_REV, B_FS,   NT,  "Intel", "C206",			enable_flash_pch6},
	{0x8086, 0x1c5c,   ANY_REV, B_FS,   DEP, "Intel", "H61",			enable_flash_pch6},
	{0x8086, 0x1d40,   ANY_REV, B_FS,   DEP, "Intel", "C60x/X79",			enable_flash_pch6},
	{0x8086, 0x1d41,   ANY_REV, B_FS,   DEP, "Intel", "C60x/X79",			enable_flash_pch6},
	{0x8086, 0x1e41,   ANY_REV, B_FS,   DEP, "Intel", "Desktop Sample",		enable_flash_pch7},
	{0x8086, 0x1e42,   ANY_REV, B_FS,   DEP, "Intel", "Mobile Sample",		enable_flash_pch7},
	{0x8086, 0x1e43,   ANY_REV, B_FS,   DEP, "Intel", "SFF Sample",			enable_flash_pch7},
	{0x8086, 0x1e44,   ANY_REV, B_FS,   DEP, "Intel", "Z77",			enable_flash_pch7},
	{0x8086, 0x1e46,   ANY_REV, B_FS,   NT,  "Intel", "Z75",			enable_flash_pch7},
	{0x8086, 0x1e47,   ANY_REV, B_FS,   DEP, "Intel", "Q77",			enable_flash_pch7},
	{0x8086, 0x1e48,   ANY_REV, B_FS,   DEP, "Intel", "Q75",			enable_flash_pch7},
	{0x8086, 0x1e49,   ANY_REV, B_FS,   DEP, "Intel", "B75",			enable_flash_pch7},
	{0x8086, 0x1e4a,   ANY_REV, B_FS,   DEP, "Intel", "H77",			enable_flash_pch7},
	{0x8086, 0x1e53,   ANY_REV, B_FS,   DEP, "Intel", "C216",			enable_flash_pch7},
	{0x8086, 0x1e55,   ANY_REV, B_FS,   DEP, "Intel", "QM77",			enable_flash_pch7},
	{0x8086, 0x1e56,   ANY_REV, B_FS,   DEP, "Intel", "QS77",			enable_flash_pch7},
	{0x8086, 0x1e57,   ANY_REV, B_FS,   DEP, "Intel", "HM77",			enable_flash_pch7},
	{0x8086, 0x1e58,   ANY_REV, B_FS,   NT,  "Intel", "UM77",			enable_flash_pch7},
	{0x8086, 0x1e59,   ANY_REV, B_FS,   DEP, "Intel", "HM76",			enable_flash_pch7},
	{0x8086, 0x1e5d,   ANY_REV, B_FS,   DEP, "Intel", "HM75",			enable_flash_pch7},
	{0x8086, 0x1e5e,   ANY_REV, B_FS,   NT,  "Intel", "HM70",			enable_flash_pch7},
	{0x8086, 0x1e5f,   ANY_REV, B_FS,   DEP, "Intel", "NM70",			enable_flash_pch7},
	{0x8086, 0x1f38,   ANY_REV, B_FS,   DEP, "Intel", "Avoton/Rangeley",		enable_flash_silvermont},
	{0x8086, 0x1f39,   ANY_REV, B_FS,   NT,  "Intel", "Avoton/Rangeley",		enable_flash_silvermont},
	{0x8086, 0x1f3a,   ANY_REV, B_FS,   NT,  "Intel", "Avoton/Rangeley",		enable_flash_silvermont},
	{0x8086, 0x1f3b,   ANY_REV, B_FS,   NT,  "Intel", "Avoton/Rangeley",		enable_flash_silvermont},
	{0x8086, 0x229c,   ANY_REV, B_FS,   OK,  "Intel", "Braswell",			enable_flash_silvermont},
	{0x8086, 0x2310,   ANY_REV, B_FS,   NT,  "Intel", "DH89xxCC (Cave Creek)",	enable_flash_pch7},
	{0x8086, 0x2390,   ANY_REV, B_FS,   NT,  "Intel", "Coleto Creek",		enable_flash_pch7},
	{0x8086, 0x2410,   ANY_REV, B_FL,   OK,  "Intel", "ICH",			enable_flash_ich0},
	{0x8086, 0x2420,   ANY_REV, B_FL,   OK,  "Intel", "ICH0",			enable_flash_ich0},
	{0x8086, 0x2440,   ANY_REV, B_FL,   OK,  "Intel", "ICH2",			enable_flash_ich2345},
	{0x8086, 0x244c,   ANY_REV, B_FL,   OK,  "Intel", "ICH2-M",			enable_flash_ich2345},
	{0x8086, 0x2450,   ANY_REV, B_FL,   NT,  "Intel", "C-ICH",			enable_flash_ich2345},
	{0x8086, 0x2480,   ANY_REV, B_FL,   OK,  "Intel", "ICH3-S",			enable_flash_ich2345},
	{0x8086, 0x248c,   ANY_REV, B_FL,   OK,  "Intel", "ICH3-M",			enable_flash_ich2345},
	{0x8086, 0x24c0,   ANY_REV, B_FL,   OK,  "Intel", "ICH4/ICH4-L",		enable_flash_ich2345},
	{0x8086, 0x24cc,   ANY_REV, B_FL,   OK,  "Intel", "ICH4-M",			enable_flash_ich2345},
	{0x8086, 0x24d0,   ANY_REV, B_FL,   OK,  "Intel", "ICH5/ICH5R",			enable_flash_ich2345},
	{0x8086, 0x25a1,   ANY_REV, B_FL,   OK,  "Intel", "6300ESB",			enable_flash_ich2345},
	{0x8086, 0x2640,   ANY_REV, B_FL,   OK,  "Intel", "ICH6/ICH6R",			enable_flash_ich6},
	{0x8086, 0x2641,   ANY_REV, B_FL,   OK,  "Intel", "ICH6-M",			enable_flash_ich6},
	{0x8086, 0x2642,   ANY_REV, B_FL,   NT,  "Intel", "ICH6W/ICH6RW",		enable_flash_ich6},
	{0x8086, 0x2670,   ANY_REV, B_FL,   OK,  "Intel", "631xESB/632xESB/3100",	enable_flash_ich6},
	{0x8086, 0x27b0,   ANY_REV, B_FS,   OK,  "Intel", "ICH7DH",			enable_flash_ich7},
	{0x8086, 0x27b8,   ANY_REV, B_FS,   OK,  "Intel", "ICH7/ICH7R",			enable_flash_ich7},
	{0x8086, 0x27b9,   ANY_REV, B_FS,   OK,  "Intel", "ICH7M",			enable_flash_ich7},
	{0x8086, 0x27bc,   ANY_REV, B_FS,   OK,  "Intel", "NM10",			enable_flash_ich7},
	{0x8086, 0x27bd,   ANY_REV, B_FS,   OK,  "Intel", "ICH7MDH",			enable_flash_ich7},
	{0x8086, 0x2810,   ANY_REV, B_FS,   DEP, "Intel", "ICH8/ICH8R",			enable_flash_ich8},
	{0x8086, 0x2811,   ANY_REV, B_FS,   DEP, "Intel", "ICH8M-E",			enable_flash_ich8},
	{0x8086, 0x2812,   ANY_REV, B_FS,   DEP, "Intel", "ICH8DH",			enable_flash_ich8},
	{0x8086, 0x2814,   ANY_REV, B_FS,   DEP, "Intel", "ICH8DO",			enable_flash_ich8},
	{0x8086, 0x2815,   ANY_REV, B_FS,   DEP, "Intel", "ICH8M",			enable_flash_ich8},
	{0x8086, 0x2910,   ANY_REV, B_FS,   DEP, "Intel", "ICH9 Eng. Sample",		enable_flash_ich9},
	{0x8086, 0x2912,   ANY_REV, B_FS,   DEP, "Intel", "ICH9DH",			enable_flash_ich9},
	{0x8086, 0x2914,   ANY_REV, B_FS,   DEP, "Intel", "ICH9DO",			enable_flash_ich9},
	{0x8086, 0x2916,   ANY_REV, B_FS,   DEP, "Intel", "ICH9R",			enable_flash_ich9},
	{0x8086, 0x2917,   ANY_REV, B_FS,   DEP, "Intel", "ICH9M-E",			enable_flash_ich9},
	{0x8086, 0x2918,   ANY_REV, B_FS,   DEP, "Intel", "ICH9",			enable_flash_ich9},
	{0x8086, 0x2919,   ANY_REV, B_FS,   DEP, "Intel", "ICH9M",			enable_flash_ich9},
	{0x8086, 0x3a10,   ANY_REV, B_FS,   NT,  "Intel", "ICH10R Eng. Sample",		enable_flash_ich10},
	{0x8086, 0x3a14,   ANY_REV, B_FS,   DEP, "Intel", "ICH10DO",			enable_flash_ich10},
	{0x8086, 0x3a16,   ANY_REV, B_FS,   DEP, "Intel", "ICH10R",			enable_flash_ich10},
	{0x8086, 0x3a18,   ANY_REV, B_FS,   DEP, "Intel", "ICH10",			enable_flash_ich10},
	{0x8086, 0x3a1a,   ANY_REV, B_FS,   DEP, "Intel", "ICH10D",			enable_flash_ich10},
	{0x8086, 0x3a1e,   ANY_REV, B_FS,   NT,  "Intel", "ICH10 Eng. Sample",		enable_flash_ich10},
	{0x8086, 0x3b00,   ANY_REV, B_FS,   NT,  "Intel", "3400 Desktop",		enable_flash_pch5},
	{0x8086, 0x3b01,   ANY_REV, B_FS,   NT,  "Intel", "3400 Mobile",		enable_flash_pch5},
	{0x8086, 0x3b02,   ANY_REV, B_FS,   NT,  "Intel", "P55",			enable_flash_pch5},
	{0x8086, 0x3b03,   ANY_REV, B_FS,   DEP, "Intel", "PM55",			enable_flash_pch5},
	{0x8086, 0x3b06,   ANY_REV, B_FS,   DEP, "Intel", "H55",			enable_flash_pch5},
	{0x8086, 0x3b07,   ANY_REV, B_FS,   DEP, "Intel", "QM57",			enable_flash_pch5},
	{0x8086, 0x3b08,   ANY_REV, B_FS,   NT,  "Intel", "H57",			enable_flash_pch5},
	{0x8086, 0x3b09,   ANY_REV, B_FS,   DEP, "Intel", "HM55",			enable_flash_pch5},
	{0x8086, 0x3b0a,   ANY_REV, B_FS,   NT,  "Intel", "Q57",			enable_flash_pch5},
	{0x8086, 0x3b0b,   ANY_REV, B_FS,   NT,  "Intel", "HM57",			enable_flash_pch5},
	{0x8086, 0x3b0d,   ANY_REV, B_FS,   NT,  "Intel", "3400 Mobile SFF",		enable_flash_pch5},
	{0x8086, 0x3b0e,   ANY_REV, B_FS,   NT,  "Intel", "B55",			enable_flash_pch5},
	{0x8086, 0x3b0f,   ANY_REV, B_FS,   DEP, "Intel", "QS57",			enable_flash_pch5},
	{0x8086, 0x3b12,   ANY_REV, B_FS,   NT,  "Intel", "3400",			enable_flash_pch5},
	{0x8086, 0x3b14,   ANY_REV, B_FS,   DEP, "Intel", "3420",			enable_flash_pch5},
	{0x8086, 0x3b16,   ANY_REV, B_FS,   NT,  "Intel", "3450",			enable_flash_pch5},
	{0x8086, 0x3b1e,   ANY_REV, B_FS,   NT,  "Intel", "B55",			enable_flash_pch5},
	{0x8086, 0x5031,   ANY_REV, B_FS,   OK,  "Intel", "EP80579",			enable_flash_ich7},
	{0x8086, 0x7000,   ANY_REV, B_P,    OK,  "Intel", "PIIX3",			enable_flash_piix4},
	{0x8086, 0x7110,   ANY_REV, B_P,    OK,  "Intel", "PIIX4/4E/4M",		enable_flash_piix4},
	{0x8086, 0x7198,   ANY_REV, B_P,    OK,  "Intel", "440MX",			enable_flash_piix4},
	{0x8086, 0x8119,   ANY_REV, B_FL,   OK,  "Intel", "SCH Poulsbo",		enable_flash_poulsbo},
	{0x8086, 0x8186,   ANY_REV, B_FS,   OK,  "Intel", "Atom E6xx(T) (Tunnel Creek)",enable_flash_tunnelcreek},
	{0x8086, 0x8c40,   ANY_REV, B_FS,   NT,  "Intel", "Lynx Point",			enable_flash_pch8},
	{0x8086, 0x8c41,   ANY_REV, B_FS,   NT,  "Intel", "Lynx Point Mobile ES",	enable_flash_pch8},
	{0x8086, 0x8c42,   ANY_REV, B_FS,   NT,  "Intel", "Lynx Point Desktop ES",	enable_flash_pch8},
	{0x8086, 0x8c43,   ANY_REV, B_FS,   NT,  "Intel", "Lynx Point",			enable_flash_pch8},
	{0x8086, 0x8c44,   ANY_REV, B_FS,   DEP, "Intel", "Z87",			enable_flash_pch8},
	{0x8086, 0x8c45,   ANY_REV, B_FS,   NT,  "Intel", "Lynx Point",			enable_flash_pch8},
	{0x8086, 0x8c46,   ANY_REV, B_FS,   NT,  "Intel", "Z85",			enable_flash_pch8},
	{0x8086, 0x8c47,   ANY_REV, B_FS,   NT,  "Intel", "Lynx Point",			enable_flash_pch8},
	{0x8086, 0x8c48,   ANY_REV, B_FS,   NT,  "Intel", "Lynx Point",			enable_flash_pch8},
	{0x8086, 0x8c49,   ANY_REV, B_FS,   NT,  "Intel", "HM86",			enable_flash_pch8},
	{0x8086, 0x8c4a,   ANY_REV, B_FS,   DEP, "Intel", "H87",			enable_flash_pch8},
	{0x8086, 0x8c4b,   ANY_REV, B_FS,   DEP, "Intel", "HM87",			enable_flash_pch8},
	{0x8086, 0x8c4c,   ANY_REV, B_FS,   NT,  "Intel", "Q85",			enable_flash_pch8},
	{0x8086, 0x8c4d,   ANY_REV, B_FS,   NT,  "Intel", "Lynx Point",			enable_flash_pch8},
	{0x8086, 0x8c4e,   ANY_REV, B_FS,   NT,  "Intel", "Q87",			enable_flash_pch8},
	{0x8086, 0x8c4f,   ANY_REV, B_FS,   DEP, "Intel", "QM87",			enable_flash_pch8},
	{0x8086, 0x8c50,   ANY_REV, B_FS,   DEP, "Intel", "B85",			enable_flash_pch8},
	{0x8086, 0x8c51,   ANY_REV, B_FS,   NT,  "Intel", "Lynx Point",			enable_flash_pch8},
	{0x8086, 0x8c52,   ANY_REV, B_FS,   NT,  "Intel", "C222",			enable_flash_pch8},
	{0x8086, 0x8c53,   ANY_REV, B_FS,   NT,  "Intel", "Lynx Point",			enable_flash_pch8},
	{0x8086, 0x8c54,   ANY_REV, B_FS,   DEP, "Intel", "C224",			enable_flash_pch8},
	{0x8086, 0x8c55,   ANY_REV, B_FS,   NT,  "Intel", "Lynx Point",			enable_flash_pch8},
	{0x8086, 0x8c56,   ANY_REV, B_FS,   NT,  "Intel", "C226",			enable_flash_pch8},
	{0x8086, 0x8c57,   ANY_REV, B_FS,   NT,  "Intel", "Lynx Point",			enable_flash_pch8},
	{0x8086, 0x8c58,   ANY_REV, B_FS,   NT,  "Intel", "Lynx Point",			enable_flash_pch8},
	{0x8086, 0x8c59,   ANY_REV, B_FS,   NT,  "Intel", "Lynx Point",			enable_flash_pch8},
	{0x8086, 0x8c5a,   ANY_REV, B_FS,   NT,  "Intel", "Lynx Point",			enable_flash_pch8},
	{0x8086, 0x8c5b,   ANY_REV, B_FS,   NT,  "Intel", "Lynx Point",			enable_flash_pch8},
	{0x8086, 0x8c5c,   ANY_REV, B_FS,   DEP, "Intel", "H81",			enable_flash_pch8},
	{0x8086, 0x8c5d,   ANY_REV, B_FS,   NT,  "Intel", "Lynx Point",			enable_flash_pch8},
	{0x8086, 0x8c5e,   ANY_REV, B_FS,   NT,  "Intel", "Lynx Point",			enable_flash_pch8},
	{0x8086, 0x8c5f,   ANY_REV, B_FS,   NT,  "Intel", "Lynx Point",			enable_flash_pch8},
	{0x8086, 0x8cc1,   ANY_REV, B_FS,   NT,  "Intel", "9 Series",			enable_flash_pch9},
	{0x8086, 0x8cc2,   ANY_REV, B_FS,   NT,  "Intel", "9 Series Engineering Sample",enable_flash_pch9},
	{0x8086, 0x8cc3,   ANY_REV, B_FS,   NT,  "Intel", "9 Series",			enable_flash_pch9},
	{0x8086, 0x8cc4,   ANY_REV, B_FS,   DEP, "Intel", "Z97",			enable_flash_pch9},
	{0x8086, 0x8cc6,   ANY_REV, B_FS,   NT,  "Intel", "H97",			enable_flash_pch9},
	{0x8086, 0x8d40,   ANY_REV, B_FS,   NT,  "Intel", "C610/X99 (Wellsburg)",	enable_flash_pch8_wb},
	{0x8086, 0x8d41,   ANY_REV, B_FS,   NT,  "Intel", "C610/X99 (Wellsburg)",	enable_flash_pch8_wb},
	{0x8086, 0x8d42,   ANY_REV, B_FS,   NT,  "Intel", "C610/X99 (Wellsburg)",	enable_flash_pch8_wb},
	{0x8086, 0x8d43,   ANY_REV, B_FS,   NT,  "Intel", "C610/X99 (Wellsburg)",	enable_flash_pch8_wb},
	{0x8086, 0x8d44,   ANY_REV, B_FS,   NT,  "Intel", "C610/X99 (Wellsburg)",	enable_flash_pch8_wb},
	{0x8086, 0x8d45,   ANY_REV, B_FS,   NT,  "Intel", "C610/X99 (Wellsburg)",	enable_flash_pch8_wb},
	{0x8086, 0x8d46,   ANY_REV, B_FS,   NT,  "Intel", "C610/X99 (Wellsburg)",	enable_flash_pch8_wb},
	{0x8086, 0x8d47,   ANY_REV, B_FS,   NT,  "Intel", "C610/X99 (Wellsburg)",	enable_flash_pch8_wb},
	{0x8086, 0x8d48,   ANY_REV, B_FS,   NT,  "Intel", "C610/X99 (Wellsburg)",	enable_flash_pch8_wb},
	{0x8086, 0x8d49,   ANY_REV, B_FS,   NT,  "Intel", "C610/X99 (Wellsburg)",	enable_flash_pch8_wb},
	{0x8086, 0x8d4a,   ANY_REV, B_FS,   NT,  "Intel", "C610/X99 (Wellsburg)",	enable_flash_pch8_wb},
	{0x8086, 0x8d4b,   ANY_REV, B_FS,   NT,  "Intel", "C610/X99 (Wellsburg)",	enable_flash_pch8_wb},
	{0x8086, 0x8d4c,   ANY_REV, B_FS,   NT,  "Intel", "C610/X99 (Wellsburg)",	enable_flash_pch8_wb},
	{0x8086, 0x8d4d,   ANY_REV, B_FS,   NT,  "Intel", "C610/X99 (Wellsburg)",	enable_flash_pch8_wb},
	{0x8086, 0x8d4e,   ANY_REV, B_FS,   NT,  "Intel", "C610/X99 (Wellsburg)",	enable_flash_pch8_wb},
	{0x8086, 0x8d4f,   ANY_REV, B_FS,   NT,  "Intel", "C610/X99 (Wellsburg)",	enable_flash_pch8_wb},
	{0x8086, 0x8d50,   ANY_REV, B_FS,   NT,  "Intel", "C610/X99 (Wellsburg)",	enable_flash_pch8_wb},
	{0x8086, 0x8d51,   ANY_REV, B_FS,   NT,  "Intel", "C610/X99 (Wellsburg)",	enable_flash_pch8_wb},
	{0x8086, 0x8d52,   ANY_REV, B_FS,   NT,  "Intel", "C610/X99 (Wellsburg)",	enable_flash_pch8_wb},
	{0x8086, 0x8d53,   ANY_REV, B_FS,   NT,  "Intel", "C610/X99 (Wellsburg)",	enable_flash_pch8_wb},
	{0x8086, 0x8d54,   ANY_REV, B_FS,   NT,  "Intel", "C610/X99 (Wellsburg)",	enable_flash_pch8_wb},
	{0x8086, 0x8d55,   ANY_REV, B_FS,   NT,  "Intel", "C610/X99 (Wellsburg)",	enable_flash_pch8_wb},
	{0x8086, 0x8d56,   ANY_REV, B_FS,   NT,  "Intel", "C610/X99 (Wellsburg)",	enable_flash_pch8_wb},
	{0x8086, 0x8d57,   ANY_REV, B_FS,   NT,  "Intel", "C610/X99 (Wellsburg)",	enable_flash_pch8_wb},
	{0x8086, 0x8d58,   ANY_REV, B_FS,   NT,  "Intel", "C610/X99 (Wellsburg)",	enable_flash_pch8_wb},
	{0x8086, 0x8d59,   ANY_REV, B_FS,   NT,  "Intel", "C610/X99 (Wellsburg)",	enable_flash_pch8_wb},
	{0x8086, 0x8d5a,   ANY_REV, B_FS,   NT,  "Intel", "C610/X99 (Wellsburg)",	enable_flash_pch8_wb},
	{0x8086, 0x8d5b,   ANY_REV, B_FS,   NT,  "Intel", "C610/X99 (Wellsburg)",	enable_flash_pch8_wb},
	{0x8086, 0x8d5c,   ANY_REV, B_FS,   NT,  "Intel", "C610/X99 (Wellsburg)",	enable_flash_pch8_wb},
	{0x8086, 0x8d5d,   ANY_REV, B_FS,   NT,  "Intel", "C610/X99 (Wellsburg)",	enable_flash_pch8_wb},
	{0x8086, 0x8d5e,   ANY_REV, B_FS,   NT,  "Intel", "C610/X99 (Wellsburg)",	enable_flash_pch8_wb},
	{0x8086, 0x8d5f,   ANY_REV, B_FS,   NT,  "Intel", "C610/X99 (Wellsburg)",	enable_flash_pch8_wb},
	{0x8086, 0x9c41,   ANY_REV, B_FS,   NT,  "Intel", "Lynx Point LP Eng. Sample",	enable_flash_pch8_lp},
	{0x8086, 0x9c43,   ANY_REV, B_FS,   NT,  "Intel", "Lynx Point LP Premium",	enable_flash_pch8_lp},
	{0x8086, 0x9c45,   ANY_REV, B_FS,   NT,  "Intel", "Lynx Point LP Mainstream",	enable_flash_pch8_lp},
	{0x8086, 0x9c47,   ANY_REV, B_FS,   NT,  "Intel", "Lynx Point LP Value",	enable_flash_pch8_lp},
	{0x8086, 0x9cc1,   ANY_REV, B_FS,   NT,  "Intel", "Haswell U Sample",		enable_flash_pch9_lp},
	{0x8086, 0x9cc2,   ANY_REV, B_FS,   NT,  "Intel", "Broadwell U Sample",		enable_flash_pch9_lp},
	{0x8086, 0x9cc3,   ANY_REV, B_FS,   DEP, "Intel", "Broadwell U Premium",	enable_flash_pch9_lp},
	{0x8086, 0x9cc5,   ANY_REV, B_FS,   DEP, "Intel", "Broadwell U Base",		enable_flash_pch9_lp},
	{0x8086, 0x9cc6,   ANY_REV, B_FS,   NT,  "Intel", "Broadwell Y Sample",		enable_flash_pch9_lp},
	{0x8086, 0x9cc7,   ANY_REV, B_FS,   NT,  "Intel", "Broadwell Y Premium",	enable_flash_pch9_lp},
	{0x8086, 0x9cc9,   ANY_REV, B_FS,   NT,  "Intel", "Broadwell Y Base",		enable_flash_pch9_lp},
	{0x8086, 0x9ccb,   ANY_REV, B_FS,   NT,  "Intel", "Broadwell H",		enable_flash_pch9},
	{0x8086, 0x9d41,   ANY_REV, B_S,    NT,  "Intel", "Skylake / Kaby Lake Sample",	enable_flash_pch100},
	{0x8086, 0x9d43,   ANY_REV, B_S,    NT,  "Intel", "Skylake U Base",		enable_flash_pch100},
	{0x8086, 0x9d46,   ANY_REV, B_S,    NT,  "Intel", "Skylake Y Premium",		enable_flash_pch100},
	{0x8086, 0x9d48,   ANY_REV, B_S,    DEP, "Intel", "Skylake U Premium",		enable_flash_pch100},
	{0x8086, 0x9d4b,   ANY_REV, B_S,    NT,  "Intel", "Kaby Lake Y w/ iHDCP2.2 Prem.", enable_flash_pch100},
	{0x8086, 0x9d4e,   ANY_REV, B_S,    DEP, "Intel", "Kaby Lake U w/ iHDCP2.2 Prem.", enable_flash_pch100},
	{0x8086, 0x9d50,   ANY_REV, B_S,    NT,  "Intel", "Kaby Lake U w/ iHDCP2.2 Base", enable_flash_pch100},
	{0x8086, 0x9d51,   ANY_REV, B_S,    NT,  "Intel", "Kabe Lake w/ iHDCP2.2 Sample", enable_flash_pch100},
	{0x8086, 0x9d53,   ANY_REV, B_S,    NT,  "Intel", "Kaby Lake U Base",		enable_flash_pch100},
	{0x8086, 0x9d56,   ANY_REV, B_S,    NT,  "Intel", "Kaby Lake Y Premium",	enable_flash_pch100},
	{0x8086, 0x9d58,   ANY_REV, B_S,    NT,  "Intel", "Kaby Lake U Premium",	enable_flash_pch100},
	{0x8086, 0xa141,   ANY_REV, B_S,    NT,  "Intel", "Sunrise Point Desktop Sample", enable_flash_pch100},
	{0x8086, 0xa142,   ANY_REV, B_S,    NT,  "Intel", "Sunrise Point Unknown Sample", enable_flash_pch100},
	{0x8086, 0xa143,   ANY_REV, B_S,    DEP, "Intel", "H110",			enable_flash_pch100},
	{0x8086, 0xa144,   ANY_REV, B_S,    NT,  "Intel", "H170",			enable_flash_pch100},
	{0x8086, 0xa145,   ANY_REV, B_S,    NT,  "Intel", "Z170",			enable_flash_pch100},
	{0x8086, 0xa146,   ANY_REV, B_S,    NT,  "Intel", "Q170",			enable_flash_pch100},
	{0x8086, 0xa147,   ANY_REV, B_S,    NT,  "Intel", "Q150",			enable_flash_pch100},
	{0x8086, 0xa148,   ANY_REV, B_S,    NT,  "Intel", "B150",			enable_flash_pch100},
	{0x8086, 0xa149,   ANY_REV, B_S,   DEP,  "Intel", "C236",			enable_flash_pch100},
	{0x8086, 0xa14a,   ANY_REV, B_S,    NT,  "Intel", "C232",			enable_flash_pch100},
	{0x8086, 0xa14b,   ANY_REV, B_S,    NT,  "Intel", "Sunrise Point Server Sample",enable_flash_pch100},
	{0x8086, 0xa14d,   ANY_REV, B_S,    NT,  "Intel", "QM170",			enable_flash_pch100},
	{0x8086, 0xa14e,   ANY_REV, B_S,    NT,  "Intel", "HM170",			enable_flash_pch100},
	{0x8086, 0xa150,   ANY_REV, B_S,    DEP, "Intel", "CM236",			enable_flash_pch100},
	{0x8086, 0xa151,   ANY_REV, B_S,    NT,  "Intel", "QMS180",			enable_flash_pch100},
	{0x8086, 0xa152,   ANY_REV, B_S,    NT,  "Intel", "HM175",			enable_flash_pch100},
	{0x8086, 0xa153,   ANY_REV, B_S,    NT,  "Intel", "QM175",			enable_flash_pch100},
	{0x8086, 0xa154,   ANY_REV, B_S,    NT,  "Intel", "CM238",			enable_flash_pch100},
	{0x8086, 0xa155,   ANY_REV, B_S,    NT,  "Intel", "QMU185",			enable_flash_pch100},
	{0x8086, 0xa1a4,   ANY_REV, B_S,    DEP, "Intel", "C620 Series (QS/PRQ)",	enable_flash_c620},
	{0x8086, 0xa1c0,   ANY_REV, B_S,    NT,  "Intel", "C620 Series (QS/PRQ)",	enable_flash_c620},
	{0x8086, 0xa1c1,   ANY_REV, B_S,    NT,  "Intel", "C621 Series (QS/PRQ)",	enable_flash_c620},
	{0x8086, 0xa1c2,   ANY_REV, B_S,    NT,  "Intel", "C622 Series (QS/PRQ)",	enable_flash_c620},
	{0x8086, 0xa1c3,   ANY_REV, B_S,    NT,  "Intel", "C624 Series (QS/PRQ)",	enable_flash_c620},
	{0x8086, 0xa1c4,   ANY_REV, B_S,    NT,  "Intel", "C625 Series (QS/PRQ)",	enable_flash_c620},
	{0x8086, 0xa1c5,   ANY_REV, B_S,    NT,  "Intel", "C626 Series (QS/PRQ)",	enable_flash_c620},
	{0x8086, 0xa1c6,   ANY_REV, B_S,    NT,  "Intel", "C627 Series (QS/PRQ)",	enable_flash_c620},
	{0x8086, 0xa1c7,   ANY_REV, B_S,    NT,  "Intel", "C628 Series (QS/PRQ)",	enable_flash_c620},
	{0x8086, 0xa1c8,   ANY_REV, B_S,    NT,  "Intel", "C620 Series (QS/PRQ)",	enable_flash_c620},
	{0x8086, 0xa1c9,   ANY_REV, B_S,    NT,  "Intel", "C620 Series (QS/PRQ)",	enable_flash_c620},
	{0x8086, 0xa1ca,   ANY_REV, B_S,    NT,  "Intel", "C629 Series (QS/PRQ)",	enable_flash_c620},
	{0x8086, 0xa1cb,   ANY_REV, B_S,    NT,  "Intel", "C621A Series (QS/PRQ)",	enable_flash_c620},
	{0x8086, 0xa1cc,   ANY_REV, B_S,    NT,  "Intel", "C627A Series (QS/PRQ)",	enable_flash_c620},
	{0x8086, 0xa1cd,   ANY_REV, B_S,    NT,  "Intel", "C629A Series (QS/PRQ)",	enable_flash_c620},
	{0x8086, 0xa240,   ANY_REV, B_S,    NT,  "Intel", "C620 Series Supersku",	enable_flash_c620},
	{0x8086, 0xa241,   ANY_REV, B_S,    NT,  "Intel", "C620 Series Supersku",	enable_flash_c620},
	{0x8086, 0xa242,   ANY_REV, B_S,    NT,  "Intel", "C624 Series Supersku",	enable_flash_c620},
	{0x8086, 0xa243,   ANY_REV, B_S,    NT,  "Intel", "C627 Series Supersku",	enable_flash_c620},
	{0x8086, 0xa244,   ANY_REV, B_S,    NT,  "Intel", "C621 Series Supersku",	enable_flash_c620},
	{0x8086, 0xa245,   ANY_REV, B_S,    NT,  "Intel", "C627 Series Supersku",	enable_flash_c620},
	{0x8086, 0xa246,   ANY_REV, B_S,    NT,  "Intel", "C628 Series Supersku",	enable_flash_c620},
	{0x8086, 0xa247,   ANY_REV, B_S,    NT,  "Intel", "C620 Series Supersku",	enable_flash_c620},
	{0x8086, 0xa248,   ANY_REV, B_S,    NT,  "Intel", "C620 Series Supersku",	enable_flash_c620},
	{0x8086, 0xa249,   ANY_REV, B_S,    NT,  "Intel", "C620 Series Supersku",	enable_flash_c620},
	{0x8086, 0x1bca,   ANY_REV, B_S,    NT,  "Intel", "Emmitsburg SKU",		enable_flash_c740},
	{0x8086, 0xa2c4,   ANY_REV, B_S,    NT,  "Intel", "H270",			enable_flash_pch100},
	{0x8086, 0xa2c5,   ANY_REV, B_S,    NT,  "Intel", "Z270",			enable_flash_pch100},
	{0x8086, 0xa2c6,   ANY_REV, B_S,    NT,  "Intel", "Q270",			enable_flash_pch100},
	{0x8086, 0xa2c7,   ANY_REV, B_S,    NT,  "Intel", "Q250",			enable_flash_pch100},
	{0x8086, 0xa2c8,   ANY_REV, B_S,    NT,  "Intel", "B250",			enable_flash_pch100},
	{0x8086, 0xa2c9,   ANY_REV, B_S,    NT,  "Intel", "Z370",			enable_flash_pch100},
	{0x8086, 0xa2ca,   ANY_REV, B_S,    DEP, "Intel", "H310C",			enable_flash_pch100},
	{0x8086, 0xa2cc,   ANY_REV, B_S,    DEP, "Intel", "B365",			enable_flash_pch100},
	{0x8086, 0xa2d2,   ANY_REV, B_S,    NT,  "Intel", "X299",			enable_flash_pch100},
	{0x8086, 0x5ae8,   ANY_REV, B_S,    DEP, "Intel", "Apollo Lake",		enable_flash_apl},
	{0x8086, 0x5af0,   ANY_REV, B_S,    DEP, "Intel", "Apollo Lake",		enable_flash_apl},
	{0x8086, 0x3197,   ANY_REV, B_S,    NT,  "Intel", "Gemini Lake",		enable_flash_glk},
	{0x8086, 0x31e8,   ANY_REV, B_S,    DEP, "Intel", "Gemini Lake",		enable_flash_glk},
	{0x8086, 0x4b24,   ANY_REV, B_S,    DEP, "Intel", "Elkhart Lake",		enable_flash_mcc},
	{0x8086, 0xa3da,   ANY_REV, B_S,    NT,  "Intel", "H410",			enable_flash_pch300_22nm},
	{0x8086, 0xa3c8,   ANY_REV, B_S,    DEP, "Intel", "B460",			enable_flash_pch300_22nm},
	{0x8086, 0x9da4,   ANY_REV, B_S,    NT,  "Intel", "Cannon Lake U",		enable_flash_pch300},
	{0x8086, 0xa324,   ANY_REV, B_S,    DEP, "Intel", "300 series Cannon Point",	enable_flash_pch300},
	{0x8086, 0x02a4,   ANY_REV, B_S,    NT,  "Intel", "Comet Lake U",		enable_flash_pch300},
	{0x8086, 0x06a4,   ANY_REV, B_S,    NT,  "Intel", "400 series Comet Point",	enable_flash_pch300},
	{0x8086, 0x34a4,   ANY_REV, B_S,    NT,  "Intel", "Ice Lake",			enable_flash_pch300},
	{0x8086, 0x4da4,   ANY_REV, B_S,    NT,  "Intel", "Jasper Lake",		enable_flash_pch300},
	{0x8086, 0xa0a4,   ANY_REV, B_S,    NT,  "Intel", "Tiger Lake UP3/4",		enable_flash_pch500},
	{0x8086, 0x43a4,   ANY_REV, B_S,    DEP, "Intel", "500 series Tiger Point",	enable_flash_pch500},
	{0x8086, 0x51a4,   ANY_REV, B_S,    DEP, "Intel", "Alder Lake-P",		enable_flash_pch500},
	{0x8086, 0x54a4,   ANY_REV, B_S,    DEP, "Intel", "Alder Lake-N",		enable_flash_pch500},
	{0x8086, 0x7a24,   ANY_REV, B_S,    DEP, "Intel", "Raptor Lake-S",		enable_flash_pch500},
	{0x8086, 0x7aa4,   ANY_REV, B_S,    NT,  "Intel", "Alder Lake-S",		enable_flash_pch500},
	{0x8086, 0x18e0,   ANY_REV, B_S,    NT,  "Intel", "Snow Ridge",			enable_flash_snowridge},
	{0x8086, 0x7e23,   ANY_REV, B_S,    DEP, "Intel", "Meteor Lake",		enable_flash_mtl},
	{0x8086, 0x7723,   ANY_REV, B_S,    NT,  "Intel", "Arrow Lake-H",		enable_flash_mtl},
	{0x8086, 0xa823,   ANY_REV, B_S,    NT,  "Intel", "Lunar Lake",			enable_flash_lnl},
	{0x8086, 0xae23,   ANY_REV, B_S,    NT,  "Intel", "Arrow Lake-S/HX",		enable_flash_arl},
	{0x8086, 0xe323,   ANY_REV, B_S,    NT,  "Intel", "Panther Lake 404/H12Xe",	enable_flash_ptl},
	{0x8086, 0xe423,   ANY_REV, B_S,    NT,  "Intel", "Panther Lake H",		enable_flash_ptl},
	{0x8086, 0x4d23,   ANY_REV, B_S,    NT,  "Intel", "Wildcat Lake",		enable_flash_ptl},
#endif
	{0},
};

int chipset_flash_enable(struct flashprog_programmer *const prog)
{
	struct pci_dev *dev = NULL;
	int ret = -2;		/* Nothing! */
	int i;

	/* Now let's try to find the chipset we have... */
	for (i = 0; chipset_enables[i].vendor_name != NULL; i++) {
		dev = pcidev_find(chipset_enables[i].vendor_id,
				   chipset_enables[i].device_id);
		if (!dev)
			continue;
		if (chipset_enables[i].match_revision) {
			const uint8_t rev_id = pci_read_word(dev, PCI_REVISION_ID);
			if (rev_id != chipset_enables[i].revision_id)
				continue;
		}
		if (ret != -2) {
			msg_pwarn("Warning: unexpected second chipset match: "
				    "\"%s %s\"\n"
				  "ignoring, please report lspci and board URL "
				    "to flashprog@flashprog.org\n"
				  "with \'CHIPSET: your board name\' in the "
				    "subject line.\n",
				chipset_enables[i].vendor_name,
					chipset_enables[i].device_name);
			continue;
		}
		msg_pinfo("Found chipset \"%s %s\"",
			  chipset_enables[i].vendor_name,
			  chipset_enables[i].device_name);
		msg_pdbg(" with PCI ID %04x:%04x",
			 chipset_enables[i].vendor_id,
			 chipset_enables[i].device_id);
		msg_pinfo(".\n");

		if (chipset_enables[i].status == BAD) {
			msg_perr("ERROR: This chipset is not supported yet.\n");
			return ERROR_FATAL;
		}
		if (chipset_enables[i].status == NT) {
			msg_pinfo("This chipset is marked as untested. If "
				  "you are using an up-to-date version\nof "
				  "flashprog *and* were (not) able to "
				  "successfully update your firmware with it,\n"
				  "then please email a report to "
				  "flashprog@flashprog.org including a\n"
				  "verbose (-V) log.\nThank you!\n");
		}
		if (!(chipset_enables[i].buses & (internal_buses_supported | BUS_SPI))) {
			msg_pdbg("Skipping chipset enable: No supported buses enabled.\n");
			continue;
		}
		msg_pinfo("Enabling flash write... "); msg_pdbg("\n");
		ret = chipset_enables[i].doit(prog, dev, chipset_enables[i].device_name);
		if (ret == NOT_DONE_YET) {
			ret = -2;
			msg_pinfo("OK - searching further chips.\n");
		} else if (ret < 0)
			msg_pinfo("FAILED!\n");
		else if (ret == 0)
			msg_pinfo("OK.\n");
		else if (ret == ERROR_NONFATAL)
			msg_pinfo("PROBLEMS, continuing anyway\n");
		if (ret == ERROR_FATAL) {
			msg_perr("FATAL ERROR!\n");
			return ret;
		}
	}

	return ret;
}
