In my particular case (I have an HP Pavilion DV5-1157ca notebook), this conflict prevented my two left side (EHCI) USB ports from working almost all the time, and sometimes also my two right (UHCI) USB ports as well. In each case, IORegistryExplorer revealed that the HPET, which always uses four interrupts, had randomly grabbed one or more interrupts that were normaly used by my EHCI/UHCI devices, and refused to share them, leaving my devices non-operational.
I've read various possible solutions from a number of threads about this, but none of them made sense to me. First, IORegistryExplorer clearly showed that HPET always used four interrupts, but only two vere specified in my DSDT. I've read that, for some, their DSDT doesn't even specify any interrupts at all. Furthermore, my HPET always took the first two interrupts as the one specified in the DSDT. It is the last two that were chosen at random and interfered with my USB ports.
So far the only thing that worked for me was to use Slice's IOPCIFamily kext. But I wanted a fully vanilla install so I needed another solution. I then said to myself that if the HPET wanted four interrupts, then I was going to give it four interrupts, but they would be of my choosing. Again using IORegistryExplorer, I looked for two interrupt values below 15 (because IASL complains when you try to use values greater than 15 in IRQ or IRQNoFlag statements) that were unused by any device. I then edited my HPET section in the DSDT from:
CODE
Device (HPET)
{
Name (_HID, EisaId ("PNP0103"))
Name (BUF0, ResourceTemplate ()
{
IRQNoFlags ()
{2}
IRQNoFlags ()
{8}
Memory32Fixed (ReadOnly,
0xFED00000, // Address Base
0x00000400, // Address Length
_Y10)
})
...
{
Name (_HID, EisaId ("PNP0103"))
Name (BUF0, ResourceTemplate ()
{
IRQNoFlags ()
{2}
IRQNoFlags ()
{8}
Memory32Fixed (ReadOnly,
0xFED00000, // Address Base
0x00000400, // Address Length
_Y10)
})
...
To:
CODE
Device (HPET)
{
Name (_HID, EisaId ("PNP0103"))
Name (BUF0, ResourceTemplate ()
{
IRQNoFlags ()
{0}
IRQNoFlags ()
{8}
IRQNoFlags ()
{11}
IRQNoFlags ()
{15}
Memory32Fixed (ReadOnly,
0xFED00000, // Address Base
0x00000400, // Address Length
_Y10)
})
...
{
Name (_HID, EisaId ("PNP0103"))
Name (BUF0, ResourceTemplate ()
{
IRQNoFlags ()
{0}
IRQNoFlags ()
{8}
IRQNoFlags ()
{11}
IRQNoFlags ()
{15}
Memory32Fixed (ReadOnly,
0xFED00000, // Address Base
0x00000400, // Address Length
_Y10)
})
...
I recompiled the DSDT, rebooted using the vanilla IOPCIFamily kext, and voila ! My system booted perfectly, no error message, HPET and all USB ports fully operational. IORegistryExplorer confirmed that HPET was effectively using the four interrupt numbers that I had explicitly specified in the DSDT.
Since then I've been able to boot into Snow Leopard with the vanilla IOPCIFamily kext with no trouble. I'm on Snow 64-bit, but since the solution is a DSDT patch, I assume it's going to work also for Snow 32-bit or Leopard. Slight modifications of this technique will probably allow anyone to solve their problems of IRQ conflict between the HPET and other devices.
I hope you find this information usefull.
NOTE: Not only does this solution allow you to use vanilla IOPCIFamily, but you MUST use vanilla kext ! After this modification, continuing to use Slice's IOPCIFamily caused my machine to kernel panic either during boot or a few seconds after GUI startup.
