summaryrefslogtreecommitdiffstats
path: root/it87spi.c
diff options
context:
space:
mode:
Diffstat (limited to 'it87spi.c')
-rw-r--r--it87spi.c84
1 files changed, 41 insertions, 43 deletions
diff --git a/it87spi.c b/it87spi.c
index 868b479a8..9c64659f1 100644
--- a/it87spi.c
+++ b/it87spi.c
@@ -19,15 +19,15 @@
* Contains the ITE IT87* SPI specific routines
*/
-#if defined(__i386__) || defined(__x86_64__)
-
#include <string.h>
+#include <stdbool.h>
#include <stdlib.h>
#include <errno.h>
#include "flash.h"
#include "chipdrivers.h"
#include "programmer.h"
-#include "hwaccess.h"
+#include "hwaccess_physmap.h"
+#include "hwaccess_x86_io.h"
#include "spi.h"
#define ITE_SUPERIO_PORT1 0x2e
@@ -40,7 +40,7 @@
struct it8716f_spi_data {
uint16_t flashport;
/* use fast 33MHz SPI (<>0) or slow 16MHz (0) */
- int fast_spi;
+ bool fast_spi;
};
static int get_data_from_context(const struct flashctx *flash, struct it8716f_spi_data **data)
@@ -134,9 +134,20 @@ static int it8716f_spi_page_program(struct flashctx *flash, const uint8_t *buf,
OUTB(0, data->flashport);
/* Wait until the Write-In-Progress bit is cleared.
* This usually takes 1-10 ms, so wait in 1 ms steps.
+ *
+ * FIXME: This should timeout after some number of retries.
*/
- while (spi_read_status_register(flash) & SPI_SR_WIP)
- programmer_delay(1000);
+ while (true) {
+ uint8_t status;
+ int ret = spi_read_register(flash, STATUS1, &status);
+ if (ret)
+ return ret;
+
+ if((status & SPI_SR_WIP) == 0)
+ return 0;
+
+ default_delay(1000);
+ }
return 0;
}
@@ -232,7 +243,7 @@ static int it8716f_spi_chip_read(struct flashctx *flash, uint8_t *buf,
if (get_data_from_context(flash, &data) < 0)
return SPI_GENERIC_ERROR;
- data->fast_spi = 0;
+ data->fast_spi = false;
/* FIXME: Check if someone explicitly requested to use IT87 SPI although
* the mainboard does not use IT87 SPI translation. This should be done
@@ -278,7 +289,10 @@ static int it8716f_spi_chip_write_256(struct flashctx *flash, const uint8_t *buf
}
while (len >= chip->page_size) {
- it8716f_spi_page_program(flash, buf, start);
+ int ret = it8716f_spi_page_program(flash, buf, start);
+ if (ret)
+ return ret;
+ update_progress(flash, FLASHROM_PROGRESS_WRITE, chip->page_size - len, chip->page_size);
start += chip->page_size;
len -= chip->page_size;
buf += chip->page_size;
@@ -290,31 +304,32 @@ static int it8716f_spi_chip_write_256(struct flashctx *flash, const uint8_t *buf
return 0;
}
-static struct spi_master spi_master_it87xx = {
+static int it8716f_shutdown(void *data)
+{
+ free(data);
+ return 0;
+}
+
+static const struct spi_master spi_master_it87xx = {
.max_data_read = 3,
.max_data_write = MAX_DATA_UNSPECIFIED,
.command = it8716f_spi_send_command,
- .multicommand = default_spi_send_multicommand,
+ .map_flash_region = physmap,
+ .unmap_flash_region = physunmap,
.read = it8716f_spi_chip_read,
.write_256 = it8716f_spi_chip_write_256,
.write_aai = spi_chip_write_1,
+ .shutdown = it8716f_shutdown,
};
-
-static int it8716f_shutdown(void *data)
-{
- free(data);
- return 0;
-}
-
-static uint16_t it87spi_probe(uint16_t port)
+static uint16_t it87spi_probe(const struct programmer_cfg *cfg, uint16_t port)
{
uint8_t tmp = 0;
uint16_t flashport = 0;
enter_conf_mode_ite(port);
- char *param = extract_programmer_param("dualbiosindex");
+ char *param = extract_programmer_param_str(cfg, "dualbiosindex");
if (param != NULL) {
sio_write(port, 0x07, 0x07); /* Select GPIO LDN */
tmp = sio_read(port, 0xEF);
@@ -380,7 +395,7 @@ static uint16_t it87spi_probe(uint16_t port)
flashport |= sio_read(port, 0x65);
msg_pdbg("Serial flash port 0x%04x\n", flashport);
/* Non-default port requested? */
- param = extract_programmer_param("it87spiport");
+ param = extract_programmer_param_str(cfg, "it87spiport");
if (param) {
char *endptr = NULL;
unsigned long forced_flashport;
@@ -411,26 +426,22 @@ static uint16_t it87spi_probe(uint16_t port)
free(param);
exit_conf_mode_ite(port);
- struct it8716f_spi_data *data = calloc(1, sizeof(struct it8716f_spi_data));
+ struct it8716f_spi_data *data = calloc(1, sizeof(*data));
if (!data) {
msg_perr("Unable to allocate space for extra SPI master data.\n");
return SPI_GENERIC_ERROR;
}
data->flashport = flashport;
- data->fast_spi = 1;
- spi_master_it87xx.data = data;
-
- register_shutdown(it8716f_shutdown, data);
+ data->fast_spi = true;
if (internal_buses_supported & BUS_SPI)
msg_pdbg("Overriding chipset SPI with IT87 SPI.\n");
/* FIXME: Add the SPI bus or replace the other buses with it? */
- register_spi_master(&spi_master_it87xx);
- return 0;
+ return register_spi_master(&spi_master_it87xx, data);
}
-int init_superio_ite(void)
+int init_superio_ite(const struct programmer_cfg *cfg)
{
int i;
int ret = 0;
@@ -440,26 +451,15 @@ int init_superio_ite(void)
continue;
switch (superios[i].model) {
- case 0x8500:
- case 0x8502:
- case 0x8510:
- case 0x8511:
- case 0x8512:
- /* FIXME: This should be enabled, but we need a check
- * for laptop whitelisting due to the amount of things
- * which can go wrong if the EC firmware does not
- * implement the interface we want.
- */
- //it85xx_spi_init(superios[i]);
- break;
case 0x8705:
ret |= it8705f_write_enable(superios[i].port);
break;
+ case 0x8686:
case 0x8716:
case 0x8718:
case 0x8720:
case 0x8728:
- ret |= it87spi_probe(superios[i].port);
+ ret |= it87spi_probe(cfg, superios[i].port);
break;
default:
msg_pdbg2("Super I/O ID 0x%04hx is not on the list of flash-capable controllers.\n",
@@ -468,5 +468,3 @@ int init_superio_ite(void)
}
return ret;
}
-
-#endif /* defined(__i386__) || defined(__x86_64__) */