There were some complaints from non-qemu users about the ATA DMA causing failures. Until this is sorted out, I've added a config option for this support and defaulted it off.
I've already committed this change.
-Kevin
diff --git a/src/ata.c b/src/ata.c index add1d67..a2a670b 100644 --- a/src/ata.c +++ b/src/ata.c @@ -381,6 +381,8 @@ struct sff_dma_prd { static int ata_try_dma(struct disk_op_s *op, int iswrite, int blocksize) { + if (! CONFIG_ATA_DMA) + return -1; u32 dest = (u32)op->buf_fl; if (dest & 1) // Need minimum alignment of 1. @@ -434,6 +436,8 @@ ata_try_dma(struct disk_op_s *op, int iswrite, int blocksize) static int ata_dma_transfer(struct disk_op_s *op) { + if (! CONFIG_ATA_DMA) + return -1; dprintf(16, "ata_dma_transfer id=%p buf=%p\n" , op->drive_g, op->buf_fl);
@@ -513,6 +517,8 @@ fail: static int ata_dma_cmd_data(struct disk_op_s *op, struct ata_pio_command *cmd) { + if (! CONFIG_ATA_DMA) + return -1; int ret = send_cmd(op->drive_g, cmd); if (ret) return ret; @@ -1005,7 +1011,7 @@ ata_init(void) u8 pciirq = pci_config_readb(bdf, PCI_INTERRUPT_LINE); u8 prog_if = pci_config_readb(bdf, PCI_CLASS_PROG); int master = 0; - if (prog_if & 0x80) { + if (CONFIG_ATA_DMA && prog_if & 0x80) { // Check for bus-mastering. u32 bar = pci_config_readl(bdf, PCI_BASE_ADDRESS_4); if (bar & PCI_BASE_ADDRESS_SPACE_IO) { diff --git a/src/config.h b/src/config.h index 58c0ffc..dc0b69f 100644 --- a/src/config.h +++ b/src/config.h @@ -42,6 +42,8 @@ #define CONFIG_PS2PORT 1 // Support for IDE disk code #define CONFIG_ATA 1 +// Detect and try to use ATA bus mastering DMA controllers. +#define CONFIG_ATA_DMA 0 // Use 32bit PIO accesses on ATA (minor optimization on PCI transfers) #define CONFIG_ATA_PIO32 0 // Support for booting from a CD