fix(m25p80): answer Read-ID 0x90/0xAB for all chips, not just SST

CrossPoint flash detection sends Read-ID (0x90/0xAB); the model only handled it
for SST chips, so the is25lp128 returned nothing and detection fell into an
SFDP/garbage path that crashed QEMU. Return manufacturer + device id for any
chip, as real hardware does.
This commit is contained in:
2026-07-20 09:03:16 -04:00
parent 2c1b320b0a
commit d4e53ae638
+43
View File
@@ -324,6 +324,49 @@ index 89087429c7..4d38b3e13c 100644
: ADC_MAX;
}
return s->regs[addr / 4];
diff --git a/hw/block/m25p80.c b/hw/block/m25p80.c
index 46dbe7c521..4f05caf34e 100644
--- a/hw/block/m25p80.c
+++ b/hw/block/m25p80.c
@@ -856,28 +856,18 @@ static void complete_collecting_data(Flash *s)
break;
case RDID_90:
case RDID_AB:
- if (get_man(s) == MAN_SST) {
- if (s->cur_addr <= 1) {
- if (s->cur_addr) {
- s->data[0] = s->pi->id[2];
- s->data[1] = s->pi->id[0];
- } else {
- s->data[0] = s->pi->id[0];
- s->data[1] = s->pi->id[2];
- }
- s->pos = 0;
- s->len = 2;
- s->data_read_loop = true;
- s->state = STATE_READING_DATA;
- } else {
- qemu_log_mask(LOG_GUEST_ERROR,
- "M25P80: Invalid read id address\n");
- }
+ // Read Manufacturer/Device ID - The address low bit selects which of the manufacturer/device pair comes first; real chips answer regardless of vendor, so this is not gated on MAN_SST. Reused for 0xAB (Release Power-Down + Device ID), whose trailing byte reads back the device id.
+ if (s->cur_addr) {
+ s->data[0] = s->pi->id[2];
+ s->data[1] = s->pi->id[0];
} else {
- qemu_log_mask(LOG_GUEST_ERROR,
- "M25P80: Read id (command 0x90/0xAB) is not supported"
- " by device\n");
+ s->data[0] = s->pi->id[0];
+ s->data[1] = s->pi->id[2];
}
+ s->pos = 0;
+ s->len = 2;
+ s->data_read_loop = true;
+ s->state = STATE_READING_DATA;
break;
case RDSFDP:
diff --git a/hw/display/xteink_x3_eink.c b/hw/display/xteink_x3_eink.c
index b699abae4e..8a177e9159 100644
--- a/hw/display/xteink_x3_eink.c