Interestingly I added some code to dump out the DMA addresses used and checked it with and without IOMMU:
Without: DMA: AREA = ffff8800dd44b000, ADDR = dd44b000
With: DMA: AREA = ffff8803ecf15000, ADDR = 68000
Here are the registers while the device is working (with IOMMU):
GCAP: 0x4300 VMIN: 0x00 VMAJ: 0x01 INPAY: 0x0048 OUTPAY: 0x0054 GCTL: 0x00000101 WAKEEN: 0x0000 STATSTS: 0x0000 GSTS: 0x0000 OUTSTRMPAY: 0x0030 INSTRMPAY: 0x001d INTCTL: 0xc0000000 INTSTS: 0x00000000 WALCLK: 0xb4bdefba CORBLBASE: 0x00068000 CORBUBASE: 0x00000000 CORBWP: 0x00ad CORBRP: 0x00ad CORBCTL: 0x02 CORBSTS: 0x00 CORBSIZE: 0x42 RIRBLBASE: 0x00068800 RIRBUBASE: 0x00000000 RIRBWP: 0x00ad RINTCNT: 0x0001 RIRBCTL: 0x03 RIRBSTS: 0x00 RIRBSIZE: 0x42 ICOI: 0x00000000 ICII: 0x00000000 ICIS: 0x0002 DPIBLBASE: 0x00000000 DPIULBASE: 0x00000000
CORBLBASE gets set to dd44b000, and RIRBLBASE gets set to dd44b800 when it is without IOMMU as one would expect.
But... it is not 128bit aligned as per the HD Audio Spec.
Windows uses a DMA address of 0xdd4d0000, which is 128bit aligned. I will do some more hacking and see if I can figure out how to give it an aligned DMA buffer.