If you have an ATI HDXXXX Series of AGP graphics cards with an integrated High Definition Audio Controller, you probably noticed you can't get audio over HDMI and you receive an error in the System Event Viewer like this one:
This problems happens on old AGP boards and also on some older PCIe boards. Newer PCIe boards don't have this problem. AGP boards weren't designed for multiple devices on the AGP bus. But this problem has an easy fix. At least for BIOS that rely on ACPI for IRQ routing. For those that don't, you can assign IRQ on the BIOS menu or under the OS.
Certain ATI HDXXXX cards come with an integrated High Definition Audio Controller to provide audio over HDMI. They have an HDMI output. So you will get two devices on the AGP bus. "Bus 2 Device 0 Function 0" and "Bus 2 Device 0 Function 1". Since most BIOS don't provide IRQ Routing for more than "Bus 2 Device 0 Function 0" the graphics function, the HDA function won't get an IRQ and audio over HDMI won't work.
There is a definitive solution for this problem. You need to edit the ACPI table of your System Board's BIOS. Not the Graphics card one! I am going to give a brief explanation on how I achieved this. In the hopes that this information might help others to fix their system board's BIOS too.
I only have AWARD BIOS systems, but if you have others like AMI and you are familiar with replacing their BIOS modules you can easily adapt this method.
So for AWARD you need CBROM 32 bit. I find that version 1.80 works well. However version 1.40 extracts corrupt unusable ACPI tables from the BIOS. Do a search on the Internet for this tool.
You also need the Intel ASL Compiler, a Text Editor (Notepad will do) and an HEX Editor of your choice, for whatever BIOS AWARD, Phoenix or AMI you are using. You can get the Intel ASL Compiler here -> http://www.acpica.org/downloads/binary_tools.php Extract iasl.exe to a folder of your choice. This is going to be your working folder. Also place the CBROM tool and your Motherboard's BIOS on that folder.
1 -> Execute Windows Cmd command and on the command prompt enter your working folder. I guess you know how to do that.
2 -> Extract the ACPI table. On the command prompt execute:
This will extract an ACPITBL.BIN file to your working folder. You might need to press Enter twice.
3 -> Extract the DSDT (Differentiated System Description Table) from ACPITBL.BIN. For this open ACPITBL.BIN file with an HEX Editor. Search for an ASCII signature labeled DSDT. Select all the bytes starting immediately before the D of the DSDT word to the end of the ACPITBL.BIN file. Now copy all these bytes to a new file on the HEX Editor and save this new file as DSDT.bin placed on your working folder.
4 -> Decompile the DSDT table. Execute on the command prompt:
If you did everything right up until now you will get a file named DSDT.dsl on your chosen folder.
5 -> Edit the DSDT table. Open the file DSDT.dsl with your text editor and do a search for the AGP word. This is what you will probably find if you have an nForce 2 BIOS:
You have to edit this section so that it looks like this:
Your BIOS might have been written a lot differently from this. And in that case a deeper understanding is needed to do it the right way. If you are really interested read the ACPI specifications. You can find them here -> http://www.acpi.info/
I recommend you study the version of the ACPI spec of you system board's implementation. Just before you try this way, know you need to tell all the 4 possible devices under the AGP bus to get to the same IRQ.
6 -> Save the edited DSDT ASL (ACPI Source Language) file and compile it. Save the edited file as DSDTNEW.dsl and compile it by executing the command:
This will generate a file named DSDT.aml
NOTE: If iasl refuses to compile due to errors you didn't introduce, try Microsoft ASL Compiler. Grab it from here -> http://download.microsoft.com/download/2/c...iler-v4-0-0.msi
In this case compile with:
7 -> Put the compiled DSDT table back into the ACPITBL.BIN file. Open the ACPITBL.BIN file with an hex editor again. Select the DSDT table like it was explained in point 3. Open the file DSDT.aml with the HEX Editor on a new window. Select all bytes from the DSDT.aml file and select Copy. Now go to the ACPITBL.BIN HEX Editor Window and Paste replacing the old DSDT table. Save the edited ACPITBL.BIN with the same name.
8 -> Replace the old ACPITBL.BIN module on the BIOS file with the new one. On the command prompt under your working folder execute:
This will release the old ACPITBL.BIN module from the BIOS.
To insert the new one execute:
9 -> Flash the BIOS file obtained like you normally do. And pray!
NOTE: Make sure you can recover from a bad flash before trying this. In case anything goes wrong.
GOOD LUCK!
Here is a list of some BIOS files with this patch applied:
Abit AN7 -> AGP -> Tested
Click on "AQUI"
IRQARB: ACPI BIOS does not contain an IRQ for the device in PCI slot 0, function 1. Please contact your system vendor for technical assistance.
For more information, see Help and Support Center at http://go.microsoft.com/fwlink/events.asp.
This problems happens on old AGP boards and also on some older PCIe boards. Newer PCIe boards don't have this problem. AGP boards weren't designed for multiple devices on the AGP bus. But this problem has an easy fix. At least for BIOS that rely on ACPI for IRQ routing. For those that don't, you can assign IRQ on the BIOS menu or under the OS.
Certain ATI HDXXXX cards come with an integrated High Definition Audio Controller to provide audio over HDMI. They have an HDMI output. So you will get two devices on the AGP bus. "Bus 2 Device 0 Function 0" and "Bus 2 Device 0 Function 1". Since most BIOS don't provide IRQ Routing for more than "Bus 2 Device 0 Function 0" the graphics function, the HDA function won't get an IRQ and audio over HDMI won't work.
There is a definitive solution for this problem. You need to edit the ACPI table of your System Board's BIOS. Not the Graphics card one! I am going to give a brief explanation on how I achieved this. In the hopes that this information might help others to fix their system board's BIOS too.
I only have AWARD BIOS systems, but if you have others like AMI and you are familiar with replacing their BIOS modules you can easily adapt this method.
So for AWARD you need CBROM 32 bit. I find that version 1.80 works well. However version 1.40 extracts corrupt unusable ACPI tables from the BIOS. Do a search on the Internet for this tool.
You also need the Intel ASL Compiler, a Text Editor (Notepad will do) and an HEX Editor of your choice, for whatever BIOS AWARD, Phoenix or AMI you are using. You can get the Intel ASL Compiler here -> http://www.acpica.org/downloads/binary_tools.php Extract iasl.exe to a folder of your choice. This is going to be your working folder. Also place the CBROM tool and your Motherboard's BIOS on that folder.
1 -> Execute Windows Cmd command and on the command prompt enter your working folder. I guess you know how to do that.
2 -> Extract the ACPI table. On the command prompt execute:
Code:
cbrom biosfilename.bin /acpitbl extract
3 -> Extract the DSDT (Differentiated System Description Table) from ACPITBL.BIN. For this open ACPITBL.BIN file with an HEX Editor. Search for an ASCII signature labeled DSDT. Select all the bytes starting immediately before the D of the DSDT word to the end of the ACPITBL.BIN file. Now copy all these bytes to a new file on the HEX Editor and save this new file as DSDT.bin placed on your working folder.
4 -> Decompile the DSDT table. Execute on the command prompt:
Code:
iasl -d DSDT.bin
5 -> Edit the DSDT table. Open the file DSDT.dsl with your text editor and do a search for the AGP word. This is what you will probably find if you have an nForce 2 BIOS:
Code:
Device (AGPB)
{
Name (_ADR, 0x001E0000)
Name (ONBV, 0x00)
Name (PICM, Package (0x01)
{
Package (0x04)
{
0xFFFF,
0x00,
\_SB.PCI0.LNK5,
0x00
}
})
Name (APIC, Package (0x01)
{
Package (0x04)
{
0xFFFF,
0x00,
\_SB.PCI0.APC5,
0x00
}
})
Name (AGP0, Package (0x01)
{
Package (0x04)
{
0xFFFF,
0x00,
\_SB.PCI0.LNK4,
0x00
}
})
Name (AGP1, Package (0x01)
{
Package (0x04)
{
0xFFFF,
0x00,
\_SB.PCI0.APC4,
0x00
}
})
Method (_PRT, 0, NotSerialized)
{
If (LNot (PICF))
{
If (LEqual (ONBV, 0x01))
{
Return (PICM)
}
Else
{
Return (AGP0)
}
}
Else
{
If (LEqual (ONBV, 0x01))
{
Return (APIC)
}
Else
{
Return (AGP1)
}
}
}
Device (VGAG)
{
Name (_ADR, 0x00)
}
}
Code:
Device (AGPB)
{
Name (_ADR, 0x001E0000)
Name (ONBV, 0x00)
Name (PICM, Package (0x04)
{
Package (0x04)
{
0xFFFF,
0x00,
\_SB.PCI0.LNK5,
0x00
},
Package (0x04)
{
0xFFFF,
0x01,
\_SB.PCI0.LNK5,
0x00
},
Package (0x04)
{
0xFFFF,
0x02,
\_SB.PCI0.LNK5,
0x00
},
Package (0x04)
{
0xFFFF,
0x03,
\_SB.PCI0.LNK5,
0x00
}
})
Name (APIC, Package (0x04)
{
Package (0x04)
{
0xFFFF,
0x00,
\_SB.PCI0.APC5,
0x00
},
Package (0x04)
{
0xFFFF,
0x01,
\_SB.PCI0.APC5,
0x00
},
Package (0x04)
{
0xFFFF,
0x02,
\_SB.PCI0.APC5,
0x00
},
Package (0x04)
{
0xFFFF,
0x03,
\_SB.PCI0.APC5,
0x00
}
})
Name (AGP0, Package (0x04)
{
Package (0x04)
{
0xFFFF,
0x00,
\_SB.PCI0.LNK4,
0x00
},
Package (0x04)
{
0xFFFF,
0x01,
\_SB.PCI0.LNK4,
0x00
},
Package (0x04)
{
0xFFFF,
0x02,
\_SB.PCI0.LNK4,
0x00
},
Package (0x04)
{
0xFFFF,
0x03,
\_SB.PCI0.LNK4,
0x00
}
})
Name (AGP1, Package (0x04)
{
Package (0x04)
{
0xFFFF,
0x00,
\_SB.PCI0.APC4,
0x00
},
Package (0x04)
{
0xFFFF,
0x01,
\_SB.PCI0.APC4,
0x00
},
Package (0x04)
{
0xFFFF,
0x02,
\_SB.PCI0.APC4,
0x00
},
Package (0x04)
{
0xFFFF,
0x03,
\_SB.PCI0.APC4,
0x00
}
})
Method (_PRT, 0, NotSerialized)
{
If (LNot (PICF))
{
If (LEqual (ONBV, 0x01))
{
Return (PICM)
}
Else
{
Return (AGP0)
}
}
Else
{
If (LEqual (ONBV, 0x01))
{
Return (APIC)
}
Else
{
Return (AGP1)
}
}
}
Device (VGAG)
{
Name (_ADR, 0x00)
}
}
I recommend you study the version of the ACPI spec of you system board's implementation. Just before you try this way, know you need to tell all the 4 possible devices under the AGP bus to get to the same IRQ.
6 -> Save the edited DSDT ASL (ACPI Source Language) file and compile it. Save the edited file as DSDTNEW.dsl and compile it by executing the command:
Code:
iasl -sa -oa DSDTNEW.dsl
NOTE: If iasl refuses to compile due to errors you didn't introduce, try Microsoft ASL Compiler. Grab it from here -> http://download.microsoft.com/download/2/c...iler-v4-0-0.msi
In this case compile with:
Code:
asl DSDTNEW.dsl
7 -> Put the compiled DSDT table back into the ACPITBL.BIN file. Open the ACPITBL.BIN file with an hex editor again. Select the DSDT table like it was explained in point 3. Open the file DSDT.aml with the HEX Editor on a new window. Select all bytes from the DSDT.aml file and select Copy. Now go to the ACPITBL.BIN HEX Editor Window and Paste replacing the old DSDT table. Save the edited ACPITBL.BIN with the same name.
8 -> Replace the old ACPITBL.BIN module on the BIOS file with the new one. On the command prompt under your working folder execute:
Code:
cbrom biosfilename.bin /acpitbl release
To insert the new one execute:
Code:
cbrom biosfilename.bin /acpitbl ACPITBL.BIN
9 -> Flash the BIOS file obtained like you normally do. And pray!
NOTE: Make sure you can recover from a bad flash before trying this. In case anything goes wrong.
GOOD LUCK!
Here is a list of some BIOS files with this patch applied:
Abit AN7 -> AGP -> Tested
Click on "AQUI"
Last edited: