Skip to content

Commit

Permalink
ide/via: Fix BAR4 value in legacy mode
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
zbalaton authored and kevmw committed Nov 28, 2023
1 parent 411132c commit 6e08132
Showing 1 changed file with 11 additions and 6 deletions.
17 changes: 11 additions & 6 deletions hw/ide/via.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down

0 comments on commit 6e08132

Please sign in to comment.