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

@mihaipmihaip 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

@dingusdevdingusdev 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
mihaipforce-pushed the upstream-ata-dma-take2 branch from 7776eb2 to 017a4a4CompareJuly 12, 2026 00:46
@mihaip
mihaip requested a review from dingusdevJuly 12, 2026 00:46
@dingusdev
dingusdev merged commit 42e617f into dingusdev:masterJul 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.
Link4Electronics pushed a commit to Link4Electronics/dingusppc that referenced this pull request Aug 24, 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.
Sign up for freeto 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

@mihaip@dingusdev
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
ata: Implement DMA transfers by mihaip · Pull Request #192 · dingusdev/dingusppc · GitHub
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

@mihaipmihaip 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

@dingusdevdingusdev 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
mihaipforce-pushed the upstream-ata-dma-take2 branch from 7776eb2 to 017a4a4CompareJuly 12, 2026 00:46
@mihaip
mihaip requested a review from dingusdevJuly 12, 2026 00:46
@dingusdev
dingusdev merged commit 42e617f into dingusdev:masterJul 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.
Link4Electronics pushed a commit to Link4Electronics/dingusppc that referenced this pull request Aug 24, 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.
Sign up for freeto 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

@mihaip@dingusdev
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' ata: Implement DMA transfers by mihaip · Pull Request #192 · dingusdev/dingusppc · GitHub
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

@mihaipmihaip 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

@dingusdevdingusdev 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
mihaipforce-pushed the upstream-ata-dma-take2 branch from 7776eb2 to 017a4a4CompareJuly 12, 2026 00:46
@mihaip
mihaip requested a review from dingusdevJuly 12, 2026 00:46
@dingusdev
dingusdev merged commit 42e617f into dingusdev:masterJul 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.
Link4Electronics pushed a commit to Link4Electronics/dingusppc that referenced this pull request Aug 24, 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.
Sign up for freeto 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

@mihaip@dingusdev
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' ata: Implement DMA transfers by mihaip · Pull Request #192 · dingusdev/dingusppc · GitHub
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

@mihaipmihaip 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

@dingusdevdingusdev 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
mihaipforce-pushed the upstream-ata-dma-take2 branch from 7776eb2 to 017a4a4CompareJuly 12, 2026 00:46
@mihaip
mihaip requested a review from dingusdevJuly 12, 2026 00:46
@dingusdev
dingusdev merged commit 42e617f into dingusdev:masterJul 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.
Link4Electronics pushed a commit to Link4Electronics/dingusppc that referenced this pull request Aug 24, 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.
Sign up for freeto 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

@mihaip@dingusdev
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' ata: Implement DMA transfers by mihaip · Pull Request #192 · dingusdev/dingusppc · GitHub
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

@mihaipmihaip 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

@dingusdevdingusdev 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
mihaipforce-pushed the upstream-ata-dma-take2 branch from 7776eb2 to 017a4a4CompareJuly 12, 2026 00:46
@mihaip
mihaip requested a review from dingusdevJuly 12, 2026 00:46
@dingusdev
dingusdev merged commit 42e617f into dingusdev:masterJul 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.
Link4Electronics pushed a commit to Link4Electronics/dingusppc that referenced this pull request Aug 24, 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.
Sign up for freeto 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

@mihaip@dingusdev
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' ata: Implement DMA transfers by mihaip · Pull Request #192 · dingusdev/dingusppc · GitHub
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

@mihaipmihaip 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

@dingusdevdingusdev 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
mihaipforce-pushed the upstream-ata-dma-take2 branch from 7776eb2 to 017a4a4CompareJuly 12, 2026 00:46
@mihaip
mihaip requested a review from dingusdevJuly 12, 2026 00:46
@dingusdev
dingusdev merged commit 42e617f into dingusdev:masterJul 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.
Link4Electronics pushed a commit to Link4Electronics/dingusppc that referenced this pull request Aug 24, 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.
Sign up for freeto 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

@mihaip@dingusdev
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); ata: Implement DMA transfers by mihaip · Pull Request #192 · dingusdev/dingusppc · GitHub
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

@mihaipmihaip 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

@dingusdevdingusdev 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
mihaipforce-pushed the upstream-ata-dma-take2 branch from 7776eb2 to 017a4a4CompareJuly 12, 2026 00:46
@mihaip
mihaip requested a review from dingusdevJuly 12, 2026 00:46
@dingusdev
dingusdev merged commit 42e617f into dingusdev:masterJul 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.
Link4Electronics pushed a commit to Link4Electronics/dingusppc that referenced this pull request Aug 24, 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.
Sign up for freeto 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

@mihaip@dingusdev