From: Marcin Krzeminski <marcin.krzemin...@nokia.com> Signed-off-by: Marcin Krzeminski <marcin.krzemin...@nokia.com> --- hw/block/m25p80.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+)
diff --git a/hw/block/m25p80.c b/hw/block/m25p80.c index 6d5d90d..f0f637e 100644 --- a/hw/block/m25p80.c +++ b/hw/block/m25p80.c @@ -47,6 +47,9 @@ */ #define WR_1 0x100 +/* 16 MiB max in 3 byte address mode */ +#define MAX_3BYTES_SIZE 0x1000000 + typedef struct FlashPartInfo { const char *part_name; /* jedec code. (jedec >> 16) & 0xff is the 1st byte, >> 8 the 2nd etc */ @@ -240,6 +243,9 @@ typedef enum { EN_4BYTE_ADDR = 0xB7, EX_4BYTE_ADDR = 0xE9, + EXTEND_ADDR_READ = 0xC8, + EXTEND_ADDR_WRITE = 0xC5, + RESET_ENABLE = 0x66, RESET_MEMORY = 0x99, @@ -274,6 +280,7 @@ typedef struct Flash { bool reset_enable; bool initialized; uint8_t reset_pin; + uint8_t ear; int64_t dirty_page; @@ -426,6 +433,8 @@ static void complete_collecting_data(Flash *s) s->cur_addr = s->data[0] << 16; s->cur_addr |= s->data[1] << 8; s->cur_addr |= s->data[2]; + + s->cur_addr += (s->ear&0x3)*MAX_3BYTES_SIZE; } s->state = STATE_IDLE; @@ -454,6 +463,9 @@ static void complete_collecting_data(Flash *s) s->write_enable = false; } break; + case EXTEND_ADDR_WRITE: + s->ear = s->data[0]; + break; default: break; } @@ -463,6 +475,7 @@ static void reset_memory(Flash *s) { s->cmd_in_progress = NOP; s->cur_addr = 0; + s->ear = 0; s->four_bytes_address_mode = false; s->len = 0; s->needed_bytes = 0; @@ -589,6 +602,20 @@ static void decode_new_cmd(Flash *s, uint32_t value) case EX_4BYTE_ADDR: s->four_bytes_address_mode = false; break; + case EXTEND_ADDR_READ: + s->data[0] = s->ear; + s->pos = 0; + s->len = 1; + s->state = STATE_READING_DATA; + break; + case EXTEND_ADDR_WRITE: + if (s->write_enable) { + s->needed_bytes = 1; + s->pos = 0; + s->len = 0; + s->state = STATE_COLLECTING_DATA; + } + break; case RESET_ENABLE: s->reset_enable = true; break; @@ -740,6 +767,7 @@ static const VMStateDescription vmstate_m25p80 = { VMSTATE_UINT64(cur_addr, Flash), VMSTATE_BOOL(write_enable, Flash), VMSTATE_BOOL(four_bytes_address_mode, Flash), + VMSTATE_UINT8(ear, Flash), VMSTATE_BOOL(reset_enable, Flash), VMSTATE_BOOL(initialized, Flash), VMSTATE_UINT8(reset_pin, Flash), -- 2.5.0