summaryrefslogtreecommitdiffstats
path: root/chipset_enable.c
diff options
context:
space:
mode:
authorStefan Tauner <stefan.tauner@alumni.tuwien.ac.at>2013-09-14 23:37:01 +0000
committerStefan Tauner <stefan.tauner@alumni.tuwien.ac.at>2013-09-14 23:37:01 +0000
commitb863b07974f28c5fdbad896a750517dd72cf99b7 (patch)
treee322dec9da0fd698ac6bb71c2f0ea2c461df5e5e /chipset_enable.c
parentf4fa3914cd66471518480d18a1f0cac56a101e39 (diff)
downloadflashrom-b863b07974f28c5fdbad896a750517dd72cf99b7.zip
flashrom-b863b07974f28c5fdbad896a750517dd72cf99b7.tar.gz
Enable fwh_idsel parameter for C-ICH and ICH2/3/4/5 chipsets
Register locations are different from ICH6, but otherwise appear to have identical bit specifications and defaults. Binary file (standard input) matches Corresponding to flashrom svn r1748.
Diffstat (limited to 'chipset_enable.c')
-rw-r--r--chipset_enable.c34
1 files changed, 22 insertions, 12 deletions
diff --git a/chipset_enable.c b/chipset_enable.c
index 4cdf9a2..c85db73 100644
--- a/chipset_enable.c
+++ b/chipset_enable.c
@@ -323,7 +323,7 @@ static int enable_flash_ich0(struct pci_dev *dev, const char *name)
return enable_flash_ich(dev, name, 0x4e);
}
-static int enable_flash_ich_fwh_decode(struct pci_dev *dev, const char *name)
+static int enable_flash_ich_fwh_decode(struct pci_dev *dev, const char *name, enum ich_chipset ich_generation)
{
uint32_t fwh_conf;
uint8_t fwh_sel1, fwh_sel2, fwh_dec_en_lo, fwh_dec_en_hi;
@@ -332,11 +332,20 @@ static int enable_flash_ich_fwh_decode(struct pci_dev *dev, const char *name)
int max_decode_fwh_idsel = 0, max_decode_fwh_decode = 0;
int contiguous = 1;
- /* Register map from ICH6 onwards. */
- fwh_sel1 = 0xd0;
- fwh_sel2 = 0xd4;
- fwh_dec_en_lo = 0xd8;
- fwh_dec_en_hi = 0xd9;
+ if (ich_generation >= CHIPSET_ICH6) {
+ fwh_sel1 = 0xd0;
+ fwh_sel2 = 0xd4;
+ fwh_dec_en_lo = 0xd8;
+ fwh_dec_en_hi = 0xd9;
+ } else if (ich_generation >= CHIPSET_ICH2) {
+ fwh_sel1 = 0xe8;
+ fwh_sel2 = 0xee;
+ fwh_dec_en_lo = 0xf0;
+ fwh_dec_en_hi = 0xe3;
+ } else {
+ msg_perr("Error: FWH decode setting not implemented.\n");
+ return ERROR_FATAL;
+ }
idsel = extract_programmer_param("fwh_idsel");
if (idsel && strlen(idsel)) {
@@ -441,11 +450,12 @@ idsel_garbage_out:
static int enable_flash_ich_4e(struct pci_dev *dev, const char *name, enum ich_chipset ich_generation)
{
- /*
- * Note: ICH5 has registers similar to FWH_SEL1, FWH_SEL2 and
- * FWH_DEC_EN1, but they are called FB_SEL1, FB_SEL2, FB_DEC_EN1 and
- * FB_DEC_EN2.
- */
+ int err;
+
+ /* Configure FWH IDSEL decoder maps. */
+ if ((err = enable_flash_ich_fwh_decode(dev, name, ich_generation)) != 0)
+ return err;
+
internal_buses_supported = BUS_FWH;
return enable_flash_ich(dev, name, 0x4e);
}
@@ -475,7 +485,7 @@ static int enable_flash_ich_dc(struct pci_dev *dev, const char *name, enum ich_c
int err;
/* Configure FWH IDSEL decoder maps. */
- if ((err = enable_flash_ich_fwh_decode(dev, name)) != 0)
+ if ((err = enable_flash_ich_fwh_decode(dev, name, ich_generation)) != 0)
return err;
/* If we're called by enable_flash_ich_dc_spi, it will override
OpenPOWER on IntegriCloud