aboutsummaryrefslogtreecommitdiff
path: root/hw/ide
diff options
context:
space:
mode:
authorBALATON Zoltan <balaton@eik.bme.hu>2023-11-25 15:01:35 +0100
committerKevin Wolf <kwolf@redhat.com>2023-11-28 14:56:32 +0100
commit6e081324facf9aeece9c286774bab5af3b8d6099 (patch)
tree722046f315104dbd06a61b4e50a7e9b91b801f37 /hw/ide
parent411132c9790aae23f69add2e9f5f129880e079c0 (diff)
downloadqemu-6e081324facf9aeece9c286774bab5af3b8d6099.zip
qemu-6e081324facf9aeece9c286774bab5af3b8d6099.tar.gz
qemu-6e081324facf9aeece9c286774bab5af3b8d6099.tar.bz2
ide/via: Fix BAR4 value in legacy mode
Return default value in legacy mode for BAR4 when unset. This can't be set in reset method because BARs are cleared on reset so we return it instead when BARs are read in legacy mode. This fixes UDMA on amigaone with AmigaOS. Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu> Message-ID: <20231125140135.AF6A075A4C3@zero.eik.bme.hu> Reviewed-by: Kevin Wolf <kwolf@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Diffstat (limited to 'hw/ide')
-rw-r--r--hw/ide/via.c17
1 files changed, 11 insertions, 6 deletions
diff --git a/hw/ide/via.c b/hw/ide/via.c
index 2d3124e..3f3c484 100644
--- a/hw/ide/via.c
+++ b/hw/ide/via.c
@@ -163,14 +163,19 @@ static uint32_t via_ide_cfg_read(PCIDevice *pd, uint32_t addr, int len)
uint32_t val = pci_default_read_config(pd, addr, len);
uint8_t mode = pd->config[PCI_CLASS_PROG];
- if ((mode & 0xf) == 0xa && ranges_overlap(addr, len,
- PCI_BASE_ADDRESS_0, 16)) {
- /* BARs always read back zero in legacy mode */
- for (int i = addr; i < addr + len; i++) {
- if (i >= PCI_BASE_ADDRESS_0 && i < PCI_BASE_ADDRESS_0 + 16) {
- val &= ~(0xffULL << ((i - addr) << 3));
+ if ((mode & 0xf) == 0xa) {
+ if (ranges_overlap(addr, len, PCI_BASE_ADDRESS_0, 16)) {
+ /* BARs 0-3 always read back zero in legacy mode */
+ for (int i = addr; i < addr + len; i++) {
+ if (i >= PCI_BASE_ADDRESS_0 && i < PCI_BASE_ADDRESS_0 + 16) {
+ val &= ~(0xffULL << ((i - addr) << 3));
+ }
}
}
+ if (addr == PCI_BASE_ADDRESS_4 && val == PCI_BASE_ADDRESS_SPACE_IO) {
+ /* BAR4 default value if unset */
+ val = 0xcc00 | PCI_BASE_ADDRESS_SPACE_IO;
+ }
}
return val;