mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-01 08:56:45 +07:00
x86: hpet: modify IXP400 quirk to enable interrupts
The current quirk is incomplete. Some more chipset fiddling has to be done to enable HPET interrupts. This patch aims to do this. From my tests it seems to work faultlessly. But the official statement is that HPET is not supported on SB4X0. Users will still have to use hpet=force to enable it. Use it at your own risk. Signed-off-by: Andreas Herrmann <andreas.herrmann3@amd.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
parent
f92a789d25
commit
e7250b8ae3
@ -354,9 +354,27 @@ static void ati_force_hpet_resume(void)
|
||||
printk(KERN_DEBUG "Force enabled HPET at resume\n");
|
||||
}
|
||||
|
||||
static u32 ati_ixp4x0_rev(struct pci_dev *dev)
|
||||
{
|
||||
u32 d;
|
||||
u8 b;
|
||||
|
||||
pci_read_config_byte(dev, 0xac, &b);
|
||||
b &= ~(1<<5);
|
||||
pci_write_config_byte(dev, 0xac, b);
|
||||
pci_read_config_dword(dev, 0x70, &d);
|
||||
d |= 1<<8;
|
||||
pci_write_config_dword(dev, 0x70, d);
|
||||
pci_read_config_dword(dev, 0x8, &d);
|
||||
d &= 0xff;
|
||||
dev_printk(KERN_DEBUG, &dev->dev, "SB4X0 revision 0x%x\n", d);
|
||||
return d;
|
||||
}
|
||||
|
||||
static void ati_force_enable_hpet(struct pci_dev *dev)
|
||||
{
|
||||
u32 uninitialized_var(val);
|
||||
u32 d, val;
|
||||
u8 b;
|
||||
|
||||
if (hpet_address || force_hpet_address)
|
||||
return;
|
||||
@ -366,14 +384,33 @@ static void ati_force_enable_hpet(struct pci_dev *dev)
|
||||
return;
|
||||
}
|
||||
|
||||
d = ati_ixp4x0_rev(dev);
|
||||
if (d < 0x82)
|
||||
return;
|
||||
|
||||
/* base address */
|
||||
pci_write_config_dword(dev, 0x14, 0xfed00000);
|
||||
pci_read_config_dword(dev, 0x14, &val);
|
||||
|
||||
/* enable interrupt */
|
||||
outb(0x72, 0xcd6); b = inb(0xcd7);
|
||||
b |= 0x1;
|
||||
outb(0x72, 0xcd6); outb(b, 0xcd7);
|
||||
outb(0x72, 0xcd6); b = inb(0xcd7);
|
||||
if (!(b & 0x1))
|
||||
return;
|
||||
pci_read_config_dword(dev, 0x64, &d);
|
||||
d |= (1<<10);
|
||||
pci_write_config_dword(dev, 0x64, d);
|
||||
pci_read_config_dword(dev, 0x64, &d);
|
||||
if (!(d & (1<<10)))
|
||||
return;
|
||||
|
||||
force_hpet_address = val;
|
||||
force_hpet_resume_type = ATI_FORCE_HPET_RESUME;
|
||||
dev_printk(KERN_DEBUG, &dev->dev, "Force enabled HPET at 0x%lx\n",
|
||||
force_hpet_address);
|
||||
cached_dev = dev;
|
||||
return;
|
||||
}
|
||||
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_IXP400_SMBUS,
|
||||
ati_force_enable_hpet);
|
||||
|
Loading…
Reference in New Issue
Block a user