mirror of https://gitee.com/openkylin/qemu.git
Parallel flash bugfixes:
- always need to register flash area back to IO_MEM_ROMD at reset time - disabled buffered write as it's not actually supported - don't check flash time at registration time git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2678 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
parent
a496775f87
commit
95d1f3edd5
|
@ -208,19 +208,23 @@ static void pflash_write (pflash_t *pfl, target_ulong offset, uint32_t value,
|
||||||
|
|
||||||
/* WARNING: when the memory area is in ROMD mode, the offset is a
|
/* WARNING: when the memory area is in ROMD mode, the offset is a
|
||||||
ram offset, not a physical address */
|
ram offset, not a physical address */
|
||||||
|
cmd = value;
|
||||||
|
if (pfl->cmd != 0xA0 && cmd == 0xF0) {
|
||||||
|
#if 0
|
||||||
|
DPRINTF("%s: flash reset asked (%02x %02x)\n",
|
||||||
|
__func__, pfl->cmd, cmd);
|
||||||
|
#endif
|
||||||
|
goto reset_flash;
|
||||||
|
}
|
||||||
|
DPRINTF("%s: offset " TARGET_FMT_lx " %08x %d %d\n", __func__,
|
||||||
|
offset, value, width, pfl->wcycle);
|
||||||
if (pfl->wcycle == 0)
|
if (pfl->wcycle == 0)
|
||||||
offset -= (target_ulong)(long)pfl->storage;
|
offset -= (target_ulong)(long)pfl->storage;
|
||||||
else
|
else
|
||||||
offset -= pfl->base;
|
offset -= pfl->base;
|
||||||
|
|
||||||
cmd = value;
|
|
||||||
DPRINTF("%s: offset " TARGET_FMT_lx " %08x %d\n", __func__,
|
DPRINTF("%s: offset " TARGET_FMT_lx " %08x %d\n", __func__,
|
||||||
offset, value, width);
|
offset, value, width);
|
||||||
if (pfl->cmd != 0xA0 && cmd == 0xF0) {
|
|
||||||
DPRINTF("%s: flash reset asked (%02x %02x)\n",
|
|
||||||
__func__, pfl->cmd, cmd);
|
|
||||||
goto reset_flash;
|
|
||||||
}
|
|
||||||
/* Set the device in I/O access mode */
|
/* Set the device in I/O access mode */
|
||||||
cpu_register_physical_memory(pfl->base, pfl->total_len, pfl->fl_mem);
|
cpu_register_physical_memory(pfl->base, pfl->total_len, pfl->fl_mem);
|
||||||
boff = offset & (pfl->sector_len - 1);
|
boff = offset & (pfl->sector_len - 1);
|
||||||
|
@ -416,10 +420,8 @@ static void pflash_write (pflash_t *pfl, target_ulong offset, uint32_t value,
|
||||||
|
|
||||||
/* Reset flash */
|
/* Reset flash */
|
||||||
reset_flash:
|
reset_flash:
|
||||||
if (pfl->wcycle != 0) {
|
cpu_register_physical_memory(pfl->base, pfl->total_len,
|
||||||
cpu_register_physical_memory(pfl->base, pfl->total_len,
|
pfl->off | IO_MEM_ROMD | pfl->fl_mem);
|
||||||
pfl->off | IO_MEM_ROMD | pfl->fl_mem);
|
|
||||||
}
|
|
||||||
pfl->bypass = 0;
|
pfl->bypass = 0;
|
||||||
pfl->wcycle = 0;
|
pfl->wcycle = 0;
|
||||||
pfl->cmd = 0;
|
pfl->cmd = 0;
|
||||||
|
@ -530,14 +532,17 @@ pflash_t *pflash_register (target_ulong base, ram_addr_t off,
|
||||||
|
|
||||||
total_len = sector_len * nb_blocs;
|
total_len = sector_len * nb_blocs;
|
||||||
/* XXX: to be fixed */
|
/* XXX: to be fixed */
|
||||||
|
#if 0
|
||||||
if (total_len != (8 * 1024 * 1024) && total_len != (16 * 1024 * 1024) &&
|
if (total_len != (8 * 1024 * 1024) && total_len != (16 * 1024 * 1024) &&
|
||||||
total_len != (32 * 1024 * 1024) && total_len != (64 * 1024 * 1024))
|
total_len != (32 * 1024 * 1024) && total_len != (64 * 1024 * 1024))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
#endif
|
||||||
pfl = qemu_mallocz(sizeof(pflash_t));
|
pfl = qemu_mallocz(sizeof(pflash_t));
|
||||||
if (pfl == NULL)
|
if (pfl == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
pfl->storage = phys_ram_base + off;
|
pfl->storage = phys_ram_base + off;
|
||||||
pfl->fl_mem = cpu_register_io_memory(0, pflash_read_ops, pflash_write_ops, pfl);
|
pfl->fl_mem = cpu_register_io_memory(0, pflash_read_ops, pflash_write_ops,
|
||||||
|
pfl);
|
||||||
pfl->off = off;
|
pfl->off = off;
|
||||||
cpu_register_physical_memory(base, total_len,
|
cpu_register_physical_memory(base, total_len,
|
||||||
off | pfl->fl_mem | IO_MEM_ROMD);
|
off | pfl->fl_mem | IO_MEM_ROMD);
|
||||||
|
@ -613,7 +618,9 @@ pflash_t *pflash_register (target_ulong base, ram_addr_t off,
|
||||||
pfl->cfi_table[0x28] = 0x02;
|
pfl->cfi_table[0x28] = 0x02;
|
||||||
pfl->cfi_table[0x29] = 0x00;
|
pfl->cfi_table[0x29] = 0x00;
|
||||||
/* Max number of bytes in multi-bytes write */
|
/* Max number of bytes in multi-bytes write */
|
||||||
pfl->cfi_table[0x2A] = 0x05;
|
/* XXX: disable buffered write as it's not supported */
|
||||||
|
// pfl->cfi_table[0x2A] = 0x05;
|
||||||
|
pfl->cfi_table[0x2A] = 0x00;
|
||||||
pfl->cfi_table[0x2B] = 0x00;
|
pfl->cfi_table[0x2B] = 0x00;
|
||||||
/* Number of erase block regions (uniform) */
|
/* Number of erase block regions (uniform) */
|
||||||
pfl->cfi_table[0x2C] = 0x01;
|
pfl->cfi_table[0x2C] = 0x01;
|
||||||
|
|
Loading…
Reference in New Issue