Skip to content

ata: Advertise multiword DMA support - #214

Merged
dingusdev merged 1 commit into
dingusdev:masterfrom
mihaip:upstream-ata-dma
Aug 16, 2026
Merged

ata: Advertise multiword DMA support#214
dingusdev merged 1 commit into
dingusdev:masterfrom
mihaip:upstream-ata-dma

Conversation

@mihaip

@mihaip mihaip commented Aug 16, 2026

Copy link
Copy Markdown
Contributor

Followup to #192. That implemented DMA support, but did not advertise it via the IDENTIFY command. While the 10.0 public beta used it unconditionally, later releases will only use it if the hardware reports the MWDMA bit.

DMA is more efficient than PIO (less time spent in the CPU emulator); this takes booting 10.3 (to WindowServer startup) from ~60 seconds to ~47 seconds on my machine.

Followup to dingusdev#192. That implemented DMA support, but did not advertise
it via the IDENTIFY command. While the 10.0 public beta used it
unconditionally, later releases will only use it if the hardware
reports the MWDMA bit.

Takes booting 10.3 (to WindowServer startup) from ~60 seconds to ~47 seconds on my machine.
@dingusdev
dingusdev merged commit bd7e3b2 into dingusdev:master Aug 16, 2026
7 checks passed
@mihaip
mihaip deleted the upstream-ata-dma branch August 17, 2026 05:21
mihaip added a commit to mihaip/dingusppc that referenced this pull request Aug 22, 2026
With dingusdev#214 we started to advertise the IDE DMA support from dingusdev#192 to
guests. That appeared to break booting Mac OS 8.x, at least on the Beige
G3: the startup disk was not even detected.

Mac OS 8.1 sets up an IDE DMA read as INPUT_MORE, then a NOP with its i
field set to always, then STOP, which clears the channel's ACTIVE bit.
The emulated transfer completion path interpreted only one following
descriptor, so it stopped at NOP. NOP raised the interrupt, but STOP was
never reached and the channel stayed active. The Mac OS X driver is more
tolerant of this, which is why it was not an issue there.

The DBDMA Specification, section 1.4, says: "The target fetches command
entries and performs the command-entry-specified data-transfer operation,
processing command entries until a STOP entry is reached". Keep
interpreting ready commands until a transfer blocks or the channel stops,
as start() and resume() already did. This is closer to the hardware
behavior, and empirically lets Mac OS 8.1 boot again.
dingusdev pushed a commit that referenced this pull request Aug 22, 2026
With #214 we started to advertise the IDE DMA support from #192 to
guests. That appeared to break booting Mac OS 8.x, at least on the Beige
G3: the startup disk was not even detected.

Mac OS 8.1 sets up an IDE DMA read as INPUT_MORE, then a NOP with its i
field set to always, then STOP, which clears the channel's ACTIVE bit.
The emulated transfer completion path interpreted only one following
descriptor, so it stopped at NOP. NOP raised the interrupt, but STOP was
never reached and the channel stayed active. The Mac OS X driver is more
tolerant of this, which is why it was not an issue there.

The DBDMA Specification, section 1.4, says: "The target fetches command
entries and performs the command-entry-specified data-transfer operation,
processing command entries until a STOP entry is reached". Keep
interpreting ready commands until a transfer blocks or the channel stops,
as start() and resume() already did. This is closer to the hardware
behavior, and empirically lets Mac OS 8.1 boot again.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants