diff options
author | Helge Deller <deller@gmx.de> | 2024-02-02 21:28:50 +0100 |
---|---|---|
committer | Helge Deller <deller@gmx.de> | 2024-02-11 13:20:23 +0100 |
commit | f410b688af8fa6b317c58dd1a11f2b3225d4a0ea (patch) | |
tree | 2810ae2be290ca346116faa3daf4bc13cbbf4575 /hw/pci-host | |
parent | b7174d9ad3ec3966270eeefa965ffe8f336b86dd (diff) | |
download | qemu-f410b688af8fa6b317c58dd1a11f2b3225d4a0ea.zip qemu-f410b688af8fa6b317c58dd1a11f2b3225d4a0ea.tar.gz qemu-f410b688af8fa6b317c58dd1a11f2b3225d4a0ea.tar.bz2 |
hw/pci-host/astro: Implement Hard Fail and Soft Fail mode
The Astro/Elroy chip can work in either Hard-Fail or Soft-Fail mode.
Hard fail means the system bus will send an HPMC (=crash) to the
processor, soft fail means the system bus will ignore timeouts of
MMIO-reads or MMIO-writes and return -1ULL.
The HF mode is controlled by a bit in the status register and is usually
programmed by the OS. Return the corresponing values based on the current
value of that bit.
Signed-off-by: Helge Deller <deller@gmx.de>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Diffstat (limited to 'hw/pci-host')
-rw-r--r-- | hw/pci-host/astro.c | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/hw/pci-host/astro.c b/hw/pci-host/astro.c index 96d655f..e3e589c 100644 --- a/hw/pci-host/astro.c +++ b/hw/pci-host/astro.c @@ -131,15 +131,21 @@ static MemTxResult elroy_chip_read_with_attrs(void *opaque, hwaddr addr, if (s->iosapic_reg_select < ARRAY_SIZE(s->iosapic_reg)) { val = s->iosapic_reg[s->iosapic_reg_select]; } else { - val = 0; - ret = MEMTX_DECODE_ERROR; + goto check_hf; } } trace_iosapic_reg_read(s->iosapic_reg_select, size, val); break; default: - val = 0; - ret = MEMTX_DECODE_ERROR; + check_hf: + if (s->status_control & HF_ENABLE) { + val = 0; + ret = MEMTX_DECODE_ERROR; + } else { + /* return -1ULL if HardFail is disabled */ + val = ~0; + ret = MEMTX_OK; + } } trace_elroy_read(addr, size, val); @@ -187,7 +193,7 @@ static MemTxResult elroy_chip_write_with_attrs(void *opaque, hwaddr addr, if (s->iosapic_reg_select < ARRAY_SIZE(s->iosapic_reg)) { s->iosapic_reg[s->iosapic_reg_select] = val; } else { - return MEMTX_DECODE_ERROR; + goto check_hf; } break; case 0x0840: /* IOSAPIC_REG_EOI */ @@ -200,7 +206,10 @@ static MemTxResult elroy_chip_write_with_attrs(void *opaque, hwaddr addr, } break; default: - return MEMTX_DECODE_ERROR; + check_hf: + if (s->status_control & HF_ENABLE) { + return MEMTX_DECODE_ERROR; + } } return MEMTX_OK; } |