Commit 8a3c60cd authored by Carl-Daniel Hailfinger's avatar Carl-Daniel Hailfinger
Browse files

Add struct flashctx * parameter to all functions accessing flash chips


All programmer access function prototypes except init have been made
static and moved to the respective file.

A few internal functions in flash chip drivers had chipaddr parameters
which are no longer needed.

The lines touched by flashctx changes have been adjusted to 80 columns
except in header files.

Corresponding to flashrom svn r1474.
Signed-off-by: default avatarCarl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net>
Acked-by: default avatarMichael Karcher <flashrom@mkarcher.dialup.fu-berlin.de>
parent 63fd9026
......@@ -47,18 +47,18 @@ int probe_82802ab(struct flashctx *flash)
int shifted = (flash->feature_bits & FEATURE_ADDR_SHIFTED) != 0;
/* Reset to get a clean state */
chip_writeb(0xFF, bios);
chip_writeb(flash, 0xFF, bios);
programmer_delay(10);
/* Enter ID mode */
chip_writeb(0x90, bios);
chip_writeb(flash, 0x90, bios);
programmer_delay(10);
id1 = chip_readb(bios + (0x00 << shifted));
id2 = chip_readb(bios + (0x01 << shifted));
id1 = chip_readb(flash, bios + (0x00 << shifted));
id2 = chip_readb(flash, bios + (0x01 << shifted));
/* Leave ID mode */
chip_writeb(0xFF, bios);
chip_writeb(flash, 0xFF, bios);
programmer_delay(10);
......@@ -71,8 +71,8 @@ int probe_82802ab(struct flashctx *flash)
* Read the product ID location again. We should now see normal
* flash contents.
*/
flashcontent1 = chip_readb(bios + (0x00 << shifted));
flashcontent2 = chip_readb(bios + (0x01 << shifted));
flashcontent1 = chip_readb(flash, bios + (0x00 << shifted));
flashcontent2 = chip_readb(flash, bios + (0x01 << shifted));
if (id1 == flashcontent1)
msg_cdbg(", id1 is normal flash content");
......@@ -94,15 +94,15 @@ uint8_t wait_82802ab(struct flashctx *flash)
uint8_t status;
chipaddr bios = flash->virtual_memory;
chip_writeb(0x70, bios);
if ((chip_readb(bios) & 0x80) == 0) { // it's busy
while ((chip_readb(bios) & 0x80) == 0) ;
chip_writeb(flash, 0x70, bios);
if ((chip_readb(flash, bios) & 0x80) == 0) { // it's busy
while ((chip_readb(flash, bios) & 0x80) == 0) ;
}
status = chip_readb(bios);
status = chip_readb(flash, bios);
/* Reset to get a clean state */
chip_writeb(0xFF, bios);
chip_writeb(flash, 0xFF, bios);
return status;
}
......@@ -113,7 +113,7 @@ int unlock_82802ab(struct flashctx *flash)
//chipaddr wrprotect = flash->virtual_registers + page + 2;
for (i = 0; i < flash->total_size * 1024; i+= flash->page_size)
chip_writeb(0, flash->virtual_registers + i + 2);
chip_writeb(flash, 0, flash->virtual_registers + i + 2);
return 0;
}
......@@ -125,11 +125,11 @@ int erase_block_82802ab(struct flashctx *flash, unsigned int page,
uint8_t status;
// clear status register
chip_writeb(0x50, bios + page);
chip_writeb(flash, 0x50, bios + page);
// now start it
chip_writeb(0x20, bios + page);
chip_writeb(0xd0, bios + page);
chip_writeb(flash, 0x20, bios + page);
chip_writeb(flash, 0xd0, bios + page);
programmer_delay(10);
// now let's see what the register is
......@@ -141,15 +141,16 @@ int erase_block_82802ab(struct flashctx *flash, unsigned int page,
}
/* chunksize is 1 */
int write_82802ab(struct flashctx *flash, uint8_t *src, unsigned int start, unsigned int len)
int write_82802ab(struct flashctx *flash, uint8_t *src, unsigned int start,
unsigned int len)
{
int i;
chipaddr dst = flash->virtual_memory + start;
for (i = 0; i < len; i++) {
/* transfer data from source to destination */
chip_writeb(0x40, dst);
chip_writeb(*src++, dst++);
chip_writeb(flash, 0x40, dst);
chip_writeb(flash, *src++, dst++);
wait_82802ab(flash);
}
......@@ -164,13 +165,13 @@ int unlock_28f004s5(struct flashctx *flash)
int i;
/* Clear status register */
chip_writeb(0x50, bios);
chip_writeb(flash, 0x50, bios);
/* Read identifier codes */
chip_writeb(0x90, bios);
chip_writeb(flash, 0x90, bios);
/* Read master lock-bit */
mcfg = chip_readb(bios + 0x3);
mcfg = chip_readb(flash, bios + 0x3);
msg_cdbg("master lock is ");
if (mcfg) {
msg_cdbg("locked!\n");
......@@ -181,7 +182,7 @@ int unlock_28f004s5(struct flashctx *flash)
/* Read block lock-bits */
for (i = 0; i < flash->total_size * 1024; i+= (64 * 1024)) {
bcfg = chip_readb(bios + i + 2); // read block lock config
bcfg = chip_readb(flash, bios + i + 2); // read block lock config
msg_cdbg("block lock at %06x is %slocked!\n", i, bcfg ? "" : "un");
if (bcfg) {
need_unlock = 1;
......@@ -189,14 +190,14 @@ int unlock_28f004s5(struct flashctx *flash)
}
/* Reset chip */
chip_writeb(0xFF, bios);
chip_writeb(flash, 0xFF, bios);
/* Unlock: clear block lock-bits, if needed */
if (can_unlock && need_unlock) {
msg_cdbg("Unlock: ");
chip_writeb(0x60, bios);
chip_writeb(0xD0, bios);
chip_writeb(0xFF, bios);
chip_writeb(flash, 0x60, bios);
chip_writeb(flash, 0xD0, bios);
chip_writeb(flash, 0xFF, bios);
msg_cdbg("Done!\n");
}
......@@ -220,10 +221,10 @@ int unlock_lh28f008bjt(struct flashctx *flash)
wait_82802ab(flash);
/* Read identifier codes */
chip_writeb(0x90, bios);
chip_writeb(flash, 0x90, bios);
/* Read master lock-bit */
mcfg = chip_readb(bios + 0x3);
mcfg = chip_readb(flash, bios + 0x3);
msg_cdbg("master lock is ");
if (mcfg) {
msg_cdbg("locked!\n");
......@@ -235,7 +236,7 @@ int unlock_lh28f008bjt(struct flashctx *flash)
/* Read block lock-bits, 8 * 8 KB + 15 * 64 KB */
for (i = 0; i < flash->total_size * 1024;
i += (i >= (64 * 1024) ? 64 * 1024 : 8 * 1024)) {
bcfg = chip_readb(bios + i + 2); /* read block lock config */
bcfg = chip_readb(flash, bios + i + 2); /* read block lock config */
msg_cdbg("block lock at %06x is %slocked!\n", i,
bcfg ? "" : "un");
if (bcfg)
......@@ -243,14 +244,14 @@ int unlock_lh28f008bjt(struct flashctx *flash)
}
/* Reset chip */
chip_writeb(0xFF, bios);
chip_writeb(flash, 0xFF, bios);
/* Unlock: clear block lock-bits, if needed */
if (can_unlock && need_unlock) {
msg_cdbg("Unlock: ");
chip_writeb(0x60, bios);
chip_writeb(0xD0, bios);
chip_writeb(0xFF, bios);
chip_writeb(flash, 0x60, bios);
chip_writeb(flash, 0xD0, bios);
chip_writeb(flash, 0xFF, bios);
wait_82802ab(flash);
msg_cdbg("Done!\n");
}
......
......@@ -33,7 +33,7 @@ int spi_prettyprint_status_register_amic_a25l05p(struct flashctx *flash)
{
uint8_t status;
status = spi_read_status_register();
status = spi_read_status_register(flash);
msg_cdbg("Chip status register is %02x\n", status);
spi_prettyprint_status_register_amic_a25_srwd(status);
......@@ -49,7 +49,7 @@ int spi_prettyprint_status_register_amic_a25l40p(struct flashctx *flash)
{
uint8_t status;
status = spi_read_status_register();
status = spi_read_status_register(flash);
msg_cdbg("Chip status register is %02x\n", status);
spi_prettyprint_status_register_amic_a25_srwd(status);
......@@ -64,7 +64,7 @@ int spi_prettyprint_status_register_amic_a25l032(struct flashctx *flash)
{
uint8_t status;
status = spi_read_status_register();
status = spi_read_status_register(flash);
msg_cdbg("Chip status register is %02x\n", status);
spi_prettyprint_status_register_amic_a25_srwd(status);
......@@ -82,7 +82,7 @@ int spi_prettyprint_status_register_amic_a25lq032(struct flashctx *flash)
{
uint8_t status;
status = spi_read_status_register();
status = spi_read_status_register(flash);
msg_cdbg("Chip status register is %02x\n", status);
spi_prettyprint_status_register_amic_a25_srwd(status);
......
......@@ -61,7 +61,7 @@ int spi_prettyprint_status_register_at25df(struct flashctx *flash)
{
uint8_t status;
status = spi_read_status_register();
status = spi_read_status_register(flash);
msg_cdbg("Chip status register is %02x\n", status);
spi_prettyprint_status_register_atmel_at25_srpl(status);
......@@ -84,7 +84,7 @@ int spi_prettyprint_status_register_at25f(struct flashctx *flash)
{
uint8_t status;
status = spi_read_status_register();
status = spi_read_status_register(flash);
msg_cdbg("Chip status register is %02x\n", status);
spi_prettyprint_status_register_atmel_at25_srpl(status);
......@@ -103,7 +103,7 @@ int spi_prettyprint_status_register_at25fs010(struct flashctx *flash)
{
uint8_t status;
status = spi_read_status_register();
status = spi_read_status_register(flash);
msg_cdbg("Chip status register is %02x\n", status);
msg_cdbg("Chip status register: Status Register Write Protect (WPEN) "
......@@ -127,7 +127,7 @@ int spi_prettyprint_status_register_at25fs040(struct flashctx *flash)
{
uint8_t status;
status = spi_read_status_register();
status = spi_read_status_register(flash);
msg_cdbg("Chip status register is %02x\n", status);
msg_cdbg("Chip status register: Status Register Write Protect (WPEN) "
......@@ -151,7 +151,7 @@ int spi_prettyprint_status_register_atmel_at26df081a(struct flashctx *flash)
{
uint8_t status;
status = spi_read_status_register();
status = spi_read_status_register(flash);
msg_cdbg("Chip status register is %02x\n", status);
spi_prettyprint_status_register_atmel_at25_srpl(status);
......@@ -168,7 +168,7 @@ int spi_disable_blockprotect_at25df(struct flashctx *flash)
uint8_t status;
int result;
status = spi_read_status_register();
status = spi_read_status_register(flash);
/* If block protection is disabled, stop here. */
if ((status & (3 << 2)) == 0)
return 0;
......@@ -195,7 +195,7 @@ int spi_disable_blockprotect_at25df(struct flashctx *flash)
msg_cerr("spi_write_status_register failed\n");
return result;
}
status = spi_read_status_register();
status = spi_read_status_register(flash);
if ((status & (3 << 2)) != 0) {
msg_cerr("Block protection could not be disabled!\n");
return 1;
......@@ -223,7 +223,7 @@ int spi_disable_blockprotect_at25fs010(struct flashctx *flash)
uint8_t status;
int result;
status = spi_read_status_register();
status = spi_read_status_register(flash);
/* If block protection is disabled, stop here. */
if ((status & 0x6c) == 0)
return 0;
......@@ -244,7 +244,7 @@ int spi_disable_blockprotect_at25fs010(struct flashctx *flash)
msg_cerr("spi_write_status_register failed\n");
return result;
}
status = spi_read_status_register();
status = spi_read_status_register(flash);
if ((status & 0x6c) != 0) {
msg_cerr("Block protection could not be disabled!\n");
return 1;
......@@ -257,7 +257,7 @@ int spi_disable_blockprotect_at25fs040(struct flashctx *flash)
uint8_t status;
int result;
status = spi_read_status_register();
status = spi_read_status_register(flash);
/* If block protection is disabled, stop here. */
if ((status & 0x7c) == 0)
return 0;
......@@ -278,7 +278,7 @@ int spi_disable_blockprotect_at25fs040(struct flashctx *flash)
msg_cerr("spi_write_status_register failed\n");
return result;
}
status = spi_read_status_register();
status = spi_read_status_register(flash);
if ((status & 0x7c) != 0) {
msg_cerr("Block protection could not be disabled!\n");
return 1;
......
......@@ -40,6 +40,10 @@ const struct pcidev_status ata_hpt[] = {
{},
};
static void atahpt_chip_writeb(const struct flashctx *flash, uint8_t val,
chipaddr addr);
static uint8_t atahpt_chip_readb(const struct flashctx *flash,
const chipaddr addr);
static const struct par_programmer par_programmer_atahpt = {
.chip_readb = atahpt_chip_readb,
.chip_readw = fallback_chip_readw,
......@@ -80,13 +84,15 @@ int atahpt_init(void)
return 0;
}
void atahpt_chip_writeb(uint8_t val, chipaddr addr)
static void atahpt_chip_writeb(const struct flashctx *flash, uint8_t val,
chipaddr addr)
{
OUTL((uint32_t)addr, io_base_addr + BIOS_ROM_ADDR);
OUTB(val, io_base_addr + BIOS_ROM_DATA);
}
uint8_t atahpt_chip_readb(const chipaddr addr)
static uint8_t atahpt_chip_readb(const struct flashctx *flash,
const chipaddr addr)
{
OUTL((uint32_t)addr, io_base_addr + BIOS_ROM_ADDR);
return INB(io_base_addr + BIOS_ROM_DATA);
......
......@@ -63,8 +63,10 @@ static void bitbang_spi_release_bus(void)
bitbang_spi_master->release_bus();
}
static int bitbang_spi_send_command(unsigned int writecnt, unsigned int readcnt,
const unsigned char *writearr, unsigned char *readarr);
static int bitbang_spi_send_command(struct flashctx *flash,
unsigned int writecnt, unsigned int readcnt,
const unsigned char *writearr,
unsigned char *readarr);
static const struct spi_programmer spi_programmer_bitbang = {
.type = SPI_CONTROLLER_BITBANG,
......@@ -141,8 +143,10 @@ static uint8_t bitbang_spi_readwrite_byte(uint8_t val)
return ret;
}
static int bitbang_spi_send_command(unsigned int writecnt, unsigned int readcnt,
const unsigned char *writearr, unsigned char *readarr)
static int bitbang_spi_send_command(struct flashctx *flash,
unsigned int writecnt, unsigned int readcnt,
const unsigned char *writearr,
unsigned char *readarr)
{
int i;
......
......@@ -86,8 +86,11 @@ static int buspirate_sendrecv(unsigned char *buf, unsigned int writecnt,
return 0;
}
static int buspirate_spi_send_command(unsigned int writecnt, unsigned int readcnt,
const unsigned char *writearr, unsigned char *readarr);
static int buspirate_spi_send_command(struct flashctx *flash,
unsigned int writecnt,
unsigned int readcnt,
const unsigned char *writearr,
unsigned char *readarr);
static const struct spi_programmer spi_programmer_buspirate = {
.type = SPI_CONTROLLER_BUSPIRATE,
......@@ -291,8 +294,11 @@ int buspirate_spi_init(void)
return 0;
}
static int buspirate_spi_send_command(unsigned int writecnt, unsigned int readcnt,
const unsigned char *writearr, unsigned char *readarr)
static int buspirate_spi_send_command(struct flashctx *flash,
unsigned int writecnt,
unsigned int readcnt,
const unsigned char *writearr,
unsigned char *readarr)
{
static unsigned char *buf = NULL;
unsigned int i = 0;
......
......@@ -33,8 +33,8 @@ int probe_spi_rdid4(struct flashctx *flash);
int probe_spi_rems(struct flashctx *flash);
int probe_spi_res1(struct flashctx *flash);
int probe_spi_res2(struct flashctx *flash);
int spi_write_enable(void);
int spi_write_disable(void);
int spi_write_enable(struct flashctx *flash);
int spi_write_disable(struct flashctx *flash);
int spi_block_erase_20(struct flashctx *flash, unsigned int addr, unsigned int blocklen);
int spi_block_erase_52(struct flashctx *flash, unsigned int addr, unsigned int blocklen);
int spi_block_erase_d7(struct flashctx *flash, unsigned int addr, unsigned int blocklen);
......@@ -44,16 +44,16 @@ int spi_block_erase_c7(struct flashctx *flash, unsigned int addr, unsigned int b
int spi_chip_write_1(struct flashctx *flash, uint8_t *buf, unsigned int start, unsigned int len);
int spi_chip_write_256(struct flashctx *flash, uint8_t *buf, unsigned int start, unsigned int len);
int spi_chip_read(struct flashctx *flash, uint8_t *buf, unsigned int start, int unsigned len);
uint8_t spi_read_status_register(void);
uint8_t spi_read_status_register(struct flashctx *flash);
int spi_write_status_register(struct flashctx *flash, int status);
void spi_prettyprint_status_register_bit(uint8_t status, int bit);
void spi_prettyprint_status_register_bp3210(uint8_t status, int bp);
void spi_prettyprint_status_register_welwip(uint8_t status);
int spi_prettyprint_status_register(struct flashctx *flash);
int spi_disable_blockprotect(struct flashctx *flash);
int spi_byte_program(unsigned int addr, uint8_t databyte);
int spi_nbyte_program(unsigned int addr, uint8_t *bytes, unsigned int len);
int spi_nbyte_read(unsigned int addr, uint8_t *bytes, unsigned int len);
int spi_byte_program(struct flashctx *flash, unsigned int addr, uint8_t databyte);
int spi_nbyte_program(struct flashctx *flash, unsigned int addr, uint8_t *bytes, unsigned int len);
int spi_nbyte_read(struct flashctx *flash, unsigned int addr, uint8_t *bytes, unsigned int len);
int spi_read_chunked(struct flashctx *flash, uint8_t *buf, unsigned int start, unsigned int len, unsigned int chunksize);
int spi_write_chunked(struct flashctx *flash, uint8_t *buf, unsigned int start, unsigned int len, unsigned int chunksize);
int spi_aai_write(struct flashctx *flash, uint8_t *buf, unsigned int start, unsigned int len);
......@@ -95,9 +95,9 @@ int unlock_lh28f008bjt(struct flashctx *flash);
/* jedec.c */
uint8_t oddparity(uint8_t val);
void toggle_ready_jedec(chipaddr dst);
void data_polling_jedec(chipaddr dst, uint8_t data);
int write_byte_program_jedec(chipaddr bios, uint8_t *src,
void toggle_ready_jedec(struct flashctx *flash, chipaddr dst);
void data_polling_jedec(struct flashctx *flash, chipaddr dst, uint8_t data);
int write_byte_program_jedec(struct flashctx *flash, chipaddr bios, uint8_t *src,
chipaddr dst);
int probe_jedec(struct flashctx *flash);
int write_jedec(struct flashctx *flash, uint8_t *buf, unsigned int start, unsigned int len);
......@@ -111,7 +111,7 @@ int probe_m29f400bt(struct flashctx *flash);
int block_erase_m29f400bt(struct flashctx *flash, unsigned int start, unsigned int len);
int block_erase_chip_m29f400bt(struct flashctx *flash, unsigned int start, unsigned int len);
int write_m29f400bt(struct flashctx *flash, uint8_t *buf, unsigned int start, unsigned int len);
void protect_m29f400bt(chipaddr bios);
void protect_m29f400bt(struct flashctx *flash, chipaddr bios);
/* pm49fl00x.c */
int unlock_49fl00x(struct flashctx *flash);
......
......@@ -317,8 +317,11 @@ static int dediprog_spi_write_256(struct flashctx *flash, uint8_t *buf,
return ret;
}
static int dediprog_spi_send_command(unsigned int writecnt, unsigned int readcnt,
const unsigned char *writearr, unsigned char *readarr)
static int dediprog_spi_send_command(struct flashctx *flash,
unsigned int writecnt,
unsigned int readcnt,
const unsigned char *writearr,
unsigned char *readarr)
{
int ret;
......
......@@ -39,6 +39,10 @@ const struct pcidev_status drkaiser_pcidev[] = {
static uint8_t *drkaiser_bar;
static void drkaiser_chip_writeb(const struct flashctx *flash, uint8_t val,
chipaddr addr);
static uint8_t drkaiser_chip_readb(const struct flashctx *flash,
const chipaddr addr);
static const struct par_programmer par_programmer_drkaiser = {
.chip_readb = drkaiser_chip_readb,
.chip_readw = fallback_chip_readw,
......@@ -84,12 +88,14 @@ int drkaiser_init(void)
return 0;
}
void drkaiser_chip_writeb(uint8_t val, chipaddr addr)
static void drkaiser_chip_writeb(const struct flashctx *flash, uint8_t val,
chipaddr addr)
{
pci_mmio_writeb(val, drkaiser_bar + (addr & DRKAISER_MEMMAP_MASK));
}
uint8_t drkaiser_chip_readb(const chipaddr addr)
static uint8_t drkaiser_chip_readb(const struct flashctx *flash,
const chipaddr addr)
{
return pci_mmio_readb(drkaiser_bar + (addr & DRKAISER_MEMMAP_MASK));
}
......@@ -60,10 +60,28 @@ static unsigned int emu_jedec_ce_c7_size = 0;
static unsigned int spi_write_256_chunksize = 256;
static int dummy_spi_send_command(unsigned int writecnt, unsigned int readcnt,
const unsigned char *writearr, unsigned char *readarr);
static int dummy_spi_send_command(struct flashctx *flash, unsigned int writecnt,
unsigned int readcnt,
const unsigned char *writearr,
unsigned char *readarr);
static int dummy_spi_write_256(struct flashctx *flash, uint8_t *buf,
unsigned int start, unsigned int len);
static void dummy_chip_writeb(const struct flashctx *flash, uint8_t val,
chipaddr addr);
static void dummy_chip_writew(const struct flashctx *flash, uint16_t val,
chipaddr addr);
static void dummy_chip_writel(const struct flashctx *flash, uint32_t val,
chipaddr addr);
static void dummy_chip_writen(const struct flashctx *flash, uint8_t *buf,
chipaddr addr, size_t len);
static uint8_t dummy_chip_readb(const struct flashctx *flash,
const chipaddr addr);
static uint16_t dummy_chip_readw(const struct flashctx *flash,
const chipaddr addr);
static uint32_t dummy_chip_readl(const struct flashctx *flash,
const chipaddr addr);
static void dummy_chip_readn(const struct flashctx *flash, uint8_t *buf,
const chipaddr addr, size_t len);
static const struct spi_programmer spi_programmer_dummyflasher = {
.type = SPI_CONTROLLER_DUMMY,
......@@ -263,22 +281,26 @@ void dummy_unmap(void *virt_addr, size_t len)
__func__, (unsigned long)len, virt_addr);
}
void dummy_chip_writeb(uint8_t val, chipaddr addr)
static void dummy_chip_writeb(const struct flashctx *flash, uint8_t val,
chipaddr addr)
{
msg_pspew("%s: addr=0x%lx, val=0x%02x\n", __func__, addr, val);
}
void dummy_chip_writew(uint16_t val, chipaddr addr)
static void dummy_chip_writew(const struct flashctx *flash, uint16_t val,
chipaddr addr)
{
msg_pspew("%s: addr=0x%lx, val=0x%04x\n", __func__, addr, val);
}
void dummy_chip_writel(uint32_t val, chipaddr addr)
static void dummy_chip_writel(const struct flashctx *flash, uint32_t val,
chipaddr addr)
{
msg_pspew("%s: addr=0x%lx, val=0x%08x\n", __func__, addr, val);
}
void dummy_chip_writen(uint8_t *buf, chipaddr addr, size_t len)
static void dummy_chip_writen(const struct flashctx *flash, uint8_t *buf,
chipaddr addr, size_t len)
{
size_t i;
msg_pspew("%s: addr=0x%lx, len=0x%08lx, writing data (hex):",
......@@ -290,25 +312,29 @@ void dummy_chip_writen(uint8_t *buf, chipaddr addr, size_t len)
}
}
uint8_t dummy_chip_readb(const chipaddr addr)
static uint8_t dummy_chip_readb(const struct flashctx *flash,
const chipaddr addr)
{
msg_pspew("%s: addr=0x%lx, returning 0xff\n", __func__, addr);
return 0xff;
}
uint16_t dummy_chip_readw(const chipaddr addr)
static uint16_t dummy_chip_readw(const struct flashctx *flash,
const chipaddr addr)
{
msg_pspew("%s: addr=0x%lx, returning 0xffff\n", __func__, addr);
return 0xffff;
}
uint32_t dummy_chip_readl(const chipaddr addr)
static uint32_t dummy_chip_readl(const struct flashctx *flash,
const chipaddr addr)
{
msg_pspew("%s: addr=0x%lx, returning 0xffffffff\n", __func__, addr);
return 0xffffffff;
}
void dummy_chip_readn(uint8_t *buf, const chipaddr addr, size_t len)
static void dummy_chip_readn(const struct flashctx *flash, uint8_t *buf,
const chipaddr addr, size_t len)
{
msg_pspew("%s: addr=0x%lx, len=0x%lx, returning array of 0xff\n",
__func__, addr, (unsigned long)len);
......@@ -317,8 +343,10 @@ void dummy_chip_readn(uint8_t *buf, const chipaddr addr, size_t len)
}
#if EMULATE_SPI_CHIP
static int emulate_spi_chip_response(unsigned int writecnt, unsigned int readcnt,
const unsigned char *writearr, unsigned char *readarr)
static int emulate_spi_chip_response(unsigned int writecnt,
unsigned int readcnt,
const unsigned char *writearr,
unsigned char *readarr)
{
unsigned int offs;
static int unsigned aai_offs;
......@@ -513,8 +541,10 @@ static int emulate_spi_chip_response(unsigned int writecnt, unsigned int readcnt
}
#endif
static int dummy_spi_send_command(unsigned int writecnt, unsigned int readcnt,
const unsigned char *writearr, unsigned char *readarr)
static int dummy_spi_send_command(struct flashctx *flash, unsigned int writecnt,
unsigned int readcnt,
const unsigned char *writearr,
unsigned char *readarr)
{
int i;
......
......@@ -44,14 +44,6 @@ int register_shutdown(int (*function) (void *data), void *data);
void *programmer_map_flash_region(const char *descr, unsigned long phys_addr,
size_t len);
void programmer_unmap_flash_region(void *virt_addr, size_t len);
void chip_writeb(uint8_t val, chipaddr addr);
void chip_writew(uint16_t val, chipaddr addr);
void chip_writel(uint32_t val, chipaddr addr);
void chip_writen(uint8_t *buf, chipaddr addr, size_t len);
uint8_t chip_readb(const chipaddr addr);
uint16_t chip_readw(const chipaddr addr);
uint32_t chip_readl(const chipaddr addr);
void chip_readn(uint8_t *buf, const chipaddr addr, size_t len);
void programmer_delay(int usecs);
#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
......@@ -212,6 +204,15 @@ struct flashctx {
extern const struct flashchip flashchips[];
void chip_writeb(const struct flashctx *flash, uint8_t val, chipaddr addr);
void chip_writew(const struct flashctx *flash, uint16_t val, chipaddr addr);
void chip_writel(const struct flashctx *flash, uint32_t val, chipaddr addr);
void chip_writen(const struct flashctx *flash, uint8_t *buf, chipaddr addr, size_t len);
uint8_t chip_readb(const struct flashctx *flash, const chipaddr addr);
uint16_t chip_readw(const struct flashctx *flash, const chipaddr addr);
uint32_t chip_readl(const struct flashctx *flash, const chipaddr addr);
void chip_readn(const struct flashctx *flash, uint8_t *buf, const chipaddr addr, size_t len);
/* print.c */
char *flashbuses_to_text(enum chipbustype bustype);
void print_supported(void);
......@@ -292,9 +293,8 @@ struct spi_command {
const unsigned char *writearr;
unsigned char *readarr;
};
int spi_send_command(unsigned int writecnt, unsigned int readcnt,
const unsigned char *writearr, unsigned char *readarr);
int spi_send_multicommand(struct spi_command *cmds);
uint32_t spi_get_valid_read_addr(void);
int spi_send_command(struct flashctx *flash, unsigned int writecnt, unsigned int readcnt, const unsigned char *writearr, unsigned char *readarr);
int spi_send_multicommand(struct flashctx *flash, struct spi_command *cmds);
uint32_t spi_get_valid_read_addr(struct flashctx *flash);
#endif /* !__FLASH_H__ */
......@@ -359,44 +359,46 @@ void programmer_unmap_flash_region(void *virt_addr, size_t len)
programmer_table[programmer].unmap_flash_region(virt_addr, len);
}
void chip_writeb(uint8_t val, chipaddr addr)
void chip_writeb(const struct flashctx *flash, uint8_t val, chipaddr addr)
{
par_programmer->chip_writeb(val, addr);
par_programmer->chip_writeb(flash, val, addr);
}
void chip_writew(uint16_t val, chipaddr addr)
void chip_writew(const struct flashctx *flash, uint16_t val, chipaddr addr)
{
par_programmer->chip_writew(val, addr);
par_programmer->chip_writew(flash, val, addr);
}
void chip_writel(uint32_t val, chipaddr addr)
void chip_writel(const struct flashctx *flash, uint32_t val, chipaddr addr)
{
par_programmer->chip_writel(val, addr);
par_programmer->chip_writel(flash, val, addr);
}
void chip_writen(uint8_t *buf, chipaddr addr, size_t len)
void chip_writen(const struct flashctx *flash, uint8_t *buf, chipaddr addr,
size_t len)
{
par_programmer->chip_writen(buf, addr, len);
par_programmer->chip_writen(flash, buf, addr, len);
}
uint8_t chip_readb(const chipaddr addr)
uint8_t chip_readb(const struct flashctx *flash, const chipaddr addr)
{
return par_programmer->chip_readb(addr);
return par_programmer->chip_readb(flash, addr);
}
uint16_t chip_readw(const chipaddr addr)
uint16_t chip_readw(const struct flashctx *flash, const chipaddr addr)
{
return par_programmer->chip_readw(addr);
return par_programmer->chip_readw(flash, addr);
}
uint32_t chip_readl(const chipaddr addr)
uint32_t chip_readl(const struct flashctx *flash, const chipaddr addr)
{
return par_programmer->chip_readl(addr);
return par_programmer->chip_readl(flash, addr);
}
void chip_readn(uint8_t *buf, chipaddr addr, size_t len)
void chip_readn(const struct flashctx *flash, uint8_t *buf, chipaddr addr,
size_t len)
{
par_programmer->chip_readn(buf, addr, len);
par_programmer->chip_readn(flash, buf, addr, len);
}
void programmer_delay(int usecs)
......@@ -412,9 +414,10 @@ void map_flash_registers(struct flashctx *flash)
flash->virtual_registers = (chipaddr)programmer_map_flash_region("flash chip registers", (0xFFFFFFFF - 0x400000 - size + 1), size);
}
int read_memmapped(struct flashctx *flash, uint8_t *buf, unsigned int start, int unsigned len)
int read_memmapped(struct flashctx *flash, uint8_t *buf, unsigned int start,
int unsigned len)
{
chip_readn(buf, flash->virtual_memory + start, len);
chip_readn(flash, buf, flash->virtual_memory + start, len);
return 0;
}
......@@ -535,7 +538,8 @@ static unsigned int count_usable_erasers(const struct flashctx *flash)
}
/* start is an offset to the base address of the flash chip */
int check_erased_range(struct flashctx *flash, unsigned int start, unsigned int len)
int check_erased_range(struct flashctx *flash, unsigned int start,
unsigned int len)
{
int ret;
uint8_t *cmpbuf = malloc(len);
......@@ -558,8 +562,8 @@ int check_erased_range(struct flashctx *flash, unsigned int start, unsigned int
* @message string to print in the "FAILED" message
* @return 0 for success, -1 for failure
*/
int verify_range(struct flashctx *flash, uint8_t *cmpbuf, unsigned int start, unsigned int len,
const char *message)
int verify_range(struct flashctx *flash, uint8_t *cmpbuf, unsigned int start,
unsigned int len, const char *message)
{
unsigned int i;
uint8_t *readbuf = malloc(len);
......@@ -1537,7 +1541,8 @@ int selfcheck(void)
/* Check that virtual_memory in struct flashctx is placed directly
* after the members copied from struct flashchip.
*/
if (sizeof(struct flashchip) != offsetof(struct flashctx, virtual_memory)) {
if (sizeof(struct flashchip) !=
offsetof(struct flashctx, virtual_memory)) {
msg_gerr("struct flashctx broken!\n");
ret = 1;
}
......@@ -1618,7 +1623,8 @@ void check_chip_supported(const struct flashctx *flash)
/* FIXME: This function signature needs to be improved once doit() has a better
* function signature.
*/
int chip_safety_check(struct flashctx *flash, int force, int read_it, int write_it, int erase_it, int verify_it)
int chip_safety_check(struct flashctx *flash, int force, int read_it,
int write_it, int erase_it, int verify_it)
{
if (!programmer_may_write && (write_it || erase_it)) {
msg_perr("Write/erase is not working yet on your programmer in "
......@@ -1679,7 +1685,8 @@ int chip_safety_check(struct flashctx *flash, int force, int read_it, int write_
* but right now it allows us to split off the CLI code.
* Besides that, the function itself is a textbook example of abysmal code flow.
*/
int doit(struct flashctx *flash, int force, const char *filename, int read_it, int write_it, int erase_it, int verify_it)
int doit(struct flashctx *flash, int force, const char *filename, int read_it,
int write_it, int erase_it, int verify_it)
{
uint8_t *oldcontents;
uint8_t *newcontents;
......
......@@ -144,8 +144,10 @@ static int get_buf(struct ftdi_context *ftdic, const unsigned char *buf,
return 0;
}
static int ft2232_spi_send_command(unsigned int writecnt, unsigned int readcnt,
const unsigned char *writearr, unsigned char *readarr);
static int ft2232_spi_send_command(struct flashctx *flash,
unsigned int writecnt, unsigned int readcnt,
const unsigned char *writearr,
unsigned char *readarr);
static const struct spi_programmer spi_programmer_ft2232 = {
.type = SPI_CONTROLLER_FT2232,
......@@ -342,8 +344,10 @@ ftdi_err:
}
/* Returns 0 upon success, a negative number upon errors. */
static int ft2232_spi_send_command(unsigned int writecnt, unsigned int readcnt,
const unsigned char *writearr, unsigned char *readarr)
static int ft2232_spi_send_command(struct flashctx *flash,
unsigned int writecnt, unsigned int readcnt,
const unsigned char *writearr,
unsigned char *readarr)
{
struct ftdi_context *ftdic = &ftdic_context;
static unsigned char *buf = NULL;
......
......@@ -61,6 +61,10 @@ const struct pcidev_status gfx_nvidia[] = {
{},
};
static void gfxnvidia_chip_writeb(const struct flashctx *flash, uint8_t val,
chipaddr addr);
static uint8_t gfxnvidia_chip_readb(const struct flashctx *flash,
const chipaddr addr);
static const struct par_programmer par_programmer_gfxnvidia = {
.chip_readb = gfxnvidia_chip_readb,
.chip_readw = fallback_chip_readw,
......@@ -112,12 +116,14 @@ int gfxnvidia_init(void)
return 0;
}
void gfxnvidia_chip_writeb(uint8_t val, chipaddr addr)
static void gfxnvidia_chip_writeb(const struct flashctx *flash, uint8_t val,
chipaddr addr)
{
pci_mmio_writeb(val, nvidia_bar + (addr & GFXNVIDIA_MEMMAP_MASK));
}
uint8_t gfxnvidia_chip_readb(const chipaddr addr)
static uint8_t gfxnvidia_chip_readb(const struct flashctx *flash,
const chipaddr addr)
{
return pci_mmio_readb(nvidia_bar + (addr & GFXNVIDIA_MEMMAP_MASK));
}
......@@ -228,7 +228,7 @@ static int find_opcode(OPCODES *op, uint8_t opcode);
static int find_preop(OPCODES *op, uint8_t preop);
static int generate_opcodes(OPCODES * op);
static int program_opcodes(OPCODES *op, int enable_undo);
static int run_opcode(OPCODE op, uint32_t offset,
static int run_opcode(const struct flashctx *flash, OPCODE op, uint32_t offset,
uint8_t datalength, uint8_t * data);
/* for pairing opcodes with their required preop */
......@@ -638,7 +638,7 @@ static void ich_set_bbar(uint32_t min_addr)
* Note that using len > spi_programmer->max_data_read will return garbage or
* may even crash.
*/
static void ich_read_data(uint8_t *data, int len, int reg0_off)
static void ich_read_data(uint8_t *data, int len, int reg0_off)
{
int i;
uint32_t temp32 = 0;
......@@ -956,7 +956,7 @@ static int ich9_run_opcode(OPCODE op, uint32_t offset,
return 0;
}
static int run_opcode(OPCODE op, uint32_t offset,
static int run_opcode(const struct flashctx *flash, OPCODE op, uint32_t offset,
uint8_t datalength, uint8_t * data)
{
/* max_data_read == max_data_write for all Intel/VIA SPI masters */
......@@ -983,8 +983,10 @@ static int run_opcode(OPCODE op, uint32_t offset,
}
}
static int ich_spi_send_command(unsigned int writecnt, unsigned int readcnt,
const unsigned char *writearr, unsigned char *readarr)
static int ich_spi_send_command(struct flashctx *flash, unsigned int writecnt,
unsigned int readcnt,
const unsigned char *writearr,
unsigned char *readarr)
{
int result;
int opcode_index = -1;
......@@ -1076,7 +1078,7 @@ static int ich_spi_send_command(unsigned int writecnt, unsigned int readcnt,
count = readcnt;
}
result = run_opcode(*opcode, addr, count, data);
result = run_opcode(flash, *opcode, addr, count, data);
if (result) {
msg_pdbg("Running OPCODE 0x%02x failed ", opcode->opcode);
if ((opcode->spi_type == SPI_OPCODE_TYPE_WRITE_WITH_ADDRESS) ||
......@@ -1175,7 +1177,7 @@ static int ich_hwseq_wait_for_cycle_complete(unsigned int timeout,
return 0;
}
int ich_hwseq_probe(struct flashctx *flash)
static int ich_hwseq_probe(struct flashctx *flash)
{
uint32_t total_size, boundary;
uint32_t erase_size_low, size_low, erase_size_high, size_high;
......@@ -1228,9 +1230,8 @@ int ich_hwseq_probe(struct flashctx *flash)
return 1;
}
int ich_hwseq_block_erase(struct flashctx *flash,
unsigned int addr,
unsigned int len)
static int ich_hwseq_block_erase(struct flashctx *flash, unsigned int addr,
unsigned int len)
{
uint32_t erase_block;
uint16_t hsfc;
......@@ -1278,8 +1279,8 @@ int ich_hwseq_block_erase(struct flashctx *flash,
return 0;
}
int ich_hwseq_read(struct flashctx *flash, uint8_t *buf, unsigned int addr,
unsigned int len)
static int ich_hwseq_read(struct flashctx *flash, uint8_t *buf,
unsigned int addr, unsigned int len)
{
uint16_t hsfc;
uint16_t timeout = 100 * 60;
......@@ -1316,8 +1317,8 @@ int ich_hwseq_read(struct flashctx *flash, uint8_t *buf, unsigned int addr,
return 0;
}
int ich_hwseq_write(struct flashctx *flash, uint8_t *buf, unsigned int addr,
unsigned int len)
static int ich_hwseq_write(struct flashctx *flash, uint8_t *buf,
unsigned int addr, unsigned int len)
{
uint16_t hsfc;
uint16_t timeout = 100 * 60;
......@@ -1355,7 +1356,8 @@ int ich_hwseq_write(struct flashctx *flash, uint8_t *buf, unsigned int addr,
return 0;
}
static int ich_spi_send_multicommand(struct spi_command *cmds)
static int ich_spi_send_multicommand(struct flashctx *flash,
struct spi_command *cmds)
{
int ret = 0;
int i;
......@@ -1405,7 +1407,7 @@ static int ich_spi_send_multicommand(struct spi_command *cmds)
* preoppos matched, this is a normal opcode.
*/
}
ret = ich_spi_send_command(cmds->writecnt, cmds->readcnt,
ret = ich_spi_send_command(flash, cmds->writecnt, cmds->readcnt,
cmds->writearr, cmds->readarr);
/* Reset the type of all opcodes to non-atomic. */
for (i = 0; i < 8; i++)
......
......@@ -127,6 +127,20 @@ int register_superio(struct superio s)
int is_laptop = 0;
int laptop_ok = 0;
static void internal_chip_writeb(const struct flashctx *flash, uint8_t val,
chipaddr addr);
static void internal_chip_writew(const struct flashctx *flash, uint16_t val,
chipaddr addr);
static void internal_chip_writel(const struct flashctx *flash, uint32_t val,
chipaddr addr);
static uint8_t internal_chip_readb(const struct flashctx *flash,
const chipaddr addr);
static uint16_t internal_chip_readw(const struct flashctx *flash,
const chipaddr addr);
static uint32_t internal_chip_readl(const struct flashctx *flash,
const chipaddr addr);
static void internal_chip_readn(const struct flashctx *flash, uint8_t *buf,
const chipaddr addr, size_t len);
static const struct par_programmer par_programmer_internal = {
.chip_readb = internal_chip_readb,
.chip_readw = internal_chip_readw,
......@@ -324,37 +338,44 @@ int internal_init(void)
}
#endif
void internal_chip_writeb(uint8_t val, chipaddr addr)
static void internal_chip_writeb(const struct flashctx *flash, uint8_t val,
chipaddr addr)
{
mmio_writeb(val, (void *) addr);
}
void internal_chip_writew(uint16_t val, chipaddr addr)
static void internal_chip_writew(const struct flashctx *flash, uint16_t val,
chipaddr addr)
{
mmio_writew(val, (void *) addr);
}
void internal_chip_writel(uint32_t val, chipaddr addr)
static void internal_chip_writel(const struct flashctx *flash, uint32_t val,
chipaddr addr)
{
mmio_writel(val, (void *) addr);
}
uint8_t internal_chip_readb(const chipaddr addr)
static uint8_t internal_chip_readb(const struct flashctx *flash,
const chipaddr addr)
{
return mmio_readb((void *) addr);
}
uint16_t internal_chip_readw(const chipaddr addr)
static uint16_t internal_chip_readw(const struct flashctx *flash,
const chipaddr addr)
{
return mmio_readw((void *) addr);
}
uint32_t internal_chip_readl(const chipaddr addr)
static uint32_t internal_chip_readl(const struct flashctx *flash,
const chipaddr addr)
{
return mmio_readl((void *) addr);
}
void internal_chip_readn(uint8_t *buf, const chipaddr addr, size_t len)
static void internal_chip_readn(const struct flashctx *flash, uint8_t *buf,
const chipaddr addr, size_t len)
{
memcpy(buf, (void *)addr, len);
return;
......
......@@ -270,8 +270,10 @@ static int it85xx_spi_common_init(struct superio s)
return 0;
}
static int it85xx_spi_send_command(unsigned int writecnt, unsigned int readcnt,
const unsigned char *writearr, unsigned char *readarr);
static int it85xx_spi_send_command(struct flashctx *flash,
unsigned int writecnt, unsigned int readcnt,
const unsigned char *writearr,
unsigned char *readarr);
static const struct spi_programmer spi_programmer_it85xx = {
.type = SPI_CONTROLLER_IT85XX,
......@@ -320,8 +322,10 @@ int it85xx_spi_init(struct superio s)
* 3. read date from LPC/FWH address 0xffff_fdxxh (drive CE# low and get
* data from MISO)
*/
static int it85xx_spi_send_command(unsigned int writecnt, unsigned int readcnt,
const unsigned char *writearr, unsigned char *readarr)
static int it85xx_spi_send_command(struct flashctx *flash,
unsigned int writecnt, unsigned int readcnt,
const unsigned char *writearr,
unsigned char *readarr)
{
int i;
......
......@@ -103,8 +103,10 @@ void probe_superio_ite(void)
return;
}
static int it8716f_spi_send_command(unsigned int writecnt, unsigned int readcnt,
const unsigned char *writearr, unsigned char *readarr);
static int it8716f_spi_send_command(struct flashctx *flash,
unsigned int writecnt, unsigned int readcnt,
const unsigned char *writearr,
unsigned char *readarr);
static int it8716f_spi_chip_read(struct flashctx *flash, uint8_t *buf,
unsigned int start, unsigned int len);
static int it8716f_spi_chip_write_256(struct flashctx *flash, uint8_t *buf,
......@@ -247,8 +249,10 @@ int init_superio_ite(void)
* commands with the address in inverse wire order. That's why the register
* ordering in case 4 and 5 may seem strange.
*/
static int it8716f_spi_send_command(unsigned int writecnt, unsigned int readcnt,
const unsigned char *writearr, unsigned char *readarr)
static int it8716f_spi_send_command(struct flashctx *flash,
unsigned int writecnt, unsigned int readcnt,
const unsigned char *writearr,
unsigned char *readarr)
{
uint8_t busy, writeenc;
int i;
......@@ -319,19 +323,19 @@ static int it8716f_spi_page_program(struct flashctx *flash, uint8_t *buf,
int result;
chipaddr bios = flash->virtual_memory;
result = spi_write_enable();
result = spi_write_enable(flash);
if (result)
return result;
/* FIXME: The command below seems to be redundant or wrong. */
OUTB(0x06, it8716f_flashport + 1);
OUTB(((2 + (fast_spi ? 1 : 0)) << 4), it8716f_flashport);
for (i = 0; i < flash->page_size; i++)
chip_writeb(buf[i], bios + start + i);
chip_writeb(flash, buf[i], bios + start + i);
OUTB(0, it8716f_flashport);
/* Wait until the Write-In-Progress bit is cleared.
* This usually takes 1-10 ms, so wait in 1 ms steps.
*/
while (spi_read_status_register() & JEDEC_RDSR_BIT_WIP)
while (spi_read_status_register(flash) & JEDEC_RDSR_BIT_WIP)
programmer_delay(1000);
return 0;
}
......
......@@ -37,17 +37,18 @@ uint8_t oddparity(uint8_t val)
return (val ^ (val >> 1)) & 0x1;
}
static void toggle_ready_jedec_common(chipaddr dst, int delay)
static void toggle_ready_jedec_common(const struct flashctx *flash,
chipaddr dst, int delay)
{
unsigned int i = 0;
uint8_t tmp1, tmp2;
tmp1 = chip_readb(dst) & 0x40;
tmp1 = chip_readb(flash, dst) & 0x40;
while (i++ < 0xFFFFFFF) {
if (delay)
programmer_delay(delay);
tmp2 = chip_readb(dst) & 0x40;
tmp2 = chip_readb(flash, dst) & 0x40;
if (tmp1 == tmp2) {
break;
}
......@@ -57,9 +58,9 @@ static void toggle_ready_jedec_common(chipaddr dst, int delay)
msg_cdbg("%s: excessive loops, i=0x%x\n", __func__, i);
}
void toggle_ready_jedec(chipaddr dst)
void toggle_ready_jedec(const struct flashctx *flash, chipaddr dst)
{
toggle_ready_jedec_common(dst, 0);
toggle_ready_jedec_common(flash, dst, 0);
}
/* Some chips require a minimum delay between toggle bit reads.
......@@ -69,12 +70,13 @@ void toggle_ready_jedec(chipaddr dst)
* Given that erase is slow on all chips, it is recommended to use
* toggle_ready_jedec_slow in erase functions.
*/
static void toggle_ready_jedec_slow(chipaddr dst)
static void toggle_ready_jedec_slow(const struct flashctx *flash, chipaddr dst)
{
toggle_ready_jedec_common(dst, 8 * 1000);
toggle_ready_jedec_common(flash, dst, 8 * 1000);
}
void data_polling_jedec(chipaddr dst, uint8_t data)
void data_polling_jedec(const struct flashctx *flash, chipaddr dst,
uint8_t data)
{
unsigned int i = 0;
uint8_t tmp;
......@@ -82,7 +84,7 @@ void data_polling_jedec(chipaddr dst, uint8_t data)
data &= 0x80;
while (i++ < 0xFFFFFFF) {
tmp = chip_readb(dst) & 0x80;
tmp = chip_readb(flash, dst) & 0x80;
if (tmp == data) {
break;
}
......@@ -110,12 +112,13 @@ static unsigned int getaddrmask(struct flashctx *flash)
}
}
static void start_program_jedec_common(struct flashctx *flash, unsigned int mask)
static void start_program_jedec_common(struct flashctx *flash,
unsigned int mask)
{
chipaddr bios = flash->virtual_memory;
chip_writeb(0xAA, bios + (0x5555 & mask));
chip_writeb(0x55, bios + (0x2AAA & mask));
chip_writeb(0xA0, bios + (0x5555 & mask));
chip_writeb(flash, 0xAA, bios + (0x5555 & mask));
chip_writeb(flash, 0x55, bios + (0x2AAA & mask));
chip_writeb(flash, 0xA0, bios + (0x5555 & mask));
}
static int probe_jedec_common(struct flashctx *flash, unsigned int mask)
......@@ -150,57 +153,57 @@ static int probe_jedec_common(struct flashctx *flash, unsigned int mask)
/* Reset chip to a clean slate */
if ((flash->feature_bits & FEATURE_RESET_MASK) == FEATURE_LONG_RESET)
{
chip_writeb(0xAA, bios + (0x5555 & mask));
chip_writeb(flash, 0xAA, bios + (0x5555 & mask));
if (probe_timing_exit)
programmer_delay(10);
chip_writeb(0x55, bios + (0x2AAA & mask));
chip_writeb(flash, 0x55, bios + (0x2AAA & mask));
if (probe_timing_exit)
programmer_delay(10);
}
chip_writeb(0xF0, bios + (0x5555 & mask));
chip_writeb(flash, 0xF0, bios + (0x5555 & mask));
if (probe_timing_exit)
programmer_delay(probe_timing_exit);
/* Issue JEDEC Product ID Entry command */
chip_writeb(0xAA, bios + (0x5555 & mask));
chip_writeb(flash, 0xAA, bios + (0x5555 & mask));
if (probe_timing_enter)
programmer_delay(10);
chip_writeb(0x55, bios + (0x2AAA & mask));
chip_writeb(flash, 0x55, bios + (0x2AAA & mask));
if (probe_timing_enter)
programmer_delay(10);
chip_writeb(0x90, bios + (0x5555 & mask));
chip_writeb(flash, 0x90, bios + (0x5555 & mask));
if (probe_timing_enter)
programmer_delay(probe_timing_enter);
/* Read product ID */
id1 = chip_readb(bios);
id2 = chip_readb(bios + 0x01);
id1 = chip_readb(flash, bios);
id2 = chip_readb(flash, bios + 0x01);
largeid1 = id1;
largeid2 = id2;
/* Check if it is a continuation ID, this should be a while loop. */
if (id1 == 0x7F) {
largeid1 <<= 8;
id1 = chip_readb(bios + 0x100);
id1 = chip_readb(flash, bios + 0x100);
largeid1 |= id1;
}
if (id2 == 0x7F) {
largeid2 <<= 8;
id2 = chip_readb(bios + 0x101);
id2 = chip_readb(flash, bios + 0x101);
largeid2 |= id2;
}
/* Issue JEDEC Product ID Exit command */
if ((flash->feature_bits & FEATURE_RESET_MASK) == FEATURE_LONG_RESET)
{
chip_writeb(0xAA, bios + (0x5555 & mask));
chip_writeb(flash, 0xAA, bios + (0x5555 & mask));
if (probe_timing_exit)
programmer_delay(10);
chip_writeb(0x55, bios + (0x2AAA & mask));
chip_writeb(flash, 0x55, bios + (0x2AAA & mask));
if (probe_timing_exit)
programmer_delay(10);
}
chip_writeb(0xF0, bios + (0x5555 & mask));
chip_writeb(flash, 0xF0, bios + (0x5555 & mask));
if (probe_timing_exit)
programmer_delay(probe_timing_exit);
......@@ -209,17 +212,17 @@ static int probe_jedec_common(struct flashctx *flash, unsigned int mask)
msg_cdbg(", id1 parity violation");
/* Read the product ID location again. We should now see normal flash contents. */
flashcontent1 = chip_readb(bios);
flashcontent2 = chip_readb(bios + 0x01);
flashcontent1 = chip_readb(flash, bios);
flashcontent2 = chip_readb(flash, bios + 0x01);
/* Check if it is a continuation ID, this should be a while loop. */
if (flashcontent1 == 0x7F) {
flashcontent1 <<= 8;
flashcontent1 |= chip_readb(bios + 0x100);
flashcontent1 |= chip_readb(flash, bios + 0x100);
}
if (flashcontent2 == 0x7F) {
flashcontent2 <<= 8;
flashcontent2 |= chip_readb(bios + 0x101);
flashcontent2 |= chip_readb(flash, bios + 0x101);
}
if (largeid1 == flashcontent1)
......@@ -238,7 +241,7 @@ static int probe_jedec_common(struct flashctx *flash, unsigned int mask)
}
static int erase_sector_jedec_common(struct flashctx *flash, unsigned int page,
unsigned int pagesize, unsigned int mask)
unsigned int pagesize, unsigned int mask)
{
chipaddr bios = flash->virtual_memory;
int delay_us = 0;
......@@ -246,29 +249,29 @@ static int erase_sector_jedec_common(struct flashctx *flash, unsigned int page,
delay_us = 10;
/* Issue the Sector Erase command */
chip_writeb(0xAA, bios + (0x5555 & mask));
chip_writeb(flash, 0xAA, bios + (0x5555 & mask));
programmer_delay(delay_us);
chip_writeb(0x55, bios + (0x2AAA & mask));
chip_writeb(flash, 0x55, bios + (0x2AAA & mask));
programmer_delay(delay_us);
chip_writeb(0x80, bios + (0x5555 & mask));
chip_writeb(flash, 0x80, bios + (0x5555 & mask));
programmer_delay(delay_us);
chip_writeb(0xAA, bios + (0x5555 & mask));
chip_writeb(flash, 0xAA, bios + (0x5555 & mask));
programmer_delay(delay_us);
chip_writeb(0x55, bios + (0x2AAA & mask));
chip_writeb(flash, 0x55, bios + (0x2AAA & mask));
programmer_delay(delay_us);
chip_writeb(0x30, bios + page);
chip_writeb(flash, 0x30, bios + page);
programmer_delay(delay_us);
/* wait for Toggle bit ready */
toggle_ready_jedec_slow(bios);
toggle_ready_jedec_slow(flash, bios);
/* FIXME: Check the status register for errors. */
return 0;
}
static int erase_block_jedec_common(struct flashctx *flash, unsigned int block,
unsigned int blocksize, unsigned int mask)
unsigned int blocksize, unsigned int mask)
{
chipaddr bios = flash->virtual_memory;
int delay_us = 0;
......@@ -276,22 +279,22 @@ static int erase_block_jedec_common(struct flashctx *flash, unsigned int block,
delay_us = 10;
/* Issue the Sector Erase command */
chip_writeb(0xAA, bios + (0x5555 & mask));
chip_writeb(flash, 0xAA, bios + (0x5555 & mask));
programmer_delay(delay_us);
chip_writeb(0x55, bios + (0x2AAA & mask));
chip_writeb(flash, 0x55, bios + (0x2AAA & mask));
programmer_delay(delay_us);
chip_writeb(0x80, bios + (0x5555 & mask));
chip_writeb(flash, 0x80, bios + (0x5555 & mask));
programmer_delay(delay_us);
chip_writeb(0xAA, bios + (0x5555 & mask));
chip_writeb(flash, 0xAA, bios + (0x5555 & mask));
programmer_delay(delay_us);
chip_writeb(0x55, bios + (0x2AAA & mask));
chip_writeb(flash, 0x55, bios + (0x2AAA & mask));
programmer_delay(delay_us);
chip_writeb(0x50, bios + block);
chip_writeb(flash, 0x50, bios + block);
programmer_delay(delay_us);
/* wait for Toggle bit ready */
toggle_ready_jedec_slow(bios);
toggle_ready_jedec_slow(flash, bios);
/* FIXME: Check the status register for errors. */
return 0;
......@@ -305,28 +308,28 @@ static int erase_chip_jedec_common(struct flashctx *flash, unsigned int mask)
delay_us = 10;
/* Issue the JEDEC Chip Erase command */
chip_writeb(0xAA, bios + (0x5555 & mask));
chip_writeb(flash, 0xAA, bios + (0x5555 & mask));
programmer_delay(delay_us);
chip_writeb(0x55, bios + (0x2AAA & mask));
chip_writeb(flash, 0x55, bios + (0x2AAA & mask));
programmer_delay(delay_us);
chip_writeb(0x80, bios + (0x5555 & mask));
chip_writeb(flash, 0x80, bios + (0x5555 & mask));
programmer_delay(delay_us);
chip_writeb(0xAA, bios + (0x5555 & mask));
chip_writeb(flash, 0xAA, bios + (0x5555 & mask));
programmer_delay(delay_us);
chip_writeb(0x55, bios + (0x2AAA & mask));
chip_writeb(flash, 0x55, bios + (0x2AAA & mask));
programmer_delay(delay_us);
chip_writeb(0x10, bios + (0x5555 & mask));
chip_writeb(flash, 0x10, bios + (0x5555 & mask));
programmer_delay(delay_us);
toggle_ready_jedec_slow(bios);
toggle_ready_jedec_slow(flash, bios);
/* FIXME: Check the status register for errors. */
return 0;
}
static int write_byte_program_jedec_common(struct flashctx *flash, uint8_t *src,
chipaddr dst, unsigned int mask)
chipaddr dst, unsigned int mask)
{
int tried = 0, failed = 0;
chipaddr bios = flash->virtual_memory;
......@@ -341,10 +344,10 @@ retry:
start_program_jedec_common(flash, mask);
/* transfer data from source to destination */
chip_writeb(*src, dst);
toggle_ready_jedec(bios);
chip_writeb(flash, *src, dst);
toggle_ready_jedec(flash, bios);
if (chip_readb(dst) != *src && tried++ < MAX_REFLASH_TRIES) {
if (chip_readb(flash, dst) != *src && tried++ < MAX_REFLASH_TRIES) {
goto retry;
}
......@@ -355,7 +358,8 @@ retry:
}
/* chunksize is 1 */
int write_jedec_1(struct flashctx *flash, uint8_t *src, unsigned int start, unsigned int len)
int write_jedec_1(struct flashctx *flash, uint8_t *src, unsigned int start,
unsigned int len)
{
int i, failed = 0;
chipaddr dst = flash->virtual_memory + start;
......@@ -376,7 +380,8 @@ int write_jedec_1(struct flashctx *flash, uint8_t *src, unsigned int start, unsi
return failed;
}
int write_page_write_jedec_common(struct flashctx *flash, uint8_t *src, unsigned int start, unsigned int page_size)
int write_page_write_jedec_common(struct flashctx *flash, uint8_t *src,
unsigned int start, unsigned int page_size)
{
int i, tried = 0, failed;
uint8_t *s = src;
......@@ -395,12 +400,12 @@ retry:
for (i = 0; i < page_size; i++) {
/* If the data is 0xFF, don't program it */
if (*src != 0xFF)
chip_writeb(*src, dst);
chip_writeb(flash, *src, dst);
dst++;
src++;
}
toggle_ready_jedec(dst - 1);
toggle_ready_jedec(flash, dst - 1);
dst = d;
src = s;
......@@ -424,7 +429,8 @@ retry:
* This function is a slightly modified copy of spi_write_chunked.
* Each page is written separately in chunks with a maximum size of chunksize.
*/
int write_jedec(struct flashctx *flash, uint8_t *buf, unsigned int start, int unsigned len)
int write_jedec(struct flashctx *flash, uint8_t *buf, unsigned int start,
int unsigned len)
{
unsigned int i, starthere, lenhere;
/* FIXME: page_size is the wrong variable. We need max_writechunk_size
......@@ -480,7 +486,8 @@ int probe_jedec(struct flashctx *flash)
return probe_jedec_common(flash, mask);
}
int erase_sector_jedec(struct flashctx *flash, unsigned int page, unsigned int size)
int erase_sector_jedec(struct flashctx *flash, unsigned int page,
unsigned int size)
{
unsigned int mask;
......@@ -488,7 +495,8 @@ int erase_sector_jedec(struct flashctx *flash, unsigned int page, unsigned int s
return erase_sector_jedec_common(flash, page, size, mask);
}
int erase_block_jedec(struct flashctx *flash, unsigned int page, unsigned int size)
int erase_block_jedec(struct flashctx *flash, unsigned int page,
unsigned int size)
{
unsigned int mask;
......
......@@ -34,8 +34,10 @@
static int fd = -1;
static int linux_spi_shutdown(void *data);
static int linux_spi_send_command(unsigned int writecnt, unsigned int readcnt,
const unsigned char *txbuf, unsigned char *rxbuf);
static int linux_spi_send_command(struct flashctx *flash, unsigned int writecnt,
unsigned int readcnt,
const unsigned char *txbuf,
unsigned char *rxbuf);
static int linux_spi_read(struct flashctx *flash, uint8_t *buf,
unsigned int start, unsigned int len);
static int linux_spi_write_256(struct flashctx *flash, uint8_t *buf,
......@@ -107,8 +109,10 @@ static int linux_spi_shutdown(void *data)
return 0;
}
static int linux_spi_send_command(unsigned int writecnt, unsigned int readcnt,
const unsigned char *txbuf, unsigned char *rxbuf)
static int linux_spi_send_command(struct flashctx *flash, unsigned int writecnt,
unsigned int readcnt,
const unsigned char *txbuf,
unsigned char *rxbuf)
{
struct spi_ioc_transfer msg[2] = {
{
......@@ -134,11 +138,13 @@ static int linux_spi_send_command(unsigned int writecnt, unsigned int readcnt,
static int linux_spi_read(struct flashctx *flash, uint8_t *buf,
unsigned int start, unsigned int len)
{
return spi_read_chunked(flash, buf, start, len, (unsigned)getpagesize());
return spi_read_chunked(flash, buf, start, len,
(unsigned int)getpagesize());
}
static int linux_spi_write_256(struct flashctx *flash, uint8_t *buf,
unsigned int start, unsigned int len)
{
return spi_write_chunked(flash, buf, start, len, ((unsigned)getpagesize()) - 4);
return spi_write_chunked(flash, buf, start, len,
((unsigned int)getpagesize()) - 4);
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment