Skip to content

ata: Implement DMA transfers - #192

Merged
dingusdev merged 2 commits into
dingusdev:masterfrom
mihaip:upstream-ata-dma-take2
Jul 12, 2026
Merged

ata: Implement DMA transfers#192
dingusdev merged 2 commits into
dingusdev:masterfrom
mihaip:upstream-ata-dma-take2

Conversation

@mihaip

@mihaip mihaip commented Jul 11, 2026

Copy link
Copy Markdown
Contributor

Add read/write DMA support to ATA devices (mostly reusing existing PIO read and write paths).

We also need to advance data_ptr across DMA pulls so transfers can span multiple DBDMA descriptors.

Fixes #154

@dingusdev dingusdev left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The implementation of push_data should be its own commit.
Other than that, this looks good.

mihaip added 2 commits July 11, 2026 17:44
Implement push_data in AtaBaseDevice using the device transfer buffer and
post-transfer callback.

Advance the read data pointer across DMA pulls so a transfer can span
multiple DBDMA descriptors, and clear the DMA state when transfers finish.
Add read/write DMA command support to ATA hard disks (can mostly reuse the PIO paths).
@mihaip
mihaip force-pushed the upstream-ata-dma-take2 branch from 7776eb2 to 017a4a4 Compare July 12, 2026 00:46
@mihaip
mihaip requested a review from dingusdev July 12, 2026 00:46
@dingusdev
dingusdev merged commit 42e617f into dingusdev:master Jul 12, 2026
7 checks passed
mihaip added a commit to mihaip/infinite-mac that referenced this pull request Jul 12, 2026
Also includes the fix from dingusdev/dingusppc#192 which allows the Mac OS X
public beta to boot.

For #219
@mihaip
mihaip deleted the upstream-ata-dma-take2 branch August 6, 2026 05:02
dingusdev pushed a commit that referenced this pull request Aug 16, 2026
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.

Takes booting 10.3 (to WindowServer startup) from ~60 seconds to ~47 seconds on my machine.
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.

[BUG] Mac OS X Public Beta does not boot

2 participants