/* * This file is part of the flashrom project. * * Copyright (C) 2000 Silicon Integrated System Corporation * Copyright (C) 2004 Tyan Corp * Copyright (C) 2005-2008 coresystems GmbH * Copyright (C) 2006-2009 Carl-Daniel Hailfinger * Copyright (C) 2009 Sean Nelson * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ #include "flash.h" #include "flashchips.h" #include "chipdrivers.h" /** * List of supported flash chips. * * This file is sorted alphabetically by vendor and name. * * The usual intention is that that this list is sorted by vendor, then chip * family and chip density, which is useful for the output of 'flashrom -L'. */ const struct flashchip flashchips[] = { /* * .vendor = Vendor name * .name = Chip name * .bustype = Supported flash bus types (Parallel, LPC...) * .manufacture_id = Manufacturer chip ID * .model_id = Model chip ID * .total_size = Total size in (binary) kbytes * .page_size = Page or eraseblock(?) size in bytes * .tested = Test status * .probe = Probe function * .probe_timing = Probe function delay * .block_erasers[] = Array of erase layouts and erase functions * { * .eraseblocks[] = Array of { blocksize, blockcount } * .block_erase = Block erase function * } * .printlock = Chip lock status function * .unlock = Chip unlock function * .write = Chip write function * .read = Chip read function * .voltage = Voltage range in millivolt */ /* TODO: Refactor implementation to avoid these .c includes */ #include "flashchips/amd.c" #include "flashchips/amic.c" #include "flashchips/atmel.c" #include "flashchips/boya_bohong.c" #include "flashchips/bright.c" #include "flashchips/catalyst.c" #include "flashchips/ene.c" #include "flashchips/esi.c" #include "flashchips/esmt.c" #include "flashchips/eon.c" #include "flashchips/fudan.c" #include "flashchips/fujitsu.c" #include "flashchips/gigadevice.c" #include "flashchips/hyundai.c" #include "flashchips/issi.c" #include "flashchips/intel.c" #include "flashchips/macronix.c" #include "flashchips/micron_numonyx_st.c" #include "flashchips/micron.c" #include "flashchips/mosel_vitelic.c" #include "flashchips/nantronics.c" #include "flashchips/pmc.c" #include "flashchips/puya.c" #include "flashchips/sst.c" #include "flashchips/st.c" #include "flashchips/sanyo.c" #include "flashchips/sharp.c" #include "flashchips/spansion.c" #include "flashchips/syncmos_mosel_vitelic.c" #include "flashchips/ti.c" #include "flashchips/winbond.c" #include "flashchips/xmc.c" #include "flashchips/xtx.c" #include "flashchips/zetta.c" /* * These entries are intentionally placed at the end. */ { .vendor = "Unknown", .name = "SFDP-capable chip", .bustype = BUS_SPI, .manufacture_id = GENERIC_MANUF_ID, .model_id = SFDP_DEVICE_ID, .total_size = 0, /* set by probing function */ .page_size = 0, /* set by probing function */ .feature_bits = 0, /* set by probing function */ /* We present our own "report this" text hence we do not */ /* want the default "This flash part has status UNTESTED..." */ /* text to be printed. */ .tested = { .probe = OK, .read = OK, .erase = OK, .write = OK, .wp = NA }, .probe = PROBE_SPI_SFDP, .block_erasers = {}, /* set by probing function */ .unlock = SPI_DISABLE_BLOCKPROTECT, /* is this safe? */ .write = 0, /* set by probing function */ .read = SPI_CHIP_READ, /* FIXME: some vendor extensions define this */ .voltage = {0}, }, { .vendor = "Programmer", .name = "Opaque flash chip", .bustype = BUS_PROG, .manufacture_id = PROGMANUF_ID, .model_id = PROGDEV_ID, .total_size = 0, .page_size = 256, /* probe is assumed to work, rest will be filled in by probe */ .tested = TEST_OK_PROBE, .probe = PROBE_OPAQUE, /* eraseblock sizes will be set by the probing function */ .block_erasers = { { .block_erase = OPAQUE_ERASE, } }, .write = WRITE_OPAQUE, .read = READ_OPAQUE, }, { .vendor = "AMIC", .name = "unknown AMIC SPI chip", .bustype = BUS_SPI, .manufacture_id = AMIC_ID, .model_id = GENERIC_DEVICE_ID, .total_size = 0, .page_size = 256, .tested = TEST_BAD_PREW, .probe = PROBE_SPI_RDID4, .probe_timing = TIMING_ZERO, .write = 0, .read = 0, }, { .vendor = "Atmel", .name = "unknown Atmel SPI chip", .bustype = BUS_SPI, .manufacture_id = ATMEL_ID, .model_id = GENERIC_DEVICE_ID, .total_size = 0, .page_size = 256, .tested = TEST_BAD_PREW, .probe = PROBE_SPI_RDID, .probe_timing = TIMING_ZERO, .write = 0, .read = 0, }, { .vendor = "Eon", .name = "unknown Eon SPI chip", .bustype = BUS_SPI, .manufacture_id = EON_ID_NOPREFIX, .model_id = GENERIC_DEVICE_ID, .total_size = 0, .page_size = 256, .tested = TEST_BAD_PREW, .probe = PROBE_SPI_RDID, .probe_timing = TIMING_ZERO, .write = 0, .read = 0, }, { .vendor = "Macronix", .name = "unknown Macronix SPI chip", .bustype = BUS_SPI, .manufacture_id = MACRONIX_ID, .model_id = GENERIC_DEVICE_ID, .total_size = 0, .page_size = 256, .tested = TEST_BAD_PREW, .probe = PROBE_SPI_RDID, .probe_timing = TIMING_ZERO, .write = 0, .read = 0, }, { .vendor = "PMC", .name = "unknown PMC SPI chip", .bustype = BUS_SPI, .manufacture_id = PMC_ID, .model_id = GENERIC_DEVICE_ID, .total_size = 0, .page_size = 256, .tested = TEST_BAD_PREW, .probe = PROBE_SPI_RDID, .probe_timing = TIMING_ZERO, .write = 0, .read = 0, }, { .vendor = "SST", .name = "unknown SST SPI chip", .bustype = BUS_SPI, .manufacture_id = SST_ID, .model_id = GENERIC_DEVICE_ID, .total_size = 0, .page_size = 256, .tested = TEST_BAD_PREW, .probe = PROBE_SPI_RDID, .probe_timing = TIMING_ZERO, .write = 0, .read = 0, }, { .vendor = "ST", .name = "unknown ST SPI chip", .bustype = BUS_SPI, .manufacture_id = ST_ID, .model_id = GENERIC_DEVICE_ID, .total_size = 0, .page_size = 256, .tested = TEST_BAD_PREW, .probe = PROBE_SPI_RDID, .probe_timing = TIMING_ZERO, .write = 0, .read = 0, }, { .vendor = "Sanyo", .name = "unknown Sanyo SPI chip", .bustype = BUS_SPI, .manufacture_id = SANYO_ID, .model_id = GENERIC_DEVICE_ID, .total_size = 0, .page_size = 256, .tested = TEST_BAD_PREW, .probe = PROBE_SPI_RDID, .probe_timing = TIMING_ZERO, .write = 0, .read = 0, }, { .vendor = "Winbond", .name = "unknown Winbond (ex Nexcom) SPI chip", .bustype = BUS_SPI, .manufacture_id = WINBOND_NEX_ID, .model_id = GENERIC_DEVICE_ID, .total_size = 0, .page_size = 256, .tested = TEST_BAD_PREW, .probe = PROBE_SPI_RDID, .probe_timing = TIMING_ZERO, .write = 0, .read = 0, }, { .vendor = "Generic", .name = "unknown SPI chip (RDID)", .bustype = BUS_SPI, .manufacture_id = GENERIC_MANUF_ID, .model_id = GENERIC_DEVICE_ID, .total_size = 0, .page_size = 256, .tested = TEST_BAD_PREW, .probe = PROBE_SPI_RDID, .write = 0, }, { .vendor = "Generic", .name = "unknown SPI chip (REMS)", .bustype = BUS_SPI, .manufacture_id = GENERIC_MANUF_ID, .model_id = GENERIC_DEVICE_ID, .total_size = 0, .page_size = 256, .tested = TEST_BAD_PREW, .probe = PROBE_SPI_REMS, .write = 0, }, {0} }; const unsigned int flashchips_size = ARRAY_SIZE(flashchips);