Hello,

On Sat, 6 Jun 2026, Chad Jablonski wrote:
This series implements CCE engine setup and PIO packet submission/processing
for the Rage 128 and Radeon. This forms the foundation for full CCE support
for both chips in the future.

Sorry, I did not have time to review this but AFAIU this is more of an RFC now as it does not work with any drivers yet so you'll follow up with more patches anyway.

CCE engine microcode loading is shared across Rage 128 and Radeon. Microcode
is stored but not executed in this series. Type-0/1/2 packets are handled by
fixed-function hardware and do not require microcode. Ring buffer (BM modes)
and Type 3 packet processing will follow in future series.

I was wondering if anything wants to read the microcode. If not we could just ignore the writes and not store the data and just log when something tried to read. (Or just do nothing for it as uniplemented register accesses are already logged.) Or are you aware something that needs the read registers?

There are differences between CCE setup for Rage 128 and Radeon. Patch 2
introduces chip-specific register handlers. The packet processing itself in
patch 7 is reusable for both chips.

The plan for the next series is to tackle BM modes for Radeon. Differences
between the two chips start to become larger in the BM modes.

So far we handled these differences within the same function with if on model. The differences added by this series does not seem large enough to not fit in an if to keep the single functions but if we go with separate functions instead then maybe the existing ifs should also be removed and split into the model specific functions with the common one named ati_common_reg_* then? The current series only converts new registers so I'd either use ifs with the single handler function or convert everything to stay consistent.

Regards,
BALATON Zoltan

Hardware tests available at:
r128: 
https://codeberg.org/cjab/ati-tests/src/commit/1ec2dc95d4ed8d11504723b8298847af9b5be075/tests/r128/cce.c
r100: 
https://codeberg.org/cjab/ati-tests/src/commit/1ec2dc95d4ed8d11504723b8298847af9b5be075/tests/r100/cce.c

Tested on Rage 128 Pro Ultra (PCI 1002:5446) and
Radeon QY (RV100) (PCI 1002:5159).

Changes from v2:
- MM_INDEX and MM_DATA are not available through ati_reg_write
- Use ati_int.h header instead of creating a new one
- Drop PM4_STAT register implementation for now. It will be easier to more
 accurately implement with BM modes.
- Introduce chip-specific register handlers
- Combine PM4_BUFFER_CNTL and PM4_MICRO_CNTL patches
- Add CCE mode registers for r100
- PM4_MICROCODE_DATAH is one bit wider for r100
- Testing on r100 showed that GUI MMIO is not disabled in CCE mode. Now
 gated for r128 only.
- Small style fixes

Changes from v1:
- Rebased onto master (no longer depends on HOST_DATA series)

Chad Jablonski (7):
 ati-vga: Extract ati_reg_write() from ati_mm_write()
 ati-vga: Chip-specific register handlers
 ati-vga: Implement CCE microcode register handling
 ati-vga: Implement CCE mode registers for r128
 ati-vga: Implement CCE mode registers for r100
 ati-vga: Disable GUI engine MMIO writes when CCE enabled (r128 only)
 ati-vga: Process Type-0/1/2 CCE packets via PIO

hw/display/ati.c        | 505 +++++++++++++++++++++++++++-------------
hw/display/ati_cce.c    | 154 ++++++++++++
hw/display/ati_int.h    |  73 ++++++
hw/display/ati_regs.h   |  15 ++
hw/display/meson.build  |   3 +-
hw/display/trace-events |   9 +
6 files changed, 598 insertions(+), 161 deletions(-)
create mode 100644 hw/display/ati_cce.c



Reply via email to