The patch to board_enable.c needs to be updated to apply cleanly with the new DMI identification stuff, but otherwise this patch applied cleanly for me and I was able to add a superio entry to do some very basic testing -- My superio isn't fully supported (yet), but I was able to run through the probing steps successfully.
> +/**
> + *
> + */
> +static struct superio superios[] = {
> + {it87xx_detect, 0x8701, ITE_IT8703, NULL, it8703_gpio_set},
> + {it87xx_detect, 0x8705, ITE_IT8705, it8705f_write_enable, NULL},
> + {it87xx_detect, 0x8712, ITE_IT8712, NULL, it8712f_gpio_set},
> + {it87xx_detect, 0x8716, ITE_IT8716, it8716_spi_init, NULL},
> + {it87xx_detect, 0x8718, ITE_IT8718, it8716_spi_init, NULL},
> + {w836xx_detect, 0x3C, VIA_VT1211, NULL, NULL},
> + {w836xx_detect, 0x52, WB_W83627HF, NULL, w83627hf_gpio_set},
> + //{w836xx_detect, 0x60, WB_W83697HF, w83697hf_memw_enable, NULL},
Guess what i tested here :)
> + {w836xx_detect, 0x82, WB_W83627THF, NULL, w83627thf_gpio_set},
> + {w836xx_detect, 0x88, WB_W83627EHF, NULL, NULL},
> + {w836xx_detect, 0xA0, WB_W83627DHG, w83627dhg_spi_init, NULL},
> +
> + {NULL, 0, SIO_NONE, NULL, NULL} /* end marker */
> +};
Table with the action.
> +int
> +superio_probe(void)
> +{
> + struct superio_detect {
> + uint16_t port;
> + uint16_t (*detect) (uint16_t port);
> + char *name;
> + } superio_detects[] = {
> + {0x2E, w836xx_detect, "Winbond W836xx"},
> + {0x4E, w836xx_detect, "Winbond W836xx"},
> + {0x2E, it87xx_detect, "ITE IT87xx"},
> + {0x4E, it87xx_detect, "ITE IT87xx"},
> +
> + {0, NULL} /* end marker */
> + };
> +
> + int i, j;
> + uint16_t id;
> +
> + for (i = 0; superio_detects[i].detect; i++) {
> +
> + id = superio_detects[i].detect(superio_detects[i].port);
> + if ((id == 0xFF) || (id == 0xFFFF))
> + continue;
> +
> + msg_pdbg("Superio detection for \"%s\" on 0x%X"
> + " returned 0x%0X\n", superio_detects[i].name,
> + superio_detects[i].port, id);
> +
> + for (j = 0; superios[j].detect; j++) {
> + if ((superios[j].detect == superio_detects[i].detect) &&
> + (id == superios[j].id)) {
> + superio = &superios[j];
> + superio_port = superio_detects[i].port;
> + break;
> + }
> + }
> +
> + if (!superio)
> + msg_perr("No matching superio found for \"%s\" (0x%X) :"
> + " 0x%0X\n", superio_detects[i].name,
> + superio_detects[i].port, id);
> + }
> +
> + if (superio)
> + msg_pinfo("Superio \"%s\" detected on 0x%0X.\n",
> + superio_chip_name(superio->chip), superio_port);
> + else
> + msg_pdbg("No Superio chip detected.\n");
> +
> + return 0;
> +}
Here we do the detection in a clean way with little noise.
> +++ b/superio.h
> @@ -0,0 +1,107 @@
> +/*
> + * This file is part of the flashrom project.
> + *
> + * 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.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, write to the Free Software
> + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
> + */
> +#ifndef HAVE_SUPERIO_H
> +#define HAVE_SUPERIO_H 1
> +
> +/*
> + *
> + */
> +enum superio_chip {
> + SIO_NONE = 0,
> +
> + /* ITE */
> + ITE_IT8703,
> + ITE_IT8705,
> + ITE_IT8708,
> + ITE_IT8712,
> + ITE_IT8716,
> + ITE_IT8718,
> +
> + /* A lonesome VIA superio */
> + VIA_VT1211,
> +
> + /* Winbond */
> + WB_W83627DHG,
> + WB_W83627EHF,
> + WB_W83627HF,
> + WB_W83627THF,
> + WB_W83697HF,
> +
> + SIO_UNKNOWN
> +};
> +
> +/*
> + *
> + */
> +struct superio {
> + uint16_t (*detect) (uint16_t port);
> + uint16_t id;
> +
> + enum superio_chip chip;
> +
> + int (*init) (uint16_t port);
> + int (*gpio_set) (uint16_t port, int gpio, int raise);
> +};
> +
> +struct superio *superio;
> +uint16_t superio_port;
> +
> +uint8_t sio_read(uint16_t port, uint8_t reg);
> +void sio_write(uint16_t port, uint8_t reg, uint8_t data);
> +void sio_mask(uint16_t port, uint8_t reg, uint8_t data, uint8_t mask);
> +
> +void w836xx_ext_enter(uint16_t port);
> +void w836xx_ext_leave(uint16_t port);
> +
> +void ite_conf_mode_enter(uint16_t port);
> +void ite_conf_mode_exit(uint16_t port);
> +
> +/*
> + * High level calls.
> + */
> +int superio_probe(void);
> +int superio_init(void);
> +int superio_gpio_set(int gpio, int raise);
> +
> +/*
> + *
> + * Will someone please pour the programmer infrastructure in a struct with
> + * callbacks that gets created by the init functions below? This lack of
> + * abstraction now causes us to have to include horrible flash.h before
> + * this file.
> + *
> + */
> +
> +/*
> + * it87spi.c
> + */
> +int it8716_spi_init(uint16_t port);
> +int it8716f_spi_send_command(unsigned int writecnt, unsigned int readcnt,
> + const unsigned char *writearr, unsigned char *readarr);
> +int it8716f_spi_chip_read(struct flashchip *flash, uint8_t *buf, int start, int len);
> +int it8716f_spi_chip_write_256(struct flashchip *flash, uint8_t *buf);
> +
> +/*
> + * wbsio_spi.c
> + */
> +int w83627dhg_spi_init(uint16_t port);
> +int wbsio_spi_send_command(unsigned int writecnt, unsigned int readcnt,
> + const unsigned char *writearr, unsigned char *readarr);
> +int wbsio_spi_read(struct flashchip *flash, uint8_t *buf, int start, int len);
> +int wbsio_spi_write_1(struct flashchip *flash, uint8_t *buf);
> +
> +#endif /* HAVE_SUPERIO_H */
Anyway, here is an example of two test runs last weeks:
n the asus A7V8X-MX SE (which up until now required a board enable to init the superio).
With just superio_probe():
> /tmp/flashrom_superio# ./flashrom
> flashrom v0.9.1-runknown
> No coreboot table found.
> Found chipset "VIA VT8235", enabling flash write... OK.
> This chipset supports the following protocols: Non-SPI.
> Superio "Winbond W83697HF" detected on 0x2E.
> Calibrating delay loop... OK.
> No EEPROM/flash device found.
> If you know which flash chip you have, and if this version of flashrom
> supports a similar flash chip, you can try to force read your chip. Run:
> flashrom -f -r -c similar_supported_flash_chip filename
>
> Note: flashrom can never write when the flash chip isn't found automatically.
After adding superio_init(), which runs the initialisation code, when a
superio has been identified and when the init callback is there:
> /tmp/flashrom_superio# ./flashrom
> flashrom v0.9.1-runknown
> No coreboot table found.
> Found chipset "VIA VT8235", enabling flash write... OK.
> This chipset supports the following protocols: Non-SPI.
> Superio "Winbond W83697HF" detected on 0x2E.
> Initialising "Winbond W83697HF" superio
> Calibrating delay loop... OK.
> Found chip "SST SST39SF020A" (256 KB, Parallel) at physical address 0xfffc0000.
> No operations were specified.
SO with the above comment not there, we are already able to scrap 6 board enables!
Luc Verhaegen.
_______________________________________________
flashrom mailing list
flashrom@flashrom.org
http://www.flashrom.org/mailman/listinfo/flashrom